Vennligst merk at frakt og miljøgebyr kalkuleres i etterkant, og vil tilkomme endelig faktura.
Har du spørsmål eller kommentarer, send oss en mail på ordre@gylling.no
Error executing template "Designs/Rapido/eCom7/CartV2/Step/Cart.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass64_0.<RenderShipping>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 3253 at RazorEngine.Templating.TemplateWriter.ToString() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 207 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 180 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 240 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 145 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 240 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 134 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 240 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 145 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<RenderCheckoutForm>b__94_0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 5120 at RazorEngine.Templating.TemplateWriter.ToString() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 207 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 117 at CompiledRazorTemplates.Dynamic.RazorEngine_7d78663e14ae42cb8bed3b1729ffe492.Execute() in D:\dynamicweb.net\Solutions\Mennt\gylling.staging.dynamicweb-cms.com\Files\Templates\Designs\Rapido\eCom7\CartV2\Step\Cart.cshtml:line 5129 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 3 @using Dynamicweb.Extensibility 4 @using Dynamicweb.Content 5 @using Dynamicweb.Core 6 @using Dynamicweb.Ecommerce.Orders 7 @using Dynamicweb.Ecommerce.Orders.SalesDiscounts 8 @using System 9 @using System.IO 10 @using Dynamicweb.Rapido.Blocks 11 12 13 @functions{ 14 BlocksPage checkoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 15 string checkoutPageType = "onestep"; 16 } 17 18 @{ 19 Block checkoutTopSnippets = new Block() 20 { 21 Id = "CheckoutTopSnippets", 22 SortId = 10 23 }; 24 checkoutPage.Add(checkoutTopSnippets); 25 26 Block checkoutForm = new Block 27 { 28 Id = "CheckoutForm", 29 SortId = 20, 30 Template = RenderCheckoutForm(), 31 SkipRenderBlocksList = true, 32 BlocksList = new List<Block> 33 { 34 new Block() 35 { 36 Id = "AddressContainer", 37 SortId = 10, 38 Design = new Design 39 { 40 RenderType = RenderType.Column, 41 Size = "4", 42 HidePadding = true 43 }, 44 BlocksList = new List<Block> { 45 new Block() 46 { 47 Id = "AddressContainerRow", 48 SortId = 10, 49 Design = new Design 50 { 51 RenderType = RenderType.Row 52 } 53 } 54 } 55 }, 56 new Block() 57 { 58 Id = "OrderContainer", 59 SortId = 20, 60 Design = new Design 61 { 62 RenderType = RenderType.Column, 63 Size = "auto", 64 HidePadding = true 65 }, 66 BlocksList = new List<Block> { 67 new Block() 68 { 69 Id = "OrderContainerRow", 70 SortId = 10, 71 Design = new Design 72 { 73 RenderType = RenderType.Row 74 } 75 } 76 } 77 } 78 } 79 }; 80 checkoutPage.Add(checkoutForm); 81 82 Block checkoutBottomSnippets = new Block() 83 { 84 Id = "CheckoutBottomSnippets", 85 SortId = 30 86 }; 87 checkoutPage.Add(checkoutBottomSnippets); 88 } 89 90 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 91 @using System.Text.RegularExpressions 92 @using System.Collections.Generic 93 @using System.Reflection 94 @using System.Web 95 @using System.Web.UI.HtmlControls 96 @using Dynamicweb.Rapido.Blocks.Components 97 @using Dynamicweb.Rapido.Blocks.Components.Articles 98 @using Dynamicweb.Rapido.Blocks.Components.Documentation 99 @using Dynamicweb.Rapido.Blocks 100 101 102 @*--- START: Base block renderers ---*@ 103 104 @helper RenderBlockList(List<Block> blocks) 105 { 106 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 107 blocks = blocks.OrderBy(item => item.SortId).ToList(); 108 109 foreach (Block item in blocks) 110 { 111 if (debug) { 112 <!-- Block START: @item.Id --> 113 } 114 115 if (item.Design == null) 116 { 117 @RenderBlock(item) 118 } 119 else if (item.Design.RenderType == RenderType.None) { 120 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 121 122 <div class="@cssClass dw-mod"> 123 @RenderBlock(item) 124 </div> 125 } 126 else if (item.Design.RenderType != RenderType.Hide) 127 { 128 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 129 130 if (!item.SkipRenderBlocksList) { 131 if (item.Design.RenderType == RenderType.Row) 132 { 133 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 134 @RenderBlock(item) 135 </div> 136 } 137 138 if (item.Design.RenderType == RenderType.Column) 139 { 140 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 141 string size = item.Design.Size ?? "12"; 142 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 143 144 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id"> 145 @RenderBlock(item) 146 </div> 147 } 148 149 if (item.Design.RenderType == RenderType.Table) 150 { 151 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 152 @RenderBlock(item) 153 </table> 154 } 155 156 if (item.Design.RenderType == RenderType.TableRow) 157 { 158 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 159 @RenderBlock(item) 160 </tr> 161 } 162 163 if (item.Design.RenderType == RenderType.TableColumn) 164 { 165 <td class="@cssClass dw-mod" id="Block__@item.Id"> 166 @RenderBlock(item) 167 </td> 168 } 169 170 if (item.Design.RenderType == RenderType.CardHeader) 171 { 172 <div class="card-header @cssClass dw-mod"> 173 @RenderBlock(item) 174 </div> 175 } 176 177 if (item.Design.RenderType == RenderType.CardBody) 178 { 179 <div class="card @cssClass dw-mod"> 180 @RenderBlock(item) 181 </div> 182 } 183 184 if (item.Design.RenderType == RenderType.CardFooter) 185 { 186 <div class="card-footer @cssClass dw-mod"> 187 @RenderBlock(item) 188 </div> 189 } 190 } 191 else 192 { 193 @RenderBlock(item) 194 } 195 } 196 197 if (debug) { 198 <!-- Block END: @item.Id --> 199 } 200 } 201 } 202 203 @helper RenderBlock(Block item) 204 { 205 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 206 207 if (item.Template != null) 208 { 209 @BlocksPage.RenderTemplate(item.Template) 210 } 211 212 if (item.Component != null) 213 { 214 string customSufix = "Custom"; 215 string methodName = item.Component.HelperName; 216 217 ComponentBase[] methodParameters = new ComponentBase[1]; 218 methodParameters[0] = item.Component; 219 Type methodType = this.GetType(); 220 221 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 222 MethodInfo generalMethod = methodType.GetMethod(methodName); 223 224 try { 225 if (debug) { 226 <!-- Component: @methodName.Replace("Render", "") --> 227 } 228 @customMethod.Invoke(this, methodParameters).ToString(); 229 } catch { 230 try { 231 @generalMethod.Invoke(this, methodParameters).ToString(); 232 } catch(Exception ex) { 233 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 234 } 235 } 236 } 237 238 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 239 { 240 @RenderBlockList(item.BlocksList) 241 } 242 } 243 244 @*--- END: Base block renderers ---*@ 245 246 @using Dynamicweb.Rapido.Blocks.Components 247 @using Dynamicweb.Rapido.Blocks.Components.General 248 @using Dynamicweb.Rapido.Blocks 249 @using System.IO 250 251 @* Required *@ 252 @using Dynamicweb.Rapido.Blocks.Components 253 @using Dynamicweb.Rapido.Blocks.Components.General 254 @using Dynamicweb.Rapido.Blocks 255 256 257 @helper Render(ComponentBase component) 258 { 259 if (component != null) 260 { 261 @component.Render(this) 262 } 263 } 264 265 @* Components *@ 266 @using System.Reflection 267 @using Dynamicweb.Rapido.Blocks.Components.General 268 269 270 @* Component *@ 271 272 @helper RenderIcon(Icon settings) 273 { 274 if (settings != null) 275 { 276 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 277 278 if (settings.Name != null) 279 { 280 if (string.IsNullOrEmpty(settings.Label)) 281 { 282 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 283 } 284 else 285 { 286 if (settings.LabelPosition == IconLabelPosition.Before) 287 { 288 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span> 289 } 290 else 291 { 292 <span><i class="@settings.Prefix @settings.Name u-margin-right--lg @settings.CssClass u-w20px" @color></i>@settings.Label</span> 293 } 294 } 295 } 296 else if (!string.IsNullOrEmpty(settings.Label)) 297 { 298 @settings.Label 299 } 300 } 301 } 302 @using System.Reflection 303 @using Dynamicweb.Rapido.Blocks.Components.General 304 @using Dynamicweb.Rapido.Blocks.Components 305 @using Dynamicweb.Core 306 307 @* Component *@ 308 309 @helper RenderButton(Button settings) 310 { 311 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 312 { 313 Dictionary<string, string> attributes = new Dictionary<string, string>(); 314 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 315 if (settings.Disabled) { 316 attributes.Add("disabled", "true"); 317 classList.Add("disabled"); 318 } 319 320 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 321 { 322 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 323 @RenderConfirmDialog(settings); 324 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 325 } 326 327 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 328 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 329 if (!string.IsNullOrEmpty(settings.AltText)) 330 { 331 attributes.Add("title", settings.AltText); 332 } 333 else if (!string.IsNullOrEmpty(settings.Title)) 334 { 335 attributes.Add("title", settings.Title); 336 } 337 338 var onClickEvents = new List<string>(); 339 if (!string.IsNullOrEmpty(settings.OnClick)) 340 { 341 onClickEvents.Add(settings.OnClick); 342 } 343 if (!string.IsNullOrEmpty(settings.Href)) 344 { 345 onClickEvents.Add("location.href='" + settings.Href + "'"); 346 } 347 if (onClickEvents.Count > 0) 348 { 349 attributes.Add("onClick", string.Join(";", onClickEvents)); 350 } 351 352 if (settings.ButtonLayout != ButtonLayout.None) 353 { 354 classList.Add("btn"); 355 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 356 if (btnLayout == "linkclean") 357 { 358 btnLayout = "link-clean"; //fix 359 } 360 classList.Add("btn--" + btnLayout); 361 } 362 363 if (settings.Icon == null) 364 { 365 settings.Icon = new Icon(); 366 } 367 settings.Icon.Label = settings.Title; 368 369 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 370 371 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 372 } 373 } 374 375 @helper RenderConfirmDialog(Button settings) 376 { 377 Modal confirmDialog = new Modal { 378 Id = settings.Id, 379 Width = ModalWidth.Sm, 380 Heading = new Heading 381 { 382 Level = 2, 383 Title = settings.ConfirmTitle 384 }, 385 BodyText = settings.ConfirmText 386 }; 387 388 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 389 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 390 391 @Render(confirmDialog) 392 } 393 @using Dynamicweb.Rapido.Blocks.Components.General 394 @using Dynamicweb.Rapido.Blocks.Components 395 @using Dynamicweb.Core 396 397 @helper RenderDashboard(Dashboard settings) 398 { 399 var widgets = settings.GetWidgets(); 400 401 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 402 { 403 //set bg color for them 404 405 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 406 int r = Convert.ToInt16(color.R); 407 int g = Convert.ToInt16(color.G); 408 int b = Convert.ToInt16(color.B); 409 410 var count = widgets.Length; 411 var max = Math.Max(r, Math.Max(g, b)); 412 double step = 255.0 / (max * count); 413 var i = 0; 414 foreach (var widget in widgets) 415 { 416 i++; 417 418 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 419 widget.BackgroundColor = shade; 420 } 421 } 422 423 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 424 @foreach (var widget in widgets) 425 { 426 <div class="dashboard__widget"> 427 @Render(widget) 428 </div> 429 } 430 </div> 431 } 432 @using Dynamicweb.Rapido.Blocks.Components.General 433 @using Dynamicweb.Rapido.Blocks.Components 434 435 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 436 { 437 if (!string.IsNullOrEmpty(settings.Link)) 438 { 439 var backgroundStyles = ""; 440 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 441 { 442 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 443 } 444 445 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 446 <div class="u-center-middle u-color-light"> 447 @if (settings.Icon != null) 448 { 449 settings.Icon.CssClass += "widget__icon"; 450 @Render(settings.Icon) 451 } 452 <div class="widget__title">@settings.Title</div> 453 </div> 454 </a> 455 } 456 } 457 @using Dynamicweb.Rapido.Blocks.Components.General 458 @using Dynamicweb.Rapido.Blocks.Components 459 460 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 461 { 462 var backgroundStyles = ""; 463 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 464 { 465 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 466 } 467 468 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 469 <div class="u-center-middle u-color-light"> 470 @if (settings.Icon != null) 471 { 472 settings.Icon.CssClass += "widget__icon"; 473 @Render(settings.Icon) 474 } 475 <div class="widget__counter">@settings.Count</div> 476 <div class="widget__title">@settings.Title</div> 477 </div> 478 </div> 479 } 480 @using System.Reflection 481 @using Dynamicweb.Rapido.Blocks.Components.General 482 @using Dynamicweb.Rapido.Blocks.Components 483 @using Dynamicweb.Core 484 485 @* Component *@ 486 487 @helper RenderLink(Link settings) 488 { 489 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 490 { 491 Dictionary<string, string> attributes = new Dictionary<string, string>(); 492 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 493 if (settings.Disabled) 494 { 495 attributes.Add("disabled", "true"); 496 classList.Add("disabled"); 497 } 498 499 if (!string.IsNullOrEmpty(settings.AltText)) 500 { 501 attributes.Add("title", settings.AltText); 502 } 503 else if (!string.IsNullOrEmpty(settings.Title)) 504 { 505 attributes.Add("title", settings.Title); 506 } 507 508 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 509 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 510 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 511 attributes.Add("href", settings.Href); 512 513 if (settings.ButtonLayout != ButtonLayout.None) 514 { 515 classList.Add("btn"); 516 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 517 if (btnLayout == "linkclean") 518 { 519 btnLayout = "link-clean"; //fix 520 } 521 classList.Add("btn--" + btnLayout); 522 } 523 524 if (settings.Icon == null) 525 { 526 settings.Icon = new Icon(); 527 } 528 settings.Icon.Label = settings.Title; 529 530 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 531 { 532 settings.Rel = LinkRelType.Noopener; 533 } 534 if (settings.Target != LinkTargetType.None) 535 { 536 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 537 } 538 if (settings.Download) 539 { 540 attributes.Add("download", "true"); 541 } 542 if (settings.Rel != LinkRelType.None) 543 { 544 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 545 } 546 547 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 548 } 549 } 550 @using System.Reflection 551 @using Dynamicweb.Rapido.Blocks.Components 552 @using Dynamicweb.Rapido.Blocks.Components.General 553 @using Dynamicweb.Rapido.Blocks 554 555 556 @* Component *@ 557 558 @helper RenderRating(Rating settings) 559 { 560 if (settings.Score > 0) 561 { 562 int rating = settings.Score; 563 string iconType = "fa-star"; 564 565 switch (settings.Type.ToString()) { 566 case "Stars": 567 iconType = "fa-star"; 568 break; 569 case "Hearts": 570 iconType = "fa-heart"; 571 break; 572 case "Lemons": 573 iconType = "fa-lemon"; 574 break; 575 case "Bombs": 576 iconType = "fa-bomb"; 577 break; 578 } 579 580 <div class="u-ta-right"> 581 @for (int i = 0; i < settings.OutOf; i++) 582 { 583 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 584 } 585 </div> 586 } 587 } 588 @using System.Reflection 589 @using Dynamicweb.Rapido.Blocks.Components.General 590 @using Dynamicweb.Rapido.Blocks.Components 591 592 593 @* Component *@ 594 595 @helper RenderSelectFieldOption(SelectFieldOption settings) 596 { 597 Dictionary<string, string> attributes = new Dictionary<string, string>(); 598 if (settings.Checked) { attributes.Add("selected", "true"); } 599 if (settings.Disabled) { attributes.Add("disabled", "true"); } 600 if (settings.Value != null) { attributes.Add("value", settings.Value); } 601 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 602 603 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 604 } 605 @using System.Reflection 606 @using Dynamicweb.Rapido.Blocks.Components.General 607 @using Dynamicweb.Rapido.Blocks.Components 608 609 610 @* Component *@ 611 612 @helper RenderNavigation(Navigation settings) { 613 @RenderNavigation(new 614 { 615 id = settings.Id, 616 cssclass = settings.CssClass, 617 startLevel = settings.StartLevel, 618 endlevel = settings.EndLevel, 619 expandmode = settings.Expandmode, 620 sitemapmode = settings.SitemapMode, 621 template = settings.Template 622 }) 623 } 624 @using Dynamicweb.Rapido.Blocks.Components.General 625 @using Dynamicweb.Rapido.Blocks.Components 626 627 628 @* Component *@ 629 630 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 631 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 632 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 633 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 634 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 635 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 636 settings.SitemapMode = false; 637 638 @RenderNavigation(settings) 639 } 640 @using Dynamicweb.Rapido.Blocks.Components.General 641 @using Dynamicweb.Rapido.Blocks.Components 642 643 644 @* Component *@ 645 646 @helper RenderLeftNavigation(LeftNavigation settings) { 647 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 648 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 649 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 650 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 651 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 652 653 <div class="grid__cell"> 654 @RenderNavigation(settings) 655 </div> 656 } 657 @using System.Reflection 658 @using Dynamicweb.Rapido.Blocks.Components.General 659 @using Dynamicweb.Core 660 661 @* Component *@ 662 663 @helper RenderHeading(Heading settings) 664 { 665 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 666 { 667 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 668 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 669 670 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 671 if (!string.IsNullOrEmpty(settings.Link)) 672 { 673 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 674 } 675 else 676 { 677 if (settings.Icon == null) 678 { 679 settings.Icon = new Icon(); 680 } 681 settings.Icon.Label = settings.Title; 682 @Render(settings.Icon) 683 } 684 @("</" + tagName + ">"); 685 } 686 } 687 @using Dynamicweb.Rapido.Blocks.Components 688 @using Dynamicweb.Rapido.Blocks.Components.General 689 @using Dynamicweb.Rapido.Blocks 690 691 692 @* Component *@ 693 694 @helper RenderImage(Image settings) 695 { 696 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 697 { 698 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 699 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 700 701 if (settings.Caption != null) 702 { 703 @:<div> 704 } 705 706 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 707 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 708 709 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 710 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 711 @if (settings.Link != null) 712 { 713 <a href="@settings.Link"> 714 @RenderTheImage(settings) 715 </a> 716 } 717 else 718 { 719 @RenderTheImage(settings) 720 } 721 </div> 722 </div> 723 724 if (settings.Caption != null) 725 { 726 <span class="image-caption dw-mod">@settings.Caption</span> 727 @:</div> 728 } 729 } 730 else 731 { 732 if (settings.Caption != null) 733 { 734 @:<div> 735 } 736 if (!string.IsNullOrEmpty(settings.Link)) 737 { 738 <a href="@settings.Link"> 739 @RenderTheImage(settings) 740 </a> 741 } 742 else 743 { 744 @RenderTheImage(settings) 745 } 746 747 if (settings.Caption != null) 748 { 749 <span class="image-caption dw-mod">@settings.Caption</span> 750 @:</div> 751 } 752 } 753 } 754 755 @helper RenderTheImage(Image settings) 756 { 757 if (settings != null) 758 { 759 string placeholderImage = "/Files/Images/placeholder.gif"; 760 string imageEngine = "/Admin/Public/GetImage.ashx?"; 761 762 string imageStyle = ""; 763 764 switch (settings.Style) 765 { 766 case ImageStyle.Ball: 767 imageStyle = "grid__cell-img--ball"; 768 break; 769 770 case ImageStyle.Triangle: 771 imageStyle = "grid__cell-img--triangle"; 772 break; 773 } 774 775 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 776 { 777 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 778 779 if (settings.ImageDefault != null) 780 { 781 settings.ImageDefault.Height = settings.ImageDefault.Width; 782 } 783 if (settings.ImageMedium != null) 784 { 785 settings.ImageMedium.Height = settings.ImageMedium.Width; 786 } 787 if (settings.ImageSmall != null) 788 { 789 settings.ImageSmall.Height = settings.ImageSmall.Width; 790 } 791 } 792 793 string defaultImage = imageEngine; 794 string imageSmall = ""; 795 string imageMedium = ""; 796 797 if (settings.DisableImageEngine) 798 { 799 defaultImage = settings.Path; 800 } 801 else 802 { 803 if (settings.ImageDefault != null) 804 { 805 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 806 807 if (settings.Path.GetType() != typeof(string)) 808 { 809 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 810 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 811 } 812 else 813 { 814 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 815 } 816 } 817 818 if (settings.ImageSmall != null) 819 { 820 imageSmall = "data-src-small=\"" + imageEngine; 821 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 822 823 if (settings.Path.GetType() != typeof(string)) 824 { 825 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 826 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 827 } 828 else 829 { 830 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 831 } 832 833 imageSmall += "\""; 834 } 835 836 if (settings.ImageMedium != null) 837 { 838 imageMedium = "data-src-medium=\"" + imageEngine; 839 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 840 841 if (settings.Path.GetType() != typeof(string)) 842 { 843 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 844 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 845 } 846 else 847 { 848 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 849 } 850 851 imageMedium += "\""; 852 } 853 } 854 855 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 856 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 857 if (!string.IsNullOrEmpty(settings.Title)) 858 { 859 optionalAttributes.Add("alt", settings.Title); 860 optionalAttributes.Add("title", settings.Title); 861 } 862 863 if (settings.DisableLazyLoad) 864 { 865 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 866 } 867 else 868 { 869 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 870 } 871 } 872 } 873 @using System.Reflection 874 @using Dynamicweb.Rapido.Blocks.Components.General 875 @using Dynamicweb.Rapido.Blocks.Components 876 877 @* Component *@ 878 879 @helper RenderFileField(FileField settings) 880 { 881 var attributes = new Dictionary<string, string>(); 882 if (string.IsNullOrEmpty(settings.Id)) 883 { 884 settings.Id = Guid.NewGuid().ToString("N"); 885 } 886 887 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 888 if (settings.Disabled) { attributes.Add("disabled", "true"); } 889 if (settings.Required) { attributes.Add("required", "true"); } 890 if (settings.Multiple) { attributes.Add("multiple", "true"); } 891 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 892 if (string.IsNullOrEmpty(settings.ChooseFileText)) 893 { 894 settings.ChooseFileText = Translate("Choose file"); 895 } 896 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 897 { 898 settings.NoFilesChosenText = Translate("No files chosen..."); 899 } 900 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 901 902 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 903 904 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 905 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 906 907 attributes.Add("type", "file"); 908 if (settings.Value != null) { attributes.Add("value", settings.Value); } 909 settings.CssClass = "u-full-width " + settings.CssClass; 910 911 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 912 913 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 914 @if (!string.IsNullOrEmpty(settings.Label)) 915 { 916 <label for="@settings.Id">@settings.Label</label> 917 } 918 @if (!string.IsNullOrEmpty(settings.HelpText)) 919 { 920 <small class="form__help-text">@settings.HelpText</small> 921 } 922 923 <div class="form__field-combi file-input u-no-margin dw-mod"> 924 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 925 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 926 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 927 @if (settings.UploadButton != null) 928 { 929 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 930 @Render(settings.UploadButton) 931 } 932 </div> 933 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 934 </div> 935 } 936 @using System.Reflection 937 @using Dynamicweb.Rapido.Blocks.Components.General 938 @using Dynamicweb.Rapido.Blocks.Components 939 @using Dynamicweb.Core 940 @using System.Linq 941 942 @* Component *@ 943 944 @helper RenderDateTimeField(DateTimeField settings) 945 { 946 if (string.IsNullOrEmpty(settings.Id)) 947 { 948 settings.Id = Guid.NewGuid().ToString("N"); 949 } 950 951 var textField = new TextField { 952 Name = settings.Name, 953 Id = settings.Id, 954 Label = settings.Label, 955 HelpText = settings.HelpText, 956 Value = settings.Value, 957 Disabled = settings.Disabled, 958 Required = settings.Required, 959 ErrorMessage = settings.ErrorMessage, 960 CssClass = settings.CssClass, 961 WrapperCssClass = settings.WrapperCssClass, 962 OnChange = settings.OnChange, 963 OnClick = settings.OnClick, 964 ExtraAttributes = settings.ExtraAttributes, 965 // 966 Placeholder = settings.Placeholder 967 }; 968 969 @Render(textField) 970 971 List<string> jsAttributes = new List<string>(); 972 973 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 974 975 if (!string.IsNullOrEmpty(settings.DateFormat)) 976 { 977 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 978 } 979 if (!string.IsNullOrEmpty(settings.MinDate)) 980 { 981 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 982 } 983 if (!string.IsNullOrEmpty(settings.MaxDate)) 984 { 985 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 986 } 987 if (settings.IsInline) 988 { 989 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 990 } 991 if (settings.EnableTime) 992 { 993 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 994 } 995 if (settings.EnableWeekNumbers) 996 { 997 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 998 } 999 1000 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1001 1002 <script> 1003 document.addEventListener("DOMContentLoaded", function () { 1004 flatpickr("#@textField.Id", { 1005 @string.Join(",", jsAttributes) 1006 }); 1007 }); 1008 </script> 1009 } 1010 @using System.Reflection 1011 @using Dynamicweb.Rapido.Blocks.Components.General 1012 @using Dynamicweb.Rapido.Blocks.Components 1013 1014 @* Component *@ 1015 1016 @helper RenderTextField(TextField settings) 1017 { 1018 var attributes = new Dictionary<string, string>(); 1019 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1020 { 1021 settings.Id = Guid.NewGuid().ToString("N"); 1022 } 1023 1024 /*base settings*/ 1025 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1026 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1027 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1028 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1029 if (settings.Required) { attributes.Add("required", "true"); } 1030 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1031 /*end*/ 1032 1033 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1034 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1035 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1036 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1037 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1038 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1039 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1040 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1041 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1042 1043 settings.CssClass = "u-full-width " + settings.CssClass; 1044 1045 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1046 1047 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1048 1049 string noMargin = "u-no-margin"; 1050 if (!settings.ReadOnly) { 1051 noMargin = ""; 1052 } 1053 1054 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1055 @if (!string.IsNullOrEmpty(settings.Label)) 1056 { 1057 <label for="@settings.Id">@settings.Label</label> 1058 } 1059 @if (!string.IsNullOrEmpty(settings.HelpText)) 1060 { 1061 <small class="form__help-text">@settings.HelpText</small> 1062 } 1063 1064 @if (settings.ActionButton != null) 1065 { 1066 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1067 <div class="form__field-combi u-no-margin dw-mod"> 1068 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1069 @Render(settings.ActionButton) 1070 </div> 1071 } 1072 else 1073 { 1074 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1075 } 1076 1077 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1078 </div> 1079 } 1080 @using System.Reflection 1081 @using Dynamicweb.Rapido.Blocks.Components.General 1082 @using Dynamicweb.Rapido.Blocks.Components 1083 1084 @* Component *@ 1085 1086 @helper RenderNumberField(NumberField settings) 1087 { 1088 var attributes = new Dictionary<string, string>(); 1089 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1090 { 1091 settings.Id = Guid.NewGuid().ToString("N"); 1092 } 1093 1094 /*base settings*/ 1095 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1096 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1097 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1098 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1099 if (settings.Required) { attributes.Add("required", "true"); } 1100 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1101 /*end*/ 1102 1103 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1104 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1105 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1106 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1107 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1108 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1109 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1110 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1111 attributes.Add("type", "number"); 1112 1113 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1114 1115 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1116 @if (!string.IsNullOrEmpty(settings.Label)) 1117 { 1118 <label for="@settings.Id">@settings.Label</label> 1119 } 1120 @if (!string.IsNullOrEmpty(settings.HelpText)) 1121 { 1122 <small class="form__help-text">@settings.HelpText</small> 1123 } 1124 1125 @if (settings.ActionButton != null) 1126 { 1127 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1128 <div class="form__field-combi u-no-margin dw-mod"> 1129 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1130 @Render(settings.ActionButton) 1131 </div> 1132 } 1133 else 1134 { 1135 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1136 } 1137 1138 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1139 </div> 1140 } 1141 @using System.Reflection 1142 @using Dynamicweb.Rapido.Blocks.Components.General 1143 @using Dynamicweb.Rapido.Blocks.Components 1144 1145 1146 @* Component *@ 1147 1148 @helper RenderTextareaField(TextareaField settings) 1149 { 1150 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1151 string id = settings.Id; 1152 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1153 { 1154 id = Guid.NewGuid().ToString("N"); 1155 } 1156 1157 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1158 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1159 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1160 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1161 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1162 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1163 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1164 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1165 if (settings.Required) { attributes.Add("required", "true"); } 1166 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1167 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1168 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1169 attributes.Add("name", settings.Name); 1170 1171 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1172 1173 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1174 @if (!string.IsNullOrEmpty(settings.Label)) 1175 { 1176 <label for="@id">@settings.Label</label> 1177 } 1178 @if (!string.IsNullOrEmpty(settings.HelpText)) 1179 { 1180 <small class="form__help-text">@settings.HelpText</small> 1181 } 1182 1183 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1184 1185 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1186 </div> 1187 } 1188 @using System.Reflection 1189 @using Dynamicweb.Rapido.Blocks.Components.General 1190 @using Dynamicweb.Rapido.Blocks.Components 1191 1192 1193 @* Component *@ 1194 1195 @helper RenderHiddenField(HiddenField settings) { 1196 var attributes = new Dictionary<string, string>(); 1197 attributes.Add("type", "hidden"); 1198 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1199 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1200 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1201 1202 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1203 } 1204 @using System.Reflection 1205 @using Dynamicweb.Rapido.Blocks.Components.General 1206 @using Dynamicweb.Rapido.Blocks.Components 1207 1208 @* Component *@ 1209 1210 @helper RenderCheckboxField(CheckboxField settings) 1211 { 1212 var attributes = new Dictionary<string, string>(); 1213 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1214 { 1215 settings.Id = Guid.NewGuid().ToString("N"); 1216 } 1217 1218 /*base settings*/ 1219 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1220 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1221 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1222 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1223 if (settings.Required) { attributes.Add("required", "true"); } 1224 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1225 /*end*/ 1226 1227 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1228 1229 attributes.Add("type", "checkbox"); 1230 if (settings.Checked) { attributes.Add("checked", "true"); } 1231 settings.CssClass = "form__control " + settings.CssClass; 1232 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1233 1234 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1235 1236 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1237 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1238 @if (!string.IsNullOrEmpty(settings.Label)) 1239 { 1240 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1241 } 1242 @if (!string.IsNullOrEmpty(settings.HelpText)) 1243 { 1244 <small class="form__help-text">@settings.HelpText</small> 1245 } 1246 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1247 </div> 1248 } 1249 @using System.Reflection 1250 @using Dynamicweb.Rapido.Blocks.Components.General 1251 @using Dynamicweb.Rapido.Blocks.Components 1252 1253 1254 @* Component *@ 1255 1256 @helper RenderCheckboxListField(CheckboxListField settings) 1257 { 1258 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1259 @if (!string.IsNullOrEmpty(settings.Label)) 1260 { 1261 <label>@settings.Label</label> 1262 } 1263 @if (!string.IsNullOrEmpty(settings.HelpText)) 1264 { 1265 <small class="form__help-text">@settings.HelpText</small> 1266 } 1267 1268 @foreach (var item in settings.Options) 1269 { 1270 if (settings.Required) 1271 { 1272 item.Required = true; 1273 } 1274 if (settings.Disabled) 1275 { 1276 item.Disabled = true; 1277 } 1278 if (!string.IsNullOrEmpty(settings.Name)) 1279 { 1280 item.Name = settings.Name; 1281 } 1282 if (!string.IsNullOrEmpty(settings.CssClass)) 1283 { 1284 item.CssClass += settings.CssClass; 1285 } 1286 1287 /* value is not supported */ 1288 1289 if (!string.IsNullOrEmpty(settings.OnClick)) 1290 { 1291 item.OnClick += settings.OnClick; 1292 } 1293 if (!string.IsNullOrEmpty(settings.OnChange)) 1294 { 1295 item.OnChange += settings.OnChange; 1296 } 1297 @Render(item) 1298 } 1299 1300 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1301 </div> 1302 } 1303 @using Dynamicweb.Rapido.Blocks.Components.General 1304 1305 @* Component *@ 1306 1307 @helper RenderSearch(Search settings) 1308 { 1309 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1310 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1311 1312 if (string.IsNullOrEmpty(settings.Id)) 1313 { 1314 settings.Id = Guid.NewGuid().ToString("N"); 1315 } 1316 1317 var resultAttributes = new Dictionary<string, string>(); 1318 1319 if (settings.PageSize != 0) 1320 { 1321 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1322 } 1323 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1324 { 1325 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1326 if (!string.IsNullOrEmpty(groupValue)) 1327 { 1328 resultAttributes.Add("data-selected-group", groupValue); 1329 } 1330 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1331 { 1332 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1333 } 1334 } 1335 resultAttributes.Add("data-force-init", "true"); 1336 if (settings.GoToFirstSearchResultOnEnter) 1337 { 1338 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1339 } 1340 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1341 { 1342 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1343 } 1344 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1345 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1346 1347 if (settings.SecondSearchData != null) 1348 { 1349 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1350 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1351 } 1352 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1353 { 1354 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1355 } 1356 1357 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1358 1359 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1360 1361 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1362 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1363 { 1364 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1365 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1366 } 1367 1368 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1369 1370 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1371 @if (settings.SecondSearchData != null) 1372 { 1373 <div class="search__column search__column--products dw-mod"> 1374 <div class="search__column-header dw-mod">@Translate("Products")</div> 1375 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1376 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1377 { 1378 @Render(new Link { 1379 Title = Translate("View all"), 1380 CssClass = "js-view-all-button u-margin", 1381 Href = settings.SearchData.ResultsPageUrl 1382 }); 1383 } 1384 </div> 1385 <div class="search__column search__column--pages dw-mod"> 1386 <div class="search__column-header">@Translate("Pages")</div> 1387 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1388 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1389 { 1390 @Render(new Link 1391 { 1392 Title = Translate("View all"), 1393 CssClass = "js-view-all-button u-margin", 1394 Href = settings.SecondSearchData.ResultsPageUrl 1395 }); 1396 } 1397 </div> 1398 } 1399 else 1400 { 1401 <div class="search__column search__column--only dw-mod"> 1402 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1403 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1404 { 1405 @Render(new Link { 1406 Title = Translate("View all"), 1407 CssClass = "js-view-all-button u-margin", 1408 Href = settings.SearchData.ResultsPageUrl 1409 }); 1410 } 1411 </div> 1412 } 1413 </div> 1414 1415 @if (settings.SearchButton != null) 1416 { 1417 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1418 if (settings.RenderDefaultSearchIcon) 1419 { 1420 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1421 } 1422 @Render(settings.SearchButton); 1423 } 1424 </div> 1425 } 1426 @using System.Reflection 1427 @using Dynamicweb.Rapido.Blocks.Components.General 1428 @using Dynamicweb.Rapido.Blocks.Components 1429 1430 1431 @* Component *@ 1432 1433 @helper RenderSelectField(SelectField settings) 1434 { 1435 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1436 { 1437 settings.Id = Guid.NewGuid().ToString("N"); 1438 } 1439 1440 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1441 @if (!string.IsNullOrEmpty(settings.Label)) 1442 { 1443 <label for="@settings.Id">@settings.Label</label> 1444 } 1445 @if (!string.IsNullOrEmpty(settings.HelpText)) 1446 { 1447 <small class="form__help-text">@settings.HelpText</small> 1448 } 1449 1450 @if (settings.ActionButton != null) 1451 { 1452 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1453 <div class="form__field-combi u-no-margin dw-mod"> 1454 @RenderSelectBase(settings) 1455 @Render(settings.ActionButton) 1456 </div> 1457 } 1458 else 1459 { 1460 @RenderSelectBase(settings) 1461 } 1462 1463 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1464 </div> 1465 } 1466 1467 @helper RenderSelectBase(SelectField settings) 1468 { 1469 var attributes = new Dictionary<string, string>(); 1470 1471 /*base settings*/ 1472 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1473 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1474 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1475 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1476 if (settings.Required) { attributes.Add("required", "true"); } 1477 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1478 /*end*/ 1479 1480 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1481 1482 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1483 @if (settings.Default != null) 1484 { 1485 @Render(settings.Default) 1486 } 1487 1488 @foreach (var item in settings.Options) 1489 { 1490 if (settings.Value != null) { 1491 item.Checked = item.Value == settings.Value; 1492 } 1493 @Render(item) 1494 } 1495 </select> 1496 } 1497 @using System.Reflection 1498 @using Dynamicweb.Rapido.Blocks.Components.General 1499 @using Dynamicweb.Rapido.Blocks.Components 1500 1501 @* Component *@ 1502 1503 @helper RenderRadioButtonField(RadioButtonField settings) 1504 { 1505 var attributes = new Dictionary<string, string>(); 1506 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1507 { 1508 settings.Id = Guid.NewGuid().ToString("N"); 1509 } 1510 1511 /*base settings*/ 1512 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1513 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1514 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1515 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1516 if (settings.Required) { attributes.Add("required", "true"); } 1517 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1518 /*end*/ 1519 1520 attributes.Add("type", "radio"); 1521 if (settings.Checked) { attributes.Add("checked", "true"); } 1522 settings.CssClass = "form__control " + settings.CssClass; 1523 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1524 1525 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1526 1527 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1528 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1529 @if (!string.IsNullOrEmpty(settings.Label)) 1530 { 1531 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1532 } 1533 @if (!string.IsNullOrEmpty(settings.HelpText)) 1534 { 1535 <small class="form__help-text">@settings.HelpText</small> 1536 } 1537 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1538 </div> 1539 } 1540 @using System.Reflection 1541 @using Dynamicweb.Rapido.Blocks.Components.General 1542 @using Dynamicweb.Rapido.Blocks.Components 1543 1544 1545 @* Component *@ 1546 1547 @helper RenderRadioButtonListField(RadioButtonListField settings) 1548 { 1549 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1550 1551 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1552 @if (!string.IsNullOrEmpty(settings.Label)) 1553 { 1554 <label>@settings.Label</label> 1555 } 1556 @if (!string.IsNullOrEmpty(settings.HelpText)) 1557 { 1558 <small class="form__help-text">@settings.HelpText</small> 1559 } 1560 1561 @foreach (var item in settings.Options) 1562 { 1563 if (settings.Required) 1564 { 1565 item.Required = true; 1566 } 1567 if (settings.Disabled) 1568 { 1569 item.Disabled = true; 1570 } 1571 if (!string.IsNullOrEmpty(settings.Name)) 1572 { 1573 item.Name = settings.Name; 1574 } 1575 if (settings.Value != null && settings.Value == item.Value) 1576 { 1577 item.Checked = true; 1578 } 1579 if (!string.IsNullOrEmpty(settings.OnClick)) 1580 { 1581 item.OnClick += settings.OnClick; 1582 } 1583 if (!string.IsNullOrEmpty(settings.OnChange)) 1584 { 1585 item.OnChange += settings.OnChange; 1586 } 1587 if (!string.IsNullOrEmpty(settings.CssClass)) 1588 { 1589 item.CssClass += settings.CssClass; 1590 } 1591 @Render(item) 1592 } 1593 1594 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1595 </div> 1596 } 1597 @using System.Reflection 1598 @using Dynamicweb.Rapido.Blocks.Components.General 1599 @using Dynamicweb.Rapido.Blocks.Components 1600 1601 1602 @* Component *@ 1603 1604 @helper RenderNotificationMessage(NotificationMessage settings) 1605 { 1606 if (!string.IsNullOrEmpty(settings.Message)) 1607 { 1608 var attributes = new Dictionary<string, string>(); 1609 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1610 1611 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1612 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>@settings.Message</div> 1613 } 1614 } 1615 @using Dynamicweb.Rapido.Blocks.Components.General 1616 1617 1618 @* Component *@ 1619 1620 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1621 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1622 1623 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender> 1624 @if (settings.SubBlocks != null) { 1625 @RenderBlockList(settings.SubBlocks) 1626 } 1627 </div> 1628 } 1629 @using System.Reflection 1630 @using Dynamicweb.Rapido.Blocks.Components.General 1631 @using Dynamicweb.Rapido.Blocks.Components 1632 @using System.Text.RegularExpressions 1633 1634 1635 @* Component *@ 1636 1637 @helper RenderSticker(Sticker settings) { 1638 if (!String.IsNullOrEmpty(settings.Title)) { 1639 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1640 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1641 1642 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1643 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1644 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1645 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1646 optionalAttributes.Add("style", styleTag); 1647 } 1648 1649 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1650 } 1651 } 1652 1653 @using System.Reflection 1654 @using Dynamicweb.Rapido.Blocks.Components.General 1655 @using Dynamicweb.Rapido.Blocks.Components 1656 1657 1658 @* Component *@ 1659 1660 @helper RenderStickersCollection(StickersCollection settings) 1661 { 1662 if (settings.Stickers.Count > 0) 1663 { 1664 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1665 1666 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1667 @foreach (Sticker sticker in settings.Stickers) 1668 { 1669 @Render(sticker) 1670 } 1671 </div> 1672 } 1673 } 1674 1675 @using Dynamicweb.Rapido.Blocks.Components.General 1676 1677 1678 @* Component *@ 1679 1680 @helper RenderForm(Form settings) { 1681 if (settings != null) 1682 { 1683 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1684 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1685 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1686 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1687 var enctypes = new Dictionary<string, string> 1688 { 1689 { "multipart", "multipart/form-data" }, 1690 { "text", "text/plain" }, 1691 { "application", "application/x-www-form-urlencoded" } 1692 }; 1693 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1694 optionalAttributes.Add("method", settings.Method.ToString()); 1695 1696 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1697 { 1698 @settings.FormStartMarkup 1699 } 1700 else 1701 { 1702 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1703 } 1704 1705 foreach (var field in settings.GetFields()) 1706 { 1707 @Render(field) 1708 } 1709 1710 @:</form> 1711 } 1712 } 1713 @using System.Reflection 1714 @using Dynamicweb.Rapido.Blocks.Components.General 1715 @using Dynamicweb.Rapido.Blocks.Components 1716 1717 1718 @* Component *@ 1719 1720 @helper RenderText(Text settings) 1721 { 1722 @settings.Content 1723 } 1724 @using System.Reflection 1725 @using Dynamicweb.Rapido.Blocks.Components.General 1726 @using Dynamicweb.Rapido.Blocks.Components 1727 1728 1729 @* Component *@ 1730 1731 @helper RenderContentModule(ContentModule settings) { 1732 if (!string.IsNullOrEmpty(settings.Content)) 1733 { 1734 @settings.Content 1735 } 1736 } 1737 @using System.Reflection 1738 @using Dynamicweb.Rapido.Blocks.Components.General 1739 @using Dynamicweb.Rapido.Blocks.Components 1740 1741 1742 @* Component *@ 1743 1744 @helper RenderModal(Modal settings) { 1745 if (settings != null) 1746 { 1747 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1748 1749 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1750 1751 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1752 1753 <div class="modal-container"> 1754 @if (!settings.DisableDarkOverlay) 1755 { 1756 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1757 } 1758 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1759 @if (settings.Heading != null) 1760 { 1761 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1762 { 1763 <div class="modal__header"> 1764 @Render(settings.Heading) 1765 </div> 1766 } 1767 } 1768 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1769 @if (!string.IsNullOrEmpty(settings.BodyText)) 1770 { 1771 @settings.BodyText 1772 } 1773 @if (settings.BodyTemplate != null) 1774 { 1775 @settings.BodyTemplate 1776 } 1777 @{ 1778 var actions = settings.GetActions(); 1779 } 1780 </div> 1781 @if (actions.Length > 0) 1782 { 1783 <div class="modal__footer"> 1784 @foreach (var action in actions) 1785 { 1786 if (Pageview.Device.ToString() != "Mobile") { 1787 action.CssClass += " u-no-margin"; 1788 } else { 1789 action.CssClass += " u-full-width u-margin-bottom"; 1790 } 1791 1792 @Render(action) 1793 } 1794 </div> 1795 } 1796 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 1797 </div> 1798 </div> 1799 } 1800 } 1801 @using Dynamicweb.Rapido.Blocks.Components.General 1802 1803 @* Component *@ 1804 1805 @helper RenderMediaListItem(MediaListItem settings) 1806 { 1807 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1808 @if (!string.IsNullOrEmpty(settings.Label)) 1809 { 1810 if (!string.IsNullOrEmpty(settings.Link)) 1811 { 1812 @Render(new Link 1813 { 1814 Href = settings.Link, 1815 CssClass = "media-list-item__sticker dw-mod", 1816 ButtonLayout = ButtonLayout.None, 1817 Title = settings.Label, 1818 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1819 }) 1820 } 1821 else if (!string.IsNullOrEmpty(settings.OnClick)) 1822 { 1823 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1824 <span class="u-uppercase">@settings.Label</span> 1825 </span> 1826 } 1827 else 1828 { 1829 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1830 <span class="u-uppercase">@settings.Label</span> 1831 </span> 1832 } 1833 } 1834 <div class="media-list-item__wrap"> 1835 <div class="media-list-item__info dw-mod"> 1836 <div class="media-list-item__header dw-mod"> 1837 @if (!string.IsNullOrEmpty(settings.Title)) 1838 { 1839 if (!string.IsNullOrEmpty(settings.Link)) 1840 { 1841 @Render(new Link 1842 { 1843 Href = settings.Link, 1844 CssClass = "media-list-item__name dw-mod", 1845 ButtonLayout = ButtonLayout.None, 1846 Title = settings.Title, 1847 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1848 }) 1849 } 1850 else if (!string.IsNullOrEmpty(settings.OnClick)) 1851 { 1852 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1853 } 1854 else 1855 { 1856 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1857 } 1858 } 1859 1860 @if (!string.IsNullOrEmpty(settings.Status)) 1861 { 1862 <div class="media-list-item__state dw-mod">@settings.Status</div> 1863 } 1864 </div> 1865 @{ 1866 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1867 } 1868 1869 @Render(settings.InfoTable) 1870 </div> 1871 <div class="media-list-item__actions dw-mod"> 1872 <div class="media-list-item__actions-list dw-mod"> 1873 @{ 1874 var actions = settings.GetActions(); 1875 1876 foreach (ButtonBase action in actions) 1877 { 1878 action.ButtonLayout = ButtonLayout.None; 1879 action.CssClass += " media-list-item__action link"; 1880 1881 @Render(action) 1882 } 1883 } 1884 </div> 1885 1886 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 1887 { 1888 settings.SelectButton.CssClass += " u-no-margin"; 1889 1890 <div class="media-list-item__action-button"> 1891 @Render(settings.SelectButton) 1892 </div> 1893 } 1894 </div> 1895 </div> 1896 </div> 1897 } 1898 @using Dynamicweb.Rapido.Blocks.Components.General 1899 @using Dynamicweb.Rapido.Blocks.Components 1900 1901 @helper RenderTable(Table settings) 1902 { 1903 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1904 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1905 1906 var enumToClasses = new Dictionary<TableDesign, string> 1907 { 1908 { TableDesign.Clean, "table--clean" }, 1909 { TableDesign.Bordered, "table--bordered" }, 1910 { TableDesign.Striped, "table--striped" }, 1911 { TableDesign.Hover, "table--hover" }, 1912 { TableDesign.Compact, "table--compact" }, 1913 { TableDesign.Condensed, "table--condensed" }, 1914 { TableDesign.NoTopBorder, "table--no-top-border" } 1915 }; 1916 string tableDesignClass = ""; 1917 if (settings.Design != TableDesign.None) 1918 { 1919 tableDesignClass = enumToClasses[settings.Design]; 1920 } 1921 1922 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 1923 1924 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 1925 1926 <table @ComponentMethods.AddAttributes(resultAttributes)> 1927 @if (settings.Header != null) 1928 { 1929 <thead> 1930 @Render(settings.Header) 1931 </thead> 1932 } 1933 <tbody> 1934 @foreach (var row in settings.Rows) 1935 { 1936 @Render(row) 1937 } 1938 </tbody> 1939 @if (settings.Footer != null) 1940 { 1941 <tfoot> 1942 @Render(settings.Footer) 1943 </tfoot> 1944 } 1945 </table> 1946 } 1947 @using Dynamicweb.Rapido.Blocks.Components.General 1948 @using Dynamicweb.Rapido.Blocks.Components 1949 1950 @helper RenderTableRow(TableRow settings) 1951 { 1952 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1953 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1954 1955 var enumToClasses = new Dictionary<TableRowDesign, string> 1956 { 1957 { TableRowDesign.NoBorder, "table__row--no-border" }, 1958 { TableRowDesign.Border, "table__row--border" }, 1959 { TableRowDesign.TopBorder, "table__row--top-line" }, 1960 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 1961 { TableRowDesign.Solid, "table__row--solid" } 1962 }; 1963 1964 string tableRowDesignClass = ""; 1965 if (settings.Design != TableRowDesign.None) 1966 { 1967 tableRowDesignClass = enumToClasses[settings.Design]; 1968 } 1969 1970 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 1971 1972 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 1973 1974 <tr @ComponentMethods.AddAttributes(resultAttributes)> 1975 @foreach (var cell in settings.Cells) 1976 { 1977 if (settings.IsHeaderRow) 1978 { 1979 cell.IsHeader = true; 1980 } 1981 @Render(cell) 1982 } 1983 </tr> 1984 } 1985 @using Dynamicweb.Rapido.Blocks.Components.General 1986 @using Dynamicweb.Rapido.Blocks.Components 1987 @using Dynamicweb.Core 1988 1989 @helper RenderTableCell(TableCell settings) 1990 { 1991 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1992 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1993 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 1994 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 1995 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 1996 1997 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 1998 1999 string tagName = settings.IsHeader ? "th" : "td"; 2000 2001 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2002 @settings.Content 2003 @("</" + tagName + ">"); 2004 } 2005 @using System.Linq 2006 @using Dynamicweb.Rapido.Blocks.Components.General 2007 2008 @* Component *@ 2009 2010 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2011 { 2012 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2013 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2014 2015 if (settings.NumberOfPages > 1) 2016 { 2017 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2018 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2019 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2020 2021 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2022 @if (settings.ShowPagingInfo) 2023 { 2024 <div class="pager__info dw-mod"> 2025 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2026 </div> 2027 } 2028 <ul class="pager__list dw-mod"> 2029 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2030 { 2031 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2032 } 2033 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2034 { 2035 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2036 } 2037 @if (settings.GetPages().Any()) 2038 { 2039 foreach (var page in settings.GetPages()) 2040 { 2041 @Render(page) 2042 } 2043 } 2044 else 2045 { 2046 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2047 { 2048 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2049 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2050 } 2051 } 2052 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2053 { 2054 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2055 } 2056 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2057 { 2058 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2059 } 2060 </ul> 2061 </div> 2062 } 2063 } 2064 2065 @helper RenderPaginationItem(PaginationItem settings) 2066 { 2067 if (settings.Icon == null) 2068 { 2069 settings.Icon = new Icon(); 2070 } 2071 2072 settings.Icon.Label = settings.Label; 2073 <li class="pager__btn dw-mod"> 2074 @if (settings.IsActive) 2075 { 2076 <span class="pager__num pager__num--current dw-mod"> 2077 @Render(settings.Icon) 2078 </span> 2079 } 2080 else 2081 { 2082 <a href="@settings.Link" class="pager__num dw-mod"> 2083 @Render(settings.Icon) 2084 </a> 2085 } 2086 </li> 2087 } 2088 2089 2090 @using Dynamicweb.Rapido.Blocks.Components.General 2091 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2092 2093 2094 2095 @* Include the Blocks for the page *@ 2096 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2097 @using Dynamicweb.Core 2098 @using Dynamicweb.Ecommerce.International 2099 @using System 2100 @using System.Web 2101 @using System.Linq 2102 @using System.Collections.Generic 2103 @using Dynamicweb.Rapido.Blocks 2104 @using Dynamicweb.Rapido.Blocks.Components 2105 @using Dynamicweb.Rapido.Blocks.Components.General 2106 2107 @{ 2108 BlocksPage billingAddressCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 2109 var billingAddressesEditingSetting = Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetList("AddressesEditing"); 2110 bool isBillingAddressEditable = billingAddressesEditingSetting != null && billingAddressesEditingSetting.SelectedValue == "editable"; 2111 bool isBillingUserAnonymous = string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.UserName")); 2112 2113 Block billingAddressBlock = new Block() 2114 { 2115 Id = "BillingAddress", 2116 SortId = 10, 2117 Design = new Design 2118 { 2119 RenderType = RenderType.Column, 2120 Size = "12" 2121 }, 2122 BlocksList = new List<Block> { 2123 new Block { 2124 Id = "BillingAddressHeader", 2125 SortId = 10, 2126 Component = new Heading { Level = 3, Title = Translate("Billing address"), Icon = new Icon { Prefix = "fas", Name = "fa-home", LabelPosition = IconLabelPosition.After } }, 2127 Design = new Design { 2128 RenderType = RenderType.CardHeader, 2129 CssClass = "u-color-light--bg" 2130 } 2131 }, 2132 new Block { 2133 Id = "BillingAddressBody", 2134 SortId = 20, 2135 Design = new Design { 2136 RenderType = RenderType.CardBody, 2137 CssClass = "u-color-light--bg" 2138 } 2139 } 2140 } 2141 }; 2142 2143 billingAddressCheckoutPage.Add("AddressContainerRow", billingAddressBlock); 2144 2145 if (isBillingUserAnonymous) 2146 { 2147 billingAddressCheckoutPage.Add("BillingAddressBody", new Block 2148 { 2149 Id = "AlreadyACustomerButton", 2150 SortId = 10, 2151 Template = RenderAlreadyACustomerButton() 2152 }); 2153 2154 if (GetBoolean("Ecom:Cart.CreateUserInCheckout")) 2155 { 2156 billingAddressCheckoutPage.Add("BillingAddressBody", new Block 2157 { 2158 Id = "CreateUserInCheckoutHiddens", 2159 SortId = 20, 2160 Component = new HiddenField { Name = "EcomUserCreateNew", Value = "True" } 2161 }); 2162 } 2163 } 2164 2165 if (isBillingAddressEditable || isBillingUserAnonymous) 2166 { 2167 billingAddressCheckoutPage.Add("BillingAddressBody", new Block 2168 { 2169 Id = "EditableBillingAddress", 2170 SortId = 30, 2171 Template = RenderEditableBillingAddress() 2172 }); 2173 } 2174 else 2175 { 2176 billingAddressCheckoutPage.Add("BillingAddressBody", new Block 2177 { 2178 Id = "StaticBillingAddress", 2179 SortId = 30, 2180 Template = RenderStaticBillingAddress() 2181 }); 2182 } 2183 } 2184 2185 @helper RenderEditableBillingAddress() 2186 { 2187 @Render(new TextField { Label = Translate("Company"), Name = "EcomOrderCustomerCompany", Id = "EcomOrderCustomerCompany", Value = GetString("Ecom:Order.Customer.Company"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerCompany.ErrorMessage") }) 2188 @Render(new TextField { Label = Translate("Name"), Name = "EcomOrderCustomerName", Id = "EcomOrderCustomerName", Value = GetString("Ecom:Order.Customer.Name"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerName.ErrorMessage") }) 2189 2190 <div class="form__fields-collection form__fields-collection--2-3"> 2191 @Render(new TextField { Label = Translate("Phone"), Name = "EcomOrderCustomerPhone", Id = "EcomOrderCustomerPhone", Value = GetString("Ecom:Order.Customer.Phone"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerPhone.ErrorMessage") }) 2192 @Render(new TextField { Label = Translate("Email"), Name = "EcomOrderCustomerEmail", Id = "EcomOrderCustomerEmail", Value = GetString("Ecom:Order.Customer.Email"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerEmail.ErrorMessage") }) 2193 </div> 2194 2195 @Render(new TextField { Label = Translate("Address"), Name = "EcomOrderCustomerAddress", Id = "EcomOrderCustomerAddress", Value = GetString("Ecom:Order.Customer.Address"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerAddress.ErrorMessage") }) 2196 2197 <div class="form__fields-collection form__fields-collection--2-3"> 2198 @Render(new TextField { Label = Translate("Zip"), Name = "EcomOrderCustomerZip", Id = "EcomOrderCustomerZip", Value = GetString("Ecom:Order.Customer.Zip"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerZip.ErrorMessage") }) 2199 @Render(new TextField { Label = Translate("City"), Name = "EcomOrderCustomerCity", Id = "EcomOrderCustomerCity", Value = GetString("Ecom:Order.Customer.City"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerCity.ErrorMessage") }) 2200 </div> 2201 2202 if (GetLoop("CustomerRegions").Count > 0) 2203 { 2204 SelectField selectState = new SelectField 2205 { 2206 Id = "EcomOrderCustomerRegion", 2207 Name = "EcomOrderCustomerRegion", 2208 Label = Translate("State/Region"), 2209 OnChange = "Cart.SubmitCart()", 2210 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerRegion.ErrorMessage"), 2211 Value = GetString("Ecom:Order.Customer.Region") 2212 }; 2213 selectState.Options.Add(new SelectFieldOption 2214 { 2215 Label = Translate("Nothing selected"), 2216 Value = "", 2217 Disabled = true, 2218 Checked = true 2219 }); 2220 foreach (LoopItem state in GetLoop("CustomerRegions")) 2221 { 2222 selectState.Options.Add(new SelectFieldOption { Label = state.GetString("Ecom:CustomerRegion.Name"), Value = state.GetString("Ecom:CustomerRegion.RegionCode") }); 2223 } 2224 @Render(selectState) 2225 } 2226 else 2227 { 2228 @Render(new HiddenField { Id = "EcomOrderCustomerRegion", Name = "EcomOrderCustomerRegion" }) 2229 } 2230 2231 SelectField selectCountry = new SelectField 2232 { 2233 Id = "EcomOrderCustomerCountry", 2234 Name = "EcomOrderCustomerCountry", 2235 Label = Translate("Country"), 2236 OnChange = "resetStateField('EcomOrderCustomerRegion');Cart.SubmitCart()", 2237 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerCountry.ErrorMessage") 2238 }; 2239 foreach (LoopItem country in GetLoop("Countries")) 2240 { 2241 selectCountry.Options.Add(new SelectFieldOption { Label = country.GetString("Ecom:Country.Name"), Value = country.GetString("Ecom:Country.Code2"), Checked = country.GetBoolean("Ecom:Country.IsCustomerCountryOrDefault") }); 2242 } 2243 2244 @Render(selectCountry) 2245 } 2246 2247 @helper RenderStaticBillingField(string name, string value, string cssClass = "", string displayedValue = "") 2248 { 2249 if (string.IsNullOrEmpty(displayedValue)) 2250 { 2251 displayedValue = value; 2252 } 2253 2254 if (!string.IsNullOrEmpty(value)) 2255 { 2256 @Render(new HiddenField { Name = name, Id = name, Value = value }) 2257 <div class="@cssClass">@displayedValue</div> 2258 } 2259 } 2260 2261 @helper RenderStaticBillingAddress() 2262 { 2263 @RenderStaticBillingField("EcomOrderCustomerName", GetString("Ecom:Order.Customer.Name"), "u-bold") 2264 @RenderStaticBillingField("EcomOrderCustomerCompany", GetString("Ecom:Order.Customer.Company")) 2265 @RenderStaticBillingField("EcomOrderCustomerAddress", GetString("Ecom:Order.Customer.Address")) 2266 @RenderStaticBillingField("EcomOrderCustomerZip", GetString("Ecom:Order.Customer.Zip"), "u-inline") 2267 @RenderStaticBillingField("EcomOrderCustomerCity", GetString("Ecom:Order.Customer.City"), "u-inline") 2268 2269 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Region"))) 2270 { 2271 var stateName = ""; 2272 foreach (var state in GetLoop("CustomerRegions")) 2273 { 2274 if (state.GetString("Ecom:CustomerRegion.RegionCode") == GetString("Ecom:Order.Customer.Region")) 2275 { 2276 stateName = state.GetString("Ecom:CustomerRegion.Name"); 2277 } 2278 } 2279 2280 @RenderStaticBillingField("EcomOrderCustomerRegion", GetString("Ecom:Order.Customer.Region"), "", stateName) 2281 } 2282 2283 var countryList = GlobalISO.GetGlobalISOs().Cast<GlobalISO>().GroupBy(x => x.Code2).Select(x => x.FirstOrDefault()).ToDictionary(x => x.Code2, y => y.CountryUK); 2284 var countryCode = GetString("Ecom:Order.Customer.Country.Code"); 2285 var countryName = GetString("Ecom:Order.Customer.Country.Code"); 2286 if (countryList.ContainsKey(countryCode)) 2287 { 2288 countryName = countryList[countryCode]; 2289 } 2290 2291 @RenderStaticBillingField("EcomOrderCustomerCountry", countryCode, "", countryName); 2292 2293 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) && !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 2294 { 2295 <div class="u-margin-bottom"></div> 2296 } 2297 2298 @RenderStaticBillingField("EcomOrderCustomerEmail", GetString("Ecom:Order.Customer.Email")) 2299 @RenderStaticBillingField("EcomOrderCustomerPhone", GetString("Ecom:Order.Customer.Phone")) 2300 2301 if (!GetLoop("Countries").Any(country => country.GetString("Ecom:Country.Code2") == GetString("Ecom:Order.Customer.Country.Code"))) 2302 { 2303 @Render(new NotificationMessage { MessageType = NotificationMessageType.Error, Message = Translate("Your selected billing country is not supported") }) 2304 } 2305 } 2306 2307 @helper RenderAlreadyACustomerButton() 2308 { 2309 @Render(new Button { Title = Translate("Already a customer?"), ButtonLayout = ButtonLayout.Secondary, CssClass = "btn--full more", OnClick = "document.getElementById('SignInModalTrigger').checked = !document.getElementById('SignInModalTrigger').checked" }) 2310 } 2311 2312 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2313 @using Dynamicweb.Core 2314 @using System 2315 @using System.Linq 2316 @using System.Web 2317 @using System.Collections.Generic 2318 @using Dynamicweb.Rapido.Blocks 2319 @using Dynamicweb.Rapido.Blocks.Components 2320 @using Dynamicweb.Rapido.Blocks.Components.General 2321 @using Dynamicweb.Ecommerce.International; 2322 2323 @functions { 2324 string addressesViewMode; 2325 bool useBillingAddress = true; 2326 bool useAnotherAddress = true; 2327 bool isBillingOnly = true; 2328 bool hasDefault = true; 2329 } 2330 2331 @{ 2332 BlocksPage shippingAddressCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 2333 var addressLoop = GetLoop("UserManagement:User.UserAddresses"); 2334 hasDefault = addressLoop.FirstOrDefault(a => a.GetBoolean("UserManagement:User.UserAddress.Default")) != null; 2335 useAnotherAddress = addressLoop.Count == 1 || (addressLoop.Count > 1 && hasDefault); 2336 useBillingAddress = HttpContext.Current.Request.Cookies["UseAnotherAddress"] == null ? !useAnotherAddress : !Converter.ToBoolean(HttpContext.Current.Request.Cookies["UseAnotherAddress"].Value); 2337 bool isShippingUserAnonymous = string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.UserName")); 2338 var shippingAddressesEditingSetting = Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetList("AddressesEditing"); 2339 addressesViewMode = shippingAddressesEditingSetting != null && !isShippingUserAnonymous ? shippingAddressesEditingSetting.SelectedValue : "editable"; 2340 isBillingOnly = addressesViewMode == "readonly" && addressLoop.Count == 0; 2341 2342 //dont render shipping address if shipping provider has content 2343 bool shippingProviderHasContent = false; 2344 foreach (LoopItem shipping in GetLoop("Shippingmethods")) 2345 { 2346 if (Converter.ToBoolean(shipping.GetString("Ecom:Cart.Shippingmethod.IsSelected")) && !string.IsNullOrEmpty(shipping.GetString("Ecom:ShippingProvider.Content"))) 2347 { 2348 shippingProviderHasContent = true; 2349 } 2350 } 2351 2352 if (!shippingProviderHasContent) 2353 { 2354 Block shippingAddressBlock = new Block() 2355 { 2356 Id = "ShippingAddress", 2357 SortId = 20, 2358 Design = new Design 2359 { 2360 RenderType = RenderType.Column, 2361 Size = "12" 2362 }, 2363 BlocksList = new List<Block> { 2364 new Block { 2365 Id = "ShippingAddressHeader", 2366 SortId = 10, 2367 Component = new Heading { Level = 3, Title = Translate("Shipping address"), Icon = new Icon { Prefix = "fas", Name = "fa-map-marker", LabelPosition = IconLabelPosition.After } }, 2368 Design = new Design { 2369 RenderType = RenderType.CardHeader, 2370 CssClass = "u-color-light--bg" 2371 } 2372 }, 2373 new Block 2374 { 2375 Id = "ShippingAddressJavascript", 2376 SortId = 20, 2377 Template = RenderAddressesJavascript() 2378 }, 2379 new Block { 2380 Id = "ShippingAddressBody", 2381 SortId = 30, 2382 Design = new Design { 2383 RenderType = RenderType.CardBody, 2384 CssClass = "u-color-light--bg" 2385 }, 2386 BlocksList = new List<Block> 2387 { 2388 new Block 2389 { 2390 Id = "ShippingAddressSelector", 2391 SortId = 10, 2392 Design = new Design { CssClass = isBillingOnly ? "u-hidden" : ""}, 2393 Template = RenderShippingAddressSelector() 2394 } 2395 } 2396 } 2397 } 2398 }; 2399 shippingAddressCheckoutPage.Add("AddressContainerRow", shippingAddressBlock); 2400 2401 if (addressesViewMode != "editable") 2402 { 2403 shippingAddressCheckoutPage.Add("CheckoutBottomSnippets", new Block 2404 { 2405 Id = "SelectAnotherAddressModal", 2406 SortId = 40, 2407 Component = new Modal 2408 { 2409 Id = "MyAddressesSelector", 2410 Heading = new Heading 2411 { 2412 Icon = new Icon { Prefix = "far", Name = "fa-address-card", LabelPosition = IconLabelPosition.After }, 2413 Title = Translate("My addresses") 2414 }, 2415 Width = ModalWidth.Lg, 2416 OnClose = useBillingAddress ? "setUseBillingAddress(true)" : "" 2417 } 2418 }); 2419 2420 if (addressesViewMode != "readonly") 2421 { 2422 shippingAddressCheckoutPage.Add("CheckoutBottomSnippets", new Block 2423 { 2424 //common modal for edit and add 2425 Id = "ManageAddressModal", 2426 SortId = 100, 2427 Component = new Modal 2428 { 2429 Id = "ManageAddress", 2430 Heading = new Heading 2431 { 2432 Icon = new Icon { Prefix = "far", Name = "fa-plus", LabelPosition = IconLabelPosition.After }, 2433 Title = Translate("Add address") 2434 }, 2435 Width = ModalWidth.Md, 2436 OnClose = "document.querySelector('#MyAddressesSelectorModalTrigger').checked = true;" 2437 } 2438 }); 2439 } 2440 } 2441 2442 if (addressesViewMode != "editable") 2443 { 2444 var modal = new Modal 2445 { 2446 Id = "CountryIsNotAvailable", 2447 Heading = new Heading 2448 { 2449 Title = Translate("Sorry") 2450 }, 2451 Width = ModalWidth.Sm, 2452 BodyText = Translate("We cannot ship to this country.") 2453 }; 2454 modal.AddActions(new Button 2455 { 2456 Title = Translate("Choose another address"), 2457 OnClick = "document.getElementById('CountryIsNotAvailableModalTrigger').checked = false;" 2458 }); 2459 2460 shippingAddressCheckoutPage.Add("CheckoutBottomSnippets", new Block 2461 { 2462 //common modal for edit and add 2463 Id = "CountryIsNotAvailableModal", 2464 SortId = 110, 2465 Component = modal 2466 }); 2467 } 2468 2469 if (useBillingAddress) 2470 { 2471 shippingAddressCheckoutPage.Add("ShippingAddressBody", new Block 2472 { 2473 Id = "ShippingAddressFromBillingAddress", 2474 SortId = 20, 2475 Template = RenderShippingAddressFromBillingAddress() 2476 }); 2477 } 2478 else 2479 { 2480 shippingAddressCheckoutPage.Add("ShippingAddressBody", new Block 2481 { 2482 Id = "ShippingAddressContainer", 2483 SortId = 20, 2484 Design = new Design 2485 { 2486 CssClass = "js-shipping-address-container" 2487 } 2488 }); 2489 2490 if (addressesViewMode == "editable") 2491 { 2492 shippingAddressCheckoutPage.Add("ShippingAddressContainer", new Block 2493 { 2494 Id = "EditableShippingAddress", 2495 SortId = 10, 2496 Template = RenderEditableShippingAddress() 2497 }); 2498 } 2499 else 2500 { 2501 shippingAddressCheckoutPage.Add("ShippingAddressContainer", new Block 2502 { 2503 Id = "StaticShippingAddress", 2504 SortId = 10, 2505 Template = RenderStaticShippingAddress() 2506 }); 2507 if (!(addressesViewMode == "readonly" && addressLoop.Count == 1)) 2508 { 2509 shippingAddressCheckoutPage.Add("ShippingAddressContainer", new Block 2510 { 2511 Id = "SelectAnotherAddressButton", 2512 SortId = 20, 2513 Component = new Button 2514 { 2515 Title = Translate("Select shipping address"), 2516 ButtonLayout = ButtonLayout.Secondary, 2517 CssClass = "u-no-margin u-full-width", 2518 OnClick = "showAddressesListModal()" 2519 } 2520 }); 2521 } 2522 } 2523 } 2524 } 2525 } 2526 2527 @helper RenderShippingAddressSelector() 2528 { 2529 @Render(new RadioButtonListField 2530 { 2531 Name = "ShippingAddressSelector", 2532 Options = new List<RadioButtonField> 2533 { 2534 new RadioButtonField 2535 { 2536 Label = Translate("Ship to the billing address"), 2537 Value = "useBillingAddress", 2538 Id = "useBillingAddress", 2539 Checked = useBillingAddress, 2540 OnChange = "changeShippingAddressToBilling()" 2541 }, 2542 new RadioButtonField 2543 { 2544 Label = Translate("Ship to another address"), 2545 Value = "useAnotherAddress", 2546 Id = "useAnotherAddress", 2547 Checked = !useBillingAddress, 2548 OnChange = "setUseBillingAddress(false);" + (addressesViewMode != "editable" ? "showAddressesListModal()" : "Cart.SubmitCart()") 2549 } 2550 } 2551 }); 2552 } 2553 2554 @helper RenderShippingAddressFromBillingAddress() 2555 { 2556 if (isBillingOnly) 2557 { 2558 @RenderStaticShippingField("EcomOrderDeliveryName", GetString("Ecom:Order.Customer.Name"), "u-bold") 2559 @RenderStaticShippingField("EcomOrderDeliveryCompany", GetString("Ecom:Order.Customer.Company")) 2560 @RenderStaticShippingField("EcomOrderDeliveryAddress", GetString("Ecom:Order.Customer.Address")) 2561 @RenderStaticShippingField("EcomOrderDeliveryZip", GetString("Ecom:Order.Customer.Zip"), "u-inline") 2562 @RenderStaticShippingField("EcomOrderDeliveryCity", GetString("Ecom:Order.Customer.City"), "u-inline") 2563 2564 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Region"))) 2565 { 2566 var stateName = ""; 2567 foreach (var state in GetLoop("CustomerRegions")) 2568 { 2569 if (state.GetString("Ecom:CustomerRegion.RegionCode") == GetString("Ecom:Order.Customer.Region")) 2570 { 2571 stateName = state.GetString("Ecom:CustomerRegion.Name"); 2572 } 2573 } 2574 2575 @RenderStaticShippingField("EcomOrderDeliveryRegion", GetString("Ecom:Order.Customer.Region"), "", stateName) 2576 } 2577 2578 var countryList = GlobalISO.GetGlobalISOs().Cast<GlobalISO>().GroupBy(x => x.Code2).Select(x => x.FirstOrDefault()).ToDictionary(x => x.Code2, y => y.CountryUK); 2579 var countryCode = GetString("Ecom:Order.Customer.Country.Code"); 2580 var countryName = GetString("Ecom:Order.Customer.Country.Code"); 2581 if (countryList.ContainsKey(countryCode)) 2582 { 2583 countryName = countryList[countryCode]; 2584 } 2585 2586 @RenderStaticShippingField("EcomOrderDeliveryCountry", countryCode, "", countryName); 2587 2588 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) && !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 2589 { 2590 <div class="u-margin-bottom"></div> 2591 } 2592 2593 @RenderStaticShippingField("EcomOrderDeliveryEmail", GetString("Ecom:Order.Customer.Email")) 2594 @RenderStaticShippingField("EcomOrderDeliveryPhone", GetString("Ecom:Order.Customer.Phone")) 2595 } 2596 else 2597 { 2598 @Render(new HiddenField { Name = "EcomOrderDeliveryCompany", Id = "EcomOrderDeliveryCompany" }) 2599 @Render(new HiddenField { Name = "EcomOrderDeliveryName", Id = "EcomOrderDeliveryName" }) 2600 @Render(new HiddenField { Name = "EcomOrderDeliveryPhone", Id = "EcomOrderDeliveryPhone" }) 2601 @Render(new HiddenField { Name = "EcomOrderDeliveryEmail", Id = "EcomOrderDeliveryEmail" }) 2602 @Render(new HiddenField { Name = "EcomOrderDeliveryAddress", Id = "EcomOrderDeliveryAddress" }) 2603 @Render(new HiddenField { Name = "EcomOrderDeliveryZip", Id = "EcomOrderDeliveryZip" }) 2604 @Render(new HiddenField { Name = "EcomOrderDeliveryCity", Id = "EcomOrderDeliveryCity" }) 2605 @Render(new HiddenField { Name = "EcomOrderDeliveryRegion", Id = "EcomOrderDeliveryRegion" }) 2606 @Render(new HiddenField { Name = "EcomOrderDeliveryCountry", Id = "EcomOrderDeliveryCountry" }) 2607 } 2608 } 2609 2610 @helper RenderStaticShippingField(string name, string value, string cssClass = "", string displayedValue = "") 2611 { 2612 if (string.IsNullOrEmpty(displayedValue)) 2613 { 2614 displayedValue = value; 2615 } 2616 2617 @Render(new HiddenField { Name = name, Id = name, Value = value }) 2618 2619 if (!string.IsNullOrEmpty(displayedValue)) 2620 { 2621 <div class="@cssClass">@displayedValue</div> 2622 } 2623 } 2624 2625 @helper RenderStaticShippingAddress() 2626 { 2627 if (useAnotherAddress && HttpContext.Current.Request.Cookies["UseAnotherAddress"] == null) 2628 { 2629 var defaultAddress = hasDefault ? GetLoop("UserManagement:User.UserAddresses").FirstOrDefault(a => a.GetBoolean("UserManagement:User.UserAddress.Default")) : GetLoop("UserManagement:User.UserAddresses").FirstOrDefault(); 2630 2631 @RenderStaticShippingField("EcomOrderDeliveryName", defaultAddress.GetString("UserManagement:User.UserAddress.AccessUserAddress_UserName"), "u-bold") 2632 @RenderStaticShippingField("EcomOrderDeliveryCompany", defaultAddress.GetString("UserManagement:User.UserAddress.Company")) 2633 @RenderStaticShippingField("EcomOrderDeliveryAddress", defaultAddress.GetString("UserManagement:User.UserAddress.Address")) 2634 @RenderStaticShippingField("EcomOrderDeliveryAddress2", defaultAddress.GetString("UserManagement:User.UserAddress.Address2")) 2635 @RenderStaticShippingField("EcomOrderDeliveryZip", defaultAddress.GetString("UserManagement:User.UserAddress.Zip"), "u-inline") 2636 @RenderStaticShippingField("EcomOrderDeliveryCity", defaultAddress.GetString("UserManagement:User.UserAddress.City"), "u-inline") 2637 @RenderStaticShippingField("EcomOrderDeliveryRegion", defaultAddress.GetString("UserManagement:User.UserAddress.State")) 2638 @RenderStaticShippingField("EcomOrderDeliveryCountry", defaultAddress.GetString("UserManagement:User.UserAddress.CountryCode"), "", defaultAddress.GetString("UserManagement:User.UserAddress.Culture.CountryName")) 2639 2640 if (!string.IsNullOrEmpty(GetString("UserManagement:User.DefaultAddress.Phone"))) 2641 { 2642 <div class="u-margin-bottom"></div> 2643 } 2644 2645 @RenderStaticShippingField("EcomOrderDeliveryEmail", defaultAddress.GetString("UserManagement:User.UserAddress.Email")) 2646 @RenderStaticShippingField("EcomOrderDeliveryPhone", defaultAddress.GetString("UserManagement:User.UserAddress.Phone")) 2647 2648 <div class="u-margin-bottom"></div> 2649 } else { 2650 @RenderStaticShippingField("EcomOrderDeliveryName", GetString("Ecom:Order.Delivery.Name"), "u-bold") 2651 @RenderStaticShippingField("EcomOrderDeliveryCompany", GetString("Ecom:Order.Delivery.Company")) 2652 @RenderStaticShippingField("EcomOrderDeliveryAddress", GetString("Ecom:Order.Delivery.Address")) 2653 @RenderStaticShippingField("EcomOrderDeliveryZip", GetString("Ecom:Order.Delivery.Zip"), "u-inline") 2654 @RenderStaticShippingField("EcomOrderDeliveryCity", GetString("Ecom:Order.Delivery.City"), "u-inline") 2655 2656 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 2657 { 2658 var stateName = ""; 2659 foreach (var state in GetLoop("DeliveryRegions")) 2660 { 2661 if (state.GetString("Ecom:DeliveryRegion.RegionCode") == GetString("Ecom:Order.Delivery.Region")) 2662 { 2663 stateName = state.GetString("Ecom:DeliveryRegion.Name"); 2664 } 2665 } 2666 2667 @RenderStaticShippingField("EcomOrderDeliveryRegion", GetString("Ecom:Order.Delivery.Region"), "", stateName) 2668 } 2669 else 2670 { 2671 @RenderStaticShippingField("EcomOrderDeliveryRegion", "") 2672 } 2673 2674 foreach (LoopItem country in GetLoop("Countries")) 2675 { 2676 if (country.GetBoolean("Ecom:Country.IsDeliveryCountryOrDefault")) 2677 { 2678 @RenderStaticShippingField("EcomOrderDeliveryCountry", country.GetString("Ecom:Country.Code2"), "", country.GetString("Ecom:Country.Name")) 2679 break; 2680 } 2681 } 2682 2683 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Email")) && !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone"))) 2684 { 2685 <div class="u-margin-bottom"></div> 2686 } 2687 2688 @RenderStaticShippingField("EcomOrderDeliveryEmail", GetString("Ecom:Order.Delivery.Email")) 2689 @RenderStaticShippingField("EcomOrderDeliveryPhone", GetString("Ecom:Order.Delivery.Phone")) 2690 2691 <div class="u-margin-bottom"></div> 2692 } 2693 } 2694 2695 @helper RenderAddressesJavascript() 2696 { 2697 <script> 2698 function setUseBillingAddress(useBillingAddress) { 2699 RememberState.SetCookie("useAnotherAddress", !useBillingAddress) 2700 document.getElementById("useBillingAddress").checked = useBillingAddress; 2701 document.getElementById("useBillingAddress").setAttribute("checked", useBillingAddress); 2702 } 2703 2704 function changeShippingAddressToBilling() { 2705 setUseBillingAddress(true); 2706 document.querySelector(".js-shipping-address-container").classList.add("u-hidden"); 2707 Cart.FillShippingAddress({ 2708 Company: "", 2709 Name: "", 2710 Phone: "", 2711 Email: "", 2712 Address: "", 2713 Zip: "", 2714 City: "", 2715 Region: "", 2716 Country: "" 2717 }); 2718 Cart.SubmitCart() 2719 } 2720 2721 // MENNT Start 2722 document.addEventListener("DOMContentLoaded", function () { 2723 let useAnotherAddress = RememberState.GetCookie("useAnotherAddress"); 2724 let autoSelectShippingActivated = RememberState.GetCookie("autoSelectShippingActivated"); 2725 2726 if (!autoSelectShippingActivated) { 2727 setUseBillingAddress(false); 2728 showAddressesListModal(); 2729 RememberState.SetCookie("autoSelectShippingActivated", true); 2730 } 2731 }); 2732 // MENNT End 2733 </script> 2734 2735 if (addressesViewMode != "editable") 2736 { 2737 <script> 2738 let manageAddressPageId = "@GetPageIdByNavigationTag("AddressesForCheckout")"; 2739 2740 function showLoader(bodyElement) { 2741 let minHeightContainer = document.createElement("div"); 2742 minHeightContainer.className = "u-min-h180px"; 2743 let loader = document.createElement("div"); 2744 loader.className = "modal__loader"; 2745 let spinner = document.createElement("i"); 2746 spinner.className = "fa-4x fa-circle-notch fa-spin fas u-color-light"; 2747 loader.appendChild(spinner); 2748 minHeightContainer.appendChild(loader); 2749 bodyElement.innerHTML = ""; 2750 bodyElement.appendChild(minHeightContainer); 2751 } 2752 2753 //refresh addresses list 2754 function showAddressesListModal() { 2755 showLoader(document.querySelector("#MyAddressesSelectorModal .modal__body")); 2756 document.querySelector("#MyAddressesSelectorModalTrigger").checked = true; 2757 Request.Fetch().get( 2758 "Default.aspx?ID=" + manageAddressPageId, 2759 function (result) { 2760 document.querySelector("#MyAddressesSelectorModal .modal__body").innerHTML = result; 2761 }, 2762 function () { }, 2763 false 2764 ); 2765 } 2766 2767 var countries = []; 2768 2769 @foreach (var country in GetLoop("Countries")) 2770 { 2771 <text>countries.push("@country.GetString("Ecom:Country.Code2")");</text> 2772 } 2773 2774 function countryIsAvailable(countryCode) 2775 { 2776 return countries.indexOf(countryCode) != -1; 2777 } 2778 2779 function selectAddress(address) { 2780 if (countryIsAvailable(address.Country)) { 2781 Cart.FillShippingAddress(address); 2782 Cart.SubmitCart(); 2783 } else { 2784 document.getElementById("CountryIsNotAvailableModalTrigger").checked = true; 2785 } 2786 } 2787 </script> 2788 } 2789 2790 if (addressesViewMode == "static") 2791 { 2792 <script> 2793 let countryRegions = { 2794 2795 @foreach (var country in GetLoop("Countries")) 2796 { 2797 var regions = Dynamicweb.Ecommerce.Services.Countries.GetRegions(country.GetString("Ecom:Country.Code2")); 2798 2799 if (regions.Count > 0) 2800 { 2801 <text>"@country.GetString("Ecom:Country.Code2")": {</text> 2802 } 2803 2804 <text>@string.Join(",", regions.Select(region => "\"" + region.RegionCode + "\": \"" + region.Name + "\""))</text> 2805 2806 if (regions.Count > 0) 2807 { 2808 <text>},</text> 2809 } 2810 } 2811 2812 } 2813 2814 function changeCountry(countryCode) { 2815 document.getElementById("countryHidden").value = countryCode; 2816 let stateField = document.getElementById("UserManagement_Form_State"); 2817 stateField.innerHTML = ""; 2818 let currentRegions = countryRegions[countryCode] 2819 2820 if (currentRegions != null) { 2821 for (let regionCode in currentRegions) { 2822 let option = document.createElement("option"); 2823 option.text = currentRegions[regionCode]; 2824 option.value = regionCode; 2825 stateField.add(option); 2826 } 2827 stateField.closest(".js-state-field").classList.remove("u-hidden"); 2828 } else { 2829 let option = document.createElement("option"); 2830 option.value = ""; 2831 stateField.add(option); 2832 stateField.closest(".js-state-field").classList.add("u-hidden"); 2833 } 2834 } 2835 </script> 2836 <script id="AddAddressFormTemplate" type="text/html"> 2837 </script> 2838 <script id="AddAddressHeadingTemplate" type="text/html"> 2839 @Render(new Heading { Title = Translate("Add address"), Icon = new Icon { Prefix = "far", Name = "fa-plus", LabelPosition = IconLabelPosition.After } }) 2840 </script> 2841 <script id="EditAddressHeadingTemplate" type="text/html"> 2842 @Render(new Heading { Title = Translate("Edit address"), Icon = new Icon { Prefix = "fas", Name = "fa-pencil", LabelPosition = IconLabelPosition.After } }) 2843 </script> 2844 <script> 2845 //get add address form 2846 document.addEventListener("DOMContentLoaded", function () { 2847 Request.Fetch().get( 2848 "Default.aspx?ID=" + manageAddressPageId + "&ManageAddressesFormAction=Add", 2849 function (result) { 2850 document.querySelector("#AddAddressFormTemplate").innerHTML = result; 2851 document.querySelector("#ManageAddressModal .modal__body").innerHTML = document.getElementById("AddAddressFormTemplate").innerHTML; 2852 }, 2853 function () { }, 2854 false 2855 ); 2856 }); 2857 2858 function openAddAddressModal() { 2859 //get already saved template to prevent additional loading 2860 document.getElementById("MyAddressesSelectorModalTrigger").checked = false; 2861 document.querySelector("#ManageAddressModal .modal__header").innerHTML = document.getElementById("AddAddressHeadingTemplate").innerHTML; 2862 document.querySelector("#ManageAddressModal .modal__body").innerHTML = document.getElementById("AddAddressFormTemplate").innerHTML; 2863 regionLabels.LocalizeRegionLabels("UserManagement_Form_State", "UserManagement_Form_Country", true); 2864 document.getElementById("ManageAddressModalTrigger").checked = true; 2865 } 2866 2867 //open edit modal 2868 function openEditAddressModal(addressId) { 2869 document.getElementById("MyAddressesSelectorModalTrigger").checked = false; 2870 showLoader(document.querySelector("#ManageAddressModal .modal__body")); 2871 document.querySelector("#ManageAddressModal .modal__header").innerHTML = document.getElementById("EditAddressHeadingTemplate").innerHTML; 2872 document.getElementById("ManageAddressModalTrigger").checked = true; 2873 Request.Fetch().post( 2874 "Default.aspx?ID=" + manageAddressPageId, 2875 { 2876 "ManageAddressesFormAction": "Update", 2877 "SelectedAddressId": addressId 2878 }, 2879 function (result) { 2880 document.querySelector("#ManageAddressModal .modal__body").innerHTML = result; 2881 regionLabels.LocalizeRegionLabels("UserManagement_Form_State", "UserManagement_Form_Country", true); 2882 }, 2883 function () { }, 2884 false 2885 ); 2886 } 2887 2888 //save address (add / edit) 2889 function saveAddress(mode) { 2890 let form = document.getElementById("AddressForm"); 2891 let formData = new FormData(form); 2892 if (!form.checkValidity()) { 2893 // Create the temporary button, click and remove it 2894 var tmpSubmit = document.createElement("button"); 2895 form.appendChild(tmpSubmit); 2896 tmpSubmit.click(); 2897 form.removeChild(tmpSubmit); 2898 } else { 2899 Request.Fetch().post( 2900 "Default.aspx?ID=" + manageAddressPageId + "&ManageAddressesFormAction=Add", 2901 formData, 2902 function (result) { 2903 document.getElementById("ManageAddressModalTrigger").checked = false; 2904 showAddressesListModal(); 2905 }, 2906 function () { }, 2907 false 2908 ); 2909 } 2910 } 2911 2912 //delete 2913 function deleteAddress(addressId, button) { 2914 Request.Fetch().post( 2915 "Default.aspx?ID=" + manageAddressPageId, 2916 { 2917 SelectedAddressId: addressId, 2918 ManageAddressesFormAction: "Delete" 2919 }, 2920 function (result) { 2921 button.closest(".media-list-item").remove(); 2922 }, 2923 function () { }, 2924 false 2925 ); 2926 } 2927 </script> 2928 } 2929 } 2930 2931 @helper RenderEditableShippingAddress() 2932 { 2933 @Render(new TextField { Label = Translate("Company"), Name = "EcomOrderDeliveryCompany", Id = "EcomOrderDeliveryCompany", Value = GetString("Ecom:Order.Delivery.Company"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryCompany.ErrorMessage") }) 2934 @Render(new TextField { Label = Translate("Name"), Name = "EcomOrderDeliveryName", Id = "EcomOrderDeliveryName", Value = GetString("Ecom:Order.Delivery.Name"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryName.ErrorMessage") }) 2935 2936 <div class="form__fields-collection form__fields-collection--2-3"> 2937 @Render(new TextField { Label = Translate("Phone"), Name = "EcomOrderDeliveryPhone", Id = "EcomOrderDeliveryPhone", Value = GetString("Ecom:Order.Delivery.Phone"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryPhone.ErrorMessage") }) 2938 @Render(new TextField { Label = Translate("Email"), Name = "EcomOrderDeliveryEmail", Id = "EcomOrderDeliveryEmail", Value = GetString("Ecom:Order.Delivery.Email"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryEmail.ErrorMessage") }) 2939 </div> 2940 2941 @Render(new TextField { Label = Translate("Address"), Name = "EcomOrderDeliveryAddress", Id = "EcomOrderDeliveryAddress", Value = GetString("Ecom:Order.Delivery.Address"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryAddress.ErrorMessage") }) 2942 2943 <div class="form__fields-collection form__fields-collection--2-3"> 2944 @Render(new TextField { Label = Translate("Zip"), Name = "EcomOrderDeliveryZip", Id = "EcomOrderDeliveryZip", Value = GetString("Ecom:Order.Delivery.Zip"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryZip.ErrorMessage") }) 2945 @Render(new TextField { Label = Translate("City"), Name = "EcomOrderDeliveryCity", Id = "EcomOrderDeliveryCity", Value = GetString("Ecom:Order.Delivery.City"), ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryCity.ErrorMessage") }) 2946 </div> 2947 2948 if (GetLoop("DeliveryRegions").Count > 0) 2949 { 2950 SelectField selectState = new SelectField 2951 { 2952 Id = "EcomOrderDeliveryRegion", 2953 Name = "EcomOrderDeliveryRegion", 2954 Label = Translate("State/Region"), 2955 OnChange = "Cart.SubmitCart()", 2956 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryRegion.ErrorMessage"), 2957 Value = GetString("Ecom:Order.Delivery.Region") 2958 }; 2959 selectState.Options.Add(new SelectFieldOption 2960 { 2961 Label = Translate("Nothing selected"), 2962 Value = "", 2963 Disabled = true, 2964 Checked = true 2965 }); 2966 foreach (LoopItem state in GetLoop("DeliveryRegions")) 2967 { 2968 selectState.Options.Add(new SelectFieldOption { Label = state.GetString("Ecom:DeliveryRegion.Name"), Value = state.GetString("Ecom:DeliveryRegion.RegionCode") }); 2969 } 2970 @Render(selectState) 2971 } 2972 else 2973 { 2974 @Render(new HiddenField { Id = "EcomOrderDeliveryRegion", Name = "EcomOrderDeliveryRegion" }) 2975 } 2976 2977 SelectField selectCountry = new SelectField 2978 { 2979 Id = "EcomOrderDeliveryCountry", 2980 Name = "EcomOrderDeliveryCountry", 2981 Label = Translate("Country"), 2982 OnChange = "resetStateField('EcomOrderDeliveryRegion');Cart.SubmitCart()", 2983 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderDeliveryCountry.ErrorMessage") 2984 }; 2985 2986 foreach (LoopItem country in GetLoop("Countries")) 2987 { 2988 selectCountry.Options.Add(new SelectFieldOption { Label = country.GetString("Ecom:Country.Name"), Value = country.GetString("Ecom:Country.Code2"), Checked = country.GetBoolean("Ecom:Country.IsDeliveryCountryOrDefault") }); 2989 } 2990 2991 @Render(selectCountry) 2992 } 2993 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2994 @using Dynamicweb.Core 2995 @using System 2996 @using System.Web 2997 @using System.Linq 2998 @using System.Collections.Generic 2999 @using Dynamicweb.Rapido.Blocks 3000 @using Dynamicweb.Rapido.Blocks.Components 3001 @using Dynamicweb.Rapido.Blocks.Components.General 3002 3003 @{ 3004 BlocksPage paymentCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 3005 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 3006 string paymentCardHeightClass = Pageview.Device.ToString() != "Tablet" ? "u-full-height" : ""; 3007 bool paymentCountryIsNotSupported = !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Country.Code")) && !GetLoop("Countries").Any(country => country.GetString("Ecom:Country.Code2") == GetString("Ecom:Order.Customer.Country.Code")); 3008 3009 var paymentBlock = new Block() 3010 { 3011 Id = "Payment", 3012 SortId = 10, 3013 Design = new Design 3014 { 3015 RenderType = RenderType.Column, 3016 Size = "6-auto" 3017 } 3018 }; 3019 3020 var paymentHeader = new Block 3021 { 3022 Id = "PaymentHeader", 3023 SortId = 10, 3024 Component = new Heading { Level = 3, Title = Translate("Payment"), Icon = new Icon { Prefix = "fas", Name = "fa-credit-card", LabelPosition = IconLabelPosition.After } }, 3025 Design = new Design 3026 { 3027 RenderType = RenderType.CardHeader, 3028 CssClass = "u-color-light--bg" 3029 } 3030 }; 3031 3032 var paymentBody = new Block 3033 { 3034 Id = "PaymentBody", 3035 SortId = 20, 3036 Design = new Design 3037 { 3038 RenderType = RenderType.CardBody, 3039 CssClass = "u-color-light--bg " + paymentCardHeightClass 3040 } 3041 }; 3042 3043 if (paymentCountryIsNotSupported) 3044 { 3045 paymentBlock.Add(paymentHeader); 3046 paymentBody.Component = new NotificationMessage { MessageType = NotificationMessageType.Error, Message = Translate("There is no available payment options") }; 3047 paymentBlock.Add(paymentBody); 3048 } 3049 else if (!Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HidePayment") && GetLoop("Paymethods").Count != 0 && !pointShop) 3050 { 3051 paymentBlock.Add(paymentHeader); 3052 paymentBody.Template = RenderPayment(); 3053 paymentBlock.Add(paymentBody); 3054 } 3055 else 3056 { 3057 paymentBlock.Template = RenderHiddenPayment(); 3058 paymentBlock.Design.CssClass = "u-hidden"; 3059 } 3060 3061 paymentCheckoutPage.Add("OrderContainerRow", paymentBlock); 3062 } 3063 3064 @helper RenderPayment() 3065 { 3066 string errorMessage = GetString("Ecom:Cart.ValidationError.EcomCartPaymethodId.ErrorMessage"); 3067 string savedCardName = ""; 3068 3069 foreach (LoopItem payment in GetLoop("Paymethods")) 3070 { 3071 bool supportSavedCards = payment.GetBoolean("Ecom:Cart.Paymethod.SupportSavedCard") && Dynamicweb.Core.Converter.ToBoolean(GetGlobalValue("Global:Extranet.UserName")); 3072 bool cardIsSaved = !String.IsNullOrEmpty(payment.GetString("Ecom:Order.SavedCardName")) ? true : false; 3073 3074 <div> 3075 <div class="u-margin-bottom"> 3076 @Render(new RadioButtonField 3077 { 3078 Name = "EcomCartPaymethodId", 3079 Label = payment.GetString("Ecom:Cart.Paymethod.Name"), 3080 Id = "EcomCartPaymethodId_" + payment.GetString("Ecom:Cart.Paymethod.ID"), 3081 Value = payment.GetString("Ecom:Cart.Paymethod.ID"), 3082 OnChange = "Cart.DeselectRadioGroup('EcomCartSavedCardID'); Cart.SubmitCart()", 3083 Checked = payment.GetBoolean("Ecom:Cart.Paymethod.IsSelected"), 3084 ExtraAttributes = new Dictionary<string, string>() { 3085 { "data-expand", "savedCards_" + payment.GetString("Ecom:Cart.Paymethod.Name").Replace(" ", "_") } 3086 } 3087 }) 3088 </div> 3089 3090 @if (supportSavedCards) 3091 { 3092 <div class="expandable--collapsed dw-mod" data-trigger="savedCards_@payment.GetString("Ecom:Cart.Paymethod.Name").Replace(" ", "_")"> 3093 <div class="u-border-top u-border-bottom u-padding u-margin-bottom show"> 3094 @Render(new CheckboxField { Label = Translate("Save used card"), Name = "EcomOrderSavedCardCreate", Id = "EcomOrderSavedCardCreate_" + payment.GetString("Ecom:Cart.Paymethod.ID"), Value = "true", Checked = cardIsSaved }) 3095 3096 @Render(new TextField 3097 { 3098 Placeholder = Translate("Saved card name"), 3099 Value = payment.GetString("Ecom:Order.SavedCardName"), 3100 OnChange = "document.getElementById('MySavedCardName').value=this.value" 3101 }) 3102 </div> 3103 </div> 3104 } 3105 </div> 3106 } 3107 if (!string.IsNullOrEmpty(errorMessage)) 3108 { 3109 @Render(new NotificationMessage { Message = errorMessage, MessageType = NotificationMessageType.Error }) 3110 } 3111 3112 if (GetLoop("SavedCards").Count > 0) 3113 { 3114 <div class="u-bold u-margin-top u-margin-bottom">@Translate("Pay with a saved card")</div> 3115 3116 foreach (LoopItem card in GetLoop("SavedCards")) 3117 { 3118 @Render(new RadioButtonField 3119 { 3120 Name = "EcomCartSavedCardID", 3121 Label = card.GetString("Ecom:SavedCard.Name"), 3122 Value = card.GetString("Ecom:SavedCard.ID"), 3123 OnChange = "Cart.DeselectRadioGroup('EcomCartPaymethodID'); Cart.SubmitCart()", 3124 Checked = card.GetBoolean("Ecom:SavedCard.IsSelected") 3125 }) 3126 3127 if (!card.GetBoolean("Ecom:SavedCard.IsSelected")) 3128 { 3129 savedCardName = card.GetString("Ecom:SavedCard.Name"); 3130 } 3131 } 3132 } 3133 3134 @Render(new HiddenField { Name = "EcomOrderSavedCardName", Id = "MySavedCardName", Value = savedCardName }) 3135 } 3136 3137 @helper RenderHiddenPayment() 3138 { 3139 foreach (LoopItem payment in GetLoop("Paymethods")) 3140 { 3141 string selected = "checked"; 3142 3143 <div class="form__field-group u-margin-bottom"> 3144 <input type="radio" name="EcomCartPaymethodID" id="EcomCartPaymethodID_@payment.GetString("Ecom:Cart.Paymethod.ID")" value="@payment.GetString("Ecom:Cart.Paymethod.ID")" @selected /> 3145 <label for="EcomCartPaymethodID_@payment.GetString("Ecom:Cart.Paymethod.ID")" class="u-inline">@payment.GetString("Ecom:Cart.Paymethod.Name")</label> 3146 </div> 3147 } 3148 } 3149 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3150 @using Dynamicweb.Core 3151 @using System 3152 @using System.Linq 3153 @using System.Collections.Generic 3154 @using Dynamicweb.Rapido.Blocks 3155 @using Dynamicweb.Rapido.Blocks.Components 3156 @using Dynamicweb.Rapido.Blocks.Components.General 3157 3158 @{ 3159 BlocksPage shippingCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 3160 string shippingCardHeightClass = Pageview.Device.ToString() != "Tablet" ? "u-full-height" : ""; 3161 List<LoopItem> shippingMethods = GetLoop("Shippingmethods"); 3162 if (Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideShippingWarningsAndErrors")) 3163 { 3164 shippingMethods = shippingMethods.Where(s => !(string.Concat(s.GetString("Ecom:Cart.Shippingmethod.Error"), s.GetString("Ecom:Cart.Shippingmethod.Warning")).IsNotNullOrEmpty() && s.GetDouble("Ecom:Cart.ShippingMethod.Price.Price").Equals(0))).ToList(); 3165 } 3166 var shippingDeliveryCountryCode = GetString("Ecom:Order.Delivery.Country.Code"); 3167 if (string.IsNullOrEmpty(shippingDeliveryCountryCode)) 3168 { 3169 shippingDeliveryCountryCode = GetString("Ecom:Order.Customer.Country.Code"); 3170 } 3171 bool shippingCountryIsNotSupported = !string.IsNullOrEmpty(shippingDeliveryCountryCode) && !GetLoop("Countries").Any(country => country.GetString("Ecom:Country.Code2") == shippingDeliveryCountryCode); 3172 3173 var shippingBlock = new Block() 3174 { 3175 Id = "Shipping", 3176 SortId = 20, 3177 Design = new Design 3178 { 3179 RenderType = RenderType.Column, 3180 Size = "6-auto" 3181 } 3182 }; 3183 3184 var shippingHeader = new Block 3185 { 3186 Id = "ShippingMethodHeader", 3187 SortId = 10, 3188 Component = new Heading { Level = 3, Title = Translate("Shipping"), Icon = new Icon { Prefix = "fas", Name = "fa-truck", LabelPosition = IconLabelPosition.After } }, 3189 Design = new Design 3190 { 3191 RenderType = RenderType.CardHeader, 3192 CssClass = "u-color-light--bg" 3193 } 3194 }; 3195 3196 var shippingBody = new Block 3197 { 3198 Id = "ShippingMethodsBody", 3199 SortId = 20, 3200 Design = new Design { 3201 RenderType = RenderType.CardBody, 3202 CssClass = "u-color-light--bg " + shippingCardHeightClass 3203 } 3204 }; 3205 3206 /*if (shippingCountryIsNotSupported) 3207 { 3208 shippingBody.Component = new NotificationMessage { MessageType = NotificationMessageType.Error, Message = Translate("There is no available shipping options") }; 3209 shippingBlock.Add(shippingHeader); 3210 shippingBlock.Add(shippingBody); 3211 shippingCheckoutPage.Add("OrderContainerRow", shippingBlock); 3212 } 3213 else if (!Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideShipping") && shippingMethods.Count > 0) 3214 {*/ 3215 shippingBody.Template = RenderShipping(shippingMethods); 3216 shippingBlock.Add(shippingHeader); 3217 shippingBlock.Add(shippingBody); 3218 shippingCheckoutPage.Add("OrderContainerRow", shippingBlock); 3219 3220 /*Block parcelShopsModal = new Block() 3221 { 3222 Id = "ParcelShopsModal", 3223 SortId = 10, 3224 Component = new Modal 3225 { 3226 Id = "ParcelShops", 3227 Heading = new Heading 3228 { 3229 Title = Pageview.Device.ToString() != "Mobile" ? Translate("Choose a parcel shop") : Translate("Choose") 3230 }, 3231 BodyTemplate = RenderParcelShopsModalContent(), 3232 Width = ModalWidth.Lg 3233 } 3234 }; 3235 shippingCheckoutPage.Add("CheckoutTopSnippets", parcelShopsModal); 3236 3237 Block parcelShopsScriptTemplates = new Block() 3238 { 3239 Id = "ShippingProviderTemplates", 3240 SortId = 10, 3241 Template = RenderShippingProviderTemplates() 3242 }; 3243 shippingCheckoutPage.Add("CheckoutBottomSnippets", parcelShopsScriptTemplates);*/ 3244 /*}*/ 3245 } 3246 3247 @helper RenderShipping(List<LoopItem> shippingMethods) 3248 { 3249 if (shippingMethods == null) 3250 { 3251 shippingMethods = GetLoop("Shippingmethods"); 3252 } 3253 bool defaultShippingIsSet = Dynamicweb.Ecommerce.Orders.Shipping.GetDefaultShippingMethod(Dynamicweb.Ecommerce.Common.Context.Cart.ShippingMethodCountryCode) != null; 3254 bool haveShippingContent = shippingMethods.Count != 1 || !defaultShippingIsSet; 3255 bool showShippingsBlock = haveShippingContent; 3256 string errorMessage = GetString("Ecom:Cart.ValidationError.EcomCartShippingmethodId.ErrorMessage"); 3257 3258 foreach (LoopItem shipping in shippingMethods) 3259 { 3260 bool selected = Converter.ToBoolean(shipping.GetString("Ecom:Cart.Shippingmethod.IsSelected")); 3261 object shippingProviderContent = selected ? Newtonsoft.Json.JsonConvert.DeserializeObject(shipping.GetString("Ecom:ShippingProvider.Content")) : null; 3262 string hideLabel = haveShippingContent ? "" : "u-hidden"; 3263 string leftMargin = haveShippingContent ? "u-margin--radio-button-indent" : ""; 3264 3265 @Render(new RadioButtonField 3266 { 3267 OnChange = "Cart.SubmitCart()", 3268 Label = shipping.GetString("Ecom:Cart.Shippingmethod.Name"), 3269 Name = "EcomCartShippingmethodId", 3270 Id = "EcomCartShippingmethodId_" + shipping.GetString("Ecom:Cart.Shippingmethod.ID"), 3271 Value = shipping.GetString("Ecom:Cart.Shippingmethod.ID"), 3272 CssClass = hideLabel, 3273 Checked = selected, 3274 }) 3275 <div style="margin-top:-1rem; margin-bottom:2rem; padding-left:2.3rem; color:#999999;">@shipping.GetString("Ecom:Cart.Shippingmethod.Description")</div> 3276 3277 if (shippingProviderContent != null) 3278 { 3279 showShippingsBlock = true; 3280 3281 <div id="ShippingProviderContent" class="@leftMargin" data-template="ShippingProviderContentTemplate"></div> 3282 <script> 3283 document.addEventListener("DOMContentLoaded", function (event) { 3284 HandlebarsBolt.CreateItemsFromJson(@shippingProviderContent, "ShippingProviderContent", "ShippingProviderContentTemplate"); 3285 HandlebarsBolt.CreateItemsFromJson(@shippingProviderContent, "ParcelShops", "ParcelShopsTemplate"); 3286 RememberState.SetCookie("useAnotherAddress", false); 3287 }); 3288 3289 function setParcelShopToDeliveryFields(number, address) { 3290 Cart.FillShippingAddress(address); 3291 document.getElementById("parcelShopNumber").value = number; 3292 Cart.SubmitCart(); 3293 } 3294 </script> 3295 } 3296 3297 if (shippingProviderContent != null && @shipping.GetString("Ecom:ShippingProvider.Content").Length < 10) 3298 { 3299 @Render(new Button { ButtonLayout = ButtonLayout.Secondary, CssClass = "btn--full u-no-margin u-margin-bottom", OnClick = "Cart.SubmitCart()", Title = Translate("Get parcel shops") }) 3300 <small class="help-text dw-mod">@Translate("Requires a valid address")</small> 3301 } 3302 3303 } 3304 if (!string.IsNullOrEmpty(errorMessage)) 3305 { 3306 @Render(new NotificationMessage { Message = errorMessage, MessageType = NotificationMessageType.Error }) 3307 } 3308 3309 if (!showShippingsBlock) 3310 { 3311 <script> 3312 var shippingBlock = document.getElementById("Block__Shipping"); 3313 if (shippingBlock) { 3314 shippingBlock.classList.add("u-hidden"); 3315 } 3316 </script> 3317 } 3318 } 3319 3320 @helper RenderParcelShopsModalContent() 3321 { 3322 <div class="grid grid--bleed"> 3323 <div class="grid__col-auto u-margin-right"> 3324 <ul class="list list--clean list--scroll dw-mod" id="ParcelShops" data-template="ParcelShopsTemplate"></ul> 3325 </div> 3326 @if (Pageview.Device.ToString() != "Mobile") 3327 { 3328 <div class="grid__col-8"> 3329 <div class="map-container"> 3330 <div id="MapCanvas" class="map-container__canvas"></div> 3331 </div> 3332 </div> 3333 } 3334 </div> 3335 } 3336 3337 @helper RenderShippingAddressFromParcelShop() 3338 { 3339 @Render(new HiddenField { Name = "EcomOrderDeliveryName", Id = "EcomOrderDeliveryName", Value = "{{company}}" }) 3340 @Render(new HiddenField { Name = "EcomOrderDeliveryCompany", Id = "EcomOrderDeliveryCompany", Value = "{{company}}" }) 3341 @Render(new HiddenField { Name = "EcomOrderDeliveryAddress", Id = "EcomOrderDeliveryAddress", Value = "{{address}}" }) 3342 @Render(new HiddenField { Name = "EcomOrderDeliveryZip", Id = "EcomOrderDeliveryZip", Value = "{{zip}}" }) 3343 @Render(new HiddenField { Name = "EcomOrderDeliveryCity", Id = "EcomOrderDeliveryCity", Value = "{{city}}" }) 3344 @Render(new HiddenField { Name = "EcomOrderDeliveryRegion", Id = "EcomOrderDeliveryRegion", Value = "" }) 3345 @Render(new HiddenField { Name = "EcomOrderDeliveryCountry", Id = "EcomOrderDeliveryCountry", Value = "{{countryCode}}" }) 3346 3347 @Render(new HiddenField { Name = "EcomOrderDeliveryEmail", Id = "EcomOrderDeliveryEmail", Value = "" }) 3348 @Render(new HiddenField { Name = "EcomOrderDeliveryPhone", Id = "EcomOrderDeliveryPhone", Value = "" }) 3349 } 3350 3351 @helper RenderShippingProviderTemplates() 3352 { 3353 <script id="ShippingProviderContentTemplate" type="text/x-template"> 3354 {{#.}} 3355 <div class="{{hideShippingProvider}}"> 3356 {{#SelectedParcelShop}} 3357 <div class="u-hidden"> 3358 <input type="radio" id="parcelShopNumber" class="u-no-margin" name="{{fieldPrefix}}{{fieldPostfix}}" value="{{number}}" {{selected}} /> 3359 </div> 3360 <div> 3361 @Render(new Icon { Prefix = "fas", Name = "fa-map-marker", Label = "<span class='u-bold'>{{company}}</span>" }) 3362 <div>{{address}}</div> 3363 <div>{{zip}} {{city}}</div> 3364 <div>{{country}}</div> 3365 </div> 3366 @RenderShippingAddressFromParcelShop() 3367 {{/SelectedParcelShop}} 3368 {{^SelectedParcelShop}} 3369 @Translate("No points found") 3370 {{/SelectedParcelShop}} 3371 <div class="u-margin-top"> 3372 <label for="ParcelShopsModalTrigger" class="btn btn--secondary btn--full dw-mod" onclick="Maps.Init({containerId: 'MapCanvas', locationsList: {{toJSON ParcelShops}}, markerCallback: Cart.SelectParcelShop, selectionCallback: 'setParcelShopToDeliveryFields', buttonText: '@Translate("Select")'})">@Translate("Change parcel shop")</label> 3373 </div> 3374 </div> 3375 {{/.}} 3376 </script> 3377 3378 <script id="ParcelShopsTemplate" type="text/x-template"> 3379 {{#.}} 3380 {{#ParcelShops}} 3381 <li data-number="{{number}}" data-lat="{{latitude}}" data-lng="{{longitude}}" class="u-border-bottom u-padding-bottom"> 3382 <input type="radio" name="{{fieldPrefix}}{{fieldPostfix}}" value="{{number}}" class="form__control" id="{{fieldPrefix}}ParcelShopNumber_{{number}}" {{selected}} 3383 onclick="setParcelShopToDeliveryFields('{{number}}', { 3384 Name: '{{company}}', @*is it ok???*@ 3385 Company: '{{company}}', 3386 Address: '{{address}}', 3387 Zip: '{{zip}}', 3388 City: '{{city}}', 3389 Country: '{{countryCode}}' 3390 })" /> 3391 <label for="{{fieldPrefix}}ParcelShopNumber_{{number}}" class="u-flex"> 3392 <span> 3393 <span class="u-margin-bottom u-block u-bold">{{company}}</span> 3394 <span class="u-line-height--normal u-font-size--sm"> 3395 <span class="u-block">{{address}}</span> 3396 <span class="u-block">{{zip}} {{city}}</span> 3397 <span class="u-block">{{country}}</span> 3398 </span> 3399 </span> 3400 </label> 3401 </li> 3402 {{/ParcelShops}} 3403 {{/.}} 3404 </script> 3405 3406 3407 string mapsScriptUrl = "//maps.googleapis.com/maps/api/js"; 3408 mapsScriptUrl += !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleMapsAPIKey")) ? "?key=" + Pageview.AreaSettings.GetItem("Settings").GetString("GoogleMapsAPIKey") : ""; 3409 3410 <script src="@mapsScriptUrl"></script> 3411 } 3412 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3413 @using Dynamicweb.Core 3414 @using System 3415 @using System.Web 3416 @using System.Collections.Generic 3417 @using Dynamicweb.Rapido.Blocks 3418 @using Dynamicweb.Rapido.Blocks.Components 3419 @using Dynamicweb.Rapido.Blocks.Components.General 3420 3421 @{ 3422 BlocksPage voucherCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 3423 string voucherCardHeightClass = Pageview.Device.ToString() != "Tablet" ? "u-full-height" : ""; 3424 3425 if (!Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideVoucher")) 3426 { 3427 Block voucherBlock = new Block() 3428 { 3429 Id = "Voucher", 3430 SortId = 30, 3431 Design = new Design 3432 { 3433 RenderType = RenderType.Column, 3434 Size = "6-auto" 3435 }, 3436 BlocksList = new List<Block> { 3437 new Block { 3438 Id = "VoucherHeader", 3439 SortId = 10, 3440 Component = new Heading { Level = 3, Title = Translate("Voucher"), Icon = new Icon { Prefix = "fas", Name = "fa-gift", LabelPosition = IconLabelPosition.After } }, 3441 Design = new Design { 3442 RenderType = RenderType.CardHeader, 3443 CssClass = "u-color-light--bg" 3444 } 3445 }, 3446 new Block { 3447 Id = "VoucherBody", 3448 SortId = 20, 3449 Template = RenderVoucher(), 3450 Design = new Design { 3451 RenderType = RenderType.CardBody, 3452 CssClass = "u-color-light--bg " + voucherCardHeightClass 3453 } 3454 } 3455 } 3456 }; 3457 voucherCheckoutPage.Add("OrderContainerRow", voucherBlock); 3458 } 3459 } 3460 3461 @helper RenderVoucher() { 3462 <div class="form__field-combi"> 3463 @Render(new TextField { Placeholder = Translate("Enter voucher code"), Name = "EcomOrderVoucherCode", Id = "EcomOrderVoucherCode", OnKeyUp = "checkEmpty();", Value = GetString("Ecom:Order.Customer.VoucherCode"), CssClass = "u-full-width" }) 3464 @Render(new Button { ButtonType = ButtonType.Submit, Id = "EcomOrderVoucherApply", Title = Translate("Apply"), CssClass = "btn--condensed u-no-margin" }) 3465 </div> 3466 3467 var errors = new List<string>(); 3468 string voucherCode = GetString("Ecom:Order.Customer.VoucherCode"); 3469 3470 if (!string.IsNullOrWhiteSpace(voucherCode)) 3471 { 3472 Order order = new OrderService().GetOrder(GetString("Ecom:Order.ID")); 3473 3474 IEnumerable<string> codes = new List<string>(); 3475 bool vouchersAppliedAsDiscounts = false; 3476 3477 if (order.VoucherUseType.HasFlag(VoucherUseCategoryType.Discount)) 3478 { 3479 codes = voucherCode.Split(new string[] { ",", ";", " " }, StringSplitOptions.RemoveEmptyEntries); 3480 vouchersAppliedAsDiscounts = true; 3481 } 3482 else 3483 { 3484 codes = new string[] { voucherCode.Trim() }; 3485 } 3486 3487 if (vouchersAppliedAsDiscounts && codes.Count() == 1) 3488 { 3489 @Render(new NotificationMessage { MessageType = NotificationMessageType.Success, Message = "<span class=\"u-bold\">" + voucherCode + "</span> " + Translate("applied to order") }) 3490 } 3491 else 3492 { 3493 foreach (string code in codes) 3494 { 3495 Voucher vouch = Voucher.GetVoucherByCode(code); 3496 if (vouch == null) 3497 { 3498 errors.Add(Translate("Voucher") + " <span class=u-bold>" + code + "</span> " + Translate("not found")); 3499 continue; 3500 } 3501 if (vouch.DateUsed.HasValue) 3502 { 3503 errors.Add(Translate("Voucher") + " <span class=u-bold>" + code + "</span> " + Translate("already used")); 3504 continue; 3505 } 3506 VoucherList voucherList = VoucherList.GetListById(vouch.ListId); 3507 if (!voucherList.ListActive) 3508 { 3509 errors.Add(Translate("Voucher") + " <span class=u-bold>" + code + "</span> " + Translate("is not active")); 3510 continue; 3511 } 3512 @Render(new NotificationMessage { MessageType = NotificationMessageType.Success, Message = Translate("Voucher") + " <span class=\"u-bold\">" + code + "</span> " + Translate("applied to order") }) 3513 } 3514 } 3515 3516 foreach (string error in errors) 3517 { 3518 @Render(new NotificationMessage { MessageType = NotificationMessageType.Error, Message = error }) 3519 3520 } 3521 } 3522 } 3523 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3524 @using Dynamicweb.Core 3525 @using System 3526 @using System.Web 3527 @using System.Collections.Generic 3528 @using Dynamicweb.Rapido.Blocks 3529 @using Dynamicweb.Rapido.Blocks.Components 3530 @using Dynamicweb.Rapido.Blocks.Components.General 3531 3532 @{ 3533 BlocksPage recurringCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 3534 string recurringCardHeightClass = Pageview.Device.ToString() != "Tablet" ? "u-full-height" : ""; 3535 3536 if (!string.IsNullOrWhiteSpace(GetString("Ecom:Order.PaymentMethod.RecurringSupport")) && !Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideRecurringOrder")) 3537 { 3538 Block recurringOrderBlock = new Block() 3539 { 3540 Id = "RecurringOrder", 3541 SortId = 40, 3542 Design = new Design 3543 { 3544 RenderType = RenderType.Column, 3545 Size = "12" 3546 }, 3547 BlocksList = new List<Block> { 3548 new Block { 3549 Id = "RecurringOrderHeader", 3550 SortId = 10, 3551 Component = new Heading { Level = 3, Title = Translate("Recurring order"), Icon = new Icon { Prefix = "fas", Name = "fa-calendar", LabelPosition = IconLabelPosition.After } }, 3552 Design = new Design { 3553 RenderType = RenderType.CardHeader, 3554 CssClass = "u-color-light--bg" 3555 } 3556 }, 3557 new Block { 3558 Id = "RecurringOrderBody", 3559 SortId = 20, 3560 Template = RenderRecurringOrder(), 3561 Design = new Design { 3562 RenderType = RenderType.CardBody, 3563 CssClass = "u-color-light--bg " + recurringCardHeightClass 3564 } 3565 } 3566 } 3567 }; 3568 recurringCheckoutPage.Add("OrderContainerRow", recurringOrderBlock); 3569 } 3570 } 3571 3572 @helper RenderRecurringOrder() { 3573 string dateFormat = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; 3574 string startDate = !string.IsNullOrEmpty(GetString("Ecom:Order.Recurring.StartDate.Clean")) ? GetDate("Ecom:Order.Recurring.StartDate.Clean").ToString(dateFormat) : ""; 3575 string endDate = !string.IsNullOrEmpty(GetString("Ecom:Order.Recurring.EndDate.Clean")) ? GetDate("Ecom:Order.Recurring.EndDate.Clean").ToString(dateFormat) : ""; 3576 dateFormat = dateFormat.Replace("dd", "d"); 3577 dateFormat = dateFormat.Replace("MM", "m"); 3578 dateFormat = dateFormat.Replace("yyyy", "Y"); 3579 string endLabel = Pageview.Device.ToString() != "Mobile" ? Translate("And it should end on") : Translate("End date"); 3580 3581 @Render(new CheckboxField { 3582 Label = Translate("Create recurring order"), 3583 Name = "EcomRecurringOrderCreate", 3584 Id = "EcomRecurringOrderCreate", 3585 Checked = GetBoolean("Ecom:Order.Recurring.Enabled"), 3586 ExtraAttributes = new Dictionary<string, string>() { 3587 { "data-expand", "EcomRecurringOrderCreate" } 3588 } 3589 }) 3590 3591 <div class="expandable--collapsed" data-trigger="EcomRecurringOrderCreate"> 3592 <label for="Country">@Translate("I want my order every")</label> 3593 <div class="grid grid--external-bleed-x"> 3594 <div class="grid__col-6 grid__col--bleed-y"> 3595 @{ 3596 SelectField selectInterval = new SelectField 3597 { 3598 Id = "EcomOrderRecurringInterval", 3599 Name = "EcomOrderRecurringInterval", 3600 OnChange = "Cart.SubmitCart()", 3601 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerState.ErrorMessage") 3602 }; 3603 for (var i = 1; i <= 12; i++) 3604 { 3605 bool selected = GetInteger("Ecom:Order.Recurring.Interval") == i ? true : false; 3606 selectInterval.Options.Add(new SelectFieldOption { Label = i.ToString(), Value = i.ToString(), Checked = selected }); 3607 } 3608 @Render(selectInterval) 3609 } 3610 </div> 3611 <div class="grid__col-6 grid__col--bleed-y"> 3612 @{ 3613 var units = new[] { "Days", "Weeks", "Months" }; 3614 3615 SelectField selectUnit = new SelectField 3616 { 3617 Id = "EcomOrderRecurringIntervalUnit", 3618 Name = "EcomOrderRecurringIntervalUnit", 3619 OnChange = "Cart.SubmitCart()", 3620 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerState.ErrorMessage") 3621 }; 3622 for (int i = 0; i < units.Length; i++) 3623 { 3624 bool selected = GetInteger("Ecom:Order.Recurring.IntervalUnit") == i ? true : false; 3625 selectUnit.Options.Add(new SelectFieldOption { Label = Translate(units[i]), Value = i.ToString(), Checked = selected }); 3626 } 3627 @Render(selectUnit) 3628 } 3629 </div> 3630 </div> 3631 3632 <div class="grid grid--external-bleed-x"> 3633 <div class="grid__col-6 grid__col--bleed-y"> 3634 @Render(new DateTimeField { 3635 Label = Translate("Start date"), 3636 Id = "EcomOrderRecurringStartDate", 3637 Name = "EcomOrderRecurringStartDate", 3638 Placeholder = Translate("Never"), 3639 Value = startDate, 3640 DateFormat = dateFormat, 3641 MinDate = "today" 3642 }) 3643 </div> 3644 <div class="grid__col-6 grid__col--bleed-y"> 3645 @Render(new DateTimeField { 3646 Label = endLabel, 3647 Id = "EcomOrderRecurringEndDate", 3648 Name = "EcomOrderRecurringEndDate", 3649 Placeholder = Translate("Never"), 3650 Value = endDate, 3651 DateFormat = dateFormat, 3652 MinDate = "today" 3653 }) 3654 </div> 3655 </div> 3656 </div> 3657 } 3658 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3659 @using Dynamicweb 3660 @using Dynamicweb.Core 3661 @using System 3662 @using System.Web 3663 @using System.Collections.Generic 3664 @using Dynamicweb.Rapido.Blocks 3665 @using Dynamicweb.Rapido.Blocks.Components 3666 @using Dynamicweb.Rapido.Blocks.Components.General 3667 3668 @functions{ 3669 BlocksPage reviewOrderCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 3670 int cartFeedPageId; 3671 bool canCompleteOrder = true; 3672 } 3673 3674 @{ 3675 string reviewOrderType = checkoutPageType ?? "onestep"; //The "checkoutPageType" comes from the main template for the cart page 3676 cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 3677 var paymentCountryCode = GetString("Ecom:Order.Customer.Country.Code"); 3678 var shippingCountryCode = GetString("Ecom:Order.Delivery.Country.Code"); 3679 var paymentCountryIsSupported = string.IsNullOrEmpty(paymentCountryCode) || GetLoop("Countries").Any(country => (country.GetString("Ecom:Country.Code2") == paymentCountryCode)); 3680 var shippingCountryIsSupported = string.IsNullOrEmpty(shippingCountryCode) ? paymentCountryIsSupported : GetLoop("Countries").Any(country => (country.GetString("Ecom:Country.Code2") == shippingCountryCode)); 3681 3682 canCompleteOrder = paymentCountryIsSupported && shippingCountryIsSupported; 3683 3684 Block reviewOrderBlock = new Block() 3685 { 3686 Id = "ReviewOrder", 3687 SortId = 50, 3688 SkipRenderBlocksList = true 3689 }; 3690 if (!Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("ShowVariantMatrixes")) { 3691 reviewOrderBlock.Template = RenderReviewOrder(); 3692 } 3693 reviewOrderCheckoutPage.Add("OrderContainerRow", reviewOrderBlock); 3694 3695 if (reviewOrderType == "onestep") 3696 { 3697 Block inlineAcceptanceBlock = new Block() 3698 { 3699 Id = "Acceptance", 3700 SortId = 10, 3701 Template = RenderInlineAcceptance() 3702 }; 3703 reviewOrderCheckoutPage.Add("ReviewOrder", inlineAcceptanceBlock); 3704 3705 Block reviewOrderFooterBlock = new Block() 3706 { 3707 Id = "ReviewOrderFooter", 3708 SortId = 20, 3709 Template = RenderReviewOrderFooter() 3710 }; 3711 reviewOrderCheckoutPage.Add("ReviewOrder", reviewOrderFooterBlock); 3712 } 3713 3714 if (reviewOrderType == "quote") 3715 { 3716 Block reviewOrderFooterBlock = new Block() 3717 { 3718 Id = "ReviewOrderFooter", 3719 SortId = 20, 3720 Template = RenderReviewOrderFooterQuote() 3721 }; 3722 reviewOrderCheckoutPage.Add("ReviewOrder", reviewOrderFooterBlock); 3723 } 3724 3725 Block reviewOrderScriptTemplates = new Block() 3726 { 3727 Id = "ReviewOrderScriptTempaltes", 3728 SortId = 30, 3729 BlocksList = new List<Block> { 3730 new Block { 3731 Id = "CartContentTemplate", 3732 SortId = 10, 3733 Template = RenderCartContentTemplate() 3734 }, 3735 new Block { 3736 Id = "CartOrderlineTemplate", 3737 SortId = 20, 3738 Template = RenderCartOrderlineTemplate() 3739 }, 3740 new Block { 3741 Id = "CartOrderlineMobileTemplate", 3742 SortId = 30, 3743 Template = RenderCartOrderlineMobileTemplate() 3744 }, 3745 new Block { 3746 Id = "CartOrderlineDiscountTemplate", 3747 SortId = 40, 3748 Template = RenderCartOrderlineDiscountTemplate() 3749 }, 3750 new Block { 3751 Id = "EmptyCartTemplate", 3752 SortId = 50, 3753 Template = RenderEmptyCartTemplate() 3754 }, 3755 new Block 3756 { 3757 Id = "EmptyCartObserver", 3758 SortId = 60, 3759 Template = RenderEmptyCartObserver() 3760 } 3761 } 3762 }; 3763 reviewOrderCheckoutPage.Add("CheckoutBottomSnippets", reviewOrderScriptTemplates); 3764 3765 Block reviewOrderScripts = new Block() 3766 { 3767 Id = "ReviewOrderScripts", 3768 SortId = 40, 3769 Template = RenderOrderScripts() 3770 }; 3771 reviewOrderCheckoutPage.Add("CheckoutBottomSnippets", reviewOrderScripts); 3772 } 3773 3774 @helper RenderReviewOrder() 3775 { 3776 <div class="grid__col-12"> 3777 <div class="js-handlebars-root" id="Cart" data-template="CartContent" data-cart-id="@cartFeedPageId" data-json-feed="/Default.aspx?ID=@cartFeedPageId" data-preloader="overlay"></div> 3778 </div> 3779 } 3780 3781 @helper RenderCartContentTemplate() 3782 { 3783 List<Block> subBlocks = reviewOrderCheckoutPage.GetBlockListById("ReviewOrder").OrderBy(item => item.SortId).ToList(); 3784 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 3785 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 3786 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(GetString("Ecom:Order.ID")); 3787 bool isPricesWithVATEnabled = Converter.ToBoolean(Pageview.Area.EcomPricesWithVat); 3788 3789 <script id="CartContent" type="text/x-template"> 3790 {{#.}} 3791 @if (useGoogleTagManager) 3792 { 3793 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 3794 } 3795 <div class="card-header u-color-light--bg dw-mod"> 3796 @Render(new Heading { Title = Translate("Review order") + "({{numberofproducts}})", Level = 3, Icon = new Icon { Prefix = "fas", Name = "fa-list-ul", LabelPosition = IconLabelPosition.After } }) 3797 </div> 3798 <div class="card u-color-light--bg u-no-padding--xs dw-mod"> 3799 {{#unless isEmpty}} 3800 <table class="table cart-table dw-mod"> 3801 <tbody id="OrderLines"> 3802 {{#OrderLines}} 3803 {{> (lookup . 'template') }} 3804 {{/OrderLines}} 3805 </tbody> 3806 </table> 3807 {{/unless}} 3808 <div class="grid u-border-top"> 3809 <div class="grid__col-sm-6"> 3810 @if (Dynamicweb.Security.Licensing.LicenseManager.LicenseHasFeature("LoyaltyPoints") && !string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.UserName"))) 3811 { 3812 <text> 3813 {{#if userPoints}} 3814 <div class="u-border u-border-color--loyalty-points u-padding--lg u-full-height"> 3815 @Render(new Heading { Title = Translate("Your point balance"), Level = 3 }) 3816 <div class="u-font-size--lg u-margin-bottom"> 3817 <span class="u-color--loyalty-points">{{userPoints}}</span> @Translate("points") 3818 </div> 3819 <div>@Translate("On this order you will use"): <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points")</div> 3820 </div> 3821 {{/if}} 3822 </text> 3823 } 3824 </div> 3825 3826 <div class="grid__col-sm-6"> 3827 @if (!pointShop) 3828 { 3829 <text> 3830 {{#unless hideSubTotal}} 3831 <div> 3832 <div class="cart-summary__subtotals dw-mod">@Translate("Subtotal")</div> 3833 <div class="cart-summary__subtotals u-pull--right dw-mod"> 3834 @if (hasTaxSettings) 3835 { 3836 <text>{{subtotalpricewithouttaxes}}</text> 3837 } 3838 else 3839 { 3840 <text>{{subtotalprice}}</text> 3841 } 3842 </div> 3843 </div> 3844 {{/unless}} 3845 </text> 3846 <text> 3847 {{#unless hidePaymentfee}} 3848 <div> 3849 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-credit-card", Label = "{{paymentmethod}}", LabelPosition = IconLabelPosition.After })</div> 3850 <div class="cart-summary__info u-pull--right dw-mod">{{paymentfee}}</div> 3851 </div> 3852 {{/unless}} 3853 </text> 3854 } 3855 {{#unless hideShippingfee}} 3856 <div> 3857 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-truck", Label = "{{shippingmethod}}", LabelPosition = IconLabelPosition.After })</div> 3858 <div class="cart-summary__info u-pull--right dw-mod">{{shippingfee}}</div> 3859 </div> 3860 {{/unless}} 3861 {{#if hasTaxSettings}} 3862 <div> 3863 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-hand-holding-usd", Label = Translate("Sales Tax"), LabelPosition = IconLabelPosition.After })</div> 3864 <div class="cart-summary__info u-pull--right dw-mod">{{totaltaxes}}</div> 3865 </div> 3866 {{/if}} 3867 @if (Pageview.User != null && Dynamicweb.Security.Licensing.LicenseManager.LicenseHasFeature("LoyaltyPoints")) 3868 { 3869 <text> 3870 {{#if earnings}} 3871 <div> 3872 <div class="cart-summary__info dw-mod">@Translate("Earnings")</div> 3873 <div class="cart-summary__info u-pull--right dw-mod"><span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")</div> 3874 </div> 3875 {{/if}} 3876 </text> 3877 } 3878 <div class="cart-summary__totals-container dw-mod"> 3879 <div class="cart-summary__totals dw-mod">@Translate("Total")</div> 3880 <div class="cart-summary__totals u-pull--right dw-mod"> 3881 @if (pointShop) 3882 { 3883 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 3884 } 3885 else 3886 { 3887 <text>{{totalprice}}</text> 3888 } 3889 </div> 3890 </div> 3891 @if (!pointShop && !hasTaxSettings) 3892 { 3893 <div class="u-ta-right"> 3894 <small class="cart-summary__info dw-mod">@Translate("VAT") ({{vatPercent}}):</small> 3895 <small class="cart-summary__info dw-mod">{{totalvat}}</small> 3896 </div> 3897 3898 if (isPricesWithVATEnabled) 3899 { 3900 <div class="u-ta-right"> 3901 <small class="cart-summary__info dw-mod">@Translate("Total price without VAT"):</small> 3902 <small class="cart-summary__info dw-mod">{{totalPriceWithoutVat}}</small> 3903 </div> 3904 } 3905 else 3906 { 3907 <div class="u-ta-right"> 3908 <small class="cart-summary__info dw-mod">@Translate("Total price with VAT"):</small> 3909 <small class="cart-summary__info dw-mod">{{totalPriceWithVat}}</small> 3910 </div> 3911 } 3912 } 3913 {{#if showCheckoutDisclaimer}} 3914 <div class="u-ta-right"> 3915 <small>{{checkoutDisclaimer}}</small> 3916 </div> 3917 {{/if}} 3918 </div> 3919 </div> 3920 3921 <div class="grid"> 3922 <div class="grid__col-12 grid__col--line-top"></div> 3923 </div> 3924 3925 {{#unless hideComment}} 3926 <div class="grid__cell u-padding--xs"> 3927 @Render(new TextareaField { Rows = 3, Placeholder = Translate("Enter comment"), Name = "EcomOrderCustomerComment", Id = "EcomOrderCustomerComment", Value = "{{comment}}" }) 3928 </div> 3929 {{/unless}} 3930 <div class="u-margin-bottom--lg"> 3931 @foreach (LoopItem error in GetLoop("ValidationErrors")) 3932 { 3933 @Render(new NotificationMessage { Message = error.GetString("Ecom:Cart.ValidationError.ErrorMessage"), MessageType = NotificationMessageType.Error }) 3934 } 3935 </div> 3936 3937 @RenderBlockList(subBlocks) 3938 </div> 3939 {{/.}} 3940 </script> 3941 } 3942 3943 @helper RenderCartOrderlineTemplate() 3944 { 3945 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 3946 int quotesCartPageId = GetPageIdByNavigationTag("QuotesCartPage"); 3947 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 3948 3949 @* Template for the orderlines *@ 3950 <script id="CartOrderline" type="text/x-template"> 3951 {{#unless isEmpty}} 3952 <tr id="Orderline{{id}}" class="cart-orderline"> 3953 <td class="cart-orderline__cell cart-table__image u-hidden-xs u-hidden-xxs dw-mod"> 3954 <div class="cart-orderline__cell__block {{hideimage}} dw-mod"> 3955 @Render(new Image { Path = "{{image}}", Title = "{{name}} {{variantname}}", ImageDefault = new ImageSettings { Width = 60, Height = 60, Crop = 5 } }) 3956 </div> 3957 </td> 3958 <td class="cart-orderline__cell u-va-middle dw-mod"> 3959 <a href="{{link}}" class="u-color-inherit cart-orderline__name" title="{{name}} {{variantname}}">{{name}}</a> 3960 {{#if productnumber}} 3961 <div class="cart-orderline__cell__block item-number dw-mod">#{{productnumber}}</div> 3962 {{/if}} 3963 {{#if variantname}} 3964 <div class="cart-orderline__cell__block item-number dw-mod">{{variantname}}</div> 3965 {{/if}} 3966 {{#if unitname}} 3967 <div class="cart-orderline__cell__block item-number dw-mod">{{unitname}}</div> 3968 {{/if}} 3969 </td> 3970 <td class="cart-orderline__cell u-ta-right u-hidden-xs u-hidden-xxs dw-mod" width="120"> 3971 {{#if pointsTotal}} 3972 <span class="u-color--loyalty-points">{{pointPrice}}</span> @Translate("points") 3973 {{else}} 3974 {{unitprice}} 3975 {{/if}} 3976 </td> 3977 3978 @* MENNT.BUGFIX *@ 3979 @if (Dynamicweb.Ecommerce.Common.Context.Cart != null && !Dynamicweb.Ecommerce.Common.Context.Cart.IsQuote) 3980 { 3981 <td class="cart-orderline__cell u-ta-right dw-mod" colspan="2"> 3982 @Render(new NumberField { 3983 Id = "Quantity_{{orderLineId}}", 3984 Min = 1, 3985 OnChange = "Cart.ChangeQuantity('" + cartFeedPageId + "', '{{orderLineId}}', this.value)", 3986 Name = "QuantityOrderLine{{orderLineId}}", 3987 Value = "{{quantity}}", 3988 CssClass = "u-w80px", 3989 ActionButton = new Button { 3990 ButtonType = ButtonType.Button, 3991 ButtonLayout = ButtonLayout.Clean, 3992 OnClick = "{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}} Cart.UpdateCart(null, '/Default.aspx?ID=" + cartFeedPageId + "', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);", 3993 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After } 3994 } 3995 }) 3996 </td> 3997 } 3998 else 3999 { 4000 <td class="cart-orderline__cell u-ta-right dw-mod" colspan="2"> 4001 @Render(new HiddenField { Id = "Quantity_{{orderLineId}}", Name = "QuantityOrderLine{{orderLineId}}", Value = "{{quantity}}" }) 4002 <div class="u-w80px u-no-margin">{{quantity}}</div> 4003 </td> 4004 } 4005 4006 <td class="cart-orderline__cell u-ta-right dw-mod"> 4007 {{#if pointsTotal}} 4008 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 4009 {{else}} 4010 <div>{{totalprice}}</div> 4011 {{/if}} 4012 @* MENNT.BUGFIX *@ 4013 @if (Dynamicweb.Ecommerce.Common.Context.Cart != null && !Dynamicweb.Ecommerce.Common.Context.Cart.IsQuote) 4014 { 4015 <text> 4016 {{#if canBePurchasedWithPoints}} 4017 @Render(new Button { Title = Translate("Use") + " {{pointPrice}} " + Translate("points"), ButtonType = ButtonType.Button, ButtonLayout = ButtonLayout.None, CssClass = "btn btn--loyalty-points btn--sm u-no-margin", OnClick = "Cart.BuyForPoints('" + GetGlobalValue("Global:Page.ID") + "', '" + cartFeedPageId + "', '{{orderLineId}}', '{{id}}', '{{variantId}}');", Icon = new Icon { Prefix = "far", Name = "fa-tag", LabelPosition = IconLabelPosition.After } }) 4018 {{/if}} 4019 </text> 4020 } 4021 </td> 4022 </tr> 4023 {{/unless}} 4024 <tr class="{{hideBomItems}}"> 4025 <td class="cart-table__image u-hidden-xs u-hidden-xxs dw-mod"><div class="{{hideimage}}"></div></td> 4026 <td colspan="5" class="u-no-padding"> 4027 <table class="u-no-margin u-color-light-gray--bg"> 4028 <tbody> 4029 {{#BomItems}} 4030 <tr> 4031 <td class="cart-table__image u-hidden-xs u-hidden-xxs dw-mod"> 4032 @Render(new Image { Path = "{{image}}", Title = "{{name}} {{variantname}}", ImageDefault = new ImageSettings { Width = 60, Height = 60, Crop = 5 } }) 4033 </td> 4034 <td title="{{name}} {{variantname}}"> 4035 <a href="{{link}}" class="u-color-inherit dw-mod">{{name}}</a> 4036 {{#if productnumber}} 4037 <div class="item-number dw-mod">#{{productnumber}}</div> 4038 {{/if}} 4039 {{#if variantname}} 4040 <div class="item-number dw-mod">{{variantname}}</div> 4041 {{/if}} 4042 {{#if unitname}} 4043 <div class="item-number dw-mod">{{unitname}}</div> 4044 {{/if}} 4045 </td> 4046 <td class="u-hidden-xs u-hidden-xxs"> </td> 4047 <td>{{quantity}}</td> 4048 <td> </td> 4049 <td class="cart-table__price u-ta-right dw-mod"> </td> 4050 </tr> 4051 {{/BomItems}} 4052 </tbody> 4053 </table> 4054 </td> 4055 </tr> 4056 </script> 4057 } 4058 4059 @helper RenderCartOrderlineMobileTemplate() 4060 { 4061 <script id="CartOrderlineMobile" type="text/x-template"> 4062 {{#unless isEmpty}} 4063 <tr id="Orderline{{id}}"> 4064 <td class="cart-table__image dw-mod"> 4065 <div class="{{hideimage}}"> 4066 @Render(new Image { Path = "{{image}}", Title = "{{name}} {{variantname}}", ImageDefault = new ImageSettings { Width = 60, Height = 60, Crop = 5 } }) 4067 </div> 4068 </td> 4069 <td title="{{name}} {{variantname}}" colspan="4"> 4070 <a href="{{link}}" class="u-color-inherit">{{name}}</a> 4071 {{#if productnumber}} 4072 <div>#{{productnumber}}</div> 4073 {{/if}} 4074 {{#if variantname}} 4075 <div>{{variantname}}</div> 4076 {{/if}} 4077 {{#if unitname}} 4078 <div>{{unitname}}</div> 4079 {{/if}} 4080 </td> 4081 </tr> 4082 <tr class="table__row--no-border"> 4083 <td class="cart-table__image dw-mod"></td> 4084 <td colspan="4"> 4085 <div class="u-pull--left"> 4086 @Render(new NumberField { 4087 Id = "Quantity_{{orderLineId}}", 4088 Min = 1, 4089 OnChange = "Cart.ChangeQuantity('" + cartFeedPageId + "', '{{orderLineId}}', this.value)", 4090 Name = "QuantityOrderLine{{orderLineId}}", 4091 Value = "{{quantity}}", 4092 CssClass = "u-w80px", 4093 ActionButton = new Button { 4094 ButtonType = ButtonType.Button, 4095 ButtonLayout = ButtonLayout.Clean, 4096 OnClick = "{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}} Cart.UpdateCart(null, '/Default.aspx?ID=" + cartFeedPageId + "', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);", 4097 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After } 4098 } 4099 }) 4100 </div> 4101 <div class="u-pull--right u-ta-right"> 4102 {{#if pointsTotal}} 4103 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 4104 {{else}} 4105 <div>{{totalprice}}</div> 4106 {{/if}} 4107 {{#if canBePurchasedWithPoints}} 4108 @Render(new Button { Title = Translate("Use") + "{{pointPrice}}" + Translate("points"), ButtonType = ButtonType.Button, ButtonLayout = ButtonLayout.LinkClean, CssClass = "btn--loyalty-points btn--sm u-no-margin u-margin-top", OnClick = "Cart.BuyForPoints('" + GetGlobalValue("Global:Page.ID") + "', '" + cartFeedPageId + "', '{{orderLineId}}', '{{id}}', '{{variantId}}');", Icon = new Icon { Prefix = "far", Name = "fa-tag", LabelPosition = IconLabelPosition.After } }) 4109 {{/if}} 4110 </div> 4111 </td> 4112 </tr> 4113 {{/unless}} 4114 <tr class="{{hideBomItems}}"> 4115 <td colspan="6" class="u-no-padding"> 4116 <table class="u-no-margin u-color-light-gray--bg"> 4117 <tbody> 4118 {{#BomItems}} 4119 <tr> 4120 <td class="cart-table__image u-hidden-xs u-hidden-xxs dw-mod"> 4121 @Render(new Image { Path = "{{image}}", Title = "{{name}} {{variantname}}", ImageDefault = new ImageSettings { Width = 60, Height = 60, Crop = 5 } }) 4122 </td> 4123 <td title="{{name}} {{variantname}}"> 4124 <a href="{{link}}" title="{{name}} {{variantname}}">{{name}}</a> 4125 {{#if productnumber}} 4126 <div>#{{productnumber}}</div> 4127 {{/if}} 4128 {{#if variantname}} 4129 <div>{{variantname}}</div> 4130 {{/if}} 4131 {{#if unitname}} 4132 <div>{{unitname}}</div> 4133 {{/if}} 4134 </td> 4135 <td class="u-hidden-xs u-hidden-xxs"> </td> 4136 <td>{{quantity}}</td> 4137 <td> </td> 4138 <td class="cart-table__price u-ta-right dw-mod"> </td> 4139 </tr> 4140 {{/BomItems}} 4141 </tbody> 4142 </table> 4143 </td> 4144 </tr> 4145 </script> 4146 } 4147 4148 @helper RenderCartOrderlineDiscountTemplate() 4149 { 4150 <script id="CartOrderlineDiscount" type="text/x-template"> 4151 <tr class="table__row--no-border"> 4152 <td class="cart-table__image dw-mod"> </td> 4153 <td colspan="3">{{name}}</td> 4154 <td class="u-hidden-xs u-hidden-xxs"> </td> 4155 <td class="cart-table__price u-ta-right dw-mod">{{totalprice}}</td> 4156 </tr> 4157 </script> 4158 } 4159 4160 @helper RenderEmptyCartTemplate() 4161 { 4162 <script id="EmptyCart" type="text/x-template"> 4163 @Translate("You have no items in the cart") 4164 </script> 4165 } 4166 4167 @helper RenderInlineAcceptance() 4168 { 4169 <div class="grid__cell u-padding--xs"> 4170 @if (GetBoolean("Ecom:Cart.UseNewsletterSubscription")) 4171 { 4172 @Render(new HiddenField { Name = "EcomOrderSubscribeToNewsletter" }) 4173 @Render(new CheckboxField { Name = "EcomOrderSubscribeToNewsletter", Id = "EcomOrderSubscribeToNewsletter", Label = Translate("Subscribe to newsletter") }) 4174 } 4175 4176 @if (Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideTermsAndConditions")) 4177 { 4178 @Render(new HiddenField { Name = "EcomOrderCustomerAccepted", Id = "EcomOrderCustomerAccepted", Value = "1" }) 4179 } 4180 else 4181 { 4182 string termsPageIt = GetPageIdByNavigationTag("TermsAndConditions").ToString(); 4183 @Render(new CheckboxField { 4184 Name = "EcomOrderCustomerAccepted", 4185 Id = "EcomOrderCustomerAccepted", 4186 OnChange = canCompleteOrder ? "Cart.EnableCheckoutButton()" : "", 4187 Label = Translate("I accept the") + " <a href=\"/Default.aspx?ID=" + termsPageIt + "\">" + Translate("terms and conditions") + "</a>", 4188 ErrorMessage = GetString("Ecom:Cart.ValidationError.EcomOrderCustomerAccepted.ErrorMessage") 4189 }) 4190 } 4191 </div> 4192 } 4193 4194 @helper RenderReviewOrderFooter() 4195 { 4196 int quotesCartPageId = GetPageIdByNavigationTag("QuotesCartPage"); 4197 4198 <div class="grid"> 4199 <div class="grid__col-12 grid__col--line-top"></div> 4200 </div> 4201 4202 <div class="grid__cell-footer"> 4203 <div class="grid__cell u-padding--xs"> 4204 <div class="u-pull--right"> 4205 @Render(new Button { 4206 ButtonType = ButtonType.Submit, 4207 ButtonLayout = ButtonLayout.Primary, 4208 CssClass = "btn--condensed u-pull--right u-no-margin", 4209 Title = Translate("Go to checkout"), 4210 Id = GetString("CartV2.NextStepButtonName"), 4211 OnClick = "Buttons.LockButton(event, true)", 4212 Disabled = !canCompleteOrder || !Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideTermsAndConditions"), 4213 Name = GetString("CartV2.NextStepButtonName") 4214 }) 4215 </div> 4216 <div class="u-pull--left"> 4217 @Render(new Button { ButtonType = ButtonType.Button, ButtonLayout = ButtonLayout.Secondary, CssClass = "btn--condensed u-pull--left u-no-margin", Title = Translate("Empty cart"), OnClick = "googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);" }) 4218 </div> 4219 @if (!Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideQuotesCartLink") && !string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.UserName"))) 4220 { 4221 <div class="u-pull--right"> 4222 @Render(new Link { Href = "/Default.aspx?ID=" + quotesCartPageId, ButtonLayout = ButtonLayout.Link, CssClass = "btn--condensed u-no-margin u-margin-right--lg u-no-margin--xs", Title = Translate("Create quote request") }) 4223 </div> 4224 } 4225 </div> 4226 </div> 4227 } 4228 4229 @helper RenderReviewOrderFooterQuote() 4230 { 4231 string submitButtonTitle = Pageview.Device.ToString() == "Mobile" ? Translate("Submit") : Translate("Submit quote request"); 4232 4233 <div class="grid"> 4234 <div class="grid__col-12 grid__col--line-top"></div> 4235 </div> 4236 4237 <div class="grid__cell-footer"> 4238 <div class="grid__cell u-padding--xs"> 4239 <div class="u-pull--right"> 4240 @Render(new Button { 4241 ButtonType = ButtonType.Submit, 4242 ButtonLayout = ButtonLayout.Primary, 4243 CssClass = "btn--condensed u-pull--right u-no-margin", 4244 Title = submitButtonTitle, 4245 Id = GetString("CartV2.NextStepButtonName"), 4246 OnClick = "Buttons.LockButton(event, true)", 4247 Name = GetString("CartV2.NextStepButtonName") 4248 }) 4249 </div> 4250 <div class="u-pull--left"> 4251 @Render(new Button { ButtonType = ButtonType.Button, ButtonLayout = ButtonLayout.Secondary, CssClass = "btn--condensed u-pull--left u-no-margin", OnClick = "googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);", Title = Translate("Empty cart") }) 4252 </div> 4253 </div> 4254 </div> 4255 } 4256 4257 @helper RenderOrderScripts() 4258 { 4259 if (!string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"))) 4260 { 4261 <script> 4262 fbq('track', 'InitiateCheckout', { 4263 currency: '@GetString("Ecom:Order.Price.Currency.Code")', 4264 value: @GetDouble("Ecom:Order.Price.Price"), 4265 num_items: "@GetInteger("Ecom:Order.OrderLines.TotalProductQuantity")" 4266 }); 4267 </script> 4268 } 4269 } 4270 4271 @helper RenderEmptyCartObserver() 4272 { 4273 <script> 4274 document.addEventListener("cartUpdated", function(event) { 4275 let data = event.detail.data[0]; 4276 if (data.numberofproducts == 0) { 4277 location.reload(); 4278 } else { 4279 HandlebarsBolt.CreateItemsFromJson(data, "Cart"); 4280 } 4281 }); 4282 </script> 4283 } 4284 4285 4286 4287 @*Include the matrix templates*@ 4288 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4289 @using Dynamicweb 4290 @using Dynamicweb.Core 4291 @using Dynamicweb.Rendering 4292 @using System 4293 @using System.Web 4294 @using System.Collections.Generic 4295 @using Dynamicweb.Rapido.Blocks 4296 @using Dynamicweb.Rapido.Blocks.Components 4297 @using Dynamicweb.Rapido.Blocks.Components.General 4298 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 4299 4300 @functions{ 4301 BlocksPage reviewOrderMatrix = BlocksPage.GetBlockPage("CheckoutPage"); 4302 } 4303 4304 @{ 4305 if (Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("ShowVariantMatrixes")) 4306 { 4307 Block reviewMatrixBlock = new Block() 4308 { 4309 Id = "ReviewOrderMatrix", 4310 SortId = 50, 4311 SkipRenderBlocksList = true, 4312 Template = RenderReviewOrderMasters() 4313 }; 4314 reviewOrderMatrix.Add("OrderContainerRow", reviewMatrixBlock); 4315 } 4316 } 4317 4318 @helper RenderReviewOrderMasters() { 4319 <div class="grid__col-12"> 4320 <div class="card-header u-color-light--bg dw-mod"> 4321 @Render(new Heading { Title = Translate("Review order") + " (" + GetInteger("Ecom:Order.OrderLines.TotalProductQuantity") + ")", Level = 3, Icon = new Icon { Prefix = "fas", Name = "fa-list-ul", LabelPosition = IconLabelPosition.After } }) 4322 </div> 4323 <div class="card u-color-light--bg u-no-padding--xs dw-mod"> 4324 <table class="table dw-mod"> 4325 <thead> 4326 <tr> 4327 <td width="32"> </td> 4328 <td> </td> 4329 <td>@Translate("Product number")</td> 4330 <td>@Translate("Name")</td> 4331 <td>@Translate("Total qty")</td> 4332 <td>@Translate("Total price")</td> 4333 <td> </td> 4334 </tr> 4335 </thead> 4336 4337 @foreach (LoopItem masterProduct in GetLoop("MasterProducts").Where(o => o.GetInteger("Ecom:Order:OrderLine.Type") != (int)OrderLineType.Tax).ToList()) 4338 { 4339 string productId = masterProduct.GetString("Ecom:Product.ID"); 4340 List<LoopItem> variantInfos = masterProduct.GetLoop("VariantInfos"); 4341 4342 <tr> 4343 <td class="u-va-middle"> 4344 @if (variantInfos.Count != 0) { 4345 @Render(new Button { ButtonType = ButtonType.Button, ButtonLayout = ButtonLayout.LinkClean, Icon = new Icon { Prefix = "fal", Name = "fa-plus-circle u-color-gray matrix__icon" }, CssClass = "js-matrix-trigger", ExtraAttributes = new Dictionary<string, string>{ { "data-id", "Matrix_" + productId } } }) 4346 } 4347 </td> 4348 <td width="70" class="u-padding-top--lg u-padding-bottom--lg"> 4349 @Render(new Image { Path = GetProductImage(masterProduct), ImageDefault = new ImageSettings { Height = 60, Width = 60 } }) 4350 </td> 4351 <td class="u-va-middle">@masterProduct.GetString("Ecom:Product.Number")</td> 4352 <td class="u-va-middle">@masterProduct.GetString("Ecom:Product.Name")</td> 4353 <td class="u-va-middle">@masterProduct.GetString("TotalQuantity")</td> 4354 <td class="u-va-middle">@masterProduct.GetString("TotalPrice")</td> 4355 <td class="u-va-middle u-ta-right"> 4356 @Render(new Button { ButtonType = ButtonType.Button, OnClick = "window.location = '/Default.aspx?ID=" + Pageview.Page.ID.ToString() + "&cartcmd=delOrderline&ProductId=" + productId + "'", ButtonLayout = ButtonLayout.LinkClean, Icon = new Icon { Prefix = "fal", Name = "fa-trash-alt u-color-gray" } }) 4357 </td> 4358 </tr> 4359 <tr class="u-hidden dw-mod" id="Matrix_@productId"> 4360 <td> </td> 4361 <td colspan="6" class="u-no-padding"> 4362 <div> 4363 @RenderVariantInfoMatrix(variantInfos, productId, Pageview.Page.ID.ToString(), masterProduct.GetDouble("TotalPrice")) 4364 </div> 4365 </td> 4366 </tr> 4367 } 4368 </table> 4369 4370 @RenderReviewOrderMatrixSummary() 4371 </div> 4372 </div> 4373 } 4374 4375 @helper RenderReviewOrderMatrixSummary() { 4376 List<Block> subBlocks = reviewOrderCheckoutPage.GetBlockListById("ReviewOrder"); 4377 4378 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 4379 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 4380 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(GetString("Ecom:Order.ID")); 4381 bool isPricesWithVATEnabled = Converter.ToBoolean(Pageview.Area.EcomPricesWithVat); 4382 4383 var cart = Dynamicweb.Ecommerce.Common.Context.Cart; 4384 var user = Dynamicweb.Security.UserManagement.User.GetCurrentUser(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend); 4385 int userPoints = user != null ? Converter.ToInt32(user.PointBalance) : 0; 4386 double pointsUsedInCart = cart != null && cart.TotalPoints.HasValue ? cart.TotalPoints.Value : 0; 4387 4388 var hidePaymentfee = Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideFreeServices") && GetInteger("Ecom:Order.PaymentFee.Price") == 0; 4389 var hideShippingfee = Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideFreeServices") && GetInteger("Ecom:Order.ShippingFee.Price") == 0; 4390 4391 var showCheckoutDisclaimer = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(GetString("Ecom:Order.ID")) && Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("ShowCheckoutDisclaimer") && (GetDouble("Ecom:Order.Taxes.Total.Price") == 0 || string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID"))); 4392 var checkoutDisclaimer = string.Format("{0}", GetDouble("Ecom:Order.Taxes.Total.Price") == 0 && string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) ? Translate("* Sales Tax and Shipping calculated at Checkout") : string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) ? Translate("* Shipping calculated at Checkout") : Translate("* Sales Tax Calculated at Checkout")); 4393 4394 4395 <div class="grid u-border-top"> 4396 <div class="grid__col-sm-6"> 4397 @if (Dynamicweb.Security.Licensing.LicenseManager.LicenseHasFeature("LoyaltyPoints") && !string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.UserName"))) 4398 { 4399 if (userPoints > 0) 4400 { 4401 <div class="u-border u-border-color--loyalty-points u-padding--lg u-full-height"> 4402 @Render(new Heading { Title = Translate("Your point balance"), Level = 3 }) 4403 <div class="u-font-size--lg u-margin-bottom"> 4404 <span class="u-color--loyalty-points">@userPoints</span> @Translate("points") 4405 </div> 4406 <div>@Translate("On this order you will use"): <span class="u-color--loyalty-points">@pointsUsedInCart</span> @Translate("points")</div> 4407 </div> 4408 } 4409 } 4410 </div> 4411 4412 <div class="grid__col-sm-6"> 4413 @if (!pointShop) 4414 { 4415 if (Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideSubtotal")) 4416 { 4417 <div> 4418 <div class="cart-summary__subtotals dw-mod">@Translate("Subtotal")</div> 4419 <div class="cart-summary__subtotals u-pull--right dw-mod"> 4420 @if (hasTaxSettings) 4421 { 4422 var subtotalpricewithouttaxes = Dynamicweb.Ecommerce.Services.Currencies.Format(Dynamicweb.Ecommerce.Common.Context.Currency, (GetDouble("Ecom:Order.PriceWithoutFees.PriceWithVAT") - GetDouble("Ecom:Order.Taxes.Total.PriceWithVAT")), true); 4423 <text>@subtotalpricewithouttaxes</text> 4424 } 4425 else 4426 { 4427 <text>@GetString("Ecom:Order.PriceWithoutFees.PriceFormatted")</text> 4428 } 4429 </div> 4430 </div> 4431 } 4432 if (hidePaymentfee) { 4433 string paymentmethod = !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethod")) ? GetString("Ecom:Order.PaymentMethod") : Translate("Payment"); 4434 string paymentfee = GetInteger("Ecom:Order.PaymentFee.Price") != 0 ? GetString("Ecom:Order.PaymentFee.PriceFormatted") : Translate("Free"); 4435 4436 <div> 4437 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-credit-card", Label = paymentmethod, LabelPosition = IconLabelPosition.After })</div> 4438 <div class="cart-summary__info u-pull--right dw-mod">@paymentfee</div> 4439 </div> 4440 } 4441 } 4442 @if (hideShippingfee) { 4443 string shippingmethod = !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethod")) ? GetString("Ecom:Order.ShippingMethod") : Translate("Shipping"); 4444 string shippingfee = GetDouble("Ecom:Order.ShippingFee.Price") != 0 ? GetString("Ecom:Order.ShippingFee.PriceFormatted") : Translate("Free"); 4445 4446 <div> 4447 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-truck", Label = shippingmethod, LabelPosition = IconLabelPosition.After })</div> 4448 <div class="cart-summary__info u-pull--right dw-mod">@shippingfee</div> 4449 </div> 4450 } 4451 @if (hasTaxSettings) { 4452 string totaltaxes = GetDouble("Ecom:Order.Taxes.Total.Price") != 0 ? GetString("Ecom:Order.Taxes.Total") : "-"; 4453 4454 <div> 4455 <div class="cart-summary__info dw-mod">@Render(new Icon { Prefix = "fas", Name = "fa-hand-holding-usd", Label = Translate("Sales Tax"), LabelPosition = IconLabelPosition.After })</div> 4456 <div class="cart-summary__info u-pull--right dw-mod">@totaltaxes</div> 4457 </div> 4458 } 4459 @if (Pageview.User != null && Dynamicweb.Security.Licensing.LicenseManager.LicenseHasFeature("LoyaltyPoints") && GetInteger("Ecom:Order.RewardTotalPoints") != 0) 4460 { 4461 int earnings = GetInteger("Ecom:Order.RewardTotalPoints"); 4462 4463 <div> 4464 <div class="cart-summary__info dw-mod">@Translate("Earnings")</div> 4465 <div class="cart-summary__info u-pull--right dw-mod"><span class="u-color--loyalty-points">@earnings</span> @Translate("points")</div> 4466 </div> 4467 } 4468 <div class="cart-summary__totals-container dw-mod"> 4469 <div class="cart-summary__totals dw-mod">@Translate("Total")</div> 4470 <div class="cart-summary__totals u-pull--right dw-mod"> 4471 @if (pointShop) 4472 { 4473 <span class="u-color--loyalty-points">@pointsUsedInCart</span> @Translate("points") 4474 } 4475 else 4476 { 4477 <text>@GetString("Ecom:Order.Price.PriceFormatted")</text> 4478 } 4479 </div> 4480 </div> 4481 @if (!pointShop && !hasTaxSettings) 4482 { 4483 <div class="u-ta-right"> 4484 <small class="cart-summary__info dw-mod">@Translate("VAT") (@GetString("Ecom:Order.PriceWithoutFees.VATPercentFormatted")):</small> 4485 <small class="cart-summary__info dw-mod">@GetString("Ecom:Order.OrderLines.Total.PriceVAT")</small> 4486 </div> 4487 4488 if (isPricesWithVATEnabled) 4489 { 4490 <div class="u-ta-right"> 4491 <small class="cart-summary__info dw-mod">@Translate("Total price without VAT"):</small> 4492 <small class="cart-summary__info dw-mod">@GetString("Ecom:Order.OrderLines.Total.PriceWithoutVAT")</small> 4493 </div> 4494 } 4495 else 4496 { 4497 <div class="u-ta-right"> 4498 <small class="cart-summary__info dw-mod">@Translate("Total price with VAT"):</small> 4499 <small class="cart-summary__info dw-mod">@GetString("Ecom:Order.OrderLines.Total.PriceWithVAT")</small> 4500 </div> 4501 } 4502 } 4503 @if (showCheckoutDisclaimer) { 4504 <div class="u-ta-right"> 4505 <small>@checkoutDisclaimer</small> 4506 </div> 4507 } 4508 </div> 4509 </div> 4510 4511 <div class="grid"> 4512 <div class="grid__col-12 grid__col--line-top"></div> 4513 </div> 4514 4515 if (Pageview.AreaSettings.GetItem("Ecommerce").GetItem("Checkout").GetBoolean("HideComment")) { 4516 <div class="grid__cell u-padding--xs"> 4517 @Render(new TextareaField { Rows = 3, Placeholder = Translate("Enter comment"), Name = "EcomOrderCustomerComment", Id = "EcomOrderCustomerComment", Value = "{{comment}}" }) 4518 </div> 4519 } 4520 4521 <div class="u-margin-bottom--lg"> 4522 @foreach (LoopItem error in GetLoop("ValidationErrors")) 4523 { 4524 @Render(new NotificationMessage { Message = error.GetString("Ecom:Cart.ValidationError.ErrorMessage"), MessageType = NotificationMessageType.Error }) 4525 } 4526 </div> 4527 4528 @RenderBlockList(subBlocks) 4529 } 4530 4531 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4532 @using Dynamicweb.Rendering 4533 @using Dynamicweb.Core 4534 @using System 4535 @using System.Web 4536 @using System.Collections.Generic 4537 @using Dynamicweb.Rapido.Blocks 4538 @using Dynamicweb.Rapido.Blocks.Components 4539 @using Dynamicweb.Rapido.Blocks.Components.General 4540 4541 4542 @* Component - Variant Info Matrix. This replaces the old Variant Matrix with a much cleaner approach *@ 4543 4544 @helper RenderVariantInfoMatrix(List<LoopItem> variantInfos, string productId, string pageId, double totalPrice = 0, string actionType = "update") { 4545 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fas fa-shopping-cart"; 4546 4547 string currencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code; 4548 string countryCode = Pageview.Area.CultureInfo != null ? Pageview.Area.CultureInfo.Name : "en-US"; 4549 4550 int loopCount = 0; 4551 int dimensionsCount = 0; 4552 bool firstRun = true; 4553 List<string> headerLabels = new List<string>(); 4554 4555 //Collect the missing data needed to render matrixes 4556 foreach (var variantInfoFirst in variantInfos) 4557 { 4558 dimensionsCount = 1; 4559 4560 foreach (var variantInfoSecond in variantInfoFirst.GetLoop("VariantInfos")) 4561 { 4562 dimensionsCount = 2; 4563 4564 if (firstRun) { 4565 headerLabels.Add(variantInfoSecond.GetString("OptionName")); 4566 } 4567 4568 foreach (var variantInfoThird in variantInfoSecond.GetLoop("VariantInfos")) 4569 { 4570 dimensionsCount = 3; 4571 } 4572 } 4573 4574 firstRun = false; 4575 } 4576 4577 @*One dimension*@ 4578 if (dimensionsCount == 1) 4579 { 4580 int totalQuantity = 0; 4581 4582 <table cellspacing="0" class="table matrix js-matrix dw-mod"> 4583 <thead class="matrix__head dw-mod"> 4584 <tr> 4585 @foreach (var variantInfoFirst in variantInfos) 4586 { 4587 <td class="u-bold u-ta-center" width="80" >@variantInfoFirst.GetString("OptionName")</td> 4588 } 4589 <td width="80px" align="right" class="matrix-label-field-right dw-mod">@Translate("Totals")</td> 4590 <td> </td> 4591 </tr> 4592 </thead> 4593 <tbody> 4594 <tr> 4595 @foreach (var variantInfoFirst in variantInfos) 4596 { 4597 double price = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, variantInfoFirst.GetString("VariantId"), Dynamicweb.Ecommerce.Common.Context.LanguageID).GetPrice(Dynamicweb.Ecommerce.Common.Context.Currency.Code, Dynamicweb.Ecommerce.Common.Context.Country.Code2).Price; 4598 4599 loopCount++; 4600 totalQuantity += variantInfoFirst.GetInteger("Quantity"); 4601 4602 <td class="matrix__input-cell dw-mod"> 4603 @if (variantInfoFirst.GetBoolean("IsProduct")) 4604 { 4605 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@(loopCount)" /> 4606 <input type="hidden" name="ProductID@(loopCount)" value="@productId" /> 4607 <input type="hidden" name="VariantID@(loopCount)" value="@variantInfoFirst.GetString("VariantId")" /> 4608 <input type="number" name="Quantity@(loopCount)" value="@variantInfoFirst.GetString("Quantity")" data-price="@price" min="0" class="matrix-input-field dw-mod" onchange="Matrix.UpdateQuantities(this)" data-row-id="ONE"> 4609 } else { 4610 <div class="matrix__cell-disabled dw-mod"></div> 4611 } 4612 </td> 4613 } 4614 <td class="u-va-middle"> 4615 <div class="u-bold u-ta-right matrix-label-field-right dw-mod" data-row-total="ONE"> 4616 @totalQuantity 4617 </div> 4618 </td> 4619 <td class="u-bold u-va-middle u-ta-right matrix-label-field-right dw-mod"> 4620 <div class="js-total-price" data-currency-code="@currencyCode" data-country-code="@countryCode"></div> 4621 </td> 4622 </tr> 4623 </tbody> 4624 <tfoot> 4625 <tr> 4626 <td colspan="@(variantInfos.Count + 2)"> </td> 4627 </tr> 4628 <tr> 4629 <td colspan="@(variantInfos.Count + 2)" class="u-ta-right"> 4630 <div class="u-padding--lg"> 4631 @if (actionType == "update") { 4632 @Render(new Button { OnClick = "Matrix.UpdateCart(this, '" + pageId + "');", Title = Translate("Update"), ButtonLayout = ButtonLayout.Tertiary, Icon = new Icon { Prefix = "fal", Name = "fa-redo", LabelPosition = IconLabelPosition.After }, CssClass = "u-no-margin" }) 4633 } else { 4634 @Render(new Button { OnClick = "Matrix.AddToCart(this, '" + pageId + "');", Title = Translate("Add to cart"), ButtonLayout = ButtonLayout.Tertiary, Icon = new Icon { Name = cartIcon, LabelPosition = IconLabelPosition.After }, CssClass = "u-no-margin" }) 4635 } 4636 </div> 4637 </td> 4638 </tr> 4639 </tfoot> 4640 </table> 4641 } 4642 4643 @*Two dimensions*@ 4644 if (dimensionsCount == 2) 4645 { 4646 Dictionary<string, int> columnTotals = new Dictionary<string, int>(); 4647 int counter = 0; 4648 int totalProducts = 0; 4649 4650 <table class="table matrix js-matrix dw-mod" cellspacing="0"> 4651 <thead class="matrix__head dw-mod"> 4652 <tr> 4653 <td width="160"> </td> 4654 @foreach (string label in headerLabels) 4655 { 4656 <td class="u-bold u-ta-center" width="80">@label</td> 4657 } 4658 <td align="right" width="80" class="matrix-label-field-right dw-mod">@Translate("Totals")</td> 4659 <td> </td> 4660 </tr> 4661 </thead> 4662 <tbody> 4663 @foreach (var variantInfoFirst in variantInfos) 4664 { 4665 int totalRowQuantity = 0; 4666 counter += variantInfoFirst.GetInteger("Quantity"); 4667 4668 <tr> 4669 <td class="matrix-label-field-left dw-mod"> 4670 <div>@variantInfoFirst.GetString("OptionName")</div> 4671 <small>@variantInfoFirst.GetString("VariantId")</small> 4672 </td> 4673 @foreach (var variantInfoSecond in variantInfoFirst.GetLoop("VariantInfos")) 4674 { 4675 loopCount++; 4676 totalRowQuantity += variantInfoSecond.GetInteger("Quantity"); 4677 4678 string optionName = variantInfoSecond.GetString("OptionName"); 4679 int optionQuantity = variantInfoSecond.GetInteger("Quantity"); 4680 if (columnTotals.ContainsKey(optionName)) { 4681 columnTotals[optionName] += optionQuantity; 4682 } else { 4683 columnTotals.Add(optionName, optionQuantity); 4684 } 4685 4686 <td class="matrix__input-cell dw-mod"> 4687 @if (variantInfoSecond.GetBoolean("IsProduct")) { 4688 double price = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, variantInfoSecond.GetString("VariantId"), Dynamicweb.Ecommerce.Common.Context.LanguageID).GetPrice(Dynamicweb.Ecommerce.Common.Context.Currency.Code, Dynamicweb.Ecommerce.Common.Context.Country.Code2).Price; 4689 4690 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@(loopCount)" /> 4691 <input type="hidden" name="ProductID@(loopCount)" value="@productId" /> 4692 <input type="hidden" name="VariantID@(loopCount)" value="@variantInfoSecond.GetString("VariantId")" /> 4693 <input type="number" name="Quantity@(loopCount)" value="@variantInfoSecond.GetString("Quantity")" data-price="@price" min="0" class="matrix-input-field dw-mod" onchange="Matrix.UpdateQuantities(this)" data-row-id="@variantInfoFirst.GetString("OptionName")" data-column-id="@variantInfoSecond.GetString("OptionName")"> 4694 } else { 4695 <div class="matrix__cell-disabled dw-mod"></div> 4696 } 4697 </td> 4698 } 4699 <td class="u-va-middle matrix-label-field-right dw-mod"> 4700 <div class="u-bold u-ta-right" data-row-total="@variantInfoFirst.GetString("OptionName")"> 4701 @totalRowQuantity 4702 </div> 4703 </td> 4704 <td> </td> 4705 </tr> 4706 } 4707 </tbody> 4708 <tfoot> 4709 <tr> 4710 <td class="u-bold u-va-middle matrix-label-field-left dw-mod">@Translate("Totals")</td> 4711 @foreach (var item in columnTotals) 4712 { 4713 totalProducts += item.Value; 4714 4715 <td> 4716 <div class="u-bold u-ta-center u-padding--lg" data-column-total="@item.Key"> 4717 @item.Value 4718 </div> 4719 </td> 4720 } 4721 <td class="u-bold u-va-middle u-ta-right matrix-label-field-right dw-mod" align="right"> 4722 <div class="js-total-quantity">@totalProducts</div> 4723 </td> 4724 <td class="u-bold u-va-middle u-ta-right matrix-label-field-right dw-mod"> 4725 <div class="js-total-price" data-currency-code="@currencyCode" data-country-code="@countryCode"></div> 4726 </td> 4727 </tr> 4728 <tr> 4729 <td colspan="9" class="u-ta-right u-no-padding"> 4730 <div class="u-padding--lg"> 4731 @if (actionType == "update") { 4732 @Render(new Button { OnClick = "Matrix.UpdateCart(this, '" + pageId + "');", Title = Translate("Update"), ButtonLayout = ButtonLayout.Tertiary, Icon = new Icon { Prefix = "fal", Name = "fa-redo", LabelPosition = IconLabelPosition.After }, CssClass = "u-no-margin" }) 4733 } else { 4734 @Render(new Button { OnClick = "Matrix.AddToCart(this, '" + pageId + "');", Title = Translate("Add to cart"), ButtonLayout = ButtonLayout.Tertiary, Icon = new Icon { Name = cartIcon, LabelPosition = IconLabelPosition.After }, CssClass = "u-no-margin" }) 4735 } 4736 </div> 4737 </td> 4738 </tr> 4739 </tfoot> 4740 </table> 4741 } 4742 } 4743 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4744 @using Dynamicweb.Core 4745 @using System 4746 @using System.Web 4747 @using System.Collections.Generic 4748 @using Dynamicweb.Rapido.Blocks 4749 @using Dynamicweb.Ecommerce.Orders 4750 4751 @{ 4752 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 4753 4754 BlocksPage googleImpressionsPage = BlocksPage.GetBlockPage("CheckoutPage"); 4755 4756 Block googleImpressionsBlock = new Block() 4757 { 4758 Id = "GoogleImpressionsBlock", 4759 SortId = 10, 4760 Template = RenderScript() 4761 }; 4762 4763 if (useGoogleTagManager) 4764 { 4765 googleImpressionsPage.Add("CheckoutBottomSnippets", googleImpressionsBlock); 4766 } 4767 } 4768 4769 @helper RenderScript() 4770 { 4771 var currentStep = 1; 4772 4773 foreach (LoopItem step in GetLoop("StepButtons")) 4774 { 4775 if (step.GetBoolean("Step.Current")) 4776 { 4777 currentStep = step.GetInteger("Step.Number"); 4778 break; 4779 } 4780 } 4781 <script> 4782 dataLayer.push({ 4783 "event": "checkout", 4784 "ecommerce": { 4785 "currencyCode": "@Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency().Code", 4786 "checkout": { 4787 "actionField": {"step": @currentStep}, 4788 "products": [ 4789 @foreach (LoopItem orderline in GetLoop("OrderLines").Where(o => o.GetBoolean("Ecom:Order:OrderLine.IsProduct") == true).ToList()) 4790 { 4791 var groupObject = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(orderline.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 4792 <text> 4793 { 4794 "name": "@orderline.GetString("Ecom:Order:OrderLine.ProductName")", 4795 "id": "@orderline.GetString("Ecom:Product.ID")", 4796 "price": "@orderline.GetDouble("Ecom:Order:OrderLine.UnitPrice.Price")", 4797 "brand": "@orderline.GetString("Ecom:Product:Field.brand.Value")", 4798 "category": "@(groupObject != null ? groupObject.Name : "")", 4799 "variant": "@orderline.GetString("Ecom:Order:OrderLine.ProductVariantID")", 4800 "quantity": @orderline.GetInteger("Ecom:Order:OrderLine.Quantity") 4801 }, 4802 </text> 4803 } 4804 ] 4805 } 4806 } 4807 }); 4808 </script> 4809 } 4810 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4811 @using Dynamicweb.Core 4812 @using System 4813 @using System.Web 4814 @using System.Collections.Generic 4815 @using Dynamicweb.Rapido.Blocks 4816 4817 @{ 4818 BlocksPage snippetsCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 4819 4820 snippetsCheckoutPage.Add("CheckoutBottomSnippets", new Block 4821 { 4822 Id = "CartAddressesJavascript", 4823 SortId = 50, 4824 Template = RenderCartAddressesJavascript() 4825 }); 4826 } 4827 4828 @helper RenderCartAddressesJavascript() 4829 { 4830 <script> 4831 function resetStateField(stateFieldId) { 4832 let stateField = document.getElementById(stateFieldId); 4833 if (stateField) { 4834 stateField.value = ""; 4835 let disabledOption = stateField.querySelector("option:checked"); 4836 if (disabledOption) { 4837 disabledOption.disabled = false; 4838 disabledOption.removeAttribute("disabled"); 4839 } 4840 } 4841 } 4842 4843 document.addEventListener("DOMContentLoaded", function () { 4844 regionLabels.InitDictionary({ 4845 "CA": "@Translate("Province")", 4846 "US": "@Translate("State")" 4847 }); 4848 regionLabels.LocalizeRegionLabels("EcomOrderCustomerRegion", "EcomOrderCustomerCountry"); 4849 regionLabels.LocalizeRegionLabels("EcomOrderDeliveryRegion", "EcomOrderDeliveryCountry"); 4850 }); 4851 </script> 4852 } 4853 4854 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4855 4856 @using System 4857 @using System.Web 4858 @using System.Collections.Generic 4859 @using Dynamicweb.Extensibility 4860 @using Dynamicweb.Content 4861 @using Dynamicweb.Core 4862 @using Dynamicweb.Rapido.Blocks 4863 @using Dynamicweb.Rapido.Blocks.Components 4864 @using Dynamicweb.Rapido.Blocks.Components.General 4865 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 4866 @using Dynamicweb.Rapido.Services 4867 4868 @{ 4869 BlocksPage customBlocksCheckoutPage = BlocksPage.GetBlockPage("CheckoutPage"); 4870 BlocksPage customBlocksPageReceipt = BlocksPage.GetBlockPage("Receipt"); 4871 4872 // MENNT #656 4873 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 4874 bool disallowOrdering = currentUser != null ? Converter.ToString(currentUser.CustomFieldValues.FirstOrDefault(field => field.CustomField.SystemName == "AccessUser_DisallowOrdering").Value) == "True" : false; 4875 4876 if (disallowOrdering) 4877 { 4878 Block customReviewOrderFooterBlock = new Block() 4879 { 4880 Id = "ReviewOrderFooter", 4881 SortId = 20, 4882 Template = RenderCustomReviewOrderFooter() 4883 }; 4884 customBlocksCheckoutPage.ReplaceBlock(customReviewOrderFooterBlock); 4885 } 4886 // END 4887 4888 // Mennt #322 #323 4889 Block customOrderFieldsBlock = new Block 4890 { 4891 Id = "CustomOrderFields", 4892 SortId = 1, 4893 Template = RenderCustomOrderFields(), 4894 Design = new Design 4895 { 4896 RenderType = RenderType.Column, 4897 Size = "12" 4898 } 4899 }; 4900 customBlocksCheckoutPage.Add("ReviewOrder", customOrderFieldsBlock); 4901 // End Mennt #322 #323 4902 4903 // Mennt 4904 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 4905 { 4906 Block quickBuyBlock = new Block() 4907 { 4908 Id = "QuickBuy", 4909 SortId = 30, 4910 Design = new Design 4911 { 4912 RenderType = RenderType.Column, 4913 Size = "12" 4914 }, 4915 BlocksList = new List<Block> { 4916 new Block { 4917 Id = "QuickBuyHeader", 4918 SortId = 10, 4919 Component = new Heading { Level = 3, Title = Translate("Quick buy"), Icon = new Icon { Prefix = "fas", Name = "fa-cart-plus", LabelPosition = IconLabelPosition.After } }, 4920 Design = new Design { 4921 RenderType = RenderType.CardHeader, 4922 CssClass = "u-color-light--bg" 4923 } 4924 }, 4925 new Block { 4926 Id = "QuickBuyBody", 4927 SortId = 20, 4928 Design = new Design { 4929 RenderType = RenderType.CardBody, 4930 CssClass = "u-color-light--bg" 4931 }, 4932 BlocksList = new List<Block> 4933 { 4934 new Block 4935 { 4936 Id = "QuickBuyForm", 4937 SortId = 10, 4938 Design = new Design { 4939 RenderType = RenderType.Column, 4940 Size = "12" 4941 }, 4942 Template = RenderQuickBuyForm() 4943 } 4944 } 4945 } 4946 } 4947 }; 4948 customBlocksCheckoutPage.Add("AddressContainerRow", quickBuyBlock); 4949 } 4950 // End Mennt 4951 } 4952 4953 @helper RenderCustomReviewOrderFooter() 4954 { 4955 <div class="grid"> 4956 <div class="grid__col-12 grid__col--line-top"></div> 4957 </div> 4958 4959 <div class="grid__cell-footer"> 4960 <div class="grid__cell u-padding--xs"> 4961 <div class="CreditWarning u-padding--lg dw-mod"> 4962 <span>@Translate("Det er dessverre ikke mulig å plassere ordre på nåværende tidspunkt. Dere har en ubetalt faktura, der forfallsdato er passert. Vi ber om at denne gjøres opp før dere handler videre.")</span><br /> 4963 </div> 4964 </div> 4965 </div> 4966 } 4967 4968 @helper RenderCustomOrderFields() 4969 { 4970 <div class="grid grid--external-bleed-x mennt-customorderfields"> 4971 <div class="grid__col-6"> 4972 @Render(new TextField { Required = true, Label = string.Format("{0}", Translate("Eksternt dokumentnummer")), Placeholder = Translate("Eksternt dokumentnummer"), MaxLength = 34, Name = "ExternalDocNumber", Id = "ExternalDocNumber", Value = "{{ExternalDocNumber}}" }) 4973 </div> 4974 <div class="grid__col-6"> 4975 @Render(new TextField { Required = true, Label = string.Format("{0}", Translate("Deres referanse")), Placeholder = Translate("Deres referanse"), MaxLength = 34, Name = "YourReference", Id = "YourReference", Value = "{{YourReference}}" }) 4976 </div> 4977 </div> 4978 } 4979 4980 @helper RenderQuickBuyForm() 4981 { 4982 //GetPageIdByNavigationTag("ProductsPage"); 4983 int productsPageId = 6945; 4984 string facebookPixelAction = ""; 4985 if (!string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"))) 4986 { 4987 facebookPixelAction = "document.getElementById('ExpressBuyProductSearchField').value != '' ? fbq('track', 'AddToCart', {content_ids: [document.getElementById('ExpressBuyProductSearchField').value], content_type: 'product'}) : '';"; 4988 } 4989 string addToCartScript = "expressAddToCart();"; 4990 4991 var addToCart = new AddToCart 4992 { 4993 AddButton = new AddToCartButton 4994 { 4995 Id = "ExpressBuyProductButtonCart", 4996 Title = Translate("Add to cart"), 4997 CssClass = "u-pull--right u-no-margin", 4998 Disabled = true, 4999 QuantitySelectorId = "ExpressBuyProductCount", 5000 OnClick = facebookPixelAction + addToCartScript + "Search.ResetExpressSearch();" 5001 }, 5002 QuantitySelector = new QuantitySelector 5003 { 5004 Id = "ExpressBuyProductCount", 5005 WrapperCssClass = "u-no-margin", 5006 Value = 1 5007 } 5008 }; 5009 5010 <div id="expressSearch" class="grid grid--external-bleed-x"> 5011 <div class="grid__col-12"> 5012 <label for="ExpressBuyProductSearchField">@Translate("Product")</label> 5013 <div class="typeahead js-typeahead u-full-width" data-page-size="5" id="ExpressBuyProductSearch" data-search-feed-id="@productsPageId&feed=true&ExpressBuy=true"> 5014 <input type="text" class="typeahead-search-field u-full-width js-typeahead-search-field u-no-margin" id="ExpressBuyProductSearchField" name="ProductNumber" placeholder="@Translate("Search products")" oninput="document.getElementById('ExpressBuyProductButtonCart').disabled=true" onkeypress="return event.keyCode != 13;"> 5015 <ul class="dropdown dropdown--absolute-position js-typeahead-search-content u-min-w220px u-full-width" id="ExpressBuyProductSearchContent" data-template="ExpressBuySearchContentTemplate" data-preloader="minimal"></ul> 5016 </div> 5017 </div> 5018 <div class="grid__col-4"> 5019 @Render(addToCart.QuantitySelector) 5020 </div> 5021 <div class="grid__col-8 grid--align-self-end"> 5022 @Render(addToCart.AddButton) 5023 </div> 5024 </div> 5025 5026 <script> 5027 function expressAddToCart() { 5028 Cart.AddToCart(event, 5029 { 5030 id: document.getElementById('ExpressBuyProductSearchField').getAttribute('data-result'), 5031 productInfo: JSON.parse(document.getElementById('ExpressBuyProductSearchField').getAttribute('data-product-info')), 5032 quantity: document.getElementById('ExpressBuyProductCount').value 5033 }); 5034 } 5035 5036 var input = document.getElementById("ExpressBuyProductSearchField"); 5037 input.addEventListener("keyup", function (event) { 5038 if (event.keyCode === 13) { 5039 event.preventDefault(); 5040 5041 expressAddToCart(); 5042 } 5043 }); 5044 </script> 5045 5046 <script id="ExpressBuySearchContentTemplate" type="text/x-template"> 5047 {{#.}} 5048 {{#Product}} 5049 <li class="dropdown__item dropdown__item--seperator dw-mod" data-product-info="{{productInfo}}" onclick="Search.UpdateFieldValue(this, {{productInfo}}, true, 'ExpressBuyProductButtonCart')"> 5050 <div class="u-margin-right u-pull--left u-hidden-xs u-hidden-xxs {{noimage}}"> 5051 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=45&height=38&crop=1&Compression=75&image={{image}}" alt="{{name}}"> 5052 </div> 5053 <div class="u-pull--left"> 5054 <div class="u-bold u-max-w340px u-truncate-text">{{name}}</div> 5055 <div class="js-typeahead-name">{{number}}</div> 5056 <div class="js-typeahead-result u-hidden">{{productId}}</div> 5057 <div>{{price}}</div> 5058 </div> 5059 </li> 5060 {{/Product}} 5061 {{/.}} 5062 5063 {{^.}} 5064 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 5065 @Translate("Your search gave 0 results") 5066 </li> 5067 {{/.}} 5068 </script> 5069 } 5070 5071 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 5072 5073 5074 @* 5075 This is a temporary fallback for the DefaultImage. The image pattern MUST be set up like this: 5076 5077 ImageSmall = /{ProductNumber}.jpg 5078 ImageMedium = /{ProductNumber}{VariantOptionLevel1}.jpg 5079 ImageLarge = /{ProductNumber}{VariantComboName}.jpg 5080 5081 In addition to the ImageDefault setting 5082 *@ 5083 5084 @functions { 5085 public string GetProductImage(LoopItem productObject = null) 5086 { 5087 string theImage = ""; 5088 5089 if (productObject == null) { 5090 theImage = GetString("Ecom:Product.ImageDefault.Default.Clean"); 5091 theImage = String.IsNullOrEmpty(theImage) ? GetString("Ecom:Product.ImageLarge.Clean") : theImage; 5092 theImage = String.IsNullOrEmpty(theImage) ? GetString("Ecom:Product.ImageMedium.Clean") : theImage; 5093 theImage = String.IsNullOrEmpty(theImage) ? GetString("Ecom:Product.ImageSmall.Clean") : theImage; 5094 theImage = String.IsNullOrEmpty(theImage) ? GetString("Ecom:Product.ImageLarge.Default.Clean") : theImage; 5095 theImage = String.IsNullOrEmpty(theImage) ? GetString("Ecom:Product.PrimaryImage") : theImage; 5096 } else { 5097 theImage = productObject.GetString("Ecom:Product.ImageDefault.Default.Clean"); 5098 theImage = String.IsNullOrEmpty(theImage) ? productObject.GetString("Ecom:Product.ImageLarge.Clean") : theImage; 5099 theImage = String.IsNullOrEmpty(theImage) ? productObject.GetString("Ecom:Product.ImageMedium.Clean") : theImage; 5100 theImage = String.IsNullOrEmpty(theImage) ? productObject.GetString("Ecom:Product.ImageSmall.Clean") : theImage; 5101 theImage = String.IsNullOrEmpty(theImage) ? productObject.GetString("Ecom:Product.ImageLarge.Default.Clean") : theImage; 5102 theImage = String.IsNullOrEmpty(theImage) ? productObject.GetString("Ecom:Product.PrimaryImage") : theImage; 5103 } 5104 5105 return theImage; 5106 } 5107 } 5108 5109 5110 @helper RenderCheckoutForm() 5111 { 5112 List<Block> subBlocks = checkoutPage.GetBlockListById("CheckoutForm").OrderBy(item => item.SortId).ToList(); 5113 string pageId = GetGlobalValue("Global:Page.ID"); 5114 5115 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width"> 5116 <div class="center-container center-container--with-background-image dw-mod"> 5117 <div class="paragraph-container u-padding"> 5118 <form name="ordersubmit" id="OrderSubmit" method="post" action="/Default.aspx?ID=@pageId" autocomplete="off"> 5119 <div class="grid"> 5120 @RenderBlockList(subBlocks) 5121 </div> 5122 </form> 5123 </div> 5124 </div> 5125 </section> 5126 } 5127 5128 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 5129 @RenderBlockList(checkoutPage.BlocksRoot.BlocksList)