Error executing template "Designs/Rapido/_parsed/DynamicArticle.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_7e10a07919204592997f32e3def7ce20.Execute() in D:\dynamicweb.net\Solutions\Mennt\Skadedyrbutikken.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\DynamicArticle.parsed.cshtml:line 8834
   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.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 3 @using System.Web; 4 @using Dynamicweb.Frontend 5 @using Dynamicweb.Frontend.Devices 6 @using Dynamicweb.Extensibility 7 @using Dynamicweb.Content 8 @using Dynamicweb.Security 9 @using Dynamicweb.Core 10 @using System 11 @using System.Web 12 @using System.IO 13 @using Dynamicweb.Rapido.Blocks 14 @using System.Net 15 16 17 @functions { 18 BlocksPage masterPage = BlocksPage.GetBlockPage("Master"); 19 20 string getFontFamily(params string[] items) 21 { 22 var itemParent = Pageview.AreaSettings; 23 foreach (var item in items) 24 { 25 itemParent = itemParent.GetItem(item); 26 if (itemParent == null) 27 { 28 return null; 29 } 30 } 31 32 var googleFont = itemParent.GetGoogleFont("FontFamily"); 33 if (googleFont == null) 34 { 35 return null; 36 } 37 return googleFont.Family.Replace(" ", "+"); 38 } 39 } 40 41 @{ 42 Block root = new Block 43 { 44 Id = "Root", 45 SortId = 10, 46 BlocksList = new List<Block> 47 { 48 new Block { 49 Id = "Head", 50 SortId = 10, 51 SkipRenderBlocksList = true, 52 Template = RenderMasterHead(), 53 BlocksList = new List<Block> 54 { 55 new Block { 56 Id = "HeadMetadata", 57 SortId = 10, 58 Template = RenderMasterMetadata(), 59 }, 60 new Block { 61 Id = "HeadCss", 62 SortId = 20, 63 Template = RenderMasterCss(), 64 }, 65 new Block { 66 Id = "HeadManifest", 67 SortId = 30, 68 Template = RenderMasterManifest(), 69 } 70 } 71 }, 72 new Block { 73 Id = "Body", 74 SortId = 20, 75 SkipRenderBlocksList = true, 76 Template = RenderMasterBody(), 77 BlocksList = new List<Block> 78 { 79 new Block() 80 { 81 Id = "Master", 82 SortId = 10, 83 BlocksList = new List<Block> { 84 new Block { 85 Id = "MasterTopSnippets", 86 SortId = 10 87 }, 88 new Block { 89 Id = "MasterMain", 90 SortId = 20, 91 Template = RenderMain(), 92 SkipRenderBlocksList = true, 93 BlocksList = new List<Block> { 94 new Block { 95 Id = "MasterHeader", 96 SortId = 10, 97 Template = RenderMasterHeader(), 98 SkipRenderBlocksList = true 99 }, 100 new Block { 101 Id = "MasterPageContent", 102 SortId = 20, 103 Template = RenderPageContent() 104 } 105 } 106 }, 107 new Block { 108 Id = "MasterFooter", 109 SortId = 30 110 }, 111 new Block { 112 Id = "MasterReferences", 113 SortId = 40 114 }, 115 new Block { 116 Id = "MasterBottomSnippets", 117 SortId = 50, 118 BlocksList = new List<Block> { 119 new Block { 120 Id = "iOsTabletFix", 121 SortId = 10, 122 Template = RenderIosTabletFix() 123 } 124 } 125 } 126 } 127 } 128 } 129 } 130 } 131 }; 132 133 masterPage.Add(root); 134 } 135 136 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 137 @using System.Text.RegularExpressions 138 @using System.Collections.Generic 139 @using System.Reflection 140 @using System.Web 141 @using System.Web.UI.HtmlControls 142 @using Dynamicweb.Rapido.Blocks.Components 143 @using Dynamicweb.Rapido.Blocks.Components.Articles 144 @using Dynamicweb.Rapido.Blocks.Components.Documentation 145 @using Dynamicweb.Rapido.Blocks 146 147 148 @*--- START: Base block renderers ---*@ 149 150 @helper RenderBlockList(List<Block> blocks) 151 { 152 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 153 blocks = blocks.OrderBy(item => item.SortId).ToList(); 154 155 foreach (Block item in blocks) 156 { 157 if (debug) { 158 <!-- Block START: @item.Id --> 159 } 160 161 if (item.Design == null) 162 { 163 @RenderBlock(item) 164 } 165 else if (item.Design.RenderType == RenderType.None) { 166 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 167 168 <div class="@cssClass dw-mod"> 169 @RenderBlock(item) 170 </div> 171 } 172 else if (item.Design.RenderType != RenderType.Hide) 173 { 174 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 175 176 if (!item.SkipRenderBlocksList) { 177 if (item.Design.RenderType == RenderType.Row) 178 { 179 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 180 @RenderBlock(item) 181 </div> 182 } 183 184 if (item.Design.RenderType == RenderType.Column) 185 { 186 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 187 string size = item.Design.Size ?? "12"; 188 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 189 190 <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"> 191 @RenderBlock(item) 192 </div> 193 } 194 195 if (item.Design.RenderType == RenderType.Table) 196 { 197 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 198 @RenderBlock(item) 199 </table> 200 } 201 202 if (item.Design.RenderType == RenderType.TableRow) 203 { 204 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 205 @RenderBlock(item) 206 </tr> 207 } 208 209 if (item.Design.RenderType == RenderType.TableColumn) 210 { 211 <td class="@cssClass dw-mod" id="Block__@item.Id"> 212 @RenderBlock(item) 213 </td> 214 } 215 216 if (item.Design.RenderType == RenderType.CardHeader) 217 { 218 <div class="card-header @cssClass dw-mod"> 219 @RenderBlock(item) 220 </div> 221 } 222 223 if (item.Design.RenderType == RenderType.CardBody) 224 { 225 <div class="card @cssClass dw-mod"> 226 @RenderBlock(item) 227 </div> 228 } 229 230 if (item.Design.RenderType == RenderType.CardFooter) 231 { 232 <div class="card-footer @cssClass dw-mod"> 233 @RenderBlock(item) 234 </div> 235 } 236 } 237 else 238 { 239 @RenderBlock(item) 240 } 241 } 242 243 if (debug) { 244 <!-- Block END: @item.Id --> 245 } 246 } 247 } 248 249 @helper RenderBlock(Block item) 250 { 251 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 252 253 if (item.Template != null) 254 { 255 @BlocksPage.RenderTemplate(item.Template) 256 } 257 258 if (item.Component != null) 259 { 260 string customSufix = "Custom"; 261 string methodName = item.Component.HelperName; 262 263 ComponentBase[] methodParameters = new ComponentBase[1]; 264 methodParameters[0] = item.Component; 265 Type methodType = this.GetType(); 266 267 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 268 MethodInfo generalMethod = methodType.GetMethod(methodName); 269 270 try { 271 if (debug) { 272 <!-- Component: @methodName.Replace("Render", "") --> 273 } 274 @customMethod.Invoke(this, methodParameters).ToString(); 275 } catch { 276 try { 277 @generalMethod.Invoke(this, methodParameters).ToString(); 278 } catch(Exception ex) { 279 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 280 } 281 } 282 } 283 284 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 285 { 286 @RenderBlockList(item.BlocksList) 287 } 288 } 289 290 @*--- END: Base block renderers ---*@ 291 292 293 @* Include the components *@ 294 @using Dynamicweb.Rapido.Blocks.Components 295 @using Dynamicweb.Rapido.Blocks.Components.General 296 @using Dynamicweb.Rapido.Blocks 297 @using System.IO 298 299 @* Required *@ 300 @using Dynamicweb.Rapido.Blocks.Components 301 @using Dynamicweb.Rapido.Blocks.Components.General 302 @using Dynamicweb.Rapido.Blocks 303 304 305 @helper Render(ComponentBase component) 306 { 307 if (component != null) 308 { 309 @component.Render(this) 310 } 311 } 312 313 @* Components *@ 314 @using System.Reflection 315 @using Dynamicweb.Rapido.Blocks.Components.General 316 317 318 @* Component *@ 319 320 @helper RenderIcon(Icon settings) 321 { 322 if (settings != null) 323 { 324 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 325 326 if (settings.Name != null) 327 { 328 if (string.IsNullOrEmpty(settings.Label)) 329 { 330 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 331 } 332 else 333 { 334 if (settings.LabelPosition == IconLabelPosition.Before) 335 { 336 <div class="u-flex u-flex--align-items-center @settings.CssClass">@settings.Label <i class="@settings.Prefix @settings.Name u-margin-left" @color></i></div> 337 } 338 else 339 { 340 <div class="u-flex u-flex--align-items-center @settings.CssClass"><i class="@settings.Prefix @settings.Name u-margin-right--lg u-w20px" @color></i>@settings.Label</div> 341 } 342 } 343 } 344 else if (!string.IsNullOrEmpty(settings.Label)) 345 { 346 @settings.Label 347 } 348 } 349 } 350 @using System.Reflection 351 @using Dynamicweb.Rapido.Blocks.Components.General 352 @using Dynamicweb.Rapido.Blocks.Components 353 @using Dynamicweb.Core 354 355 @* Component *@ 356 357 @helper RenderButton(Button settings) 358 { 359 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 360 { 361 Dictionary<string, string> attributes = new Dictionary<string, string>(); 362 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 363 if (settings.Disabled) { 364 attributes.Add("disabled", "true"); 365 classList.Add("disabled"); 366 } 367 368 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 369 { 370 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 371 @RenderConfirmDialog(settings); 372 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 373 } 374 375 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 376 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 377 if (!string.IsNullOrEmpty(settings.AltText)) 378 { 379 attributes.Add("title", settings.AltText); 380 } 381 else if (!string.IsNullOrEmpty(settings.Title)) 382 { 383 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty); 384 cleanTitle = cleanTitle.Replace("&nbsp;", " "); 385 attributes.Add("title", cleanTitle); 386 } 387 388 var onClickEvents = new List<string>(); 389 if (!string.IsNullOrEmpty(settings.OnClick)) 390 { 391 onClickEvents.Add(settings.OnClick); 392 } 393 if (!string.IsNullOrEmpty(settings.Href)) 394 { 395 onClickEvents.Add("location.href='" + settings.Href + "'"); 396 } 397 if (onClickEvents.Count > 0) 398 { 399 attributes.Add("onClick", string.Join(";", onClickEvents)); 400 } 401 402 if (settings.ButtonLayout != ButtonLayout.None) 403 { 404 classList.Add("btn"); 405 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 406 if (btnLayout == "linkclean") 407 { 408 btnLayout = "link-clean"; //fix 409 } 410 classList.Add("btn--" + btnLayout); 411 } 412 413 if (settings.Icon == null) 414 { 415 settings.Icon = new Icon(); 416 } 417 418 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : ""; 419 settings.Icon.Label = settings.Title; 420 421 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 422 423 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 424 } 425 } 426 427 @helper RenderConfirmDialog(Button settings) 428 { 429 Modal confirmDialog = new Modal { 430 Id = settings.Id, 431 Width = ModalWidth.Sm, 432 Heading = new Heading 433 { 434 Level = 2, 435 Title = settings.ConfirmTitle 436 }, 437 BodyText = settings.ConfirmText 438 }; 439 440 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 441 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 442 443 @Render(confirmDialog) 444 } 445 @using Dynamicweb.Rapido.Blocks.Components.General 446 @using Dynamicweb.Rapido.Blocks.Components 447 @using Dynamicweb.Core 448 449 @helper RenderDashboard(Dashboard settings) 450 { 451 var widgets = settings.GetWidgets(); 452 453 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 454 { 455 //set bg color for them 456 457 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 458 int r = Convert.ToInt16(color.R); 459 int g = Convert.ToInt16(color.G); 460 int b = Convert.ToInt16(color.B); 461 462 var count = widgets.Length; 463 var max = Math.Max(r, Math.Max(g, b)); 464 double step = 255.0 / (max * count); 465 var i = 0; 466 foreach (var widget in widgets) 467 { 468 i++; 469 470 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 471 widget.BackgroundColor = shade; 472 } 473 } 474 475 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 476 @foreach (var widget in widgets) 477 { 478 <div class="dashboard__widget"> 479 @Render(widget) 480 </div> 481 } 482 </div> 483 } 484 @using Dynamicweb.Rapido.Blocks.Components.General 485 @using Dynamicweb.Rapido.Blocks.Components 486 487 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 488 { 489 if (!string.IsNullOrEmpty(settings.Link)) 490 { 491 var backgroundStyles = ""; 492 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 493 { 494 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 495 } 496 497 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 498 <div class="u-center-middle u-color-light"> 499 @if (settings.Icon != null) 500 { 501 settings.Icon.CssClass += "widget__icon"; 502 @Render(settings.Icon) 503 } 504 <div class="widget__title">@settings.Title</div> 505 </div> 506 </a> 507 } 508 } 509 @using Dynamicweb.Rapido.Blocks.Components.General 510 @using Dynamicweb.Rapido.Blocks.Components 511 512 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 513 { 514 var backgroundStyles = ""; 515 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 516 { 517 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 518 } 519 520 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 521 <div class="u-center-middle u-color-light"> 522 @if (settings.Icon != null) 523 { 524 settings.Icon.CssClass += "widget__icon"; 525 @Render(settings.Icon) 526 } 527 <div class="widget__counter">@settings.Count</div> 528 <div class="widget__title">@settings.Title</div> 529 </div> 530 </div> 531 } 532 @using System.Reflection 533 @using Dynamicweb.Rapido.Blocks.Components.General 534 @using Dynamicweb.Rapido.Blocks.Components 535 @using Dynamicweb.Core 536 537 @* Component *@ 538 539 @helper RenderLink(Link settings) 540 { 541 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 542 { 543 Dictionary<string, string> attributes = new Dictionary<string, string>(); 544 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 545 if (settings.Disabled) 546 { 547 attributes.Add("disabled", "true"); 548 classList.Add("disabled"); 549 } 550 551 if (!string.IsNullOrEmpty(settings.AltText)) 552 { 553 attributes.Add("title", settings.AltText); 554 } 555 else if (!string.IsNullOrEmpty(settings.Title)) 556 { 557 attributes.Add("title", settings.Title); 558 } 559 560 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 561 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 562 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 563 attributes.Add("href", settings.Href); 564 565 if (settings.ButtonLayout != ButtonLayout.None) 566 { 567 classList.Add("btn"); 568 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 569 if (btnLayout == "linkclean") 570 { 571 btnLayout = "link-clean"; //fix 572 } 573 classList.Add("btn--" + btnLayout); 574 } 575 576 if (settings.Icon == null) 577 { 578 settings.Icon = new Icon(); 579 } 580 settings.Icon.Label = settings.Title; 581 582 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 583 { 584 settings.Rel = LinkRelType.Noopener; 585 } 586 if (settings.Target != LinkTargetType.None) 587 { 588 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 589 } 590 if (settings.Download) 591 { 592 attributes.Add("download", "true"); 593 } 594 if (settings.Rel != LinkRelType.None) 595 { 596 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 597 } 598 599 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 600 } 601 } 602 @using System.Reflection 603 @using Dynamicweb.Rapido.Blocks.Components 604 @using Dynamicweb.Rapido.Blocks.Components.General 605 @using Dynamicweb.Rapido.Blocks 606 607 608 @* Component *@ 609 610 @helper RenderRating(Rating settings) 611 { 612 if (settings.Score > 0) 613 { 614 int rating = settings.Score; 615 string iconType = "fa-star"; 616 617 switch (settings.Type.ToString()) { 618 case "Stars": 619 iconType = "fa-star"; 620 break; 621 case "Hearts": 622 iconType = "fa-heart"; 623 break; 624 case "Lemons": 625 iconType = "fa-lemon"; 626 break; 627 case "Bombs": 628 iconType = "fa-bomb"; 629 break; 630 } 631 632 <div class="u-ta-right"> 633 @for (int i = 0; i < settings.OutOf; i++) 634 { 635 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 636 } 637 </div> 638 } 639 } 640 @using System.Reflection 641 @using Dynamicweb.Rapido.Blocks.Components.General 642 @using Dynamicweb.Rapido.Blocks.Components 643 644 645 @* Component *@ 646 647 @helper RenderSelectFieldOption(SelectFieldOption settings) 648 { 649 Dictionary<string, string> attributes = new Dictionary<string, string>(); 650 if (settings.Checked) { attributes.Add("selected", "true"); } 651 if (settings.Disabled) { attributes.Add("disabled", "true"); } 652 if (settings.Value != null) { attributes.Add("value", settings.Value); } 653 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 654 655 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 656 } 657 @using System.Reflection 658 @using Dynamicweb.Rapido.Blocks.Components.General 659 @using Dynamicweb.Rapido.Blocks.Components 660 661 662 @* Component *@ 663 664 @helper RenderNavigation(Navigation settings) { 665 @RenderNavigation(new 666 { 667 id = settings.Id, 668 cssclass = settings.CssClass, 669 startLevel = settings.StartLevel, 670 endlevel = settings.EndLevel, 671 expandmode = settings.Expandmode, 672 sitemapmode = settings.SitemapMode, 673 template = settings.Template 674 }) 675 } 676 @using Dynamicweb.Rapido.Blocks.Components.General 677 @using Dynamicweb.Rapido.Blocks.Components 678 679 680 @* Component *@ 681 682 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 683 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 684 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 685 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 686 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 687 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 688 settings.SitemapMode = false; 689 690 @RenderNavigation(settings) 691 } 692 @using Dynamicweb.Rapido.Blocks.Components.General 693 @using Dynamicweb.Rapido.Blocks.Components 694 695 696 @* Component *@ 697 698 @helper RenderLeftNavigation(LeftNavigation settings) { 699 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 700 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 701 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 702 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 703 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 704 705 <div class="grid__cell"> 706 @RenderNavigation(settings) 707 </div> 708 } 709 @using System.Reflection 710 @using Dynamicweb.Rapido.Blocks.Components.General 711 @using Dynamicweb.Core 712 713 @* Component *@ 714 715 @helper RenderHeading(Heading settings) 716 { 717 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 718 { 719 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 720 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 721 722 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 723 if (!string.IsNullOrEmpty(settings.Link)) 724 { 725 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 726 } 727 else 728 { 729 if (settings.Icon == null) 730 { 731 settings.Icon = new Icon(); 732 } 733 settings.Icon.Label = settings.Title; 734 @Render(settings.Icon) 735 } 736 @("</" + tagName + ">"); 737 } 738 } 739 @using Dynamicweb.Rapido.Blocks.Components 740 @using Dynamicweb.Rapido.Blocks.Components.General 741 @using Dynamicweb.Rapido.Blocks 742 743 744 @* Component *@ 745 746 @helper RenderImage(Image settings) 747 { 748 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 749 { 750 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 751 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 752 753 if (settings.Caption != null) 754 { 755 @:<div> 756 } 757 758 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 759 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 760 761 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 762 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 763 @if (settings.Link != null) 764 { 765 <a href="@settings.Link"> 766 @RenderTheImage(settings) 767 </a> 768 } 769 else 770 { 771 @RenderTheImage(settings) 772 } 773 </div> 774 </div> 775 776 if (settings.Caption != null) 777 { 778 <span class="image-caption dw-mod">@settings.Caption</span> 779 @:</div> 780 } 781 } 782 else 783 { 784 if (settings.Caption != null) 785 { 786 @:<div> 787 } 788 if (!string.IsNullOrEmpty(settings.Link)) 789 { 790 <a href="@settings.Link"> 791 @RenderTheImage(settings) 792 </a> 793 } 794 else 795 { 796 @RenderTheImage(settings) 797 } 798 799 if (settings.Caption != null) 800 { 801 <span class="image-caption dw-mod">@settings.Caption</span> 802 @:</div> 803 } 804 } 805 } 806 807 @helper RenderTheImage(Image settings) 808 { 809 if (settings != null) 810 { 811 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg"; 812 string placeholderImage = "/Files/Images/placeholder.gif"; 813 string imageEngine = "/Admin/Public/GetImage.ashx?"; 814 815 string imageStyle = ""; 816 817 switch (settings.Style) 818 { 819 case ImageStyle.Ball: 820 imageStyle = "grid__cell-img--ball"; 821 break; 822 823 case ImageStyle.Triangle: 824 imageStyle = "grid__cell-img--triangle"; 825 break; 826 } 827 828 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 829 { 830 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 831 832 if (settings.ImageDefault != null) 833 { 834 settings.ImageDefault.Height = settings.ImageDefault.Width; 835 } 836 if (settings.ImageMedium != null) 837 { 838 settings.ImageMedium.Height = settings.ImageMedium.Width; 839 } 840 if (settings.ImageSmall != null) 841 { 842 settings.ImageSmall.Height = settings.ImageSmall.Width; 843 } 844 } 845 846 string defaultImage = imageEngine; 847 string imageSmall = ""; 848 string imageMedium = ""; 849 850 if (settings.DisableImageEngine) 851 { 852 defaultImage = settings.Path; 853 } 854 else 855 { 856 if (settings.ImageDefault != null) 857 { 858 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 859 860 if (settings.Path.GetType() != typeof(string)) 861 { 862 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 863 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 864 } 865 else 866 { 867 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 868 } 869 870 defaultImage += "&AlternativeImage=" + alternativeImage; 871 } 872 873 if (settings.ImageSmall != null) 874 { 875 imageSmall = "data-src-small=\"" + imageEngine; 876 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 877 878 if (settings.Path.GetType() != typeof(string)) 879 { 880 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 881 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 882 } 883 else 884 { 885 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 886 } 887 888 imageSmall += "&alternativeImage=" + alternativeImage; 889 890 imageSmall += "\""; 891 } 892 893 if (settings.ImageMedium != null) 894 { 895 imageMedium = "data-src-medium=\"" + imageEngine; 896 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 897 898 if (settings.Path.GetType() != typeof(string)) 899 { 900 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 901 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 902 } 903 else 904 { 905 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 906 } 907 908 imageMedium += "&alternativeImage=" + alternativeImage; 909 910 imageMedium += "\""; 911 } 912 } 913 914 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 915 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 916 if (!string.IsNullOrEmpty(settings.Title)) 917 { 918 optionalAttributes.Add("alt", settings.Title); 919 optionalAttributes.Add("title", settings.Title); 920 } 921 922 if (settings.DisableLazyLoad) 923 { 924 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 925 } 926 else 927 { 928 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" alt="@settings.Path" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 929 } 930 } 931 } 932 @using System.Reflection 933 @using Dynamicweb.Rapido.Blocks.Components.General 934 @using Dynamicweb.Rapido.Blocks.Components 935 936 @* Component *@ 937 938 @helper RenderFileField(FileField settings) 939 { 940 var attributes = new Dictionary<string, string>(); 941 if (string.IsNullOrEmpty(settings.Id)) 942 { 943 settings.Id = Guid.NewGuid().ToString("N"); 944 } 945 946 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 947 if (settings.Disabled) { attributes.Add("disabled", "true"); } 948 if (settings.Required) { attributes.Add("required", "true"); } 949 if (settings.Multiple) { attributes.Add("multiple", "true"); } 950 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 951 if (string.IsNullOrEmpty(settings.ChooseFileText)) 952 { 953 settings.ChooseFileText = Translate("Choose file"); 954 } 955 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 956 { 957 settings.NoFilesChosenText = Translate("No files chosen..."); 958 } 959 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 960 961 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 962 963 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 964 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 965 966 attributes.Add("type", "file"); 967 if (settings.Value != null) { attributes.Add("value", settings.Value); } 968 settings.CssClass = "u-full-width " + settings.CssClass; 969 970 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 971 972 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 973 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 974 { 975 <div class="u-full-width"> 976 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 977 @if (settings.Link != null) { 978 <div class="u-pull--right"> 979 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 980 @Render(settings.Link) 981 </div> 982 } 983 </div> 984 985 } 986 987 @if (!string.IsNullOrEmpty(settings.HelpText)) 988 { 989 <small class="form__help-text">@settings.HelpText</small> 990 } 991 992 <div class="form__field-combi file-input u-no-margin dw-mod"> 993 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 994 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 995 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 996 @if (settings.UploadButton != null) 997 { 998 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 999 @Render(settings.UploadButton) 1000 } 1001 </div> 1002 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1003 </div> 1004 } 1005 @using System.Reflection 1006 @using Dynamicweb.Rapido.Blocks.Components.General 1007 @using Dynamicweb.Rapido.Blocks.Components 1008 @using Dynamicweb.Core 1009 @using System.Linq 1010 1011 @* Component *@ 1012 1013 @helper RenderDateTimeField(DateTimeField settings) 1014 { 1015 if (string.IsNullOrEmpty(settings.Id)) 1016 { 1017 settings.Id = Guid.NewGuid().ToString("N"); 1018 } 1019 1020 var textField = new TextField { 1021 Name = settings.Name, 1022 Id = settings.Id, 1023 Label = settings.Label, 1024 HelpText = settings.HelpText, 1025 Value = settings.Value, 1026 Disabled = settings.Disabled, 1027 Required = settings.Required, 1028 ErrorMessage = settings.ErrorMessage, 1029 CssClass = settings.CssClass, 1030 WrapperCssClass = settings.WrapperCssClass, 1031 OnChange = settings.OnChange, 1032 OnClick = settings.OnClick, 1033 Link = settings.Link, 1034 ExtraAttributes = settings.ExtraAttributes, 1035 // 1036 Placeholder = settings.Placeholder 1037 }; 1038 1039 @Render(textField) 1040 1041 List<string> jsAttributes = new List<string>(); 1042 1043 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1044 1045 if (!string.IsNullOrEmpty(settings.DateFormat)) 1046 { 1047 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1048 } 1049 if (!string.IsNullOrEmpty(settings.MinDate)) 1050 { 1051 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1052 } 1053 if (!string.IsNullOrEmpty(settings.MaxDate)) 1054 { 1055 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1056 } 1057 if (settings.IsInline) 1058 { 1059 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1060 } 1061 if (settings.EnableTime) 1062 { 1063 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1064 } 1065 if (settings.EnableWeekNumbers) 1066 { 1067 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1068 } 1069 1070 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1071 1072 <script> 1073 document.addEventListener("DOMContentLoaded", function () { 1074 flatpickr("#@textField.Id", { 1075 @string.Join(",", jsAttributes) 1076 }); 1077 }); 1078 </script> 1079 } 1080 @using System.Reflection 1081 @using Dynamicweb.Rapido.Blocks.Components.General 1082 @using Dynamicweb.Rapido.Blocks.Components 1083 1084 @* Component *@ 1085 1086 @helper RenderTextField(TextField 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.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1108 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1109 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1110 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1111 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1112 1113 settings.CssClass = "u-full-width " + settings.CssClass; 1114 1115 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1116 1117 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1118 1119 string noMargin = "u-no-margin"; 1120 if (!settings.ReadOnly) { 1121 noMargin = ""; 1122 } 1123 1124 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1125 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1126 { 1127 <div class="u-full-width"> 1128 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1129 @if (settings.Link != null) { 1130 settings.Link.ButtonLayout = ButtonLayout.LinkClean; 1131 1132 <div class="u-pull--right"> 1133 @Render(settings.Link) 1134 </div> 1135 } 1136 </div> 1137 1138 } 1139 1140 @if (!string.IsNullOrEmpty(settings.HelpText)) 1141 { 1142 <small class="form__help-text">@settings.HelpText</small> 1143 } 1144 1145 @if (settings.ActionButton != null) 1146 { 1147 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1148 <div class="form__field-combi u-no-margin dw-mod"> 1149 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1150 @Render(settings.ActionButton) 1151 </div> 1152 } 1153 else 1154 { 1155 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1156 } 1157 1158 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1159 </div> 1160 } 1161 @using System.Reflection 1162 @using Dynamicweb.Rapido.Blocks.Components.General 1163 @using Dynamicweb.Rapido.Blocks.Components 1164 1165 @* Component *@ 1166 1167 @helper RenderNumberField(NumberField settings) 1168 { 1169 var attributes = new Dictionary<string, string>(); 1170 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1171 { 1172 settings.Id = Guid.NewGuid().ToString("N"); 1173 } 1174 1175 /*base settings*/ 1176 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1177 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1178 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1179 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1180 if (settings.Required) { attributes.Add("required", "true"); } 1181 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1182 /*end*/ 1183 1184 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1185 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1186 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1187 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1188 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1189 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1190 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1191 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1192 attributes.Add("type", "number"); 1193 1194 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1195 1196 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1197 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1198 { 1199 <div class="u-full-width"> 1200 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1201 @if (settings.Link != null) { 1202 <div class="u-pull--right"> 1203 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1204 @Render(settings.Link) 1205 </div> 1206 } 1207 </div> 1208 1209 } 1210 1211 @if (!string.IsNullOrEmpty(settings.HelpText)) 1212 { 1213 <small class="form__help-text">@settings.HelpText</small> 1214 } 1215 1216 @if (settings.ActionButton != null) 1217 { 1218 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1219 <div class="form__field-combi u-no-margin dw-mod"> 1220 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1221 @Render(settings.ActionButton) 1222 </div> 1223 } 1224 else 1225 { 1226 <div class="form__field-combi u-no-margin dw-mod"> 1227 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1228 </div> 1229 } 1230 1231 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1232 </div> 1233 } 1234 @using System.Reflection 1235 @using Dynamicweb.Rapido.Blocks.Components.General 1236 @using Dynamicweb.Rapido.Blocks.Components 1237 1238 1239 @* Component *@ 1240 1241 @helper RenderTextareaField(TextareaField settings) 1242 { 1243 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1244 string id = settings.Id; 1245 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1246 { 1247 id = Guid.NewGuid().ToString("N"); 1248 } 1249 1250 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1251 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1252 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1253 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1254 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1255 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1256 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1257 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1258 if (settings.Required) { attributes.Add("required", "true"); } 1259 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1260 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1261 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1262 attributes.Add("name", settings.Name); 1263 1264 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1265 1266 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1267 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1268 { 1269 <div class="u-full-width"> 1270 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1271 @if (settings.Link != null) { 1272 <div class="u-pull--right"> 1273 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1274 @Render(settings.Link) 1275 </div> 1276 } 1277 </div> 1278 } 1279 1280 @if (!string.IsNullOrEmpty(settings.HelpText)) 1281 { 1282 <small class="form__help-text">@settings.HelpText</small> 1283 } 1284 1285 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1286 1287 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1288 </div> 1289 } 1290 @using System.Reflection 1291 @using Dynamicweb.Rapido.Blocks.Components.General 1292 @using Dynamicweb.Rapido.Blocks.Components 1293 1294 1295 @* Component *@ 1296 1297 @helper RenderHiddenField(HiddenField settings) { 1298 var attributes = new Dictionary<string, string>(); 1299 attributes.Add("type", "hidden"); 1300 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1301 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1302 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1303 1304 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1305 } 1306 @using System.Reflection 1307 @using Dynamicweb.Rapido.Blocks.Components.General 1308 @using Dynamicweb.Rapido.Blocks.Components 1309 1310 @* Component *@ 1311 1312 @helper RenderCheckboxField(CheckboxField settings) 1313 { 1314 var attributes = new Dictionary<string, string>(); 1315 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1316 { 1317 settings.Id = Guid.NewGuid().ToString("N"); 1318 } 1319 1320 /*base settings*/ 1321 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1322 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1323 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1324 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1325 if (settings.Required) { attributes.Add("required", "true"); } 1326 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1327 /*end*/ 1328 1329 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1330 1331 attributes.Add("type", "checkbox"); 1332 if (settings.Checked) { attributes.Add("checked", "true"); } 1333 settings.CssClass = "form__control " + settings.CssClass; 1334 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1335 1336 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1337 1338 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1339 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1340 @if (!string.IsNullOrEmpty(settings.Label)) 1341 { 1342 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1343 } 1344 1345 @if (settings.Link != null) { 1346 <span> 1347 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1348 @Render(settings.Link) 1349 </span> 1350 } 1351 1352 @if (!string.IsNullOrEmpty(settings.HelpText)) 1353 { 1354 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small> 1355 } 1356 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1357 </div> 1358 } 1359 @using System.Reflection 1360 @using Dynamicweb.Rapido.Blocks.Components.General 1361 @using Dynamicweb.Rapido.Blocks.Components 1362 1363 1364 @* Component *@ 1365 1366 @helper RenderCheckboxListField(CheckboxListField settings) 1367 { 1368 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1369 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1370 { 1371 <div class="u-full-width"> 1372 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1373 @if (settings.Link != null) { 1374 <div class="u-pull--right"> 1375 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1376 @Render(settings.Link) 1377 </div> 1378 } 1379 </div> 1380 1381 } 1382 1383 <div class="u-pull--left"> 1384 @if (!string.IsNullOrEmpty(settings.HelpText)) 1385 { 1386 <small class="form__help-text">@settings.HelpText</small> 1387 } 1388 1389 @foreach (var item in settings.Options) 1390 { 1391 if (settings.Required) 1392 { 1393 item.Required = true; 1394 } 1395 if (settings.Disabled) 1396 { 1397 item.Disabled = true; 1398 } 1399 if (!string.IsNullOrEmpty(settings.Name)) 1400 { 1401 item.Name = settings.Name; 1402 } 1403 if (!string.IsNullOrEmpty(settings.CssClass)) 1404 { 1405 item.CssClass += settings.CssClass; 1406 } 1407 1408 /* value is not supported */ 1409 1410 if (!string.IsNullOrEmpty(settings.OnClick)) 1411 { 1412 item.OnClick += settings.OnClick; 1413 } 1414 if (!string.IsNullOrEmpty(settings.OnChange)) 1415 { 1416 item.OnChange += settings.OnChange; 1417 } 1418 @Render(item) 1419 } 1420 1421 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1422 </div> 1423 1424 </div> 1425 } 1426 @using Dynamicweb.Rapido.Blocks.Components.General 1427 1428 @* Component *@ 1429 1430 @helper RenderSearch(Search settings) 1431 { 1432 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1433 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1434 1435 if (string.IsNullOrEmpty(settings.Id)) 1436 { 1437 settings.Id = Guid.NewGuid().ToString("N"); 1438 } 1439 1440 var resultAttributes = new Dictionary<string, string>(); 1441 1442 if (settings.PageSize != 0) 1443 { 1444 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1445 } 1446 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1447 { 1448 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1449 if (!string.IsNullOrEmpty(groupValue)) 1450 { 1451 resultAttributes.Add("data-selected-group", groupValue); 1452 } 1453 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1454 { 1455 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1456 } 1457 } 1458 resultAttributes.Add("data-force-init", "true"); 1459 if (settings.GoToFirstSearchResultOnEnter) 1460 { 1461 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1462 } 1463 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1464 { 1465 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1466 } 1467 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1468 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1469 1470 if (settings.SecondSearchData != null) 1471 { 1472 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1473 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1474 } 1475 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1476 { 1477 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1478 } 1479 1480 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1481 1482 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1483 1484 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1485 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1486 { 1487 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1488 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1489 } 1490 1491 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1492 1493 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1494 @if (settings.SecondSearchData != null) 1495 { 1496 <div class="search__column search__column--products dw-mod"> 1497 <div class="search__column-header dw-mod">@Translate("Products")</div> 1498 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1499 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1500 { 1501 @Render(new Link { 1502 Title = Translate("View all"), 1503 CssClass = "js-view-all-button u-margin", 1504 Href = settings.SearchData.ResultsPageUrl 1505 }); 1506 } 1507 </div> 1508 <div class="search__column search__column--pages dw-mod"> 1509 <div class="search__column-header">@Translate("Pages")</div> 1510 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1511 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1512 { 1513 @Render(new Link 1514 { 1515 Title = Translate("View all"), 1516 CssClass = "js-view-all-button u-margin", 1517 Href = settings.SecondSearchData.ResultsPageUrl 1518 }); 1519 } 1520 </div> 1521 } 1522 else 1523 { 1524 <div class="search__column search__column--only dw-mod"> 1525 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1526 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1527 { 1528 @Render(new Link { 1529 Title = Translate("View all"), 1530 CssClass = "js-view-all-button u-margin", 1531 Href = settings.SearchData.ResultsPageUrl 1532 }); 1533 } 1534 </div> 1535 } 1536 </div> 1537 1538 @if (settings.SearchButton != null) 1539 { 1540 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1541 if (settings.RenderDefaultSearchIcon) 1542 { 1543 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1544 } 1545 @Render(settings.SearchButton); 1546 } 1547 </div> 1548 } 1549 @using System.Reflection 1550 @using Dynamicweb.Rapido.Blocks.Components.General 1551 @using Dynamicweb.Rapido.Blocks.Components 1552 1553 1554 @* Component *@ 1555 1556 @helper RenderSelectField(SelectField settings) 1557 { 1558 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1559 { 1560 settings.Id = Guid.NewGuid().ToString("N"); 1561 } 1562 1563 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1564 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1565 { 1566 <div class="u-full-width"> 1567 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1568 @if (settings.Link != null) { 1569 <div class="u-pull--right"> 1570 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1571 @Render(settings.Link) 1572 </div> 1573 } 1574 </div> 1575 } 1576 1577 @if (!string.IsNullOrEmpty(settings.HelpText)) 1578 { 1579 <small class="form__help-text">@settings.HelpText</small> 1580 } 1581 1582 @if (settings.ActionButton != null) 1583 { 1584 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1585 <div class="form__field-combi u-no-margin dw-mod"> 1586 @RenderSelectBase(settings) 1587 @Render(settings.ActionButton) 1588 </div> 1589 } 1590 else 1591 { 1592 @RenderSelectBase(settings) 1593 } 1594 1595 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1596 </div> 1597 } 1598 1599 @helper RenderSelectBase(SelectField settings) 1600 { 1601 var attributes = new Dictionary<string, string>(); 1602 1603 /*base settings*/ 1604 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1605 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1606 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1607 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1608 if (settings.Required) { attributes.Add("required", "true"); } 1609 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1610 /*end*/ 1611 1612 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1613 1614 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1615 @if (settings.Default != null) 1616 { 1617 @Render(settings.Default) 1618 } 1619 1620 @foreach (var item in settings.Options) 1621 { 1622 if (settings.Value != null) { 1623 item.Checked = item.Value == settings.Value; 1624 } 1625 @Render(item) 1626 } 1627 </select> 1628 } 1629 @using System.Reflection 1630 @using Dynamicweb.Rapido.Blocks.Components.General 1631 @using Dynamicweb.Rapido.Blocks.Components 1632 1633 @* Component *@ 1634 1635 @helper RenderRadioButtonField(RadioButtonField settings) 1636 { 1637 var attributes = new Dictionary<string, string>(); 1638 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1639 { 1640 settings.Id = Guid.NewGuid().ToString("N"); 1641 } 1642 1643 /*base settings*/ 1644 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1645 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1646 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1647 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1648 if (settings.Required) { attributes.Add("required", "true"); } 1649 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1650 /*end*/ 1651 1652 attributes.Add("type", "radio"); 1653 if (settings.Checked) { attributes.Add("checked", "true"); } 1654 settings.CssClass = "form__control " + settings.CssClass; 1655 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1656 1657 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1658 1659 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1660 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1661 @if (!string.IsNullOrEmpty(settings.Label)) 1662 { 1663 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1664 } 1665 @if (!string.IsNullOrEmpty(settings.HelpText)) 1666 { 1667 <small class="form__help-text">@settings.HelpText</small> 1668 } 1669 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1670 </div> 1671 } 1672 @using System.Reflection 1673 @using Dynamicweb.Rapido.Blocks.Components.General 1674 @using Dynamicweb.Rapido.Blocks.Components 1675 1676 1677 @* Component *@ 1678 1679 @helper RenderRadioButtonListField(RadioButtonListField settings) 1680 { 1681 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1682 1683 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1684 @if (!string.IsNullOrEmpty(settings.Label)) 1685 { 1686 <label>@settings.Label</label> 1687 } 1688 @if (!string.IsNullOrEmpty(settings.HelpText)) 1689 { 1690 <small class="form__help-text">@settings.HelpText</small> 1691 } 1692 1693 @foreach (var item in settings.Options) 1694 { 1695 if (settings.Required) 1696 { 1697 item.Required = true; 1698 } 1699 if (settings.Disabled) 1700 { 1701 item.Disabled = true; 1702 } 1703 if (!string.IsNullOrEmpty(settings.Name)) 1704 { 1705 item.Name = settings.Name; 1706 } 1707 if (settings.Value != null && settings.Value == item.Value) 1708 { 1709 item.Checked = true; 1710 } 1711 if (!string.IsNullOrEmpty(settings.OnClick)) 1712 { 1713 item.OnClick += settings.OnClick; 1714 } 1715 if (!string.IsNullOrEmpty(settings.OnChange)) 1716 { 1717 item.OnChange += settings.OnChange; 1718 } 1719 if (!string.IsNullOrEmpty(settings.CssClass)) 1720 { 1721 item.CssClass += settings.CssClass; 1722 } 1723 @Render(item) 1724 } 1725 1726 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1727 </div> 1728 } 1729 @using System.Reflection 1730 @using Dynamicweb.Rapido.Blocks.Components.General 1731 @using Dynamicweb.Rapido.Blocks.Components 1732 1733 1734 @* Component *@ 1735 1736 @helper RenderNotificationMessage(NotificationMessage settings) 1737 { 1738 if (!string.IsNullOrEmpty(settings.Message)) 1739 { 1740 var attributes = new Dictionary<string, string>(); 1741 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1742 1743 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1744 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower(); 1745 string minHeightClass = settings.Icon != null ? "u-min-h70px" : ""; 1746 1747 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)> 1748 @if (settings.Icon != null) { 1749 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message; 1750 @Render(settings.Icon) 1751 } else { 1752 @settings.Message 1753 } 1754 </div> 1755 } 1756 } 1757 @using Dynamicweb.Rapido.Blocks.Components.General 1758 1759 1760 @* Component *@ 1761 1762 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1763 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1764 1765 <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> 1766 @if (settings.SubBlocks != null) { 1767 @RenderBlockList(settings.SubBlocks) 1768 } 1769 </div> 1770 } 1771 @using System.Reflection 1772 @using Dynamicweb.Rapido.Blocks.Components.General 1773 @using Dynamicweb.Rapido.Blocks.Components 1774 @using System.Text.RegularExpressions 1775 1776 1777 @* Component *@ 1778 1779 @helper RenderSticker(Sticker settings) { 1780 if (!String.IsNullOrEmpty(settings.Title)) { 1781 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1782 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1783 1784 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1785 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1786 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1787 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1788 optionalAttributes.Add("style", styleTag); 1789 } 1790 1791 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1792 } 1793 } 1794 1795 @using System.Reflection 1796 @using Dynamicweb.Rapido.Blocks.Components.General 1797 @using Dynamicweb.Rapido.Blocks.Components 1798 1799 1800 @* Component *@ 1801 1802 @helper RenderStickersCollection(StickersCollection settings) 1803 { 1804 if (settings.Stickers.Count > 0) 1805 { 1806 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1807 1808 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1809 @foreach (Sticker sticker in settings.Stickers) 1810 { 1811 @Render(sticker) 1812 } 1813 </div> 1814 } 1815 } 1816 1817 @using Dynamicweb.Rapido.Blocks.Components.General 1818 1819 1820 @* Component *@ 1821 1822 @helper RenderForm(Form settings) { 1823 if (settings != null) 1824 { 1825 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1826 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1827 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1828 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1829 var enctypes = new Dictionary<string, string> 1830 { 1831 { "multipart", "multipart/form-data" }, 1832 { "text", "text/plain" }, 1833 { "application", "application/x-www-form-urlencoded" } 1834 }; 1835 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1836 optionalAttributes.Add("method", settings.Method.ToString()); 1837 1838 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1839 { 1840 @settings.FormStartMarkup 1841 } 1842 else 1843 { 1844 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1845 } 1846 1847 foreach (var field in settings.GetFields()) 1848 { 1849 @Render(field) 1850 } 1851 1852 @:</form> 1853 } 1854 } 1855 @using System.Reflection 1856 @using Dynamicweb.Rapido.Blocks.Components.General 1857 @using Dynamicweb.Rapido.Blocks.Components 1858 1859 1860 @* Component *@ 1861 1862 @helper RenderText(Text settings) 1863 { 1864 @settings.Content 1865 } 1866 @using System.Reflection 1867 @using Dynamicweb.Rapido.Blocks.Components.General 1868 @using Dynamicweb.Rapido.Blocks.Components 1869 1870 1871 @* Component *@ 1872 1873 @helper RenderContentModule(ContentModule settings) { 1874 if (!string.IsNullOrEmpty(settings.Content)) 1875 { 1876 @settings.Content 1877 } 1878 } 1879 @using System.Reflection 1880 @using Dynamicweb.Rapido.Blocks.Components.General 1881 @using Dynamicweb.Rapido.Blocks.Components 1882 1883 1884 @* Component *@ 1885 1886 @helper RenderModal(Modal settings) { 1887 if (settings != null) 1888 { 1889 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1890 1891 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1892 1893 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1894 1895 <div class="modal-container"> 1896 @if (!settings.DisableDarkOverlay) 1897 { 1898 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1899 } 1900 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1901 @if (settings.Heading != null) 1902 { 1903 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1904 { 1905 <div class="modal__header"> 1906 @Render(settings.Heading) 1907 </div> 1908 } 1909 } 1910 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1911 @if (!string.IsNullOrEmpty(settings.BodyText)) 1912 { 1913 @settings.BodyText 1914 } 1915 @if (settings.BodyTemplate != null) 1916 { 1917 @settings.BodyTemplate 1918 } 1919 @{ 1920 var actions = settings.GetActions(); 1921 } 1922 </div> 1923 @if (actions.Length > 0) 1924 { 1925 <div class="modal__footer"> 1926 @foreach (var action in actions) 1927 { 1928 if (Pageview.Device.ToString() != "Mobile") { 1929 action.CssClass += " u-no-margin"; 1930 } else { 1931 action.CssClass += " u-full-width u-margin-bottom"; 1932 } 1933 1934 @Render(action) 1935 } 1936 </div> 1937 } 1938 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 1939 </div> 1940 </div> 1941 } 1942 } 1943 @using Dynamicweb.Rapido.Blocks.Components.General 1944 1945 @* Component *@ 1946 1947 @helper RenderMediaListItem(MediaListItem settings) 1948 { 1949 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1950 @if (!string.IsNullOrEmpty(settings.Label)) 1951 { 1952 if (!string.IsNullOrEmpty(settings.Link)) 1953 { 1954 @Render(new Link 1955 { 1956 Href = settings.Link, 1957 CssClass = "media-list-item__sticker dw-mod", 1958 ButtonLayout = ButtonLayout.None, 1959 Title = settings.Label, 1960 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1961 }) 1962 } 1963 else if (!string.IsNullOrEmpty(settings.OnClick)) 1964 { 1965 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1966 <span class="u-uppercase">@settings.Label</span> 1967 </span> 1968 } 1969 else 1970 { 1971 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1972 <span class="u-uppercase">@settings.Label</span> 1973 </span> 1974 } 1975 } 1976 <div class="media-list-item__wrap"> 1977 <div class="media-list-item__info dw-mod"> 1978 <div class="media-list-item__header dw-mod"> 1979 @if (!string.IsNullOrEmpty(settings.Title)) 1980 { 1981 if (!string.IsNullOrEmpty(settings.Link)) 1982 { 1983 @Render(new Link 1984 { 1985 Href = settings.Link, 1986 CssClass = "media-list-item__name dw-mod", 1987 ButtonLayout = ButtonLayout.None, 1988 Title = settings.Title, 1989 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1990 }) 1991 } 1992 else if (!string.IsNullOrEmpty(settings.OnClick)) 1993 { 1994 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1995 } 1996 else 1997 { 1998 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1999 } 2000 } 2001 2002 @if (!string.IsNullOrEmpty(settings.Status)) 2003 { 2004 <div class="media-list-item__state dw-mod">@settings.Status</div> 2005 } 2006 </div> 2007 @{ 2008 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 2009 } 2010 2011 @Render(settings.InfoTable) 2012 </div> 2013 <div class="media-list-item__actions dw-mod"> 2014 <div class="media-list-item__actions-list dw-mod"> 2015 @{ 2016 var actions = settings.GetActions(); 2017 2018 foreach (ButtonBase action in actions) 2019 { 2020 action.ButtonLayout = ButtonLayout.None; 2021 action.CssClass += " media-list-item__action link"; 2022 2023 @Render(action) 2024 } 2025 } 2026 </div> 2027 2028 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 2029 { 2030 settings.SelectButton.CssClass += " u-no-margin"; 2031 2032 <div class="media-list-item__action-button"> 2033 @Render(settings.SelectButton) 2034 </div> 2035 } 2036 </div> 2037 </div> 2038 </div> 2039 } 2040 @using Dynamicweb.Rapido.Blocks.Components.General 2041 @using Dynamicweb.Rapido.Blocks.Components 2042 2043 @helper RenderTable(Table settings) 2044 { 2045 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2046 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2047 2048 var enumToClasses = new Dictionary<TableDesign, string> 2049 { 2050 { TableDesign.Clean, "table--clean" }, 2051 { TableDesign.Bordered, "table--bordered" }, 2052 { TableDesign.Striped, "table--striped" }, 2053 { TableDesign.Hover, "table--hover" }, 2054 { TableDesign.Compact, "table--compact" }, 2055 { TableDesign.Condensed, "table--condensed" }, 2056 { TableDesign.NoTopBorder, "table--no-top-border" } 2057 }; 2058 string tableDesignClass = ""; 2059 if (settings.Design != TableDesign.None) 2060 { 2061 tableDesignClass = enumToClasses[settings.Design]; 2062 } 2063 2064 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 2065 2066 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2067 2068 <table @ComponentMethods.AddAttributes(resultAttributes)> 2069 @if (settings.Header != null) 2070 { 2071 <thead> 2072 @Render(settings.Header) 2073 </thead> 2074 } 2075 <tbody> 2076 @foreach (var row in settings.Rows) 2077 { 2078 @Render(row) 2079 } 2080 </tbody> 2081 @if (settings.Footer != null) 2082 { 2083 <tfoot> 2084 @Render(settings.Footer) 2085 </tfoot> 2086 } 2087 </table> 2088 } 2089 @using Dynamicweb.Rapido.Blocks.Components.General 2090 @using Dynamicweb.Rapido.Blocks.Components 2091 2092 @helper RenderTableRow(TableRow settings) 2093 { 2094 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2095 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2096 2097 var enumToClasses = new Dictionary<TableRowDesign, string> 2098 { 2099 { TableRowDesign.NoBorder, "table__row--no-border" }, 2100 { TableRowDesign.Border, "table__row--border" }, 2101 { TableRowDesign.TopBorder, "table__row--top-line" }, 2102 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2103 { TableRowDesign.Solid, "table__row--solid" } 2104 }; 2105 2106 string tableRowDesignClass = ""; 2107 if (settings.Design != TableRowDesign.None) 2108 { 2109 tableRowDesignClass = enumToClasses[settings.Design]; 2110 } 2111 2112 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2113 2114 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2115 2116 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2117 @foreach (var cell in settings.Cells) 2118 { 2119 if (settings.IsHeaderRow) 2120 { 2121 cell.IsHeader = true; 2122 } 2123 @Render(cell) 2124 } 2125 </tr> 2126 } 2127 @using Dynamicweb.Rapido.Blocks.Components.General 2128 @using Dynamicweb.Rapido.Blocks.Components 2129 @using Dynamicweb.Core 2130 2131 @helper RenderTableCell(TableCell settings) 2132 { 2133 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2134 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2135 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2136 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2137 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2138 2139 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2140 2141 string tagName = settings.IsHeader ? "th" : "td"; 2142 2143 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2144 @settings.Content 2145 @("</" + tagName + ">"); 2146 } 2147 @using System.Linq 2148 @using Dynamicweb.Rapido.Blocks.Components.General 2149 2150 @* Component *@ 2151 2152 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2153 { 2154 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2155 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2156 2157 if (settings.NumberOfPages > 1) 2158 { 2159 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2160 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2161 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2162 2163 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2164 @if (settings.ShowPagingInfo) 2165 { 2166 <div class="pager__info dw-mod"> 2167 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2168 </div> 2169 } 2170 <ul class="pager__list dw-mod"> 2171 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2172 { 2173 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2174 } 2175 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2176 { 2177 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2178 } 2179 @if (settings.GetPages().Any()) 2180 { 2181 foreach (var page in settings.GetPages()) 2182 { 2183 @Render(page) 2184 } 2185 } 2186 else 2187 { 2188 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2189 { 2190 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2191 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2192 } 2193 } 2194 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2195 { 2196 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2197 } 2198 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2199 { 2200 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2201 } 2202 </ul> 2203 </div> 2204 } 2205 } 2206 2207 @helper RenderPaginationItem(PaginationItem settings) 2208 { 2209 if (settings.Icon == null) 2210 { 2211 settings.Icon = new Icon(); 2212 } 2213 2214 settings.Icon.Label = settings.Label; 2215 <li class="pager__btn dw-mod"> 2216 @if (settings.IsActive) 2217 { 2218 <span class="pager__num pager__num--current dw-mod"> 2219 @Render(settings.Icon) 2220 </span> 2221 } 2222 else 2223 { 2224 <a href="@settings.Link" class="pager__num dw-mod"> 2225 @Render(settings.Icon) 2226 </a> 2227 } 2228 </li> 2229 } 2230 2231 2232 @using Dynamicweb.Rapido.Blocks.Components.General 2233 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2234 2235 2236 @using Dynamicweb.Frontend 2237 @using System.Reflection 2238 @using Dynamicweb.Content.Items 2239 @using System.Web.UI.HtmlControls 2240 @using Dynamicweb.Rapido.Blocks.Components 2241 @using Dynamicweb.Rapido.Blocks 2242 @using Dynamicweb.Rapido.Blocks.Components.Articles 2243 2244 @* Components for the articles *@ 2245 @using System.Reflection 2246 @using Dynamicweb.Rapido.Blocks.Components.Articles 2247 2248 2249 @* Component for the articles *@ 2250 2251 @helper RenderArticleBanner(dynamic settings) { 2252 string filterClasses = "image-filter image-filter--darken"; 2253 settings.Layout = ArticleHeaderLayout.Banner; 2254 2255 if (settings.Image != null) 2256 { 2257 if (settings.Image.Path != null) 2258 { 2259 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2260 <div class="background-image @filterClasses dw-mod"> 2261 <div class="background-image__wrapper @filterClasses dw-mod"> 2262 @{ 2263 settings.Image.CssClass += "background-image__cover dw-mod"; 2264 } 2265 @Render(settings.Image) 2266 </div> 2267 </div> 2268 <div class="center-container dw-mod"> 2269 <div class="grid"> 2270 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg"> 2271 <div class="u-left-middle"> 2272 <div> 2273 @if (!String.IsNullOrEmpty(settings.Heading)) 2274 { 2275 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2276 } 2277 @if (!String.IsNullOrEmpty(settings.Subheading)) 2278 { 2279 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2280 } 2281 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2282 { 2283 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2284 } 2285 @if (!String.IsNullOrEmpty(settings.Link)) { 2286 <div class="grid__cell"> 2287 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2288 </div> 2289 } 2290 </div> 2291 </div> 2292 </div> 2293 @if (settings.ExternalParagraphId != 0) 2294 { 2295 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod"> 2296 <div class="u-color-light-gray--bg u-color-dark dw-mod"> 2297 @RenderParagraphContent(settings.ExternalParagraphId) 2298 </div> 2299 </div> 2300 } 2301 2302 </div> 2303 </div> 2304 </section> 2305 if (!String.IsNullOrEmpty(settings.Image.Caption)) { 2306 <div class="image-caption dw-mod">@settings.Image.Caption</div> 2307 } 2308 } 2309 else 2310 { 2311 settings.Layout = ArticleHeaderLayout.Clean; 2312 @RenderArticleCleanHeader(settings); 2313 } 2314 } 2315 else 2316 { 2317 settings.Layout = ArticleHeaderLayout.Clean; 2318 @RenderArticleCleanHeader(settings); 2319 } 2320 } 2321 @using System.Reflection 2322 @using Dynamicweb.Rapido.Blocks.Components 2323 @using Dynamicweb.Rapido.Blocks.Components.General 2324 @using Dynamicweb.Rapido.Blocks.Components.Articles 2325 @using Dynamicweb.Rapido.Blocks 2326 2327 2328 @* Component for the articles *@ 2329 2330 @helper RenderArticleHeader(ArticleHeader settings) { 2331 dynamic[] methodParameters = new dynamic[1]; 2332 methodParameters[0] = settings; 2333 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom"); 2334 2335 if (customMethod != null) 2336 { 2337 @customMethod.Invoke(this, methodParameters).ToString(); 2338 } else { 2339 switch (settings.Layout) 2340 { 2341 case ArticleHeaderLayout.Clean: 2342 @RenderArticleCleanHeader(settings); 2343 break; 2344 case ArticleHeaderLayout.Split: 2345 @RenderArticleSplitHeader(settings); 2346 break; 2347 case ArticleHeaderLayout.Banner: 2348 @RenderArticleBannerHeader(settings); 2349 break; 2350 case ArticleHeaderLayout.Overlay: 2351 @RenderArticleOverlayHeader(settings); 2352 break; 2353 default: 2354 @RenderArticleCleanHeader(settings); 2355 break; 2356 } 2357 } 2358 } 2359 2360 @helper RenderArticleCleanHeader(ArticleHeader settings) { 2361 dynamic[] methodParameters = new dynamic[1]; 2362 methodParameters[0] = settings; 2363 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom"); 2364 2365 if (customMethod != null) 2366 { 2367 @customMethod.Invoke(this, methodParameters).ToString(); 2368 } 2369 else 2370 { 2371 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2372 2373 <div class="grid grid--align-content-start grid--justify-start"> 2374 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod"> 2375 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0) 2376 { 2377 <div class="u-border-bottom u-padding-bottom"> 2378 @if (!String.IsNullOrEmpty(settings.Category)) 2379 { 2380 <div class="u-pull--left"> 2381 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2382 </div> 2383 } 2384 <div class="u-pull--right"> 2385 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2386 { 2387 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small> 2388 } 2389 @if (settings.RatingOutOf != 0) 2390 { 2391 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2392 } 2393 </div> 2394 </div> 2395 } 2396 2397 <div class="grid__cell"> 2398 @if (!String.IsNullOrEmpty(settings.Heading)) 2399 { 2400 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2401 } 2402 @if (settings.Image != null) 2403 { 2404 if (settings.Image.Path != null) 2405 { 2406 <div class="u-padding-bottom--lg"> 2407 @Render(settings.Image) 2408 </div> 2409 } 2410 } 2411 @if (!String.IsNullOrEmpty(settings.Subheading)) 2412 { 2413 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2414 } 2415 @if (!String.IsNullOrEmpty(settings.Link)) 2416 { 2417 <div class="grid__cell"> 2418 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2419 </div> 2420 } 2421 </div> 2422 </div> 2423 @if (settings.ExternalParagraphId != 0) 2424 { 2425 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod"> 2426 @RenderParagraphContent(settings.ExternalParagraphId) 2427 </div> 2428 } 2429 </div> 2430 } 2431 } 2432 2433 @helper RenderArticleSplitHeader(ArticleHeader settings) { 2434 dynamic[] methodParameters = new dynamic[1]; 2435 methodParameters[0] = settings; 2436 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom"); 2437 2438 if (customMethod != null) 2439 { 2440 @customMethod.Invoke(this, methodParameters).ToString(); 2441 } 2442 else 2443 { 2444 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6"; 2445 2446 if (settings.Image != null) 2447 { 2448 if (settings.Image.Path != null) 2449 { 2450 <section class="multiple-paragraphs-container paragraph-container--full-width"> 2451 <div class="grid"> 2452 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2453 <div class="u-left-middle u-padding--lg"> 2454 <div> 2455 @if (!String.IsNullOrEmpty(settings.Category)) 2456 { 2457 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2458 } 2459 @if (!String.IsNullOrEmpty(settings.Heading)) 2460 { 2461 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2462 } 2463 @if (!String.IsNullOrEmpty(settings.Subheading)) 2464 { 2465 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2466 } 2467 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2468 { 2469 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small> 2470 } 2471 @if (settings.RatingOutOf != 0) 2472 { 2473 <div class="u-pull--right"> 2474 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2475 </div> 2476 } 2477 @if (!String.IsNullOrEmpty(settings.Link)) { 2478 <div class="u-full-width u-pull--left u-margin-top"> 2479 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2480 </div> 2481 } 2482 </div> 2483 </div> 2484 </div> 2485 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&amp;height=1100&amp;crop=0&amp;Compression=85&amp;DoNotUpscale=true&amp;image=@settings.Image.Path); background-position: center center; background-size: cover;"></div> 2486 @if (settings.ExternalParagraphId != 0) 2487 { 2488 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto u-color-light-gray--bg dw-mod"> 2489 @RenderParagraphContent(settings.ExternalParagraphId) 2490 </div> 2491 } 2492 </div> 2493 </section> 2494 } 2495 } 2496 else 2497 { 2498 @RenderArticleCleanHeader(settings); 2499 } 2500 } 2501 } 2502 2503 @helper RenderArticleOverlayHeader(ArticleHeader settings) { 2504 dynamic[] methodParameters = new dynamic[1]; 2505 methodParameters[0] = settings; 2506 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom"); 2507 2508 if (customMethod != null) 2509 { 2510 @customMethod.Invoke(this, methodParameters).ToString(); 2511 } 2512 else 2513 { 2514 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2515 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : ""; 2516 2517 if (settings.Image != null) 2518 { 2519 if (settings.Image.Path != null) 2520 { 2521 if (settings.ExternalParagraphId == 0) 2522 { 2523 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2524 <div class="background-image image-filter image-filter--darken dw-mod"> 2525 <div class="background-image__wrapper image-filter image-filter--darken dw-mod"> 2526 @{ 2527 settings.Image.CssClass += "background-image__cover dw-mod"; 2528 } 2529 @Render(settings.Image) 2530 </div> 2531 </div> 2532 <div class="center-container dw-mod"> 2533 <div class="grid @contentAlignment"> 2534 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2535 @if (!string.IsNullOrEmpty(settings.Heading)) 2536 { 2537 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2538 } 2539 @if (!String.IsNullOrEmpty(settings.Subheading)) 2540 { 2541 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2542 } 2543 <div class="u-margin-top"> 2544 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2545 { 2546 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2547 } 2548 @if (settings.RatingOutOf != 0) 2549 { 2550 <div class="u-pull--right"> 2551 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2552 </div> 2553 } 2554 </div> 2555 @if (!String.IsNullOrEmpty(settings.Link)) 2556 { 2557 <div class="grid__cell"> 2558 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2559 </div> 2560 } 2561 </div> 2562 </div> 2563 </div> 2564 </section> 2565 } 2566 else 2567 { 2568 @RenderArticleBanner(settings); 2569 } 2570 } 2571 } 2572 else 2573 { 2574 @RenderArticleCleanHeader(settings); 2575 } 2576 } 2577 } 2578 2579 @helper RenderArticleBannerHeader(dynamic settings) { 2580 dynamic[] methodParameters = new dynamic[1]; 2581 methodParameters[0] = settings; 2582 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom"); 2583 2584 if (customMethod != null) 2585 { 2586 @customMethod.Invoke(this, methodParameters).ToString(); 2587 } 2588 else 2589 { 2590 @RenderArticleBanner(settings); 2591 } 2592 } 2593 @using System.Reflection 2594 @using System.Text.RegularExpressions; 2595 @using Dynamicweb.Frontend 2596 @using Dynamicweb.Content.Items 2597 @using Dynamicweb.Rapido.Blocks.Components 2598 @using Dynamicweb.Rapido.Blocks.Components.Articles 2599 @using Dynamicweb.Rapido.Blocks 2600 2601 @* Component for the articles *@ 2602 2603 @helper RenderArticleBodyRow(ArticleBodyRow settings) 2604 { 2605 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : ""; 2606 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : ""; 2607 2608 <div class="grid grid--align-content-start @contentAlignment @position dw-mod"> 2609 @RenderBlockList(settings.SubBlocks) 2610 </div> 2611 } 2612 @using System.Reflection 2613 @using Dynamicweb.Rapido.Blocks.Components 2614 @using Dynamicweb.Rapido.Blocks.Components.General 2615 @using Dynamicweb.Rapido.Blocks.Components.Articles 2616 @using Dynamicweb.Rapido.Blocks 2617 2618 @* Component for the articles *@ 2619 2620 @helper RenderArticleImage(ArticleImage settings) 2621 { 2622 if (settings.Image != null) 2623 { 2624 if (settings.Image.Path != null) 2625 { 2626 <div class="u-margin-bottom--lg"> 2627 @Render(settings.Image) 2628 </div> 2629 } 2630 } 2631 } 2632 @using System.Reflection 2633 @using Dynamicweb.Rapido.Blocks.Components 2634 @using Dynamicweb.Rapido.Blocks.Components.Articles 2635 2636 2637 @* Component for the articles *@ 2638 2639 @helper RenderArticleSubHeader(ArticleSubHeader settings) 2640 { 2641 if (!String.IsNullOrEmpty(settings.Title)) 2642 { 2643 <h2 class="article__header">@settings.Title</h2> 2644 } 2645 } 2646 @using System.Reflection 2647 @using Dynamicweb.Rapido.Blocks.Components 2648 @using Dynamicweb.Rapido.Blocks.Components.Articles 2649 @using Dynamicweb.Rapido.Blocks 2650 2651 2652 @* Component for the articles *@ 2653 2654 @helper RenderArticleText(ArticleText settings) 2655 { 2656 if (!String.IsNullOrEmpty(settings.Text)) 2657 { 2658 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : ""; 2659 2660 <div class="article__paragraph @greatTextClass dw-mod"> 2661 @settings.Text 2662 </div> 2663 } 2664 } 2665 @using System.Reflection 2666 @using Dynamicweb.Rapido.Blocks.Components 2667 @using Dynamicweb.Rapido.Blocks.Components.Articles 2668 @using Dynamicweb.Rapido.Blocks 2669 2670 2671 @* Component for the articles *@ 2672 2673 @helper RenderArticleQuote(ArticleQuote settings) 2674 { 2675 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty); 2676 2677 <div class="grid u-padding-bottom--lg"> 2678 @if (settings.Image != null) 2679 { 2680 if (settings.Image.Path != null) { 2681 <div class="grid__col-3"> 2682 <div class="grid__cell-img"> 2683 @{ 2684 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author; 2685 settings.Image.CssClass += " article__image article__image--ball"; 2686 settings.Image.ImageDefault.Width = 200; 2687 settings.Image.ImageDefault.Height = 200; 2688 } 2689 @Render(settings.Image) 2690 </div> 2691 </div> 2692 } 2693 } 2694 <div class="grid__col-auto"> 2695 @if (!String.IsNullOrEmpty(settings.Text)) 2696 { 2697 <div class="article__quote dw-mod"> 2698 <i class="fas fa-quote-right u-margin-bottom--lg"></i> 2699 @settings.Text 2700 <i class="fas fa-quote-right"></i> 2701 </div> 2702 } 2703 @if (!String.IsNullOrEmpty(settings.Author)) 2704 { 2705 <div class="article__quote-author dw-mod"> 2706 - @settings.Author 2707 </div> 2708 } 2709 </div> 2710 </div> 2711 } 2712 @using System.Reflection 2713 @using Dynamicweb.Rapido.Blocks.Components 2714 @using Dynamicweb.Rapido.Blocks.Components.Articles 2715 @using Dynamicweb.Rapido.Blocks 2716 2717 @* Component for the articles *@ 2718 2719 @helper RenderArticleInfoTable(ArticleInfoTable settings) 2720 { 2721 <table class="table table--clean"> 2722 @foreach (var row in settings.Rows) 2723 { 2724 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two"; 2725 2726 <tr> 2727 @if (!String.IsNullOrEmpty(row.Icon)) 2728 { 2729 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td> 2730 } 2731 <td class="u-no-margin-on-p-elements"> 2732 <div class="u-bold">@row.Title</div> 2733 @if (!String.IsNullOrEmpty(row.SubTitle)) 2734 { 2735 if (row.Link == null) 2736 { 2737 <div>@row.SubTitle</div> 2738 } 2739 else 2740 { 2741 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a> 2742 } 2743 } 2744 </td> 2745 </tr> 2746 } 2747 </table> 2748 } 2749 @using System.Reflection 2750 @using Dynamicweb.Rapido.Blocks.Components 2751 @using Dynamicweb.Rapido.Blocks.Components.General 2752 @using Dynamicweb.Rapido.Blocks.Components.Articles 2753 @using Dynamicweb.Rapido.Blocks 2754 2755 @* Component for the articles *@ 2756 2757 @helper RenderArticleGalleryModal(ArticleGalleryModal settings) 2758 { 2759 Modal galleryModal = new Modal 2760 { 2761 Id = "ParagraphGallery", 2762 Width = ModalWidth.Full, 2763 BodyTemplate = RenderArticleGalleryModalContent() 2764 }; 2765 2766 @Render(galleryModal) 2767 } 2768 2769 @helper RenderArticleGalleryModalContent() { 2770 <div class="modal__image-min-size-wrapper"> 2771 @Render(new Image { 2772 Id = "ParagraphGallery", 2773 Path = "#", 2774 CssClass = "modal--full__img", 2775 DisableLazyLoad = true, 2776 DisableImageEngine = true 2777 }) 2778 </div> 2779 2780 <div class="modal__images-counter" id="ParagraphGallery_counter"></div> 2781 2782 @Render(new Button { 2783 Id = "ParagraphGallery_prev", 2784 ButtonType = ButtonType.Button, 2785 ButtonLayout = ButtonLayout.None, 2786 CssClass = "modal__prev-btn", 2787 Icon = new Icon { Prefix = "far", Name = "fa-angle-left", LabelPosition = IconLabelPosition.After }, 2788 OnClick = "Gallery.prevImage('ParagraphGallery')" 2789 }) 2790 2791 @Render(new Button { 2792 Id = "ParagraphGallery_next", 2793 ButtonType = ButtonType.Button, 2794 ButtonLayout = ButtonLayout.None, 2795 CssClass = "modal__next-btn", 2796 Icon = new Icon { Prefix = "far", Name = "fa-angle-right", LabelPosition = IconLabelPosition.After }, 2797 OnClick = "Gallery.nextImage('ParagraphGallery')" 2798 }) 2799 } 2800 @using System.Reflection 2801 @using Dynamicweb.Rapido.Blocks.Components 2802 @using Dynamicweb.Rapido.Blocks.Components.Articles 2803 @using Dynamicweb.Rapido.Blocks 2804 2805 2806 @* Component for the articles *@ 2807 2808 @helper RenderArticleRelated(ArticleRelated settings) 2809 { 2810 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : ""; 2811 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : ""; 2812 2813 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width"> 2814 <div class="center-container dw-mod"> 2815 <div class="grid u-padding"> 2816 <div class="grid__col-md-12 grid__col-xs-12"> 2817 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2> 2818 </div> 2819 </div> 2820 2821 <div class="js-handlebars-root u-padding" id="@settings.Title.Replace(" ", String.Empty)" data-template="RelatedSimpleTemplate" data-json-feed="/Default.aspx?ID=@settings.FeedPageId&@settings.Query&ExcludeItemID=@settings.CurrentPageId&PageSize=@settings.PageSize"></div> 2822 2823 <script id="RelatedSimpleTemplate" type="text/x-template"> 2824 {{#.}} 2825 <div class="grid u-padding-bottom--lg"> 2826 {{#Cases}} 2827 <div class="grid__col-lg-3 grid__col-sm-6 image-hover--zoom dw-mod"> 2828 <a href="{{link}}" class="u-full-height u-color-light--bg u-flex u-flex--column"> 2829 {{#if image}} 2830 <div class="u-color-light--bg u-no-padding dw-mod"> 2831 <div class="flex-img image-hover__wrapper"> 2832 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=680&height=314&amp;crop=1&amp;DoNotUpscale=True&amp;Compression=75&amp;image={{image}}" alt="{{title}}" /> 2833 </div> 2834 </div> 2835 {{/if}} 2836 2837 <div class="card u-color-light--bg u-full-height dw-mod"> 2838 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3> 2839 <p class="article__short-summary dw-mod">{{summary}}</p> 2840 </div> 2841 </a> 2842 </div> 2843 {{/Cases}} 2844 </div> 2845 {{/.}} 2846 </script> 2847 </div> 2848 </section> 2849 } 2850 @using System.Reflection 2851 @using Dynamicweb.Rapido.Blocks.Components 2852 @using Dynamicweb.Rapido.Blocks.Components.Articles 2853 @using Dynamicweb.Rapido.Blocks 2854 2855 2856 @* Component for the articles *@ 2857 2858 @helper RenderArticleMenu(ArticleMenu settings) 2859 { 2860 if (!String.IsNullOrEmpty(settings.Title)) { 2861 <div class="u-margin u-border-bottom"> 2862 <h3 class="u-no-margin">@settings.Title</h3> 2863 </div> 2864 } 2865 2866 <ul class="menu-left u-margin-bottom dw-mod"> 2867 @foreach (var item in settings.Items) 2868 { 2869 @Render(item) 2870 } 2871 </ul> 2872 } 2873 2874 @helper RenderArticleMenuItem(ArticleMenuItem settings) 2875 { 2876 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#"; 2877 2878 if (!String.IsNullOrEmpty(settings.Title)) { 2879 <li class="menu-left__item dw-mod"> 2880 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a> 2881 </li> 2882 } 2883 } 2884 @using System.Reflection 2885 @using Dynamicweb.Rapido.Blocks.Components 2886 @using Dynamicweb.Rapido.Blocks.Components.Articles 2887 @using Dynamicweb.Rapido.Blocks 2888 2889 @* Component for the articles *@ 2890 2891 @helper RenderArticleList(ArticleList settings) 2892 { 2893 if (Pageview != null) 2894 { 2895 bool isParagraph = Pageview.CurrentParagraph != null ? true : false; 2896 string[] sortArticlesListBy = new string[2]; 2897 2898 if (isParagraph) { 2899 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2900 } 2901 else { 2902 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2903 } 2904 2905 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString(); 2906 2907 if (!settings.DisablePagination) { 2908 @RenderItemList(new 2909 { 2910 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2911 ListSourceType = settings.SourceType, 2912 ListSourcePage = sourcePage, 2913 ItemFieldsList = "*", 2914 Filter = settings.Filter, 2915 ListOrderBy = sortArticlesListBy[0], 2916 ListOrderByDirection = sortArticlesListBy[1], 2917 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2918 ListSecondOrderByDirection = "ASC", 2919 IncludeAllChildItems = true, 2920 ListTemplate = settings.Template, 2921 ListPageSize = settings.PageSize.ToString() 2922 }); 2923 } else { 2924 @RenderItemList(new 2925 { 2926 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2927 ListSourceType = settings.SourceType, 2928 ListSourcePage = sourcePage, 2929 ItemFieldsList = "*", 2930 Filter = settings.Filter, 2931 ListOrderBy = sortArticlesListBy[0], 2932 ListOrderByDirection = sortArticlesListBy[1], 2933 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2934 ListSecondOrderByDirection = "ASC", 2935 IncludeAllChildItems = true, 2936 ListTemplate = settings.Template, 2937 ListPageSize = settings.PageSize.ToString(), 2938 ListViewMode = "Partial", 2939 ListShowTo = settings.PageSize + 1 2940 }); 2941 } 2942 } 2943 } 2944 @using System.Reflection 2945 @using Dynamicweb.Rapido.Blocks.Components.Articles 2946 2947 2948 @* Component for the articles *@ 2949 2950 @helper RenderArticleSummary(ArticleSummary settings) 2951 { 2952 if (!String.IsNullOrEmpty(settings.Text)) 2953 { 2954 <div class="article__summary dw-mod">@settings.Text</div> 2955 } 2956 } 2957 @using System.Reflection 2958 @using Dynamicweb.Rapido.Blocks.Components 2959 @using Dynamicweb.Rapido.Blocks.Components.Articles 2960 @using Dynamicweb.Rapido.Blocks 2961 2962 @* Component for the articles *@ 2963 2964 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings) 2965 { 2966 string pageId = Pageview.ID.ToString(); 2967 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All"); 2968 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 2969 2970 foreach (var option in settings.Categories) 2971 { 2972 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter; 2973 } 2974 2975 if (selectedFilter == pageId) 2976 { 2977 selectedFilter = Translate("All"); 2978 } 2979 2980 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 2981 { 2982 <div class="u-pull--right u-margin-left"> 2983 <div class="collection u-no-margin"> 2984 <h5>@Translate("Category")</h5> 2985 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 2986 <div class="dropdown u-w180px dw-mod"> 2987 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 2988 <div class="dropdown__content dw-mod"> 2989 @foreach (var option in settings.Categories) 2990 { 2991 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 2992 } 2993 </div> 2994 <label class="dropdown-trigger-off" for="CategorySelector"></label> 2995 </div> 2996 </div> 2997 </div> 2998 } 2999 else 3000 { 3001 <div class="u-full-width u-margin-bottom"> 3002 <h5 class="u-no-margin">@Translate("Category")</h5> 3003 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 3004 <div class="dropdown u-full-width dw-mod"> 3005 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 3006 <div class="dropdown__content dw-mod"> 3007 @foreach (var option in settings.Categories) 3008 { 3009 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 3010 } 3011 </div> 3012 <label class="dropdown-trigger-off" for="CategorySelector"></label> 3013 </div> 3014 </div> 3015 } 3016 } 3017 @using System.Reflection 3018 @using Dynamicweb.Rapido.Blocks.Components 3019 @using Dynamicweb.Rapido.Blocks.Components.Articles 3020 @using Dynamicweb.Rapido.Blocks 3021 @using System.Collections.Generic 3022 3023 @* Component for the articles *@ 3024 3025 @helper RenderArticleListFilter(ArticleListFilter settings) 3026 { 3027 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All"); 3028 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 3029 3030 if (settings.Options != null) 3031 { 3032 if (settings.Options is IEnumerable<dynamic>) 3033 { 3034 var options = (IEnumerable<dynamic>) settings.Options; 3035 settings.Options = options.OrderBy(item => item.Name); 3036 } 3037 3038 foreach (var option in settings.Options) 3039 { 3040 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter; 3041 } 3042 3043 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 3044 { 3045 <div class="u-pull--right u-margin-left"> 3046 <div class="collection u-no-margin"> 3047 <h5>@settings.Label</h5> 3048 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 3049 <div class="dropdown u-w180px dw-mod"> 3050 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 3051 <div class="dropdown__content dw-mod"> 3052 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 3053 @foreach (var option in settings.Options) 3054 { 3055 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 3056 } 3057 </div> 3058 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 3059 </div> 3060 </div> 3061 </div> 3062 } 3063 else 3064 { 3065 <div class="u-full-width u-margin-bottom"> 3066 <h5 class="u-no-margin">@settings.Label</h5> 3067 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 3068 <div class="dropdown u-full-width w-mod"> 3069 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 3070 <div class="dropdown__content dw-mod"> 3071 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 3072 @foreach (var option in settings.Options) 3073 { 3074 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 3075 } 3076 </div> 3077 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 3078 </div> 3079 </div> 3080 } 3081 } 3082 } 3083 @using System.Reflection 3084 @using Dynamicweb.Rapido.Blocks.Components 3085 @using Dynamicweb.Rapido.Blocks.Components.Articles 3086 @using Dynamicweb.Rapido.Blocks 3087 3088 @* Component for the articles *@ 3089 3090 @helper RenderArticleListSearch(ArticleListSearch settings) 3091 { 3092 string searchParameter = !string.IsNullOrEmpty(settings.SearchParameter) ? settings.SearchParameter : "Title"; 3093 string searchWord = HttpContext.Current.Request.QueryString.Get(searchParameter); 3094 string searchString = !string.IsNullOrEmpty(searchWord) ? searchWord.Trim('*') : ""; 3095 string className = "u-w340px u-pull--right u-margin-left"; 3096 3097 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3098 { 3099 className = "u-full-width"; 3100 } 3101 3102 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className"> 3103 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('@searchParameter', '*' + document.getElementById('ArticleListSearchInput').value + '*')"> 3104 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button> 3105 </div> 3106 } 3107 @using System.Reflection 3108 @using Dynamicweb.Rapido.Blocks.Components 3109 @using Dynamicweb.Rapido.Blocks.Components.Articles 3110 @using Dynamicweb.Rapido.Blocks 3111 3112 @* Component for the articles *@ 3113 3114 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings) 3115 { 3116 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div> 3117 } 3118 @using System.Reflection 3119 @using Dynamicweb.Rapido.Blocks.Components 3120 @using Dynamicweb.Rapido.Blocks.Components.General 3121 @using Dynamicweb.Rapido.Blocks.Components.Articles 3122 @using Dynamicweb.Rapido.Blocks 3123 @using System.Text.RegularExpressions 3124 3125 @* Component for the articles *@ 3126 3127 @helper RenderArticleListItem(ArticleListItem settings) 3128 { 3129 switch (settings.Type) { 3130 case ArticleListItemType.Card: 3131 @RenderArticleListItemCard(settings); 3132 break; 3133 case ArticleListItemType.List: 3134 @RenderArticleListItemList(settings); 3135 break; 3136 case ArticleListItemType.Simple: 3137 @RenderArticleListItemSimple(settings); 3138 break; 3139 default: 3140 @RenderArticleListItemCard(settings); 3141 break; 3142 } 3143 } 3144 3145 @helper RenderArticleListItemCard(ArticleListItem settings) { 3146 <a href="@settings.Link" class="u-full-height u-color-light--bg u-flex u-flex--column"> 3147 <div class="u-color-light--bg u-no-padding dw-mod"> 3148 @if (settings.Logo != null) 3149 { 3150 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3151 settings.Logo.ImageDefault.Crop = 5; 3152 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3153 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3154 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3155 @if (settings.Stickers != null) 3156 { 3157 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None) 3158 { 3159 @Render(settings.Stickers); 3160 } 3161 } 3162 @RenderImage(settings.Logo) 3163 </div> 3164 } else if (settings.Image != null) 3165 { 3166 <div class="flex-img image-hover__wrapper u-position-relative dw-mod"> 3167 @if (settings.Stickers != null) 3168 { 3169 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None) 3170 { 3171 @Render(settings.Stickers); 3172 } 3173 } 3174 @Render(settings.Image) 3175 </div> 3176 } 3177 </div> 3178 3179 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3180 { 3181 <div class="card u-color-light--bg u-full-height dw-mod"> 3182 @if (settings.Stickers != null) 3183 { 3184 if (settings.Stickers.Position == StickersListPosition.Custom) 3185 { 3186 @Render(settings.Stickers); 3187 } 3188 } 3189 @if (!String.IsNullOrEmpty(settings.Title)) 3190 { 3191 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3192 } 3193 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3194 { 3195 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3196 } 3197 @if (!String.IsNullOrEmpty(settings.Summary)) 3198 { 3199 <p class="article__short-summary dw-mod">@settings.Summary</p> 3200 } 3201 </div> 3202 } 3203 </a> 3204 } 3205 3206 @helper RenderArticleListItemList(ArticleListItem settings) { 3207 <a href="@settings.Link"> 3208 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3209 <div class="grid__col-md-3"> 3210 <div class="u-color-light--bg u-no-padding dw-mod"> 3211 @if (settings.Logo != null) 3212 { 3213 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3214 settings.Logo.ImageDefault.Crop = 5; 3215 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3216 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3217 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3218 @if (settings.Stickers != null) 3219 { 3220 if (settings.Stickers.Position != StickersListPosition.Custom) 3221 { 3222 @Render(settings.Stickers); 3223 } 3224 } 3225 @RenderImage(settings.Logo) 3226 </div> 3227 } else if (settings.Image != null) 3228 { 3229 <div class="flex-img image-hover__wrapper dw-mod"> 3230 @if (settings.Stickers != null) 3231 { 3232 if (settings.Stickers.Position != StickersListPosition.Custom) 3233 { 3234 @Render(settings.Stickers); 3235 } 3236 } 3237 @Render(settings.Image) 3238 </div> 3239 } 3240 </div> 3241 </div> 3242 3243 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3244 { 3245 <div class="grid__col-md-9"> 3246 @if (!String.IsNullOrEmpty(settings.Title)) 3247 { 3248 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3249 } 3250 @if (settings.Stickers != null) 3251 { 3252 if (settings.Stickers.Position == StickersListPosition.Custom) 3253 { 3254 @Render(settings.Stickers); 3255 } 3256 } 3257 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3258 { 3259 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3260 } 3261 @if (!String.IsNullOrEmpty(settings.Summary)) 3262 { 3263 <p class="article__short-summary dw-mod">@settings.Summary</p> 3264 } 3265 </div> 3266 } 3267 </div> 3268 </a> 3269 } 3270 3271 @helper RenderArticleListItemSimple(ArticleListItem settings) { 3272 <a href="@settings.Link" class="u-color-inherit"> 3273 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3274 <div class="grid__col-md-12"> 3275 @if (!String.IsNullOrEmpty(settings.Title)) 3276 { 3277 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div> 3278 } 3279 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3280 { 3281 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3282 } 3283 </div> 3284 </div> 3285 </a> 3286 } 3287 @using System.Reflection 3288 @using Dynamicweb.Rapido.Blocks.Components.Articles 3289 3290 3291 @* Component for the articles *@ 3292 3293 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings) 3294 { 3295 <small class="article__subscription"> 3296 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3297 { 3298 <text>@Translate("Written")</text> 3299 } 3300 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3301 { 3302 <text>@Translate("by") @settings.Author</text> 3303 } 3304 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3305 { 3306 <text>@Translate("on") @settings.Date</text> 3307 } 3308 </small> 3309 } 3310 @using System.Reflection 3311 @using Dynamicweb.Rapido.Blocks.Components.Articles 3312 @using Dynamicweb.Rapido.Blocks.Components.General 3313 3314 3315 @* Component for the articles *@ 3316 3317 @helper RenderArticleLink(ArticleLink settings) 3318 { 3319 if (!string.IsNullOrEmpty(settings.Title)) 3320 { 3321 Button link = new Button { 3322 ConfirmText = settings.ConfirmText, 3323 ConfirmTitle = settings.ConfirmTitle, 3324 ButtonType = settings.ButtonType, 3325 Id = settings.Id, 3326 Title = settings.Title, 3327 AltText = settings.AltText, 3328 OnClick = settings.OnClick, 3329 CssClass = settings.CssClass, 3330 Disabled = settings.Disabled, 3331 Icon = settings.Icon, 3332 Name = settings.Name, 3333 Href = settings.Href, 3334 ButtonLayout = settings.ButtonLayout, 3335 ExtraAttributes = settings.ExtraAttributes 3336 }; 3337 <div class="grid__cell"> 3338 @Render(link) 3339 </div> 3340 } 3341 } 3342 @using System.Reflection 3343 @using Dynamicweb.Rapido.Blocks 3344 @using Dynamicweb.Rapido.Blocks.Components.Articles 3345 @using Dynamicweb.Rapido.Blocks.Components.General 3346 3347 3348 @* Component for the articles *@ 3349 3350 @helper RenderArticleCarousel(ArticleCarousel settings) 3351 { 3352 <div class="grid"> 3353 <div class="grid__col-12 u-no-padding u-margin-bottom"> 3354 <div class="carousel" id="carousel_@settings.Id"> 3355 <div class="carousel__container js-carousel-slides dw-mod"> 3356 @RenderBlockList(settings.SubBlocks) 3357 </div> 3358 </div> 3359 </div> 3360 </div> 3361 3362 <script> 3363 document.addEventListener("DOMContentLoaded", function () { 3364 new CarouselModule("#carousel_@settings.Id", { 3365 slideTime: 0, 3366 dots: true 3367 }); 3368 }); 3369 </script> 3370 } 3371 3372 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings) 3373 { 3374 string imageEngine = "/Admin/Public/GetImage.ashx?"; 3375 3376 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image; 3377 if (settings.ImageSettings != null) 3378 { 3379 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : ""; 3380 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : ""; 3381 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&"; 3382 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&"; 3383 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&"; 3384 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&"; 3385 } 3386 defaultImage += "&Image=" + settings.Image; 3387 3388 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')"> 3389 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title"> 3390 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2> 3391 <div class="article-list__item-info"> 3392 @if (settings.Stickers != null) 3393 { 3394 settings.Stickers.Position = StickersListPosition.Custom; 3395 @Render(settings.Stickers); 3396 } 3397 3398 <small class="u-margin-top--lg u-color-light"> 3399 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3400 { 3401 <text>@Translate("Written")</text> 3402 } 3403 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3404 { 3405 <text>@Translate("by") @settings.Author</text> 3406 } 3407 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3408 { 3409 <text>@Translate("on") @settings.Date</text> 3410 } 3411 </small> 3412 </div> 3413 3414 <h3 class="article__short-summary u-color-light">@settings.Summary</h3> 3415 </a> 3416 @if (settings.UseFilters == true) 3417 { 3418 <div class="background-image image-filter image-filter--darken dw-mod"></div> 3419 } 3420 </div> 3421 } 3422 @using System.Text.RegularExpressions 3423 @using Dynamicweb.Rapido.Blocks.Components 3424 @using Dynamicweb.Rapido.Blocks.Components.General 3425 @using Dynamicweb.Rapido.Blocks.Components.Articles 3426 @using Dynamicweb.Rapido.Blocks 3427 3428 @* Component for the articles *@ 3429 3430 @helper RenderArticleVideo(ArticleVideo settings) 3431 { 3432 if (settings.Url != null) 3433 { 3434 //getting video ID from youtube URL 3435 string videoCode = settings.Url; 3436 Regex regex = new Regex(@".be\/(.[^?]*)"); 3437 Match match = regex.Match(videoCode); 3438 string videoId = ""; 3439 if (match.Success) 3440 { 3441 videoId = match.Groups[1].Value; 3442 } 3443 else 3444 { 3445 regex = new Regex(@"v=([^&]+)"); 3446 match = regex.Match(videoCode); 3447 if (match.Success) 3448 { 3449 videoId = match.Groups[1].Value; 3450 } 3451 } 3452 3453 int autoPlay = settings.AutoPlay == "true" ? 1 : 0; 3454 3455 <div class="video-wrapper"> 3456 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div> 3457 </div> 3458 } 3459 } 3460 3461 3462 3463 @* Simple helpers *@ 3464 3465 @*Requires the Gallery ItemType that comes with Rapido*@ 3466 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) { 3467 if (gallery != null && gallery.Count > 0) 3468 { 3469 int count = 1; 3470 3471 foreach (var item in gallery) 3472 { 3473 if (item.GetFile("ImagePath") != null) 3474 { 3475 string image = item.GetFile("ImagePath").PathUrlEncoded; 3476 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&amp;height=820&amp;crop=5&amp;Compression=75&amp;DoNotUpscale=1&amp;image="; 3477 int imagesCount = gallery.Count; 3478 3479 if (count == 1) 3480 { 3481 <label class="gallery" for="ParagraphGalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))"> 3482 <span class="gallery__main-image"> 3483 <img src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=1&amp;image=@image" class="b-lazy flex-img js-gallery" alt="" data-for="ParagraphGallery" data-image="@imagePrefix@image" /> 3484 </span> 3485 <span class="gallery__image-counter"> 3486 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span> 3487 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span> 3488 </span> 3489 </label> 3490 } 3491 else 3492 { 3493 <div class="u-hidden js-gallery" data-for="ParagraphGallery" data-image="@imagePrefix@image"></div> 3494 } 3495 3496 count++; 3497 } 3498 } 3499 3500 @Render(new ArticleGalleryModal()) 3501 } 3502 } 3503 3504 @helper RenderMobileFilters(List<Block> subBlocks) 3505 { 3506 if (subBlocks.Count > 0) 3507 { 3508 <div class="grid__col-12"> 3509 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" /> 3510 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters"> 3511 @RenderBlockList(subBlocks) 3512 </div> 3513 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label> 3514 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label> 3515 </div> 3516 } 3517 } 3518 3519 3520 @* Include the Blocks for the page *@ 3521 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3522 3523 @using System 3524 @using System.Web 3525 @using System.Collections.Generic 3526 @using Dynamicweb.Rapido.Blocks.Extensibility 3527 @using Dynamicweb.Rapido.Blocks 3528 @using Dynamicweb 3529 @using Dynamicweb.Environment 3530 @using Dynamicweb.Frontend 3531 3532 @functions { 3533 string GoogleTagManagerID = ""; 3534 string GoogleAnalyticsID = ""; 3535 3536 string GetCookieOptInPermission(string category) 3537 { 3538 bool categoryOrAllGranted = false; 3539 3540 if (CookieManager.IsCookieManagementActive) 3541 { 3542 var cookieOptInLevel = CookieManager.GetCookieOptInLevel(); 3543 var cookieOptInCategories = CookieManager.GetCookieOptInCategories(); 3544 categoryOrAllGranted = cookieOptInCategories.Contains(category) || cookieOptInLevel == CookieOptInLevel.All; 3545 } 3546 3547 return categoryOrAllGranted ? "granted" : "denied"; 3548 } 3549 3550 bool AllowTracking() 3551 { 3552 bool allowTracking = true; 3553 if (CookieManager.IsCookieManagementActive) 3554 { 3555 var cookieOptInLevel = CookieManager.GetCookieOptInLevel(); 3556 var cookieOptInCategories = CookieManager.GetCookieOptInCategories(); 3557 3558 bool consentEither = (cookieOptInCategories.Contains("Statistical") || cookieOptInCategories.Contains("Marketing")); 3559 bool consentFunctional = cookieOptInLevel == CookieOptInLevel.Functional; 3560 bool consentAtLeastOne = cookieOptInLevel == CookieOptInLevel.All || (consentFunctional && consentEither); 3561 3562 allowTracking = consentAtLeastOne; 3563 } 3564 return allowTracking; 3565 } 3566 } 3567 3568 @{ 3569 GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"); 3570 GoogleAnalyticsID = Model.Area.Item.GetItem("Settings").GetString("GoogleAnalyticsTrackingID"); 3571 3572 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 3573 3574 if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID)) 3575 { 3576 Block tagManager = new Block() 3577 { 3578 Id = "GoogleAnalytics", 3579 SortId = 0, 3580 Template = RenderGoogleAnalyticsSnippet() 3581 }; 3582 topSnippetsBlocksPage.Add("Head", tagManager); 3583 } 3584 3585 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID)) 3586 { 3587 Block tagManager = new Block() 3588 { 3589 Id = "TagManager", 3590 SortId = 1, 3591 Template = RenderGoogleTagManager() 3592 }; 3593 topSnippetsBlocksPage.Add("Head", tagManager); 3594 3595 Block tagManagerBodySnippet = new Block() 3596 { 3597 Id = "TagManagerBodySnippet", 3598 SortId = 1, 3599 Template = RenderGoogleTagManagerBodySnippet() 3600 }; 3601 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet); 3602 } 3603 3604 Block facebookPixel = new Block() 3605 { 3606 Id = "FacebookPixel", 3607 SortId = 2, 3608 Template = RenderFacebookPixel() 3609 }; 3610 3611 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel); 3612 } 3613 3614 @helper RenderGoogleAnalyticsSnippet() 3615 { 3616 <script async src="https://www.googletagmanager.com/gtag/js?id=G-G56JYMT8MX"></script> 3617 <script> 3618 window.dataLayer = window.dataLayer || []; 3619 function gtag() { dataLayer.push(arguments); } 3620 gtag('js', new Date()); 3621 gtag('config', 'G-G56JYMT8MX'); 3622 </script> 3623 3624 <!-- Global site tag (gtag.js) - Google Analytics --> 3625 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script> 3626 <script> 3627 window.dataLayer = window.dataLayer || []; 3628 function gtag(){dataLayer.push(arguments);} 3629 gtag('js', new Date()); 3630 3631 gtag('config', '@GoogleAnalyticsID'); 3632 </script> 3633 <meta name="facebook-domain-verification" content="fk1psw0fjjr2gok356u3o3e3zw929j" /> 3634 } 3635 3636 @helper RenderGoogleTagManager() 3637 { 3638 bool allowTracking = AllowTracking(); 3639 3640 <script> 3641 window.dataLayer = window.dataLayer || []; 3642 function gtag() { dataLayer.push(arguments); } 3643 3644 gtag('consent', 'default', { 3645 'ad_storage': 'denied', 3646 'ad_user_data': 'denied', 3647 'ad_personalization': 'denied', 3648 'analytics_storage': 'denied' 3649 }); 3650 </script> 3651 3652 <script> 3653 (function (w, d, s, l, i) {w[l] = w[l] || []; w[l].push({'gtm.start': 3654 new Date().getTime(), event: 'gtm.js'}); var f = d.getElementsByTagName(s)[0], 3655 j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 3656 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); 3657 })(window, document, 'script', 'dataLayer', '@(GoogleTagManagerID)'); 3658 </script> 3659 3660 if (allowTracking) 3661 { 3662 string adConsent = GetCookieOptInPermission("Marketing"); 3663 string analyticsConsent = GetCookieOptInPermission("Statistical"); 3664 <script> 3665 gtag('consent', 'update', { 3666 'ad_storage': '@adConsent', 3667 'ad_user_data': '@adConsent', 3668 'ad_personalization': '@adConsent', 3669 'analytics_storage': '@analyticsConsent' 3670 }); 3671 </script> 3672 } 3673 } 3674 3675 @helper RenderGoogleTagManagerBodySnippet() 3676 { 3677 <!-- Google Tag Manager (noscript) --> 3678 <noscript> 3679 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID" 3680 height="0" width="0" style="display:none;visibility:hidden"></iframe> 3681 </noscript> 3682 <!-- End Google Tag Manager (noscript) --> 3683 } 3684 3685 @helper RenderFacebookPixel() 3686 { 3687 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 3688 3689 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 3690 { 3691 <!-- Facebook Pixel Code --> 3692 <script> 3693 !function(f,b,e,v,n,t,s) 3694 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 3695 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 3696 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 3697 n.queue=[];t=b.createElement(e);t.async=!0; 3698 t.src=v;s=b.getElementsByTagName(e)[0]; 3699 s.parentNode.insertBefore(t,s)}(window, document,'script', 3700 'https://connect.facebook.net/en_US/fbevents.js'); 3701 fbq('init', '@FacebookPixelID'); 3702 fbq('track', 'PageView'); 3703 fbq('track', 'ViewContent'); 3704 </script> 3705 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript> 3706 } 3707 } 3708 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3709 3710 @using System 3711 @using System.Web 3712 @using System.Collections.Generic 3713 @using Dynamicweb.Rapido.Blocks 3714 @using Dynamicweb.Rapido.Blocks.Extensibility 3715 @using Dynamicweb.Security.UserManagement 3716 @using Dynamicweb.Security.UserManagement.ExternalAuthentication 3717 @using Dynamicweb.Rapido.Blocks.Components.General 3718 3719 @{ 3720 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master"); 3721 3722 Block loginModal = new Block() 3723 { 3724 Id = "LoginModal", 3725 SortId = 10, 3726 Component = new Modal 3727 { 3728 Id = "SignIn", 3729 Heading = new Heading 3730 { 3731 Level = 0, 3732 Title = Translate("Sign in") 3733 }, 3734 Width = ModalWidth.Sm, 3735 BodyTemplate = RenderLoginForm() 3736 } 3737 }; 3738 3739 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal); 3740 } 3741 3742 @helper RenderLoginForm() 3743 { 3744 int pageId = Model.TopPage.ID; 3745 string userSignedInErrorText = ""; 3746 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 3747 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 3748 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 3749 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Model.LogOnFailed; 3750 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 3751 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 3752 3753 ProviderCollection providers = Provider.GetActiveProviders(); 3754 3755 if (Model.LogOnFailed) 3756 { 3757 switch (Model.LogOnFailedReason) 3758 { 3759 case LogOnFailedReason.PasswordLengthInvalid: 3760 userSignedInErrorText = Translate("Password length is invalid"); 3761 break; 3762 case LogOnFailedReason.IncorrectLogin: 3763 userSignedInErrorText = Translate("Invalid email or password"); 3764 break; 3765 case LogOnFailedReason.ExceededFailedLogOnLimit: 3766 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked"); 3767 break; 3768 case LogOnFailedReason.LoginLocked: 3769 userSignedInErrorText = Translate("The user account is temporarily locked"); 3770 break; 3771 case LogOnFailedReason.PasswordExpired: 3772 userSignedInErrorText = Translate("The password has expired and needs to be renewed"); 3773 break; 3774 default: 3775 userSignedInErrorText = Translate("An unknown error occured"); 3776 break; 3777 } 3778 } 3779 3780 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm" }; 3781 3782 // Add autocomplete to the password field 3783 TextField passwordField = new TextField { 3784 Id = "login-password", 3785 Type = TextFieldType.Password, 3786 Name = "password", 3787 Label = Translate("Password"), 3788 Required = true, 3789 ExtraAttributes = new Dictionary<string, string> 3790 { 3791 { "autocomplete", "current-password" } // Add autocomplete for password 3792 } 3793 }; 3794 3795 if (!hideForgotPasswordLink) { 3796 passwordField.Link = new Link { Title = Translate("Forgot password?"), Href = "/Default.aspx?id=" + signInProfilePageId + "&LoginAction=Recovery" }; 3797 } 3798 3799 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) }); 3800 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" }); 3801 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" }); 3802 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" }); 3803 3804 // Add autocomplete to the username field 3805 form.Add(new TextField { 3806 Id = "LoginUsername", 3807 Name = "username", 3808 Label = Translate("Email"), 3809 CssClass = "u-full-width", 3810 Required = true, 3811 ExtraAttributes = new Dictionary<string, string> 3812 { 3813 { "autocomplete", "email" } // Add autocomplete for email 3814 } 3815 }); 3816 3817 form.Add(passwordField); 3818 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error }); 3819 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") }); 3820 form.Add(new Button { ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event)" }); 3821 3822 foreach (Provider LoginProvider in providers) 3823 { 3824 var ProviderName = LoginProvider.Name.ToLower(); 3825 form.Add(new Link { 3826 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID, 3827 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After }, 3828 ButtonLayout = ButtonLayout.LinkClean, 3829 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName, 3830 AltText = ProviderName 3831 }); 3832 } 3833 3834 if (!hideCreateAccountLink) { 3835 form.Add(new Text { Content = "<div class=\"u-border-top u-full-width u-margin-bottom--lg\"></div>" }); 3836 form.Add(new Link 3837 { 3838 Href = "/Default.aspx?id=" + createAccountPageId, 3839 ButtonLayout = ButtonLayout.LinkClean, 3840 Title = Translate("Create account"), 3841 CssClass = "u-full-width u-ta-center" 3842 }); 3843 } 3844 3845 @Render(form) 3846 3847 if (showModalOnStart) 3848 { 3849 <script> 3850 document.getElementById("SignInModalTrigger").checked = true; 3851 </script> 3852 } 3853 } 3854 3855 3856 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3857 { 3858 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3859 3860 @using System 3861 @using System.Web 3862 @using System.Collections.Generic 3863 @using Dynamicweb.Rapido.Blocks.Extensibility 3864 @using Dynamicweb.Rapido.Blocks 3865 @using Dynamicweb.Rapido.Services 3866 3867 3868 @functions { 3869 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3870 } 3871 3872 @{ 3873 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 3874 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 3875 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed(); 3876 3877 Block mobileHeader = new Block() 3878 { 3879 Id = "MobileTop", 3880 SortId = 10, 3881 Template = RenderMobileTop(), 3882 SkipRenderBlocksList = true 3883 }; 3884 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader); 3885 3886 Block mobileHeaderNavigation = new Block() 3887 { 3888 Id = "MobileHeaderNavigation", 3889 SortId = 10, 3890 Template = RenderMobileHeaderNavigation(), 3891 SkipRenderBlocksList = true, 3892 BlocksList = new List<Block> { 3893 new Block { 3894 Id = "MobileHeaderNavigationTrigger", 3895 SortId = 10, 3896 Template = RenderMobileHeaderNavigationTrigger() 3897 } 3898 } 3899 }; 3900 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation); 3901 3902 Block mobileHeaderLogo = new Block() 3903 { 3904 Id = "MobileHeaderLogo", 3905 SortId = 20, 3906 Template = RenderMobileHeaderLogo(), 3907 SkipRenderBlocksList = true 3908 }; 3909 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo); 3910 3911 Block mobileHeaderActions = new Block() 3912 { 3913 Id = "MobileHeaderActions", 3914 SortId = 30, 3915 Template = RenderMobileTopActions(), 3916 SkipRenderBlocksList = true 3917 }; 3918 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions); 3919 3920 if (!mobileHideSearch) 3921 { 3922 Block mobileHeaderSearch = new Block 3923 { 3924 Id = "MobileHeaderSearch", 3925 SortId = 10, 3926 Template = RenderMobileTopSearch() 3927 }; 3928 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch); 3929 } 3930 3931 Block mobileHeaderMiniCart; 3932 3933 if (!mobileHideCart) 3934 { 3935 mobileHeaderMiniCart = new Block 3936 { 3937 Id = "MobileHeaderMiniCart", 3938 SortId = 20, 3939 Template = RenderMobileTopMiniCart() 3940 }; 3941 3942 Block miniCartCounterScriptTemplate = new Block 3943 { 3944 Id = "MiniCartCounterScriptTemplate", 3945 Template = RenderMobileMiniCartCounterContent() 3946 }; 3947 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 3948 } 3949 else 3950 { 3951 mobileHeaderMiniCart = new Block 3952 { 3953 Id = "MobileHeaderMiniCart", 3954 SortId = 20 3955 }; 3956 } 3957 3958 if (!mobileHideSearch) 3959 { 3960 Block mobileHeaderSearchBar = new Block() 3961 { 3962 Id = "MobileHeaderSearchBar", 3963 SortId = 40, 3964 Template = RenderMobileTopSearchBar() 3965 }; 3966 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderSearchBar); 3967 } 3968 3969 switch (mobileTopLayout) 3970 { 3971 case "nav-left": 3972 mobileHeaderNavigation.SortId = 10; 3973 mobileHeaderLogo.SortId = 20; 3974 mobileHeaderActions.SortId = 30; 3975 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3976 break; 3977 case "nav-right": 3978 mobileHeaderLogo.SortId = 10; 3979 mobileHeaderActions.SortId = 20; 3980 mobileHeaderNavigation.SortId = 30; 3981 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3982 break; 3983 case "nav-search-left": 3984 mobileHeaderNavigation.SortId = 10; 3985 mobileHeaderLogo.SortId = 20; 3986 mobileHeaderActions.SortId = 30; 3987 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3988 break; 3989 case "search-left": 3990 mobileHeaderActions.SortId = 10; 3991 mobileHeaderLogo.SortId = 20; 3992 mobileHeaderNavigation.SortId = 30; 3993 mobileHeaderMiniCart.SortId = 0; 3994 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3995 break; 3996 } 3997 } 3998 3999 4000 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4001 4002 @using System 4003 @using System.Web 4004 @using Dynamicweb.Rapido.Blocks.Extensibility 4005 @using Dynamicweb.Rapido.Blocks 4006 4007 @{ 4008 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 4009 4010 customMobileHeaderBlocksPage.RemoveBlockById("MobileHeaderSearch"); 4011 4012 Block searchCustom = new Block() 4013 { 4014 Id = "SearchCustom", 4015 SortId = 40, 4016 Template = RenderSearchCustom() 4017 }; 4018 customMobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, searchCustom); 4019 4020 Block mobileFreeShipping = new Block() 4021 { 4022 Id = "MobileFreeShipping", 4023 SortId = 35, 4024 Template = RenderMobileFreeShipping() 4025 }; 4026 customMobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileFreeShipping); 4027 } 4028 4029 @helper RenderSearchCustom() 4030 { 4031 string searchFeedId = ""; 4032 string searchSecondFeedId = ""; 4033 int groupsFeedId; 4034 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4035 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4036 string resultPageLink; 4037 string searchPlaceholder; 4038 string searchType = "product-search"; 4039 string searchTemplate; 4040 string searchContentTemplate = ""; 4041 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4042 bool showGroups = true; 4043 4044 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4045 { 4046 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4047 resultPageLink = contentSearchPageLink; 4048 searchPlaceholder = Translate("Search page"); 4049 groupsFeedId = 0; 4050 searchType = "content-search"; 4051 searchTemplate = "SearchPagesTemplate"; 4052 showGroups = false; 4053 } 4054 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4055 { 4056 searchFeedId = productsPageId + "&feed=true"; 4057 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4058 resultPageLink = Converter.ToString(productsPageId); 4059 searchPlaceholder = Translate("Search products or pages"); 4060 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4061 searchType = "combined-search"; 4062 searchTemplate = "SearchProductsTemplateWrap"; 4063 searchContentTemplate = "SearchPagesTemplateWrap"; 4064 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4065 } 4066 else 4067 { 4068 resultPageLink = Converter.ToString(productsPageId); 4069 searchFeedId = productsPageId + "&feed=true"; 4070 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4071 searchPlaceholder = Translate("Search products"); 4072 searchTemplate = "SearchProductsTemplate"; 4073 searchType = "product-search"; 4074 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4075 } 4076 4077 <div class="dw-mod"> 4078 <div class="center-container top-container__center-container dw-mod" style="padding: .2em;"> 4079 <div class="grid"> 4080 <div class="grid__col-auto"> 4081 <div class=" dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4082 <input type="text" class="js-typeahead-search-field u-no-margin" placeholder="@searchPlaceholder" value="@searchValue" style="width: 100%; border-radius: 11px;"> 4083 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4084 { 4085 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4086 } 4087 else 4088 { 4089 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4090 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4091 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4092 </div> 4093 } 4094 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn mobile-search-icon"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 4095 </div> 4096 </div> 4097 </div> 4098 </div> 4099 </div> 4100 } 4101 4102 @helper RenderMobileFreeShipping() 4103 4104 { 4105 Dynamicweb.Frontend.PriceViewModel total = Model.Cart.TotalPrice; 4106 double shippingLimit = 1000; 4107 double cartTotal = total != null ? total.PriceWithVat.Value : 0; 4108 double amountToFreeShipping = shippingLimit - cartTotal; 4109 <div style="display: flex;align-items: center;justify-content: center;background: #edf1f5;"><p style="margin: 0;">Ring oss på <a style="padding-left: 1rem; color:#EB212E;" href="tel:40601111">40 60 11 11</a></p></div> 4110 <li class="menu__item" style="background: #364A55; width: 100%;"> 4111 <div class="header-menu__link header-menu__link--icon dw-mod" style="display: grid; grid-template-columns: repeat(3, auto); grid-gap: 1rem; margin: 0 auto; align-items: center;"> 4112 <span style="color: white; font-weight: bolder; font-family: 'Archivo',sans-serif; width:100%">@Translate("Gratis frakt over 1000,-")</span> 4113 <span style="border-right: 2px solid red; height:20px;"></span> 4114 @if (cartTotal < 1000) 4115 { 4116 <span class="FreeshippingPrice" style="font-size: 0.9em; color: white; width:100%">@amountToFreeShipping kr igjen til gratis frakt</span> 4117 } 4118 else 4119 { 4120 <span class="FreeshippingPrice" style="font-size: 0.9em; color: white; width:100%">Du har gratis frakt!</span> 4121 } 4122 4123 </div> 4124 </li> 4125 4126 <script> 4127 //TODO: Husk å flytte til Custom.js// 4128 document.addEventListener('cartUpdated', function (event) { 4129 console.log('cartUpdated', event); 4130 var FreeshippingPrice = document.getElementsByClassName("FreeshippingPrice"); 4131 if (FreeshippingPrice){ 4132 const price = event?.detail?.data[0]?.totalPriceWithVat; 4133 const priceParsed = parseFloat(price.replace("kr", "").replace(/\s/g, "")); 4134 const shippingLimit = 1000; 4135 const amountToFreeShipping = shippingLimit - priceParsed; 4136 console.log(amountToFreeShipping); 4137 console.log(priceParsed); 4138 console.log(price); 4139 4140 if (priceParsed < 1000) { 4141 FreeshippingPrice[0].innerText = `${amountToFreeShipping} kr igjen til gratis frakt`; 4142 } else { 4143 FreeshippingPrice[0].innerText = "Du har gratis frakt!"; 4144 } 4145 }; 4146 4147 }); 4148 </script> 4149 } 4150 4151 4152 4153 4154 @helper RenderMobileTop() { 4155 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList(); 4156 4157 <nav class="main-navigation-mobile dw-mod"> 4158 <div class="center-container top-container__center-container dw-mod"> 4159 <div class="grid grid--align-center"> 4160 @RenderBlockList(subBlocks) 4161 </div> 4162 </div> 4163 </nav> 4164 } 4165 4166 @helper RenderMobileHeaderNavigation() { 4167 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList(); 4168 4169 <div class="grid__col-auto-width"> 4170 <ul class="menu dw-mod"> 4171 @RenderBlockList(subBlocks) 4172 </ul> 4173 </div> 4174 } 4175 4176 @helper RenderMobileHeaderNavigationTrigger() { 4177 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4178 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label> 4179 </li> 4180 } 4181 4182 @helper RenderMobileHeaderLogo() { 4183 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList(); 4184 4185 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4186 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : ""; 4187 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4188 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName"); 4189 4190 string mobileLogo = "/Files/Images/logo-dynamicweb.png"; 4191 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null) 4192 { 4193 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded; 4194 } 4195 4196 if (Path.GetExtension(mobileLogo).ToLower() != ".svg") 4197 { 4198 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&amp;width=100&amp;crop=5&amp;Compression=75&amp;image=" + mobileLogo; 4199 } 4200 else 4201 { 4202 mobileLogo = HttpUtility.UrlDecode(mobileLogo); 4203 } 4204 4205 <div class="grid__col-auto grid__col--bleed"> 4206 <div class="grid__cell @centeredLogo"> 4207 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod"> 4208 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" /> 4209 </a> 4210 </div> 4211 4212 @RenderBlockList(subBlocks) 4213 </div> 4214 } 4215 4216 @helper RenderMobileTopActions() { 4217 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList(); 4218 4219 <div class="grid__col-auto-width"> 4220 <ul class="menu dw-mod"> 4221 @RenderBlockList(subBlocks) 4222 </ul> 4223 </div> 4224 } 4225 4226 @helper RenderMobileTopSearch() { 4227 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4228 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4229 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 4230 </label> 4231 </li> 4232 } 4233 4234 @helper RenderMobileTopMiniCart() { 4235 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 4236 int cartPageId = GetPageIdByNavigationTag("CartPage"); 4237 double cartProductsCount = Model.Cart.TotalProductsCount; 4238 4239 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper"> 4240 <div class="mini-cart dw-mod"> 4241 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button"> 4242 <div class="u-inline u-position-relative"> 4243 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i> 4244 <div class="mini-cart__counter dw-mod"> 4245 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 4246 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount"> 4247 @cartProductsCount 4248 </div> 4249 </div> 4250 </div> 4251 </div> 4252 </a> 4253 </div> 4254 </li> 4255 } 4256 4257 @helper RenderMobileTopSearchBar() 4258 { 4259 string searchFeedId = ""; 4260 string searchSecondFeedId = ""; 4261 int groupsFeedId; 4262 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4263 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4264 string resultPageLink; 4265 string searchPlaceholder; 4266 string searchType = "product-search"; 4267 string searchTemplate; 4268 string searchContentTemplate = ""; 4269 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4270 bool showGroups = true; 4271 4272 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4273 { 4274 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4275 resultPageLink = contentSearchPageLink; 4276 searchPlaceholder = Translate("Search page"); 4277 groupsFeedId = 0; 4278 searchType = "content-search"; 4279 searchTemplate = "SearchPagesTemplate"; 4280 showGroups = false; 4281 } 4282 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4283 { 4284 searchFeedId = productsPageId + "&feed=true"; 4285 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4286 resultPageLink = Converter.ToString(productsPageId); 4287 searchPlaceholder = Translate("Search products or pages"); 4288 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4289 searchType = "combined-search"; 4290 searchTemplate = "SearchProductsTemplateWrap"; 4291 searchContentTemplate = "SearchPagesTemplateWrap"; 4292 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4293 } 4294 else 4295 { 4296 resultPageLink = Converter.ToString(productsPageId); 4297 searchFeedId = productsPageId + "&feed=true"; 4298 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4299 searchPlaceholder = Translate("Search products"); 4300 searchTemplate = "SearchProductsTemplate"; 4301 searchType = "product-search"; 4302 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4303 } 4304 4305 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" /> 4306 4307 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4308 <div class="center-container top-container__center-container dw-mod"> 4309 <div class="grid"> 4310 <div class="grid__col-auto"> 4311 <div class="typeahead-mobile__search-field dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4312 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4313 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4314 { 4315 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4316 } 4317 else 4318 { 4319 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4320 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4321 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4322 </div> 4323 } 4324 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 4325 </div> 4326 </div> 4327 <div class="grid__col-auto-width"> 4328 <ul class="menu dw-mod"> 4329 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4330 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4331 <i class="fas fa-times fa-1_5x"></i> 4332 </label> 4333 </li> 4334 </ul> 4335 </div> 4336 </div> 4337 </div> 4338 </div> 4339 } 4340 4341 @helper RenderMobileMiniCartCounterContent() 4342 { 4343 <script id="MiniCartCounterContent" type="text/x-template"> 4344 {{#.}} 4345 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 4346 {{numberofproducts}} 4347 </div> 4348 {{/.}} 4349 </script> 4350 }</text> 4351 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4352 4353 @using System 4354 @using System.Web 4355 @using System.Collections.Generic 4356 @using Dynamicweb.Rapido.Blocks.Extensibility 4357 @using Dynamicweb.Rapido.Blocks 4358 4359 @functions { 4360 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4361 } 4362 4363 @{ 4364 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4365 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4366 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4367 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4368 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4369 bool mobileHideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4370 4371 Block mobileNavigation = new Block() 4372 { 4373 Id = "MobileNavigation", 4374 SortId = 10, 4375 Template = MobileNavigation(), 4376 SkipRenderBlocksList = true 4377 }; 4378 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4379 4380 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4381 { 4382 Block mobileNavigationSignIn = new Block 4383 { 4384 Id = "MobileNavigationSignIn", 4385 SortId = 10, 4386 Template = RenderMobileNavigationSignIn() 4387 }; 4388 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4389 } 4390 4391 Block mobileNavigationMenu = new Block 4392 { 4393 Id = "MobileNavigationMenu", 4394 SortId = 20, 4395 Template = RenderMobileNavigationMenu() 4396 }; 4397 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4398 4399 Block mobileNavigationActions = new Block 4400 { 4401 Id = "MobileNavigationActions", 4402 SortId = 30, 4403 Template = RenderMobileNavigationActions(), 4404 SkipRenderBlocksList = true 4405 }; 4406 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4407 4408 if (!mobileNavigationItemsHideSignIn) 4409 { 4410 if (Model.CurrentUser.ID <= 0) 4411 { 4412 Block mobileNavigationSignInAction = new Block 4413 { 4414 Id = "MobileNavigationSignInAction", 4415 SortId = 10, 4416 Template = RenderMobileNavigationSignInAction() 4417 }; 4418 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4419 4420 if (!mobileHideCreateAccountLink) 4421 { 4422 Block mobileNavigationCreateAccountAction = new Block 4423 { 4424 Id = "MobileNavigationCreateAccountAction", 4425 SortId = 20, 4426 Template = RenderMobileNavigationCreateAccountAction() 4427 }; 4428 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4429 } 4430 } 4431 else 4432 { 4433 if (!mobileHideMyOrdersLink) 4434 { 4435 Block mobileNavigationOrdersAction = new Block 4436 { 4437 Id = "MobileNavigationOrdersAction", 4438 SortId = 20, 4439 Template = RenderMobileNavigationOrdersAction() 4440 }; 4441 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4442 } 4443 if (!mobileHideMyFavoritesLink) 4444 { 4445 Block mobileNavigationFavoritesAction = new Block 4446 { 4447 Id = "MobileNavigationFavoritesAction", 4448 SortId = 30, 4449 Template = RenderMobileNavigationFavoritesAction() 4450 }; 4451 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction); 4452 } 4453 if (!mobileHideMySavedCardsLink) 4454 { 4455 Block mobileNavigationSavedCardsAction = new Block 4456 { 4457 Id = "MobileNavigationFavoritesAction", 4458 SortId = 30, 4459 Template = RenderMobileNavigationSavedCardsAction() 4460 }; 4461 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4462 } 4463 4464 Block mobileNavigationSignOutAction = new Block 4465 { 4466 Id = "MobileNavigationSignOutAction", 4467 SortId = 40, 4468 Template = RenderMobileNavigationSignOutAction() 4469 }; 4470 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4471 } 4472 } 4473 4474 if (Model.Languages.Count > 1) 4475 { 4476 Block mobileNavigationLanguagesAction = new Block 4477 { 4478 Id = "MobileNavigationLanguagesAction", 4479 SortId = 50, 4480 Template = RenderMobileNavigationLanguagesAction() 4481 }; 4482 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4483 } 4484 } 4485 4486 4487 @helper MobileNavigation() 4488 { 4489 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4490 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4491 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4492 4493 <!-- Trigger for mobile navigation --> 4494 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4495 4496 <!-- Mobile navigation --> 4497 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4498 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper"> 4499 @RenderBlockList(subBlocks) 4500 </div> 4501 </nav> 4502 4503 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4504 } 4505 4506 @helper RenderMobileNavigationSignIn() 4507 { 4508 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4509 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4510 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4511 string myProfilePageLink = linkStart + myProfilePageId; 4512 string userName = Model.CurrentUser.FirstName; 4513 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4514 { 4515 userName += " " + Model.CurrentUser.LastName; 4516 } 4517 if (string.IsNullOrEmpty(userName)) 4518 { 4519 userName = Model.CurrentUser.Name; 4520 } 4521 if (string.IsNullOrEmpty(userName)) 4522 { 4523 userName = Model.CurrentUser.UserName; 4524 } 4525 if (string.IsNullOrEmpty(userName)) 4526 { 4527 userName = Model.CurrentUser.Email; 4528 } 4529 4530 <ul class="menu menu-mobile"> 4531 <li class="menu-mobile__item"> 4532 <a href="@myProfilePageLink" class="menu-mobile__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @userName</a> 4533 </li> 4534 </ul> 4535 } 4536 4537 @helper RenderMobileNavigationMenu() 4538 { 4539 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4540 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4541 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4542 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4543 int startLevel = 0; 4544 4545 @RenderNavigation(new 4546 { 4547 id = "mobilenavigation", 4548 cssclass = "menu menu-mobile dwnavigation", 4549 startLevel = @startLevel, 4550 ecomStartLevel = @startLevel + 1, 4551 endlevel = @levels, 4552 expandmode = "all", 4553 template = @menuTemplate 4554 }) 4555 4556 if (isSlidesDesign) 4557 { 4558 <script> 4559 function goToLevel(level) { 4560 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4561 } 4562 4563 document.addEventListener('DOMContentLoaded', function () { 4564 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4565 }); 4566 </script> 4567 } 4568 4569 @* MENNT *@ 4570 @*if (renderPagesInToolBar) 4571 { 4572 @RenderNavigation(new 4573 { 4574 id = "topToolsMobileNavigation", 4575 cssclass = "menu menu-mobile dwnavigation", 4576 template = "ToolsMenuForMobile.xslt" 4577 }) 4578 }*@ 4579 @* END MENNT *@ 4580 } 4581 4582 @helper RenderMobileNavigationActions() 4583 { 4584 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4585 4586 <ul class="menu menu-mobile"> 4587 @RenderBlockList(subBlocks) 4588 </ul> 4589 } 4590 4591 @helper RenderMobileNavigationSignInAction() 4592 { 4593 <li class="menu-mobile__item"> 4594 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label> 4595 </li> 4596 } 4597 4598 @helper RenderMobileNavigationCreateAccountAction() 4599 { 4600 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4601 4602 <li class="menu-mobile__item"> 4603 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a> 4604 </li> 4605 } 4606 4607 @helper RenderMobileNavigationProfileAction() 4608 { 4609 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4610 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4611 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4612 string myProfilePageLink = linkStart + myProfilePageId; 4613 4614 <li class="menu-mobile__item"> 4615 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("My Profile")</a> 4616 </li> 4617 } 4618 4619 @helper RenderMobileNavigationOrdersAction() 4620 { 4621 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4622 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4623 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4624 string myOrdersPageLink = linkStart + myOrdersPageId; 4625 string ordersIcon = "fas fa-list"; 4626 4627 <li class="menu-mobile__item"> 4628 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@ordersIcon menu-mobile__link-icon"></i> @Translate("My Orders")</a> 4629 </li> 4630 } 4631 4632 @helper RenderMobileNavigationFavoritesAction() 4633 { 4634 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4635 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4636 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4637 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4638 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 4639 4640 4641 <li class="menu-mobile__item"> 4642 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@favoritesIcon menu-mobile__link-icon"></i> @Translate("My Favorites")</a> 4643 </li> 4644 } 4645 4646 @helper RenderMobileNavigationSavedCardsAction() 4647 { 4648 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4649 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4650 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4651 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4652 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card"; 4653 4654 <li class="menu-mobile__item"> 4655 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a> 4656 </li> 4657 } 4658 4659 @helper RenderMobileNavigationSignOutAction() 4660 { 4661 int pageId = Model.TopPage.ID; 4662 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt"; 4663 4664 <li class="menu-mobile__item"> 4665 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a> 4666 </li> 4667 } 4668 4669 @helper RenderMobileNavigationLanguagesAction() 4670 { 4671 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4672 4673 string selectedLanguage = ""; 4674 foreach (var lang in Model.Languages) 4675 { 4676 if (lang.IsCurrent) 4677 { 4678 selectedLanguage = lang.Name; 4679 } 4680 } 4681 4682 <li class="menu-mobile__item dw-mod"> 4683 @if (isSlidesDesign) 4684 { 4685 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4686 } 4687 else 4688 { 4689 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4690 } 4691 <div class="menu-mobile__link__wrap"> 4692 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue menu-mobile__link-icon"></i> @selectedLanguage</label> 4693 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4694 </div> 4695 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4696 @if (isSlidesDesign) 4697 { 4698 <li class="menu-mobile__item dw-mod"> 4699 <div class="menu-mobile__link__wrap"> 4700 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4701 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4702 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4703 </div> 4704 </li> 4705 } 4706 @foreach (var lang in Model.Languages) 4707 { 4708 <li class="menu-mobile__item dw-mod"> 4709 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4710 </li> 4711 } 4712 </ul> 4713 </li> 4714 }</text> 4715 } 4716 else 4717 { 4718 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4719 4720 @using System 4721 @using System.Web 4722 @using System.Collections.Generic 4723 @using Dynamicweb.Rapido.Blocks.Extensibility 4724 @using Dynamicweb.Rapido.Blocks 4725 4726 @functions { 4727 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4728 } 4729 4730 @{ 4731 Block masterTools = new Block() 4732 { 4733 Id = "MasterDesktopTools", 4734 SortId = 10, 4735 Template = RenderDesktopTools(), 4736 SkipRenderBlocksList = true, 4737 BlocksList = new List<Block> 4738 { 4739 new Block { 4740 Id = "MasterDesktopToolsText", 4741 SortId = 10, 4742 Template = RenderDesktopToolsText(), 4743 Design = new Design 4744 { 4745 Size = "auto", 4746 HidePadding = true, 4747 RenderType = RenderType.Column 4748 } 4749 }, 4750 new Block { 4751 Id = "MasterDesktopToolsNavigation", 4752 SortId = 20, 4753 Template = RenderDesktopToolsNavigation(), 4754 Design = new Design 4755 { 4756 Size = "auto-width", 4757 HidePadding = true, 4758 RenderType = RenderType.Column 4759 } 4760 } 4761 } 4762 }; 4763 headerBlocksPage.Add("MasterHeader", masterTools); 4764 4765 Block masterDesktopExtra = new Block() 4766 { 4767 Id = "MasterDesktopExtra", 4768 SortId = 10, 4769 Template = RenderDesktopExtra(), 4770 SkipRenderBlocksList = true 4771 }; 4772 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4773 4774 Block masterDesktopNavigation = new Block() 4775 { 4776 Id = "MasterDesktopNavigation", 4777 SortId = 20, 4778 Template = RenderDesktopNavigation(), 4779 SkipRenderBlocksList = true 4780 }; 4781 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4782 } 4783 4784 @* Include the Blocks for the page *@ 4785 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4786 4787 @using System 4788 @using System.Web 4789 @using Dynamicweb.Rapido.Blocks.Extensibility 4790 @using Dynamicweb.Rapido.Blocks 4791 4792 @{ 4793 Block masterDesktopLogo = new Block 4794 { 4795 Id = "MasterDesktopLogo", 4796 SortId = 10, 4797 Template = RenderDesktopLogo(), 4798 Design = new Design 4799 { 4800 Size = "auto-width", 4801 HidePadding = true, 4802 RenderType = RenderType.Column, 4803 CssClass = "grid--align-self-center" 4804 } 4805 }; 4806 4807 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4808 } 4809 4810 4811 @helper RenderDesktopLogo() 4812 { 4813 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4814 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4815 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4816 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4817 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 4818 if (Path.GetExtension(logo).ToLower() != ".svg") 4819 { 4820 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 4821 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 4822 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 4823 } 4824 else 4825 { 4826 logo = HttpUtility.UrlDecode(logo); 4827 } 4828 4829 <div class="logo @alignClass dw-mod"> 4830 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 4831 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 4832 </a> 4833 </div> 4834 } 4835 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4836 4837 @using System 4838 @using System.Web 4839 @using Dynamicweb.Rapido.Blocks.Extensibility 4840 @using Dynamicweb.Rapido.Blocks 4841 4842 @functions { 4843 bool isMegaMenu; 4844 } 4845 4846 @{ 4847 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 4848 Block masterDesktopMenu = new Block 4849 { 4850 Id = "MasterDesktopMenu", 4851 SortId = 10, 4852 Template = RenderDesktopMenu(), 4853 Design = new Design 4854 { 4855 Size = "auto", 4856 HidePadding = true, 4857 RenderType = RenderType.Column 4858 } 4859 }; 4860 4861 if (isMegaMenu) 4862 { 4863 masterDesktopMenu.Design.CssClass = "u-reset-position"; 4864 } 4865 4866 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 4867 } 4868 4869 @helper RenderDesktopMenu() 4870 { 4871 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4872 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 4873 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 4874 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 4875 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4876 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 4877 int startLevel = renderPagesInToolBar ? 1 : 0; 4878 4879 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 4880 4881 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 4882 @if (!isMegaMenu) 4883 { 4884 @RenderNavigation(new 4885 { 4886 id = "topnavigation", 4887 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4888 startLevel = startLevel, 4889 ecomStartLevel = startLevel + 1, 4890 endlevel = 5, 4891 expandmode = "all", 4892 template = "BaseMenuWithDropdown.xslt" 4893 }); 4894 } 4895 else 4896 { 4897 @RenderNavigation(new 4898 { 4899 id = "topnavigation", 4900 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4901 startLevel = startLevel, 4902 ecomStartLevel = startLevel + 1, 4903 endlevel = 5, 4904 promotionImage = megamenuPromotionImage, 4905 promotionLink = promotionLink, 4906 expandmode = "all", 4907 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 4908 template = "BaseMegaMenu.xslt" 4909 }); 4910 } 4911 </div> 4912 } 4913 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4914 4915 @using System 4916 @using System.Web 4917 @using Dynamicweb.Rapido.Blocks.Extensibility 4918 @using Dynamicweb.Rapido.Blocks 4919 4920 @{ 4921 Block masterDesktopActionsMenu = new Block 4922 { 4923 Id = "MasterDesktopActionsMenu", 4924 SortId = 10, 4925 Template = RenderDesktopActionsMenu(), 4926 Design = new Design 4927 { 4928 CssClass = "u-flex" 4929 }, 4930 SkipRenderBlocksList = true 4931 4932 }; 4933 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 4934 4935 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 4936 { 4937 Block masterDesktopActionsHeaderButton = new Block 4938 { 4939 Id = "MasterDesktopActionsHeaderButton", 4940 SortId = 60, 4941 Template = RenderHeaderButton() 4942 }; 4943 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 4944 } 4945 } 4946 4947 @helper RenderDesktopActionsMenu() 4948 { 4949 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 4950 4951 <ul class="menu u-flex dw-mod"> 4952 @RenderBlockList(subBlocks) 4953 <li style="display: flex; align-items: center; padding-left: 16px;">Ring oss på <a style="padding-left: 1rem; color:#cf101c;" href="tel:40601111">40 60 11 11</a></li> 4954 </ul> 4955 } 4956 4957 @helper RenderHeaderButton() 4958 { 4959 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 4960 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 4961 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 4962 4963 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 4964 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-left" href="@headerButtonLink">@headerButtonText</a> 4965 </li> 4966 } 4967 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4968 4969 @using System 4970 @using System.Web 4971 @using Dynamicweb.Core; 4972 @using System.Text.RegularExpressions 4973 @using Dynamicweb.Rapido.Blocks.Extensibility 4974 @using Dynamicweb.Rapido.Blocks 4975 4976 @{ 4977 Block masterDesktopActionsMenuLanguageSelector = new Block 4978 { 4979 Id = "MasterDesktopActionsMenuLanguageSelector", 4980 SortId = 40, 4981 Template = RenderLanguageSelector() 4982 }; 4983 4984 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 4985 } 4986 4987 @helper RenderLanguageSelector() 4988 { 4989 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4990 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 4991 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4992 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 4993 4994 if (Model.Languages.Count > 1) 4995 { 4996 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 4997 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 4998 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i> 4999 </div> 5000 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 5001 @foreach (var lang in Model.Languages) 5002 { 5003 string widthClass = "menu__item--fixed-width"; 5004 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name; 5005 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 5006 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 5007 5008 if (languageViewType == "flag-culture") 5009 { 5010 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName; 5011 } 5012 5013 if (languageViewType == "flag") 5014 { 5015 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>"; 5016 widthClass = ""; 5017 } 5018 5019 if (languageViewType == "name") 5020 { 5021 langInfo = lang.Name; 5022 } 5023 5024 if (languageViewType == "culture") 5025 { 5026 langInfo = cultureName; 5027 widthClass = ""; 5028 } 5029 5030 <div class="menu__item dw-mod @widthClass"> 5031 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a> 5032 </div> 5033 } 5034 </div> 5035 </li> 5036 } 5037 } 5038 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5039 5040 @using System 5041 @using System.Web 5042 @using Dynamicweb.Rapido.Blocks.Extensibility 5043 @using Dynamicweb.Rapido.Blocks 5044 5045 @{ 5046 Block masterDesktopActionsMenuSignIn = new Block 5047 { 5048 Id = "MasterDesktopActionsMenuSignIn", 5049 SortId = 20, 5050 Template = RenderSignIn() 5051 }; 5052 5053 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 5054 } 5055 5056 @helper RenderSignIn() 5057 { 5058 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 5059 string userInitials = ""; 5060 int pageId = Model.TopPage.ID; 5061 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 5062 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 5063 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 5064 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 5065 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5066 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 5067 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 5068 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 5069 int recurringOrderPageId = GetPageIdByNavigationTag("RecurringOrders"); 5070 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 5071 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 5072 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 5073 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 5074 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 5075 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 5076 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 5077 5078 string linkStart = "/Default.aspx?ID="; 5079 if (Model.CurrentUser.ID <= 0) 5080 { 5081 linkStart += signInProfilePageId + "&RedirectPageId="; 5082 } 5083 5084 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 5085 string myProfilePageLink = linkStart + myProfilePageId; 5086 string myOrdersPageLink = linkStart + myOrdersPageId; 5087 string myFavoritesPageLink = linkStart + myFavoritesPageId; 5088 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 5089 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 5090 string myRecurringOrderLink = linkStart + recurringOrderPageId; 5091 5092 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 5093 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 5094 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5095 5096 if (Model.CurrentUser.ID != 0) 5097 { 5098 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 5099 } 5100 5101 if (!navigationItemsHideSignIn) 5102 { 5103 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5104 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 5105 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5106 5107 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod"> 5108 <div class="@menuLinkClass dw-mod" style="padding: 1rem 0rem 1rem 1rem;"> @*Mennt*@ 5109 @if (Model.CurrentUser.ID <= 0) 5110 { 5111 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x" title="@Translate("Sign in")"></i> 5112 } 5113 else 5114 { 5115 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a> 5116 } 5117 </div> 5118 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 5119 <ul class="list list--clean dw-mod"> 5120 @if (Model.CurrentUser.ID <= 0) 5121 { 5122 <li> 5123 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 5124 </li> 5125 5126 if (!hideCreateAccountLink) 5127 { 5128 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 5129 } 5130 if (!hideForgotPasswordLink) 5131 { 5132 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 5133 } 5134 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5135 { 5136 @RenderSeparator() 5137 } 5138 } 5139 @if (!hideMyProfileLink) 5140 { 5141 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 5142 } 5143 @if (!hideMyOrdersLink) 5144 { 5145 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5146 } 5147 @if (!hideMyFavoritesLink) 5148 { 5149 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5150 } 5151 @if (!hideMySavedCardsLink) 5152 { 5153 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 5154 } 5155 @if (!hideMyOrderDraftsLink) 5156 { 5157 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 5158 } 5159 @if (Model.Area.ID == 24) 5160 { 5161 @RenderListItem(myRecurringOrderLink, Translate("Gjentagende ordre"), orderDraftsIcon) 5162 } 5163 @if (Model.CurrentUser.ID > 0) 5164 { 5165 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5166 { 5167 @RenderSeparator() 5168 } 5169 5170 //Check if impersonation is on 5171 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 5172 { 5173 <li> 5174 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 5175 @Translate("Sign out") 5176 </div> 5177 </li> 5178 } else { 5179 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 5180 } 5181 } 5182 </ul> 5183 </div> 5184 </li> 5185 } 5186 } 5187 5188 @helper RenderListItem(string link, string text, string icon = null) { 5189 <li> 5190 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)"> 5191 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5192 </a> 5193 </li> 5194 } 5195 5196 @helper RenderSeparator() 5197 { 5198 <li class="list__seperator dw-mod"></li> 5199 } 5200 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5201 5202 @using System 5203 @using System.Web 5204 @using Dynamicweb.Rapido.Blocks.Extensibility 5205 @using Dynamicweb.Rapido.Blocks 5206 5207 @{ 5208 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5209 5210 Block masterDesktopActionsMenuFavorites = new Block 5211 { 5212 Id = "MasterDesktopActionsMenuFavorites", 5213 SortId = 30, 5214 Template = RenderFavorites() 5215 }; 5216 5217 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5218 { 5219 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5220 } 5221 } 5222 5223 @helper RenderFavorites() 5224 { 5225 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5226 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5227 5228 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5229 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5230 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5231 5232 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5233 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5234 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5235 </a> 5236 </li> 5237 } 5238 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5239 5240 @using System 5241 @using System.Web 5242 @using Dynamicweb.Rapido.Blocks.Extensibility 5243 @using Dynamicweb.Rapido.Blocks 5244 @using Dynamicweb.Rapido.Services 5245 5246 @{ 5247 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5248 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5249 5250 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5251 { 5252 Block masterDesktopActionsMenuMiniCart = new Block 5253 { 5254 Id = "MasterDesktopActionsMenuMiniCart", 5255 SortId = 60, 5256 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5257 SkipRenderBlocksList = true, 5258 BlocksList = new List<Block>() 5259 }; 5260 5261 Block miniCartCounterScriptTemplate = new Block 5262 { 5263 Id = "MiniCartCounterScriptTemplate", 5264 Template = RenderMiniCartCounterContent() 5265 }; 5266 5267 //dropdown layout is default 5268 RazorEngine.Templating.TemplateWriter layoutTemplate; 5269 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5270 5271 switch (miniCartLayout) 5272 { 5273 case "dropdown": 5274 layoutTemplate = RenderMiniCartDropdownLayout(); 5275 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5276 break; 5277 case "panel": 5278 layoutTemplate = RenderMiniCartPanelLayout(); 5279 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5280 break; 5281 case "modal": 5282 layoutTemplate = RenderMiniCartModalLayout(); 5283 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5284 break; 5285 case "none": 5286 default: 5287 layoutTemplate = RenderMiniCartDropdownLayout(); 5288 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5289 break; 5290 } 5291 5292 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5293 { 5294 Id = "MiniCartTrigger", 5295 Template = miniCartTriggerTemplate 5296 }); 5297 5298 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5299 { 5300 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5301 { 5302 Id = "MiniCartLayout", 5303 Template = layoutTemplate 5304 }); 5305 } 5306 5307 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5308 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5309 } 5310 5311 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5312 { 5313 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block { 5314 Id = "CartInitialization" 5315 }); 5316 } 5317 } 5318 5319 @helper RenderMiniCart(bool hasMouseEnterEvent) 5320 { 5321 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5322 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5323 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5324 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5325 string mouseEvent = ""; 5326 string id = "MiniCart"; 5327 if (hasMouseEnterEvent) 5328 { 5329 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5330 id = "miniCartTrigger"; 5331 } 5332 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5333 @RenderBlockList(subBlocks) 5334 </li> 5335 } 5336 5337 @helper RenderMiniCartTriggerLabel() 5338 { 5339 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5340 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5341 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5342 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5343 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5344 5345 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')" title="@Translate("Cart")" style="padding: 1rem 1rem 1rem 0rem;"> @*Mennt*@ 5346 <div class="u-inline u-position-relative"> 5347 <i class="@cartIcon fa-1_5x"></i> 5348 @RenderMiniCartCounter() 5349 </div> 5350 </div> 5351 } 5352 5353 @helper RenderMiniCartTriggerLink() 5354 { 5355 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5356 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5357 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5358 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5359 5360 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5361 <span class="u-inline u-position-relative"> 5362 <i class="@cartIcon fa-1_5x"></i> 5363 @RenderMiniCartCounter() 5364 </span> 5365 </a> 5366 } 5367 5368 @helper RenderMiniCartCounter() 5369 { 5370 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5371 string cartProductsCount = Model.Cart.TotalProductsCount.ToString(); 5372 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5373 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5374 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5375 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5376 5377 if (showPrice && counterPosition == "right") 5378 { 5379 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5380 } 5381 5382 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5383 <span class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 5384 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()"> 5385 @cartProductsCount @cartProductsTotalPrice 5386 </span> 5387 </span> 5388 </span> 5389 } 5390 5391 @helper RenderMiniCartCounterContent() 5392 { 5393 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5394 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5395 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5396 5397 <script id="MiniCartCounterContent" type="text/x-template"> 5398 {{#.}} 5399 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 5400 @if (showPriceInMiniCartCounter) 5401 { 5402 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5403 } 5404 else 5405 { 5406 <text>{{numberofproducts}}</text> 5407 } 5408 </span> 5409 {{/.}} 5410 </script> 5411 } 5412 5413 @helper RenderMiniCartDropdownLayout() 5414 { 5415 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5416 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5417 5418 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink"> 5419 <div class="mini-cart-dropdown__inner dw-mod"> 5420 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5421 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5422 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5423 </div> 5424 </div> 5425 </div> 5426 } 5427 5428 @helper RenderMiniCartPanelLayout() 5429 { 5430 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5431 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5432 5433 <div class="mini-cart grid__cell dw-mod"> 5434 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5435 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5436 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5437 <div class="panel__content u-full-width dw-mod"> 5438 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3> 5439 <div class="panel__content-body panel__content-body--cart dw-mod"> 5440 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5441 </div> 5442 </div> 5443 </div> 5444 </div> 5445 } 5446 5447 @helper RenderMiniCartModalLayout() 5448 { 5449 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5450 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5451 5452 <div class="mini-cart grid__cell dw-mod"> 5453 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5454 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5455 <label for="miniCartTrigger" class="modal-overlay"></label> 5456 <div class="modal modal--md modal--top-right dw-mod"> 5457 <div class="modal__body u-flex grid--direction-column dw-mod"> 5458 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5459 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5460 </div> 5461 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5462 </div> 5463 </div> 5464 </div> 5465 } 5466 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5467 5468 @using System 5469 @using System.Web 5470 @using Dynamicweb.Rapido.Blocks.Extensibility 5471 @using Dynamicweb.Rapido.Blocks 5472 5473 @{ 5474 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5475 5476 Block masterDesktopActionsMenuOrderDraft = new Block 5477 { 5478 Id = "MasterDesktopActionsMenuOrderDraft", 5479 SortId = 40, 5480 Template = RenderOrderDraft() 5481 }; 5482 5483 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5484 { 5485 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5486 } 5487 } 5488 5489 @helper RenderOrderDraft() 5490 { 5491 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5492 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5493 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5494 5495 5496 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5497 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5498 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5499 5500 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5501 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5502 <span class="u-inline u-position-relative"> 5503 <i class="@draftIcon fa-1_5x"></i> 5504 </span> 5505 </a> 5506 </li> 5507 } 5508 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5509 5510 @using System 5511 @using System.Web 5512 @using Dynamicweb.Rapido.Blocks.Extensibility 5513 @using Dynamicweb.Rapido.Blocks 5514 5515 @{ 5516 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5517 5518 Block masterDesktopActionsMenuDownloadCart = new Block 5519 { 5520 Id = "MasterDesktopActionsMenuDownloadCart", 5521 SortId = 50, 5522 Template = RenderDownloadCart() 5523 }; 5524 5525 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5526 { 5527 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5528 } 5529 } 5530 5531 @helper RenderDownloadCart() 5532 { 5533 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5534 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5535 5536 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5537 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5538 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5539 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5540 5541 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5542 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5543 <span class="u-inline u-position-relative"> 5544 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5545 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5546 </span> 5547 </a> 5548 </li> 5549 } 5550 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5551 5552 @using System 5553 @using System.Web 5554 @using Dynamicweb.Rapido.Blocks.Extensibility 5555 @using Dynamicweb.Rapido.Blocks 5556 5557 @functions { 5558 public class SearchConfiguration 5559 { 5560 public string searchFeedId { get; set; } 5561 public string searchSecondFeedId { get; set; } 5562 public int groupsFeedId { get; set; } 5563 public string resultPageLink { get; set; } 5564 public string searchPlaceholder { get; set; } 5565 public string searchType { get; set; } 5566 public string searchTemplate { get; set; } 5567 public string searchContentTemplate { get; set; } 5568 public string searchValue { get; set; } 5569 public bool showGroups { get; set; } 5570 5571 public SearchConfiguration() 5572 { 5573 searchFeedId = ""; 5574 searchSecondFeedId = ""; 5575 searchType = "product-search"; 5576 searchContentTemplate = ""; 5577 showGroups = true; 5578 } 5579 } 5580 } 5581 @{ 5582 Block masterSearchBar = new Block 5583 { 5584 Id = "MasterSearchBar", 5585 SortId = 40, 5586 Template = RenderSearch("bar"), 5587 Design = new Design 5588 { 5589 Size = "auto", 5590 HidePadding = true, 5591 RenderType = RenderType.Column 5592 } 5593 }; 5594 5595 Block masterSearchAction = new Block 5596 { 5597 Id = "MasterDesktopActionsMenuSearch", 5598 SortId = 10, 5599 Template = RenderSearch() 5600 }; 5601 5602 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5603 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5604 } 5605 5606 @helper RenderSearch(string type = "mini-search") 5607 { 5608 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5609 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5610 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5611 5612 SearchConfiguration searchConfiguration = null; 5613 5614 switch (searchType) { 5615 case "contentSearch": 5616 searchConfiguration = new SearchConfiguration() { 5617 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5618 resultPageLink = contentSearchPageLink, 5619 searchPlaceholder = Translate("Search page"), 5620 groupsFeedId = 0, 5621 searchType = "content-search", 5622 searchTemplate = "SearchPagesTemplate", 5623 showGroups = false 5624 }; 5625 break; 5626 case "combinedSearch": 5627 searchConfiguration = new SearchConfiguration() { 5628 searchFeedId = productsPageId + "&feed=true", 5629 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5630 resultPageLink = Converter.ToString(productsPageId), 5631 searchPlaceholder = Translate("Search products or pages"), 5632 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5633 searchType = "combined-search", 5634 searchTemplate = "SearchProductsTemplateWrap", 5635 searchContentTemplate = "SearchPagesTemplateWrap", 5636 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5637 }; 5638 break; 5639 default: //productSearch 5640 searchConfiguration = new SearchConfiguration() { 5641 resultPageLink = Converter.ToString(productsPageId), 5642 searchFeedId = productsPageId + "&feed=true", 5643 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5644 searchPlaceholder = Translate("Search products"), 5645 searchTemplate = "SearchProductsTemplate", 5646 searchType = "product-search", 5647 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5648 }; 5649 break; 5650 } 5651 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5652 5653 if (type == "mini-search") { 5654 @RenderMiniSearch(searchConfiguration) 5655 } else { 5656 @RenderSearchBar(searchConfiguration) 5657 } 5658 } 5659 5660 @helper RenderSearchBar(SearchConfiguration options) 5661 { 5662 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5663 data-page-size="7" 5664 data-search-feed-id="@options.searchFeedId" 5665 data-search-second-feed-id="@options.searchSecondFeedId" 5666 data-result-page-id="@options.resultPageLink" 5667 data-groups-page-id="@options.groupsFeedId" 5668 data-search-type="@options.searchType"> 5669 @if (options.showGroups) 5670 { 5671 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button> 5672 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul> 5673 } 5674 <div class="typeahead-search-field"> 5675 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" name="search" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5676 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5677 { 5678 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 5679 } 5680 else 5681 { 5682 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 5683 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div> 5684 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div> 5685 </div> 5686 } 5687 </div> 5688 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 5689 </div> 5690 } 5691 5692 @helper RenderMiniSearch(SearchConfiguration options) 5693 { 5694 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5695 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5696 5697 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon"> 5698 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 5699 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 5700 </div> 5701 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 5702 <div class="typeahead js-typeahead" id="ProductSearchBar" 5703 data-page-size="7" 5704 data-search-feed-id="@options.searchFeedId" 5705 data-search-second-feed-id="@options.searchSecondFeedId" 5706 data-result-page-id="@options.resultPageLink" 5707 data-search-type="@options.searchType"> 5708 <div class="typeahead-search-field"> 5709 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5710 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5711 { 5712 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 5713 } 5714 else 5715 { 5716 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 5717 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 5718 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div> 5719 </div> 5720 } 5721 </div> 5722 </div> 5723 </div> 5724 </li> 5725 } 5726 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5727 5728 @using System 5729 @using System.Web 5730 @using Dynamicweb.Rapido.Blocks.Extensibility 5731 @using Dynamicweb.Rapido.Blocks 5732 5733 @{ 5734 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5735 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 5736 5737 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 5738 5739 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 5740 headerConfigurationPage.RemoveBlock(configDesktopLogo); 5741 5742 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 5743 headerConfigurationPage.RemoveBlock(configDesktopMenu); 5744 5745 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 5746 headerConfigurationPage.RemoveBlock(configSearchBar); 5747 5748 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 5749 headerConfigurationPage.RemoveBlock(configSearchAction); 5750 5751 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 5752 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 5753 5754 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 5755 5756 switch (headerConfigurationTopLayout) 5757 { 5758 case "condensed": //2 5759 configDesktopLogo.Design.Size = "auto-width"; 5760 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5761 5762 configDesktopMenu.SortId = 20; 5763 configDesktopMenu.Design.Size = "auto"; 5764 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5765 5766 configDesktopActionsMenu.SortId = 30; 5767 configDesktopActionsMenu.Design.Size = "auto-width"; 5768 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5769 5770 if (!headerConfigurationHideSearch) 5771 { 5772 configSearchBar.SortId = 40; 5773 configSearchBar.Design.Size = "12"; 5774 configDesktopExtra.SortId = 50; 5775 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5776 } 5777 break; 5778 case "splitted": //3 5779 configDesktopLogo.Design.Size = "auto"; 5780 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5781 5782 if (!headerConfigurationHideSearch) 5783 { 5784 configSearchBar.SortId = 20; 5785 configSearchBar.Design.Size = "auto"; 5786 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5787 } 5788 5789 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5790 5791 configDesktopActionsMenu.SortId = 20; 5792 configDesktopActionsMenu.Design.Size = "auto-width"; 5793 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5794 break; 5795 case "splitted-center": //4 5796 configDesktopLogo.Design.Size = "auto"; 5797 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5798 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5799 5800 configDesktopActionsMenu.SortId = 30; 5801 configDesktopActionsMenu.Design.Size = "auto-width"; 5802 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5803 5804 if (!headerConfigurationHideSearch) 5805 { 5806 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5807 } 5808 break; 5809 case "minimal": //5 5810 configDesktopLogo.Design.Size = "auto-width"; 5811 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5812 5813 configDesktopMenu.Design.Size = "auto"; 5814 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5815 5816 configDesktopActionsMenu.SortId = 20; 5817 configDesktopActionsMenu.Design.Size = "auto-width"; 5818 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5819 5820 if (!headerConfigurationHideSearch) 5821 { 5822 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5823 } 5824 break; 5825 case "minimal-center": //6 5826 configDesktopLogo.Design.Size = "auto-width"; 5827 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5828 5829 configDesktopMenu.Design.Size = "auto"; 5830 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5831 5832 configDesktopActionsMenu.SortId = 20; 5833 configDesktopActionsMenu.Design.Size = "auto-width"; 5834 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5835 5836 if (!headerConfigurationHideSearch) 5837 { 5838 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5839 } 5840 break; 5841 case "minimal-right": //7 5842 configDesktopLogo.Design.Size = "auto-width"; 5843 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5844 5845 configDesktopMenu.Design.Size = "auto"; 5846 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5847 5848 configDesktopActionsMenu.SortId = 20; 5849 configDesktopActionsMenu.Design.Size = "auto-width"; 5850 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5851 5852 if (!headerConfigurationHideSearch) 5853 { 5854 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5855 } 5856 break; 5857 case "two-lines": //8 5858 configDesktopLogo.Design.Size = "auto"; 5859 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5860 5861 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5862 5863 configDesktopActionsMenu.SortId = 20; 5864 configDesktopActionsMenu.Design.Size = "auto-width"; 5865 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5866 5867 if (!headerConfigurationHideSearch) 5868 { 5869 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5870 } 5871 break; 5872 case "two-lines-centered": //9 5873 configDesktopLogo.Design.Size = "auto"; 5874 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5875 5876 configDesktopMenu.Design.Size = "auto-width"; 5877 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5878 5879 configDesktopActionsMenu.SortId = 20; 5880 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5881 5882 if (!headerConfigurationHideSearch) 5883 { 5884 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5885 } 5886 break; 5887 case "normal": //1 5888 default: 5889 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5890 5891 if (!headerConfigurationHideSearch) 5892 { 5893 configSearchBar.SortId = 20; 5894 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5895 } 5896 5897 configDesktopActionsMenu.SortId = 30; 5898 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5899 5900 configDesktopActionsMenu.Design.Size = "auto-width"; 5901 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5902 break; 5903 } 5904 } 5905 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5906 5907 @using System 5908 @using System.Web 5909 @using Dynamicweb.Rapido.Blocks.Extensibility 5910 @using Dynamicweb.Rapido.Blocks 5911 5912 @{ 5913 BlocksPage customMasterHeaderBlocks = BlocksPage.GetBlockPage("Master"); 5914 5915 if (Pageview.Area.ID != 25 && Pageview.Area.ID != 24) 5916 { 5917 Block masterFreeShipping = new Block 5918 { 5919 Id = "MasterFreeShipping", 5920 SortId = 10, 5921 Template = RenderFreeShipping() 5922 }; 5923 customMasterHeaderBlocks.Add("MasterDesktopActionsMenu", masterFreeShipping); 5924 } 5925 } 5926 5927 @helper RenderFreeShipping() 5928 5929 { 5930 Dynamicweb.Frontend.PriceViewModel total = Model.Cart.TotalPrice; 5931 double shippingLimit = 1000; 5932 double cartTotal = total != null ? total.PriceWithVat.Value : 0; 5933 double amountToFreeShipping = shippingLimit - cartTotal; 5934 5935 <li class="menu__item menu__item--horizontal menu__item--icon menu--clean dw-mod"> 5936 <div class="header-menu__link header-menu__link--icon dw-mod" style="display:flex; flex-direction:column;"> 5937 <span style="color: #364A55; border-bottom: 2px solid #cf101c; padding-bottom: 1rem; font-weight: bolder; font-family: 'Archivo',sans-serif;">@Translate("Gratis frakt over 1000,-")</span> 5938 @if (cartTotal < 1000) 5939 { 5940 <div style="padding-top: 1rem; font-size: 0.9em;"><span class="FreeshippingPrice">@amountToFreeShipping kr igjen til gratis frakt</span></div> 5941 } 5942 else 5943 { 5944 <div style="padding-top: 1rem; font-size: 0.9em;"><span class="FreeshippingPrice">Du har gratis frakt!</span></div> 5945 } 5946 5947 </div> 5948 </li> 5949 5950 <script> 5951 //TODO: Husk å flytte til Custom.js// 5952 document.addEventListener('cartUpdated', function (event) { 5953 console.log('cartUpdated', event); 5954 var FreeshippingPrice = document.getElementsByClassName("FreeshippingPrice"); 5955 if (FreeshippingPrice){ 5956 const price = event?.detail?.data[0]?.totalPriceWithVat; 5957 const priceParsed = parseFloat(price.replace("kr", "").replace(/\s/g, "")); 5958 const shippingLimit = 1000; 5959 const amountToFreeShipping = shippingLimit - priceParsed; 5960 console.log(amountToFreeShipping); 5961 console.log(priceParsed); 5962 console.log(price); 5963 5964 if (priceParsed < 1000) { 5965 FreeshippingPrice[0].innerText = `${amountToFreeShipping} kr igjen til gratis frakt`; 5966 } else { 5967 FreeshippingPrice[0].innerText = "Du har gratis frakt!"; 5968 } 5969 }; 5970 5971 }); 5972 </script> 5973 } 5974 5975 5976 5977 5978 @helper RenderDesktopTools() 5979 { 5980 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 5981 5982 <div class="tools-navigation dw-mod"> 5983 <div class="center-container grid top-container__center-container dw-mod"> 5984 @RenderBlockList(subBlocks) 5985 </div> 5986 </div> 5987 } 5988 5989 @helper RenderDesktopToolsText() 5990 { 5991 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 5992 if (!string.IsNullOrEmpty(toolsText)) 5993 { 5994 <div class="u-margin-top u-margin-bottom">@toolsText</div> 5995 } 5996 } 5997 5998 @helper RenderDesktopToolsNavigation() 5999 { 6000 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 6001 6002 if (renderPagesInToolBar) 6003 { 6004 @RenderNavigation(new 6005 { 6006 id = "topToolsNavigation", 6007 cssclass = "menu menu-tools dw-mod dwnavigation", 6008 template = "TopMenu.xslt" 6009 }) 6010 } 6011 } 6012 6013 @helper RenderDesktopNavigation() 6014 { 6015 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 6016 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6017 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 6018 <nav class="main-navigation dw-mod"> 6019 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 6020 @RenderBlockList(subBlocks) 6021 </div> 6022 </nav> 6023 } 6024 6025 @helper RenderDesktopExtra() 6026 { 6027 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 6028 6029 if (subBlocks.Count > 0) 6030 { 6031 <div class="header header-top dw-mod"> 6032 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 6033 @RenderBlockList(subBlocks) 6034 </div> 6035 </div> 6036 } 6037 }</text> 6038 } 6039 6040 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6041 6042 @using System 6043 @using System.Web 6044 @using Dynamicweb.Rapido.Blocks.Extensibility 6045 @using Dynamicweb.Rapido.Blocks 6046 @using Dynamicweb.Rapido.Blocks.Components.General 6047 @using Dynamicweb.Frontend 6048 6049 @functions { 6050 int impersonationPageId; 6051 string impersonationLayout; 6052 int impersonationFeed; 6053 Block impersonationBar; 6054 6055 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 6056 { 6057 string username = ""; 6058 6059 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 6060 { 6061 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 6062 } 6063 else if (!string.IsNullOrEmpty(name)) 6064 { 6065 username = name; 6066 } 6067 else if (!string.IsNullOrEmpty(email)) 6068 { 6069 username = email; 6070 } 6071 else 6072 { 6073 username = userName; 6074 } 6075 return username; 6076 } 6077 6078 string getUserName(UserViewModel user) 6079 { 6080 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6081 } 6082 6083 string getUserName(Dynamicweb.Security.UserManagement.User user) 6084 { 6085 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6086 } 6087 } 6088 6089 @{ 6090 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 6091 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 6092 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 6093 6094 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0) 6095 { 6096 impersonationBar = new Block 6097 { 6098 Id = "ImpersonationBar", 6099 SortId = 50, 6100 Template = RenderImpersonation(), 6101 SkipRenderBlocksList = true, 6102 Design = new Design 6103 { 6104 Size = "auto-width", 6105 HidePadding = true, 6106 RenderType = RenderType.Column 6107 } 6108 }; 6109 6110 if (impersonationLayout == "top-bar") { 6111 impersonationBar.SortId = 9; 6112 } 6113 6114 Block impersonationContent = new Block 6115 { 6116 Id = "ImpersonationContent", 6117 SortId = 20 6118 }; 6119 6120 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6121 { 6122 //Render stop impersonation view 6123 impersonationContent.Template = RenderStopImpersonationView(); 6124 6125 6126 Modal stopImpersonation = new Modal 6127 { 6128 Id = "StopImpersonation", 6129 Heading = new Heading { 6130 Level = 2, 6131 Title = Translate("Sign out"), 6132 Icon = new Icon { 6133 Name = "fa-sign-out", 6134 Prefix = "fas", 6135 LabelPosition = IconLabelPosition.After 6136 } 6137 }, 6138 Width = ModalWidth.Sm, 6139 BodyTemplate = RenderStopImpersonationForm() 6140 }; 6141 6142 Block stopImpersonationBlock = new Block 6143 { 6144 Id = "StopImpersonationBlock", 6145 SortId = 10, 6146 Component = stopImpersonation 6147 }; 6148 impersonationBar.BlocksList.Add(stopImpersonationBlock); 6149 } 6150 else 6151 { 6152 //Render main view 6153 switch (impersonationLayout) 6154 { 6155 case "right-lower-box": 6156 impersonationContent.BlocksList.Add( 6157 new Block { 6158 Id = "RightLowerBoxHeader", 6159 SortId = 10, 6160 Component = new Heading { 6161 Level = 5, 6162 Title = Translate("View the list of users you can sign in as"), 6163 CssClass = "impersonation-text" 6164 } 6165 } 6166 ); 6167 impersonationContent.BlocksList.Add( 6168 new Block { 6169 Id = "RightLowerBoxContent", 6170 SortId = 20, 6171 Template = RenderImpersonationControls() 6172 } 6173 ); 6174 break; 6175 case "right-lower-bar": 6176 impersonationContent.BlocksList.Add( 6177 new Block { 6178 Id = "RightLowerBarContent", 6179 SortId = 10, 6180 Template = RenderImpersonationControls() 6181 } 6182 ); 6183 break; 6184 case "bar": 6185 default: 6186 impersonationContent.BlocksList.Add( 6187 new Block { 6188 Id = "ViewListLink", 6189 SortId = 20, 6190 Template = RenderViewListLink() 6191 } 6192 ); 6193 impersonationContent.BlocksList.Add( 6194 new Block { 6195 Id = "BarTypeaheadSearch", 6196 SortId = 30, 6197 Template = RenderTypeaheadSearch() 6198 } 6199 ); 6200 break; 6201 } 6202 } 6203 impersonationBar.BlocksList.Add(impersonationContent); 6204 6205 impersonationBar.BlocksList.Add( 6206 new Block 6207 { 6208 Id = "ImpersonationSearchTemplates", 6209 SortId = 30, 6210 Template = RenderSearchResultTemplate() 6211 } 6212 ); 6213 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 6214 { 6215 impersonationBar.BlocksList.Add( 6216 new Block 6217 { 6218 Id = "ImpersonationSearchScripts", 6219 SortId = 40, 6220 Template = RenderSearchScripts() 6221 } 6222 ); 6223 } 6224 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6225 } 6226 } 6227 6228 @helper RenderImpersonation() 6229 { 6230 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6231 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6232 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6233 @if (impersonationLayout == "right-lower-box") 6234 { 6235 @RenderRightLowerBoxHeader() 6236 } 6237 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6238 @*Impersonation*@ 6239 @RenderBlockList(subBlocks) 6240 </div> 6241 </div> 6242 } 6243 6244 @helper RenderRightLowerBoxHeader() 6245 { 6246 <div class="impersonation__header dw-mod"> 6247 <div class="impersonation__title">@Translate("Impersonation")</div> 6248 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6249 @Render(new Icon 6250 { 6251 Prefix = "fas", 6252 Name = "fa-window-minimize" 6253 }) 6254 </label> 6255 </div> 6256 } 6257 6258 @helper RenderStopImpersonationView() 6259 { 6260 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6261 string userName = getUserName(Pageview.User); 6262 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> "; 6263 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText; 6264 6265 if (impersonationLayout == "right-lower-box") 6266 { 6267 <div class="u-margin-bottom--lg u-ta-center"> 6268 @impersonationText 6269 </div> 6270 <div class="u-margin-bottom--lg u-ta-center"> 6271 @RenderSwitchAccountButton() 6272 </div> 6273 @RenderStopImpersonationButton() 6274 } 6275 else 6276 { 6277 <div class="grid grid--align-center impersonation__stop-wrap"> 6278 <div class="impersonation-bar-item dw-mod"> 6279 @impersonationText 6280 </div> 6281 <div class="impersonation-bar-item dw-mod"> 6282 @RenderSwitchAccountButton() 6283 </div> 6284 <div class="impersonation-bar-item dw-mod"> 6285 @RenderStopImpersonationButton() 6286 </div> 6287 </div> 6288 } 6289 } 6290 6291 @helper RenderSwitchAccountButton() { 6292 @Render(new Button 6293 { 6294 Href = "/Default.aspx?ID=" + impersonationPageId, 6295 ButtonType = ButtonType.Button, 6296 ButtonLayout = ButtonLayout.Clean, 6297 Title = Translate("Switch account"), 6298 Icon = new Icon { 6299 Name = "fa-users", 6300 Prefix = "fal", 6301 LabelPosition = IconLabelPosition.After 6302 }, 6303 CssClass = "u-no-margin u-color-inherit" 6304 }) 6305 } 6306 6307 @helper RenderStopImpersonationForm() 6308 { 6309 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6310 string userName = getUserName(Pageview.User); 6311 int pageId = Model.TopPage.ID; 6312 6313 <form method="post" class="u-no-margin"> 6314 @Render(new Button 6315 { 6316 ButtonType = ButtonType.Submit, 6317 ButtonLayout = ButtonLayout.Secondary, 6318 Title = Translate("Sign out as") + " " + userName, 6319 Href = "/Default.aspx?ID=" + impersonationPageId, 6320 CssClass = "btn--full", 6321 Name = "DwExtranetRemoveSecondaryUser" 6322 }) 6323 6324 @Render(new Button 6325 { 6326 ButtonType = ButtonType.Submit, 6327 ButtonLayout = ButtonLayout.Secondary, 6328 Title = Translate("Sign out as") + " " + secondaryUserName, 6329 Href = "/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, 6330 CssClass = "btn--full", 6331 Name = "DwExtranetRemoveSecondaryUser" 6332 }) 6333 </form> 6334 } 6335 6336 @helper RenderStopImpersonationButton() { 6337 @Render(new Button 6338 { 6339 ButtonType = ButtonType.Button, 6340 ButtonLayout = ButtonLayout.Clean, 6341 Title = Translate("Sign out"), 6342 Icon = new Icon { 6343 Name = "fa-sign-out", 6344 Prefix = "fal", 6345 LabelPosition = IconLabelPosition.After 6346 }, 6347 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6348 CssClass = "u-no-margin" 6349 }) 6350 } 6351 6352 @helper RenderImpersonationControls() 6353 { 6354 <div class="impersonation__controls"> 6355 @RenderViewListLink() 6356 @RenderSearchBox() 6357 </div> 6358 @RenderResultsList() 6359 } 6360 6361 @helper RenderViewListLink() 6362 { 6363 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6364 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6365 6366 @Render(new Link { 6367 ButtonLayout = ButtonLayout.None, 6368 Title = title, 6369 Href = "/Default.aspx?ID=" + impersonationPageId, 6370 CssClass = buttonClasses 6371 }) 6372 } 6373 6374 @helper RenderSearchBox() 6375 { 6376 <div class="impersonation__search-wrap"> 6377 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6378 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6379 <i class="fal fa-search"></i> 6380 </div> 6381 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6382 <i class="fal fa-times"></i> 6383 </div> 6384 </div> 6385 } 6386 6387 @helper RenderTypeaheadSearch() 6388 { 6389 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6390 data-page-size="5" 6391 data-search-feed-id="@impersonationFeed" 6392 data-result-page-id="@impersonationPageId" 6393 data-search-type="user-search" 6394 data-search-parameter-name="q"> 6395 6396 <div class="typeahead-search-field"> 6397 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 6398 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul> 6399 </div> 6400 </div> 6401 } 6402 6403 @helper RenderResultsList() 6404 { 6405 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul> 6406 } 6407 6408 @helper RenderSearchResultTemplate() 6409 { 6410 <script id="ImpersonationSearchResult" type="text/x-template"> 6411 {{#.}} 6412 {{#Users}} 6413 <li class="impersonation__search-results-item impersonation-user"> 6414 <form method="post" class="impersonation-user__form" name="account{{id}}"> 6415 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 6416 <div class="impersonation-user__info"> 6417 <div class="impersonation-user__name">{{userName}}</div> 6418 <div class="impersonation-user__number">{{customerNumber}}</div> 6419 </div> 6420 @Render(new Button 6421 { 6422 ButtonType = ButtonType.Submit, 6423 ButtonLayout = ButtonLayout.Secondary, 6424 Title = Translate("Sign in as"), 6425 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 6426 }) 6427 </form> 6428 </li> 6429 {{/Users}} 6430 {{#unless Users}} 6431 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 6432 @Translate("Your search gave 0 results") 6433 </li> 6434 {{/unless}} 6435 {{/.}} 6436 </script> 6437 } 6438 6439 @helper RenderSearchScripts() 6440 { 6441 <script> 6442 let inputDelayTimer; 6443 function searchKeyUpHandler(e) { 6444 clearTimeout(inputDelayTimer); 6445 let value = e.target.value; 6446 if (value != "") { 6447 inputDelayTimer = setTimeout(function () { 6448 updateResults(value); 6449 }, 500); 6450 } else { 6451 clearResults(); 6452 } 6453 }; 6454 6455 function updateResults(value) { 6456 if (value == "") { 6457 return null; 6458 } 6459 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 6460 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 6461 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 6462 } 6463 6464 function clearResults() { 6465 document.getElementById("ImpersonationBoxSearchField").value = ""; 6466 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 6467 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 6468 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 6469 } 6470 </script> 6471 } 6472 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6473 6474 @using System 6475 @using System.Web 6476 @using System.Collections.Generic 6477 @using Dynamicweb.Rapido.Blocks.Extensibility 6478 @using Dynamicweb.Rapido.Blocks 6479 6480 @{ 6481 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 6482 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 6483 6484 Block orderLines = new Block 6485 { 6486 Id = "MiniCartOrderLines", 6487 SkipRenderBlocksList = true, 6488 BlocksList = new List<Block> 6489 { 6490 new Block { 6491 Id = "MiniCartOrderLinesList", 6492 SortId = 20, 6493 Template = RenderMiniCartOrderLinesList() 6494 } 6495 } 6496 }; 6497 6498 Block orderlinesScriptTemplates = new Block 6499 { 6500 Id = "OrderlinesScriptTemplates" 6501 }; 6502 6503 if (orderlinesView == "table") 6504 { 6505 orderLines.Template = RenderMiniCartOrderLinesTable(); 6506 orderLines.BlocksList.Add( 6507 new Block 6508 { 6509 Id = "MiniCartOrderlinesTableHeader", 6510 SortId = 10, 6511 Template = RenderMiniCartOrderLinesHeader() 6512 } 6513 ); 6514 6515 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 6516 } 6517 else 6518 { 6519 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 6520 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 6521 } 6522 6523 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 6524 6525 Block miniCartScriptTemplates = new Block() 6526 { 6527 Id = "MasterMiniCartTemplates", 6528 SortId = 1, 6529 Template = RenderMiniCartScriptTemplates(), 6530 SkipRenderBlocksList = true, 6531 BlocksList = new List<Block> 6532 { 6533 orderLines, 6534 new Block { 6535 Id = "MiniCartFooter", 6536 Template = RenderMiniCartFooter(), 6537 SortId = 50, 6538 SkipRenderBlocksList = true, 6539 BlocksList = new List<Block> 6540 { 6541 new Block { 6542 Id = "MiniCartSubTotal", 6543 Template = RenderMiniCartSubTotal(), 6544 SortId = 30 6545 }, 6546 new Block { 6547 Id = "MiniCartFees", 6548 Template = RenderMiniCartFees(), 6549 SortId = 40 6550 }, 6551 new Block { 6552 Id = "MiniCartPoints", 6553 Template = RenderMiniCartPoints(), 6554 SortId = 50 6555 }, 6556 new Block { 6557 Id = "MiniCartTotal", 6558 Template = RenderMiniCartTotal(), 6559 SortId = 60 6560 }, 6561 new Block { 6562 Id = "MiniCartDisclaimer", 6563 Template = RenderMiniCartDisclaimer(), 6564 SortId = 70 6565 }, 6566 new Block { 6567 Id = "MiniCartActions", 6568 Template = RenderMiniCartActions(), 6569 SortId = 80 6570 } 6571 } 6572 } 6573 } 6574 }; 6575 6576 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 6577 } 6578 6579 @helper RenderMiniCartScriptsTableTemplates() 6580 { 6581 <script id="MiniCartOrderline" type="text/x-template"> 6582 {{#unless isEmpty}} 6583 <tr> 6584 <td class="u-w60px"><a href="{{link}}" class="{{hideimage}}"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"></a></td> 6585 <td class="u-va-middle"> 6586 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a> 6587 {{#if variantname}} 6588 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 6589 {{/if}} 6590 {{#if unitname}} 6591 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 6592 {{/if}} 6593 </td> 6594 <td class="u-ta-right u-va-middle">{{quantity}}</td> 6595 <td class="u-ta-right u-va-middle"> 6596 {{#if pointsTotal}} 6597 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6598 {{else}} 6599 {{totalprice}} 6600 {{/if}} 6601 </td> 6602 </tr> 6603 {{/unless}} 6604 </script> 6605 6606 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6607 {{#unless isEmpty}} 6608 <tr class="table__row--no-border"> 6609 <td class="u-w60px">&nbsp;</td> 6610 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 6611 <td class="u-ta-right">&nbsp;</td> 6612 <td class="u-ta-right">{{totalprice}}</td> 6613 </tr> 6614 {{/unless}} 6615 </script> 6616 } 6617 6618 @helper RenderMiniCartScriptsListTemplates() 6619 { 6620 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6621 6622 <script id="MiniCartOrderline" type="text/x-template"> 6623 {{#unless isEmpty}} 6624 <div class="mini-cart-orderline grid dw-mod"> 6625 <div class="grid__col-4"> 6626 <a href="{{link}}" class="{{hideimage}}"> 6627 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"> 6628 </a> 6629 </div> 6630 <div class="grid__col-8"> 6631 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a> 6632 {{#if variantname}} 6633 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 6634 {{/if}} 6635 {{#if unitname}} 6636 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 6637 {{/if}} 6638 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 6639 6640 <div class="grid__cell-footer"> 6641 <div class="grid__cell"> 6642 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 6643 {{#if pointsTotal}} 6644 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6645 {{else}} 6646 {{totalprice}} 6647 {{/if}} 6648 </div> 6649 <button type="button" 6650 title="@Translate("Remove orderline")" 6651 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 6652 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 6653 </div> 6654 </div> 6655 </div> 6656 </div> 6657 {{/unless}} 6658 </script> 6659 6660 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6661 {{#unless isEmpty}} 6662 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 6663 <div class="grid__col-4"> 6664 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 6665 </div> 6666 <div class="grid__col-8">{{totalprice}}</div> 6667 </div> 6668 {{/unless}} 6669 </script> 6670 } 6671 6672 @helper RenderMiniCartScriptTemplates() 6673 { 6674 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 6675 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6676 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 6677 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6678 6679 <script id="MiniCartContent" type="text/x-template"> 6680 {{#.}} 6681 {{#unless isEmpty}} 6682 @if (miniCartUseGoogleTagManager) 6683 { 6684 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 6685 } 6686 @RenderBlockList(subBlocks) 6687 {{/unless}} 6688 {{/.}} 6689 </script> 6690 } 6691 6692 @helper RenderMiniCartOrderLinesTable() 6693 { 6694 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6695 6696 <div class="u-overflow-auto"> 6697 <table class="table mini-cart-table dw-mod"> 6698 @RenderBlockList(subBlocks) 6699 </table> 6700 </div> 6701 } 6702 6703 @helper RenderMiniCartOrderLinesBlocks() 6704 { 6705 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6706 6707 <div class="u-overflow-auto"> 6708 @RenderBlockList(subBlocks) 6709 </div> 6710 } 6711 6712 @helper RenderMiniCartOrderLinesHeader() 6713 { 6714 <thead> 6715 <tr> 6716 <td>&nbsp;</td> 6717 <td>@Translate("Product")</td> 6718 <td class="u-ta-right">@Translate("Qty")</td> 6719 <td class="u-ta-right" width="120">@Translate("Price")</td> 6720 </tr> 6721 </thead> 6722 } 6723 6724 @helper RenderMiniCartOrderLinesList() 6725 { 6726 <text> 6727 {{#OrderLines}} 6728 {{#ifCond template "===" "CartOrderline"}} 6729 {{>MiniCartOrderline}} 6730 {{/ifCond}} 6731 {{#ifCond template "===" "CartOrderlineMobile"}} 6732 {{>MiniCartOrderline}} 6733 {{/ifCond}} 6734 {{#ifCond template "===" "CartOrderlineDiscount"}} 6735 {{>MiniCartOrderlineDiscount}} 6736 {{/ifCond}} 6737 {{/OrderLines}} 6738 </text> 6739 } 6740 6741 @helper RenderMiniCartFees() 6742 { 6743 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6744 if (!pointShop) 6745 { 6746 <text> 6747 {{#unless hidePaymentfee}} 6748 <div class="grid"> 6749 <div class="grid__col-6 grid__col--bleed-y"> 6750 {{paymentmethod}} 6751 </div> 6752 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 6753 </div> 6754 {{/unless}} 6755 </text> 6756 } 6757 <text> 6758 {{#unless hideShippingfee}} 6759 <div class="grid"> 6760 <div class="grid__col-6 grid__col--bleed-y"> 6761 {{shippingmethod}} 6762 </div> 6763 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 6764 </div> 6765 {{/unless}} 6766 </text> 6767 <text> 6768 {{#if hasTaxSettings}} 6769 <div class="grid"> 6770 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 6771 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 6772 </div> 6773 {{/if}} 6774 </text> 6775 } 6776 6777 @helper RenderMiniCartFooter() 6778 { 6779 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 6780 6781 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 6782 @RenderBlockList(subBlocks) 6783 </div> 6784 } 6785 6786 @helper RenderMiniCartActions() 6787 { 6788 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6789 6790 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);">@Translate("Empty cart")</button> 6791 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Go to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Go to cart")</a> 6792 } 6793 6794 @helper RenderMiniCartPoints() 6795 { 6796 <text> 6797 {{#if earnings}} 6798 <div class="grid"> 6799 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 6800 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6801 <div> 6802 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 6803 </div> 6804 </div> 6805 </div> 6806 {{/if}} 6807 </text> 6808 } 6809 6810 @helper RenderMiniCartSubTotal() 6811 { 6812 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 6813 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6814 if (!pointShop) 6815 { 6816 <text> 6817 {{#unless hideSubTotal}} 6818 <div class="grid dw-mod u-bold"> 6819 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 6820 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6821 @if (hasTaxSettings) 6822 { 6823 <text>{{subtotalpricewithouttaxes}}</text> 6824 } 6825 else 6826 { 6827 <text>{{subtotalprice}}</text> 6828 } 6829 </div> 6830 </div> 6831 {{/unless}} 6832 </text> 6833 } 6834 } 6835 6836 @helper RenderMiniCartTotal() 6837 { 6838 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6839 6840 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 6841 <div class="grid__col-6">@Translate("Total")</div> 6842 <div class="grid__col-6 grid--align-end"> 6843 <div> 6844 @if (pointShop) 6845 { 6846 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 6847 } 6848 else 6849 { 6850 <text>{{totalprice}}</text> 6851 } 6852 </div> 6853 </div> 6854 </div> 6855 } 6856 6857 @helper RenderMiniCartDisclaimer() 6858 { 6859 <text> 6860 {{#if showCheckoutDisclaimer}} 6861 <div class="grid u-margin-bottom u-ta-right"> 6862 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 6863 </div> 6864 {{/if}} 6865 </text> 6866 } 6867 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6868 6869 @using Dynamicweb.Rapido.Blocks.Extensibility 6870 @using Dynamicweb.Rapido.Blocks 6871 @using Dynamicweb.Rapido.Blocks.Components.General 6872 @using Dynamicweb.Rapido.Blocks.Components 6873 @using Dynamicweb.Rapido.Services 6874 6875 @{ 6876 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 6877 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 6878 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 6879 6880 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 6881 { 6882 if (addToCartNotificationType == "modal") 6883 { 6884 Block addToCartNotificationModal = new Block 6885 { 6886 Id = "AddToCartNotificationModal", 6887 Template = RenderAddToCartNotificationModal() 6888 }; 6889 6890 Block addToCartNotificationScript = new Block 6891 { 6892 Id = "AddToCartNotificationScript", 6893 Template = RenderAddToCartNotificationModalScript() 6894 }; 6895 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 6896 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6897 } 6898 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 6899 { 6900 Block addToCartNotificationScript = new Block 6901 { 6902 Id = "AddToCartNotificationScript", 6903 Template = RenderAddToCartNotificationToggleScript() 6904 }; 6905 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6906 } 6907 } 6908 } 6909 6910 @helper RenderAddToCartNotificationModal() 6911 { 6912 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 6913 } 6914 6915 @helper RenderAddToCartNotificationModalScript() 6916 { 6917 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6918 6919 <script id="LastAddedProductTemplate" type="text/x-template"> 6920 @{ 6921 6922 Modal lastAddedProduct = new Modal 6923 { 6924 Id = "LastAddedProduct", 6925 Heading = new Heading 6926 { 6927 Level = 2, 6928 Title = Translate("Product is added to the cart") 6929 }, 6930 Width = ModalWidth.Lg, 6931 BodyTemplate = RenderModalContent() 6932 }; 6933 6934 lastAddedProduct.AddActions( 6935 new Button 6936 { 6937 ButtonType = ButtonType.Button, 6938 ButtonLayout = ButtonLayout.Secondary, 6939 Title = Translate("Continue shopping"), 6940 CssClass = "u-pull--left u-no-margin btn--sm", 6941 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6942 }, 6943 new Link 6944 { 6945 Href = "/Default.aspx?ID=" + cartPageId, 6946 ButtonLayout = ButtonLayout.Secondary, 6947 CssClass = "u-pull--right u-no-margin btn--sm", 6948 Title = Translate("Proceed to checkout"), 6949 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6950 } 6951 ); 6952 6953 @Render(lastAddedProduct) 6954 } 6955 </script> 6956 <script> 6957 document.addEventListener('addToCart', function (event) { 6958 Cart.ShowLastAddedProductModal(event.detail); 6959 }); 6960 </script> 6961 } 6962 6963 @helper RenderModalContent() 6964 { 6965 if (Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Mobile) 6966 { 6967 <div class="grid"> 6968 <div class="grid__col-3"> 6969 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 6970 </div> 6971 <div class="u-padding grid--align-self-center"> 6972 <span>{{quantity}}</span> x 6973 </div> 6974 <div class="grid__col-auto grid--align-self-center"> 6975 <div>{{productInfo.name}}</div> 6976 {{#if productInfo.variantName}} 6977 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 6978 {{/if}} 6979 {{#if productInfo.unitName}} 6980 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 6981 {{/if}} 6982 </div> 6983 <div class="grid" style="border-top: 2px solid #141b1f;"> 6984 <div class="grid__col-12"> 6985 {{#each productInfo.related}} 6986 <h6 class="u-margin">{{name}}</h6> 6987 <div class="grid" style="column-gap: 6px; row-gap: 6px;"> 6988 {{#each Products}} 6989 <div class="grid grid__col-12 u-padding u-ta-center" style="background-color: #f9fafb;"> 6990 <div class="u-align-center" style="mix-blend-mode: darken;"> @Render(new Image { Path = "{{ image }}", Title = "{{ name }}", ImageDefault = new ImageSettings { Width = 100, Height = 100, Crop = 1, Compression = 75 }})</div> 6991 <div>{{name}}</div> 6992 <div class="item-number dw-mod">{{number}}</div> 6993 <div class="price price--product-page dw-mod">{{price}}</div> 6994 <a class="btn--sm btn btn--secondary dw-mod" href="{{link}}">se mer</a> 6995 6996 <button 6997 id='' 6998 class="btn--sm btn btn--secondary dw-mod" 6999 onclick="Cart.AddToCart(event, { id: '{{number}}',variantId: '',unitId: '',productInfo: {'price':'{{price}}', 'image':'{{image}}', 'name': '{{name}}'},quantity: 1 })" 7000 title="@Translate("Legg til")"><i class="fa fa-shopping-cart"></i></button> 7001 </div> 7002 {{/each}} 7003 </div> 7004 {{/each}} 7005 </div> 7006 </div> 7007 </div> 7008 7009 } 7010 else 7011 { 7012 7013 <div class="grid"> 7014 <div class="grid__col-1"> 7015 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 7016 </div> 7017 <div class="u-padding grid--align-self-center"> 7018 <span>{{quantity}}</span> x 7019 </div> 7020 <div class="grid__col-auto grid--align-self-center"> 7021 <div>{{productInfo.name}}</div> 7022 {{#if productInfo.variantName}} 7023 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 7024 {{/if}} 7025 {{#if productInfo.unitName}} 7026 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 7027 {{/if}} 7028 </div> 7029 <div class="grid" style="border-top: 2px solid #141b1f;"> 7030 <div class="grid__col-12"> 7031 {{#each productInfo.related}} 7032 <h6 class="u-margin">{{name}}</h6> 7033 <div class="grid" style="column-gap: 6px; row-gap: 6px;"> 7034 {{#each Products}} 7035 <div class="grid grid__col-auto u-padding u-ta-center" style="background-color: #f9fafb;"> 7036 <div class="u-align-center" style="mix-blend-mode: darken;"> @Render(new Image { Path = "{{ image }}", Title = "{{ name }}", ImageDefault = new ImageSettings { Width = 100, Height = 100, Crop = 1, Compression = 75 }})</div> 7037 <div>{{name}}</div> 7038 <div class="item-number dw-mod">{{number}}</div> 7039 <div class="price price--product-page dw-mod">{{price}}</div> 7040 <a class="btn--sm btn btn--secondary dw-mod" href="{{link}}">se mer</a> 7041 7042 <button 7043 id='' 7044 class="btn--sm btn btn--secondary dw-mod" 7045 onclick="Cart.AddToCart(event, { id: '{{number}}',variantId: '',unitId: '',productInfo: {'price':'{{price}}', 'image':'{{image}}', 'name': '{{name}}'},quantity: 1 })" 7046 title="@Translate("Legg til")"><i class="fa fa-shopping-cart"></i></button> 7047 </div> 7048 {{/each}} 7049 </div> 7050 {{/each}} 7051 </div> 7052 </div> 7053 </div> 7054 } 7055 } 7056 7057 7058 @helper RenderAddToCartNotificationToggleScript() 7059 { 7060 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7061 7062 <script> 7063 document.addEventListener('addToCart', function () { 7064 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 7065 }); 7066 </script> 7067 } 7068 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7069 7070 @using System 7071 @using System.Web 7072 @using System.Collections.Generic 7073 @using Dynamicweb.Rapido.Blocks.Extensibility 7074 @using Dynamicweb.Rapido.Blocks 7075 @using Dynamicweb.Rapido.Blocks.Components.General 7076 7077 @functions { 7078 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 7079 } 7080 7081 @{ 7082 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 7083 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 7084 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 7085 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 7086 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 7087 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 7088 7089 Block masterFooterContent = new Block() 7090 { 7091 Id = "MasterFooterContent", 7092 SortId = 10, 7093 Template = RenderFooter(), 7094 SkipRenderBlocksList = true 7095 }; 7096 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 7097 7098 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 7099 { 7100 Block masterFooterColumnOne = new Block 7101 { 7102 Id = "MasterFooterColumnOne", 7103 SortId = 10, 7104 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 7105 Design = new Design 7106 { 7107 Size = "auto", 7108 RenderType = RenderType.Column 7109 } 7110 }; 7111 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 7112 } 7113 7114 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 7115 { 7116 Block masterFooterColumnTwo = new Block 7117 { 7118 Id = "MasterFooterColumnTwo", 7119 SortId = 20, 7120 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 7121 Design = new Design 7122 { 7123 Size = "auto", 7124 RenderType = RenderType.Column 7125 } 7126 }; 7127 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 7128 } 7129 7130 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 7131 { 7132 Block masterFooterColumnThree = new Block 7133 { 7134 Id = "MasterFooterColumnThree", 7135 SortId = 30, 7136 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 7137 Design = new Design 7138 { 7139 Size = "auto", 7140 RenderType = RenderType.Column 7141 } 7142 }; 7143 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 7144 } 7145 7146 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 7147 { 7148 Block masterFooterNewsletterSignUp = new Block 7149 { 7150 Id = "MasterFooterNewsletterSignUp", 7151 SortId = 40, 7152 Template = RenderFooterNewsletterSignUp(), 7153 Design = new Design 7154 { 7155 Size = "auto", 7156 RenderType = RenderType.Column 7157 } 7158 }; 7159 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 7160 } 7161 7162 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 7163 { 7164 Block masterFooterSocialLinks = new Block 7165 { 7166 Id = "MasterFooterSocialLinks", 7167 SortId = 50, 7168 Template = RenderFooterSocialLinks(), 7169 Design = new Design 7170 { 7171 Size = "auto", 7172 RenderType = RenderType.Column 7173 } 7174 }; 7175 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 7176 } 7177 7178 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 7179 { 7180 Block masterFooterPayments = new Block 7181 { 7182 Id = "MasterFooterPayments", 7183 SortId = 60, 7184 Template = RenderFooterPayments(), 7185 Design = new Design 7186 { 7187 Size = "12", 7188 RenderType = RenderType.Column 7189 } 7190 }; 7191 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 7192 } 7193 7194 Block masterFooterCopyright = new Block 7195 { 7196 Id = "MasterFooterCopyright", 7197 SortId = 70, 7198 Template = RenderFooterCopyright(), 7199 Design = new Design 7200 { 7201 Size = "12", 7202 RenderType = RenderType.Column 7203 } 7204 }; 7205 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 7206 } 7207 7208 @helper RenderFooter() 7209 { 7210 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 7211 7212 <footer class="footer no-print dw-mod"> 7213 <div class="center-container top-container__center-container dw-mod"> 7214 <div class="grid grid--external-bleed-x"> 7215 @RenderBlockList(subBlocks) 7216 </div> 7217 </div> 7218 </footer> 7219 } 7220 7221 @helper RenderFooterColumn(string header, string content) 7222 { 7223 <h3 class="footer__heading dw-mod">@header</h3> 7224 <div class="footer__content dw-mod"> 7225 @content 7226 </div> 7227 } 7228 7229 @helper RenderFooterNewsletterSignUp() 7230 { 7231 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 7232 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 7233 7234 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 7235 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 7236 form.Add(new TextField { 7237 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 7238 Type = TextFieldType.Email, 7239 ActionButton = new Button { 7240 ButtonType = ButtonType.Submit, Id="Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 7241 } 7242 }); 7243 7244 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 7245 <div class="footer__content dw-mod"> 7246 @Render(form) 7247 </div> 7248 } 7249 7250 @helper RenderFooterSocialLinks() 7251 { 7252 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 7253 <div class="footer__content dw-mod"> 7254 <div class="collection dw-mod"> 7255 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 7256 { 7257 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 7258 string socialIconClass = socialIcon.SelectedValue; 7259 string socialIconTitle = socialIcon.SelectedName; 7260 string socialLink = socialitem.GetString("Link"); 7261 7262 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a> 7263 } 7264 </div> 7265 </div> 7266 } 7267 7268 @helper RenderFooterPayments() 7269 { 7270 <div class="footer__content dw-mod"> 7271 <div class="collection dw-mod"> 7272 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 7273 { 7274 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 7275 string paymentImage = null; 7276 string paymentTitle = paymentItem.SelectedName; 7277 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 7278 if (selected != null) 7279 { 7280 paymentImage = selected.Icon; 7281 } 7282 7283 <div class="footer__card-type"> 7284 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle" /> 7285 </div> 7286 } 7287 </div> 7288 </div> 7289 } 7290 7291 @helper RenderFooterCopyright() 7292 { 7293 <div class="grid__col-12 footer__copyright dw-mod"> 7294 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 7295 </div> 7296 } 7297 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7298 7299 @using System 7300 @using System.Web 7301 @using System.Collections.Generic 7302 @using Dynamicweb.Rapido.Blocks.Extensibility 7303 @using Dynamicweb.Rapido.Blocks 7304 @using Dynamicweb.Ecommerce.Common 7305 7306 @{ 7307 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 7308 7309 Block masterScriptReferences = new Block() 7310 { 7311 Id = "MasterScriptReferences", 7312 SortId = 1, 7313 Template = RenderMasterScriptReferences() 7314 }; 7315 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 7316 } 7317 7318 @helper RenderMasterScriptReferences() { 7319 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"></script> 7320 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script> 7321 7322 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 7323 { 7324 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script> 7325 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js"); 7326 } 7327 7328 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 7329 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js"); 7330 } 7331 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7332 7333 @using System 7334 @using System.Web 7335 @using System.Collections.Generic 7336 @using Dynamicweb.Rapido.Blocks.Extensibility 7337 @using Dynamicweb.Rapido.Blocks 7338 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7339 @using Dynamicweb.Rapido.Services 7340 7341 @{ 7342 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 7343 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 7344 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 7345 7346 if (!navigationItemsHideSearch || isFavoriteList) 7347 { 7348 Block masterSearchScriptTemplates = new Block() 7349 { 7350 Id = "MasterSearchScriptTemplates", 7351 SortId = 1, 7352 Template = RenderSearchScriptTemplates() 7353 }; 7354 7355 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 7356 } 7357 } 7358 7359 @helper RenderSearchScriptTemplates() 7360 { 7361 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 7362 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 7363 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 7364 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 7365 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 7366 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 7367 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 7368 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 7369 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7370 7371 <script id="SearchGroupsTemplate" type="text/x-template"> 7372 {{#.}} 7373 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 7374 {{/.}} 7375 </script> 7376 7377 <script id="SearchProductsTemplate" type="text/x-template"> 7378 {{#each .}} 7379 {{#Product}} 7380 {{#ifCond template "!==" "SearchMore"}} 7381 <li class="dropdown__item dropdown__item--seperator dw-mod"> 7382 @if (useFacebookPixel) 7383 { 7384 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 7385 } 7386 @if (useGoogleTagManager) 7387 { 7388 <text>{{{googleEnchantImpression googleImpression}}}</text> 7389 } 7390 <div> 7391 <a href="{{link}}" 7392 class="js-typeahead-link u-color-inherit u-pull--left" 7393 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 7394 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 7395 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"></div> 7396 <div class="u-pull--left"> 7397 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}{{#if variantName}}, {{variantName}}{{/if}}</div> 7398 @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 7399 { 7400 if (pointShopOnly) 7401 { 7402 <text> 7403 {{#if havePointPrice}} 7404 <div> 7405 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 7406 </div> 7407 {{else}} 7408 <small class="help-text u-no-margin">@Translate("Not available")</small> 7409 {{/if}} 7410 {{#unless canBePurchasedWithPoints}} 7411 {{#if havePointPrice}} 7412 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 7413 {{/if}} 7414 {{/unless}} 7415 </text> 7416 } 7417 else 7418 { 7419 <div>{{price}}</div> 7420 } 7421 } 7422 </div> 7423 </a> 7424 <div class="u-margin-left u-pull--right"> 7425 @{ 7426 var viewBtn = new Link 7427 { 7428 Href = "{{link}}", 7429 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 7430 ButtonLayout = ButtonLayout.Secondary, 7431 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside", 7432 Title = Translate("View") 7433 }; 7434 } 7435 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7436 { 7437 <text>{{#ifCond hideBuyButton '==' 'False'}}</text> 7438 @Render(new AddToCartButton 7439 { 7440 HideTitle = true, 7441 ProductId = "{{productId}}", 7442 ProductInfo = "{{productInfo}}", 7443 BuyForPoints = pointShopOnly, 7444 OnClick = "{{facebookPixelAction}}", 7445 CssClass = "u-w80px u-no-margin js-ignore-click-outside", 7446 Icon = new Icon { 7447 CssClass = "js-ignore-click-outside" 7448 }, 7449 ExtraAttributes = new Dictionary<string, string> 7450 { 7451 { "{{disabledBuyButton}}", "" } 7452 } 7453 }) 7454 <text>{{else}}</text> 7455 @Render(viewBtn) 7456 <text>{{/ifCond}}</text> 7457 } 7458 else if (showViewButton) 7459 { 7460 @Render(viewBtn) 7461 } 7462 @if (showAddToDownloadButton) 7463 { 7464 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 7465 <i class="fas fa-plus js-button-icon"></i> 7466 </button> 7467 } 7468 </div> 7469 </div> 7470 </li> 7471 {{/ifCond}} 7472 {{#ifCond template "===" "SearchMore"}} 7473 {{>SearchMoreProducts}} 7474 {{/ifCond}} 7475 {{/Product}} 7476 {{else}} 7477 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7478 @Translate("Your search gave 0 results") 7479 </li> 7480 {{/each}} 7481 </script> 7482 7483 <script id="SearchMoreProducts" type="text/x-template"> 7484 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7485 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7486 @Translate("View all") 7487 </a> 7488 </li> 7489 </script> 7490 7491 <script id="SearchMorePages" type="text/x-template"> 7492 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7493 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7494 @Translate("View all") 7495 </a> 7496 </li> 7497 </script> 7498 7499 <script id="SearchPagesTemplate" type="text/x-template"> 7500 {{#each .}} 7501 {{#ifCond template "!==" "SearchMore"}} 7502 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 7503 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 7504 <div class="u-margin-right u-inline"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 7505 <div class="u-inline u-va-middle"><div class="u-bold u-truncate-text u-max-w210px u-inline-block js-typeahead-name">{{name}}</div></div> 7506 </a> 7507 </li> 7508 {{/ifCond}} 7509 {{#ifCond template "===" "SearchMore"}} 7510 {{>SearchMorePages}} 7511 {{/ifCond}} 7512 {{else}} 7513 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7514 @Translate("Your search gave 0 results") 7515 </li> 7516 {{/each}} 7517 </script> 7518 7519 <script id="SearchPagesTemplateWrap" type="text/x-template"> 7520 <div class="dropdown__column-header">@Translate("Pages")</div> 7521 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7522 {{>SearchPagesTemplate}} 7523 </ul> 7524 </script> 7525 7526 <script id="SearchProductsTemplateWrap" type="text/x-template"> 7527 <div class="dropdown__column-header">@Translate("Products")</div> 7528 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7529 {{>SearchProductsTemplate}} 7530 </ul> 7531 </script> 7532 } 7533 7534 @using Dynamicweb.Rapido.Blocks.Components 7535 @using Dynamicweb.Rapido.Blocks.Components.General 7536 @using Dynamicweb.Rapido.Blocks 7537 @using System.IO 7538 7539 7540 @using Dynamicweb.Rapido.Blocks.Components.General 7541 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7542 7543 7544 @* Component *@ 7545 7546 @helper RenderVariantMatrix(VariantMatrix settings) { 7547 if (settings != null) 7548 { 7549 int productLoopCounter = 0; 7550 int groupCount = 0; 7551 List<VariantOption> firstDimension = new List<VariantOption>(); 7552 List<VariantOption> secondDimension = new List<VariantOption>(); 7553 List<VariantOption> thirdDimension = new List<VariantOption>(); 7554 7555 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 7556 { 7557 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 7558 { 7559 if (groupCount == 0) { 7560 firstDimension.Add(variantOptions); 7561 } 7562 if (groupCount == 1) 7563 { 7564 secondDimension.Add(variantOptions); 7565 } 7566 if (groupCount == 2) 7567 { 7568 thirdDimension.Add(variantOptions); 7569 } 7570 } 7571 groupCount++; 7572 } 7573 7574 int rowCount = 0; 7575 int columnCount = 0; 7576 7577 <script> 7578 var variantsCollection = []; 7579 </script> 7580 7581 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 7582 @if (groupCount == 1) 7583 { 7584 <tbody> 7585 @foreach (VariantOption firstVariantOption in firstDimension) 7586 { 7587 var variantId = firstVariantOption.Id; 7588 <tr> 7589 <td class="u-bold"> 7590 @firstVariantOption.Name 7591 </td> 7592 <td> 7593 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7594 </td> 7595 </tr> 7596 productLoopCounter++; 7597 } 7598 7599 <tr> 7600 <td>&nbsp;</td> 7601 <td> 7602 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7603 </td> 7604 </tr> 7605 </tbody> 7606 } 7607 @if (groupCount == 2) 7608 { 7609 <thead> 7610 <tr> 7611 <td>&nbsp;</td> 7612 @foreach (VariantOption variant in secondDimension) 7613 { 7614 <td>@variant.Name</td> 7615 } 7616 </tr> 7617 </thead> 7618 <tbody> 7619 @foreach (VariantOption firstVariantOption in firstDimension) 7620 { 7621 string variantId = ""; 7622 columnCount = 0; 7623 7624 <tr> 7625 <td class="u-min-w120px">@firstVariantOption.Name</td> 7626 7627 @foreach (VariantOption secondVariantOption in secondDimension) 7628 { 7629 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 7630 <td> 7631 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7632 </td> 7633 7634 columnCount++; 7635 7636 productLoopCounter++; 7637 } 7638 7639 <td> 7640 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7641 </td> 7642 </tr> 7643 7644 rowCount++; 7645 } 7646 7647 @{ 7648 columnCount = 0; 7649 } 7650 7651 <tr> 7652 <td>&nbsp;</td> 7653 @foreach (VariantOption secondVariantOption in secondDimension) 7654 { 7655 <td> 7656 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7657 </td> 7658 7659 columnCount++; 7660 } 7661 <td>&nbsp;</td> 7662 </tr> 7663 </tbody> 7664 } 7665 @if (groupCount == 3) 7666 { 7667 <thead> 7668 <tr> 7669 <td>&nbsp;</td> 7670 @foreach (VariantOption thirdVariantOption in thirdDimension) 7671 { 7672 <td>@thirdVariantOption.Name</td> 7673 } 7674 </tr> 7675 </thead> 7676 <tbody> 7677 @foreach (VariantOption firstVariantOption in firstDimension) 7678 { 7679 int colspan = (thirdDimension.Count + 1); 7680 7681 <tr> 7682 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 7683 </tr> 7684 7685 foreach (VariantOption secondVariantOption in secondDimension) 7686 { 7687 string variantId = ""; 7688 columnCount = 0; 7689 7690 <tr> 7691 <td class="u-min-w120px">@secondVariantOption.Name</td> 7692 7693 @foreach (VariantOption thirdVariantOption in thirdDimension) 7694 { 7695 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 7696 7697 <td> 7698 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7699 </td> 7700 7701 columnCount++; 7702 productLoopCounter++; 7703 } 7704 7705 <td> 7706 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7707 </td> 7708 </tr> 7709 rowCount++; 7710 } 7711 } 7712 7713 @{ 7714 columnCount = 0; 7715 } 7716 7717 <tr> 7718 <td>&nbsp;</td> 7719 @foreach (VariantOption thirdVariantOption in thirdDimension) 7720 { 7721 <td> 7722 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7723 </td> 7724 7725 columnCount++; 7726 } 7727 <td>&nbsp;</td> 7728 </tr> 7729 </tbody> 7730 } 7731 </table> 7732 7733 <script> 7734 document.addEventListener("DOMContentLoaded", function (event) { 7735 MatrixUpdateQuantity("@settings.ProductId"); 7736 }); 7737 7738 MatrixUpdateQuantity = function (productId) { 7739 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 7740 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 7741 7742 var qtyRowArr = []; 7743 var qtyColumnArr = []; 7744 7745 var totalQty = 0; 7746 7747 for (var i = 0; i < allQtyFields.length; i++) { 7748 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 7749 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 7750 } 7751 7752 for (var i = 0; i < allQtyFields.length; i++) { 7753 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 7754 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 7755 totalQty += parseFloat(allQtyFields[i].value); 7756 } 7757 7758 //Update row counters 7759 for (var i = 0; i < qtyRowArr.length; i++) { 7760 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7761 7762 if (qtyRowArr[i] != undefined && qtyCounter != null) { 7763 var currentCount = qtyCounter.innerHTML; 7764 qtyCounter.innerHTML = qtyRowArr[i]; 7765 7766 if (currentCount != qtyCounter.innerHTML) { 7767 qtyCounter.classList.add("qty-field--active"); 7768 } 7769 } 7770 7771 } 7772 7773 //Update column counters 7774 for (var i = 0; i < qtyColumnArr.length; i++) { 7775 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7776 7777 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 7778 var currentCount = qtyCounter.innerHTML; 7779 qtyCounter.innerHTML = qtyColumnArr[i]; 7780 7781 if (currentCount != qtyCounter.innerHTML) { 7782 qtyCounter.classList.add("qty-field--active"); 7783 } 7784 } 7785 } 7786 7787 if (document.getElementById("TotalQtyCount_" + productId)) { 7788 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 7789 } 7790 7791 //Clean up animations 7792 setTimeout(function () { 7793 for (var i = 0; i < qtyRowArr.length; i++) { 7794 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7795 if (qtyCounter != null) { 7796 qtyCounter.classList.remove("qty-field--active"); 7797 } 7798 } 7799 for (var i = 0; i < qtyColumnArr.length; i++) { 7800 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7801 if (qtyCounter != null) { 7802 qtyCounter.classList.remove("qty-field--active"); 7803 } 7804 } 7805 }, 1000); 7806 } 7807 </script> 7808 } 7809 } 7810 7811 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 7812 { 7813 string loopCount = productLoopCounter.ToString(); 7814 7815 bool combinationFound = false; 7816 double stock = 0; 7817 double quantityValue = 0; 7818 string note = ""; 7819 7820 VariantProduct variantProduct = null; 7821 7822 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 7823 { 7824 stock = variantProduct.Stock; 7825 quantityValue = variantProduct.Quantity; 7826 combinationFound = true; 7827 } 7828 7829 if (combinationFound) 7830 { 7831 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 7832 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 7833 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 7834 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 7835 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 7836 7837 if (stock != 0) 7838 { 7839 <small>@Translate("Stock") @stock</small> 7840 } 7841 7842 <script> 7843 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 7844 variantsCollection.push(variants); 7845 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 7846 </script> 7847 } 7848 else 7849 { 7850 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 7851 } 7852 } 7853 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7854 7855 @* Component *@ 7856 7857 @helper RenderAddToCart(AddToCart settings) 7858 { 7859 //set Id for quantity selector to get it's value from button 7860 if (settings.QuantitySelector != null) 7861 { 7862 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 7863 { 7864 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 7865 } 7866 7867 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 7868 7869 if (settings.Disabled) 7870 { 7871 settings.QuantitySelector.Disabled = true; 7872 } 7873 7874 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 7875 { 7876 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 7877 } 7878 } 7879 7880 if (settings.Disabled) 7881 { 7882 settings.AddButton.Disabled = true; 7883 } 7884 7885 settings.AddButton.CssClass += " btn--condensed"; 7886 7887 //unitsSelector 7888 if (settings.UnitSelector != null) 7889 { 7890 if (settings.Disabled) 7891 { 7892 settings.QuantitySelector.Disabled = true; 7893 } 7894 } 7895 7896 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7897 @if (settings.UnitSelector != null) 7898 { 7899 @Render(settings.UnitSelector) 7900 } 7901 @if (settings.QuantitySelector != null) 7902 { 7903 @Render(settings.QuantitySelector) 7904 } 7905 @Render(settings.AddButton) 7906 </div> 7907 } 7908 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7909 7910 @* Component *@ 7911 7912 @helper RenderAddToCartButton(AddToCartButton settings) 7913 { 7914 if (!settings.HideTitle) 7915 { 7916 if (string.IsNullOrEmpty(settings.Title)) 7917 { 7918 if (settings.BuyForPoints) 7919 { 7920 settings.Title = Translate("Buy with points"); 7921 } 7922 else 7923 { 7924 settings.Title = Translate("Add to cart"); 7925 } 7926 } 7927 } 7928 else 7929 { 7930 settings.Title = ""; 7931 } 7932 7933 if (settings.Icon == null) 7934 { 7935 settings.Icon = new Icon(); 7936 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 7937 } 7938 7939 if (string.IsNullOrEmpty(settings.Icon.Name)) 7940 { 7941 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 7942 } 7943 7944 settings.OnClick = "Cart.AddToCart(event, { " + 7945 "id: '" + settings.ProductId + "'," + 7946 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 7947 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 7948 (settings.BuyForPoints ? "buyForPoints: true," : "") + 7949 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 7950 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 7951 "});" + settings.OnClick; 7952 7953 @RenderButton(settings) 7954 } 7955 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7956 7957 @* Component *@ 7958 7959 @helper RenderUnitSelector(UnitSelector settings) 7960 { 7961 if (string.IsNullOrEmpty(settings.Id)) 7962 { 7963 settings.Id = Guid.NewGuid().ToString("N"); 7964 } 7965 var disabledClass = settings.Disabled ? "disabled" : ""; 7966 7967 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 7968 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7969 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 7970 <div class="dropdown__content dw-mod"> 7971 @settings.OptionsContent 7972 </div> 7973 <label class="dropdown-trigger-off" for="@settings.Id"></label> 7974 </div> 7975 } 7976 @using System.Reflection 7977 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7978 7979 @* Component *@ 7980 7981 @helper RenderQuantitySelector(QuantitySelector settings) 7982 { 7983 var attributes = new Dictionary<string, string>(); 7984 7985 /*base settings*/ 7986 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 7987 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 7988 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 7989 if (settings.Disabled) { attributes.Add("disabled", "true"); } 7990 if (settings.Required) { attributes.Add("required", "true"); } 7991 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 7992 /*end*/ 7993 7994 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 7995 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 7996 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 7997 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 7998 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 7999 if (settings.Min == null) { settings.Min = 1; } 8000 attributes.Add("min", settings.Min.ToString()); 8001 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 8002 if (settings.Value == null) { settings.Value = 1; } 8003 attributes.Add("value", settings.Value.ToString()); 8004 attributes.Add("type", "number"); 8005 8006 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8007 8008 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 8009 } 8010 @using Dynamicweb.Rapido.Blocks.Components 8011 8012 @using Dynamicweb.Frontend 8013 @using Dynamicweb.Frontend.Devices 8014 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8015 @using Dynamicweb.Rapido.Blocks.Components.General 8016 @using System.Collections.Generic; 8017 8018 @* Component *@ 8019 8020 @helper RenderCustomerCenterList(CustomerCenterList settings) 8021 { 8022 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 8023 string hideActions = isTouchDevice ? "u-block" : ""; 8024 8025 <table class="table data-list dw-mod"> 8026 @if (settings.GetHeaders().Length > 0) { 8027 <thead> 8028 <tr class="u-bold"> 8029 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 8030 { 8031 var attributes = new Dictionary<string, string>(); 8032 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 8033 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 8034 attributes.Add("align", header.Align.ToString()); 8035 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8036 8037 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 8038 } 8039 </tr> 8040 </thead> 8041 } 8042 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 8043 { 8044 int columnCount = 0; 8045 int totalColumns = listItem.GetInfoItems().Length; 8046 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 8047 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 8048 8049 var attributes = new Dictionary<string, string>(); 8050 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 8051 8052 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8053 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 8054 <tr> 8055 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 8056 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 8057 8058 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 8059 @if (!string.IsNullOrEmpty(listItem.Title)) { 8060 <div class="u-bold">@listItem.Title</div> 8061 } 8062 @if (!string.IsNullOrEmpty(listItem.Description)) { 8063 <div>@listItem.Description</div> 8064 } 8065 </td> 8066 } 8067 8068 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 8069 { 8070 var infoAttributes = new Dictionary<string, string>(); 8071 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 8072 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 8073 infoAttributes.Add("align", infoItem.Align.ToString()); 8074 8075 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8076 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 8077 8078 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 8079 @if (!string.IsNullOrEmpty(infoItem.Title)) { 8080 <div>@infoItem.Title</div> 8081 } 8082 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 8083 <div><small>@infoItem.Subtitle</small></div> 8084 } 8085 </td> 8086 8087 columnCount++; 8088 } 8089 </tr> 8090 <tr> 8091 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 8092 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 8093 @foreach (ButtonBase action in listItem.GetActions()) 8094 { 8095 action.ButtonLayout = ButtonLayout.LinkClean; 8096 action.Icon.CssClass += " u-full-height"; 8097 action.CssClass += " data-list__action-button link"; 8098 8099 @Render(action) 8100 } 8101 </div> 8102 </td> 8103 </tr> 8104 </tbody> 8105 } 8106 </table> 8107 } 8108 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 8109 8110 @using System 8111 @using System.Web 8112 @using System.Collections.Generic 8113 @using Dynamicweb.Rapido.Blocks.Extensibility 8114 @using Dynamicweb.Rapido.Blocks 8115 8116 @{ 8117 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 8118 8119 Block primaryBottomSnippets = new Block() 8120 { 8121 Id = "MasterJavascriptInitializers", 8122 SortId = 100, 8123 Template = RenderPrimaryBottomSnippets() 8124 }; 8125 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 8126 8127 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 8128 { 8129 Block miniCartPageId = new Block 8130 { 8131 Id = "MiniCartPageId", 8132 Template = RenderMiniCartPageId() 8133 }; 8134 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, miniCartPageId); 8135 } 8136 } 8137 8138 @helper RenderPrimaryBottomSnippets() 8139 { 8140 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 8141 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 8142 8143 if (isWireframeMode) 8144 { 8145 <script> 8146 Wireframe.Init(true); 8147 </script> 8148 } 8149 8150 8151 if (useGoogleTagManager) 8152 { 8153 @*<script> 8154 document.addEventListener('addToCart', function(event) { 8155 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 8156 if (typeof googleImpression == "string") { 8157 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 8158 } 8159 dataLayer.push({ 8160 'event': 'addToCart', 8161 'ecommerce': { 8162 'currencyCode': googleImpression.currency, 8163 'add': { 8164 'products': [{ 8165 'name': googleImpression.name, 8166 'id': googleImpression.id, 8167 'price': googleImpression.price, 8168 'brand': googleImpression.brand, 8169 'category': googleImpression.category, 8170 'variant': googleImpression.variant, 8171 'quantity': event.detail.quantity 8172 }] 8173 } 8174 } 8175 }); 8176 }); 8177 </script>*@ 8178 8179 <script> 8180 document.addEventListener('addToCart', function(event) { 8181 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 8182 if (typeof googleImpression == "string") { 8183 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 8184 } 8185 8186 gtag("event", "add_to_cart", { 8187 currency: googleImpression.currency, 8188 value: googleImpression.price, 8189 items: [ 8190 { 8191 item_id: googleImpression.id, 8192 item_name: googleImpression.name, 8193 item_variant: googleImpression.variant, 8194 currency: googleImpression.currency, 8195 item_list_id: "", 8196 price: googleImpression.price, 8197 quantity: event.detail.quantity 8198 } 8199 ] 8200 }); 8201 }); 8202 </script> 8203 } 8204 8205 //if digitalwarehouse 8206 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 8207 { 8208 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 8209 8210 if (string.IsNullOrEmpty(cartContextId)) 8211 { 8212 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 8213 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 8214 cartContextId = cartSettings.OrderContextID; 8215 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 8216 } 8217 8218 <script> 8219 let downloadCart = new DownloadCart({ 8220 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 8221 contextId: "@cartContextId", 8222 addButtonText: "@Translate("Add")", 8223 removeButtonText: "@Translate("Remove")" 8224 }); 8225 </script> 8226 } 8227 8228 <!--$$Javascripts--> 8229 } 8230 8231 @helper RenderMiniCartPageId() 8232 { 8233 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 8234 <script> 8235 window.cartId = "@miniCartFeedPageId"; 8236 </script> 8237 } 8238 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 8239 8240 @using System 8241 @using System.Web 8242 @using System.Collections.Generic 8243 @using Dynamicweb.Rapido.Blocks 8244 8245 @{ 8246 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 8247 8248 Block masterFooterSocialLinksCustom = new Block 8249 { 8250 Id = "MasterFooterSocialLinks", 8251 SortId = 50, 8252 Template = RenderFooterSocialLinksCustom(), 8253 Design = new Design 8254 { 8255 Size = "auto", 8256 RenderType = RenderType.Column 8257 } 8258 }; 8259 masterCustomBlocksPage.ReplaceBlock(masterFooterSocialLinksCustom); 8260 8261 masterCustomBlocksPage.RemoveBlockById("MasterDesktopToolsText"); 8262 8263 if (Pageview.AreaID != 25) 8264 { 8265 Block facebookChat = new Block 8266 { 8267 Id = "FacebookChat", 8268 SortId = 1, 8269 Template = RenderFacebookChat() 8270 }; 8271 masterCustomBlocksPage.Add("Body", facebookChat); 8272 } 8273 8274 Block googleAdsSiteTag = new Block() 8275 { 8276 Id = "GoogleAdsSiteTag", 8277 SortId = 3, 8278 Template = RenderGoogleAdsSiteTag() 8279 }; 8280 8281 masterCustomBlocksPage.Add("Head", googleAdsSiteTag); 8282 8283 Block facebookPixelCustom = new Block() 8284 { 8285 Id = "FacebookPixel", 8286 SortId = 2, 8287 Template = RenderFacebookPixelCustom() 8288 }; 8289 masterCustomBlocksPage.ReplaceBlock(facebookPixelCustom); 8290 } 8291 8292 @helper RenderFacebookPixelCustom() 8293 { 8294 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 8295 string productId = System.Web.HttpContext.Current.Request.QueryString.Get("ProductID") != null ? System.Web.HttpContext.Current.Request.QueryString.Get("ProductID") : "0"; 8296 8297 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 8298 { 8299 <!-- Facebook Pixel Code --> 8300 <script> 8301 !function(f,b,e,v,n,t,s) 8302 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 8303 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 8304 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 8305 n.queue=[];t=b.createElement(e);t.async=!0; 8306 t.src=v;s=b.getElementsByTagName(e)[0]; 8307 s.parentNode.insertBefore(t,s)}(window, document,'script', 8308 'https://connect.facebook.net/en_US/fbevents.js'); 8309 fbq('init', '@FacebookPixelID'); 8310 fbq('track', 'PageView'); 8311 fbq('track', 'ViewContent', { 8312 content_ids: @productId, 8313 content_type: "product", 8314 8315 }); 8316 </script> 8317 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript> 8318 } 8319 } 8320 8321 @helper RenderFooterSocialLinksCustom() 8322 { 8323 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 8324 <div class="footer__content dw-mod"> 8325 <div class="collection dw-mod"> 8326 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 8327 { 8328 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 8329 string socialIconClass = socialIcon.SelectedValue; 8330 string socialIconTitle = socialIcon.SelectedName; 8331 string socialLink = socialitem.GetString("Link"); 8332 8333 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a> 8334 } 8335 </div> 8336 </div> 8337 8338 <div> 8339 <script src="//www.tryggehandel.no/?cid=1353&logo=1" alt="Trygg handel"></script> 8340 </div> 8341 8342 <div style="margin-top: 3rem; display: flex; flex-direction: column; align-items: flex-start;"> 8343 <img height="50" width="100" src="https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg" alt="Klarna" /> 8344 <img height="50" width="100" src="/Files/Images/Payment/vipps-rgb-orange-pos.svg" alt="Vipps" /> 8345 </div> 8346 } 8347 8348 @helper RenderFacebookChat() 8349 { 8350 <div></div> 8351 } 8352 8353 @helper RenderFacebookChatOld() 8354 { 8355 <!-- Messenger Chattillegg Code --> 8356 <div id="fb-root"></div> 8357 8358 <!-- Your Chattillegg code --> 8359 <div id="fb-customer-chat" 8360 class="fb-customerchat" 8361 logged_in_greeting='@Translate("fb_logged_in_greeting")' 8362 logged_out_greeting='@Translate("fb_logged_out_greeting")' 8363 theme_color="#364a55" 8364 greeting_dialog_display="hide"> 8365 8366 </div> 8367 8368 <script> 8369 var chatbox = document.getElementById('fb-customer-chat'); 8370 chatbox.setAttribute("page_id", "223600817672082"); 8371 chatbox.setAttribute("attribution", "biz_inbox"); 8372 </script> 8373 8374 <!-- Your SDK code --> 8375 <script> 8376 window.fbAsyncInit = function() { 8377 FB.init({ 8378 xfbml : true, 8379 version : 'v12.0' 8380 }); 8381 }; 8382 8383 (function(d, s, id) { 8384 var js, fjs = d.getElementsByTagName(s)[0]; 8385 if (d.getElementById(id)) return; 8386 js = d.createElement(s); js.id = id; 8387 js.src = 'https://connect.facebook.net/nb_NO/sdk/xfbml.customerchat.js'; 8388 fjs.parentNode.insertBefore(js, fjs); 8389 }(document, 'script', 'facebook-jssdk')); 8390 </script> 8391 } 8392 8393 @helper RenderGoogleAdsSiteTag() 8394 { 8395 <!-- Global site tag (gtag.js) - Google Ads: 1000865186 --> 8396 <script async src="https://www.googletagmanager.com/gtag/js?id=AW-1000865186"></script> 8397 <script> 8398 window.dataLayer = window.dataLayer || []; 8399 function gtag(){dataLayer.push(arguments);} 8400 gtag('js', new Date()); 8401 8402 gtag('config', 'AW-1000865186'); 8403 </script> 8404 } 8405 8406 8407 @functions { 8408 public class ManifestIcon 8409 { 8410 public string src { get; set; } 8411 public string type { get; set; } 8412 public string sizes { get; set; } 8413 } 8414 8415 public class Manifest 8416 { 8417 public string name { get; set; } 8418 public string short_name { get; set; } 8419 public string start_url { get; set; } 8420 public string display { get; set; } 8421 public string background_color { get; set; } 8422 public string theme_color { get; set; } 8423 public List<ManifestIcon> icons { get; set; } 8424 } 8425 } 8426 8427 <!DOCTYPE html> 8428 8429 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 8430 8431 8432 8433 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 8434 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 8435 8436 8437 8438 @helper RenderMasterHead() { 8439 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 8440 8441 <head> 8442 <!-- Rapido version 3.4.2 --> 8443 8444 @RenderBlockList(subBlocks) 8445 </head> 8446 } 8447 8448 @helper RenderMasterMetadata() { 8449 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 8450 var brandColors = swatches.GetColorSwatch(1); 8451 string brandColorOne = brandColors.Palette["BrandColor1"]; 8452 8453 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 8454 Manifest manifest = new Manifest 8455 { 8456 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 8457 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"), 8458 start_url = "/", 8459 display = "standalone", 8460 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 8461 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 8462 }; 8463 8464 manifest.icons = new List<ManifestIcon> { 8465 new ManifestIcon { 8466 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8467 sizes = "192x192", 8468 type = "image/png" 8469 }, 8470 new ManifestIcon { 8471 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8472 sizes = "512x512", 8473 type = "image/png" 8474 }, 8475 new ManifestIcon { 8476 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8477 sizes = "1024x1024", 8478 type = "image/png" 8479 } 8480 }; 8481 8482 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 8483 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 8484 string currentManifest = File.ReadAllText(manifestFilePath); 8485 8486 if (manifestJSON != currentManifest) 8487 { 8488 File.WriteAllText(manifestFilePath, manifestJSON); 8489 } 8490 } 8491 8492 <meta charset="utf-8" /> 8493 <title>@Model.Title</title> 8494 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8495 <meta name="robots" content="index, follow"> 8496 <meta name="theme-color" content="@brandColorOne" /> 8497 8498 if (!Model.MetaTags.Contains("og:image")) { 8499 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage"))); 8500 } 8501 8502 if (!Model.MetaTags.Contains("og:description")) { 8503 Pageview.Meta.AddTag("og:description", Model.Description); 8504 } 8505 8506 8507 Pageview.Meta.AddTag("og:title", Model.Title); 8508 Pageview.Meta.AddTag("og:site_name", Model.Name); 8509 Pageview.Meta.AddTag("og:url", string.Format("{0}{1}", "https://skadedyrbutikken.no", HttpContext.Current.Request.RawUrl.ToString())); 8510 Pageview.Meta.AddTag("og:type", "Website"); 8511 8512 if (!string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"))) { 8513 Pageview.Meta.AddTag("fb:app_id", Model.Area.Item.GetItem("Settings").GetString("FacebookAppID")); 8514 } 8515 8516 @Model.MetaTags 8517 } 8518 8519 @helper RenderMasterCss() { 8520 var fonts = new string[] { 8521 getFontFamily("Layout", "HeaderFont"), 8522 getFontFamily("Layout", "SubheaderFont"), 8523 getFontFamily("Layout", "TertiaryHeaderFont"), 8524 getFontFamily("Layout", "BodyText"), 8525 getFontFamily("Layout", "Header", "ToolsFont"), 8526 getFontFamily("Layout", "Header", "NavigationFont"), 8527 getFontFamily("Layout", "MobileNavigation", "Font"), 8528 getFontFamily("ProductList", "Facets", "HeaderFont"), 8529 getFontFamily("ProductPage", "PriceFontDesign"), 8530 getFontFamily("Ecommerce", "SaleSticker", "Font"), 8531 getFontFamily("Ecommerce", "NewSticker", "Font"), 8532 getFontFamily("Ecommerce", "CustomSticker", "Font") 8533 }; 8534 8535 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 8536 string test = "/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css" + "?ticks=" + Model.Area.UpdatedDate.Ticks; 8537 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 8538 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 8539 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 8540 if (useFontAwesomePro) 8541 { 8542 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 8543 } 8544 8545 //Favicon 8546 <link href="@favicon" rel="icon" type="image/png"> 8547 8548 //Base (Default, wireframe) styles 8549 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 8550 8551 //Rapido Css from Website Settings 8552 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 8553 8554 //Ignite Css (Custom site specific styles) 8555 <link rel="stylesheet" id="igniteCss" type="text/css" href="@test"> 8556 8557 //Font awesome 8558 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 8559 8560 //Flag icon 8561 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 8562 8563 //Google fonts 8564 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x))); 8565 8566 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 8567 8568 PushPromise(favicon); 8569 PushPromise(fontAwesomeCssLink); 8570 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 8571 PushPromise(autoCssLink); 8572 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 8573 PushPromise("/Files/Images/placeholder.gif"); 8574 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 8575 } 8576 8577 @helper RenderMasterManifest() { 8578 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 8579 { 8580 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 8581 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 8582 } 8583 } 8584 8585 @helper RenderMasterBody() { 8586 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 8587 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 8588 if (!String.IsNullOrEmpty(designLayout)) { 8589 designLayout = "class=\"" + designLayout + "\""; 8590 } 8591 8592 <body @designLayout> 8593 @RenderBlockList(subBlocks) 8594 </body> 8595 } 8596 8597 @helper RenderMasterHeader() 8598 { 8599 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 8600 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8601 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 8602 8603 <header class="top-container @stickyTop dw-mod" id="Top"> 8604 @RenderBlockList(subBlocks) 8605 </header> 8606 } 8607 8608 @helper RenderMain() 8609 { 8610 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 8611 8612 <main class="site dw-mod"> 8613 @RenderBlockList(subBlocks) 8614 </main> 8615 } 8616 8617 @helper RenderPageContent() 8618 { 8619 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8620 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 8621 8622 <div id="Page" class="page @pagePos"> 8623 <section class="center-container content-container dw-mod" id="content"> 8624 8625 @RenderSnippet("Content") 8626 </section> 8627 </div> 8628 } 8629 8630 @* Hack to support nested helpers *@ 8631 @SnippetStart("Content") 8632 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8633 8634 8635 @using Dynamicweb.Extensibility 8636 @using Dynamicweb.Core 8637 @using Dynamicweb.Rapido.Blocks.Components 8638 @using Dynamicweb.Rapido.Blocks.Components.Articles 8639 @using Dynamicweb.Rapido.Blocks.Components.General 8640 @using Dynamicweb.Rapido.Blocks 8641 @using Dynamicweb.Content.Items 8642 @using Dynamicweb.Ecommerce.ProductCatalog 8643 8644 @functions { 8645 BlocksPage articlePage = BlocksPage.GetBlockPage("DynamicArticle"); 8646 8647 public string GetParentSettingsItem(string systemName) { 8648 string item = null; 8649 8650 Dynamicweb.Content.Page current = Dynamicweb.Services.Pages.GetPage(Model.ID); 8651 while (current != null && current.Parent != current) { 8652 var temp = current.Item != null ? current.Item[systemName] : ""; 8653 8654 if (temp != null) { 8655 item = temp.ToString(); 8656 8657 if (!String.IsNullOrEmpty(item) && !String.Equals("default", item, StringComparison.OrdinalIgnoreCase)) { 8658 break; 8659 } 8660 } 8661 8662 current = current.Parent; 8663 } 8664 8665 return item; 8666 } 8667 8668 public string GetArticleCategory(int pageId) 8669 { 8670 string categoryName = null; 8671 8672 //Secure that the article is not in the root folder = Actual has a category 8673 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent != null) { 8674 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent != null) { 8675 if (!String.IsNullOrEmpty(Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent.ItemType)) 8676 { 8677 categoryName = Dynamicweb.Services.Pages.GetPage(pageId).Parent.GetDisplayName(); 8678 } 8679 } 8680 } 8681 8682 return categoryName; 8683 } 8684 8685 public string GetArticleCategoryColor(int pageId) 8686 { 8687 string categoryColor = ""; 8688 8689 //Secure that the article is not in the root folder = Actual has a category 8690 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent != null) { 8691 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent != null) { 8692 if (!String.IsNullOrEmpty(Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent.ItemType)) 8693 { 8694 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Item["CategoryColor"] != null) 8695 { 8696 var service = new ColorSwatchService(); 8697 categoryColor = Dynamicweb.Services.Pages.GetPage(pageId).Parent.Item["CategoryColor"].ToString(); 8698 8699 if (!categoryColor.Contains("#")) { 8700 categoryColor = service.GetHexColor(Converter.ToInt32(Model.Area.ID), categoryColor); 8701 } 8702 } 8703 } 8704 } 8705 } 8706 8707 return categoryColor; 8708 } 8709 } 8710 8711 @{ 8712 string listPageId = Converter.ToString(GetPageIdByNavigationTag("DynamicListFeed")); 8713 string parentPageId = Dynamicweb.Services.Pages.GetPage(Model.ID).Parent.ID.ToString(); 8714 string topLayout = Model.Item.GetList("TopLayout") != null ? Model.Item.GetList("TopLayout").SelectedValue : "default"; 8715 topLayout = topLayout == "default" && GetParentSettingsItem("ArticleTopLayout") != null ? GetParentSettingsItem("ArticleTopLayout").ToString().ToLower() : topLayout; 8716 string textLayout = Model.Item.GetList("TextLayout") != null ? Model.Item.GetList("TextLayout").SelectedValue : "default"; 8717 textLayout = textLayout == "default" && GetParentSettingsItem("ArticleTextLayout") != null ? GetParentSettingsItem("ArticleTextLayout").ToString().ToLower() : textLayout; 8718 string imageLayout = Model.Item.GetList("ImageLayout") != null ? Model.Item.GetList("ImageLayout").SelectedValue : "default"; 8719 imageLayout = imageLayout == "default" && GetParentSettingsItem("ArticleImageLayout") != null ? GetParentSettingsItem("ArticleImageLayout").ToString().ToLower() : imageLayout; 8720 8721 string imageColumns = imageLayout == "straight" && textLayout != "full" ? "8" : "12"; 8722 string contentColumns = textLayout != "full" ? "8" : "12"; 8723 8724 int externalParagraphId = Model.Item.GetItem("CTAParagraphLink") != null ? Model.Item.GetItem("CTAParagraphLink").ParagraphID : 0; 8725 8726 ArticleHeaderLayout headerLayout; 8727 8728 switch (topLayout) 8729 { 8730 case "default": 8731 headerLayout = ArticleHeaderLayout.Clean; 8732 break; 8733 case "split": 8734 headerLayout = ArticleHeaderLayout.Split; 8735 break; 8736 case "banner": 8737 headerLayout = ArticleHeaderLayout.Banner; 8738 break; 8739 case "overlay": 8740 headerLayout = ArticleHeaderLayout.Overlay; 8741 break; 8742 default: 8743 headerLayout = ArticleHeaderLayout.Clean; 8744 break; 8745 } 8746 8747 8748 Block articleContainer = new Block 8749 { 8750 Id = "ArticleContainer", 8751 SortId = 10, 8752 Design = new Design 8753 { 8754 RenderType = RenderType.Row 8755 }, 8756 BlocksList = new List<Block> { 8757 new Block { 8758 Id = "ArticleBody", 8759 SortId = 30, 8760 Design = new Design { 8761 RenderType = RenderType.Column, 8762 Size = "12", 8763 HidePadding = true 8764 } 8765 } 8766 } 8767 }; 8768 articlePage.Add(articleContainer); 8769 8770 ButtonLayout topBannerButtonLayout = ButtonLayout.Primary; 8771 8772 switch (Model.Item.GetString("ButtonDesign")) { 8773 case "primary": 8774 topBannerButtonLayout = ButtonLayout.Primary; 8775 break; 8776 case "secondary": 8777 topBannerButtonLayout = ButtonLayout.Secondary; 8778 break; 8779 case "teritary": 8780 topBannerButtonLayout = ButtonLayout.Tertiary; 8781 break; 8782 case "link": 8783 topBannerButtonLayout = ButtonLayout.Link; 8784 break; 8785 } 8786 8787 ArticleHeader topBanner = new ArticleHeader 8788 { 8789 Layout = headerLayout, 8790 Image = new Image { Path = Model.Item.GetFile("Image"), ImageDefault = new ImageSettings { Width = 1920, Height = 640 } }, 8791 Heading = Model.Item.GetString("Title"), 8792 Subheading = Model.Item.GetString("Summary"), 8793 TextColor = "#fff", 8794 Author = Model.Item.GetString("Author"), 8795 Date = Model.Item.GetString("Date"), 8796 Category = GetArticleCategory(Model.ID), 8797 CategoryColor = GetArticleCategoryColor(Model.ID), 8798 Link = Model.Item.GetString("Link"), 8799 LinkText = Model.Item.GetString("LinkText"), 8800 ButtonLayout = topBannerButtonLayout, 8801 RatingScore = Model.Item.GetString("Rating") != null ? Converter.ToInt32(Model.Item.GetList("Rating").SelectedValue) : 0, 8802 RatingOutOf = Model.Item.GetString("Rating") != null ? Model.Item.GetList("Rating").Options.Count : 0, 8803 ExternalParagraphId = externalParagraphId 8804 }; 8805 8806 Block articleTop = new Block 8807 { 8808 Id = "ArticleHead", 8809 SortId = 20, 8810 Component = topBanner, 8811 Design = new Design 8812 { 8813 RenderType = RenderType.Column, 8814 Size = "12", 8815 HidePadding = true, 8816 CssClass = "article-head" 8817 } 8818 }; 8819 articlePage.Add("ArticleContainer", articleTop); 8820 8821 8822 Block articleBodyRow = new Block 8823 { 8824 Id = "ArticleBodyRow", 8825 SortId = 10, 8826 SkipRenderBlocksList = true 8827 }; 8828 articlePage.Add("ArticleBody", articleBodyRow); 8829 8830 8831 if (Model.Item.GetString("Paragraphs") != null) 8832 { 8833 int count = 0; 8834 foreach (var paragraph in Model.Item.GetItems("Paragraphs")) 8835 { 8836 if (!paragraph.GetBoolean("RenderAsQuote")) 8837 { 8838 string enableDropCap = Model.Item.GetString("EnableDropCap") != null ? Model.Item.GetList("EnableDropCap").SelectedValue.ToLower() : "default"; 8839 enableDropCap = enableDropCap == "default" && GetParentSettingsItem("EnableDropCap") != null ? GetParentSettingsItem("EnableDropCap").ToString().ToLower() : enableDropCap; 8840 string text = paragraph.GetString("Text") != null ? paragraph.GetString("Text") : ""; 8841 8842 if (!String.IsNullOrEmpty(text) && enableDropCap == "true" && count == 0 && paragraph.GetString("Text").Substring(0, 3) == "<p>") 8843 { 8844 string firstLetter = paragraph.GetString("Text").Substring(3, 1); 8845 text = paragraph.GetString("Text").Remove(3, 1); 8846 text = text.Insert(3, "<span class=\"article__drop-cap\">" + firstLetter + "</span>"); 8847 } 8848 8849 if (paragraph.GetFile("Image") != null) 8850 { 8851 string imageTitle = !string.IsNullOrEmpty(paragraph.GetString("Heading")) ? paragraph.GetString("Heading") : ""; 8852 8853 Block articleParagraphImage = new Block 8854 { 8855 Id = "ArticleParagraph" + count + "Image", 8856 SortId = (count * 10), 8857 Design = new Design 8858 { 8859 RenderType = RenderType.Column, 8860 Size = imageColumns, 8861 CssClass = "u-color-light--bg u-padding--lg" 8862 } 8863 }; 8864 8865 if (imageLayout == "banner") 8866 { 8867 ArticleBanner banner = new ArticleBanner 8868 { 8869 Image = new Image { Path = paragraph.GetFile("Image"), ImageDefault = new ImageSettings { Height = 650, Width = 1300 }, Caption = paragraph.GetString("ImageCaption") }, 8870 Heading = imageTitle, 8871 UseFilters = false 8872 }; 8873 articleParagraphImage.Component = banner; 8874 } 8875 else 8876 { 8877 ArticleImage image = new ArticleImage 8878 { 8879 Image = new Image 8880 { 8881 Path = paragraph.GetFile("Image"), 8882 Title = imageTitle, 8883 ImageDefault = new ImageSettings { Height = 650, Width = 1300 }, 8884 Caption = paragraph.GetString("ImageCaption") 8885 } 8886 }; 8887 articleParagraphImage.Component = image; 8888 } 8889 8890 articlePage.Add("ArticleBodyRow", articleParagraphImage); 8891 } 8892 8893 if (!String.IsNullOrEmpty(paragraph.GetString("VideoURL"))) 8894 { 8895 Block articleParagraphVideo = new Block 8896 { 8897 Id = "ArticleParagraph" + count + "Video", 8898 SortId = (count * 10) + 1, 8899 Component = new ArticleVideo { Url = paragraph.GetString("VideoURL"), AutoPlay = "false" }, 8900 Design = new Design 8901 { 8902 RenderType = RenderType.Column, 8903 Size = imageColumns, 8904 CssClass = "u-color-light--bg u-padding--lg" 8905 } 8906 }; 8907 articlePage.Add("ArticleBodyRow", articleParagraphVideo); 8908 } 8909 8910 if (!String.IsNullOrEmpty(paragraph.GetString("Heading"))) 8911 { 8912 Block articleParagraphHeader = new Block 8913 { 8914 Id = "ArticleParagraph" + count + "Heading", 8915 SortId = (count * 10) + 2, 8916 Component = new ArticleSubHeader { Title = paragraph.GetString("Heading") }, 8917 Design = new Design 8918 { 8919 RenderType = RenderType.Column, 8920 Size = contentColumns, 8921 CssClass = "u-color-light--bg u-padding--lg" 8922 } 8923 }; 8924 articlePage.Add("ArticleBodyRow", articleParagraphHeader); 8925 } 8926 8927 if (!String.IsNullOrEmpty(text)) 8928 { 8929 Block articleParagraphText = new Block 8930 { 8931 Id = "ArticleParagraph" + count + "Text", 8932 SortId = (count * 10) + 3, 8933 Component = new ArticleText { Text = text }, 8934 Design = new Design 8935 { 8936 RenderType = RenderType.Column, 8937 Size = contentColumns, 8938 CssClass = "u-color-light--bg u-padding--lg" 8939 } 8940 }; 8941 8942 articlePage.Add("ArticleBodyRow", articleParagraphText); 8943 } 8944 } 8945 else 8946 { 8947 if (!String.IsNullOrEmpty(paragraph.GetString("Text"))) 8948 { 8949 string quoteText = paragraph.GetString("Text") != null ? paragraph.GetString("Text") : ""; 8950 string quoteAuthor = paragraph.GetString("Heading") != null ? paragraph.GetString("Heading") : ""; 8951 8952 Block articleParagraphQuote = new Block 8953 { 8954 Id = "ArticleParagraph" + count + "Quote", 8955 SortId = (count * 10) + 3, 8956 Component = new ArticleQuote { Image = new Image { Path = paragraph.GetFile("Image") }, Text = quoteText, Author = quoteAuthor }, 8957 Design = new Design 8958 { 8959 RenderType = RenderType.Column, 8960 Size = contentColumns, 8961 CssClass = "u-color-light--bg u-padding--lg" 8962 } 8963 }; 8964 articlePage.Add("ArticleBodyRow", articleParagraphQuote); 8965 } 8966 } 8967 8968 8969 count++; 8970 } 8971 } 8972 Block articleProducts = new Block 8973 { 8974 Id = "ArticleProducts", 8975 SortId = 1000, 8976 Template = renderArticleProducts(), 8977 Design = new Design 8978 { 8979 RenderType = RenderType.Column, 8980 Size = "12", 8981 CssClass = "u-color-light--bg u-padding--lg" 8982 } 8983 }; 8984 articlePage.Add("ArticleBodyRow", articleProducts); 8985 8986 articleBodyRow.Component = new ArticleBodyRow { SubBlocks = articleBodyRow.BlocksList, TopLayout = topLayout, TextLayout = textLayout }; 8987 8988 8989 //Related 8990 string showRelatedArtices = Model.Item.GetString("ShowRelatedArticles") != null ? Model.Item.GetList("ShowRelatedArticles").SelectedValue.ToLower() : "default"; 8991 showRelatedArtices = showRelatedArtices == "default" && GetParentSettingsItem("ShowRelatedArticles") != null ? GetParentSettingsItem("ShowRelatedArticles").ToString().ToLower() : showRelatedArtices; 8992 8993 if (showRelatedArtices == "true") 8994 { 8995 Block articleRelated = new Block 8996 { 8997 Id = "ArticleRelated", 8998 SortId = 30, 8999 Component = new ArticleRelated { Title = Translate("Related articles"), FeedPageId = listPageId, Query = "sourceType=Page&sourcePage=" + parentPageId, PageSize = 4, CurrentPageId = Model.ID.ToString() }, 9000 Design = new Design 9001 { 9002 RenderType = RenderType.Column, 9003 Size = "12" 9004 } 9005 }; 9006 articlePage.Add("ArticleContainer", articleRelated); 9007 } 9008 } 9009 9010 9011 @helper renderArticleProducts(){ 9012 9013 ProductListViewModel productlist = Model.Item.GetValue("ProductsArticle") as ProductListViewModel; 9014 9015 if (productlist != null) 9016 { 9017 <div class="grid"> 9018 @foreach (var product in productlist.Products) 9019 { 9020 var productId = Dynamicweb.Ecommerce.Products.Product.GetProductById(product.Id); 9021 var imageService = new Dynamicweb.Ecommerce.Products.ProductImageService(); 9022 var image = imageService.GetDefaultDetailImagePath(productId); 9023 9024 var productPageId = GetPageIdByNavigationTag("ProductsPage"); 9025 var link = "/Default.aspx?ID=" + productPageId + "&productId=" + product.Id; 9026 9027 // MENNT 9028 double? stockCustom = product.StockLevel; 9029 var stockState = ""; 9030 var productType = productId.Type; 9031 9032 if (productType.ToString() == "Bom") 9033 { 9034 var bomItems = productId?.Items; 9035 List<double> bomStockList = new List<double>(); 9036 9037 if (bomItems != null) 9038 { 9039 foreach (var bomItem in bomItems) 9040 { 9041 var bomProductFromApi = Dynamicweb.Ecommerce.Products.Product.GetProductById(bomItem.BomProductId); 9042 var bomQuantity = bomItem.Quantity; 9043 var bomStock = bomProductFromApi.Stock; 9044 var bomStockCaclculated = bomStock / bomQuantity; 9045 var bomStockCaclculatedAsInt = bomStockCaclculated > 0 ? Convert.ToInt32(Math.Floor(bomStockCaclculated)) : 0; 9046 9047 bomStockList.Add(bomStockCaclculatedAsInt); 9048 } 9049 } 9050 9051 stockCustom = bomStockList.Count > 0 ? bomStockList.Min<double>() : 102; 9052 stockState = stockCustom > 0 ? "stock-icon--in" : "stock-icon--not"; 9053 } 9054 // END 9055 9056 9057 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-3 grid__col-xs-6 product-list__grid-item image-hover--zoom dw-mod"> 9058 <div class="grid__col--auto u-no-padding u-full-height"> 9059 <div class="grid__cell product-list__grid-item__image dw-mod "> 9060 <a href="@link" class="u-block u-position-relative image-hover__wrapper dw-mod"> 9061 <img src="@image" class="grid__cell-img grid__cell-img--centered u-padding b-lazy b-loaded" alt="@product.Name"></img> 9062 </a> 9063 </div> 9064 <div class="grid__cell product-list__grid-item__price-info dw-mod"> 9065 <a href="@link" class="u-color-inherit"> 9066 <h6 class="u-condensed-text u-bold">@product.Name</h6> 9067 </a> 9068 <div class="item-number dw-mod">@product.Number</div> 9069 <div class="price price--product-list dw-mod">@product.Price.PriceWithVatFormatted</div> 9070 <div class="vat-price vat-price--product-list u-margin-top dw-mod">eks. MVA (@product.Price.PriceWithoutVatFormatted)</div> 9071 </div> 9072 <div class="product-list__grid-item__footer dw-mod"> 9073 <div class="buttons-collection buttons-collection--center"> 9074 <input type="number" id="Quantity_@product.Number" name="quantity" value="1" min="1" class="dw-mod" /> 9075 <button 9076 id='' 9077 class="btn--sm btn btn--secondary dw-mod" 9078 onclick="Cart.AddToCart(event, { id: '@product.Number',variantId: '',unitId: '',productInfo: {'price':'@product.Price.PriceWithVatFormatted', 'image':'@image', 'name': '@product.Name'},quantity: parseFloat(document.getElementById('Quantity_@product.Number').value) })" 9079 title="@Translate("Legg til")"><i class="fa fa-shopping-cart"></i></button> 9080 </div> 9081 @if(stockCustom > 0) 9082 { 9083 if (stockCustom > 100) 9084 { 9085 <span class="stock-icon stock-icon--in u-no-margin dw-mod"></span> 9086 <span style="font-size:15px">Lagerbeholdning: 100+ stk.</span> 9087 } 9088 else 9089 { 9090 <span class="stock-icon stock-icon--in u-no-margin dw-mod"></span> 9091 <span style="font-size:15px">Lagerbeholdning: @stockCustom stk.</span> 9092 } 9093 } 9094 else 9095 { 9096 <span class="stock-icon stock-icon--out u-no-margin dw-mod"></span> 9097 <span style="font-size:15px">Lagerbeholdning: @stockCustom stk.</span> 9098 } 9099 </div> 9100 </div> 9101 </div> 9102 9103 } 9104 </div> 9105 } 9106 } 9107 9108 @using System 9109 @using System.Web 9110 @using System.Collections.Generic 9111 @using Dynamicweb.Rapido.Blocks 9112 9113 @{ 9114 BlocksPage dynamicArticleCustomBlocksPage = BlocksPage.GetBlockPage("DynamicArticle"); 9115 9116 } 9117 9118 9119 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 9120 @RenderBlockList(articlePage.BlocksRoot.BlocksList) 9121 @SnippetEnd("Content") 9122 9123 @helper RenderIosTabletFix() { 9124 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 9125 { 9126 <script> 9127 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 9128 if (isIpadIOS) { 9129 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 9130 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 9131 } 9132 </script> 9133 } 9134 } 9135 9136 </html> 9137 9138