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