+
+
@Model.Name
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.VendorDetailsTop, additionalData = Model })
+ @*description*@
+ @if (!string.IsNullOrWhiteSpace(Model.Description))
+ {
+
+ @Html.Raw(Model.Description)
+
+ }
+ @*contact vendor*@
+ @if (Model.AllowCustomersToContactVendors)
+ {
+
+
+
+ }
+
+
+
+ @await Html.PartialAsync("_CatalogSelectors", Model.CatalogProductsModel)
+
+
+
+ @{
+ var catalogProductsViewData = new ViewDataDictionary(ViewData)
+ {
+ ["fetchUrl"] = Html.Raw(Url.RouteUrl("GetVendorProducts", new { vendorId = Model.Id }))
+ };
+ }
+ @await Html.PartialAsync("_CatalogProducts", Model.CatalogProductsModel, catalogProductsViewData)
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.VendorDetailsBottom, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/VendorAll.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/VendorAll.cshtml
new file mode 100644
index 0000000..97759f2
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/VendorAll.cshtml
@@ -0,0 +1,36 @@
+@model IList
+@using Nop.Core.Domain.Vendors
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Vendors").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-vendor-list-page");
+}
+
+
+
@T("Vendors.List")
+
+
+
+ @foreach (var item in Model)
+ {
+
+ }
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogFilters.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogFilters.cshtml
new file mode 100644
index 0000000..1ca1b47
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogFilters.cshtml
@@ -0,0 +1,38 @@
+@model CatalogProductsModel
+
+@if (!Model.PriceRangeFilter.Enabled &&
+ !Model.SpecificationFilter.Enabled &&
+ !Model.ManufacturerFilter.Enabled)
+{
+ return;
+}
+@if (Model.PriceRangeFilter.Enabled)
+{
+ @await Html.PartialAsync("_FilterPriceBox", Model.PriceRangeFilter)
+}
+
+@if (Model.SpecificationFilter.Enabled)
+{
+ @await Html.PartialAsync("_FilterSpecsBox", Model.SpecificationFilter)
+}
+
+@if (Model.ManufacturerFilter.Enabled)
+{
+ @await Html.PartialAsync("_FilterManufacturerBox", Model.ManufacturerFilter)
+}
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogProducts.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogProducts.cshtml
new file mode 100644
index 0000000..0ed4233
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogProducts.cshtml
@@ -0,0 +1,31 @@
+@model CatalogProductsModel
+
+
+
+
+
+ @await Html.PartialAsync("_ProductsInGridOrLines", Model)
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogSelectors.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogSelectors.cshtml
new file mode 100644
index 0000000..5ab2bc5
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_CatalogSelectors.cshtml
@@ -0,0 +1,108 @@
+@model CatalogProductsModel
+
+@if (Model.Products.Count <= 0 &&
+ !Model.PriceRangeFilter.Enabled &&
+ !Model.SpecificationFilter.Enabled &&
+ !Model.ManufacturerFilter.Enabled)
+{
+ return;
+}
+
+ @*sorting*@
+ @if (Model.AllowProductSorting)
+ {
+
+
+
+
+
+
+ @Html.DropDownList("products-orderby", Model.AvailableSortOptions, new { aria_label = T("Catalog.OrderBy.Label"), @class = "form-control dropdown-filter" })
+
+
+
+
+ }
+ @*page size*@
+ @if (Model.AllowCustomersToSelectPageSize)
+ {
+
+
+
+
+
+
+ @Html.DropDownList("products-pagesize", Model.PageSizeOptions, new { aria_label = T("Catalog.PageSize.Label"), @class = "form-control dropdown-filter" })
+
+ @*
+
+
*@
+
+
+
+ }
+ @*view mode*@
+ @if (Model.AllowProductViewModeChanging)
+ {
+
+
+ @*
+
+
*@
+ @if (Model.AvailableViewModes.Count > 1)
+ {
+ var gridMode = Model.AvailableViewModes[0];
+ var listMode = Model.AvailableViewModes[1];
+
+ }
+
+
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterManufacturerBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterManufacturerBox.cshtml
new file mode 100644
index 0000000..8de7efc
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterManufacturerBox.cshtml
@@ -0,0 +1,41 @@
+@model ManufacturerFilterModel
+
+
+
+ @T("Filtering.ManufacturerFilter")
+
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterPriceBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterPriceBox.cshtml
new file mode 100644
index 0000000..81efe4d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterPriceBox.cshtml
@@ -0,0 +1,53 @@
+@model PriceRangeFilterModel
+
+
+
+ @T("Filtering.PriceRangeFilter")
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterSpecsBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterSpecsBox.cshtml
new file mode 100644
index 0000000..255ba33
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_FilterSpecsBox.cshtml
@@ -0,0 +1,56 @@
+@model SpecificationFilterModel
+
+
+ @T("Filtering.SpecificationFilter")
+
+
+ @foreach (var attr in Model.Attributes)
+ {
+
+ }
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_ProductsInGridOrLines.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_ProductsInGridOrLines.cshtml
new file mode 100644
index 0000000..b6d36d8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Catalog/_ProductsInGridOrLines.cshtml
@@ -0,0 +1,45 @@
+@model CatalogProductsModel
+
+@if (!string.IsNullOrEmpty(Model.WarningMessage))
+{
+
+ @Model.WarningMessage
+
+}
+
+@if (Model.Products.Count > 0)
+{
+
+
+ @foreach (var product in Model.Products)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", product)
+
+
+ }
+
+
+
+ var pager = Html.Pager(Model)
+ .QueryParam("pagenumber")
+ // for search page
+ .BooleanParameterName("advs")
+ .BooleanParameterName("isc")
+ .BooleanParameterName("sid")
+ .RenderEmptyParameters(true);
+
+ @if (!await pager.IsEmpty())
+ {
+
+ }
+}
+else if (!string.IsNullOrEmpty(Model.NoResultMessage))
+{
+
+ @Model.NoResultMessage
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/BillingAddress.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/BillingAddress.cshtml
new file mode 100644
index 0000000..df7ec6d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/BillingAddress.cshtml
@@ -0,0 +1,237 @@
+@using Nop.Core
+@using Nop.Services.Customers
+@model CheckoutBillingAddressModel
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@inject ICustomerService _customerService
+@{
+ Layout = "_ColumnsOne";
+
+ var storeLocation = webHelper.GetStoreLocation();
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-billing-address-page");
+}
+
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Address })
+
+
+
@T("Checkout.BillingAddress")
+
+
+
+
+
+
+ @T("Checkout.OrderSummary")
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent))
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Completed.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Completed.cshtml
new file mode 100644
index 0000000..6a237e7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Completed.cshtml
@@ -0,0 +1,41 @@
+@model CheckoutCompletedModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-order-completed-page");
+}
+@if (!Model.OnePageCheckoutEnabled)
+{
+ @await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Complete })
+}
+
+
+
@T("Checkout.ThankYou")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutCompletedTop, additionalData = Model })
+
+
+ @T("Checkout.YourOrderHasBeenSuccessfullyProcessed")
+
+
+
+
+
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutCompletedBottom, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Confirm.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Confirm.cshtml
new file mode 100644
index 0000000..32da826
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/Confirm.cshtml
@@ -0,0 +1,118 @@
+@model CheckoutConfirmModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-order-confirm-page");
+}
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Confirm })
+
+
+
@T("Checkout.ConfirmYourOrder")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutConfirmTop, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutConfirmBottom, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent), new { prepareAndDisplayOrderReviewData = true })
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OnePageCheckout.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OnePageCheckout.cshtml
new file mode 100644
index 0000000..1c0f457
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OnePageCheckout.cshtml
@@ -0,0 +1,228 @@
+@model OnePageCheckoutModel
+@using Nop.Core
+@using Nop.Services.Customers
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@inject ICustomerService _customerService
+@{
+ Layout = "_ColumnsOne";
+
+ var storeLocation = webHelper.GetStoreLocation();
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+}
+@{
+ //step numbers
+ var billingAddressStepNumber = 1;
+ var shippingAddressStepNumber = 2;
+ var shippingMethodStepNumber = 3;
+ var paymentMethodStepNumber = 4;
+ var paymentInfoStepNumber = 5;
+ var confirmOrderStepNumber = 6;
+ if (!Model.ShippingRequired)
+ {
+ paymentMethodStepNumber = paymentMethodStepNumber - 2;
+ paymentInfoStepNumber = paymentInfoStepNumber - 2;
+ confirmOrderStepNumber = confirmOrderStepNumber - 2;
+ }
+ if (Model.DisableBillingAddressCheckoutStep)
+ {
+ shippingAddressStepNumber--;
+ shippingMethodStepNumber--;
+ paymentMethodStepNumber--;
+ paymentInfoStepNumber--;
+ confirmOrderStepNumber--;
+ }
+}
+
+
+
+
+
+
+
@T("Checkout")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpcContentBefore, additionalData = Model })
+
+ -
+
+ @billingAddressStepNumber
+
@T("Checkout.BillingAddress")
+
+
+
+
+
+
+
+
+
+ @T("Common.LoadingNextStep")
+
+
+
+ @if (Model.ShippingRequired)
+ {
+ -
+
+ @shippingAddressStepNumber
+
@T("Checkout.ShippingAddress")
+
+
+
+ -
+
+ @shippingMethodStepNumber
+
@T("Checkout.ShippingMethod")
+
+
+
+ }
+ -
+
+ @paymentMethodStepNumber
+
@T("Checkout.PaymentMethod")
+
+
+
+ -
+
+ @paymentInfoStepNumber
+
@T("Checkout.PaymentInfo")
+
+
+
+ -
+
+ @confirmOrderStepNumber
+
@T("Checkout.ConfirmOrder")
+
+
+
+ @*confirm order content will be loaded here*@
+
+
+
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpcContentAfter, additionalData = Model })
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcBillingAddress.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcBillingAddress.cshtml
new file mode 100644
index 0000000..eb8ba61
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcBillingAddress.cshtml
@@ -0,0 +1,82 @@
+@model CheckoutBillingAddressModel
+@using Nop.Core;
+@inject IWebHelper webHelper
+
+@{
+ var storeLocation = webHelper.GetStoreLocation();
+}
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutBillingAddressTop, additionalData = Model })
+ @if (Model.ShipToSameAddressAllowed)
+ {
+
+
+
+
+
+
+ }
+ @if (Model.ExistingAddresses.Count > 0)
+ {
+
+
+ @if (Model.InvalidExistingAddresses.Count > 0)
+ {
+
+ }
+
+
+
+
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutBillingAddressMiddle, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutBillingAddressBottom, additionalData = Model })
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcConfirmOrder.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcConfirmOrder.cshtml
new file mode 100644
index 0000000..9aeda76
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcConfirmOrder.cshtml
@@ -0,0 +1,65 @@
+@model CheckoutConfirmModel
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutConfirmTop, additionalData = Model })
+ @if (!string.IsNullOrEmpty(Model.MinOrderTotalWarning) || Model.Warnings.Count > 0)
+ {
+
+ @if (!string.IsNullOrEmpty(Model.MinOrderTotalWarning))
+ {
+
+ @Model.MinOrderTotalWarning
+
+ }
+ @if (Model.Warnings.Count > 0)
+ {
+
+
+ @foreach (var warning in Model.Warnings)
+ {
+ - @warning
+ }
+
+
+ }
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutConfirmBottom, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent), new { prepareAndDisplayOrderReviewData = true })
+
+ @if (string.IsNullOrEmpty(Model.MinOrderTotalWarning) && Model.TermsOfServiceOnOrderConfirmPage)
+ {
+
+
@T("Checkout.TermsOfService.PleaseAccept")
+
+
+ }
+ @if (Model.DisplayCaptcha)
+ {
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentInfo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentInfo.cshtml
new file mode 100644
index 0000000..b3d1d1e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentInfo.cshtml
@@ -0,0 +1,17 @@
+@model CheckoutPaymentInfoModel
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutPaymentInfoTop, additionalData = Model })
+
+
+ @await Component.InvokeAsync(Model.PaymentViewComponent)
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutPaymentInfoBottom, additionalData = Model })
+ @if (Model.DisplayOrderTotals)
+ {
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent))
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentMethods.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentMethods.cshtml
new file mode 100644
index 0000000..fb238d7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcPaymentMethods.cshtml
@@ -0,0 +1,69 @@
+@model CheckoutPaymentMethodModel
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutPaymentMethodTop, additionalData = Model })
+
+ @if (Model.DisplayRewardPoints && Model.PaymentMethods.Count > 0)
+ {
+
+ @if (Model.RewardPointsEnoughToPayForOrder)
+ {
+
+ }
+ else
+ {
+
+ }
+
+ @if (Model.RewardPointsEnoughToPayForOrder)
+ {
+
+ }
+
+ }
+ @if (Model.PaymentMethods.Count > 0)
+ {
+
+ @for (var i = 0; i < Model.PaymentMethods.Count; i++)
+ {
+ var paymentMethod = Model.PaymentMethods[i];
+ var paymentMethodName = paymentMethod.Name;
+ if (!string.IsNullOrEmpty(paymentMethod.Fee))
+ {
+ paymentMethodName = T("Checkout.SelectPaymentMethod.MethodAndFee", paymentMethodName, paymentMethod.Fee).Text;
+ }
+ -
+
+ @if (!string.IsNullOrEmpty(paymentMethod.LogoUrl))
+ {
+
+
+
+ }
+
+
+
+ @if (!string.IsNullOrEmpty(paymentMethod.Description))
+ {
+
@paymentMethod.Description
+ }
+
+
+
+ }
+
+ }
+ else
+ {
+
+ @T("Checkout.NoPaymentMethods")
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OpCheckoutPaymentMethodBottom, additionalData = Model })
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingAddress.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingAddress.cshtml
new file mode 100644
index 0000000..5a02e44
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingAddress.cshtml
@@ -0,0 +1,76 @@
+@model CheckoutShippingAddressModel
+@using Nop.Core;
+@inject IWebHelper webHelper
+@{
+ var storeLocation = webHelper.GetStoreLocation();
+}
+
+ @if (Model.DisplayPickupInStore && Model.PickupPointsModel.AllowPickupInStore)
+ {
+ @await Html.PartialAsync("_PickupPoints", Model.PickupPointsModel)
+
+ }
+ @if (Model.PickupPointsModel == null || !Model.PickupPointsModel.PickupInStoreOnly)
+ {
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingMethods.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingMethods.cshtml
new file mode 100644
index 0000000..def1bb2
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/OpcShippingMethods.cshtml
@@ -0,0 +1,65 @@
+@model CheckoutShippingMethodModel
+
+ @if (Model.DisplayPickupInStore && Model.PickupPointsModel.AllowPickupInStore)
+ {
+ @await Html.PartialAsync("_PickupPoints", Model.PickupPointsModel)
+
+ }
+ @if (Model.PickupPointsModel == null || !Model.PickupPointsModel.PickupInStoreOnly)
+ {
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentInfo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentInfo.cshtml
new file mode 100644
index 0000000..d2dbcb3
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentInfo.cshtml
@@ -0,0 +1,39 @@
+@model CheckoutPaymentInfoModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-payment-info-page");
+}
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Payment })
+
+
+
@T("Checkout.PaymentInfo")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutPaymentInfoTop, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutPaymentInfoBottom, additionalData = Model })
+
+
+ @T("Checkout.OrderSummary")
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent), "ShoppingCart")
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentMethod.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentMethod.cshtml
new file mode 100644
index 0000000..1805cf4
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/PaymentMethod.cshtml
@@ -0,0 +1,102 @@
+@model CheckoutPaymentMethodModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-payment-method-page");
+}
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Payment })
+
+
+
@T("Checkout.SelectPaymentMethod")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutPaymentMethodTop, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CheckoutPaymentMethodBottom, additionalData = Model })
+
+
+ @T("Checkout.OrderSummary")
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent))
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingAddress.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingAddress.cshtml
new file mode 100644
index 0000000..499b83d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingAddress.cshtml
@@ -0,0 +1,222 @@
+@inject IWebHelper webHelper
+@using Nop.Core
+@model CheckoutShippingAddressModel
+@{
+ Layout = "_ColumnsOne";
+ var storeLocation = webHelper.GetStoreLocation();
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-shipping-address-page");
+}
+
+
+
+
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Address })
+
+
+
@T("Checkout.ShippingAddress")
+
+
+
+
+
+
+ @T("Checkout.OrderSummary")
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent))
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingMethod.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingMethod.cshtml
new file mode 100644
index 0000000..1b5a4b2
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/ShippingMethod.cshtml
@@ -0,0 +1,83 @@
+@model CheckoutShippingMethodModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Checkout").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-checkout-page");
+ NopHtml.AppendPageCssClassParts("html-shipping-method-page");
+}
+@await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new { step = CheckoutProgressStep.Shipping })
+
+
+
@T("Checkout.SelectShippingMethod")
+
+
+
+
+
+ @T("Checkout.OrderSummary")
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent))
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/_PickupPoints.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/_PickupPoints.cshtml
new file mode 100644
index 0000000..549a344
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Checkout/_PickupPoints.cshtml
@@ -0,0 +1,208 @@
+@model CheckoutPickupPointsModel
+@using System.Text
+
+@if (!Model.PickupInStoreOnly && Model.PickupPoints.Any())
+{
+
+
+
+
+
+
+ @T("Checkout.PickupPoints.Description")
+
+
+
+}
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactUs.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactUs.cshtml
new file mode 100644
index 0000000..1229654
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactUs.cshtml
@@ -0,0 +1,95 @@
+@model ContactUsModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ContactUs").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-contact-page");
+}
+
+
+
@T("PageTitle.ContactUs")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactVendor.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactVendor.cshtml
new file mode 100644
index 0000000..200d676
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/ContactVendor.cshtml
@@ -0,0 +1,91 @@
+@model ContactVendorModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ContactVendor", Model.VendorName).Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-contact-page");
+}
+
+
+
@T("PageTitle.ContactVendor", Model.VendorName)
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ContactVendorTop, additionalData = Model })
+ @if (Model.SuccessfullySent)
+ {
+
+ @Model.Result
+
+ }
+ else
+ {
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ContactVendorBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/PageNotFound.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/PageNotFound.cshtml
new file mode 100644
index 0000000..6cc616e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/PageNotFound.cshtml
@@ -0,0 +1,16 @@
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.PageNotFound").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-not-found-page");
+}
+
+
+
@T("PageTitle.PageNotFound")
+
+
+ @await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "PageNotFound" })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/Sitemap.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/Sitemap.cshtml
new file mode 100644
index 0000000..44ee5a4
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/Sitemap.cshtml
@@ -0,0 +1,46 @@
+@model SitemapModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Sitemap").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-sitemap-page");
+}
+
+
+
@T("Sitemap")
+
+
+
+ @T("Sitemap.Description")
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.SitemapBefore, additionalData = Model })
+ @foreach (var itemGroup in Model.Items.GroupBy(itemGroup => itemGroup.GroupTitle))
+ {
+
+
+
@itemGroup.Key
+
+
+
+ @foreach (var item in itemGroup.ToList())
+ {
+ - @item.Name
+ }
+
+
+
+ }
+ @{
+ var pager = Html.Pager(Model.PageModel).QueryParam("pagenumber");
+ if (!(await pager.IsEmpty()))
+ {
+
+ }
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.SitemapAfter, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/StoreClosed.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/StoreClosed.cshtml
new file mode 100644
index 0000000..0f3fb87
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Common/StoreClosed.cshtml
@@ -0,0 +1,16 @@
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.StoreClosed").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-store-closed-page");
+}
+
+
+
@T("StoreClosed")
+
+
+ @T("StoreClosed.Hint")
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AccountActivation.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AccountActivation.cshtml
new file mode 100644
index 0000000..afa061c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AccountActivation.cshtml
@@ -0,0 +1,22 @@
+@model AccountActivationModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.AccountActivation").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-activation-page");
+}
+
+
+
@T("Account.AccountActivation")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressAdd.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressAdd.cshtml
new file mode 100644
index 0000000..2bb3d1f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressAdd.cshtml
@@ -0,0 +1,34 @@
+@model CustomerAddressEditModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ //page class
+ NopHtml.AppendPageCssClassParts("html-address-edit-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Addresses })
+}
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressEdit.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressEdit.cshtml
new file mode 100644
index 0000000..97427e0
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/AddressEdit.cshtml
@@ -0,0 +1,34 @@
+@model CustomerAddressEditModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-address-edit-page");
+}
+@section left
+ {
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Addresses })
+}
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Addresses.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Addresses.cshtml
new file mode 100644
index 0000000..9ab3048
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Addresses.cshtml
@@ -0,0 +1,113 @@
+@model CustomerAddressListModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-address-list-page");
+}
+@section left
+ {
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Addresses })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.CustomerAddresses")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerAddressesTop, additionalData = Model })
+ @if (Model.Addresses.Count > 0)
+ {
+
+ @for (var i = 0; i < Model.Addresses.Count; i++)
+ {
+ var address = Model.Addresses[i];
+
+
+
+ @address.FirstName @address.LastName
+
+
+ -
+ @address.FirstName @address.LastName
+
+ -
+
+ @address.Email
+
+ @if (address.PhoneEnabled)
+ {
+ -
+
+ @address.PhoneNumber
+
+ }
+ @if (address.FaxEnabled)
+ {
+ -
+
+ @address.FaxNumber
+
+ }
+ @if (address.CompanyEnabled && !string.IsNullOrEmpty(address.Company))
+ {
+ - @address.Company
+ }
+ @foreach (var item in address.AddressFields)
+ {
+ - @item.Value
+ }
+ @if (!string.IsNullOrEmpty(address.FormattedCustomAddressAttributes))
+ {
+ -
+ @Html.Raw(address.FormattedCustomAddressAttributes)
+
+ }
+
+
+
+
+
+
+
+ }
+
+
+ }
+ else
+ {
+
+ @T("Account.CustomerAddresses.NoAddresses")
+
+ }
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerAddressesBottom, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Avatar.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Avatar.cshtml
new file mode 100644
index 0000000..b4bd807
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Avatar.cshtml
@@ -0,0 +1,46 @@
+@model CustomerAvatarModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-avatar-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Avatar })
+}
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ChangePassword.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ChangePassword.cshtml
new file mode 100644
index 0000000..86e326f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ChangePassword.cshtml
@@ -0,0 +1,68 @@
+@model ChangePasswordModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-change-password-page");
+ var returnUrl = Context.Request.Query["returnUrl"];
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.ChangePassword })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.ChangePassword")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerChangePasswordTop, additionalData = Model })
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerChangePasswordBottom, additionalData = Model })
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/CheckGiftCardBalance.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/CheckGiftCardBalance.cshtml
new file mode 100644
index 0000000..cec93fc
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/CheckGiftCardBalance.cshtml
@@ -0,0 +1,93 @@
+@model CheckGiftCardBalanceModel
+
+@using Nop.Core
+@using Nop.Services.Customers
+@inject IWorkContext workContext
+@inject ICustomerService customerService
+
+@{
+ var isRegisterCustomer = await customerService.IsRegisteredAsync(await workContext.GetCurrentCustomerAsync());
+ Layout = isRegisterCustomer ? "_ColumnsTwo" : "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.CheckGiftCardBalance").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+}
+
+@if (isRegisterCustomer)
+{
+ @section left
+ {
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.CheckGiftCardBalance })
+ }
+}
+
+
+
+ @if (isRegisterCustomer)
+ {
+
@T("Account.MyAccount") - @T("PageTitle.CheckGiftCardBalance")
+ }
+ else
+ {
+ @T("PageTitle.CheckGiftCardBalance")
+ }
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerCheckGiftCardBalanceTop, additionalData = Model })
+ @if (!string.IsNullOrEmpty(Model.Message))
+ {
+
+ @Model.Message
+
+ }
+ @if (!string.IsNullOrEmpty(Model.Result))
+ {
+
+ @string.Format(T("ShoppingCart.Totals.GiftCardInfo.Remaining").Text, @Model.Result)
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerCheckGiftCardBalanceBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ConfigureMultiFactorAuthenticationProvider.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ConfigureMultiFactorAuthenticationProvider.cshtml
new file mode 100644
index 0000000..501d275
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/ConfigureMultiFactorAuthenticationProvider.cshtml
@@ -0,0 +1,42 @@
+@model MultiFactorAuthenticationProviderModel
+
+@using Nop.Core
+@using Nop.Services.Customers
+@inject IWorkContext workContext
+@inject ICustomerService customerService
+
+@{
+ var isRegisterCustomer = await customerService.IsRegisteredAsync(await workContext.GetCurrentCustomerAsync());
+ Layout = isRegisterCustomer ? "_ColumnsTwo" : "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.MultiFactorAuthentication").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+}
+
+@if (isRegisterCustomer)
+{
+ @section left
+ {
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.MultiFactorAuthentication })
+ }
+}
+
+
+
+ @if (isRegisterCustomer)
+ {
+
@T("PageTitle.MultiFactorAuthentication") - @Model.Name
+ }
+ else
+ {
+ @T("PageTitle.MultiFactorAuthentication")
+ }
+
+
+
+ @(await Component.InvokeAsync(Model.ViewComponent))
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/DownloadableProducts.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/DownloadableProducts.cshtml
new file mode 100644
index 0000000..6acfbd8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/DownloadableProducts.cshtml
@@ -0,0 +1,102 @@
+@model CustomerDownloadableProductsModel
+@using Nop.Core.Domain.Catalog
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-downloadable-products-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.DownloadableProducts })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.DownloadableProducts")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerDownloadableProductsTop, additionalData = Model })
+ @if (Model.Items.Count > 0)
+ {
+
+
+
+
+
+
+
+
+
+
+ |
+ @T("DownloadableProducts.Fields.Order")
+ |
+
+ @T("DownloadableProducts.Fields.Date")
+ |
+
+ @T("DownloadableProducts.Fields.Product")
+ |
+
+ @T("DownloadableProducts.Fields.Download")
+ |
+
+
+
+ @for (var i = 0; i < Model.Items.Count; i++)
+ {
+ var item = Model.Items[i];
+
+ |
+ @item.CustomOrderNumber
+ |
+
+ @item.CreatedOn.ToString("d")
+ |
+
+ @item.ProductName
+ @if (!string.IsNullOrEmpty(item.ProductAttributes))
+ {
+
+ @Html.Raw(item.ProductAttributes)
+
+ }
+ |
+
+ @if (item.DownloadId > 0)
+ {
+
+ }
+ else
+ {
+
+ @T("DownloadableProducts.Fields.Download.NA")
+
+ }
+ @if (item.LicenseId > 0)
+ {
+
+ }
+ |
+
+ }
+
+
+
+ }
+ else
+ {
+
+ @T("DownloadableProducts.NoItems")
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerDownloadableProductsBottom, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/EmailRevalidation.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/EmailRevalidation.cshtml
new file mode 100644
index 0000000..8d3a266
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/EmailRevalidation.cshtml
@@ -0,0 +1,22 @@
+@model EmailRevalidationModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.AccountActivation").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-email-revalidation-page");
+}
+
+
+
@T("Account.EmailRevalidation")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/GdprTools.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/GdprTools.cshtml
new file mode 100644
index 0000000..2fa0086
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/GdprTools.cshtml
@@ -0,0 +1,66 @@
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-gdpt-tools-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.GdprTools })
+}
+
+
+
+
@T("Account.MyAccount") - @T("Account.Gdpr")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerGdprToolsTop, additionalData = Model })
+ @if (!string.IsNullOrEmpty(Model.Result))
+ {
+
+ @Model.Result
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerGdprToolsBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Info.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Info.cshtml
new file mode 100644
index 0000000..9daa7fd
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Info.cshtml
@@ -0,0 +1,613 @@
+@using Nop.Core
+@model CustomerInfoModel
+@inject Nop.Core.IWebHelper webHelper
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-customer-info-page");
+}
+
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Info })
+}
+
+
+
+
@T("Account.MyAccount") - @T("Account.CustomerInfo")
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Login.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Login.cshtml
new file mode 100644
index 0000000..697c235
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Login.cshtml
@@ -0,0 +1,152 @@
+@model LoginModel
+@using Nop.Core
+@using Nop.Core.Domain.Customers
+@inject IWebHelper webHelper
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Login").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-login-page");
+
+ //register URL with return URL (if specified)
+ var registerUrl = Url.RouteUrl("Register", new { returnUrl = this.Context.Request.Query["returnUrl"] }, webHelper.GetCurrentRequestProtocol());
+}
+
+
+
@T("Account.Login.Welcome")
+
+ @await Html.PartialAsync("_ExternalAuthentication.Errors")
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.LoginTop, additionalData = Model })
+
+
+ @if (Model.RegistrationType == UserRegistrationType.Disabled)
+ {
+
+
+
+ @T("Account.Register")
+
+
+ @T("Account.Register.Result.Disabled")
+
+
+
+ }
+ else if (Model.CheckoutAsGuest)
+ {
+
+
+
+
+
+ }
+ else
+ {
+
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+ @await Component.InvokeAsync(typeof(ExternalMethodsViewComponent), "ExternalAuthentication")
+
+
+
+
+
+
+
+ @await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "LoginRegistrationInfo" })
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.LoginBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorAuthentication.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorAuthentication.cshtml
new file mode 100644
index 0000000..fb5fb50
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorAuthentication.cshtml
@@ -0,0 +1,85 @@
+@model MultiFactorAuthenticationModel
+
+@using Nop.Core
+@using Nop.Services.Customers
+@inject IWorkContext workContext
+@inject ICustomerService customerService
+
+@{
+ var isRegisterCustomer = await customerService.IsRegisteredAsync(await workContext.GetCurrentCustomerAsync());
+ Layout = isRegisterCustomer ? "_ColumnsTwo" : "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.MultiFactorAuthentication").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+}
+
+@if (isRegisterCustomer)
+{
+ @section left
+ {
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.MultiFactorAuthentication })
+ }
+}
+
+
+
+ @if (isRegisterCustomer)
+ {
+
@T("Account.MyAccount") - @T("PageTitle.MultiFactorAuthentication")
+ }
+ else
+ {
+ @T("PageTitle.MultiFactorAuthentication")
+ }
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerMultiFactorAuthenticationTop, additionalData = Model })
+
+ @T("Account.MultiFactorAuthentication.Description")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerMultiFactorAuthenticationBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorVerification.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorVerification.cshtml
new file mode 100644
index 0000000..fc50238
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/MultiFactorVerification.cshtml
@@ -0,0 +1,19 @@
+@model MultiFactorAuthenticationProviderModel
+
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.MultiFactorVerification").Text);
+}
+
+
+
+
@T("Account.Login.Welcome")
+
+
+
+ @(await Component.InvokeAsync(Model.ViewComponent))
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecovery.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecovery.cshtml
new file mode 100644
index 0000000..ce9e404
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecovery.cshtml
@@ -0,0 +1,48 @@
+@model PasswordRecoveryModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.PasswordRecovery").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-password-recovery-page");
+}
+
+
+
@T("Account.PasswordRecovery")
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecoveryConfirm.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecoveryConfirm.cshtml
new file mode 100644
index 0000000..39f9992
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/PasswordRecoveryConfirm.cshtml
@@ -0,0 +1,60 @@
+@model PasswordRecoveryConfirmModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.PasswordRecovery").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-password-recovery-page");
+}
+
+
+
@T("Account.PasswordRecovery")
+
+
+ @if (!string.IsNullOrEmpty(Model.Result))
+ {
+
+ @Model.Result
+
+
+ }
+ @if (!Model.DisablePasswordChanging)
+ {
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Register.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Register.cshtml
new file mode 100644
index 0000000..80a2a17
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/Register.cshtml
@@ -0,0 +1,580 @@
+@model RegisterModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Register").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-registration-page");
+}
+
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.RegisterTop, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/RegisterResult.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/RegisterResult.cshtml
new file mode 100644
index 0000000..a638acd
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/RegisterResult.cshtml
@@ -0,0 +1,22 @@
+@model RegisterResultModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Register").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-registration-result-page");
+}
+
+
+
@T("Account.Register")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/UserAgreement.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/UserAgreement.cshtml
new file mode 100644
index 0000000..7db3a97
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/UserAgreement.cshtml
@@ -0,0 +1,38 @@
+@model UserAgreementModel
+@{
+ Layout = "_ColumnsOne";
+
+ //page class
+ NopHtml.AppendPageCssClassParts("html-user-agreement-page");
+}
+
+
+
+
@T("DownloadableProducts.UserAgreement")
+
+
+
@Html.Raw(Model.UserAgreementText)
+
+ @Html.Raw(Model.UserAgreementText)
+
+
+
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CheckUsernameAvailability.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CheckUsernameAvailability.cshtml
new file mode 100644
index 0000000..f1deb4f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CheckUsernameAvailability.cshtml
@@ -0,0 +1,45 @@
+
+
+@T("Common.Wait")
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CustomerAttributes.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CustomerAttributes.cshtml
new file mode 100644
index 0000000..d72c519
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_CustomerAttributes.cshtml
@@ -0,0 +1,88 @@
+@model IList
+@using Nop.Core.Domain.Catalog
+@using Nop.Services.Customers
+@foreach (var attribute in Model)
+{
+ var controlId = $"{NopCustomerServicesDefaults.CustomerAttributePrefix}{attribute.Id}";
+ var textPrompt = attribute.Name;
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_ExternalAuthentication.Errors.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_ExternalAuthentication.Errors.cshtml
new file mode 100644
index 0000000..dccbd1d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_ExternalAuthentication.Errors.cshtml
@@ -0,0 +1,23 @@
+@using Nop.Core.Http.Extensions
+@using Nop.Services.Authentication
+
+@{
+
+ var session = Context.Session;
+
+ var errors = await session.GetAsync>(NopAuthenticationDefaults.ExternalAuthenticationErrorsSessionKey);
+
+ if (errors != null)
+ session.Remove(NopAuthenticationDefaults.ExternalAuthenticationErrorsSessionKey);
+}
+@if (errors != null && errors.Count > 0)
+{
+
+
+ @foreach (var error in errors)
+ {
+ - @error
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_MultiFactorAuthenticationProviders.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_MultiFactorAuthenticationProviders.cshtml
new file mode 100644
index 0000000..70d8a7c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Customer/_MultiFactorAuthenticationProviders.cshtml
@@ -0,0 +1,32 @@
+@model IList
+
+
+ @foreach (var provider in Model)
+ {
+ -
+
+ @if (!string.IsNullOrEmpty(provider.LogoUrl))
+ {
+
+
+
+ }
+
+
+
+ @if (!string.IsNullOrEmpty(provider.Description))
+ {
+
@provider.Description
+ }
+
+
+
+
+
+
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Home/Index.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Home/Index.cshtml
new file mode 100644
index 0000000..151080b
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Home/Index.cshtml
@@ -0,0 +1,47 @@
+@using Nop.Services.Localization
+@using Nop.Core
+@inject ILocalizationService localizationService
+@inject IStoreContext storeContext
+
+@{
+ Layout = "_ColumnsOne";
+
+ var homepageTitle = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), s => s.HomepageTitle);
+
+ //title
+ if (!string.IsNullOrEmpty(homepageTitle))
+ {
+ NopHtml.AddTitleParts(homepageTitle);
+ }
+
+ var homepageDescription = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), s => s.HomepageDescription);
+
+ //meta
+ if (!string.IsNullOrEmpty(homepageDescription))
+ {
+ NopHtml.AddMetaDescriptionParts(homepageDescription);
+ }
+
+ //page class
+ NopHtml.AppendPageCssClassParts("html-home-page");
+}
+@*Main Slider*@
+@section HomePageSlider {
+ @await Component.InvokeAsync("Widget", new { widgetZone = "home_page_top" })
+}
+
+
+ @await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "HomepageText" })
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeCategories })
+ @await Component.InvokeAsync(typeof(HomepageCategoriesViewComponent))
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeProducts })
+ @await Component.InvokeAsync(typeof(HomepageProductsViewComponent))
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeBestSellers })
+ @await Component.InvokeAsync(typeof(HomepageBestSellersViewComponent))
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeNews })
+ @await Component.InvokeAsync(typeof(HomepageNewsViewComponent))
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforePoll })
+ @await Component.InvokeAsync(typeof(HomepagePollsViewComponent))
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBottom })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/Index.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/Index.cshtml
new file mode 100644
index 0000000..6df61ab
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/Index.cshtml
@@ -0,0 +1,294 @@
+@model InstallModel
+
+@{
+ Layout = null;
+}
+
+
+
+ @ILS.GetResource("Title")
+
+
+
+ @if (ILS.GetCurrentLanguage().IsRightToLeft)
+ {
+
+
+ }
+ else
+ {
+
+
+ }
+
+
+
+
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_Install.ConnectionString.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_Install.ConnectionString.cshtml
new file mode 100644
index 0000000..e02f48a
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_Install.ConnectionString.cshtml
@@ -0,0 +1,67 @@
+@model InstallModel
+
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_ViewImports.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_ViewImports.cshtml
new file mode 100644
index 0000000..ff8d4ad
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Install/_ViewImports.cshtml
@@ -0,0 +1,11 @@
+@*localization service for installation service
+ we do not use standard nopCommerce localization because database is not installed yet
+ locale resources for installation process are stored into \App_Data\Localization\Installation directory*@
+@inject IInstallationLocalizationService ILS
+@removeTagHelper *, Nop.Web.Framework
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@using Nop.Data
+@using Nop.Services.Common
+@using static Nop.Services.Common.NopLinksDefaults
+@using Nop.Web.Models.Install
+@using Nop.Web.Infrastructure.Installation
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/List.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/List.cshtml
new file mode 100644
index 0000000..474d797
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/List.cshtml
@@ -0,0 +1,57 @@
+@model NewsItemListModel
+@using Nop.Core.Domain.News
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.NewsArchive").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-news-list-page");
+}
+
+
+
+
@T("News")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsListPageBeforeItems, additionalData = Model })
+
+ @foreach (var item in Model.NewsItems)
+ {
+
+
+
+
+
+ - @item.CreatedOn.ToString("D")
+
+
+ @Html.Raw(item.Short)
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsListPageInsideItem, additionalData = item })
+
+
+ }
+
+ @{
+ var pager = Html.Pager(Model.PagingFilteringContext).QueryParam("pagenumber");
+ }
+ @if (!(await pager.IsEmpty()))
+ {
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsListPageAfterItems, additionalData = Model })
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/NewsItem.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/NewsItem.cshtml
new file mode 100644
index 0000000..4d8911e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/News/NewsItem.cshtml
@@ -0,0 +1,148 @@
+@inject Nop.Services.Html.IHtmlFormatter htmlFormatter
+@model NewsItemModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Title);
+ //meta
+ NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
+ NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-news-item-page");
+}
+
+
+
@Model.Title
+
+
+
+ @Model.CreatedOn.ToString("D")
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsItemPageBeforeBody, additionalData = Model })
+
+ @Html.Raw(Model.Full)
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsItemPageBeforeComments, additionalData = Model })
+ @if (Model.AllowComments)
+ {
+
+ if (Model.Comments.Count > 0)
+ {
+
+ }
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.NewsItemPageAfterComments, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Newsletter/SubscriptionActivation.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Newsletter/SubscriptionActivation.cshtml
new file mode 100644
index 0000000..2218c59
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Newsletter/SubscriptionActivation.cshtml
@@ -0,0 +1,17 @@
+@model SubscriptionActivationModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //page class
+ NopHtml.AppendPageCssClassParts("html-newsletter-page");
+}
+
+
+
@T("Newsletter.Title")
+
+
+
+ @Model.Result
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerOrders.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerOrders.cshtml
new file mode 100644
index 0000000..f2d6b67
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerOrders.cshtml
@@ -0,0 +1,178 @@
+@model CustomerOrderListModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-order-list-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.Orders })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.CustomerOrders")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerOrdersTop, additionalData = Model })
+ @if (Model.RecurringOrders.Count > 0)
+ {
+
+
+ @T("Account.CustomerOrders.RecurringOrders")
+
+
+
+ if (Model.RecurringPaymentErrors.Any())
+ {
+
+
+ @foreach (var error in Model.RecurringPaymentErrors)
+ {
+ - @error
+ }
+
+
+ }
+ }
+
+ @if (Model.Orders.Count > 0)
+ {
+ foreach (var order in Model.Orders)
+ {
+
+
+
+ @T("Account.CustomerOrders.OrderNumber"): @order.CustomOrderNumber
+
+
+
+ -
+ @T("Account.CustomerOrders.OrderStatus"): @order.OrderStatus
+
+ -
+ @T("Account.CustomerOrders.OrderDate"): @order.CreatedOn.ToString()
+
+ -
+ @T("Account.CustomerOrders.OrderTotal"): @order.OrderTotal
+
+
+
+ @if (order.IsReturnRequestAllowed)
+ {
+
+ }
+
+
+
+
+
+ }
+ }
+ else
+ {
+
+ @T("Account.CustomerOrders.NoOrders")
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerOrdersBottom, additionalData = Model })
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerRewardPoints.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerRewardPoints.cshtml
new file mode 100644
index 0000000..aeb52bc
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/CustomerRewardPoints.cshtml
@@ -0,0 +1,104 @@
+@model CustomerRewardPointsModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-reward-points-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.RewardPoints })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.RewardPoints")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerRewardPointsTop, additionalData = Model })
+
+
@T("RewardPoints.CurrentBalance", Model.RewardPointsBalance, Model.RewardPointsAmount)
+ @if (Model.MinimumRewardPointsBalance > 0)
+ {
+
@T("RewardPoints.MinimumBalance", Model.MinimumRewardPointsBalance, Model.MinimumRewardPointsAmount)
+ }
+
+
+
+ @T("RewardPoints.History")
+
+ @if (Model.RewardPoints.Count > 0)
+ {
+
+
+
+
+
+
+
+
+
+
+
+ |
+ @T("RewardPoints.Fields.CreatedDate")
+ |
+
+ @T("RewardPoints.Fields.Points")
+ |
+
+ @T("RewardPoints.Fields.PointsBalance")
+ |
+
+ @T("RewardPoints.Fields.Message")
+ |
+
+ @T("RewardPoints.Fields.EndDate")
+ |
+
+
+
+ @for (var i = 0; i < Model.RewardPoints.Count; i++)
+ {
+ var item = Model.RewardPoints[i];
+
+ |
+ @item.CreatedOn
+ |
+
+ @item.Points
+ |
+
+ @item.PointsBalance
+ |
+
+ @item.Message
+ |
+
+ @item.EndDate
+ |
+
+ }
+
+
+
+ var pager = await Html.PagerAsync(Model.PagerModel);
+ if (!string.IsNullOrEmpty(await pager.RenderHtmlContentAsync()))
+ {
+
+ }
+ }
+ else
+ {
+
+ @T("RewardPoints.NoHistory")
+
+ }
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerRewardPointsBottom, additionalData = Model })
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/Details.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/Details.cshtml
new file mode 100644
index 0000000..cff2c90
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/Details.cshtml
@@ -0,0 +1,741 @@
+@model OrderDetailsModel
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Media
+
+@inject MediaSettings mediaSettings
+@{
+ if (!Model.PrintMode)
+ {
+ Layout = "_ColumnsOne";
+ }
+ else
+ {
+ Layout = "_Print";
+ }
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.OrderDetails").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-order-details-page");
+}
+@if (Model.PrintMode)
+{
+
+}
+
+ @if (!Model.PrintMode)
+ {
+
+
@T("Order.OrderInformation")
+
+ }
+
+
+
+ @if (!Model.PdfInvoiceDisabled)
+ {
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsPageTop, additionalData = Model })
+
+
+
@T("Order.Order#")@Model.CustomOrderNumber
+
+
+ -
+ @T("Order.OrderDate"): @Model.CreatedOn.ToString("D")
+
+ -
+ @T("Order.OrderStatus"): @Model.OrderStatus
+
+ -
+ @T("Order.OrderTotal"): @Model.OrderTotal
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsPageOverview, additionalData = Model })
+
+
+
+
+
+
+ @T("Order.BillingAddress")
+
+
+ -
+ @Model.BillingAddress.FirstName @Model.BillingAddress.LastName
+
+ -
+ @T("Order.Email"): @Model.BillingAddress.Email
+
+ @if (Model.BillingAddress.PhoneEnabled)
+ {
+ -
+ @T("Order.Phone"): @Model.BillingAddress.PhoneNumber
+
+ }
+ @if (Model.BillingAddress.FaxEnabled)
+ {
+ -
+ @T("Order.Fax"): @Model.BillingAddress.FaxNumber
+
+ }
+ @if (Model.BillingAddress.CompanyEnabled && !string.IsNullOrEmpty(Model.BillingAddress.Company))
+ {
+ -
+ @Model.BillingAddress.Company
+
+ }
+ @foreach (var item in Model.BillingAddress.AddressFields)
+ {
+ - @item.Value
+
+ }
+ @if (!string.IsNullOrEmpty(Model.VatNumber))
+ {
+ -
+
+ @T("Order.VATNumber")
+
+
+ @Model.VatNumber
+
+
+ }
+ @if (!string.IsNullOrEmpty(Model.BillingAddress.FormattedCustomAddressAttributes))
+ {
+ -
+ @Html.Raw(Model.BillingAddress.FormattedCustomAddressAttributes)
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsBillingAddress, additionalData = Model })
+
+
+
+
+ @if (!string.IsNullOrEmpty(Model.PaymentMethod))
+ {
+
+
+ @T("Order.Payment")
+
+
+ -
+
+ @T("Order.Payment.Method"):
+
+
+ @Model.PaymentMethod
+
+
+ @if (!Model.PrintMode)
+ {
+ -
+
+ @T("Order.Payment.Status"):
+
+
+ @Model.PaymentMethodStatus
+
+
+ }
+ @if (!Model.PrintMode && Model.CanRePostProcessPayment)
+ {
+ @*Complete payment (for redirection payment methods)*@
+ -
+
+
+ }
+ @if (Model.CustomValues != null)
+ {
+ foreach (var item in Model.CustomValues)
+ {
+ -
+
+ @item.Key:
+
+
+ @(item.Value != null ? item.Value.ToString() : "")
+
+
+ }
+ }
+
+
+ }
+
+ @if (Model.IsShippable)
+ {
+
+
+
+ @(Model.PickupInStore ? T("Order.PickupAddress") : T("Order.ShippingAddress"))
+
+
+ @if (!Model.PickupInStore)
+ {
+ -
+ @Model.ShippingAddress.FirstName @Model.ShippingAddress.LastName
+
+ -
+ @T("Order.Email"): @Model.ShippingAddress.Email
+
+ if (Model.ShippingAddress.PhoneEnabled)
+ {
+ -
+ @T("Order.Phone"): @Model.ShippingAddress.PhoneNumber
+
+ }
+ if (Model.ShippingAddress.FaxEnabled)
+ {
+ -
+ @T("Order.Fax"): @Model.ShippingAddress.FaxNumber
+
+ }
+ if (Model.ShippingAddress.CompanyEnabled && !string.IsNullOrEmpty(Model.ShippingAddress.Company))
+ {
+ -
+ @Model.ShippingAddress.Company
+
+ }
+ @foreach (var item in Model.ShippingAddress.AddressFields)
+ {
+ - @item.Value
+ }
+ if (!string.IsNullOrEmpty(Model.ShippingAddress.FormattedCustomAddressAttributes))
+ {
+ -
+ @Html.Raw(Model.ShippingAddress.FormattedCustomAddressAttributes)
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsShippingAddress, additionalData = Model })
+ }
+ else
+ {
+ @foreach (var item in Model.PickupAddress.AddressFields)
+ {
+ - @item.Value
+
+ }
+ }
+
+
+
+ }
+
+
+
+ @T("Order.Shipping")
+
+
+ -
+
+ @T("Order.Shipping.Name"):
+
+
+ @Model.ShippingMethod
+
+
+ @if (!Model.PrintMode)
+ {
+ -
+
+ @T("Order.Shipping.Status"):
+
+
+ @Model.ShippingStatus
+
+
+ }
+
+
+
+
+
+ @if (!Model.PrintMode && Model.Shipments.Count > 0)
+ {
+
+
+ @T("Order.Shipments")
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ @T("Order.Shipments.ID")
+ |
+
+ @T("Order.Shipments.TrackingNumber")
+ |
+ @if (Model.PickupInStore)
+ {
+
+ @T("Order.Shipments.ReadyForPickupDate")
+ |
+ }
+ else
+ {
+
+ @T("Order.Shipments.ShippedDate")
+ |
+ }
+
+ @T("Order.Shipments.DeliveryDate")
+ |
+
+ @T("Order.Shipments.ViewDetails")
+ |
+
+
+
+ @foreach (var item in Model.Shipments)
+ {
+
+ |
+ @item.Id.ToString()
+ |
+
+ @item.TrackingNumber
+ |
+ @if (Model.PickupInStore)
+ {
+
+
+ @if (item.ReadyForPickupDate.HasValue)
+ {
+ @item.ReadyForPickupDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.ReadyForPickupDate.NotYet")
+ }
+ |
+ }
+ else
+ {
+
+ @if (item.ShippedDate.HasValue)
+ {
+ @item.ShippedDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.ShippedDate.NotYet")
+ }
+ |
+ }
+
+ @if (item.DeliveryDate.HasValue)
+ {
+ @item.DeliveryDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.DeliveryDate.NotYet")
+ }
+ |
+
+ @T("Order.Shipments.ViewDetails")
+ |
+
+ }
+
+
+
+
+ }
+ @if (Model.Items.Count > 0)
+ {
+ if (!Model.PrintMode && Model.OrderNotes.Count > 0)
+ {
+
+
+ @T("Order.Notes")
+
+
+
+
+
+
+
+
+
+ |
+ @T("Order.Notes.CreatedOn")
+ |
+
+ @T("Order.Notes.Note")
+ |
+
+
+
+ @foreach (var item in Model.OrderNotes)
+ {
+
+ |
+ @item.CreatedOn.ToString()
+ |
+
+ @Html.Raw(item.Note)
+ @if (item.HasDownload)
+ {
+
+ @T("Order.Notes.Download")
+
+ }
+ |
+
+ }
+
+
+
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsPageBeforeproducts, additionalData = Model })
+
+
+ @T("Order.Product(s)")
+
+
+
+
+ @if (Model.ShowSku)
+ {
+
+ }
+ @if (Model.ShowProductThumbnail)
+ {
+
+ }
+ @if (Model.ShowVendorName)
+ {
+
+ }
+
+
+
+
+
+
+
+ @if (Model.ShowSku)
+ {
+ |
+ @T("Order.Product(s).SKU")
+ |
+ }
+ @if (Model.ShowProductThumbnail)
+ {
+
+ @T("Order.Product(s).Image")
+ |
+ }
+
+ @T("Order.Product(s).Name")
+ |
+ @if (Model.ShowVendorName)
+ {
+
+ @T("Order.Product(s).VendorName")
+ |
+ }
+
+ @T("Order.Product(s).Price")
+ |
+
+ @T("Order.Product(s).Quantity")
+ |
+
+ @T("Order.Product(s).Total")
+ |
+
+
+
+ @foreach (var item in Model.Items)
+ {
+
+ @if (Model.ShowSku)
+ {
+ |
+ @item.Sku
+ |
+ }
+ @if (Model.ShowProductThumbnail)
+ {
+
+
+ |
+ }
+
+ @if (!Model.PrintMode)
+ {
+ @item.ProductName
+ }
+ else
+ {
+ @item.ProductName
+ }
+ @if (!string.IsNullOrEmpty(item.AttributeInfo))
+ {
+
+ @Html.Raw(item.AttributeInfo)
+
+ }
+ @if (!string.IsNullOrEmpty(item.RentalInfo))
+ {
+
+ @Html.Raw(item.RentalInfo)
+
+ }
+ @if (item.DownloadId > 0)
+ {
+
+ }
+ @if (item.LicenseId > 0)
+ {
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsProductLine, additionalData = item })
+ |
+ @if (Model.ShowVendorName)
+ {
+
+
+ @item.VendorName
+ |
+ }
+
+ @item.UnitPrice
+ |
+
+ @item.Quantity
+ |
+
+ @item.SubTotal
+ |
+
+ }
+
+
+ @if (Model.Items.Count > 0 && Model.DisplayTaxShippingInfo)
+ {
+ var inclTax = Model.PricesIncludeTax;
+ //tax info is already included in the price (incl/excl tax). that's why we display only shipping info here
+ //of course, you can modify appropriate locales to include VAT info there
+
+ @T(inclTax ? "Order.TaxShipping.InclTax" : "Order.TaxShipping.ExclTax", Url.RouteTopicUrl("shippinginfo"))
+
+ }
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsPageAfterproducts, additionalData = Model })
+
+ @if (!string.IsNullOrEmpty(Model.CheckoutAttributeInfo))
+ {
+
+ @Html.Raw(Model.CheckoutAttributeInfo)
+
+ }
+
+
+
+
+
+
+
+ |
+
+ @T("Order.SubTotal"):
+
+ |
+
+
+ @Model.OrderSubtotal
+
+ |
+
+ @if (!string.IsNullOrEmpty(Model.OrderSubTotalDiscount))
+ {
+
+ |
+
+ @T("Order.SubTotalDiscount"):
+
+ |
+
+
+ @Model.OrderSubTotalDiscount
+
+ |
+
+ }
+ @if (Model.IsShippable)
+ {
+
+ |
+
+ @T("Order.Shipping"):
+
+ |
+
+
+ @Model.OrderShipping
+
+ |
+
+ }
+ @if (!string.IsNullOrEmpty(Model.PaymentMethodAdditionalFee))
+ {
+
+ |
+
+ @T("Order.PaymentMethodAdditionalFee"):
+
+ |
+
+
+ @Model.PaymentMethodAdditionalFee
+
+ |
+
+ }
+ @if (Model.DisplayTaxRates && Model.TaxRates.Count > 0)
+ {
+ foreach (var taxRate in Model.TaxRates)
+ {
+
+ |
+
+ @string.Format(T("Order.TaxRateLine").Text, taxRate.Rate):
+
+ |
+
+
+ @taxRate.Value
+
+ |
+
+ }
+ }
+ @if (Model.DisplayTax)
+ {
+
+ |
+
+ @T("Order.Tax"):
+
+ |
+
+
+ @Model.Tax
+
+ |
+
+ }
+ @if (!string.IsNullOrEmpty(Model.OrderTotalDiscount))
+ {
+
+ |
+
+ @T("Order.TotalDiscount"):
+
+ |
+
+
+ @Model.OrderTotalDiscount
+
+ |
+
+ }
+ @if (Model.GiftCards.Count > 0)
+ {
+ foreach (var gc in Model.GiftCards)
+ {
+
+ |
+
+ @string.Format(T("Order.GiftCardInfo").Text, gc.CouponCode):
+
+ |
+
+
+ @gc.Amount
+
+ |
+
+ }
+ }
+ @if (Model.RedeemedRewardPoints > 0)
+ {
+
+ |
+ @string.Format(T("Order.RewardPoints").Text, Model.RedeemedRewardPoints):
+ |
+
+
+ @Model.RedeemedRewardPointsAmount
+
+ |
+
+ }
+
+ |
+
+ @T("Order.OrderTotal"):
+
+ |
+
+
+
+ @Model.OrderTotal
+
+
+ |
+
+
+
+
+
+ @if (!Model.PrintMode)
+ {
+
+ @if (Model.IsReOrderAllowed)
+ {
+
+ }
+ @if (Model.IsReturnRequestAllowed)
+ {
+
+ }
+
+ }
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderDetailsPageBottom, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/ShipmentDetails.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/ShipmentDetails.cshtml
new file mode 100644
index 0000000..bc5d756
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Order/ShipmentDetails.cshtml
@@ -0,0 +1,277 @@
+@model ShipmentDetailsModel
+@using Nop.Core.Domain.Catalog
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ShipmentDetails").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-shipment-details-page");
+}
+
+
+
@string.Format(T("Order.Shipments.Information").Text, Model.Id)
+
+
+
+
+
+
+ @T("Order.Shipments.Order#")@Model.Order.Id
+
+
+ -
+ @T("Order.Shipments.ShippingMethod"): @Model.Order.ShippingMethod
+
+ @if (Model.Order.PickupInStore)
+ {
+ -
+ @T("Order.Shipments.ReadyForPickupDate"):
+ @if (Model.ReadyForPickupDate.HasValue)
+ {
+ @Model.ReadyForPickupDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.ReadyForPickupDate.NotYet")
+ }
+
+ }
+ else
+ {
+ -
+ @T("Order.Shipments.ShippedDate"):
+ @if (Model.ShippedDate.HasValue)
+ {
+ @Model.ShippedDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.ShippedDate.NotYet")
+ }
+
+ }
+ -
+ @T("Order.Shipments.DeliveryDate"):
+ @if (Model.DeliveryDate.HasValue)
+ {
+ @Model.DeliveryDate.Value.ToString("D")
+ }
+ else
+ {
+ @T("Order.Shipments.DeliveryDate.NotYet")
+ }
+
+ @if (!string.IsNullOrEmpty(Model.TrackingNumber))
+ {
+ -
+ @T("Order.Shipments.TrackingNumber"):
+ @if (!string.IsNullOrEmpty(Model.TrackingNumberUrl))
+ {
+ @Model.TrackingNumber
+ }
+ else
+ {
+ @Model.TrackingNumber
+ }
+
+ }
+
+
+
+
+
+ @if (!Model.Order.PickupInStore)
+ {
+
+ @T("Order.Shipments.ShippingAddress")
+
+
+ -
+ @Model.Order.ShippingAddress.FirstName @Model.Order.ShippingAddress.LastName
+
+ -
+ @T("Order.Shipments.Email"): @Model.Order.ShippingAddress.Email
+
+ -
+ @T("Order.Shipments.Phone"): @Model.Order.ShippingAddress.PhoneNumber
+
+ -
+ @T("Order.Shipments.Fax"): @Model.Order.ShippingAddress.FaxNumber
+
+ @if (!string.IsNullOrEmpty(Model.Order.ShippingAddress.Company))
+ {
+ -
+ @Model.Order.ShippingAddress.Company
+
+ }
+ -
+ @Model.Order.ShippingAddress.Address1
+
+ @if (!string.IsNullOrEmpty(Model.Order.ShippingAddress.Address2))
+ {
+ -
+ @Model.Order.ShippingAddress.Address2
+
+ }
+ -
+ @Model.Order.ShippingAddress.City, @Model.Order.ShippingAddress.County, @Model.Order.ShippingAddress.StateProvinceName
+ @Model.Order.ShippingAddress.ZipPostalCode
+
+ @if (!string.IsNullOrEmpty(Model.Order.ShippingAddress.CountryName))
+ {
+ -
+ @Model.Order.ShippingAddress.CountryName
+
+ }
+
+ }
+ else
+ {
+
+ @T("Order.Shipments.PickupAddress")
+
+
+ -
+ @Model.Order.PickupAddress.Address1
+
+ -
+ @Model.Order.PickupAddress.City, @Model.Order.PickupAddress.County, @Model.Order.PickupAddress.StateProvinceName
+ @Model.Order.PickupAddress.ZipPostalCode
+
+ @if (!string.IsNullOrEmpty(Model.Order.PickupAddress.CountryName))
+ {
+ -
+ @Model.Order.PickupAddress.CountryName
+
+ }
+
+ }
+
+
+
+ @if (Model.Items.Count > 0)
+ {
+
+
+ @T("Order.Shipments.Product(s)")
+
+
+
+
+ @if (Model.ShowSku)
+ {
+
+ }
+
+
+
+
+
+ @if (Model.ShowSku)
+ {
+ |
+ @T("Order.Shipments.Product(s).SKU")
+ |
+ }
+
+ @T("Order.Shipments.Product(s).Name")
+ |
+
+ @T("Order.Shipments.Product(s).Quantity")
+ |
+
+
+
+ @foreach (var item in Model.Items)
+ {
+
+ @if (Model.ShowSku)
+ {
+ |
+ @item.Sku
+ |
+ }
+
+ @item.ProductName
+ @if (!string.IsNullOrEmpty(item.AttributeInfo))
+ {
+
+ @Html.Raw(item.AttributeInfo)
+
+ }
+ @if (!string.IsNullOrEmpty(item.RentalInfo))
+ {
+
+ @Html.Raw(item.RentalInfo)
+
+ }
+ |
+
+ @item.QuantityShipped
+ |
+
+ }
+
+
+
+
+ }
+ @if (Model.ShipmentStatusEvents.Count > 0)
+ {
+
+
+ @T("Order.ShipmentStatusEvents")
+
+
+
+
+
+
+
+
+
+
+
+ |
+ @T("Order.ShipmentStatusEvents.Event")
+ |
+
+ @T("Order.ShipmentStatusEvents.Location")
+ |
+
+ @T("Order.ShipmentStatusEvents.Country")
+ |
+
+ @T("Order.ShipmentStatusEvents.Date")
+ |
+
+
+
+ @foreach (var item in Model.ShipmentStatusEvents)
+ {
+
+ |
+ @item.EventName
+ |
+
+ @item.Location
+ |
+
+ @item.Country
+ |
+
+ @if (item.Date.HasValue)
+ {
+ @item.Date.Value.ToString("D")
+ }
+ |
+
+ }
+
+
+
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/Index.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/Index.cshtml
new file mode 100644
index 0000000..9ad56a4
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/Index.cshtml
@@ -0,0 +1,37 @@
+@model PrivateMessageIndexModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.PrivateMessages").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-private-messages");
+ NopHtml.AppendPageCssClassParts("html-private-messages-page");
+}
+
+
+
@T("PrivateMessages.PrivateMessages")
+
+
+ @{
+ var selectSentTab = Model.SentItemsTabSelected ? ".tabs( 'option', 'active', 1 )" : "";
+ }
+
+
+
+
+ @await Component.InvokeAsync(typeof(PrivateMessagesInboxViewComponent), new { pageNumber = Model.InboxPage, tab = "inbox" })
+
+
+ @await Component.InvokeAsync(typeof(PrivateMessagesSentItemsViewComponent), new { pageNumber = Model.SentItemsPage, tab = "sent" })
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/SendPM.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/SendPM.cshtml
new file mode 100644
index 0000000..6f58e0b
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/SendPM.cshtml
@@ -0,0 +1,64 @@
+@model SendPrivateMessageModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.SendPM").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-private-messages");
+ NopHtml.AppendPageCssClassParts("html-private-message-send-page");
+}
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/ViewPM.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/ViewPM.cshtml
new file mode 100644
index 0000000..840a661
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/PrivateMessages/ViewPM.cshtml
@@ -0,0 +1,47 @@
+@model PrivateMessageModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ViewPM").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-private-messages");
+ NopHtml.AppendPageCssClassParts("html-private-message-view-page");
+}
+
+
+
@T("PrivateMessages.View.ViewMessage")
+
+
+
+
+ -
+
+ @Model.CustomerFromName
+
+ -
+
+ @Model.CustomerToName
+
+ -
+
+ @Model.Subject
+
+
+
+ @Html.Raw(Model.Message)
+
+
+
+
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CompareProducts.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CompareProducts.cshtml
new file mode 100644
index 0000000..7b4683f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CompareProducts.cshtml
@@ -0,0 +1,181 @@
+@model CompareProductsModel
+@using Nop.Core.Domain.Catalog
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.CompareProducts").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-compare-products-page");
+}
+@{
+ var columnWidth = "";
+ if (Model.Products.Count > 0)
+ {
+ columnWidth = Math.Round((decimal)(90M / Model.Products.Count), 0).ToString() + "%";
+ }
+ var uniqueGroupes = new List();
+ foreach (var group in Model.Products.SelectMany(p => p.ProductSpecificationModel.Groups))
+ {
+ if (!uniqueGroupes.Any(g => g.Id == group.Id))
+ uniqueGroupes.Add(group);
+ }
+}
+
+
+
@T("Products.Compare.Title")
+
+
+ @if (Model.Products.Count > 0)
+ {
+
@T("Products.Compare.Clear")
+
+
+
+
+ |
+
+ |
+ @foreach (var product in Model.Products)
+ {
+ var picture = product.PictureModels.FirstOrDefault();
+
+
+
+
+
+
+
+
+
+ |
+ }
+
+
+ |
+
+ |
+ @foreach (var product in Model.Products)
+ {
+
+ @product.Name
+ |
+ }
+
+
+ |
+ @T("Products.Compare.Price")
+ |
+ @foreach (var product in Model.Products)
+ {
+
+ @product.ProductPrice.Price
+ |
+ }
+
+ @if (Model.IncludeShortDescriptionInCompareProducts)
+ {
+
+ |
+ @T("Products.Compare.ShortDescription")
+ |
+ @foreach (var product in Model.Products)
+ {
+
+ @Html.Raw(product.ShortDescription)
+ |
+ }
+
+ }
+ @if (Model.IncludeFullDescriptionInCompareProducts)
+ {
+
+ |
+
+ |
+ @foreach (var product in Model.Products)
+ {
+
+ @Html.Raw(product.FullDescription)
+ |
+ }
+
+ }
+ @foreach (var group in uniqueGroupes)
+ {
+ if (group.Attributes.Count > 0)
+ {
+ @if (group.Id > 0)
+ {
+
+ |
+
+ |
+
+ }
+
+ var uniqueGroupAttributes = new List();
+ foreach (var attribute in Model.Products.SelectMany(p => p.ProductSpecificationModel.Groups.Where(g => g.Id == group.Id).SelectMany(g => g.Attributes)))
+ {
+ if (!uniqueGroupAttributes.Any(sa => sa.Id == attribute.Id))
+ uniqueGroupAttributes.Add(attribute);
+ }
+ @foreach (var specificationAttribute in uniqueGroupAttributes)
+ {
+
+ |
+ @specificationAttribute.Name
+ |
+ @foreach (var product in Model.Products)
+ {
+ var foundProductSpec = product.ProductSpecificationModel.Groups
+ .Where(g => g.Id == group.Id)
+ .SelectMany(g => g.Attributes)
+ .FirstOrDefault(sa => sa.Id == specificationAttribute.Id);
+
+ @if (foundProductSpec != null)
+ {
+ for (int i = 0; i < foundProductSpec.Values.Count; i++)
+ {
+ var value = foundProductSpec.Values[i];
+
+ if (string.IsNullOrEmpty(value.ColorSquaresRgb))
+ {
+ @Html.Raw(value.ValueRaw)
+ if (i != foundProductSpec.Values.Count - 1)
+ {
+ ,
+ }
+ }
+ else
+ {
+
+
+
+
+
+ }
+ }
+ }
+ else
+ {
+
+ }
+ |
+ }
+
+ }
+ }
+ }
+
+
+
+ }
+ else
+ {
+
+ @T("Products.Compare.NoItems")
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CustomerProductReviews.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CustomerProductReviews.cshtml
new file mode 100644
index 0000000..812b2a2
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/CustomerProductReviews.cshtml
@@ -0,0 +1,102 @@
+@model CustomerProductReviewsModel
+@using Nop.Core.Domain.Catalog
+@inject Nop.Services.Html.IHtmlFormatter htmlFormatter
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.CustomerProductReviews").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-my-product-reviews-list-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.ProductReviews })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.CustomerProductReviews")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerProductReviewsTop, additionalData = Model })
+ @if (Model.ProductReviews.Count > 0)
+ {
+ foreach (var review in Model.ProductReviews)
+ {
+ var ratingPercent = review.Rating * 20;
+
+
+
+ @review.Title@(!string.IsNullOrEmpty(review.ApprovalStatus) ? $" - {review.ApprovalStatus}" : null)
+
+
+
+
+
+ @Html.Raw(htmlFormatter.FormatText(review.ReviewText, false, true, false, false, false, false))
+
+ @foreach (var reviewType in review.AdditionalProductReviewList.Where(x => x.Rating > 0))
+ {
+ var ratingExtPercent = reviewType.Rating * 20;
+
+
+ @reviewType.Name
+
+
+
+
+ }
+
+
+
+ @review.ProductName
+
+
+
|
+
+
+ @review.WrittenOnStr
+
+
+ @if (!string.IsNullOrEmpty(review.ReplyText))
+ {
+
+
+
+ @Html.Raw(htmlFormatter.FormatText(review.ReplyText, false, true, false, false, false, false))
+
+
+ }
+
+
+ }
+ var pager = await Html.PagerAsync(Model.PagerModel);
+ if (!string.IsNullOrEmpty(await pager.RenderHtmlContentAsync()))
+ {
+
+ }
+ }
+ else
+ {
+
+ @T("Account.CustomerProductReviews.NoRecords")
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerProductReviewsBottom, additionalData = Model })
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductEmailAFriend.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductEmailAFriend.cshtml
new file mode 100644
index 0000000..a2629e1
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductEmailAFriend.cshtml
@@ -0,0 +1,81 @@
+@model ProductEmailAFriendModel
+@using Nop.Core.Domain.Catalog
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(Model.ProductName);
+ //page class
+ NopHtml.AddTitleParts(T("PageTitle.ProductEmailAFriend").Text);
+ NopHtml.AppendPageCssClassParts("html-email-a-friend-page");
+}
+
+
+
@T("Products.EmailAFriend.Title")
+
+
+
+ @if (Model.SuccessfullySent)
+ {
+
+ @Model.Result
+
+ }
+ else
+ {
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Grouped.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Grouped.cshtml
new file mode 100644
index 0000000..239bd4f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Grouped.cshtml
@@ -0,0 +1,258 @@
+@model ProductDetailsModel
+
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Seo
+@using Nop.Services.Html
+
+@inject IHtmlFormatter htmlFormatter
+@inject IWebHelper webHelper
+@inject SeoSettings seoSettings
+
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Name);
+ //meta
+ NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
+ NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-product-details-page");
+
+ //canonical URL
+ if (seoSettings.CanonicalUrlsEnabled)
+ {
+ var productUrl = Url.RouteUrl(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
+ NopHtml.AddCanonicalUrlParts(productUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
+ }
+
+ //open graph META tags
+ if (seoSettings.OpenGraphMetaTags)
+ {
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ }
+
+ //Twitter META tags
+ if (seoSettings.TwitterMetaTags)
+ {
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ }
+}
+
+
+ @await Html.PartialAsync("_ProductBreadcrumb", Model.Breadcrumb)
+
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterBreadcrumb, additionalData = Model })
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsTop, additionalData = Model })
+
+
+ @if (Model.ProductReviewOverview.AllowCustomerReviews)
+ {
+ @await Html.PartialAsync("_ProductReviews", Model.ProductReviews)
+ }
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Simple.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Simple.cshtml
new file mode 100644
index 0000000..7a44d70
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/ProductTemplate.Simple.cshtml
@@ -0,0 +1,213 @@
+@model ProductDetailsModel
+
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Seo
+@using Nop.Services.Html
+
+@inject IHtmlFormatter htmlFormatter
+@inject IWebHelper webHelper
+@inject SeoSettings seoSettings
+
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Name);
+ //meta
+ NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
+ NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-product-details-page");
+
+ //canonical URL
+ if (seoSettings.CanonicalUrlsEnabled)
+ {
+ var productUrl = Url.RouteUrl(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
+ NopHtml.AddCanonicalUrlParts(productUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
+ }
+
+ //open graph META tags
+ if (seoSettings.OpenGraphMetaTags)
+ {
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ }
+
+ //Twitter META tags
+ if (seoSettings.TwitterMetaTags)
+ {
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ NopHtml.AddHeadCustomParts("");
+ }
+}
+
+
+ @await Html.PartialAsync("_ProductBreadcrumb", Model.Breadcrumb)
+
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterBreadcrumb, additionalData = Model })
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsTop, additionalData = Model })
+
+
+ @if (Model.ProductReviewOverview.AllowCustomerReviews)
+ {
+ @await Html.PartialAsync("_ProductReviews", Model.ProductReviews)
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/RecentlyViewedProducts.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/RecentlyViewedProducts.cshtml
new file mode 100644
index 0000000..218574d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/RecentlyViewedProducts.cshtml
@@ -0,0 +1,31 @@
+@model IList
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.RecentlyViewedProducts").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-recently-viewed-products-page");
+}
+
+
+
@T("Products.RecentlyViewedProducts")
+
+
+ @if (Model.Count > 0)
+ {
+
+
+ @foreach (var product in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", product)
+
+
+ }
+
+
+ }
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToCart.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToCart.cshtml
new file mode 100644
index 0000000..c9484d8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToCart.cshtml
@@ -0,0 +1,130 @@
+@model ProductDetailsModel.AddToCartModel
+@using Nop.Core.Domain.Orders
+@if (Model.UpdatedShoppingCartItemId > 0)
+{
+
+}
+@if (!Model.DisableBuyButton || Model.CustomerEntersPrice)
+{
+
+ @if (Model.CustomerEntersPrice)
+ {
+
+
+
+ @*round price*@
+
+
+
+ @Model.CustomerEnteredPriceRange
+
+
+ }
+ @if (!string.IsNullOrEmpty(Model.MinimumQuantityNotification))
+ {
+
@Model.MinimumQuantityNotification
+ }
+ @if (!Model.DisableBuyButton)
+ {
+
+
+
+ @if (Model.AllowedQuantities.Count > 0)
+ {
+
+
+ }
+ else
+ {
+
+
+
+
+
+ //when a customer clicks 'Enter' button we submit the "add to cart" button (if visible)
+
+ }
+
+ @{
+ var addToCartText = "";
+ if (Model.UpdatedShoppingCartItemId > 0 && Model.UpdateShoppingCartItemType.HasValue && Model.UpdateShoppingCartItemType.Value == ShoppingCartType.ShoppingCart)
+ {
+ addToCartText = T("ShoppingCart.AddToCart.Update").Text;
+ }
+ else
+ {
+ addToCartText = T("ShoppingCart.AddToCart").Text;
+ if (Model.IsRental)
+ {
+ addToCartText = T("ShoppingCart.Rent").Text;
+ }
+ if (Model.AvailableForPreOrder)
+ {
+ addToCartText = T("ShoppingCart.PreOrder").Text;
+ }
+ }
+
+
+
+ }
+
+ if (!string.IsNullOrEmpty(Model.PreOrderAvailabilityStartDateTimeUserTime))
+ {
+
+
+ @Html.Raw(Model.PreOrderAvailabilityStartDateTimeUserTime)
+
+ }
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAddInfo, additionalData = Model })
+
+}
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToWishlist.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToWishlist.cshtml
new file mode 100644
index 0000000..5f5e8cf
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_AddToWishlist.cshtml
@@ -0,0 +1,17 @@
+@model ProductDetailsModel.AddToCartModel
+@using Nop.Core.Domain.Orders
+@if (!Model.DisableWishlistButton)
+{
+ var addToWishlistText = "";
+ if (Model.UpdatedShoppingCartItemId > 0 && Model.UpdateShoppingCartItemType.HasValue && Model.UpdateShoppingCartItemType.Value == ShoppingCartType.Wishlist)
+ {
+ addToWishlistText = T("Products.Wishlist.AddToWishlist.Update").Text;
+ }
+ else
+ {
+ addToWishlistText = T("Products.Wishlist.AddToWishlist").Text;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Availability.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Availability.cshtml
new file mode 100644
index 0000000..a81a30c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Availability.cshtml
@@ -0,0 +1,14 @@
+@model ProductDetailsModel
+@if (!string.IsNullOrWhiteSpace(Model.StockAvailability) || Model.DisplayBackInStockSubscription)
+{
+
+ @if (!string.IsNullOrWhiteSpace(Model.StockAvailability))
+ {
+
+ @T("Products.Availability"):
+ @Model.StockAvailability
+
+ }
+ @await Html.PartialAsync("_BackInStockSubscription", Model)
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_BackInStockSubscription.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_BackInStockSubscription.cshtml
new file mode 100644
index 0000000..a63277b
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_BackInStockSubscription.cshtml
@@ -0,0 +1,14 @@
+@model ProductDetailsModel
+@if (Model.DisplayBackInStockSubscription)
+{
+
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_CompareProductsButton.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_CompareProductsButton.cshtml
new file mode 100644
index 0000000..044ee96
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_CompareProductsButton.cshtml
@@ -0,0 +1,10 @@
+@model ProductDetailsModel
+@{
+ var addtocomparelink = Url.RouteUrl("AddProductToCompare", new { productId = Model.Id });
+}
+@if (Model.CompareProductsEnabled)
+{
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DeliveryInfo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DeliveryInfo.cshtml
new file mode 100644
index 0000000..8982ad8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DeliveryInfo.cshtml
@@ -0,0 +1,26 @@
+@model ProductDetailsModel
+@if (Model.FreeShippingNotificationEnabled && Model.IsFreeShipping || !string.IsNullOrWhiteSpace(Model.DeliveryDate))
+{
+
+
+ @if (Model.FreeShippingNotificationEnabled && Model.IsFreeShipping)
+ {
+
@T("Products.FreeShipping")
+ }
+ @if (!string.IsNullOrWhiteSpace(Model.DeliveryDate))
+ {
+
+ @T("Products.DeliveryDate"):
+ @Model.DeliveryDate
+
+ }
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Discontinued.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Discontinued.cshtml
new file mode 100644
index 0000000..43987e3
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_Discontinued.cshtml
@@ -0,0 +1,7 @@
+@model ProductDetailsModel
+@if (Model.DisplayDiscontinuedMessage)
+{
+
+
@T("Products.Discontinued")
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DownloadSample.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DownloadSample.cshtml
new file mode 100644
index 0000000..25ad193
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_DownloadSample.cshtml
@@ -0,0 +1,9 @@
+@model ProductDetailsModel
+@if (Model.HasSampleDownload)
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_GiftCardInfo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_GiftCardInfo.cshtml
new file mode 100644
index 0000000..7a2c3e5
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_GiftCardInfo.cshtml
@@ -0,0 +1,57 @@
+@model ProductDetailsModel.GiftCardModel
+@if (Model.IsGiftCard)
+{
+
+
+ @if (Model.GiftCardType == Nop.Core.Domain.Catalog.GiftCardType.Virtual)
+ {
+
+ }
+
+ @if (Model.GiftCardType == Nop.Core.Domain.Catalog.GiftCardType.Virtual)
+ {
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductAttributes.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductAttributes.cshtml
new file mode 100644
index 0000000..8cdb64e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductAttributes.cshtml
@@ -0,0 +1,532 @@
+@model ProductDetailsModel
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Media
+@using System.Text
+@using Nop.Services.Catalog
+@using Nop.Services.Media
+@inject IDownloadService downloadService
+@inject CatalogSettings catalogSettings
+@if (Model.ProductAttributes.Count > 0)
+{
+
+ if (Model.AllowAddingOnlyExistingAttributeCombinations && catalogSettings.AttributeValueOutOfStockDisplayType == AttributeValueOutOfStockDisplayType.Disable)
+ {
+
+
+ }
+
+ //dynamic update support
+ var attributesHaveConditions = Model.ProductAttributes.Any(x => x.HasCondition);
+ var attributesHaveAssociatedPictures = Model.ProductAttributes.Any(x => x.ProductId > 0);
+ var attributeChangeScriptsBuilder = new StringBuilder();
+ var attributeChangeHandlerFuncName = $"attribute_change_handler_{Model.Id}";
+ if (catalogSettings.AjaxProcessAttributeChange)
+ {
+ if (Model.AllowAddingOnlyExistingAttributeCombinations && catalogSettings.AttributeValueOutOfStockDisplayType == AttributeValueOutOfStockDisplayType.Disable)
+ {
+
+ }
+ else
+ {
+ //generate change event script
+ foreach (var attribute in Model.ProductAttributes)
+ {
+ var controlId = $"{NopCatalogDefaults.ProductAttributePrefix}{attribute.Id}";
+ switch (attribute.AttributeControlType)
+ {
+ case AttributeControlType.DropdownList:
+ {
+ attributeChangeScriptsBuilder.AppendFormat("$('#{0}').on('change', function(){{{1}();}});\n", controlId, attributeChangeHandlerFuncName);
+ }
+ break;
+ case AttributeControlType.RadioList:
+ case AttributeControlType.ColorSquares:
+ case AttributeControlType.ImageSquares:
+ {
+ foreach (var attributeValue in attribute.Values)
+ {
+ attributeChangeScriptsBuilder.AppendFormat("$('#{0}_{1}').on('click', function(){{{2}();}});\n", controlId, attributeValue.Id, attributeChangeHandlerFuncName);
+ }
+ }
+ break;
+ case AttributeControlType.Checkboxes:
+ case AttributeControlType.ReadonlyCheckboxes:
+ {
+ foreach (var attributeValue in attribute.Values)
+ {
+ attributeChangeScriptsBuilder.AppendFormat("$('#{0}_{1}').on('click', function(){{{2}();}});\n", controlId, attributeValue.Id, attributeChangeHandlerFuncName);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ foreach (var attribute in Model.ProductAttributes)
+ {
+ foreach (var attributeValue in attribute.Values.Where(value => value.CustomerEntersQty))
+ {
+ var controlId = $"{NopCatalogDefaults.ProductAttributePrefix}{attribute.Id}";
+ attributeChangeScriptsBuilder.AppendFormat("$('#{0}_{1}_qty').on('input propertychange paste', function(){{{2}();}});\n", controlId, attributeValue.Id, attributeChangeHandlerFuncName);
+ }
+ }
+
+ //render scripts
+ //almost the same implementation is used in the \Views\Product\_RentalInfo.cshtml file
+
+ }
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductBreadcrumb.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductBreadcrumb.cshtml
new file mode 100644
index 0000000..0de8493
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductBreadcrumb.cshtml
@@ -0,0 +1,46 @@
+@model ProductDetailsModel.ProductBreadcrumbModel
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Common
+@using Nop.Core.Domain.Seo
+@inject CommonSettings commonSettings
+@inject SeoSettings seoSettings
+@{
+ var breadcrumbDelimiter = commonSettings.BreadcrumbDelimiter;
+}
+@if (Model.Enabled)
+{
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductBreadcrumbBefore, additionalData = Model })
+ -
+
+
+ @T("Products.Breadcrumb.Top")
+
+
+ @*@breadcrumbDelimiter*@
+
+ @foreach (var category in Model.CategoryBreadcrumb)
+ {
+ -
+
+ @category.Name
+
+ @*@breadcrumbDelimiter*@
+
+ }
+ -
+ @Model.ProductName
+
+ @*@Model.ProductName*@
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductBreadcrumbAfter, additionalData = Model })
+
+
+ @if (seoSettings.MicrodataEnabled)
+ {
+
+ }
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsPictures.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsPictures.cshtml
new file mode 100644
index 0000000..0cfcb35
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsPictures.cshtml
@@ -0,0 +1,109 @@
+@model ProductDetailsModel
+
+
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBeforePictures, additionalData = Model })
+
+ @if (Model.DefaultPictureZoomEnabled && Model.PictureModels.Count == 1)
+ {
+
+
+
+
+ }
+ else
+ {
+

+ }
+
+ @if (Model.PictureModels.Count > 1 && Model.DefaultPictureZoomEnabled)
+ {
+
+ @foreach (var picture in Model.PictureModels)
+ {
+
+ }
+
+
+
+ }
+ else
+ {
+ if (Model.PictureModels.Count > 1)
+ {
+ if (Model.PictureModels.Count <= 3)
+ {
+
+ @foreach (var picture in Model.PictureModels)
+ {
+
+ }
+
+ }
+ else
+ {
+
+ @foreach (var picture in Model.PictureModels)
+ {
+
+ }
+
+ }
+
+ }
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterPictures, additionalData = Model })
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsVideos.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsVideos.cshtml
new file mode 100644
index 0000000..c124f1d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductDetailsVideos.cshtml
@@ -0,0 +1,15 @@
+@model ProductDetailsModel
+
+@if (Model.VideoModels.Any())
+{
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBeforeVideos, additionalData = Model })
+
+ @foreach (var video in Model.VideoModels)
+ {
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterVideos, additionalData = Model })
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEmailAFriendButton.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEmailAFriendButton.cshtml
new file mode 100644
index 0000000..efcc2d9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEmailAFriendButton.cshtml
@@ -0,0 +1,7 @@
+@model ProductDetailsModel
+@if (Model.EmailAFriendEnabled)
+{
+
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEstimateShipping.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEstimateShipping.cshtml
new file mode 100644
index 0000000..ec79725
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductEstimateShipping.cshtml
@@ -0,0 +1,145 @@
+@model ProductDetailsModel.ProductEstimateShippingModel
+
+@if (Model.Enabled)
+{
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductManufacturers.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductManufacturers.cshtml
new file mode 100644
index 0000000..7cc97dc
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductManufacturers.cshtml
@@ -0,0 +1,26 @@
+@model IList
+@using Nop.Core.Domain.Catalog
+@if (Model.Count > 0)
+{
+
+ @if (Model.Count == 1)
+ {
+
@T("Products.Manufacturer"):
+ }
+ else
+ {
+
@T("Products.Manufacturers"):
+ }
+
+ @for (var i = 0; i < Model.Count; i++)
+ {
+ var item = Model[i];
+ @item.Name
+ if (i != Model.Count - 1)
+ {
+ ,
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductPrice.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductPrice.cshtml
new file mode 100644
index 0000000..a31b049
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductPrice.cshtml
@@ -0,0 +1,75 @@
+@model ProductDetailsModel.ProductPriceModel
+@using Nop.Core
+@using Nop.Core.Domain.Tax
+@inject IWorkContext workContext
+@if (!Model.CustomerEntersPrice)
+{
+
+ @if (Model.CallForPrice)
+ {
+ @*call for price*@
+
+ @T("Products.CallForPrice")
+
+ }
+ else
+ {
+ if (Model.IsRental)
+ {
+
+ @T("Products.Price.RentalPrice"):
+ @Model.RentalPrice
+
+ }
+ if (!string.IsNullOrWhiteSpace(Model.OldPrice))
+ {
+ @*old price*@
+
+ @T("Products.Price.OldPrice"):
+ @Model.OldPrice
+
+ }
+
+
+ @if (!string.IsNullOrWhiteSpace(Model.OldPrice) || !string.IsNullOrWhiteSpace(Model.PriceWithDiscount))
+ {
+ @*display "Price:" label if we have old price or discounted one*@
+
+ }
+
+ @*render price*@
+ id="price-value-@(Model.ProductId)" class="price-value-@(Model.ProductId)" }>
+ @Html.Raw(Model.Price)
+
+
+ if (!string.IsNullOrWhiteSpace(Model.PriceWithDiscount))
+ {
+ @*discounted price*@
+
+ @T("Products.Price.WithDiscount"):
+
+ @Html.Raw(Model.PriceWithDiscount)
+
+
+ }
+ if (!string.IsNullOrEmpty(Model.BasePricePAngV))
+ {
+
+ @Model.BasePricePAngV
+
+ }
+ if (Model.DisplayTaxShippingInfo)
+ {
+ var inclTax = await workContext.GetTaxDisplayTypeAsync() == TaxDisplayType.IncludingTax;
+ //tax info is already included in the price (incl/excl tax). that's why we display only shipping info here
+ //of course, you can modify appropriate locales to include VAT info there
+
+ @T(inclTax ? "Products.Price.TaxShipping.InclTax" : "Products.Price.TaxShipping.ExclTax", Url.RouteTopicUrl("shippinginfo"))
+
+ }
+ }
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewHelpfulness.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewHelpfulness.cshtml
new file mode 100644
index 0000000..15971f7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewHelpfulness.cshtml
@@ -0,0 +1,49 @@
+@model ProductReviewHelpfulnessModel
+
+ @T("Reviews.Helpfulness.WasHelpful?")
+
+
+ /
+
+
+
+ (@(Model.HelpfulYesTotal)/@(Model.HelpfulNoTotal))
+
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewOverview.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewOverview.cshtml
new file mode 100644
index 0000000..3761ce7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviewOverview.cshtml
@@ -0,0 +1,34 @@
+@model ProductReviewOverviewModel
+@{
+ var ratingPercent = 0;
+ var noReviews = Model.TotalReviews == 0;
+ if (!noReviews)
+ {
+ ratingPercent = ((Model.RatingSum * 100) / Model.TotalReviews) / 5;
+ }
+}
+@if (Model.AllowCustomerReviews)
+{
+
+
+
+ @if (Model.TotalReviews > 0)
+ {
+
+ }
+ @if (Model.CanAddNewReview && Model.CanCurrentCustomerLeaveReview)
+ {
+
+ }
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviews.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviews.cshtml
new file mode 100644
index 0000000..2af8d2f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductReviews.cshtml
@@ -0,0 +1,227 @@
+@model ProductReviewsModel
+@inject Nop.Services.Html.IHtmlFormatter htmlFormatter
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductReviewsPageTop, additionalData = Model })
+ @if (!Model.AddProductReview.CanCurrentCustomerLeaveReview)
+ {
+
+ @T("Reviews.OnlyRegisteredUsersCanWriteReviews")
+
+ }
+ else if (!Model.AddProductReview.CanAddNewReview)
+ {
+
+ @T("Reviews.AlreadyAddedProductReviews")
+
+ }
+ else
+ {
+
+ }
+ @if (Model.Items.Count > 0)
+ {
+
+
+
+ @T("Reviews.ExistingReviews")
+
+ @foreach (var review in Model.Items)
+ {
+ var ratingPercent = review.Rating * 20;
+
+
+
+ @if (!string.IsNullOrEmpty(review.CustomerAvatarUrl))
+ {
+
+ @if (review.AllowViewingProfiles)
+ {
+
+
+
+ }
+ else
+ {
+
)
+ }
+
+ }
+
+
+
+ @Html.Raw(htmlFormatter.FormatText(review.ReviewText, false, true, false, false, false, false))
+
+
+ @foreach (var reviewType in review.AdditionalProductReviewList.Where(x => x.Rating > 0 && x.VisibleToAllCustomers))
+ {
+ var ratingExtPercent = reviewType.Rating * 20;
+
+
+ @reviewType.Name
+
+
+
+
+ @reviewType.Rating
+
+
+
+
+ }
+
+
+ @T("Reviews.From"):
+ @if (review.AllowViewingProfiles)
+ {
+ @(review.CustomerName)
+ }
+ else
+ {
+ @review.CustomerName
+ }
+
+
|
+
+ @T("Reviews.Date"):
+ @review.WrittenOnStr
+
+
+ @await Html.PartialAsync("_ProductReviewHelpfulness", review.Helpfulness)
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductReviewsPageInsideReview, additionalData = review })
+ @if (!string.IsNullOrEmpty(review.ReplyText))
+ {
+
+
+
+ @Html.Raw(htmlFormatter.FormatText(review.ReplyText, false, true, false, false, false, false))
+
+
+ }
+
+
+
+ }
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductReviewsPageBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductSpecifications.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductSpecifications.cshtml
new file mode 100644
index 0000000..4d90027
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductSpecifications.cshtml
@@ -0,0 +1,69 @@
+@model ProductSpecificationModel
+
+@using Nop.Core.Domain.Catalog;
+
+@if (Model.Groups.SelectMany(g => g.Attributes).ToList().Count > 0)
+{
+
+ @*
+
@T("Products.Specs")
+ *@
+
+
+
+
+ | @T("Products.Specs.AttributeName") |
+ @T("Products.Specs.AttributeValue") |
+
+
+
+ @foreach (var group in Model.Groups)
+ {
+ @if (group.Attributes.Count > 0)
+ {
+ @if (group.Id > 0)
+ {
+
+ }
+ @for (int i = 0; i < group.Attributes.Count; i++)
+ {
+ var attr = group.Attributes[i];
+
+ |
+ @attr.Name
+ |
+
+ @for (int j = 0; j < attr.Values.Count; j++)
+ {
+ var value = attr.Values[j];
+ @if (!string.IsNullOrEmpty(value.ColorSquaresRgb) && (value.AttributeTypeId == (int)SpecificationAttributeType.Option))
+ {
+
+
+
+
+
+ }
+ else
+ {
+ @Html.Raw(value.ValueRaw)
+ if (j != attr.Values.Count - 1)
+ {
+ ,
+ }
+ }
+ }
+ |
+
+ }
+ }
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTags.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTags.cshtml
new file mode 100644
index 0000000..a971c8e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTags.cshtml
@@ -0,0 +1,27 @@
+@model IList
+@using Nop.Core.Domain.Catalog
+ @if (Model.Count > 0)
+ {
+
+
+ }
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTierPrices.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTierPrices.cshtml
new file mode 100644
index 0000000..1086306
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ProductTierPrices.cshtml
@@ -0,0 +1,41 @@
+@model IList
+@{
+ //When there is just one tier (with qty 1), there are no actual savings in the list.
+ var displayTierPrices = Model.Count > 0 && !(Model.Count == 1 && Model[0].Quantity <= 1);
+}
+@if (displayTierPrices)
+{
+
+
+
+
+
+
+
+ @foreach (var tierPrice in Model)
+ {
+ |
+ @(tierPrice.Quantity)+
+ |
+ }
+
+
+
+ @foreach (var tierPrice in Model)
+ {
+ |
+ @tierPrice.Price
+ |
+ }
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_RentalInfo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_RentalInfo.cshtml
new file mode 100644
index 0000000..a9e9225
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_RentalInfo.cshtml
@@ -0,0 +1,84 @@
+@model ProductDetailsModel
+@using Nop.Core.Domain.Catalog
+@using Nop.Services.Helpers
+@inject CatalogSettings catalogSettings
+@inject IUserAgentHelper userAgentHelper
+@if (Model.IsRental)
+{
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_SKU_Man_GTIN_Ven.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_SKU_Man_GTIN_Ven.cshtml
new file mode 100644
index 0000000..3139bad
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_SKU_Man_GTIN_Ven.cshtml
@@ -0,0 +1,38 @@
+@model ProductDetailsModel
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Vendors
+
+
+ @*SKU*@
+ @if ((!string.IsNullOrWhiteSpace(Model.Sku) || Model.ManageInventoryMethod == ManageInventoryMethod.ManageStockByAttributes) && Model.ShowSku)
+ {
+
+ @T("Products.Sku"):
+ @Model.Sku
+
+ }
+ @*Manufacturer part number*@
+ @if ((!string.IsNullOrWhiteSpace(Model.ManufacturerPartNumber) || Model.ManageInventoryMethod == ManageInventoryMethod.ManageStockByAttributes) && Model.ShowManufacturerPartNumber)
+ {
+
+ @T("Products.ManufacturerPartNumber"):
+ @Model.ManufacturerPartNumber
+
+ }
+ @*GTIN*@
+ @if ((!string.IsNullOrWhiteSpace(Model.Gtin) || Model.ManageInventoryMethod == ManageInventoryMethod.ManageStockByAttributes) && Model.ShowGtin)
+ {
+
+ @T("Products.GTIN"):
+ @Model.Gtin
+
+ }
+ @*Vendor*@
+ @if (Model.ShowVendor)
+ {
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ShareButton.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ShareButton.cshtml
new file mode 100644
index 0000000..fca11d6
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Product/_ShareButton.cshtml
@@ -0,0 +1,7 @@
+@model ProductDetailsModel
+@if (!string.IsNullOrWhiteSpace(Model.PageShareCode))
+{
+
+ @Html.Raw(Model.PageShareCode)
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfileInfo/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfileInfo/Default.cshtml
new file mode 100644
index 0000000..66a5e1d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfileInfo/Default.cshtml
@@ -0,0 +1,56 @@
+@model ProfileInfoModel
+
+
+ @if (!string.IsNullOrEmpty(Model.AvatarUrl))
+ {
+
+
)
+
+ }
+ @if (Model.LocationEnabled)
+ {
+
+ -
+
+ @Model.Location
+
+
+ }
+ @if (Model.PMEnabled)
+ {
+
+ @Html.RouteLink(T("Forum.PrivateMessages.PM").Text, "SendPM", new { toCustomerId = Model.CustomerProfileId }, new { @class = "pm-link-button" })
+
+ }
+
+
+
+ @T("Profile.Statistics")
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProfilePageInfoUserdetails, additionalData = Model })
+
+ @if (Model.TotalPostsEnabled)
+ {
+ -
+
+ @Model.TotalPosts
+
+ }
+ @if (Model.JoinDateEnabled)
+ {
+ -
+
+ @Model.JoinDate
+
+ }
+ @if (Model.DateOfBirthEnabled)
+ {
+ -
+
+ @Model.DateOfBirth
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProfilePageInfoUserstats, additionalData = Model })
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfilePosts/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfilePosts/Default.cshtml
new file mode 100644
index 0000000..3dcb8f6
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Components/ProfilePosts/Default.cshtml
@@ -0,0 +1,37 @@
+@model ProfilePostsModel
+@if (Model.Posts.Count > 0)
+{
+
+ @foreach (var item in Model.Posts)
+ {
+
+
+
+ @Html.RouteLink(item.ForumTopicTitle, "TopicSlug", new { id = item.ForumTopicId, slug = item.ForumTopicSlug })
+
+
+
@Html.Raw(item.ForumPostText)
+
+
+
+ @item.Posted
+
+
+ }
+
+}
+else
+{
+
+ @T("Profile.LatestPosts.NoPosts")
+
+}
+@{
+ var pager = await Html.PagerAsync(Model.PagerModel);
+}
+@if (!string.IsNullOrEmpty(await pager.RenderHtmlContentAsync()))
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Index.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Index.cshtml
new file mode 100644
index 0000000..71f833e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Profile/Index.cshtml
@@ -0,0 +1,42 @@
+@model ProfileIndexModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Profile").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-profile-page");
+}
+
+
+
@Model.ProfileTitle
+
+
+ @{
+ var selectPostsTab = Model.ForumsEnabled && Model.PagingPosts ? ".tabs( 'option', 'active', 1 )" : "";
+ }
+
+
+
+
+ @await Component.InvokeAsync(typeof(ProfileInfoViewComponent), new { customerProfileId = Model.CustomerProfileId })
+
+ @if (Model.ForumsEnabled)
+ {
+
+ @await Component.InvokeAsync(typeof(ProfilePostsViewComponent), new { customerProfileId = Model.CustomerProfileId, pageNumber = Model.PostsPage })
+
+ }
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/CustomerReturnRequests.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/CustomerReturnRequests.cshtml
new file mode 100644
index 0000000..4a35612
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/CustomerReturnRequests.cshtml
@@ -0,0 +1,76 @@
+@model CustomerReturnRequestsModel
+@using Nop.Core.Domain.Catalog
+
+@inject Nop.Services.Html.IHtmlFormatter htmlFormatter
+
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Account").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-return-request-list-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.ReturnRequests })
+}
+
+
+
@T("Account.MyAccount") - @T("Account.CustomerReturnRequests")
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerReturnRequestsTop, additionalData = Model })
+
+ @foreach (var item in Model.Items)
+ {
+
+
+
+ @string.Format(T("Account.CustomerReturnRequests.Title").Text, item.CustomNumber, item.ReturnRequestStatus)
+
+
+ -
+
+ @item.ProductName
+ x @item.Quantity
+
+ -
+
+ @item.ReturnReason
+
+ -
+
+ @item.ReturnAction
+
+ -
+
+ @item.CreatedOn.ToString()
+
+ @if (item.UploadedFileGuid != Guid.Empty)
+ {
+ -
+
+
+
+ @T("Account.CustomerReturnRequests.UploadedFile.Download")
+
+
+
+ }
+ @if (!string.IsNullOrEmpty(item.Comments))
+ {
+
+ }
+
+
+
+ }
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerReturnRequestsBottom, additionalData = Model })
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/ReturnRequest.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/ReturnRequest.cshtml
new file mode 100644
index 0000000..4184723
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ReturnRequest/ReturnRequest.cshtml
@@ -0,0 +1,202 @@
+@model SubmitReturnRequestModel
+@using Nop.Core.Domain.Catalog
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ReturnItems").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-return-request-page");
+}
+
+
+
@Html.Raw(string.Format(T("ReturnRequests.Title").Text, Url.RouteUrl("OrderDetails", new { orderId = Model.OrderId }), Model.CustomOrderNumber))
+
+
+ @if (!string.IsNullOrEmpty(Model.Result))
+ {
+
+ @Model.Result
+
+ }
+ else
+ {
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/AdminHeaderLinks/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/AdminHeaderLinks/Default.cshtml
new file mode 100644
index 0000000..ebd04de
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/AdminHeaderLinks/Default.cshtml
@@ -0,0 +1,22 @@
+@model AdminHeaderLinksModel
+@if (Model.IsCustomerImpersonated || Model.DisplayAdminLink)
+{
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.AdminHeaderLinksAfter, additionalData = Model })
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/BlogRssHeaderLink/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/BlogRssHeaderLink/Default.cshtml
new file mode 100644
index 0000000..f1b1223
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/BlogRssHeaderLink/Default.cshtml
@@ -0,0 +1,10 @@
+@using Nop.Core
+@inject Nop.Services.Localization.ILocalizationService localizationService
+@inject IStoreContext storeContext
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@{
+ var link = Url.RouteUrl("BlogRSS", new { languageId = (await workContext.GetWorkingLanguageAsync()).Id }, webHelper.GetCurrentRequestProtocol());
+ var storeName = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), x => x.Name);
+}
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CategoryNavigation/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CategoryNavigation/Default.cshtml
new file mode 100644
index 0000000..ac5b313
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CategoryNavigation/Default.cshtml
@@ -0,0 +1,83 @@
+@model CategoryNavigationModel
+@using Nop.Core.Domain.Catalog
+@functions {
+ bool BreadCrumbContainsCurrentCategoryId(CategorySimpleModel category)
+ {
+ if (Model.CurrentCategoryId == 0)
+ return false;
+
+ if (category.Id == Model.CurrentCategoryId)
+ return true;
+
+ foreach (var subCategory in category.SubCategories)
+ {
+ if (BreadCrumbContainsCurrentCategoryId(subCategory))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ async Task CategoryLine(CategoryNavigationModel.CategoryLineModel lineModel)
+ {
+ var active = lineModel.Category.Id == lineModel.CurrentCategoryId || lineModel.Category.SubCategories.Count(BreadCrumbContainsCurrentCategoryId) > 0;
+ var last = lineModel.Category.Id == lineModel.CurrentCategoryId;
+ var liClass = active ? "active" : "inactive";
+ if (last)
+ {
+ liClass += " last";
+ }
+
+
+ @lineModel.Category.Name
+ @if (lineModel.Category.NumberOfProducts.HasValue)
+ {
+ @T("Categories.TotalProducts", lineModel.Category.NumberOfProducts.Value)
+ }
+
+ @{
+ if (lineModel.Category.Id == lineModel.CurrentCategoryId ||
+ lineModel.Category.SubCategories.Count(BreadCrumbContainsCurrentCategoryId) > 0)
+ {
+ if (lineModel.Category.SubCategories.Count > 0)
+ {
+
+ @foreach (var subCategory in lineModel.Category.SubCategories)
+ {
+ var categoryLineModel = new CategoryNavigationModel.CategoryLineModel
+ {
+ CurrentCategoryId = lineModel.CurrentCategoryId,
+ Category = subCategory
+ };
+ await CategoryLine(categoryLineModel);
+ }
+
+ }
+ }
+ }
+
+ }
+}
+@if (Model.Categories.Count > 0)
+{
+
+
+ @T("Categories")
+
+
+
+ @foreach (var category in Model.Categories)
+ {
+ var categoryLineModel = new CategoryNavigationModel.CategoryLineModel
+ {
+ CurrentCategoryId = Model.CurrentCategoryId,
+ Category = category
+ };
+ await CategoryLine(categoryLineModel);
+ }
+
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CheckoutProgress/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CheckoutProgress/Default.cshtml
new file mode 100644
index 0000000..3db551e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CheckoutProgress/Default.cshtml
@@ -0,0 +1,25 @@
+@model CheckoutProgressModel
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CrossSellProducts/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CrossSellProducts/Default.cshtml
new file mode 100644
index 0000000..13c00e3
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CrossSellProducts/Default.cshtml
@@ -0,0 +1,35 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+
+ @T("ShoppingCart.CrossSells")
+
+
+
+ @if (Model.Count <= 4)
+ {
+ foreach (var product in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", product)
+
+
+ }
+ }
+ else
+ {
+
+ @foreach (var product in Model)
+ {
+
+
@await Html.PartialAsync("_ProductBox", product)
+
+ }
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CurrencySelector/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CurrencySelector/Default.cshtml
new file mode 100644
index 0000000..fd01fae
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CurrencySelector/Default.cshtml
@@ -0,0 +1,18 @@
+@model CurrencySelectorModel
+
+@inject Nop.Core.IWebHelper webHelper
+@if (Model.AvailableCurrencies.Count > 1)
+{
+
+ @{
+ var returnUrl = webHelper.GetRawUrl(Context.Request);
+ var currencies = await Model.AvailableCurrencies.SelectAwait(async x => new SelectListItem
+ {
+ Text = x.Name,
+ Value = Url.RouteUrl("ChangeCurrency", new { customercurrency = x.Id, returnUrl }, webHelper.GetCurrentRequestProtocol()),
+ Selected = x.Id.Equals(Model.CurrentCurrencyId)
+ }).ToListAsync();
+
+ }
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CustomerNavigation/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CustomerNavigation/Default.cshtml
new file mode 100644
index 0000000..9bf9a57
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/CustomerNavigation/Default.cshtml
@@ -0,0 +1,18 @@
+@model CustomerNavigationModel
+
+
+ @T("Account.Navigation")
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.AccountNavigationBefore, additionalData = Model })
+ @foreach (var item in Model.CustomerNavigationItems)
+ {
+ -
+ @(item.Title)
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.AccountNavigationAfter, additionalData = Model })
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/EuCookieLaw/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/EuCookieLaw/Default.cshtml
new file mode 100644
index 0000000..6992ec4
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/EuCookieLaw/Default.cshtml
@@ -0,0 +1,32 @@
+
+
+
+
@T("EUCookieLaw.Description2")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ExternalMethods/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ExternalMethods/Default.cshtml
new file mode 100644
index 0000000..5e4b31a
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ExternalMethods/Default.cshtml
@@ -0,0 +1,9 @@
+@model List
+@if (Model.Any())
+{
+ @T("Account.AssociatedExternalAuth.Or")
+}
+@foreach (var authenticationMethod in Model)
+{
+ @await Component.InvokeAsync(authenticationMethod.ViewComponent)
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Favicon/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Favicon/Default.cshtml
new file mode 100644
index 0000000..4d0d9ea
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Favicon/Default.cshtml
@@ -0,0 +1,2 @@
+@model FaviconAndAppIconsModel
+@Html.Raw(Model.HeadCode)
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/FlyoutShoppingCart/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/FlyoutShoppingCart/Default.cshtml
new file mode 100644
index 0000000..e5e3520
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/FlyoutShoppingCart/Default.cshtml
@@ -0,0 +1,76 @@
+@model MiniShoppingCartModel
+@using Nop.Core.Domain.Catalog
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Footer/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Footer/Default.cshtml
new file mode 100644
index 0000000..c8d0e2c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Footer/Default.cshtml
@@ -0,0 +1,179 @@
+@model FooterModel
+
+@using Nop.Core
+@using Nop.Core.Domain.Tax
+@using Nop.Core.Domain.Topics
+
+@inject IWorkContext workContext
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HeaderLinks/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HeaderLinks/Default.cshtml
new file mode 100644
index 0000000..c4f734a
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HeaderLinks/Default.cshtml
@@ -0,0 +1,64 @@
+@model HeaderLinksModel
+@using Nop.Core.Domain.Customers
+@inject Nop.Core.IWebHelper webHelper
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageBestSellers/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageBestSellers/Default.cshtml
new file mode 100644
index 0000000..979c6c6
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageBestSellers/Default.cshtml
@@ -0,0 +1,35 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+
+ @T("Bestsellers")
+
+
+
+ @if (Model.Count <= 4)
+ {
+ foreach (var item in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", item)
+
+
+ }
+ }
+ else
+ {
+
+ @foreach (var item in Model)
+ {
+
+
@await Html.PartialAsync("_ProductBox", item)
+
+ }
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageCategories/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageCategories/Default.cshtml
new file mode 100644
index 0000000..68ffb47
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageCategories/Default.cshtml
@@ -0,0 +1,50 @@
+@model IList
+@using Nop.Core.Domain.Catalog
+@if (Model.Count > 0)
+{
+
+
+ @T("Categories")
+
+
+ @if (Model.Count <= 3)
+ {
+ foreach (var item in Model)
+ {
+
+ }
+ }
+ else
+ {
+
+ @foreach (var item in Model)
+ {
+
+ }
+
+ }
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageNews/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageNews/Default.cshtml
new file mode 100644
index 0000000..ec82413
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageNews/Default.cshtml
@@ -0,0 +1,75 @@
+@model HomepageNewsItemsModel
+@using Nop.Core.Domain.News
+@if (Model.NewsItems.Count > 0)
+{
+
+
+ @T("News")
+
+
+
+ @if (Model.NewsItems.Count <= 2)
+ {
+ foreach (var item in Model.NewsItems)
+ {
+
+
+
+
+ -
+ @item.CreatedOn.ToString("D")
+
+
+ @Html.Raw(item.Short)
+
+
+
+
+ }
+ }
+ else
+ {
+
+ @foreach (var item in Model.NewsItems)
+ {
+
+
+
+
+ -
+ @item.CreatedOn.ToString("D")
+
+
+ @Html.Raw(item.Short)
+
+
+
+
+ }
+
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepagePolls/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepagePolls/Default.cshtml
new file mode 100644
index 0000000..434f577
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepagePolls/Default.cshtml
@@ -0,0 +1,17 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+
+ @T("Polls.Title")
+
+
+
+ @foreach (var poll in Model)
+ {
+ @await Html.PartialAsync("_Poll", poll)
+ }
+
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageProducts/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageProducts/Default.cshtml
new file mode 100644
index 0000000..6333693
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/HomepageProducts/Default.cshtml
@@ -0,0 +1,37 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+
+ @T("Homepage.Products")
+
+
+
+ @if (Model.Count <= 4)
+ {
+ foreach (var item in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", item)
+
+
+ }
+ }
+ else
+ {
+
+ @foreach (var item in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", item)
+
+
+ }
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/LanguageSelector/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/LanguageSelector/Default.cshtml
new file mode 100644
index 0000000..63014d7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/LanguageSelector/Default.cshtml
@@ -0,0 +1,36 @@
+@model LanguageSelectorModel
+
+@inject Nop.Core.IWebHelper webHelper
+@if (Model.AvailableLanguages.Count > 1)
+{
+
+ @{
+ var returnUrl = webHelper.GetRawUrl(Context.Request);
+
+ if (Model.UseImages)
+ {
+
+ @foreach (var lang in Model.AvailableLanguages)
+ {
+ -
+
+
+
+
+ }
+
+ }
+ else
+ {
+ var languages = await Model.AvailableLanguages.SelectAwait(async lang => new SelectListItem
+ {
+ Text = lang.Name,
+ Value = Url.RouteUrl("ChangeLanguage", new { langid = lang.Id, returnUrl }, webHelper.GetCurrentRequestProtocol()),
+ Selected = lang.Id.Equals(Model.CurrentLanguageId)
+ }).ToListAsync();
+
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Logo/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Logo/Default.cshtml
new file mode 100644
index 0000000..bcc2c73
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Logo/Default.cshtml
@@ -0,0 +1,4 @@
+@model LogoModel
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ManufacturerNavigation/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ManufacturerNavigation/Default.cshtml
new file mode 100644
index 0000000..dd1fff9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ManufacturerNavigation/Default.cshtml
@@ -0,0 +1,26 @@
+@model ManufacturerNavigationModel
+@using Nop.Core.Domain.Catalog
+@if (Model.Manufacturers.Count > 0)
+{
+
+
+ @T("Manufacturers")
+
+
+
+ @if (Model.TotalManufacturers > Model.Manufacturers.Count)
+ {
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsRssHeaderLink/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsRssHeaderLink/Default.cshtml
new file mode 100644
index 0000000..e5bc3ff
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsRssHeaderLink/Default.cshtml
@@ -0,0 +1,10 @@
+@using Nop.Core
+@inject Nop.Services.Localization.ILocalizationService localizationService
+@inject IStoreContext storeContext
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@{
+ var link = Url.RouteUrl("NewsRSS", new { languageId = (await workContext.GetWorkingLanguageAsync()).Id }, webHelper.GetCurrentRequestProtocol());
+ var storeName = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), x => x.Name);
+}
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsletterBox/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsletterBox/Default.cshtml
new file mode 100644
index 0000000..ba57991
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/NewsletterBox/Default.cshtml
@@ -0,0 +1,115 @@
+@model NewsletterBoxModel
+
+
+
+
+
@T("Newsletter.Title")
+
+
+
+
+
+
+ @if (Model.AllowToUnsubscribe)
+ {
+
+
+
+
+
+
+
+
+
+
+ }
+ @if (Model.DisplayCaptcha)
+ {
+
+ }
+
+
+ @T("Common.Wait")
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderSummary/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderSummary/Default.cshtml
new file mode 100644
index 0000000..6c3e1f1
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderSummary/Default.cshtml
@@ -0,0 +1,558 @@
+@model ShoppingCartModel
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Media
+@using Nop.Core.Domain.Orders
+@using Nop.Core.Domain.Tax
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@inject MediaSettings mediaSettings
+@inject OrderSettings orderSettings
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryContentBefore, additionalData = Model })
+ @await Html.PartialAsync("_OrderReviewData", Model.OrderReviewData)
+ @if (Model.Items.Count > 0)
+ {
+ if (Model.Warnings.Count > 0)
+ {
+
+
+ @foreach (var warning in Model.Warnings)
+ {
+ - @warning
+ }
+
+
+ }
+ @*we add enctype = "multipart/form-data" because "File upload" attribute control type requires it*@
+
+ }
+ else
+ {
+
+ @T("ShoppingCart.CartIsEmpty")
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryContentAfter, additionalData = Model })
+
+@*JavaScript for mobile and desktop resize*@
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderTotals/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderTotals/Default.cshtml
new file mode 100644
index 0000000..673ed83
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/OrderTotals/Default.cshtml
@@ -0,0 +1,189 @@
+@model OrderTotalsModel
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PollBlock/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PollBlock/Default.cshtml
new file mode 100644
index 0000000..583fa5f
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PollBlock/Default.cshtml
@@ -0,0 +1,9 @@
+@model PollModel
+
+
+ @T("Polls.Title")
+
+
+ @await Html.PartialAsync("_Poll", Model)
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PopularProductTags/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PopularProductTags/Default.cshtml
new file mode 100644
index 0000000..0119bd8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PopularProductTags/Default.cshtml
@@ -0,0 +1,28 @@
+@model PopularProductTagsModel
+@using Nop.Core.Domain.Catalog
+@if (Model.Tags.Count > 0)
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesInbox/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesInbox/Default.cshtml
new file mode 100644
index 0000000..3fc5369
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesInbox/Default.cshtml
@@ -0,0 +1,93 @@
+@model PrivateMessageListModel
+
+
+ @if (Model.Messages.Count > 0)
+ {
+
+ }
+ else
+ {
+
@T("PrivateMessages.Inbox.NoItems")
+ }
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesSentItems/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesSentItems/Default.cshtml
new file mode 100644
index 0000000..2c6f520
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/PrivateMessagesSentItems/Default.cshtml
@@ -0,0 +1,92 @@
+@model PrivateMessageListModel
+
+
+ @if (Model.Messages.Count > 0)
+ {
+
+ }
+ else
+ {
+
@T("PrivateMessages.Sent.NoItems")
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ProductsAlsoPurchased/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ProductsAlsoPurchased/Default.cshtml
new file mode 100644
index 0000000..d186a1c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ProductsAlsoPurchased/Default.cshtml
@@ -0,0 +1,35 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+
+ @T("Products.AlsoPurchased")
+
+
+
+ @if (Model.Count <= 4)
+ {
+ foreach (var item in Model)
+ {
+
+
+ @await Html.PartialAsync("_ProductBox", item)
+
+
+ }
+ }
+ else
+ {
+
+ @foreach (var item in Model)
+ {
+
+
@await Html.PartialAsync("_ProductBox", item)
+
+ }
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RecentlyViewedProductsBlock/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RecentlyViewedProductsBlock/Default.cshtml
new file mode 100644
index 0000000..c47e0a7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RecentlyViewedProductsBlock/Default.cshtml
@@ -0,0 +1,30 @@
+@model IList
+@using Nop.Core.Domain.Catalog
+@if (Model.Count > 0)
+{
+
+
+ @T("Products.RecentlyViewedProducts")
+
+
+
+ @for (var i = 0; i < Model.Count; i++)
+ {
+ var product = Model[i];
+ var picture = product.PictureModels.FirstOrDefault();
+ -
+ @if (picture != null && !string.IsNullOrEmpty(picture.ImageUrl))
+ {
+
+ }
+ @product.Name
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RelatedProducts/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RelatedProducts/Default.cshtml
new file mode 100644
index 0000000..3b9d8d9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/RelatedProducts/Default.cshtml
@@ -0,0 +1,35 @@
+@model IList
+@if (Model.Count > 0)
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SearchBox/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SearchBox/Default.cshtml
new file mode 100644
index 0000000..5e87f6d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SearchBox/Default.cshtml
@@ -0,0 +1,65 @@
+@model SearchBoxModel
+@using Nop.Core.Domain.Media
+@inject MediaSettings mediaSettings
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SelectedCheckoutAttributes/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SelectedCheckoutAttributes/Default.cshtml
new file mode 100644
index 0000000..e0b793a
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SelectedCheckoutAttributes/Default.cshtml
@@ -0,0 +1,4 @@
+@model string
+
+ @Html.Raw(Model)
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ShoppingCartEstimateShipping/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ShoppingCartEstimateShipping/Default.cshtml
new file mode 100644
index 0000000..4cf1e8d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/ShoppingCartEstimateShipping/Default.cshtml
@@ -0,0 +1,92 @@
+@model EstimateShippingModel
+
+
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SocialButtons/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SocialButtons/Default.cshtml
new file mode 100644
index 0000000..1060f3e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/SocialButtons/Default.cshtml
@@ -0,0 +1,23 @@
+@model SocialModel
+
+ @if (!string.IsNullOrEmpty(Model.FacebookLink))
+ {
+
+ }
+ @if (!string.IsNullOrEmpty(Model.TwitterLink))
+ {
+
+ }
+ @if (!string.IsNullOrEmpty(Model.YoutubeLink))
+ {
+
+ }
+ @if (Model.NewsEnabled)
+ {
+
+ }
+ @if (!string.IsNullOrEmpty(Model.InstagramLink))
+ {
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/StoreThemeSelector/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/StoreThemeSelector/Default.cshtml
new file mode 100644
index 0000000..aad88f3
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/StoreThemeSelector/Default.cshtml
@@ -0,0 +1,16 @@
+@model StoreThemeSelectorModel
+
+@inject Nop.Core.IWebHelper webHelper
+@if (Model.AvailableStoreThemes.Count > 1)
+{
+ var returnUrl = webHelper.GetRawUrl(Context.Request);
+ var themes = await Model.AvailableStoreThemes.SelectAwait(async x => new SelectListItem
+ {
+ Text = x.Title,
+ Value = Url.RouteUrl("SetStoreTheme", new { themename = x.Name, returnUrl }, webHelper.GetCurrentRequestProtocol()),
+ Selected = x.Name.Equals(Model.CurrentStoreTheme.Name, StringComparison.InvariantCultureIgnoreCase)
+ }).ToListAsync();
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TaxTypeSelector/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TaxTypeSelector/Default.cshtml
new file mode 100644
index 0000000..fbc19d1
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TaxTypeSelector/Default.cshtml
@@ -0,0 +1,23 @@
+@model TaxTypeSelectorModel
+@using Nop.Core.Domain.Tax
+@inject Nop.Core.IWebHelper webHelper
+@{
+ var returnUrl = webHelper.GetRawUrl(Context.Request);
+
+ var taxTypes = new List();
+ taxTypes.Add(new SelectListItem
+ {
+ Text = T("Tax.Inclusive").Text,
+ Value = Url.RouteUrl("ChangeTaxType", new { customertaxtype = ((int)TaxDisplayType.IncludingTax), returnUrl }, webHelper.GetCurrentRequestProtocol()),
+ Selected = Model.CurrentTaxType == TaxDisplayType.IncludingTax
+ });
+ taxTypes.Add(new SelectListItem
+ {
+ Text = T("Tax.Exclusive").Text,
+ Value = Url.RouteUrl("ChangeTaxType", new { customertaxtype = ((int)TaxDisplayType.ExcludingTax), returnUrl }, webHelper.GetCurrentRequestProtocol()),
+ Selected = Model.CurrentTaxType == TaxDisplayType.ExcludingTax
+ });
+}
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopMenu/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopMenu/Default.cshtml
new file mode 100644
index 0000000..29d38a2
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopMenu/Default.cshtml
@@ -0,0 +1,105 @@
+@model TopMenuModel
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Topics
+
+
+
+
+@if (Model.UseAjaxMenu)
+{
+
+
+}
+else
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopicBlock/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopicBlock/Default.cshtml
new file mode 100644
index 0000000..f581de5
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/TopicBlock/Default.cshtml
@@ -0,0 +1,86 @@
+@model TopicModel
+@if (Model.IsPasswordProtected)
+{
+
+
+
+
+
+
+
+ @Html.Raw(Model.Body)
+
+
+}
+else
+{
+
+ @if (!string.IsNullOrEmpty(Model.Title))
+ {
+
+
+ @Model.Title
+
+
+ }
+
+ @Html.Raw(Model.Body)
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/VendorNavigation/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/VendorNavigation/Default.cshtml
new file mode 100644
index 0000000..1ccd799
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/VendorNavigation/Default.cshtml
@@ -0,0 +1,26 @@
+@model VendorNavigationModel
+@using Nop.Core.Domain.Vendors
+@if (Model.Vendors.Count > 0)
+{
+
+
+ @T("Vendors")
+
+
+
+ @foreach (var vendor in Model.Vendors)
+ {
+ -
+ @vendor.Name
+
+ }
+
+ @if (Model.TotalVendors > Model.Vendors.Count)
+ {
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Widget/Default.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Widget/Default.cshtml
new file mode 100644
index 0000000..8457911
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Components/Widget/Default.cshtml
@@ -0,0 +1,5 @@
+@model List
+@foreach (var widget in Model)
+{
+ @await Component.InvokeAsync(widget.WidgetViewComponent, widget.WidgetViewComponentArguments);
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Head.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Head.cshtml
new file mode 100644
index 0000000..02efbf9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/Head.cshtml
@@ -0,0 +1,39 @@
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Services.Helpers
+
+@inject CatalogSettings catalogSettings
+@inject IThemeContext themeContext
+@inject IUserAgentHelper userAgentHelper
+
+@inject IWorkContext workContext
+
+@{
+ var supportRtl = (await workContext.GetWorkingLanguageAsync()).Rtl;
+
+ //add main CSS file
+ if (supportRtl)
+ {
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/simplex.styles.responsive.rtl.css");
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/simplex.styles.rtl.css");
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/bootstrap.min.rtl.css");
+ }
+ else
+ {
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/simplex.styles.responsive.css");
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/simplex.styles.css");
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/bootstrap.min.css");
+ }
+
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/owl.carousel.min.css");
+ NopHtml.AppendCssFileParts($"~/Themes/SimplexTheme/Content/css/font-awesome.min.css");
+
+ //add swiper css file
+ if (catalogSettings.DisplayAllPicturesOnCatalogPages)
+ {
+ NopHtml.AppendCssFileParts("~/lib_npm/swiper/swiper-bundle.min.css");
+ }
+
+ //add jQuery UI css file
+ NopHtml.AppendCssFileParts("~/lib_npm/jquery-ui-dist/jquery-ui.min.css");
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_AddressAttributes.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_AddressAttributes.cshtml
new file mode 100644
index 0000000..57c0b16
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_AddressAttributes.cshtml
@@ -0,0 +1,83 @@
+@model IList
+@using Nop.Core.Domain.Catalog;
+@foreach (var attribute in Model)
+{
+ var controlId = attribute.ControlId;
+ var textPrompt = attribute.Name;
+
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.Navigation.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.Navigation.cshtml
new file mode 100644
index 0000000..56b7869
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.Navigation.cshtml
@@ -0,0 +1,59 @@
+@model CategoryNavigationModel.CategoryLineModel
+
+@functions{
+ public bool BreadCrumbContainsCurrentCategoryId(CategorySimpleModel category)
+ {
+ if (Model.CurrentCategoryId == 0)
+ return false;
+
+ if (category.Id == Model.CurrentCategoryId)
+ return true;
+
+ foreach (var subCategory in category.SubCategories)
+ {
+ if (BreadCrumbContainsCurrentCategoryId(subCategory))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
+@{
+ var active = Model.Category.Id == Model.CurrentCategoryId || Model.Category.SubCategories.Count(BreadCrumbContainsCurrentCategoryId) > 0;
+ var last = Model.Category.Id == Model.CurrentCategoryId;
+ var liClass = active ? "active" : "inactive";
+ if (last)
+ {
+ liClass += " last";
+ }
+}
+
+ @Model.Category.Name
+ @if (Model.Category.NumberOfProducts.HasValue)
+ {
+ @T("Categories.TotalProducts", Model.Category.NumberOfProducts.Value)
+ }
+
+ @{
+ if (Model.Category.Id == Model.CurrentCategoryId ||
+ Model.Category.SubCategories.Count(BreadCrumbContainsCurrentCategoryId) > 0)
+ {
+ if (Model.Category.SubCategories.Count > 0)
+ {
+
+ @foreach (var subCategory in Model.Category.SubCategories)
+ {
+ var categoryLineModel = new CategoryNavigationModel.CategoryLineModel
+ {
+ CurrentCategoryId = Model.CurrentCategoryId,
+ Category = subCategory
+ };
+ @await Html.PartialAsync("_CategoryLine.Navigation", categoryLineModel)
+ }
+
+ }
+ }
+ }
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.TopMenu.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.TopMenu.cshtml
new file mode 100644
index 0000000..ee6aed4
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategoryLine.TopMenu.cshtml
@@ -0,0 +1,19 @@
+@model TopMenuModel.CategoryLineModel
+@if (Model.Category.SubCategories.Count > 0)
+{
+ @await Html.PartialAsync("_SubCategoryLine.TopMenu", Model.Category)
+}
+else
+{
+
+
+ @Model.Category.Name
+
+ @if (Model.Category.NumberOfProducts.HasValue)
+ {
+ @T("Categories.TotalProducts", Model.Category.NumberOfProducts.Value)
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategorySubCategoryLine.TopMenu.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategorySubCategoryLine.TopMenu.cshtml
new file mode 100644
index 0000000..2a440ac
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CategorySubCategoryLine.TopMenu.cshtml
@@ -0,0 +1,24 @@
+@model Nop.Web.Models.Catalog.CategorySimpleModel
+@if(Model.SubCategories.Count > 0)
+{
+ @await Html.PartialAsync("_SubCategoryLine.TopMenu", Model)
+}
+else
+{
+
+
+ @Model.Name
+ @if (Model.NumberOfProducts.HasValue)
+ {
+
+ @if(Model.NumberOfProducts.Value < 0)
+ {
+ @:0@(Model.NumberOfProducts.Value)
+ }
+ @T("Categories.TotalProducts", Model.NumberOfProducts.Value)
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CheckoutAttributes.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CheckoutAttributes.cshtml
new file mode 100644
index 0000000..0b776e9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CheckoutAttributes.cshtml
@@ -0,0 +1,288 @@
+@model ShoppingCartModel
+@using System.Text
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Media
+@using Nop.Services.Media
+@inject IDownloadService downloadService
+@inject CatalogSettings catalogSettings
+@if (Model.CheckoutAttributes.Count > 0)
+{
+ var attributeChangeScriptsBuilder = new StringBuilder();
+
+
+ @foreach (var attribute in Model.CheckoutAttributes)
+ {
+ var controlId = $"checkout_attribute_{attribute.Id}";
+ var textPrompt = !string.IsNullOrEmpty(attribute.TextPrompt) ? attribute.TextPrompt : attribute.Name;
+
+
+
+ @if (attribute.IsRequired)
+ {
+ *
+ }
+
+
+
+
+ @switch (attribute.AttributeControlType)
+ {
+ case AttributeControlType.DropdownList:
+ {
+
+ attributeChangeScriptsBuilder.AppendFormat("$('#{0}').on('change', function(){{checkoutAttributeChange();}});\n", controlId);
+ }
+ break;
+ case AttributeControlType.RadioList:
+ {
+
+ }
+ break;
+ case AttributeControlType.Checkboxes:
+ case AttributeControlType.ReadonlyCheckboxes:
+ {
+
+ }
+ break;
+ case AttributeControlType.TextBox:
+ {
+
+ }
+ break;
+ case AttributeControlType.MultilineTextbox:
+ {
+
+ }
+ break;
+ case AttributeControlType.Datepicker:
+ {
+
+ }
+ break;
+ case AttributeControlType.FileUpload:
+ {
+ Download download = null;
+ if (!string.IsNullOrEmpty(attribute.DefaultValue))
+ {
+ download = await downloadService.GetDownloadByGuidAsync(new Guid(attribute.DefaultValue));
+ }
+
+ @* register CSS and JS *@
+
+
+
+ //ex. ['jpg', 'jpeg', 'png', 'gif'] or []
+ var allowedFileExtensions = string.Join(", ", attribute.AllowedFileExtensions.Select(x => "'" + x.Trim() + "'").ToList());
+
+ if (download != null)
+ {
+
+ }
+ else
+ {
+
+ }
+
+ @*fine uploader container*@
+
+ @*fine uploader template (keep it synchronized to \Content\fineuploader\templates\default.html)*@
+
+
+
+
+ }
+ break;
+ case AttributeControlType.ColorSquares:
+ {
+
+
+ }
+ break;
+ case AttributeControlType.ImageSquares:
+ {
+ //not support attribute type
+ }
+ break;
+ }
+
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsOne.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsOne.cshtml
new file mode 100644
index 0000000..7d6a2d8
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsOne.cshtml
@@ -0,0 +1,18 @@
+@{
+ Layout = "_Root";
+}
+@*Home Page Slider*@
+@if (IsSectionDefined("HomePageSlider"))
+{
+ @section HomePageSlider {
+ @RenderSection("HomePageSlider")
+ }
+}
+@await RenderSectionAsync("Breadcrumb", false)
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.MainColumnBefore })
+ @RenderBody()
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.MainColumnAfter })
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsTwo.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsTwo.cshtml
new file mode 100644
index 0000000..cf34d97
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ColumnsTwo.cshtml
@@ -0,0 +1,57 @@
+@{
+ Layout = "_Root";
+}
+@{
+ //current category ID
+ var currentCategoryId = 0;
+ if (Url.ActionContext.RouteData.Values["controller"].ToString().Equals("catalog", StringComparison.InvariantCultureIgnoreCase) &&
+ Url.ActionContext.RouteData.Values["action"].ToString().Equals("category", StringComparison.InvariantCultureIgnoreCase))
+ {
+ currentCategoryId = Convert.ToInt32(Url.ActionContext.RouteData.Values["categoryId"].ToString());
+ }
+
+
+ //current manufacturer ID
+ var currentManufacturerId = 0;
+ if (Url.ActionContext.RouteData.Values["controller"].ToString().Equals("catalog", StringComparison.InvariantCultureIgnoreCase) &&
+ Url.ActionContext.RouteData.Values["action"].ToString().Equals("manufacturer", StringComparison.InvariantCultureIgnoreCase))
+ {
+ currentManufacturerId = Convert.ToInt32(Url.ActionContext.RouteData.Values["manufacturerId"].ToString());
+ }
+
+
+ //current product ID
+ var currentProductId = 0;
+ if (Url.ActionContext.RouteData.Values["controller"].ToString().Equals("product", StringComparison.InvariantCultureIgnoreCase) &&
+ Url.ActionContext.RouteData.Values["action"].ToString().Equals("productdetails", StringComparison.InvariantCultureIgnoreCase))
+ {
+ currentProductId = Convert.ToInt32(Url.ActionContext.RouteData.Values["productId"].ToString());
+ }
+}
+@await RenderSectionAsync("Breadcrumb", false)
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.MainColumnBefore })
+ @RenderBody()
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.MainColumnAfter })
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CreateOrUpdateAddress.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CreateOrUpdateAddress.cshtml
new file mode 100644
index 0000000..b0dc9b1
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_CreateOrUpdateAddress.cshtml
@@ -0,0 +1,235 @@
+@model AddressModel
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_DiscountBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_DiscountBox.cshtml
new file mode 100644
index 0000000..64c9bde
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_DiscountBox.cshtml
@@ -0,0 +1,44 @@
+@model ShoppingCartModel.DiscountBoxModel
+@if (Model.Display)
+{
+
+
+ @T("ShoppingCart.DiscountCouponCode")
+
+
+
+ @T("ShoppingCart.DiscountCouponCode.Tooltip")
+
+
+
+
+
+ @foreach (var message in Model.Messages)
+ {
+
+ @message
+
+ }
+ @foreach (var discount in Model.AppliedDiscountsWithCodes)
+ {
+
+
+ @string.Format(T("ShoppingCart.DiscountCouponCode.CurrentCode").Text, discount.CouponCode)
+ @*empty value (little hack for FormValueExistsAttribute)*@
+
+
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_EstimateShippingPopUp.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_EstimateShippingPopUp.cshtml
new file mode 100644
index 0000000..07f59d7
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_EstimateShippingPopUp.cshtml
@@ -0,0 +1,93 @@
+@model EstimateShippingModel
+
+
+
+
+
+ @T("Shipping.EstimateShippingPopUp.ShipToTitle")
+
+
+
+ @T("Shipping.EstimateShippingPopUp.ChooseShippingTitle")
+
+
+
+
+
@T("Shipping.EstimateShippingPopUp.NoShippingOptions")
+
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Header.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Header.cshtml
new file mode 100644
index 0000000..1f3c78b
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Header.cshtml
@@ -0,0 +1,47 @@
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_JavaScriptDisabledWarning.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_JavaScriptDisabledWarning.cshtml
new file mode 100644
index 0000000..58fc6ae
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_JavaScriptDisabledWarning.cshtml
@@ -0,0 +1,16 @@
+@using Nop.Core.Domain.Common
+@inject CommonSettings CommonSettings
+@if (CommonSettings.DisplayJavaScriptDisabledWarning)
+{
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Notifications.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Notifications.cshtml
new file mode 100644
index 0000000..96ab0ca
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Notifications.cshtml
@@ -0,0 +1,81 @@
+@using Newtonsoft.Json
+@using Nop.Core.Domain.Messages
+@using Nop.Services.Messages
+@inject MessagesSettings messagesSettings
+@{
+ var successMessages = new List();
+ var errorMessages = new List();
+ var warningMessages = new List();
+
+ //Get messages from TempData
+ var notes = TempData.ContainsKey(NopMessageDefaults.NotificationListKey)
+ ? JsonConvert.DeserializeObject>(TempData[NopMessageDefaults.NotificationListKey].ToString())
+ : null;
+
+ if (notes != null)
+ {
+ foreach (var note in notes)
+ {
+ switch (note.Type)
+ {
+ case NotifyType.Success:
+ successMessages.Add(note.Message);
+ break;
+ case NotifyType.Error:
+ errorMessages.Add(note.Message);
+ break;
+ case NotifyType.Warning:
+ warningMessages.Add(note.Message);
+ break;
+
+ }
+ }
+ }
+}
+@if (successMessages.Any() || warningMessages.Any() || errorMessages.Any())
+{
+ if (messagesSettings.UsePopupNotifications)
+ {
+
+ }
+ else
+ {
+
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.Notifications })
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_OrderReviewData.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_OrderReviewData.cshtml
new file mode 100644
index 0000000..f155d54
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_OrderReviewData.cshtml
@@ -0,0 +1,160 @@
+@model ShoppingCartModel.OrderReviewDataModel
+@if (Model.Display)
+{
+
+
+
+
+ @T("Order.BillingAddress")
+
+
+ -
+ @Model.BillingAddress.FirstName @Model.BillingAddress.LastName
+
+ -
+ @T("Order.Email"): @Model.BillingAddress.Email
+
+ @if (Model.BillingAddress.PhoneEnabled)
+ {
+ -
+ @T("Order.Phone"): @Model.BillingAddress.PhoneNumber
+
+ }
+ @if (Model.BillingAddress.FaxEnabled)
+ {
+ -
+ @T("Order.Fax"): @Model.BillingAddress.FaxNumber
+
+ }
+ @if (Model.BillingAddress.CompanyEnabled && !string.IsNullOrEmpty(Model.BillingAddress.Company))
+ {
+ -
+ @Model.BillingAddress.Company
+
+ }
+ @foreach (var item in Model.BillingAddress.AddressFields)
+ {
+ - @item.Value
+ }
+ @if (!string.IsNullOrEmpty(Model.BillingAddress.FormattedCustomAddressAttributes))
+ {
+ -
+ @Html.Raw(Model.BillingAddress.FormattedCustomAddressAttributes)
+
+ }
+ @if (Model.CustomValues != null)
+ {
+ foreach (var item in Model.CustomValues)
+ {
+ -
+
+ @item.Key:
+
+
+ @(item.Value != null ? item.Value.ToString() : "")
+
+
+ }
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryBillingAddress, additionalData = Model })
+
+
+ @if (!string.IsNullOrEmpty(Model.PaymentMethod))
+ {
+
+
+ @T("Order.Payment")
+
+
+ -
+
+ @T("Order.Payment.Method"):
+
+
+ @Model.PaymentMethod
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryPaymentMethodInfo, additionalData = Model })
+
+
+ }
+
+
+ @if (Model.IsShippable)
+ {
+
+
+
+
+ @(Model.SelectedPickupInStore ? T("Order.PickupAddress") : T("Order.ShippingAddress"))
+
+
+
+ @if (!Model.SelectedPickupInStore)
+ {
+ -
+ @Model.ShippingAddress.FirstName @Model.ShippingAddress.LastName
+
+ -
+ @T("Order.Email"): @Model.ShippingAddress.Email
+
+ if (Model.ShippingAddress.PhoneEnabled)
+ {
+ -
+ @T("Order.Phone"): @Model.ShippingAddress.PhoneNumber
+
+ }
+ if (Model.ShippingAddress.FaxEnabled)
+ {
+ -
+ @T("Order.Fax"): @Model.ShippingAddress.FaxNumber
+
+ }
+ if (Model.ShippingAddress.CompanyEnabled && !string.IsNullOrEmpty(Model.ShippingAddress.Company))
+ {
+ -
+ @Model.ShippingAddress.Company
+
+ }
+ @foreach (var item in Model.ShippingAddress.AddressFields)
+ {
+ - @item.Value
+ }
+ if (!string.IsNullOrEmpty(Model.ShippingAddress.FormattedCustomAddressAttributes))
+ {
+ -
+ @Html.Raw(Model.ShippingAddress.FormattedCustomAddressAttributes)
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryShippingAddress, additionalData = Model })
+ }
+ else
+ {
+
+ @foreach (var item in Model.PickupAddress.AddressFields)
+ {
+ - @item.Value
+ }
+ }
+
+
+
+
+ @T("Order.Shipping")
+
+
+ -
+
+ @T("Order.Shipping.Name"):
+
+
+ @Model.ShippingMethod
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.OrderSummaryShippingMethodInfo, additionalData = Model })
+
+
+
+ }
+
+}
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Poll.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Poll.cshtml
new file mode 100644
index 0000000..d08bcfa
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Poll.cshtml
@@ -0,0 +1,76 @@
+@model PollModel
+
+
@Model.Name
+ @if (Model.AlreadyVoted)
+ {
+
+ @foreach (var item in Model.Answers)
+ {
+ -
+ @string.Format(T("Polls.VotesResultLine").Text, item.Name, item.NumberOfVotes, item.PercentOfTotalVotes.ToString("0.0"))
+
+ }
+
+
@string.Format(T("Polls.TotalVotes").Text, Model.TotalVotes)
+ }
+ else
+ {
+
+
+
+ @T("Common.Wait")
+
+
+
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Print.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Print.cshtml
new file mode 100644
index 0000000..bfcda1b
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Print.cshtml
@@ -0,0 +1,36 @@
+@inject Nop.Core.Domain.Common.CommonSettings commonSettings
+@inject IThemeContext themeContext
+@{
+ var themeName = await themeContext.GetWorkingThemeNameAsync();
+ var title = await NopHtml.GenerateTitleAsync();
+}
+
+
+
+ @title
+
+
+
+ @NopHtml.GenerateCssFiles()
+ @NopHtml.GenerateScripts(ResourceLocation.Head)
+ @NopHtml.GenerateInlineScripts(ResourceLocation.Head)
+
+
+ @RenderBody()
+
+
+
+ @* when jQuery migrate script logging is active you will see the log in the browser console *@
+ @if (commonSettings.JqueryMigrateScriptLoggingActive)
+ {
+
+ }
+ else
+ {
+
+ }
+
+ @NopHtml.GenerateScripts(ResourceLocation.Footer)
+ @NopHtml.GenerateInlineScripts(ResourceLocation.Footer)
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ProductBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ProductBox.cshtml
new file mode 100644
index 0000000..0387947
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_ProductBox.cshtml
@@ -0,0 +1,142 @@
+@model ProductOverviewModel
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Orders
+@using Nop.Core.Domain.Tax
+@inject CatalogSettings catalogSettings
+@inject IWorkContext workContext
+@{
+ //prepare "Add to cart" AJAX link
+ var addtocartlink = "";
+ var shoppingCartTypeId = (int)ShoppingCartType.ShoppingCart;
+ var quantity = 1;
+ if (Model.ProductPrice.ForceRedirectionAfterAddingToCart)
+ {
+ addtocartlink = Url.RouteUrl("AddProductToCart-Catalog", new { productId = Model.Id, shoppingCartTypeId = shoppingCartTypeId, quantity = quantity, forceredirection = Model.ProductPrice.ForceRedirectionAfterAddingToCart });
+ }
+ else
+ {
+ addtocartlink = Url.RouteUrl("AddProductToCart-Catalog", new { productId = Model.Id, shoppingCartTypeId = shoppingCartTypeId, quantity = quantity });
+ }
+
+ var addtowishlistlink = Url.RouteUrl("AddProductToCart-Catalog", new { productId = Model.Id, shoppingCartTypeId = (int)ShoppingCartType.Wishlist, quantity = quantity });
+ var addtocomparelink = Url.RouteUrl("AddProductToCompare", new { productId = Model.Id });
+}
+
+
+ @if (Model.PictureModels.Count > 1)
+ {
+
+
+ @foreach (var picture in Model.PictureModels)
+ {
+
+
+
+ }
+
+
+
+
+
+
+ }
+ else
+ {
+ var picture = Model.PictureModels.FirstOrDefault();
+
+
+
+ }
+
+ @if (!Model.ProductPrice.DisableWishlistButton)
+ {
+
+ }
+ @if (!Model.ProductPrice.DisableAddToCompareListButton)
+ {
+
+ }
+
+
+
+
+
+ @if (catalogSettings.ShowSkuOnCatalogPages && !string.IsNullOrEmpty(Model.Sku))
+ {
+
+ @Model.Sku
+
+ }
+
+ @if (!string.IsNullOrEmpty(Model.ProductPrice.OldPrice))
+ {
+
@Model.ProductPrice.OldPrice
+ }
+
@Model.ProductPrice.Price
+ @if (Model.ProductPrice.DisplayTaxShippingInfo)
+ {
+ var inclTax = await workContext.GetTaxDisplayTypeAsync() == TaxDisplayType.IncludingTax;
+ //tax info is already included in the price (incl/excl tax). that's why we display only shipping info here
+ //of course, you can modify appropriate locales to include VAT info there
+
+ @T(inclTax ? "Products.Price.TaxShipping.InclTax" : "Products.Price.TaxShipping.ExclTax", Url.RouteTopicUrl("shippinginfo"))
+
+ }
+ @if (!string.IsNullOrEmpty(Model.ProductPrice.BasePricePAngV))
+ {
+
+ @Model.ProductPrice.BasePricePAngV
+
+ }
+
+ @if (Model.ReviewOverviewModel.AllowCustomerReviews)
+ {
+ int ratingPercent = 0;
+ if (Model.ReviewOverviewModel.TotalReviews != 0)
+ {
+ ratingPercent = ((Model.ReviewOverviewModel.RatingSum * 100) / Model.ReviewOverviewModel.TotalReviews) / 5;
+ }
+
+ }
+
+ @Html.Raw(Model.ShortDescription)
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductBoxAddinfoBefore, additionalData = Model })
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductBoxAddinfoMiddle, additionalData = Model })
+
+ @if (!Model.ProductPrice.DisableBuyButton)
+ {
+ var addToCartText = T("ShoppingCart.AddToCart").Text;
+ if (Model.ProductPrice.IsRental)
+ {
+ addToCartText = T("ShoppingCart.Rent").Text;
+ }
+ if (Model.ProductPrice.AvailableForPreOrder)
+ {
+ addToCartText = T("ShoppingCart.PreOrder").Text;
+ }
+
+ }
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductBoxAddinfoAfter, additionalData = Model })
+
+
+
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.Head.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.Head.cshtml
new file mode 100644
index 0000000..f14ec24
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.Head.cshtml
@@ -0,0 +1,109 @@
+@using Nop.Core.Configuration
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Common
+@using Nop.Core.Domain.Seo
+@using Nop.Services.Security
+@using Nop.Core.Events
+@inject CatalogSettings catalogSettings
+@inject CommonSettings commonSettings
+@inject IEventPublisher eventPublisher
+@inject IPermissionService permissionService
+@inject SeoSettings seoSettings
+@inject AppSettings appSettings
+@using Nop.Core
+@inject IWorkContext workContext
+@{
+ var supportRtl = (await workContext.GetWorkingLanguageAsync()).Rtl;
+
+ if (supportRtl)
+ {
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/simplex.rtl.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/bootstrap.min.rtl.js");
+ }
+ else
+ {
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/simplex.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/bootstrap.min.js");
+ }
+
+ if (catalogSettings.DisplayAllPicturesOnCatalogPages)
+ {
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/swiper/swiper-bundle.min.js");
+ }
+
+ //resources
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/owl.carousel.min.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/Themes/SimplexTheme/Content/js/head.min.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/js/public.countryselect.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/js/public.ajaxcart.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/js/public.common.js");
+ //when jQuery migrate script logging is active you will see the log in the browser console
+ if (commonSettings.JqueryMigrateScriptLoggingActive)
+ {
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery-migrate/jquery-migrate.js");
+ }
+ else
+ {
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery-migrate/jquery-migrate.min.js");
+ }
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery-ui-dist/jquery-ui.min.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery-validation/jquery.validate.min.js");
+ NopHtml.AppendScriptParts(ResourceLocation.Footer, "~/lib_npm/jquery/jquery.min.js");
+
+ //custom tag(s);
+ if (!string.IsNullOrEmpty(seoSettings.CustomHeadTags))
+ {
+ NopHtml.AppendHeadCustomParts(seoSettings.CustomHeadTags);
+ }
+ //event
+ await eventPublisher.PublishAsync(new PageRenderingEvent(NopHtml));
+
+ var title = await NopHtml.GenerateTitleAsync();
+ var description = await @NopHtml.GenerateMetaDescriptionAsync();
+ var keywords = await NopHtml.GenerateMetaKeywordsAsync();
+
+}
+
+
+
+ @title
+
+
+
+
+
+
+
+ @NopHtml.GenerateHeadCustom()
+ @*This is used so that themes can inject content into the header*@
+ @await Html.PartialAsync("Head")
+ @NopHtml.GenerateCssFiles()
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HeadHtmlTag })
+ @NopHtml.GenerateCanonicalUrls()
+ @await Component.InvokeAsync(typeof(NewsRssHeaderLinkViewComponent))
+ @await Component.InvokeAsync(typeof(BlogRssHeaderLinkViewComponent))
+ @*Insert favicon and app icons head code*@
+ @await Component.InvokeAsync(typeof(FaviconViewComponent))
+ @NopHtml.GenerateScripts(ResourceLocation.Head)
+ @NopHtml.GenerateInlineScripts(ResourceLocation.Head)
+
+
+
+
+ @Html.Raw(commonSettings.HeaderCustomHtml)
+
+
+
+
+ @RenderBody()
+
+ @NopHtml.GenerateScripts(ResourceLocation.Footer)
+ @NopHtml.GenerateInlineScripts(ResourceLocation.Footer)
+ @Html.Raw(commonSettings.FooterCustomHtml)
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.cshtml
new file mode 100644
index 0000000..d786378
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_Root.cshtml
@@ -0,0 +1,61 @@
+@{
+ Layout = "_Root.Head";
+}
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.BodyStartHtmlTagAfter })
+@{ await Html.RenderPartialAsync("_Notifications"); }
+@{ await Html.RenderPartialAsync("_JavaScriptDisabledWarning"); }
+
+
+ @{ await Html.RenderPartialAsync("_Header"); }
+
+
+
+ @*Home PAge Slider*@
+ @if (IsSectionDefined("HomePageSlider"))
+ {
+ @RenderSection("HomePageSlider")
+ }
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ContentBefore })
+
+
+ @*ajax loading window*@
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ContentAfter })
+
+ @await Component.InvokeAsync(typeof(FooterViewComponent))
+ @* Use this content for back to top page scrolling *@
+
+
+@await Component.InvokeAsync(typeof(EuCookieLawViewComponent))
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.BodyEndHtmlTagBefore })
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_SubCategoryLine.TopMenu.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_SubCategoryLine.TopMenu.cshtml
new file mode 100644
index 0000000..a519b42
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Shared/_SubCategoryLine.TopMenu.cshtml
@@ -0,0 +1,21 @@
+@model Nop.Web.Models.Catalog.CategorySimpleModel
+
+
+
+ @Model.Name
+
+ @if (Model.NumberOfProducts.HasValue)
+ {
+ @T("Categories.TotalProducts", Model.NumberOfProducts.Value)
+ }
+
+
+ @{
+
+ }
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Cart.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Cart.cshtml
new file mode 100644
index 0000000..5b0f06a
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Cart.cshtml
@@ -0,0 +1,21 @@
+@model ShoppingCartModel
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.ShoppingCart").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-shopping-cart-page");
+}
+@if (!Model.OnePageCheckoutEnabled)
+{
+ @await Component.InvokeAsync(typeof(CheckoutProgressViewComponent), new {step = CheckoutProgressStep.Cart})
+}
+
+
+
@T("ShoppingCart")
+
+
+ @await Component.InvokeAsync(typeof(OrderSummaryViewComponent), new { overriddenModel = Model})
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/EmailWishlist.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/EmailWishlist.cshtml
new file mode 100644
index 0000000..c14bd4e
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/EmailWishlist.cshtml
@@ -0,0 +1,75 @@
+@model WishlistEmailAFriendModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.WishlistEmailAFriend").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-email-a-friend-page");
+}
+
+
+
@T("Wishlist.EmailAFriend.Title")
+
+
+ @if (Model.SuccessfullySent)
+ {
+
+ @Model.Result
+
+ }
+ else
+ {
+
+ }
+
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Wishlist.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Wishlist.cshtml
new file mode 100644
index 0000000..a671d86
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/Wishlist.cshtml
@@ -0,0 +1,423 @@
+@model WishlistModel
+@using Nop.Core
+@using Nop.Core.Domain.Catalog
+@using Nop.Core.Domain.Media
+@using Nop.Core.Domain.Tax
+@inject IWebHelper webHelper
+@inject IWorkContext workContext
+@inject MediaSettings mediaSettings
+@{
+ Layout = "_ColumnsOne";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Wishlist").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-wishlist-page");
+}
+
+
+
+ @if (Model.IsEditable)
+ {
+ @T("Wishlist")
+ }
+ else
+ {
+ @string.Format(T("Wishlist.WishlistOf").Text, Model.CustomerFullname);
+ }
+
+
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.WishlistTop, additionalData = Model })
+
+ @if (Model.Items.Count > 0)
+ {
+ if (Model.Warnings.Count > 0)
+ {
+
+
+ @foreach (var warning in Model.Warnings)
+ {
+
@warning
+ }
+
+
+ }
+
+ }
+ else
+ {
+
+ @T("Wishlist.CartIsEmpty")
+
+ }
+
+ @if (Model.IsEditable && Model.Items.Count > 0)
+ {
+ var wishlistUrl = Url.RouteUrl("Wishlist", new { customerGuid = Model.CustomerGuid }, webHelper.GetCurrentRequestProtocol());
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.WishlistBottom, additionalData = Model })
+
+
+@*JavaScript for mobile and desktop resize*@
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/_GiftCardBox.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/_GiftCardBox.cshtml
new file mode 100644
index 0000000..897a213
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/ShoppingCart/_GiftCardBox.cshtml
@@ -0,0 +1,32 @@
+@model ShoppingCartModel.GiftCardBoxModel
+@if (Model.Display)
+{
+
+
+ @T("ShoppingCart.GiftCardCouponCode")
+
+
+
@T("ShoppingCart.GiftCardCouponCode.Tooltip")
+
+
+
+
+ @if (!string.IsNullOrEmpty(Model.Message))
+ {
+
+ @Model.Message
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Topic/TopicDetails.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Topic/TopicDetails.cshtml
new file mode 100644
index 0000000..2cae173
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Topic/TopicDetails.cshtml
@@ -0,0 +1,105 @@
+@model TopicModel
+
+@using Nop.Core
+@using Nop.Core.Domain.Seo
+@using Nop.Core.Domain.Topics
+
+@inject IWebHelper webHelper
+@inject SeoSettings seoSettings
+
+@{
+ var isPopup = ViewBag.IsPopup ?? false;
+ if (!isPopup)
+ {
+ Layout = "_ColumnsOne";
+ }
+
+ if (!Model.IsPasswordProtected)
+ {
+ //title
+ NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Title);
+ //meta
+ NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
+ NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
+ }
+
+ if (seoSettings.CanonicalUrlsEnabled)
+ {
+ var topicUrl = Url.RouteUrl(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
+ NopHtml.AddCanonicalUrlParts(topicUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
+ }
+
+ //page class
+ NopHtml.AppendPageCssClassParts("html-topic-page");
+}
+@if (Model.IsPasswordProtected)
+{
+
+
+
+
+}
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerTopicDetailsTop, additionalData = Model })
+
+
+ @Html.Raw(Model.Body)
+
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CustomerTopicDetailsBottom, additionalData = Model })
+
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/ApplyVendor.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/ApplyVendor.cshtml
new file mode 100644
index 0000000..7ebb5d9
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/ApplyVendor.cshtml
@@ -0,0 +1,127 @@
+@model ApplyVendorModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.Vendors.Apply").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-apply-vendor-page");
+}
+
+
+
@T("PageTitle.Vendors.Apply")
+
+
+ @await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "ApplyVendor" })
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ApplyVendorTop, additionalData = Model })
+ @if (Model.DisableFormInput)
+ {
+
+ @Model.Result
+
+ }
+ else
+ {
+
+ }
+ @await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ApplyVendorBottom, additionalData = Model })
+
+
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/Info.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/Info.cshtml
new file mode 100644
index 0000000..5177f6c
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/Info.cshtml
@@ -0,0 +1,87 @@
+@model VendorInfoModel
+@{
+ Layout = "_ColumnsTwo";
+
+ //title
+ NopHtml.AddTitleParts(T("PageTitle.VendorInfo").Text);
+ //page class
+ NopHtml.AppendPageCssClassParts("html-account-page");
+ NopHtml.AppendPageCssClassParts("html-vendorinfo-page");
+}
+@section left
+{
+ @await Component.InvokeAsync(typeof(CustomerNavigationViewComponent), new { selectedTabId = CustomerNavigationEnum.VendorInfo })
+}
+
+@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.VendorInfoBottom, additionalData = Model })
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/_VendorAttributes.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/_VendorAttributes.cshtml
new file mode 100644
index 0000000..2c52b27
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/Vendor/_VendorAttributes.cshtml
@@ -0,0 +1,88 @@
+@model IList
+
+@using Nop.Core.Domain.Catalog;
+@using Nop.Services.Vendors
+@foreach (var attribute in Model)
+{
+ var controlId = $"{NopVendorDefaults.VendorAttributePrefix}{attribute.Id}";
+ var textPrompt = attribute.Name;
+
+
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewImports.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewImports.cshtml
new file mode 100644
index 0000000..5a9dc54
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewImports.cshtml
@@ -0,0 +1,43 @@
+@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage
+@inject INopHtmlHelper NopHtml
+
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@*we remove the default InputTagHelper to prevent the checkbox duplicating: https://stackoverflow.com/questions/42544961/asp-net-core-custom-input-tag-helper-rendering-duplicate-checkboxes*@
+@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
+@addTagHelper *, Nop.Web.Framework
+
+@using System.Globalization;
+@using System.Text.Encodings.Web
+@using Microsoft.AspNetCore.Mvc.ViewFeatures
+@using Microsoft.Extensions.Primitives
+@using static Nop.Services.Common.NopLinksDefaults
+@using Nop.Web.Components
+@using Nop.Web.Extensions
+@using Nop.Web.Framework
+@using Nop.Web.Framework.Events
+@using Nop.Web.Framework.Extensions
+@using Nop.Web.Framework.Infrastructure
+@using Nop.Web.Framework.Models
+@using Nop.Web.Framework.Models.Cms
+@using Nop.Web.Framework.Mvc.Routing
+@using Nop.Web.Framework.Security.Captcha
+@using Nop.Web.Framework.Security.Honeypot
+@using Nop.Web.Framework.Themes
+@using Nop.Web.Framework.UI
+@using Nop.Web.Models.Blogs
+@using Nop.Web.Models.Boards
+@using Nop.Web.Models.Catalog
+@using Nop.Web.Models.Checkout
+@using Nop.Web.Models.Common
+@using Nop.Web.Models.Customer
+@using Nop.Web.Models.Media
+@using Nop.Web.Models.News
+@using Nop.Web.Models.Newsletter
+@using Nop.Web.Models.Order
+@using Nop.Web.Models.Polls
+@using Nop.Web.Models.PrivateMessages
+@using Nop.Web.Models.Profile
+@using Nop.Web.Models.ShoppingCart
+@using Nop.Web.Models.Sitemap
+@using Nop.Web.Models.Topics
+@using Nop.Web.Models.Vendors
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewStart.cshtml b/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewStart.cshtml
new file mode 100644
index 0000000..adce9b1
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/Views/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "_ColumnsOne";
+}
\ No newline at end of file
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/nopAccelerate-Simplex-Theme.png b/Presentation/Nop.Web/Themes/SimplexTheme/nopAccelerate-Simplex-Theme.png
new file mode 100644
index 0000000..645be62
Binary files /dev/null and b/Presentation/Nop.Web/Themes/SimplexTheme/nopAccelerate-Simplex-Theme.png differ
diff --git a/Presentation/Nop.Web/Themes/SimplexTheme/theme.json b/Presentation/Nop.Web/Themes/SimplexTheme/theme.json
new file mode 100644
index 0000000..924f52d
--- /dev/null
+++ b/Presentation/Nop.Web/Themes/SimplexTheme/theme.json
@@ -0,0 +1,7 @@
+{
+ "SystemName": "SimplexTheme",
+ "FriendlyName": "Simplex Theme",
+ "SupportRTL": false,
+ "PreviewImageUrl": "~/Themes/SimplexTheme/nopAccelerate-Simplex-Theme.png",
+ "PreviewText": "Simplex Theme is simple and elegant theme which gives modern look and feel to your nopCommerce store front. Built on the top of Bootstrap using latest HTML5 and CSS3 Techniques."
+}
\ No newline at end of file