Error compiling template "Designs/Swift-v2/Swift-v2_CartSummary.cshtml"
Line 1: An assembly with the same simple name 'Dynamicweb.LoadBalancing' has already been imported. Try removing one of the references (e.g. 'F:\Domains\Sites\dev-jayco.mydwsite3.com\Application\bin\Dynamicweb.LoadBalancing.dll') or sign them to enable side-by-side.
Line 601: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 30: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 31: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 32: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 34: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 87: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 91: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 92: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 93: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 94: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 95: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 96: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
Line 97: The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.
1 // <auto-generated/>
2 #pragma warning disable 1591
3 namespace CompiledRazorTemplates.Dynamic
4 {
5 #line hidden
6 using System.Threading.Tasks;
7 using System;
8 using System.Collections.Generic;
9 using System.Linq;
10 using Dynamicweb.Frontend;
11 using Dynamicweb.Core;
12 using Dynamicweb.Ecommerce.Frontend;
13 using Dynamicweb.Ecommerce.ProductCatalog;
14 using System.Globalization;
15 internal class RazorEngine_0ff133732a9c498a852d93689cf7d9d0 : Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
16 {
17 #pragma warning disable 1998
18 public async override global::System.Threading.Tasks.Task ExecuteAsync()
19 {
20 WriteLiteral("\r\n");
21 WriteLiteral("\r\n");
22
23 string iconPath = "/Files/Images/Icons/";
24 bool anonymousUser = Pageview.User == null;
25 var cartServicePageId = GetPageIdByNavigationTag("CartService");
26 var cartSummaryPageId = GetPageIdByNavigationTag("CartSummary");
27 var cartType = Dynamicweb.Context.Current?.Request["CartType"];
28 var requestPageId = Dynamicweb.Context.Current?.Request["RequestPageID"];
29 var orderContext = Dynamicweb.Context.Current?.Request["OrderContext"];
30 string? orderContextQueryString = string.IsNullOrEmpty(orderContext) ? string.Empty : $"?OrderContext={orderContext}";
31 string? cartUrl = Model.Item?.GetLink("CartPageLink")?.Url;
32 string? checkoutUrl = Dynamicweb.Context.Current?.Request["checkoutUrl"];
33 checkoutUrl = string.IsNullOrEmpty(checkoutUrl) ? (!anonymousUser ? Model.Item?.GetLink("CheckoutSignedInPageLink")?.Url : Model.Item?.GetLink("CheckoutAnonymousPageLink")?.Url) : checkoutUrl;
34 string? quoteCheckoutPageId = Dynamicweb.Context.Current?.Request["quoteCheckoutPageLink"];
35 quoteCheckoutPageId = string.IsNullOrEmpty(quoteCheckoutPageId) ? Model.Item?.GetLink("QuoteCheckoutPageLink")?.PageId.ToString() : quoteCheckoutPageId;
36 var order = Dynamicweb.Ecommerce.Services.Orders.GetById(Model.Cart?.ID);
37 bool isMiniCart = cartType == "minicart";
38 WriteLiteral("\r\n");
39 if (isMiniCart)
40 {
41 WriteLiteral("\t<div class=\"modal-header sticky-top justify-content-between py-1 py-lg-3 ps-3 ps-lg-4 pe-0 pe-lg-3 bg-body\" style=\"box-shadow: 0 10px 10px -12px var(--bs-gray-300);\">\r\n\t\t<span class=\"h5 m-0\">");
42 Write(Translate("Your cart"));
43 WriteLiteral("</span>\r\n\r\n\t\t<button type=\"button\" class=\"btn btn-sm p-2 d-flex align-items-center\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\" id=\"CloseMiniCart\">\r\n\t\t\t<span>");
44 Write(Translate("Close"));
45 WriteLiteral("</span>\r\n\t\t\t<span class=\"icon-3\">\r\n\t\t\t\t");
46 Write(ReadFile(iconPath + "xmark.svg"));
47 WriteLiteral("\r\n\t\t\t</span>\r\n\t\t</button>\r\n\t</div>\r\n");
48 }
49 WriteLiteral("\r\n<div");
50 BeginWriteAttribute("class", " class=\"", 2234, "\"", 2322, 3);
51 WriteAttributeValue("", 2242, "item_", 2242, 5, true);
52 WriteAttributeValue("", 2247, Model.Item?.SystemName.ToLower(), 2247, 33, false);
53 WriteAttributeValue(" ", 2280, isMiniCart ? "p-3 p-lg-4 h-100" : null, 2281, 41, false);
54 EndWriteAttribute();
55 WriteLiteral(">\r\n");
56 if (Model.Cart?.TotalProductsCount > 0)
57 {
58 if (!isMiniCart)
59 {
60 WriteLiteral(@" <button class=""toggle-order-summary btn text-reset w-100 d-block d-lg-none px-0"" type=""button"" data-bs-toggle=""collapse"" data-bs-target=""#CartSummary"" aria-expanded=""false"" aria-controls=""CartSummary"">
61 <div class=""d-flex align-items-center justify-content-between"">
62 <span class=""d-flex align-items-center"">
63 <span class=""fs-7 lh-1""><span class=""toggle-order-summary-text""></span> ");
64 Write(Translate("order summary"));
65 WriteLiteral("</span>\r\n\t\t\t\t\t\t<span class=\"icon-2 ms-2\">\r\n\t\t\t\t\t\t\t");
66 Write(ReadFile(iconPath + "chevron-down.svg"));
67 WriteLiteral("\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class=\"fw-bold\">\r\n\t\t\t\t\t\t<span class=\"text-price\">");
68 Write(Model.Cart.TotalPrice.Price.Formatted);
69 WriteLiteral("</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t</button>\r\n");
70 WriteLiteral("\t\t\t<style>\r\n\t\t\t\t.toggle-order-summary .toggle-order-summary-text::after {\r\n\t\t\t\t\tcontent: \"");
71 Write(Translate("Show"));
72 WriteLiteral("\";\r\n\t\t\t\t}\r\n\t\t\t\t.toggle-order-summary[aria-expanded=\"true\"] .toggle-order-summary-text::after {\r\n\t\t\t\t\tcontent: \"");
73 Write(Translate("Hide"));
74 WriteLiteral("\";\r\n\t\t\t\t}\r\n\t\t\t\t.toggle-order-summary[ aria-expanded=\"true\" ] svg {\r\n\t\t\t\t\ttransform: rotate(-180deg);\r\n\t\t\t\t}\r\n\t\t\t</style>\r\n");
75 }
76
77 WriteLiteral("\t\t<div");
78 BeginWriteAttribute("class", " class=\"", 3467, "\"", 3565, 3);
79 WriteAttributeValue("", 3475, !isMiniCart ? "d-lg-block h-lg-auto collapse" : "d-flex flex-column h-100", 3475, 77, false);
80 WriteAttributeValue(" ", 3552, "pt-2", 3553, 5, true);
81 WriteAttributeValue(" ", 3557, "pt-lg-0", 3558, 8, true);
82 EndWriteAttribute();
83 WriteLiteral(" id=\"CartSummary\">\r\n\t\t\t<div class=\"d-flex flex-column gap-4 pb-4\">\r\n");
84 foreach (var orderline in Model.Cart.CartOrderlines.Reverse())
85 {
86 var product = orderline?.GetProduct() ?? null;
87 string? name = orderline?.ProductName;
88 string image = product?.DefaultImage?.Value ?? string.Empty;
89 string imagePath = $"/Admin/Public/GetImage.ashx?image={image}&width=80&height=80&crop=5&fillcanvas=true&Background=ffffff&format=webp";
90 imagePath = !string.IsNullOrWhiteSpace(image) && !image.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? imagePath : image;
91 string? priceTotalWithDiscounts = orderline?.TotalPriceWithProductDiscounts.Price.Formatted;
92 string? priceBefore = orderline?.UnitPriceBeforeDiscount.Price.Formatted;
93 string? unitPrice = orderline?.UnitPrice.Price.Formatted;
94 string? discountPrice = orderline?.UnitPriceWithProductDiscount.Price.Formatted;
95 string? discountTotal = orderline?.TotalDiscount.Price.Formatted;
96 string? variantText = orderline?.ProductVariantText;
97 string? unitName = orderline?.UnitName;
98 var orderlineId = orderline?.ID;
99 var quantity = Math.Round(orderline.Quantity, 2);
100 double? stepQty = product?.PurchaseQuantityStep > 0 ? product.PurchaseQuantityStep : 1;
101 double? minQty = product?.PurchaseMinimumQuantity > 0 ? product.PurchaseMinimumQuantity : 1;
102 double? maxQty = null;
103 if (product?.ProductType == Dynamicweb.Ecommerce.Products.ProductType.Stock && !product.NeverOutOfstock)
104 {
105 maxQty = product.StockLevel;
106 }
107 string link = product?.GetProductLink(GetPageIdByNavigationTag("Shop"), false) ?? string.Empty;
108 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.ProductID) || !string.IsNullOrEmpty(orderline.ProductNumber); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber
109 bool isProduct = orderline.IsProduct || (orderline.IsDiscount && isProductIdOrNumber);
110
111 if (isProduct)
112 {
113 WriteLiteral("\t\t\t\t\t\t<article class=\"grid grid-12\">\r\n\r\n\t\t\t\t\t\t\t<div class=\"g-col-2\">\r\n\t\t\t\t\t\t\t\t<a");
114 BeginWriteAttribute("href", " href=\"", 5686, "\"", 5698, 1);
115 WriteAttributeValue("", 5693, link, 5693, 5, false);
116 EndWriteAttribute();
117 WriteLiteral(" class=\"ratio ratio-1x1 d-block \"");
118 BeginWriteAttribute("title", " title=\"", 5732, "\"", 5745, 1);
119 WriteAttributeValue("", 5740, name, 5740, 5, false);
120 EndWriteAttribute();
121 WriteLiteral(" tabindex=\"-1\">\r\n\t\t\t\t\t\t\t\t\t<img");
122 BeginWriteAttribute("src", " src=\"", 5776, "\"", 5792, 1);
123 WriteAttributeValue("", 5782, imagePath, 5782, 10, false);
124 EndWriteAttribute();
125 WriteLiteral(" style=\"object-fit: contain;\"");
126 BeginWriteAttribute("alt", " alt=\"", 5822, "\"", 5833, 1);
127 WriteAttributeValue("", 5828, name, 5828, 5, false);
128 EndWriteAttribute();
129 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"g-col-6\">\r\n\r\n\t\t\t\t\t\t\t\t<div class=\"d-flex flex-column gap-1\">\r\n");
130 WriteLiteral("\t\t\t\t\t\t\t\t\t<h3 class=\"h6 fs-7 m-0\">\r\n\t\t\t\t\t\t\t\t\t\t<a");
131 BeginWriteAttribute("href", " href=\"", 6017, "\"", 6029, 1);
132 WriteAttributeValue("", 6024, link, 6024, 5, false);
133 EndWriteAttribute();
134 WriteLiteral(" class=\"text-decoration-none\"");
135 BeginWriteAttribute("title", " title=\"", 6059, "\"", 6072, 1);
136 WriteAttributeValue("", 6067, name, 6067, 5, false);
137 EndWriteAttribute();
138 WriteLiteral(" tabindex=\"-1\">");
139 Write(name);
140 WriteLiteral("</a>\r\n\t\t\t\t\t\t\t\t\t</h3>\r\n\r\n");
141 if (!string.IsNullOrEmpty(variantText))
142 {
143 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<p class=\"fs-8 m-0\">");
144 Write(variantText);
145 WriteLiteral("</p>\r\n");
146 }
147 WriteLiteral("\r\n");
148 if (orderline.IsDiscount)
149 {
150 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<p class=\"fs-8 m-0\">");
151 Write(Translate("Free product"));
152 WriteLiteral("</p>\r\n");
153 }
154 else
155 {
156 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<p class=\"fs-8 m-0\">\r\n");
157 if (!string.IsNullOrEmpty(unitName))
158 {
159 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\t<span>");
160 Write(unitName);
161 WriteLiteral(": </span>\r\n");
162 }
163 if (discountPrice == unitPrice)
164
165 {
166 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
167 Write(unitPrice);
168 WriteLiteral("</span>\t\r\n");
169 }
170 else
171 {
172 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
173 Write(discountPrice);
174 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-decoration-line-through\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
175 Write(unitPrice);
176 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n");
177 }
178 WriteLiteral("\t\t\t\t\t\t\t\t\t\t</p>\r\n");
179 }
180 WriteLiteral("\r\n");
181 if (isMiniCart && !orderline.IsDiscount)
182 {
183 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<form method=\"post\" autocomplete=\"off\"");
184 BeginWriteAttribute("action", " action=\"", 7169, "\"", 7212, 2);
185 WriteAttributeValue("", 7178, "Default.aspx?ID=", 7178, 16, true);
186 WriteAttributeValue("", 7194, cartServicePageId, 7194, 18, false);
187 EndWriteAttribute();
188 WriteLiteral(" data-response-target-element=\"CartSummary\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"requestPageId\"");
189 BeginWriteAttribute("value", " value=\"", 7311, "\"", 7333, 1);
190 WriteAttributeValue("", 7319, requestPageId, 7319, 14, false);
191 EndWriteAttribute();
192 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"redirect\" value=\"false\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"OrderContext\"");
193 BeginWriteAttribute("value", " value=\"", 7452, "\"", 7473, 1);
194 WriteAttributeValue("", 7460, orderContext, 7460, 13, false);
195 EndWriteAttribute();
196 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"cartcmd\" value=\"updateorderlines\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"checkoutUrl\"");
197 BeginWriteAttribute("value", " value=\"", 7601, "\"", 7621, 1);
198 WriteAttributeValue("", 7609, checkoutUrl, 7609, 12, false);
199 EndWriteAttribute();
200 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"key\"");
201 BeginWriteAttribute("value", " value=\"", 7667, "\"", 7688, 1);
202 WriteAttributeValue("", 7675, orderline.ID, 7675, 13, false);
203 EndWriteAttribute();
204 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"CartType\"");
205 BeginWriteAttribute("value", " value=\"", 7739, "\"", 7756, 1);
206 WriteAttributeValue("", 7747, cartType, 7747, 9, false);
207 EndWriteAttribute();
208 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"submit\" class=\"d-none\" onclick=\"event.preventDefault();\"> ");
209 WriteLiteral("\r\n\r\n");
210
211 var orderlineViewModel = new Dynamicweb.Ecommerce.Frontend.OrderLineViewModel(){
212 Id = orderlineId,
213 ProductId = orderline.ProductID,
214 ProductVariantId = orderline.ProductVariantID,
215 UnitId = orderline.UnitId,
216 Quantity = quantity
217 };
218
219 Write(RenderPartial("Components/QuantitySelectorOrderline.cshtml", orderlineViewModel));
220 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t</form>\r\n");
221 }
222 else {
223 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<span class=\"fs-8 d-block\">");
224 Write(Translate("Qty"));
225 WriteLiteral(": ");
226 Write(quantity);
227 WriteLiteral("</span>\r\n");
228 }
229 WriteLiteral("\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"g-col-4\">\r\n\r\n\t\t\t\t\t\t\t\t<div class=\"d-flex flex-column gap-1 text-end h-100\">\r\n\r\n");
230 if (isMiniCart && !orderline.IsDiscount)
231 {
232 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<form class=\"d-flex justify-content-end\"");
233 BeginWriteAttribute("action", " action=\"", 8732, "\"", 8775, 2);
234 WriteAttributeValue("", 8741, "Default.aspx?ID=", 8741, 16, true);
235 WriteAttributeValue("", 8757, cartServicePageId, 8757, 18, false);
236 EndWriteAttribute();
237 WriteLiteral(" method=\"post\" data-layout-template=\"Swift-v2_CartSummary.cshtml\" data-response-target-element=");
238 Write(isMiniCart ? "DynamicOffcanvas" : "CartSummaryContainer");
239 WriteLiteral(" data-preloader=\"inline\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"requestPageId\"");
240 BeginWriteAttribute("value", " value=\"", 9009, "\"", 9031, 1);
241 WriteAttributeValue("", 9017, requestPageId, 9017, 14, false);
242 EndWriteAttribute();
243 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"redirect\" value=\"false\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"OrderContext\"");
244 BeginWriteAttribute("value", " value=\"", 9150, "\"", 9171, 1);
245 WriteAttributeValue("", 9158, orderContext, 9158, 13, false);
246 EndWriteAttribute();
247 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"cartcmd\" value=\"DelOrderLine\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"checkoutUrl\"");
248 BeginWriteAttribute("value", " value=\"", 9295, "\"", 9315, 1);
249 WriteAttributeValue("", 9303, checkoutUrl, 9303, 12, false);
250 EndWriteAttribute();
251 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"key\"");
252 BeginWriteAttribute("value", " value=\"", 9361, "\"", 9382, 1);
253 WriteAttributeValue("", 9369, orderline.ID, 9369, 13, false);
254 EndWriteAttribute();
255 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"CartType\"");
256 BeginWriteAttribute("value", " value=\"", 9433, "\"", 9450, 1);
257 WriteAttributeValue("", 9441, cartType, 9441, 9, false);
258 EndWriteAttribute();
259 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-link btn-sm lh-1 p-0 m-0 fs-8 opacity-50\" onclick=\"swift.Cart.Update(this);\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t");
260 Write(Translate("Remove"));
261 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</form>\r\n");
262 }
263 else if (!orderline.IsDiscount)
264 {
265 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<form class=\"d-flex justify-content-end\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"requestPageId\"");
266 BeginWriteAttribute("value", " value=\"", 9827, "\"", 9849, 1);
267 WriteAttributeValue("", 9835, requestPageId, 9835, 14, false);
268 EndWriteAttribute();
269 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"redirect\" value=\"false\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"OrderContext\"");
270 BeginWriteAttribute("value", " value=\"", 9968, "\"", 9989, 1);
271 WriteAttributeValue("", 9976, orderContext, 9976, 13, false);
272 EndWriteAttribute();
273 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"cartcmd\" value=\"DelOrderLine\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"checkoutUrl\"");
274 BeginWriteAttribute("value", " value=\"", 10113, "\"", 10133, 1);
275 WriteAttributeValue("", 10121, checkoutUrl, 10121, 12, false);
276 EndWriteAttribute();
277 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"key\"");
278 BeginWriteAttribute("value", " value=\"", 10179, "\"", 10200, 1);
279 WriteAttributeValue("", 10187, orderline.ID, 10187, 13, false);
280 EndWriteAttribute();
281 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"CartType\"");
282 BeginWriteAttribute("value", " value=\"", 10251, "\"", 10268, 1);
283 WriteAttributeValue("", 10259, cartType, 10259, 9, false);
284 EndWriteAttribute();
285 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-link btn-sm lh-1 p-0 m-0 fs-8 opacity-50\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t");
286 Write(Translate("Remove"));
287 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</form>\r\n");
288 }
289 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t<div class=\"d-flex flex-column justify-content-end flex-fill\">\r\n");
290 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<span class=\"h6 d-block fs-7 m-0\">\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
291 Write(priceTotalWithDiscounts);
292 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n");
293 if (orderline.TotalDiscount.Price.Value != 0)
294 {
295 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t<span class=\"d-block fs-8 opacity-50\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
296 Write(discountTotal);
297 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n");
298 }
299 WriteLiteral("\t\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t</article>\r\n");
300 }
301 }
302 WriteLiteral("\t\t\t</div>\r\n\r\n\t\t\t<div class=\"d-flex justify-content-end pb-3\">\r\n");
303 if (isMiniCart) {
304 WriteLiteral("\t\t\t\t\t<form");
305 BeginWriteAttribute("action", " action=\"", 11082, "\"", 11125, 2);
306 WriteAttributeValue("", 11091, "Default.aspx?ID=", 11091, 16, true);
307 WriteAttributeValue("", 11107, cartServicePageId, 11107, 18, false);
308 EndWriteAttribute();
309 WriteLiteral(" method=\"post\" data-layout-template=\"Swift-v2_CartSummary.cshtml\" data-response-target-element=");
310 Write(isMiniCart ? "DynamicOffcanvas" : "CartSummaryContainer");
311 WriteLiteral(" data-preloader=\"inline\">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"requestPageId\"");
312 BeginWriteAttribute("value", " value=\"", 11354, "\"", 11376, 1);
313 WriteAttributeValue("", 11362, requestPageId, 11362, 14, false);
314 EndWriteAttribute();
315 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"redirect\" value=\"false\">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"OrderContext\"");
316 BeginWriteAttribute("value", " value=\"", 11485, "\"", 11506, 1);
317 WriteAttributeValue("", 11493, orderContext, 11493, 13, false);
318 EndWriteAttribute();
319 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"cartcmd\" value=\"emptycart\">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"checkoutUrl\"");
320 BeginWriteAttribute("value", " value=\"", 11617, "\"", 11637, 1);
321 WriteAttributeValue("", 11625, checkoutUrl, 11625, 12, false);
322 EndWriteAttribute();
323 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"CartType\"");
324 BeginWriteAttribute("value", " value=\"", 11683, "\"", 11700, 1);
325 WriteAttributeValue("", 11691, cartType, 11691, 9, false);
326 EndWriteAttribute();
327 WriteLiteral(">\r\n\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-link p-0 text-decoration-none d-flex align-items-center gap-1\" onclick=\"swift.Cart.Update(this);\">\r\n\t\t\t\t\t\t\t<span class=\"icon-2\">");
328 Write(ReadFile(iconPath + "trash-can.svg"));
329 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t<span class=\"text-decoration-underline\">");
330 Write(Translate("Remove all"));
331 WriteLiteral("</span>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</form>\r\n");
332 }
333 else
334 {
335 WriteLiteral("\t\t\t\t\t<form>\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"requestPageId\"");
336 BeginWriteAttribute("value", " value=\"", 12117, "\"", 12139, 1);
337 WriteAttributeValue("", 12125, requestPageId, 12125, 14, false);
338 EndWriteAttribute();
339 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"redirect\" value=\"false\">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"OrderContext\"");
340 BeginWriteAttribute("value", " value=\"", 12248, "\"", 12269, 1);
341 WriteAttributeValue("", 12256, orderContext, 12256, 13, false);
342 EndWriteAttribute();
343 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"cartcmd\" value=\"emptycart\">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"checkoutUrl\"");
344 BeginWriteAttribute("value", " value=\"", 12380, "\"", 12400, 1);
345 WriteAttributeValue("", 12388, checkoutUrl, 12388, 12, false);
346 EndWriteAttribute();
347 WriteLiteral(">\r\n\t\t\t\t\t\t<input type=\"hidden\" name=\"CartType\"");
348 BeginWriteAttribute("value", " value=\"", 12446, "\"", 12463, 1);
349 WriteAttributeValue("", 12454, cartType, 12454, 9, false);
350 EndWriteAttribute();
351 WriteLiteral(">\r\n\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-link p-0 text-decoration-none d-flex align-items-center gap-1\">\r\n\t\t\t\t\t\t\t<span class=\"icon-2\">");
352 Write(ReadFile(iconPath + "trash-can.svg"));
353 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t<span class=\"text-decoration-underline\">");
354 Write(Translate("Remove all"));
355 WriteLiteral("</span>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</form>\r\n");
356 }
357 WriteLiteral("\t\t\t</div>\r\n\r\n");
358
359 string totalPriceWithoutDiscountsFeesAndTaxes = Model.Cart.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Formatted;
360 string totalPriceWithoutOrderDiscountsAndFees = Model.Cart.TotalPriceWithoutFees.Price.Formatted;
361 bool showPricesWithVat = Dynamicweb.Ecommerce.Common.Context.DisplayPricesWithVat;
362 bool renderVatMessage = (Model.Cart.TotalPrice?.PriceWithVat?.Value != Model.Cart.TotalPrice?.PriceWithoutVat?.Value) || Dynamicweb.Ecommerce.Common.Context.Country?.Vat != null;
363
364 WriteLiteral("\t\t\t\t<div class=\"d-flex flex-column mt-auto gap-2 gap-lg-3 position-sticky bottom-0 bg-body\" id=\"cartSummaryFooter\" style=\"box-shadow: 0 -10px 10px -12px var(--bs-gray-300);\">\r\n\r\n\t\t\t\t\t<div class=\"fs-8 border-top pt-2 pt-lg-3\">\r\n");
365 WriteLiteral("\t\t\t\t\t\t<div class=\"d-flex justify-content-between fw-bold\">\r\n\t\t\t\t\t\t\t<span>");
366 Write(Translate("Subtotal"));
367 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t<span class=\"text-end\">\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<span class=\"d-block\">\r\n");
368 if (totalPriceWithoutDiscountsFeesAndTaxes != totalPriceWithoutOrderDiscountsAndFees)
369 {
370 WriteLiteral("\t\t\t\t\t\t\t\t\t<span class=\"text-price fw-normal text-decoration-line-through\">");
371 Write(totalPriceWithoutDiscountsFeesAndTaxes);
372 WriteLiteral("</span>\r\n");
373 }
374 WriteLiteral("\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
375 Write(totalPriceWithoutOrderDiscountsAndFees);
376 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\r\n");
377 if (renderVatMessage && !showPricesWithVat)
378 {
379 WriteLiteral("\t\t\t\t\t\t\t\t\t<span class=\"fs-8 fw-normal d-block\">");
380 Write(Translate("Excl. VAT"));
381 WriteLiteral("</span>\r\n");
382 }
383 else if (renderVatMessage)
384 {
385 WriteLiteral("\t\t\t\t\t\t\t\t\t<span class=\"fs-8 fw-normal d-block\">");
386 Write(Translate("Incl. VAT"));
387 WriteLiteral("</span>\r\n");
388 }
389 WriteLiteral("\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</div>\r\n\r\n");
390 foreach (var orderline in Model.Cart.CartOrderlines)
391 {
392 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.ProductID) || !string.IsNullOrEmpty(orderline.ProductNumber); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber
393 var orderLineViewModel = Dynamicweb.Ecommerce.Services.OrderLines.GetById(orderline.ID);
394 bool isDiscount = orderLineViewModel.OrderLineType == Dynamicweb.Ecommerce.Orders.OrderLineType.Discount;
395 bool isOrderAmountDiscount = isDiscount && !isProductIdOrNumber;
396
397 if (isOrderAmountDiscount)
398 {
399 WriteLiteral("\t\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\"><span>");
400 Write(orderline.ProductName);
401 WriteLiteral("</span><span class=\"text-price\">");
402 Write(orderline.TotalPriceWithProductDiscounts.Price.Formatted);
403 WriteLiteral("</span></div>\r\n");
404 }
405 }
406 WriteLiteral("\r\n");
407 if (!string.IsNullOrEmpty(Model.Cart.ShippingMethod))
408 {
409 if (Model.Cart.ShippingFee.Price.Value != 0.0)
410 {
411 WriteLiteral("\t\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\">\r\n\t\t\t\t\t\t\t\t\t<span>");
412 Write(Translate("Delivery"));
413 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span>");
414 Write(Model.Cart.ShippingFee.Price.Formatted);
415 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n");
416 }
417 }
418 else
419 {
420 WriteLiteral("\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\">\r\n\t\t\t\t\t\t\t\t<span>");
421 Write(Translate("Delivery"));
422 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t<span>");
423 Write(Translate("Calculated in next step"));
424 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t</div>\r\n");
425 }
426 WriteLiteral("\r\n");
427 if (!string.IsNullOrEmpty(Model.Cart.PaymentMethod))
428 {
429 if (Model.Cart.PaymentFee.Price.Value != 0)
430 {
431 WriteLiteral("\t\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\">\r\n\t\t\t\t\t\t\t\t\t<span>");
432 Write(Translate("Payment"));
433 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"text-price\">");
434 Write(Model.Cart.PaymentFee.Price.Formatted);
435 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n");
436 }
437 }
438 else
439 {
440 WriteLiteral("\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\">\r\n\t\t\t\t\t\t\t\t<span>");
441 Write(Translate("Payment"));
442 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t<span>");
443 Write(Translate("Calculated in next step"));
444 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t</div>\r\n");
445 }
446 WriteLiteral("\r\n");
447 if (order is object)
448 {
449 if (order.TotalTax.Price != 0)
450 {
451 WriteLiteral("\t\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\">\r\n\t\t\t\t\t\t\t\t\t<span>");
452 Write(Translate("Sales tax"));
453 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span>");
454 Write(order.TotalTax.PriceFormatted);
455 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n");
456 }
457 }
458 WriteLiteral("\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"fs-8 border-top pt-2 pt-lg-3\">\r\n\t\t\t\t\t\t<div class=\"d-flex justify-content-between fs-6 fw-bold\">\r\n\t\t\t\t\t\t\t<span>");
459 Write(Translate("Total"));
460 WriteLiteral("</span>\r\n");
461 if (renderVatMessage && !showPricesWithVat)
462 {
463 WriteLiteral("\t\t\t\t\t\t\t\t<span class=\"text-price text-end\">\r\n\t\t\t\t\t\t\t\t\t<span class=\"fs-5 d-block\">");
464 Write(Model.Cart.TotalPrice.Price.Formatted);
465 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"fs-8 fw-normal d-block\">");
466 Write(Translate("Excl. VAT"));
467 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</span>\r\n");
468 }
469 else if (renderVatMessage)
470 {
471 WriteLiteral("\t\t\t\t\t\t\t\t<span class=\"text-price text-end\">\r\n\t\t\t\t\t\t\t\t\t<span class=\"fs-5 d-block\">");
472 Write(Model.Cart.TotalPrice.Price.Formatted);
473 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"fs-8 fw-normal d-block\">");
474 Write(Translate("Incl. VAT"));
475 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</span>\r\n");
476 }
477 else
478 {
479 WriteLiteral("\t\t\t\t\t\t\t\t<span class=\"text-price fs-5\">");
480 Write(Model.Cart.TotalPrice.Price.Formatted);
481 WriteLiteral("</span>\r\n");
482 }
483 WriteLiteral("\t\t\t\t\t\t</div>\r\n\r\n");
484 if (renderVatMessage)
485 {
486 WriteLiteral("\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\"><span>");
487 Write(Translate("VAT"));
488 WriteLiteral("</span><span class=\"text-price\">");
489 Write(Model.Cart.TotalPrice.Vat.Formatted);
490 WriteLiteral("</span></div>\r\n");
491 if (!showPricesWithVat)
492 {
493 WriteLiteral("\t\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\"><span>");
494 Write(Translate("Total incl. VAT"));
495 WriteLiteral("</span><span class=\"text-price\">");
496 Write(Model.Cart.TotalPrice.PriceWithVat.Formatted);
497 WriteLiteral("</span></div>\r\n");
498 }
499 }
500 WriteLiteral("\r\n");
501 if (Model.Cart.TotalDiscount.Price.Value != 0)
502 {
503 WriteLiteral("\t\t\t\t\t\t\t<div class=\"d-flex justify-content-between\"><span>");
504 Write(Translate("Discount"));
505 WriteLiteral("</span><span class=\"text-price\">");
506 Write(Model.Cart.TotalDiscount.Price.Formatted);
507 WriteLiteral("</span></div>\r\n");
508 }
509 WriteLiteral("\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"mb-3 d-flex flex-column justify-content-end gap-3\">\r\n\r\n");
510 if (isMiniCart)
511 {
512 WriteLiteral(@" <button type=""button"" class=""btn btn-link text-decoration-none order-last"" data-dw-button=""link"" data-bs-dismiss=""offcanvas"" aria-label=""Close"" id=""ContinueShopping"">
513 <div class=""d-flex align-items-center justify-content-center position-relative"">
514 <span class=""icon-2 me-1 position-absolute position-lg-static start-0"">
515 ");
516 Write(ReadFile(iconPath + "chevron-left.svg"));
517 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span>");
518 Write(Translate("Continue shopping"));
519 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</button>\r\n");
520
521 if (!string.IsNullOrEmpty(cartUrl))
522 {
523 WriteLiteral("\t\t\t\t\t\t\t\t<a");
524 BeginWriteAttribute("href", " href=\"", 19004, "\"", 19047, 2);
525 WriteAttributeValue("", 19011, cartUrl, 19011, 10, false);
526 WriteAttributeValue("", 19021, orderContextQueryString, 19021, 26, false);
527 EndWriteAttribute();
528 WriteLiteral(" class=\"btn btn-secondary\" data-dw-button=\"secondary\" id=\"GoToCartButton\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"d-flex align-items-center justify-content-center position-relative\">\r\n\t\t\t\t\t\t\t\t\t\t<span>");
529 Write(Translate("Cart"));
530 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"icon-2 ms-1 position-absolute position-md-static end-0\">\r\n\t\t\t\t\t\t\t\t\t\t\t");
531 Write(ReadFile(iconPath + "chevron-right.svg"));
532 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</a>\r\n");
533 }
534 }
535
536
537 WriteLiteral("\t\t\t\t\t\t<a");
538 BeginWriteAttribute("href", " href=\"", 19501, "\"", 19548, 2);
539 WriteAttributeValue("", 19508, checkoutUrl, 19508, 14, false);
540 WriteAttributeValue("", 19522, orderContextQueryString, 19522, 26, false);
541 EndWriteAttribute();
542 WriteLiteral(" class=\"btn btn-primary order-first\" data-dw-button=\"primary\" id=\"CartSummaryGoToCheckoutButton\">\r\n\t\t\t\t\t\t\t<div class=\"d-flex align-items-center justify-content-center position-relative\">\r\n\t\t\t\t\t\t\t\t<span>");
543 Write(Translate("Checkout"));
544 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t<span class=\"icon-2 ms-1 position-absolute position-md-static end-0\">\r\n\t\t\t\t\t\t\t\t\t");
545 Write(ReadFile(iconPath + "chevron-right.svg"));
546 WriteLiteral("\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</a>\r\n\r\n");
547 if (!string.IsNullOrEmpty(quoteCheckoutPageId) && Converter.ToInt32(quoteCheckoutPageId) > 0 && !anonymousUser)
548 {
549 WriteLiteral("\t\t\t\t\t\t\t<a");
550 BeginWriteAttribute("href", " href=\"", 20130, "\"", 20201, 3);
551 WriteAttributeValue("", 20137, "Default.aspx?ID=", 20137, 16, true);
552 WriteAttributeValue("", 20153, quoteCheckoutPageId, 20153, 22, false);
553 WriteAttributeValue("", 20175, orderContextQueryString, 20175, 26, false);
554 EndWriteAttribute();
555 WriteLiteral(" class=\"btn btn-secondary\" data-dw-button=\"secondary\" id=\"RequestQuoteButton\">\r\n\t\t\t\t\t\t\t\t<div class=\"d-flex align-items-center justify-content-center position-relative\">\r\n\t\t\t\t\t\t\t\t\t<span>");
556 Write(Translate("Request quote"));
557 WriteLiteral("</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"icon-2 ms-1 position-absolute position-lg-static end-0\">\r\n\t\t\t\t\t\t\t\t\t\t");
558 Write(ReadFile(iconPath + "chevron-right.svg"));
559 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</a>\r\n");
560 }
561 WriteLiteral("\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n");
562 WriteLiteral("\t\t</div>\r\n");
563 }
564 else
565 {
566 if (!isMiniCart)
567 {
568 WriteLiteral(@" <button class=""toggle-order-summary btn text-reset w-100 d-block d-lg-none px-0"" type=""button"" data-bs-toggle=""collapse"" data-bs-target=""#CartSummary"" aria-expanded=""false"" aria-controls=""CartSummary"">
569 <div class=""d-flex align-items-center justify-content-between"">
570 <span class=""d-flex align-items-center"">
571 <span class=""fs-7 lh-1""><span class=""toggle-order-summary-text""></span> ");
572 Write(Translate("order summary"));
573 WriteLiteral("</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class=\"icon-2 ms-2\">\r\n\t\t\t\t\t\t");
574 Write(ReadFile(iconPath + "chevron-down.svg"));
575 WriteLiteral("\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t</button>\r\n");
576 WriteLiteral("\t\t\t<style>\r\n\t\t\t\t.toggle-order-summary .toggle-order-summary-text::after {\r\n\t\t\t\t\tcontent: \"");
577 Write(Translate("Show"));
578 WriteLiteral("\";\r\n\t\t\t\t}\r\n\t\t\t\t.toggle-order-summary[aria-expanded=\"true\"] .toggle-order-summary-text::after {\r\n\t\t\t\t\tcontent: \"");
579 Write(Translate("Hide"));
580 WriteLiteral("\";\r\n\t\t\t\t}\r\n\t\t\t\t.toggle-order-summary[ aria-expanded=\"true\" ] svg {\r\n\t\t\t\t\ttransform: rotate(-180deg);\r\n\t\t\t\t}\r\n\t\t\t</style>\r\n");
581 }
582
583 WriteLiteral("\t\t<div");
584 BeginWriteAttribute("class", " class=\"", 21638, "\"", 21701, 3);
585 WriteAttributeValue("", 21646, "d-lg-block", 21646, 10, true);
586 WriteAttributeValue(" ", 21656, "h-lg-auto", 21657, 10, true);
587 WriteAttributeValue(" ", 21666, !isMiniCart ? "collapse" : null, 21667, 34, false);
588 EndWriteAttribute();
589 WriteLiteral(" id=\"CartSummary\">\r\n\t\t\t<div class=\"d-flex flex-column align-items-center justify-content-center min-vh-50 text-center opacity-50\">\r\n\t\t\t\t<span class=\"icon-5\">\r\n\t\t\t\t\t");
590 Write(ReadFile(iconPath + "cart-shopping.svg"));
591 WriteLiteral("\r\n\t\t\t\t</span>\r\n\t\t\t\t<span>");
592 Write(Translate("Your shopping cart is empty"));
593 WriteLiteral("</span>\r\n\t\t\t\t<span>");
594 Write(Translate("Add products to see cart summary"));
595 WriteLiteral("</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n");
596 }
597 WriteLiteral("</div>\r\n");
598 }
599 #pragma warning restore 1998
600
601 string? DoubleToString(double? value)
602 {
603 if (value.HasValue)
604 {
605 return value.Value.ToString(CultureInfo.InvariantCulture);
606 }
607 return null;
608 }
609 }
610 }
611 #pragma warning restore 1591
612
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2 @using Dynamicweb.Frontend
3 @using Dynamicweb.Core
4 @using Dynamicweb.Ecommerce.Frontend
5 @using Dynamicweb.Ecommerce.ProductCatalog
6 @using System.Globalization
7
8 @functions {
9 string? DoubleToString(double? value)
10 {
11 if (value.HasValue)
12 {
13 return value.Value.ToString(CultureInfo.InvariantCulture);
14 }
15 return null;
16 }
17 }
18
19 @{
20 string iconPath = "/Files/Images/Icons/";
21 bool anonymousUser = Pageview.User == null;
22 var cartServicePageId = GetPageIdByNavigationTag("CartService");
23 var cartSummaryPageId = GetPageIdByNavigationTag("CartSummary");
24 var cartType = Dynamicweb.Context.Current?.Request["CartType"];
25 var requestPageId = Dynamicweb.Context.Current?.Request["RequestPageID"];
26 var orderContext = Dynamicweb.Context.Current?.Request["OrderContext"];
27 string? orderContextQueryString = string.IsNullOrEmpty(orderContext) ? string.Empty : $"?OrderContext={orderContext}";
28 string? cartUrl = Model.Item?.GetLink("CartPageLink")?.Url;
29 string? checkoutUrl = Dynamicweb.Context.Current?.Request["checkoutUrl"];
30 checkoutUrl = string.IsNullOrEmpty(checkoutUrl) ? (!anonymousUser ? Model.Item?.GetLink("CheckoutSignedInPageLink")?.Url : Model.Item?.GetLink("CheckoutAnonymousPageLink")?.Url) : checkoutUrl;
31 string? quoteCheckoutPageId = Dynamicweb.Context.Current?.Request["quoteCheckoutPageLink"];
32 quoteCheckoutPageId = string.IsNullOrEmpty(quoteCheckoutPageId) ? Model.Item?.GetLink("QuoteCheckoutPageLink")?.PageId.ToString() : quoteCheckoutPageId;
33 var order = Dynamicweb.Ecommerce.Services.Orders.GetById(Model.Cart?.ID);
34 bool isMiniCart = cartType == "minicart";
35 }
36
37 @if (isMiniCart)
38 {
39 <div class="modal-header sticky-top justify-content-between py-1 py-lg-3 ps-3 ps-lg-4 pe-0 pe-lg-3 bg-body" style="box-shadow: 0 10px 10px -12px var(--bs-gray-300);">
40 <span class="h5 m-0">@Translate("Your cart")</span>
41
42 <button type="button" class="btn btn-sm p-2 d-flex align-items-center" data-bs-dismiss="offcanvas" aria-label="Close" id="CloseMiniCart">
43 <span>@Translate("Close")</span>
44 <span class="icon-3">
45 @ReadFile(iconPath + "xmark.svg")
46 </span>
47 </button>
48 </div>
49 }
50
51 <div class="item_@Model.Item?.SystemName.ToLower() @(isMiniCart ? "p-3 p-lg-4 h-100" : null)">
52 @if (Model.Cart?.TotalProductsCount > 0)
53 {
54 if (!isMiniCart)
55 {
56 <button class="toggle-order-summary btn text-reset w-100 d-block d-lg-none px-0" type="button" data-bs-toggle="collapse" data-bs-target="#CartSummary" aria-expanded="false" aria-controls="CartSummary">
57 <div class="d-flex align-items-center justify-content-between">
58 <span class="d-flex align-items-center">
59 <span class="fs-7 lh-1"><span class="toggle-order-summary-text"></span> @Translate("order summary")</span>
60 <span class="icon-2 ms-2">
61 @ReadFile(iconPath + "chevron-down.svg")
62 </span>
63 </span>
64 <span class="fw-bold">
65 <span class="text-price">@Model.Cart.TotalPrice.Price.Formatted</span>
66 </span>
67 </div>
68 </button>
69
70 <style>
71 .toggle-order-summary .toggle-order-summary-text::after {
72 content: "@Translate("Show")";
73 }
74 .toggle-order-summary[aria-expanded="true"] .toggle-order-summary-text::after {
75 content: "@Translate("Hide")";
76 }
77 .toggle-order-summary[ aria-expanded="true" ] svg {
78 transform: rotate(-180deg);
79 }
80 </style>
81 }
82
83 <div class="@(!isMiniCart ? "d-lg-block h-lg-auto collapse" : "d-flex flex-column h-100") pt-2 pt-lg-0" id="CartSummary">
84 <div class="d-flex flex-column gap-4 pb-4">
85 @foreach (var orderline in Model.Cart.CartOrderlines.Reverse())
86 {
87 var product = orderline?.GetProduct() ?? null;
88 string? name = orderline?.ProductName;
89 string image = product?.DefaultImage?.Value ?? string.Empty;
90 string imagePath = $"/Admin/Public/GetImage.ashx?image={image}&width=80&height=80&crop=5&fillcanvas=true&Background=ffffff&format=webp";
91 imagePath = !string.IsNullOrWhiteSpace(image) && !image.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? imagePath : image;
92 string? priceTotalWithDiscounts = orderline?.TotalPriceWithProductDiscounts.Price.Formatted;
93 string? priceBefore = orderline?.UnitPriceBeforeDiscount.Price.Formatted;
94 string? unitPrice = orderline?.UnitPrice.Price.Formatted;
95 string? discountPrice = orderline?.UnitPriceWithProductDiscount.Price.Formatted;
96 string? discountTotal = orderline?.TotalDiscount.Price.Formatted;
97 string? variantText = orderline?.ProductVariantText;
98 string? unitName = orderline?.UnitName;
99 var orderlineId = orderline?.ID;
100 var quantity = Math.Round(orderline.Quantity, 2);
101 double? stepQty = product?.PurchaseQuantityStep > 0 ? product.PurchaseQuantityStep : 1;
102 double? minQty = product?.PurchaseMinimumQuantity > 0 ? product.PurchaseMinimumQuantity : 1;
103 double? maxQty = null;
104 if (product?.ProductType == Dynamicweb.Ecommerce.Products.ProductType.Stock && !product.NeverOutOfstock)
105 {
106 maxQty = product.StockLevel;
107 }
108 string link = product?.GetProductLink(GetPageIdByNavigationTag("Shop"), false) ?? string.Empty;
109 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.ProductID) || !string.IsNullOrEmpty(orderline.ProductNumber); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber
110 bool isProduct = orderline.IsProduct || (orderline.IsDiscount && isProductIdOrNumber);
111
112 if (isProduct)
113 {
114 <article class="grid grid-12">
115
116 <div class="g-col-2">
117 <a href="@link" class="ratio ratio-1x1 d-block " title="@name" tabindex="-1">
118 <img src="@imagePath" style="object-fit: contain;" alt="@name">
119 </a>
120 </div>
121
122 <div class="g-col-6">
123
124 <div class="d-flex flex-column gap-1">
125 @* Title *@
126 <h3 class="h6 fs-7 m-0">
127 <a href="@link" class="text-decoration-none" title="@name" tabindex="-1">@name</a>
128 </h3>
129
130 @* Variants *@
131 @if (!string.IsNullOrEmpty(variantText))
132 {
133 <p class="fs-8 m-0">@variantText</p>
134 }
135
136 @if (orderline.IsDiscount)
137 {
138 @* Free product notice *@
139 <p class="fs-8 m-0">@Translate("Free product")</p>
140 }
141 else
142 {
143 @* Unit price *@
144 <p class="fs-8 m-0">
145 @if (!string.IsNullOrEmpty(unitName))
146 {
147 <span>@unitName: </span>
148 }
149 @if (discountPrice == unitPrice)
150
151 {
152 <span class="text-price">@unitPrice</span>
153 }
154 else
155 {
156 <span class="text-price">@discountPrice</span>
157 <span class="text-decoration-line-through">
158 <span class="text-price">@unitPrice</span>
159 </span>
160 }
161 </p>
162 }
163
164 @* Quantity *@
165 @if (isMiniCart && !orderline.IsDiscount)
166 {
167 <form method="post" autocomplete="off" action="Default.aspx?ID=@cartServicePageId" data-response-target-element="CartSummary">
168 <input type="hidden" name="requestPageId" value="@requestPageId">
169 <input type="hidden" name="redirect" value="false">
170 <input type="hidden" name="OrderContext" value="@orderContext">
171 <input type="hidden" name="cartcmd" value="updateorderlines">
172 <input type="hidden" name="checkoutUrl" value="@checkoutUrl">
173 <input type="hidden" name="key" value="@orderline.ID">
174 <input type="hidden" name="CartType" value="@cartType">
175 <input type="submit" class="d-none" onclick="event.preventDefault();"> @* Fix for enterKey should not redirect *@
176
177 @{
178 var orderlineViewModel = new Dynamicweb.Ecommerce.Frontend.OrderLineViewModel(){
179 Id = orderlineId,
180 ProductId = orderline.ProductID,
181 ProductVariantId = orderline.ProductVariantID,
182 UnitId = orderline.UnitId,
183 Quantity = quantity
184 };
185
186 @RenderPartial("Components/QuantitySelectorOrderline.cshtml", orderlineViewModel)
187 }
188
189 </form>
190 }
191 else {
192 <span class="fs-8 d-block">@Translate("Qty"): @quantity</span>
193 }
194
195 </div>
196 </div>
197
198 <div class="g-col-4">
199
200 <div class="d-flex flex-column gap-1 text-end h-100">
201
202 @if (isMiniCart && !orderline.IsDiscount)
203 {
204 <form class="d-flex justify-content-end" action="Default.aspx?ID=@cartServicePageId" method="post" data-layout-template="Swift-v2_CartSummary.cshtml" data-response-target-element=@(isMiniCart ? "DynamicOffcanvas" : "CartSummaryContainer") data-preloader="inline">
205 <input type="hidden" name="requestPageId" value="@requestPageId">
206 <input type="hidden" name="redirect" value="false">
207 <input type="hidden" name="OrderContext" value="@orderContext">
208 <input type="hidden" name="cartcmd" value="DelOrderLine">
209 <input type="hidden" name="checkoutUrl" value="@checkoutUrl">
210 <input type="hidden" name="key" value="@orderline.ID">
211 <input type="hidden" name="CartType" value="@cartType">
212 <button type="button" class="btn btn-link btn-sm lh-1 p-0 m-0 fs-8 opacity-50" onclick="swift.Cart.Update(this);">
213 @Translate("Remove")
214 </button>
215 </form>
216 }
217 else if (!orderline.IsDiscount)
218 {
219 <form class="d-flex justify-content-end">
220 <input type="hidden" name="requestPageId" value="@requestPageId">
221 <input type="hidden" name="redirect" value="false">
222 <input type="hidden" name="OrderContext" value="@orderContext">
223 <input type="hidden" name="cartcmd" value="DelOrderLine">
224 <input type="hidden" name="checkoutUrl" value="@checkoutUrl">
225 <input type="hidden" name="key" value="@orderline.ID">
226 <input type="hidden" name="CartType" value="@cartType">
227 <button type="submit" class="btn btn-link btn-sm lh-1 p-0 m-0 fs-8 opacity-50">
228 @Translate("Remove")
229 </button>
230 </form>
231 }
232
233 <div class="d-flex flex-column justify-content-end flex-fill">
234 @* Total *@
235 <span class="h6 d-block fs-7 m-0">
236 <span class="text-price">@priceTotalWithDiscounts</span>
237 </span>
238 @if (orderline.TotalDiscount.Price.Value != 0)
239 {
240 <span class="d-block fs-8 opacity-50">
241 <span class="text-price">@discountTotal</span>
242 </span>
243 }
244 </div>
245
246 </div>
247
248 </div>
249
250 </article>
251 }
252 }
253 </div>
254
255 <div class="d-flex justify-content-end pb-3">
256 @if (isMiniCart) {
257 <form action="Default.aspx?ID=@cartServicePageId" method="post" data-layout-template="Swift-v2_CartSummary.cshtml" data-response-target-element=@(isMiniCart ? "DynamicOffcanvas" : "CartSummaryContainer") data-preloader="inline">
258 <input type="hidden" name="requestPageId" value="@requestPageId">
259 <input type="hidden" name="redirect" value="false">
260 <input type="hidden" name="OrderContext" value="@orderContext">
261 <input type="hidden" name="cartcmd" value="emptycart">
262 <input type="hidden" name="checkoutUrl" value="@checkoutUrl">
263 <input type="hidden" name="CartType" value="@cartType">
264 <button type="button" class="btn btn-link p-0 text-decoration-none d-flex align-items-center gap-1" onclick="swift.Cart.Update(this);">
265 <span class="icon-2">@ReadFile(iconPath + "trash-can.svg")</span>
266 <span class="text-decoration-underline">@Translate("Remove all")</span>
267 </button>
268 </form>
269 }
270 else
271 {
272 <form>
273 <input type="hidden" name="requestPageId" value="@requestPageId">
274 <input type="hidden" name="redirect" value="false">
275 <input type="hidden" name="OrderContext" value="@orderContext">
276 <input type="hidden" name="cartcmd" value="emptycart">
277 <input type="hidden" name="checkoutUrl" value="@checkoutUrl">
278 <input type="hidden" name="CartType" value="@cartType">
279 <button type="submit" class="btn btn-link p-0 text-decoration-none d-flex align-items-center gap-1">
280 <span class="icon-2">@ReadFile(iconPath + "trash-can.svg")</span>
281 <span class="text-decoration-underline">@Translate("Remove all")</span>
282 </button>
283 </form>
284 }
285 </div>
286
287 @{
288 string totalPriceWithoutDiscountsFeesAndTaxes = Model.Cart.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Formatted;
289 string totalPriceWithoutOrderDiscountsAndFees = Model.Cart.TotalPriceWithoutFees.Price.Formatted;
290 bool showPricesWithVat = Dynamicweb.Ecommerce.Common.Context.DisplayPricesWithVat;
291 bool renderVatMessage = (Model.Cart.TotalPrice?.PriceWithVat?.Value != Model.Cart.TotalPrice?.PriceWithoutVat?.Value) || Dynamicweb.Ecommerce.Common.Context.Country?.Vat != null;
292
293 <div class="d-flex flex-column mt-auto gap-2 gap-lg-3 position-sticky bottom-0 bg-body" id="cartSummaryFooter" style="box-shadow: 0 -10px 10px -12px var(--bs-gray-300);">
294
295 <div class="fs-8 border-top pt-2 pt-lg-3">
296 @* Subtotal *@
297 <div class="d-flex justify-content-between fw-bold">
298 <span>@Translate("Subtotal")</span>
299 <span class="text-end">
300
301 <span class="d-block">
302 @if (totalPriceWithoutDiscountsFeesAndTaxes != totalPriceWithoutOrderDiscountsAndFees)
303 {
304 <span class="text-price fw-normal text-decoration-line-through">@(totalPriceWithoutDiscountsFeesAndTaxes)</span>
305 }
306 <span class="text-price">@totalPriceWithoutOrderDiscountsAndFees</span>
307 </span>
308
309 @if (renderVatMessage && !showPricesWithVat)
310 {
311 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span>
312 }
313 else if (renderVatMessage)
314 {
315 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span>
316 }
317 </span>
318 </div>
319
320 @* Discounts (only order discounts) *@
321 @foreach (var orderline in Model.Cart.CartOrderlines)
322 {
323 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.ProductID) || !string.IsNullOrEmpty(orderline.ProductNumber); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber
324 var orderLineViewModel = Dynamicweb.Ecommerce.Services.OrderLines.GetById(orderline.ID);
325 bool isDiscount = orderLineViewModel.OrderLineType == Dynamicweb.Ecommerce.Orders.OrderLineType.Discount;
326 bool isOrderAmountDiscount = isDiscount && !isProductIdOrNumber;
327
328 if (isOrderAmountDiscount)
329 {
330 <div class="d-flex justify-content-between"><span>@orderline.ProductName</span><span class="text-price">@orderline.TotalPriceWithProductDiscounts.Price.Formatted</span></div>
331 }
332 }
333
334 @* Shipping *@
335 @if (!string.IsNullOrEmpty(Model.Cart.ShippingMethod))
336 {
337 if (Model.Cart.ShippingFee.Price.Value != 0.0)
338 {
339 <div class="d-flex justify-content-between">
340 <span>@Translate("Delivery")</span>
341 <span>@Model.Cart.ShippingFee.Price.Formatted</span>
342 </div>
343 }
344 }
345 else
346 {
347 <div class="d-flex justify-content-between">
348 <span>@Translate("Delivery")</span>
349 <span>@Translate("Calculated in next step")</span>
350 </div>
351 }
352
353 @* Payment *@
354 @if (!string.IsNullOrEmpty(Model.Cart.PaymentMethod))
355 {
356 if (Model.Cart.PaymentFee.Price.Value != 0)
357 {
358 <div class="d-flex justify-content-between">
359 <span>@Translate("Payment")</span>
360 <span class="text-price">@Model.Cart.PaymentFee.Price.Formatted</span>
361 </div>
362 }
363 }
364 else
365 {
366 <div class="d-flex justify-content-between">
367 <span>@Translate("Payment")</span>
368 <span>@Translate("Calculated in next step")</span>
369 </div>
370 }
371
372 @* Taxes *@
373 @if (order is object)
374 {
375 if (order.TotalTax.Price != 0)
376 {
377 <div class="d-flex justify-content-between">
378 <span>@Translate("Sales tax")</span>
379 <span>@order.TotalTax.PriceFormatted</span>
380 </div>
381 }
382 }
383 </div>
384 <div class="fs-8 border-top pt-2 pt-lg-3">
385 <div class="d-flex justify-content-between fs-6 fw-bold">
386 <span>@Translate("Total")</span>
387 @if (renderVatMessage && !showPricesWithVat)
388 {
389 <span class="text-price text-end">
390 <span class="fs-5 d-block">@Model.Cart.TotalPrice.Price.Formatted</span>
391 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span>
392 </span>
393 }
394 else if (renderVatMessage)
395 {
396 <span class="text-price text-end">
397 <span class="fs-5 d-block">@Model.Cart.TotalPrice.Price.Formatted</span>
398 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span>
399 </span>
400 }
401 else
402 {
403 <span class="text-price fs-5">@Model.Cart.TotalPrice.Price.Formatted</span>
404 }
405 </div>
406
407 @if (renderVatMessage)
408 {
409 <div class="d-flex justify-content-between"><span>@Translate("VAT")</span><span class="text-price">@Model.Cart.TotalPrice.Vat.Formatted</span></div>
410 if (!showPricesWithVat)
411 {
412 <div class="d-flex justify-content-between"><span>@Translate("Total incl. VAT")</span><span class="text-price">@Model.Cart.TotalPrice.PriceWithVat.Formatted</span></div>
413 }
414 }
415
416 @if (Model.Cart.TotalDiscount.Price.Value != 0)
417 {
418 <div class="d-flex justify-content-between"><span>@Translate("Discount")</span><span class="text-price">@Model.Cart.TotalDiscount.Price.Formatted</span></div>
419 }
420 </div>
421
422 <div class="mb-3 d-flex flex-column justify-content-end gap-3">
423
424 @if (isMiniCart)
425 {
426 @*Close offcanvas button*@
427 <button type="button" class="btn btn-link text-decoration-none order-last" data-dw-button="link" data-bs-dismiss="offcanvas" aria-label="Close" id="ContinueShopping">
428 <div class="d-flex align-items-center justify-content-center position-relative">
429 <span class="icon-2 me-1 position-absolute position-lg-static start-0">
430 @ReadFile(iconPath + "chevron-left.svg")
431 </span>
432 <span>@Translate("Continue shopping")</span>
433 </div>
434 </button>
435
436 if (!string.IsNullOrEmpty(cartUrl))
437 {
438 @*Cart button*@
439 <a href="@(cartUrl)@(orderContextQueryString)" class="btn btn-secondary" data-dw-button="secondary" id="GoToCartButton">
440 <div class="d-flex align-items-center justify-content-center position-relative">
441 <span>@Translate("Cart")</span>
442 <span class="icon-2 ms-1 position-absolute position-md-static end-0">
443 @ReadFile(iconPath + "chevron-right.svg")
444 </span>
445 </div>
446 </a>
447 }
448 }
449
450
451 @*Checkout button*@
452 <a href="@(checkoutUrl)@(orderContextQueryString)" class="btn btn-primary order-first" data-dw-button="primary" id="CartSummaryGoToCheckoutButton">
453 <div class="d-flex align-items-center justify-content-center position-relative">
454 <span>@Translate("Checkout")</span>
455 <span class="icon-2 ms-1 position-absolute position-md-static end-0">
456 @ReadFile(iconPath + "chevron-right.svg")
457 </span>
458 </div>
459 </a>
460
461 @*Quote Checkout button*@
462 @if (!string.IsNullOrEmpty(quoteCheckoutPageId) && Converter.ToInt32(quoteCheckoutPageId) > 0 && !anonymousUser)
463 {
464 <a href="Default.aspx?ID=@(quoteCheckoutPageId)@(orderContextQueryString)" class="btn btn-secondary" data-dw-button="secondary" id="RequestQuoteButton">
465 <div class="d-flex align-items-center justify-content-center position-relative">
466 <span>@Translate("Request quote")</span>
467 <span class="icon-2 ms-1 position-absolute position-lg-static end-0">
468 @ReadFile(iconPath + "chevron-right.svg")
469 </span>
470 </div>
471 </a>
472 }
473 </div>
474 </div>
475 }
476 </div>
477 }
478 else
479 {
480 if (!isMiniCart)
481 {
482 <button class="toggle-order-summary btn text-reset w-100 d-block d-lg-none px-0" type="button" data-bs-toggle="collapse" data-bs-target="#CartSummary" aria-expanded="false" aria-controls="CartSummary">
483 <div class="d-flex align-items-center justify-content-between">
484 <span class="d-flex align-items-center">
485 <span class="fs-7 lh-1"><span class="toggle-order-summary-text"></span> @Translate("order summary")</span>
486 </span>
487 <span class="icon-2 ms-2">
488 @ReadFile(iconPath + "chevron-down.svg")
489 </span>
490 </div>
491 </button>
492
493 <style>
494 .toggle-order-summary .toggle-order-summary-text::after {
495 content: "@Translate("Show")";
496 }
497 .toggle-order-summary[aria-expanded="true"] .toggle-order-summary-text::after {
498 content: "@Translate("Hide")";
499 }
500 .toggle-order-summary[ aria-expanded="true" ] svg {
501 transform: rotate(-180deg);
502 }
503 </style>
504 }
505
506 <div class="d-lg-block h-lg-auto @(!isMiniCart ? "collapse" : null)" id="CartSummary">
507 <div class="d-flex flex-column align-items-center justify-content-center min-vh-50 text-center opacity-50">
508 <span class="icon-5">
509 @ReadFile(iconPath + "cart-shopping.svg")
510 </span>
511 <span>@Translate("Your shopping cart is empty")</span>
512 <span>@Translate("Add products to see cart summary")</span>
513 </div>
514 </div>
515 }
516 </div>
517