Error executing template "Designs/Swift/eCom7/CartV2/Step/InformationAnonymous.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_9c55df3762704e31a2186fe103fa40ff.ExecuteAsync()
   at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) in /_/src/Application/Providers/Dynamicweb.Rendering.Providers.NetCore/Razor/RazorTemplateRenderingProvider.cs:line 99
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\TemplateRenderingService.cs:line 21
   at Dynamicweb.Rendering.Template.RenderRazorTemplate() in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\Template.cs:line 749

1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb 3 4 @{ 5 var themeRaw = Pageview.CurrentParagraph.Item["Theme"]?.ToString(); 6 string theme = !string.IsNullOrEmpty(themeRaw) ? " theme " + themeRaw.Replace(" ", "").Trim().ToLower() : ""; 7 } 8 9 <div class="grid gap-0 h-100"> 10 <div class="g-col-12 g-col-lg-8 p-3 p-lg-4 pe-xl-5 ps-xl-6 ps-xxl-8 order-last order-lg-first@(theme)"> 11 <form name="ordersubmit" id="ordersubmit" method="post" autocomplete="off" style="max-width: 65rem; margin-left: auto;"> 12 13 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 14 @using Dynamicweb 15 @using System.IO 16 17 @{ 18 string logoLink = Pageview.CurrentParagraph?.Item["LogoLink"] != null ? Pageview.CurrentParagraph.Item["LogoLink"].ToString() : string.Empty; 19 20 string logoImage = Pageview.CurrentParagraph?.Item["Logo"] != null ? Pageview.CurrentParagraph.Item["Logo"].ToString() : string.Empty; 21 string title = Pageview.CurrentParagraph?.Item["Title"] != null ? Pageview.CurrentParagraph.Item["Title"].ToString() : Pageview.Area.Name; 22 23 string maxWidth = Pageview.CurrentParagraph?.Item["MaxWidth"] != null ? "max-width: " + Pageview.CurrentParagraph.Item["MaxWidth"].ToString() + "px" : string.Empty; 24 maxWidth = maxWidth == "max-width: 0px" ? string.Empty : maxWidth; 25 } 26 27 <div class="mb-4 text-center"> 28 @if (!string.IsNullOrWhiteSpace(logoLink)) 29 { 30 @:<a href="@logoLink" class="text-decoration-none" title="@Translate("Leave checkout")"> 31 } 32 33 @if (logoImage != "") 34 { 35 if (Path.GetExtension(logoImage).ToLower() == ".svg") 36 { 37 <div class="icon-auto" style="@maxWidth"> 38 @ReadFile(logoImage) 39 </div> 40 } 41 else 42 { 43 string imageWidth = Pageview.CurrentParagraph.Item["MaxWidth"] != null ? Pageview.CurrentParagraph.Item["MaxWidth"].ToString() : "400"; 44 string imagePath = "/Admin/Public/GetImage.ashx?width=" + imageWidth + "&image=" + logoImage; 45 46 <picture class="mx-auto d-block"> 47 <img src="@logoImage" alt="@title" style="@maxWidth"> 48 </picture> 49 } 50 } 51 else 52 { 53 <div class="fs-3 p-0">@title</div> 54 } 55 56 @if (!string.IsNullOrWhiteSpace(logoLink)) 57 { 58 @:</a> 59 } 60 </div> 61 62 63 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 64 @using Dynamicweb.Ecommerce.Cart 65 66 <nav aria-label="breadcrumb" class="mb-3 mb-md-4 fs-8" id="StepsBreadcrumbs"> 67 <ol class="breadcrumb"> 68 @foreach (LoopItem step in GetLoop("StepButtons")) 69 { 70 if (step.GetString("Step.Name").ToLower() != "checkout") 71 { 72 if (step.GetBoolean("Step.Current")) 73 { 74 <li class="breadcrumb-item fw-bold" aria-current="location">@Translate(step.GetString("Step.Name"))</li> 75 } 76 else 77 { 78 <li class="breadcrumb-item">@Translate(step.GetString("Step.Name"))</li> 79 } 80 } 81 } 82 83 @if (GetLoop("StepButtons").Count == 0) 84 { 85 var cartSettings = new ModuleSettings(Pageview.CurrentParagraph.ModuleProperties); 86 87 foreach (CartStepInfo step in cartSettings.Steps) 88 { 89 if (step.IsCheckout) 90 { 91 <li class="breadcrumb-item fw-bold" aria-current="location">@Translate(step.Name)</li> 92 break; 93 } 94 else 95 { 96 <li class="breadcrumb-item">@Translate(step.Name)</li> 97 } 98 } 99 } 100 </ol> 101 </nav> 102 103 104 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 105 @using Dynamicweb.Ecommerce.Orders 106 107 @if (GetLoop("ValidationErrors").Count() != 0) 108 { 109 <div class="alert alert-warning" role="alert"> 110 <ul class="m-0 list-unstyled"> 111 @foreach (LoopItem item in GetLoop("ValidationErrors")) 112 { 113 <li>@item.GetValue("Ecom:Cart.ValidationError.ErrorMessage")</li> 114 } 115 </ul> 116 </div> 117 } 118 119 120 @* Logic to remove the voucher code error, when going to next step in checkout *@ 121 @{ 122 string voucherCodeForErrorCheck = GetString("Ecom:Order.Customer.VoucherCode"); 123 Order orderForErrorCheck = new OrderService().GetById(GetString("Ecom:Order.ID")); 124 voucherCodeForErrorCheck = orderForErrorCheck.VoucherUseType == VoucherUseCategoryType.None ? string.Empty : voucherCodeForErrorCheck; 125 } 126 127 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCodeForErrorCheck"> 128 129 130 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 131 132 @{ 133 bool summaryIsPaymentStep = GetLoop("StepButtons").Count == 0; 134 int summaryCurrentStep = !summaryIsPaymentStep ? 1 : 4; 135 int summaryCurrentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 136 137 foreach (LoopItem step in GetLoop("StepButtons")) 138 { 139 if (step.GetBoolean("Step.Current")) 140 { 141 summaryCurrentStep = step.GetInteger("Step.Number"); 142 } 143 } 144 } 145 146 @if (!string.IsNullOrEmpty(GetString("UserManagement:User.Address")) || 147 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) || 148 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID")) || 149 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) || 150 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company")) || 151 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address")) || 152 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2")) || 153 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip")) || 154 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City")) || 155 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Email")) || 156 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone")) || 157 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name")) || 158 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company")) || 159 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address")) || 160 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2")) || 161 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip")) || 162 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City")) || 163 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || 164 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone")) || 165 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethod")) || 166 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingDate")) || 167 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethod"))) 168 { 169 @* User *@ 170 if (summaryCurrentUserId != 0) 171 { 172 <div class="list-group mb-5"> 173 @{ 174 <text> 175 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 176 177 @{ 178 var summaryCustomerHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 179 int summaryCustomerCurrentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 180 181 List<string> contact = new List<string>(); 182 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 183 { 184 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) 185 { 186 contact.Add(GetString("Ecom:Order.Customer.Email")); 187 } 188 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 189 { 190 contact.Add(GetString("Ecom:Order.Customer.Phone")); 191 } 192 } 193 194 string summaryCustomerContactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 195 string summaryCustomerUserAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 196 } 197 198 @if (!string.IsNullOrEmpty(summaryCustomerContactString)) 199 { 200 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)" id="ContactGroup"> 201 <dl class="grid gap-1 gap-sm-3 mb-0"> 202 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> 203 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@summaryCustomerContactString</dd> 204 205 @if (!summaryCustomerHideEditBillingAddress) 206 { 207 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 208 @if (summaryCustomerCurrentUserId == 0) 209 { 210 <button type="submit" class="btn btn-small btn-link fs-8 p-0" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 211 <span class="text-uppercase">@Translate("Edit")</span> 212 </button> 213 } 214 else 215 { 216 <a href="@summaryCustomerUserAccountPage" class="btn btn-small btn-link fs-8 p-0" id="EditBillingAddressButton"> 217 <span class="text-uppercase">@Translate("Edit")</span> 218 </a> 219 } 220 </dd> 221 } 222 </dl> 223 </div> 224 } 225 226 </text> 227 <text> 228 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 229 @using Dynamicweb 230 231 @{ 232 var summaryUserHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 233 234 int summaryUserFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 235 bool summaryUserIsStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; 236 237 string stepSummaryAddressString = string.Empty; 238 if (summaryUserIsStandardSwiftTemplates) 239 { 240 Dynamicweb.Security.UserManagement.User user = Pageview.User; 241 List<string> address = new List<string>(); 242 if (!string.IsNullOrEmpty(user.Company)) 243 { 244 address.Add(user.Company); 245 summaryUserFieldCount++; 246 } 247 if (!string.IsNullOrEmpty(user.Name)) 248 { 249 address.Add(user.Name); 250 summaryUserFieldCount++; 251 } 252 if (!string.IsNullOrEmpty(user.Address)) 253 { 254 address.Add(user.Address); 255 summaryUserFieldCount++; 256 } 257 if (!string.IsNullOrEmpty(user.Address2)) 258 { 259 address.Add(user.Address2); 260 summaryUserFieldCount++; 261 } 262 if (!string.IsNullOrEmpty(user.Zip)) 263 { 264 address.Add(user.Zip); 265 summaryUserFieldCount++; 266 } 267 if (!string.IsNullOrEmpty(user.City)) 268 { 269 address.Add(user.City); 270 summaryUserFieldCount++; 271 } 272 if (!string.IsNullOrEmpty(user.State)) 273 { 274 var countryCode = user.CountryCode; 275 string stateName = Dynamicweb.Ecommerce.Services.Countries.GetRegion(countryCode, user.State)?.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) ?? string.Empty; 276 277 address.Add(stateName); 278 summaryUserFieldCount++; 279 } 280 if (!string.IsNullOrEmpty(user.CountryCode)) 281 { 282 string country = user.Region.DisplayName; 283 address.Add(country); 284 summaryUserFieldCount++; 285 } 286 stepSummaryAddressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 287 } 288 else 289 { 290 291 stepSummaryAddressString = GetUserAddressString(); 292 } 293 294 string editStep = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 295 } 296 297 @if (!string.IsNullOrEmpty(stepSummaryAddressString) && ((summaryUserIsStandardSwiftTemplates && summaryUserFieldCount > 1) || !summaryUserIsStandardSwiftTemplates)) 298 { 299 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 300 <dl class="grid gap-1 gap-sm-3 mb-0"> 301 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Billing")</dt> 302 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@stepSummaryAddressString</dd> 303 @if (!summaryUserHideEditBillingAddress) 304 { 305 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 306 <a href="@editStep" class="btn btn-small btn-link fs-8 p-0" id="EditBillingAddressButton"> 307 <span class="text-uppercase">@Translate("Edit")</span> 308 </a> 309 </dd> 310 } 311 </dl> 312 </div> 313 } 314 315 </text> 316 } 317 318 @if (summaryCurrentStep != 1) 319 { 320 <text> 321 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 322 323 @{ 324 var billingHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 325 326 int billingFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 327 bool summaryBillingIsStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; 328 329 string billingAddressString = string.Empty; 330 if (summaryBillingIsStandardSwiftTemplates) 331 { 332 List<string> address = new List<string>(); 333 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 334 { 335 address.Add(GetString("Ecom:Order.Delivery.Company")); 336 billingFieldCount++; 337 } 338 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 339 { 340 address.Add(GetString("Ecom:Order.Delivery.Name")); 341 billingFieldCount++; 342 } 343 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 344 { 345 address.Add(GetString("Ecom:Order.Delivery.Address")); 346 billingFieldCount++; 347 } 348 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 349 { 350 address.Add(GetString("Ecom:Order.Delivery.Address2")); 351 billingFieldCount++; 352 } 353 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 354 { 355 address.Add(GetString("Ecom:Order.Delivery.Zip")); 356 billingFieldCount++; 357 } 358 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 359 { 360 address.Add(GetString("Ecom:Order.Delivery.City")); 361 billingFieldCount++; 362 } 363 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 364 { 365 string regionName = GetString("Ecom:Order.Delivery.Region"); 366 foreach (LoopItem region in GetLoop("DeliveryRegions")) 367 { 368 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 369 { 370 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 371 } 372 } 373 374 address.Add(regionName); 375 billingFieldCount++; 376 } 377 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 378 { 379 address.Add(GetString("Ecom:Order.Delivery.Country")); 380 billingFieldCount++; 381 } 382 billingAddressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 383 } 384 else 385 { 386 billingAddressString = GetDeliveryAddressString(); 387 } 388 } 389 390 @if (!string.IsNullOrEmpty(billingAddressString) && ((summaryBillingIsStandardSwiftTemplates && billingFieldCount > 1) || !summaryBillingIsStandardSwiftTemplates)) 391 { 392 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 393 <dl class="grid gap-1 gap-sm-3 mb-0"> 394 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Selected address")</dt> 395 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@billingAddressString</dd> 396 397 @if (!billingHideEditBillingAddress) 398 { 399 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 400 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep0" id="EditDeliveryAddressButton"> 401 <span class="text-uppercase">@Translate("Edit")</span> 402 </button> 403 </dd> 404 } 405 </dl> 406 </div> 407 } 408 409 </text> 410 <text> 411 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 412 413 @{ 414 string shippingMethod = GetString("Ecom:Order.ShippingMethod"); 415 } 416 417 @if (!string.IsNullOrEmpty(shippingMethod)) 418 { 419 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 420 <dl class="grid gap-1 gap-sm-3 mb-0"> 421 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery")</dt> 422 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingMethod</dd> 423 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 424 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep1" id="EditDeliveryButton"> 425 <span class="text-uppercase">@Translate("Edit")</span> 426 </button> 427 </dd> 428 </dl> 429 </div> 430 } 431 432 </text> 433 <text> 434 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 435 436 @{ 437 string shippingDate = GetString("Ecom:Order.ShippingDate"), 438 shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(); 439 } 440 441 @if (!string.IsNullOrEmpty(shippingDate)) 442 { 443 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 444 <dl class="grid gap-1 gap-sm-3 mb-0"> 445 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> 446 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> 447 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 448 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep1" id="EditDeliveryDateButton"> 449 <span class="text-uppercase">@Translate("Edit")</span> 450 </button> 451 </dd> 452 </dl> 453 </div> 454 } 455 456 457 </text> 458 } 459 </div> 460 } 461 462 @* Anonymous *@ 463 else 464 { 465 if (summaryCurrentStep != 1) 466 { 467 <div class="list-group"> 468 @{ 469 <text> 470 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 471 472 @{ 473 var summaryCustomerHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 474 int summaryCustomerCurrentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 475 476 List<string> contact = new List<string>(); 477 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 478 { 479 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) 480 { 481 contact.Add(GetString("Ecom:Order.Customer.Email")); 482 } 483 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 484 { 485 contact.Add(GetString("Ecom:Order.Customer.Phone")); 486 } 487 } 488 489 string summaryCustomerContactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 490 string summaryCustomerUserAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 491 } 492 493 @if (!string.IsNullOrEmpty(summaryCustomerContactString)) 494 { 495 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)" id="ContactGroup"> 496 <dl class="grid gap-1 gap-sm-3 mb-0"> 497 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> 498 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@summaryCustomerContactString</dd> 499 500 @if (!summaryCustomerHideEditBillingAddress) 501 { 502 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 503 @if (summaryCustomerCurrentUserId == 0) 504 { 505 <button type="submit" class="btn btn-small btn-link fs-8 p-0" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 506 <span class="text-uppercase">@Translate("Edit")</span> 507 </button> 508 } 509 else 510 { 511 <a href="@summaryCustomerUserAccountPage" class="btn btn-small btn-link fs-8 p-0" id="EditBillingAddressButton"> 512 <span class="text-uppercase">@Translate("Edit")</span> 513 </a> 514 } 515 </dd> 516 } 517 </dl> 518 </div> 519 } 520 521 </text> 522 <text> 523 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 524 525 @{ 526 var billingHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 527 528 int billingFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 529 bool summaryBillingIsStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; 530 531 string billingAddressString = string.Empty; 532 if (summaryBillingIsStandardSwiftTemplates) 533 { 534 List<string> address = new List<string>(); 535 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 536 { 537 address.Add(GetString("Ecom:Order.Delivery.Company")); 538 billingFieldCount++; 539 } 540 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 541 { 542 address.Add(GetString("Ecom:Order.Delivery.Name")); 543 billingFieldCount++; 544 } 545 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 546 { 547 address.Add(GetString("Ecom:Order.Delivery.Address")); 548 billingFieldCount++; 549 } 550 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 551 { 552 address.Add(GetString("Ecom:Order.Delivery.Address2")); 553 billingFieldCount++; 554 } 555 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 556 { 557 address.Add(GetString("Ecom:Order.Delivery.Zip")); 558 billingFieldCount++; 559 } 560 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 561 { 562 address.Add(GetString("Ecom:Order.Delivery.City")); 563 billingFieldCount++; 564 } 565 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 566 { 567 string regionName = GetString("Ecom:Order.Delivery.Region"); 568 foreach (LoopItem region in GetLoop("DeliveryRegions")) 569 { 570 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 571 { 572 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 573 } 574 } 575 576 address.Add(regionName); 577 billingFieldCount++; 578 } 579 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 580 { 581 address.Add(GetString("Ecom:Order.Delivery.Country")); 582 billingFieldCount++; 583 } 584 billingAddressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 585 } 586 else 587 { 588 billingAddressString = GetDeliveryAddressString(); 589 } 590 } 591 592 @if (!string.IsNullOrEmpty(billingAddressString) && ((summaryBillingIsStandardSwiftTemplates && billingFieldCount > 1) || !summaryBillingIsStandardSwiftTemplates)) 593 { 594 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 595 <dl class="grid gap-1 gap-sm-3 mb-0"> 596 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Selected address")</dt> 597 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@billingAddressString</dd> 598 599 @if (!billingHideEditBillingAddress) 600 { 601 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 602 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep0" id="EditDeliveryAddressButton"> 603 <span class="text-uppercase">@Translate("Edit")</span> 604 </button> 605 </dd> 606 } 607 </dl> 608 </div> 609 } 610 611 </text> 612 } 613 614 @if (summaryCurrentStep > 2) 615 { 616 <text> 617 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 618 619 @{ 620 string shippingMethod = GetString("Ecom:Order.ShippingMethod"); 621 } 622 623 @if (!string.IsNullOrEmpty(shippingMethod)) 624 { 625 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 626 <dl class="grid gap-1 gap-sm-3 mb-0"> 627 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery")</dt> 628 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingMethod</dd> 629 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 630 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep1" id="EditDeliveryButton"> 631 <span class="text-uppercase">@Translate("Edit")</span> 632 </button> 633 </dd> 634 </dl> 635 </div> 636 } 637 638 </text> 639 <text> 640 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 641 642 @{ 643 string shippingDate = GetString("Ecom:Order.ShippingDate"), 644 shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(); 645 } 646 647 @if (!string.IsNullOrEmpty(shippingDate)) 648 { 649 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 650 <dl class="grid gap-1 gap-sm-3 mb-0"> 651 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> 652 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> 653 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 654 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep1" id="EditDeliveryDateButton"> 655 <span class="text-uppercase">@Translate("Edit")</span> 656 </button> 657 </dd> 658 </dl> 659 </div> 660 } 661 662 663 </text> 664 } 665 @if (summaryCurrentStep > 3) 666 { 667 <text> 668 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 669 670 @{ 671 string PaymentMethodID = GetString("Ecom:Order.ShippingMethodID"); 672 string paymentMethod = GetString("Ecom:Order.PaymentMethod"); 673 } 674 675 @if(!string.IsNullOrEmpty(PaymentMethodID)) 676 { 677 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 678 <dl class="grid gap-1 gap-sm-3 mb-0"> 679 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Payment")</dt> 680 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@paymentMethod</dd> 681 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 682 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep2" id="EditPaymentButton"> 683 <span class="text-uppercase">@Translate("Edit")</span> 684 </button> 685 </dd> 686 </dl> 687 </div> 688 } 689 690 </text> 691 <text> 692 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 693 694 @{ 695 string stepSummaryOrderReference = !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Reference")) ? GetString("Ecom:Order.Reference") : ""; 696 697 if (!string.IsNullOrEmpty(stepSummaryOrderReference)) 698 { 699 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 700 <dl class="grid gap-1 gap-sm-3 mb-0"> 701 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Order reference")</dt> 702 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@stepSummaryOrderReference</dd> 703 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 704 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep2" id="EditorderReferenceButton"> 705 <span class="text-uppercase">@Translate("Edit")</span> 706 </button> 707 </dd> 708 </dl> 709 </div> 710 } 711 } 712 713 </text> 714 } 715 </div> 716 } 717 } 718 } 719 720 721 722 723 724 725 726 727 728 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 729 730 @{ 731 string apiKey = !string.IsNullOrEmpty(Pageview.AreaSettings.GetString("Google_APIKey")) ? Pageview.AreaSettings.GetString("Google_APIKey") : ""; 732 733 string userCheckoutPage = Pageview.CurrentParagraph.Item["CheckoutUserPageLink"] != null ? Pageview.CurrentParagraph.Item["CheckoutUserPageLink"].ToString().Replace("Default.aspx?Id=", "") : ""; 734 string signInPage = Pageview.CurrentParagraph.Item["SignInPageLink"] != null ? Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() + "&GoBackToPage=" + userCheckoutPage : ""; 735 bool enableAdditionalAddress = Pageview.CurrentParagraph.Item["EnableAdditionalAddress"] != null ? (Boolean)Pageview.CurrentParagraph.Item["EnableAdditionalAddress"] : false; 736 bool enableFindLocation = Pageview.CurrentParagraph.Item["EnableFindLocation"] != null ? (Boolean)Pageview.CurrentParagraph.Item["EnableFindLocation"] : false; 737 738 string currentCountry = Pageview.Area?.EcomCountryCode != null ? Pageview.Area.EcomCountryCode : "dk"; 739 foreach (LoopItem country in GetLoop("Countries")) 740 { 741 if (country.GetString("Ecom:Country.IsDeliveryCountryOrDefault") == "true") 742 { 743 currentCountry = country.GetString("Ecom:Country.Code2"); 744 } 745 } 746 747 string countrySelectorColumnSize = "g-col-6"; 748 string deliveryRegionLabel = "State"; 749 750 bool isStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; 751 } 752 753 754 <input type="hidden" name="EcomUserCreateNew" id="EcomUserCreateNew" value="true" disabled> 755 756 <div class="mb-0"> 757 <div class="d-flex"> 758 <div class="flex-grow-1"> 759 <h3 class="fs-6 fw-normal mb-3">@Translate("Contact information")</h3> 760 </div> 761 @if (Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() != string.Empty) 762 { 763 <div class="text-end d-none d-md-block"> 764 <a href="@signInPage" class="h6 fw-normal mb-3 d-block">@Translate("Already have account?") @Translate("Log in")</a> 765 </div> 766 } 767 768 </div> 769 </div> 770 771 <div class="mb-4"> 772 <div class="grid"> 773 <div class="g-col-12"> 774 <div class="form-floating"> 775 <input type="email" class="form-control" name="EcomOrderCustomerEmail" id="EcomOrderCustomerEmail" value="@GetString("Ecom:Order.Customer.Email")" placeholder="@Translate("Email Address")"> 776 <label for="EcomOrderCustomerEmail">@Translate("Email Address")</label> 777 </div> 778 </div> 779 @if (Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() != string.Empty) 780 { 781 <div class="g-col-12 d-md-none"> 782 <a href="@signInPage">@Translate("Already have account?") @Translate("Log in")</a> 783 </div> 784 } 785 @* Use newsletter *@ 786 @if (GetString("Ecom:Cart.UseNewsletterSubscription") == "True") 787 { 788 bool? isChecked = null; 789 if (GetString("Ecom:Order.Customer.NewsletterSubscribe") == "true") 790 { 791 isChecked = true; 792 } 793 794 <div class="g-col-12"> 795 <div class="form-check"> 796 <input class="form-check-input" type="checkbox" name="EcomOrderSubscribeToNewsletter" id="EcomOrderSubscribeToNewsletter" checked="@isChecked" onchange="toggleCreateUser(event);"> 797 <label class="form-check-label lh-1" for="EcomOrderSubscribeToNewsletter"> 798 <span>@Translate("Keep me updated with deals, news and offers")</span> 799 </label> 800 </div> 801 </div> 802 } 803 </div> 804 </div> 805 806 <div class="mt-4"> 807 808 <h3 class="fs-6 fw-normal mb-3">@Translate("Delivery address")</h3> 809 810 <div class="grid gap-3"> 811 @{ 812 if (isStandardSwiftTemplates) 813 { 814 <div class="g-col-12"> 815 <div class="form-floating"> 816 <input type="text" class="form-control" name="EcomOrderDeliveryCompany" id="EcomOrderDeliveryCompany" value="@GetString("Ecom:Order.Delivery.Company")" placeholder="@Translate("Company")"> 817 <label for="EcomOrderDeliveryCompany">@Translate("Company (Optional)")</label> 818 </div> 819 </div> 820 821 <div class="g-col-12"> 822 <div class="form-floating"> 823 <input type="text" class="form-control" name="EcomOrderDeliveryName" id="EcomOrderDeliveryName" value="@GetString("Ecom:Order.Delivery.Name")" placeholder="@Translate("Name")"> 824 <label for="EcomOrderDeliveryName">@Translate("Name")</label> 825 </div> 826 </div> 827 828 <div class="g-col-12"> 829 <div class="form-floating"> 830 <input type="text" class="form-control" name="EcomOrderDeliveryAddress" id="EcomOrderDeliveryAddress" value="@GetString("Ecom:Order.Delivery.Address")" placeholder="@Translate("Street & Number")"> 831 <label for="EcomOrderDeliveryAddress">@Translate("Street & Number")</label> 832 </div> 833 </div> 834 835 if (enableAdditionalAddress) 836 { 837 <div class="g-col-12"> 838 <div class="form-floating"> 839 <input type="text" class="form-control" name="EcomOrderDeliveryAddress2" id="EcomOrderDeliveryAddress2" value="@GetString("Ecom:Order.Delivery.Address2")" placeholder="@Translate("Additional address")"> 840 <label for="EcomOrderDeliveryAddress">@Translate("Additional address")</label> 841 </div> 842 </div> 843 } 844 845 <div class="g-col-12"> 846 <div class="grid"> 847 848 <div class="g-col-6 g-col-md-3"> 849 <div class="form-floating"> 850 <input type="text" class="form-control" name="EcomOrderDeliveryZip" id="EcomOrderDeliveryZip" value="@GetString("Ecom:Order.Delivery.Zip")" placeholder="@Translate("Zip code")"> 851 <label for="EcomOrderDeliveryZip">@Translate("Zip code")</label> 852 </div> 853 </div> 854 855 @if (GetLoop("DeliveryRegions").Count > 0) 856 { 857 countrySelectorColumnSize = "g-col-3"; 858 } 859 860 <div class="@countrySelectorColumnSize"> 861 <div class="form-floating"> 862 <input type="text" class="form-control" name="EcomOrderDeliveryCity" id="EcomOrderDeliveryCity" value="@GetString("Ecom:Order.Delivery.City")" placeholder="@Translate("Town / City")"> 863 <label for="EcomOrderDeliveryCity">@Translate("Town / City")</label> 864 </div> 865 </div> 866 867 @if (GetLoop("DeliveryRegions").Count > 0) 868 { 869 if (currentCountry == "CA") 870 { 871 deliveryRegionLabel = Translate("Province"); 872 } 873 else if (currentCountry == "GB") 874 { 875 deliveryRegionLabel = Translate("Region"); 876 } 877 else if (currentCountry == "US") 878 { 879 deliveryRegionLabel = Translate("State"); 880 } 881 882 <div class="g-col-3"> 883 <div class="form-floating"> 884 <select class="form-select" name="EcomOrderDeliveryRegion" id="EcomOrderDeliveryRegion" onchange="submitForm()"> 885 @foreach (LoopItem region in GetLoop("DeliveryRegions")) 886 { 887 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 888 { 889 <option value="@region.GetString("Ecom:DeliveryRegion.RegionCode")" selected>@region.GetString("Ecom:DeliveryRegion.Name")</option> 890 } 891 else 892 { 893 <option value="@region.GetString("Ecom:DeliveryRegion.RegionCode")">@region.GetString("Ecom:DeliveryRegion.Name")</option> 894 } 895 } 896 </select> 897 <label for="EcomOrderDeliveryRegion">@deliveryRegionLabel</label> 898 </div> 899 </div> 900 } 901 902 <div class="g-col-12 g-col-md-3"> 903 <div class="form-floating"> 904 905 <select class="form-select" name="EcomOrderDeliveryCountry" id="EcomOrderDeliveryCountry" onchange="submitForm()"> 906 @foreach (LoopItem country in GetLoop("Countries")) 907 { 908 if (country.GetString("Ecom:Country.IsDeliveryCountryOrDefault") == "true") 909 { 910 <option value="@country.GetString("Ecom:Country.Code2")" selected>@country.GetString("Ecom:Country.Name")</option> 911 } 912 else 913 { 914 <option value="@country.GetString("Ecom:Country.Code2")">@country.GetString("Ecom:Country.Name")</option> 915 } 916 } 917 </select> 918 <label for="EcomOrderDeliveryCountry">@Translate("Country")</label> 919 </div> 920 </div> 921 922 </div> 923 </div> 924 } 925 else 926 { 927 <text> 928 @RenderDeliveryAddressEdit(enableAdditionalAddress) 929 </text> 930 } 931 932 <div class="g-col-12"> 933 <div class="form-floating"> 934 <input type="tel" class="form-control" name="EcomOrderDeliveryPhone" id="EcomOrderDeliveryPhone" value="@GetString("Ecom:Order.Delivery.Phone")" placeholder="@Translate("Phone number")"> 935 <label for="EcomOrderDeliveryPhone">@Translate("Phone number")</label> 936 </div> 937 </div> 938 } 939 940 @* Create user *@ 941 @if (GetBoolean("Ecom:Cart.CreateUserInCheckout")) 942 { 943 <div class="g-col-12"> 944 <div class="form-check"> 945 <input class="form-check-input" type="checkbox" id="EcomUserCreateNewToggle" value="true" onchange="toggleCreateUser(event);"> 946 <label class="form-check-label lh-1" for="EcomUserCreateNewToggle"> 947 <span>@Translate("Create an account for easier checkout next time")</span> 948 </label> 949 </div> 950 </div> 951 952 <div class="d-none g-col-12 grid" id="PasswordFields"> 953 <div class="g-col-12"> 954 <div class="form-floating"> 955 <input type="password" disabled class="form-control" name="EcomUserCreatePassword" id="EcomUserCreatePassword" placeholder="@Translate("Password")"> 956 <label for="EcomUserCreatePassword">@Translate("Password")</label> 957 </div> 958 </div> 959 960 <div class="g-col-12"> 961 <div class="form-floating"> 962 <input type="password" disabled class="form-control" name="EcomUserCreateConfirmPassword" id="EcomUserCreateConfirmPassword" placeholder="@Translate("Confirm password")"> 963 <label for="EcomUserCreateConfirmPassword">@Translate("Confirm password")</label> 964 </div> 965 </div> 966 </div> 967 968 <script> 969 toggleCreateUser = function (event) { 970 var newsletterSubscribeCheckbox = document.querySelector("#EcomOrderSubscribeToNewsletter"); 971 var createUserToggleCheckbox = document.querySelector("#EcomUserCreateNewToggle"); 972 var createUserCheckbox = document.querySelector("#EcomUserCreateNew"); 973 974 if (newsletterSubscribeCheckbox.checked == true || createUserToggleCheckbox.checked == true) { 975 createUserCheckbox.disabled = false; 976 } else { 977 createUserCheckbox.disabled = true; 978 } 979 980 if (createUserToggleCheckbox.checked == true) { 981 document.querySelector("#EcomUserCreatePassword").disabled = false; 982 document.querySelector("#EcomUserCreateConfirmPassword").disabled = false; 983 document.querySelector('#PasswordFields').classList.remove('d-none'); 984 } else { 985 document.querySelector("#EcomUserCreatePassword").disabled = true; 986 document.querySelector("#EcomUserCreateConfirmPassword").disabled = true; 987 document.querySelector('#PasswordFields').classList.add('d-none'); 988 } 989 } 990 </script> 991 } 992 </div> 993 994 </div> 995 996 @if (enableFindLocation && !string.IsNullOrEmpty(apiKey)) { 997 <script type="module"> 998 const assetLink = 'https://maps.googleapis.com/maps/api/js?key=@(apiKey)&libraries=places'; 999 1000 let assetFound = false; 1001 document.head.querySelectorAll('script').forEach(element => { 1002 if (assetLink == element.src) { 1003 assetFound = true; 1004 } 1005 }); 1006 1007 swift.AssetLoader.Load(assetLink, 'js'); 1008 1009 if (!assetFound) { 1010 document.addEventListener('load.swift.assetloader', function() { 1011 var mapSettings = { currentCountry: "@currentCountry" }; 1012 swift.Places.init(mapSettings); 1013 }); 1014 } else if (typeof google !== 'undefined') { 1015 var mapSettings = { currentCountry: "@currentCountry" }; 1016 swift.Places.init(mapSettings); 1017 } 1018 </script> 1019 } 1020 1021 1022 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1023 1024 @{ 1025 string stepsIconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 1026 int currentStep = 1; 1027 string nextButtonName = Translate("Next"); 1028 string previousButtonName = Translate("Back"); 1029 1030 bool isErpConnectionDown = !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); 1031 string erpDownCartBehavior = Pageview.AreaSettings.GetRawValueString("ErpDownCartBehavior", "none"); 1032 1033 foreach (LoopItem step in GetLoop("StepButtons")) 1034 { 1035 if (step.GetBoolean("Step.Current")) 1036 { 1037 currentStep = step.GetInteger("Step.Number"); 1038 } 1039 1040 if (step.GetInteger("Step.Number") == currentStep + 1) 1041 { 1042 nextButtonName = Translate(step.GetString("Step.Name")); 1043 } 1044 1045 if (step.GetInteger("Step.Number") == currentStep + step.GetInteger("Step.Index")) 1046 { 1047 previousButtonName = Translate("Back to") + " " + Translate(step.GetString("Step.Name")); 1048 } 1049 } 1050 1051 if (currentStep == GetLoop("StepButtons").Count - 1 && Pageview.CurrentParagraph.Item.SystemName != "Swift_QuoteCheckoutApp") 1052 { 1053 <text> 1054 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1055 1056 @{ 1057 string termsAndConditionsCheckboxValue = GetBoolean("Ecom:Order.Customer.Accepted").ToString(); 1058 string termsAndConditionsPageLink = Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"] != null ? Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"].ToString() : string.Empty; 1059 } 1060 1061 @if (!string.IsNullOrEmpty(termsAndConditionsPageLink)) 1062 { 1063 <div class="mt-4" id="TermsAndConditions"> 1064 <h3 class="fs-6 fw-normal mb-0">@Translate("Terms and conditions")</h3> 1065 <p class="fs-8 mb-3">@Translate("Agree to terms and conditions and that your informations are correct")</p> 1066 <div class="list-group"> 1067 <label class="list-group-item list-group-item-action d-flex justify-content-between" for="EcomOrderCustomerAccepted"> 1068 <span class="d-flex justify-content-between align-items-center gap-3"> 1069 <input class="form-check-input m-0" type="checkbox" name="EcomOrderCustomerAccepted" id="EcomOrderCustomerAccepted" value="@termsAndConditionsCheckboxValue" @if (GetString("Ecom:Order.Customer.Accepted") == "true") { <text> checked="checked" </text> }> 1070 <span>@Translate("I accept the") <a href='/@termsAndConditionsPageLink' target='_blank' rel='noopener' id="TermsAndConditionsButton">@Translate("terms and conditions")</a></span> 1071 </span> 1072 </label> 1073 </div> 1074 </div> 1075 } 1076 1077 1078 </text> 1079 1080 nextButtonName = Translate("Place Order"); 1081 } 1082 else if (GetLoop("StepButtons").Count == 0) 1083 { 1084 nextButtonName = Translate("Pay"); 1085 } 1086 } 1087 1088 <div class="mt-4 d-flex flex-column flex-md-row justify-content-end gap-3 mt-lg-4" id="StepsNavigation"> 1089 @if (currentStep == 1) 1090 { 1091 var cartLink = $"Default.aspx?id={Pageview.CurrentParagraph.Page.Parent.ID}"; 1092 1093 <a href="@cartLink" class="btn btn-link link-secondary text-decoration-none order-last order-md-first" id="BackToCartButton"> 1094 <div class="d-flex align-items-center justify-content-center position-relative"> 1095 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1096 @ReadFile(stepsIconPath + "chevron-left.svg") 1097 </span> 1098 <span>@Translate("Back to cart")</span> 1099 </div> 1100 </a> 1101 } 1102 else 1103 { 1104 <button name="@GetString("CartV2.PreviousStepButtonName")" id="@GetString("CartV2.PreviousStepButtonName")" class="btn btn-link link-secondary text-decoration-none"> 1105 <div class="d-flex align-items-center justify-content-center position-relative"> 1106 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1107 @ReadFile(stepsIconPath + "chevron-left.svg") 1108 </span> 1109 <span>@previousButtonName</span> 1110 </div> 1111 </button> 1112 } 1113 1114 @if (!(currentStep == GetLoop("StepButtons").Count - 1 && isErpConnectionDown && erpDownCartBehavior == "disable")) 1115 { 1116 var buttonId = GetLoop("StepButtons").Count == 0 ? "PayButton" : GetString("CartV2.NextStepButtonName"); 1117 <button type="submit" name="@GetString("CartV2.NextStepButtonName")" id="@buttonId" class="btn btn-primary order-first order-md-last" > 1118 <div class="d-flex align-items-center justify-content-center position-relative pe-none"> 1119 <span>@nextButtonName</span> 1120 <span class="icon-2 ms-1 position-absolute position-md-static end-0"> 1121 @ReadFile(stepsIconPath + "chevron-right.svg") 1122 </span> 1123 </div> 1124 </button> 1125 1126 @* // SHIPMONDO 1127 Following script prevents writing pickup point address to order.delivery 1128 before finalizing the order. 1129 *@ 1130 if (currentStep == GetLoop("StepButtons").Count - 1) 1131 { 1132 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 1133 { 1134 <input type="hidden" name="@GetString("CartV2.NextStepButtonName")" /> 1135 <script> 1136 document.getElementById("@GetString("CartV2.NextStepButtonName")").addEventListener("click", function (e) { 1137 const form = e.target.closest("form"), 1138 hiddenParcelShopFields = form.querySelector("#hiddenParcelshopFields"), 1139 hiddenParcelShopFieldsDisabled = hiddenParcelShopFields.querySelectorAll("input"); 1140 1141 e.preventDefault(); 1142 1143 if (hiddenParcelShopFieldsDisabled.length > 0) { 1144 hiddenParcelShopFieldsDisabled.forEach( (input) => { 1145 input.disabled = false; 1146 }); 1147 } 1148 1149 form.submit() 1150 }); 1151 </script> 1152 } 1153 } 1154 } 1155 else 1156 { 1157 <button class="btn btn-primary pe-none disabled">@Translate("Payment is temporarily disabled")</button> 1158 } 1159 1160 <script> 1161 if (window.history.replaceState) { 1162 window.history.replaceState(null, null, window.location.href); 1163 } 1164 </script> 1165 </div> 1166 1167 1168 <input type="hidden" id="CurrentStep"> 1169 </form> 1170 </div> 1171 1172 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1173 1174 <div class="g-col-12 g-col-lg-4 py-2 p-3 p-lg-4 p-xl-5" id="summarySidebar"> 1175 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1176 1177 @{ 1178 string iconPath = "/Files/Icons/"; 1179 } 1180 1181 <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="#orderSummary" aria-expanded="false" aria-controls="orderSummary" id="OrderSummaryToggleButton"> 1182 <span class="d-flex align-items-center justify-content-between"> 1183 <span class="d-flex align-items-center gap-2"> 1184 <span class="fs-7 lh-1"> 1185 <span class="toggle-order-summary-text" id="OrderSummaryToggleButtonLabel">@Translate("Show order summary")</span> 1186 </span> 1187 <span class="icon-2" id="OrderSummaryToggleButtonIcon" style="transition: all 0.25s ease-in-out;"> 1188 @ReadFile(iconPath + "chevron-down.svg") 1189 </span> 1190 </span> 1191 <span class="fw-bold"> 1192 <span class="text-price">@GetString("Ecom:Order.Price")</span> 1193 </span> 1194 </span> 1195 </button> 1196 1197 <script> 1198 const orderSummaryToggleButton = document.getElementById("OrderSummaryToggleButton"); 1199 const orderSummaryToggleButtonLabel = document.getElementById("OrderSummaryToggleButtonLabel"); 1200 const orderSummaryToggleButtonIcon = document.getElementById("OrderSummaryToggleButtonIcon"); 1201 const orderSummaryToggleText = '@Translate("Show order summary")'; 1202 1203 orderSummaryToggleButton.addEventListener('click', function handleClick() { 1204 if (orderSummaryToggleButtonLabel.textContent.toLowerCase().includes(orderSummaryToggleText.toLowerCase())) { 1205 orderSummaryToggleButtonLabel.textContent = '@Translate("Hide order summary")'; 1206 orderSummaryToggleButtonIcon.classList.add("rotate-180"); 1207 } else { 1208 orderSummaryToggleButtonLabel.textContent = orderSummaryToggleText; 1209 orderSummaryToggleButtonIcon.classList.remove("rotate-180"); 1210 } 1211 }); 1212 </script> 1213 1214 1215 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1216 1217 <div class="d-lg-block h-lg-auto collapse pt-2 pt-lg-0" id="orderSummary"> 1218 <div class="d-flex flex-column gap-2 gap-lg-3 pb-2 pb-lg-3"> 1219 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1220 @using Dynamicweb.Ecommerce.ProductCatalog 1221 1222 @functions { 1223 private static string GetPrimaryImage(LoopItem orderline, string shopId) 1224 { 1225 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber 1226 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 1227 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1228 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 1229 1230 if (!isProduct || string.IsNullOrEmpty(productId)) return ""; 1231 1232 ProductViewModelSettings productSetting = new ProductViewModelSettings 1233 { 1234 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 1235 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 1236 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 1237 ShopId = shopId 1238 }; 1239 ProductViewModel product = ViewModelFactory.CreateView(productSetting, productId, variantId); 1240 return product.DefaultImage.Value; 1241 } 1242 } 1243 1244 @{ 1245 var orderlines = GetLoop("OrderLines"); 1246 } 1247 1248 @for (int i = orderlines.Count - 1; i >= 0; i--) 1249 { 1250 var orderline = orderlines[i]; 1251 string name = orderline.GetString("Ecom:Order:OrderLine.ProductName"); 1252 string orderlineImage = GetPrimaryImage(orderline, GetString("Ecom:Order.ShopID")); 1253 string image = $"/Admin/Public/GetImage.ashx?width=180&height=180&crop=5&fillcanvas=true&Background=ffffff&image={Dynamicweb.Context.Current.Server.UrlEncode(orderlineImage)}&format=webp"; 1254 image = !orderlineImage.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? orderlineImage : image; 1255 string removeFromBasketLink = orderline.GetString("Ecom:Order:OrderLine.DeleteLink"); 1256 string priceTotalWithDiscounts = orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted"); 1257 string priceBefore = orderline.GetString("Ecom:Product.InformativePrice.PriceFormatted"); 1258 string unitPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPrice.PriceFormatted"); 1259 string discountPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPriceWithProductDiscount.PriceFormatted"); 1260 string discountTotal = orderline.GetString("Ecom:Order:OrderLine.TotalDiscount.PriceFormatted"); 1261 string variantText = orderline.GetString("Ecom:Order:OrderLine.ProductVariantText"); 1262 var orderlineId = orderline.GetValue("Ecom:Order:OrderLine.Id"); 1263 var quantity = orderline.GetDouble("Ecom:Order:OrderLine.Quantity"); 1264 var unitName = orderline.GetString("Ecom:Order:OrderLine.UnitName"); 1265 string primaryGroupId = orderline.GetString("Ecom:Order:OrderLine.PrimaryOrDefaultGroupId"); 1266 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1267 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 1268 1269 string link = "Default.aspx?ID=" + GetPageIdByNavigationTag("Shop"); 1270 link += $"&GroupID={primaryGroupId}"; 1271 link += $"&ProductID={productId}"; 1272 link += !string.IsNullOrEmpty(variantId) ? $"&VariantID={variantId}" : ""; 1273 1274 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber 1275 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 1276 1277 if (isProduct) 1278 { 1279 <article class="grid grid-12"> 1280 1281 <div class="g-col-2"> 1282 <a href="@link" class="ratio ratio-1x1 d-block " title="@name"> 1283 <img src="@image" style="object-fit: contain;" alt="@name"> 1284 </a> 1285 </div> 1286 1287 <div class="g-col-10"> 1288 1289 <div class="d-flex flex-column gap-1"> 1290 @* Title *@ 1291 <h3 class="h6 fs-7 m-0"> 1292 <a href="@link" class="text-decoration-none" title="@name">@name</a> 1293 </h3> 1294 1295 @* Variants *@ 1296 @if (!string.IsNullOrEmpty(variantText)) 1297 { 1298 <p class="fs-8 m-0">@variantText</p> 1299 } 1300 1301 @if (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount")) 1302 { 1303 @* Free product notice *@ 1304 <p class="fs-8 m-0">@Translate("Free product")</p> 1305 } 1306 else 1307 { 1308 @* Unit price *@ 1309 <p class="fs-8 m-0"> 1310 @if (!string.IsNullOrEmpty(unitName)) 1311 { 1312 <span>@unitName: </span> 1313 } 1314 @if (discountPrice == unitPrice) 1315 { 1316 <span class="text-price">@unitPrice</span> 1317 } 1318 else 1319 { 1320 <span class="text-price">@discountPrice</span> 1321 <span class="text-decoration-line-through"> 1322 <span class="text-price">@unitPrice</span> 1323 </span> 1324 } 1325 </p> 1326 } 1327 <div class="d-flex flex-row justify-content-between"> 1328 @* Quantity *@ 1329 <span class="fs-8 d-block">@Translate("Qty"): @quantity</span> 1330 1331 <div class="text-end flex-fill"> 1332 @* Total *@ 1333 <span class="h6 d-block fs-7 m-0"> 1334 <span class="text-price">@priceTotalWithDiscounts</span> 1335 </span> 1336 @if (orderline.GetDouble("Ecom:Order:OrderLine.TotalDiscount.Price.Value") != 0.0) 1337 { 1338 <span class="d-block fs-8"> 1339 <span class="text-price">@discountTotal</span> 1340 </span> 1341 } 1342 </div> 1343 </div> 1344 </div> 1345 </div> 1346 </article> 1347 } 1348 } 1349 1350 </div> 1351 1352 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1353 1354 @{ 1355 double totalPriceWithoutOrderDiscountsFeesAndTaxesValue = GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") + GetDouble("Ecom:Order.TotalProductDiscount.Price.Value"); 1356 var orderCurrency = Dynamicweb.Ecommerce.Services.Currencies.GetCurrency(GetString("Ecom:Order.Currency.Code")); 1357 string totalPriceWithoutOrderDiscountsFeesAndTaxes = Dynamicweb.Ecommerce.Services.Currencies.Format(orderCurrency, totalPriceWithoutOrderDiscountsFeesAndTaxesValue); 1358 1359 string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); 1360 bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); 1361 1362 bool disableVouchers = Pageview.CurrentParagraph?.Item["DisableVouchers"] != null ? (Boolean)Pageview.CurrentParagraph.Item["DisableVouchers"] : false; 1363 disableVouchers = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("CompletedOrderId")) ? true : disableVouchers; 1364 1365 <div class="d-flex flex-column gap-2 gap-lg-3 pb-3 bottom-0 sticky-receipt theme" id="orderSummaryFooter"> 1366 1367 @if (!disableVouchers && Pageview.CurrentParagraph?.Item.SystemName != "Swift_QuoteCheckoutApp") 1368 { 1369 <text> 1370 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1371 @using Dynamicweb.Ecommerce.Orders 1372 1373 @{ 1374 string voucherCode = GetString("Ecom:Order.Customer.VoucherCode"); 1375 string voucherCodeError = GetString("Ecom:Cart.ValidationError.EcomOrderVoucherCode.ErrorMessage"); 1376 string validState = !string.IsNullOrEmpty(voucherCodeError) ? "is-invalid" : string.Empty; 1377 bool vouchersAppliedAsDiscounts = false; 1378 1379 IEnumerable<string> voucherCodes = new List<string>(); 1380 Order order = new OrderService().GetById(GetString("Ecom:Order.ID")); 1381 1382 if (!string.IsNullOrWhiteSpace(voucherCode)) 1383 { 1384 if (order.VoucherUseType.HasFlag(VoucherUseCategoryType.Discount)) 1385 { 1386 voucherCodes = voucherCode.Split(new string[] { ",", ";", " " }, StringSplitOptions.RemoveEmptyEntries); 1387 vouchersAppliedAsDiscounts = true; 1388 } 1389 else 1390 { 1391 voucherCodes = new string[] { voucherCode.Trim() }; 1392 } 1393 } 1394 1395 <div class="py-3 border-top" id="orderVoucherForm"> 1396 <form method="post" id="VoucherForm"> 1397 <div class="input-group input-primary-button-group has-validation"> 1398 <input type="text" class="form-control @(validState)" name="EcomOrderVoucherCodeField" placeholder="@Translate("Add voucher here")" id="EcomOrderVoucherCodeField" value="" aria-label="@Translate("Voucher input")" oninput="document.querySelector('#EcomOrderVoucherCode').value = this.value;" onkeyup="document.querySelector('#EcomOrderVoucherCode').value = this.value;"> 1399 <button class="btn btn-sm btn-primary d-inline-flex align-items-center justify-content-center" type="submit" id="EcomOrderVoucherApply" style="min-width: 100px;"> 1400 <span>@Translate("Apply")</span> 1401 </button> 1402 <div class="invalid-feedback"> 1403 @voucherCodeError 1404 </div> 1405 </div> 1406 <input type="hidden" name="EcomOrderVoucherCode" id="EcomOrderVoucherCode" value="@voucherCode"> 1407 <label for="EcomOrderVoucherCodeField" class="visually-hidden">@Translate("Add voucher here")</label> 1408 </form> 1409 1410 @if (!string.IsNullOrWhiteSpace(voucherCode)) 1411 { 1412 <div class="d-flex flex-wrap gap-2 pt-3"> 1413 @foreach (string code in voucherCodes) 1414 { 1415 <form method="post"> 1416 @{ 1417 Dynamicweb.Ecommerce.Orders.Vouchers.Voucher vouch = Dynamicweb.Ecommerce.Services.Vouchers.GetVoucherByCode(code); 1418 string voucherValue = string.Empty; 1419 if (vouch != null && !vouch.DateUsed.HasValue) { 1420 voucherValue = voucherCode.Replace(code+",", "").Replace(","+code, "").Replace(code, ""); 1421 } 1422 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherValue"> 1423 } 1424 <span class="badge fw-normal d-inline-flex align-items-center justify-content-center opacity-50 opacity-100-hover" style="background-color:var(--swift-foreground-color);color:var(--swift-background-color);"> 1425 <span class="icon-2"> 1426 @ReadFile("/Files/Templates/Designs/Swift/Assets/icons/tag.svg") 1427 </span> 1428 <span class="mx-2">@code</span> 1429 <button type="submit" class="text-reset bg-transparent border-0 p-0" aria-label="@Translate("Remove voucher")" id="RemoveVoucherButton"> 1430 <span class="icon-2"> 1431 @ReadFile("/Files/Templates/Designs/Swift/Assets/icons/x.svg") 1432 </span> 1433 </button> 1434 </span> 1435 </form> 1436 } 1437 </div> 1438 } 1439 </div> 1440 } 1441 1442 </text> 1443 } 1444 1445 <div class="fs-8 border-top pt-2 pt-lg-3"> 1446 @* Subtotal *@ 1447 <div class="d-flex justify-content-between fw-bold"> 1448 <span>@Translate("Subtotal")</span> 1449 <span class="text-end"> 1450 <span class="d-block"> 1451 @if (GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") != totalPriceWithoutOrderDiscountsFeesAndTaxesValue) 1452 { 1453 <span class="text-price fw-normal text-decoration-line-through">@GetString("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.PriceFormatted")</span> 1454 } 1455 <span class="text-price">@totalPriceWithoutOrderDiscountsFeesAndTaxes</span> 1456 </span> 1457 1458 @if (!neverShowVat && showPricesWithVat == "false") 1459 { 1460 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1461 } 1462 else if (!neverShowVat) 1463 { 1464 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1465 } 1466 </span> 1467 </div> 1468 1469 @* Discounts (only order discounts) *@ 1470 @foreach (LoopItem orderline in GetLoop("OrderLines")) 1471 { 1472 bool isDiscount = orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount"); 1473 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber 1474 bool isOrderAmountDiscount = orderline.GetInteger("Ecom:Order:OrderLine.Type") == 1 && !isProductIdOrNumber; 1475 if (isDiscount && isOrderAmountDiscount) 1476 { 1477 <div class="d-flex justify-content-between"><span>@orderline.GetString("Ecom:Order:OrderLine.ProductName")</span><span class="text-price">@orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted")</span></div> 1478 } 1479 } 1480 1481 @* Delivery *@ 1482 @if (!string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID"))) 1483 { 1484 if (GetDouble("Ecom:Order.ShippingFee.Price.Value") != 0.0) 1485 { 1486 <div class="d-flex justify-content-between"> 1487 <span>@Translate("Delivery")</span> 1488 <span>@GetString("Ecom:Order.ShippingFee.PriceFormatted")</span> 1489 </div> 1490 } 1491 } 1492 else 1493 { 1494 <div class="d-flex justify-content-between"> 1495 <span>@Translate("Delivery")</span> 1496 <span>@Translate("Calculated in next step")</span> 1497 </div> 1498 } 1499 1500 @* Payment *@ 1501 @if (!string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID"))) 1502 { 1503 if (GetDouble("Ecom:Order.PaymentFee.Price.Value") != 0) 1504 { 1505 <div class="d-flex justify-content-between"> 1506 <span>@Translate("Payment")</span> 1507 <span class="text-price">@GetString("Ecom:Order.PaymentFee.PriceFormatted")</span> 1508 </div> 1509 } 1510 } 1511 else 1512 { 1513 <div class="d-flex justify-content-between"> 1514 <span>@Translate("Payment")</span> 1515 <span>@Translate("Calculated in next step")</span> 1516 </div> 1517 } 1518 1519 @* Taxes *@ 1520 @if (GetDouble("Ecom:Order.Taxes.Total.Price.Value") != 0) 1521 { 1522 <div class="d-flex justify-content-between mb-2"> 1523 <span>@Translate("Sales tax")</span> 1524 <span>@GetString("Ecom:Order.Taxes.Total.PriceFormatted")</span> 1525 </div> 1526 } 1527 </div> 1528 <div class="fs-8 border-top pt-2 pt-lg-3"> 1529 <div class="d-flex justify-content-between fs-6 fw-bold"> 1530 <span>@Translate("Total")</span> 1531 @if (!neverShowVat && showPricesWithVat == "false") 1532 { 1533 <span class="text-price text-end"> 1534 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1535 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1536 </span> 1537 } 1538 else if (!neverShowVat && showPricesWithVat == "true") 1539 { 1540 <span class="text-price text-end"> 1541 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1542 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1543 </span> 1544 } 1545 else 1546 { 1547 <span class="text-price fs-5">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1548 } 1549 </div> 1550 1551 @if (!neverShowVat) 1552 { 1553 <div class="d-flex justify-content-between"><span>@Translate("VAT")</span><span class="text-price">@GetString("Ecom:Order.Price.VATFormatted")</span></div> 1554 if (showPricesWithVat == "false") 1555 { 1556 <div class="d-flex justify-content-between"><span>@Translate("Total incl. VAT")</span><span class="text-price">@GetString("Ecom:Order.OrderLines.Total.PriceWithVAT")</span></div> 1557 } 1558 } 1559 1560 @if (GetDouble("Ecom:Order.TotalDiscount.Price.Value") != 0) 1561 { 1562 <div class="d-flex justify-content-between"><span>@Translate("Discount")</span><span class="text-price">@GetString("Ecom:Order.TotalDiscount.PriceFormatted")</span></div> 1563 } 1564 </div> 1565 </div> 1566 } 1567 1568 </div> 1569 1570 </div> 1571 1572 1573 </div> 1574 1575 <script> 1576 function submitForm() { 1577 document.querySelector("#CurrentStep").name = "@GetString("CartV2.CurrentStepButtonName")"; 1578 swift.PageUpdater.Update(document.querySelector("#ordersubmit")); 1579 } 1580 </script> 1581 1582 <script> 1583 gtag("event", "begin_checkout", { 1584 currency: "@GetString("Ecom:Order.CurrencyCode")", 1585 value: @GetDouble("Ecom:Order.Price.Price.Value").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture), 1586 items: [ 1587 @foreach (LoopItem orderline in GetLoop("OrderLines")) { 1588 <text> 1589 { 1590 item_id: "@orderline.GetString("Ecom:Order:OrderLine.ProductID")", 1591 item_name: "@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(orderline.GetString("Ecom:Order:OrderLine.ProductName"))", 1592 currency: "@orderline.GetString("Ecom:Order:OrderLine.UnitPrice.CurrencyCode")", 1593 price: @orderline.GetDouble("Ecom:Order:OrderLine.UnitPriceWithProductDiscount.Price.Value").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture), 1594 discount: @Math.Abs(orderline.GetDouble("Ecom:Order:OrderLine.UnitDiscount.Price.Value")).ToString("0.00", System.Globalization.CultureInfo.InvariantCulture), 1595 quantity: @orderline.GetDouble("Ecom:Order:OrderLine.Quantity").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture) 1596 }, 1597 </text> 1598 } 1599 ] 1600 }); 1601 </script> 1602 1603 @* Address format helper methods *@ 1604 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1605 @using System.Text.RegularExpressions 1606 @using System.Text 1607 1608 @functions { 1609 public string RenderDeliveryAddressInline() 1610 { 1611 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); 1612 1613 var result = new StringBuilder(); 1614 1615 foreach (List<string> addressLine in addressFormat) 1616 { 1617 for (var i = 0; i < addressLine.Count; i++) 1618 { 1619 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); 1620 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); 1621 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.Surname"), RegexOptions.IgnoreCase); 1622 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); 1623 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1624 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1625 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); 1626 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); 1627 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); 1628 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); 1629 addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); 1630 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); 1631 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); 1632 1633 // Remove any bad placeholders the user may have submitted 1634 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1635 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1636 } 1637 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1638 if (!string.IsNullOrWhiteSpace(completeLine)) 1639 { 1640 result.Append($"<span>{completeLine}</span>"); 1641 1642 if (addressLine != addressFormat.Last()) 1643 { 1644 result.Append(" "); 1645 } 1646 } 1647 } 1648 1649 return result.ToString(); 1650 } 1651 1652 public string GetDeliveryAddressString() 1653 { 1654 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); 1655 List<string> completeAddress = new List<string>(); 1656 1657 foreach (var addressLine in addressFormat) 1658 { 1659 for (var i = 0; i < addressLine.Count; i++) 1660 { 1661 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); 1662 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); 1663 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.LastName"), RegexOptions.IgnoreCase); 1664 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); 1665 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1666 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1667 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); 1668 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); 1669 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); 1670 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); 1671 addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); 1672 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); 1673 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); 1674 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", GetString("Ecom:Order.Delivery.Phone"), RegexOptions.IgnoreCase); 1675 1676 // Remove any bad placeholders the user may have submitted 1677 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1678 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1679 } 1680 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1681 if (!string.IsNullOrWhiteSpace(completeLine)) 1682 { 1683 completeAddress.Add(completeLine); 1684 } 1685 } 1686 1687 return string.Join(", ", completeAddress.ToArray()); 1688 } 1689 1690 public string GetDeliveryRegionName() 1691 { 1692 foreach (LoopItem region in GetLoop("DeliveryRegions")) 1693 { 1694 if (region.GetBoolean("Ecom:DeliveryRegion.IsDeliveryRegion")) 1695 { 1696 return region.GetString("Ecom:DeliveryRegion.Name"); 1697 } 1698 } 1699 1700 return GetString("Ecom:Order.Delivery.Region"); 1701 } 1702 1703 } 1704 1705 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1706 @using System 1707 @using System.Collections.Generic 1708 @using System.Linq 1709 @using System.Text.RegularExpressions 1710 @using System.Text 1711 1712 @functions { 1713 public string RenderDeliveryAddressEdit(bool enableAdditionalAddress = false) 1714 { 1715 string currentCountry = Pageview.Area?.EcomCountryCode != null ? Pageview.Area.EcomCountryCode : "dk"; 1716 foreach (LoopItem countryLoopItem in GetLoop("Countries")) 1717 { 1718 if (countryLoopItem.GetString("Ecom:Country.IsDeliveryCountryOrDefault") == "true") 1719 { 1720 currentCountry = countryLoopItem.GetString("Ecom:Country.Code2"); 1721 } 1722 } 1723 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetEditAddress(currentCountry); 1724 1725 string combinedAddressHtmlString = string.Empty; 1726 1727 foreach (var addressLine in addressFormat) 1728 { 1729 string columnSize = GetBootstrapColumnSizeForDeliveryAddress(addressLine, enableAdditionalAddress); 1730 1731 for (var i = 0; i < addressLine.Count; i++) 1732 { 1733 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{name}", "EcomOrderDeliveryName", GetString("Ecom:Order.Delivery.Name"), Translate("Name"), columnSize); 1734 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{firstName}", "EcomOrderDeliveryFirstName", GetString("Ecom:Order.Delivery.FirstName"), Translate("First Name"), columnSize); 1735 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{lastName}", "EcomOrderDeliverySurname", GetString("Ecom:Order.Delivery.Surname"), Translate("Last Name"), columnSize); 1736 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{company}", "EcomOrderDeliveryCompany", GetString("Ecom:Order.Delivery.Company"), Translate("Company"), columnSize, false); 1737 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{address}", "EcomOrderDeliveryAddress", GetString("Ecom:Order.Delivery.Address"), Translate("Street & Number"), columnSize); 1738 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{address1}", "EcomOrderDeliveryAddress", GetString("Ecom:Order.Delivery.Address"), Translate("Street & Number"), columnSize); 1739 if (enableAdditionalAddress) 1740 { 1741 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{address2}", "EcomOrderDeliveryAddress2", GetString("Ecom:Order.Delivery.Address2"), Translate("Additional address"), columnSize, false); 1742 } 1743 else 1744 { 1745 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{address2}", string.Empty); 1746 } 1747 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{zip}", "EcomOrderDeliveryZip", GetString("Ecom:Order.Delivery.Zip"), Translate("Zip code"), columnSize); 1748 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{city}", "EcomOrderDeliveryCity", GetString("Ecom:Order.Delivery.City"), Translate("Town / City"), columnSize); 1749 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{regionCode}", RenderDeliveryAddressRegionField(columnSize).ToString()); 1750 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{region}", RenderDeliveryAddressRegionField(columnSize).ToString()); 1751 addressLine[i] = ReplaceDeliveryAddressPlaceholder(addressLine[i], "{country}", (string)RenderDeliveryAddressCountryField(columnSize).ToString()); 1752 1753 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", string.Empty, RegexOptions.IgnoreCase); 1754 addressLine[i] = Regex.Replace(addressLine[i], "{email}", string.Empty, RegexOptions.IgnoreCase); 1755 addressLine[i] = addressLine[i] == "," ? "" : addressLine[i]; 1756 } 1757 1758 combinedAddressHtmlString += string.Join(string.Empty, addressLine.ToArray()); 1759 } 1760 1761 return combinedAddressHtmlString; 1762 } 1763 1764 public string GetBootstrapColumnSizeForDeliveryAddress(List<string> addressLineArray, bool enableAdditionalAddress) 1765 { 1766 string combinedLine = string.Join(",", addressLineArray); 1767 string prefix = "g-col-12 g-col-lg-"; 1768 1769 int addressLinePlaceholderCount = combinedLine.Count(s => s.Equals('{')); 1770 if (!enableAdditionalAddress && combinedLine.IndexOf("address2", StringComparison.OrdinalIgnoreCase) >= 0) addressLinePlaceholderCount -= 1; 1771 if (!GetLoop("DeliveryRegions").Any() && combinedLine.IndexOf("region", StringComparison.OrdinalIgnoreCase) >= 0) addressLinePlaceholderCount -= 1; 1772 if (addressLinePlaceholderCount <= 0) return prefix + "12"; 1773 1774 double columnSize = (double)12 / addressLinePlaceholderCount; 1775 return prefix + Math.Ceiling(columnSize); 1776 } 1777 1778 public string ReplaceDeliveryAddressPlaceholder(string addressLine, string pattern, string replacement) 1779 { 1780 return Regex.Replace(addressLine, pattern, replacement, RegexOptions.IgnoreCase); 1781 } 1782 1783 public string ReplaceDeliveryAddressPlaceholder(string addressLine, string placeholder, string fieldName, string fieldValue, string fieldLabel, string wrapperClass, bool required = true, string fieldType = "text") 1784 { 1785 if (addressLine.IndexOf(placeholder, StringComparison.OrdinalIgnoreCase) < 0) return addressLine; 1786 1787 string fieldHtml = RenderDeliveryAddressField(fieldName, fieldValue, fieldLabel, wrapperClass, required, fieldType).ToString(); 1788 return Regex.Replace(addressLine, placeholder, fieldHtml, RegexOptions.IgnoreCase); 1789 } 1790 1791 public string RenderDeliveryAddressField(string fieldName, string fieldValue, string fieldLabel, string wrapperClass, bool isRequired = true, string fieldType = "text") 1792 { 1793 StringBuilder markupBuilder = new StringBuilder(); 1794 fieldType = string.IsNullOrEmpty(fieldType) ? "text" : fieldType; 1795 string required = isRequired ? "required=\"required\"" : ""; 1796 1797 markupBuilder.Append($"<div class=\"{wrapperClass}\">"); 1798 markupBuilder.Append("<div class=\"form-floating\">"); 1799 markupBuilder.Append($"<input type=\"{fieldType}\" class=\"form-control\" name=\"{fieldName}\" id=\"{fieldName}\" value=\"{fieldValue}\" placeholder=\"{fieldLabel}\" {required}>"); 1800 markupBuilder.Append($"<label for=\"{fieldName}\">{fieldLabel}</label>"); 1801 markupBuilder.Append("</div>"); 1802 markupBuilder.Append("</div>"); 1803 1804 return markupBuilder.ToString(); 1805 } 1806 1807 public string RenderDeliveryAddressRegionField(string wrapperClass) 1808 { 1809 var regions = GetLoop("DeliveryRegions"); 1810 string currentCountry = GetString("Ecom:Order.Delivery.Country.Code"); 1811 currentCountry = !string.IsNullOrEmpty(currentCountry) ? currentCountry : Pageview.Area?.EcomCountryCode != null ? Pageview.Area.EcomCountryCode : "dk"; 1812 string regionLabel = currentCountry == "CA" ? Translate("Province") : currentCountry == "US" ? Translate("State") : Translate("Region"); 1813 1814 var result = new StringBuilder(); 1815 1816 if (regions.Any()) 1817 { 1818 result.AppendLine($"<div class=\"{wrapperClass}\">"); 1819 result.AppendLine("<div class=\"form-floating\">"); 1820 result.AppendLine("<select class=\"form-select\" name=\"EcomOrderDeliveryRegion\" id=\"EcomOrderDeliveryRegion\" onchange=\"submitForm()\">"); 1821 1822 foreach (LoopItem region in regions) 1823 { 1824 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 1825 { 1826 result.AppendLine($"<option value=\"{region.GetString("Ecom:DeliveryRegion.RegionCode")}\" selected>{region.GetString("Ecom:DeliveryRegion.Name")}</option>"); 1827 } 1828 else 1829 { 1830 result.AppendLine($"<option value=\"{region.GetString("Ecom:DeliveryRegion.RegionCode")}\">{region.GetString("Ecom:DeliveryRegion.Name")}</option>"); 1831 } 1832 } 1833 1834 result.AppendLine("</select>"); 1835 result.AppendLine($"<label for=\"EcomOrderDeliveryRegion\">{regionLabel}</label>"); 1836 result.AppendLine("</div>"); 1837 result.AppendLine("</div>"); 1838 } 1839 else 1840 { 1841 var deliveryAddressField = RenderDeliveryAddressField("EcomOrderDeliveryRegion", GetString("Ecom:Order.Delivery.Region"), regionLabel, wrapperClass, false); 1842 result.Append(deliveryAddressField); 1843 } 1844 1845 return result.ToString(); 1846 } 1847 1848 public string RenderDeliveryAddressCountryField(string wrapperClass) 1849 { 1850 var countries = GetLoop("Countries"); 1851 1852 var result = new StringBuilder(); 1853 result.AppendLine($"<div class=\"{wrapperClass}\">"); 1854 result.AppendLine("<div class=\"form-floating\">"); 1855 result.AppendLine("<select class=\"form-select\" name=\"EcomOrderDeliveryCountry\" id=\"EcomOrderDeliveryCountry\" onchange=\"submitForm()\">"); 1856 1857 foreach (LoopItem country in countries) 1858 { 1859 if (country.GetString("Ecom:Country.IsDeliveryCountryOrDefault") == "true") 1860 { 1861 result.AppendLine($"<option value=\"{country.GetString("Ecom:Country.Code2")}\" selected>{country.GetString("Ecom:Country.Name")}</option>"); 1862 } 1863 else 1864 { 1865 result.AppendLine($"<option value=\"{country.GetString("Ecom:Country.Code2")}\">{country.GetString("Ecom:Country.Name")}</option>"); 1866 } 1867 } 1868 1869 result.AppendLine("</select>"); 1870 result.AppendLine($"<label for=\"EcomOrderDeliveryCountry\">{@Translate("Country")}</label>"); 1871 result.AppendLine("</div>"); 1872 result.AppendLine("</div>"); 1873 1874 return result.ToString(); 1875 } 1876 } 1877 1878 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1879 @using System.Collections.Generic 1880 @using System.Text.RegularExpressions 1881 @using Dynamicweb.Ecommerce.International 1882 @using System.Text 1883 1884 @functions { 1885 public string RenderUserItemAddressInline(LoopItem address) 1886 { 1887 string regionCode = GetRegionCode(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); 1888 string regionName = GetRegionName(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); 1889 1890 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(address.GetString("UserManagement:User.UserAddress.CountryCode")); 1891 1892 var result = new StringBuilder(); 1893 1894 foreach (List<string> addressLine in addressFormat) 1895 { 1896 for (var i = 0; i < addressLine.Count; i++) 1897 { 1898 addressLine[i] = Regex.Replace(addressLine[i], "{name}", address.GetString("UserManagement:User.UserAddress.Name"), RegexOptions.IgnoreCase); 1899 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", address.GetString("UserManagement:User.UserAddress.FirstName"), RegexOptions.IgnoreCase); 1900 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", address.GetString("UserManagement:User.UserAddress.lastName"), RegexOptions.IgnoreCase); 1901 addressLine[i] = Regex.Replace(addressLine[i], "{company}", address.GetString("UserManagement:User.UserAddress.Company"), RegexOptions.IgnoreCase); 1902 addressLine[i] = Regex.Replace(addressLine[i], "{address}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); 1903 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); 1904 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", address.GetString("UserManagement:User.UserAddress.Address2"), RegexOptions.IgnoreCase); 1905 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", address.GetString("UserManagement:User.UserAddress.Zip"), RegexOptions.IgnoreCase); 1906 addressLine[i] = Regex.Replace(addressLine[i], "{city}", address.GetString("UserManagement:User.UserAddress.City"), RegexOptions.IgnoreCase); 1907 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); 1908 addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); 1909 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", address.GetString("UserManagement:User.UserAddress.Culture.CountryCode"), RegexOptions.IgnoreCase); 1910 addressLine[i] = Regex.Replace(addressLine[i], "{country}", address.GetString("UserManagement:User.UserAddress.Culture.CountryName"), RegexOptions.IgnoreCase); 1911 1912 // Remove any bad placeholders the user may have submitted 1913 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1914 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1915 } 1916 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1917 if (!string.IsNullOrWhiteSpace(completeLine)) 1918 { 1919 result.Append($"<span>{completeLine}</span> "); 1920 } 1921 } 1922 1923 return result.ToString(); 1924 } 1925 1926 public string GetUserAddressString() 1927 { 1928 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("UserManagement:User.CountryCode")); 1929 string regionCode = GetRegionCode(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); 1930 string regionName = GetRegionName(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); 1931 List<string> completeAddress = new List<string>(); 1932 1933 foreach (var addressLine in addressFormat) 1934 { 1935 for (var i = 0; i < addressLine.Count; i++) 1936 { 1937 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("UserManagement:User.Name"), RegexOptions.IgnoreCase); 1938 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("UserManagement:User.FirstName"), RegexOptions.IgnoreCase); 1939 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("UserManagement:User.LastName"), RegexOptions.IgnoreCase); 1940 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("UserManagement:User.Company"), RegexOptions.IgnoreCase); 1941 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); 1942 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); 1943 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("UserManagement:User.Address2"), RegexOptions.IgnoreCase); 1944 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("UserManagement:User.Zip"), RegexOptions.IgnoreCase); 1945 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("UserManagement:User.City"), RegexOptions.IgnoreCase); 1946 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); 1947 addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); 1948 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("UserManagement:User.CountryCode"), RegexOptions.IgnoreCase); 1949 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("UserManagement:User.Culture.CountryName"), RegexOptions.IgnoreCase); 1950 1951 // Remove any bad placeholders the user may have submitted 1952 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1953 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1954 } 1955 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1956 if (!string.IsNullOrWhiteSpace(completeLine)) 1957 { 1958 completeAddress.Add(completeLine); 1959 } 1960 } 1961 1962 return string.Join(" ", completeAddress.ToArray()); 1963 } 1964 1965 public string GetRegionName(string countryCode, string regionValue) 1966 { 1967 return GetRegionNameOrCode(countryCode, regionValue); 1968 } 1969 1970 public string GetRegionCode(string countryCode, string regionValue) 1971 { 1972 return GetRegionNameOrCode(countryCode, regionValue, "code"); 1973 } 1974 1975 public string GetRegionNameOrCode(string countryCode, string regionValue, string nameOrCode = "name") 1976 { 1977 CountryCollection allCountryRegions = Dynamicweb.Ecommerce.Services.Countries.GetRegions(countryCode); 1978 Country matchedRegion = allCountryRegions.FirstOrDefault(r => r.RegionCode == regionValue || r.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) == regionValue); 1979 1980 if (matchedRegion == null) return regionValue; 1981 1982 return nameOrCode == "name" ? matchedRegion.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) : matchedRegion.RegionCode; 1983 } 1984 1985 } 1986 1987