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_bde40651cffd4b7a989aa7c875784946.Execute() in D:\web\denform.dk\Files\Templates\Designs\Rapido\_parsed\DynamicArticle.parsed.cshtml:line 8301
   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 Block cookieInformation = new Block() 3549 { 3550 Id = "CookieInformation", 3551 SortId = 0, 3552 Template = RenderCookieInformation() 3553 3554 }; 3555 topSnippetsBlocksPage.Add("Head", cookieInformation); 3556 3557 3558 if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID)) 3559 { 3560 Block tagManager = new Block() 3561 { 3562 Id = "GoogleAnalytics", 3563 SortId = 1, 3564 Template = RenderGoogleAnalyticsSnippet() 3565 }; 3566 topSnippetsBlocksPage.Add("Head", tagManager); 3567 } 3568 3569 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID)) 3570 { 3571 Block tagManager = new Block() 3572 { 3573 Id = "TagManager", 3574 SortId = 2, 3575 Template = RenderGoogleTagManager() 3576 }; 3577 topSnippetsBlocksPage.Add("Head", tagManager); 3578 3579 Block tagManagerBodySnippet = new Block() 3580 { 3581 Id = "TagManagerBodySnippet", 3582 SortId = 2, 3583 Template = RenderGoogleTagManagerBodySnippet() 3584 }; 3585 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet); 3586 } 3587 3588 Block facebookPixel = new Block() 3589 { 3590 Id = "FacebookPixel", 3591 SortId = 3, 3592 Template = RenderFacebookPixel() 3593 }; 3594 3595 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel); 3596 } 3597 3598 @helper RenderCookieInformation() 3599 { 3600 <script id="CookieConsent" src="https://policy.app.cookieinformation.com/uc.js" data-culture="@CookieLanguageId" type="text/javascript" data-gcm-enabled="false"></script> 3601 } 3602 3603 3604 @helper RenderGoogleAnalyticsSnippet() 3605 { 3606 <!-- Global site tag (gtag.js) - Google Analytics --> 3607 <script async src="" data-category-consent="cookie_cat_statistic" data-consent-src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script> 3608 <script> 3609 window.dataLayer = window.dataLayer || []; 3610 function gtag(){dataLayer.push(arguments);} 3611 gtag('js', new Date()); 3612 3613 gtag('config', '@GoogleAnalyticsID'); 3614 </script> 3615 3616 } 3617 3618 @helper RenderGoogleTagManager() 3619 { 3620 <script> 3621 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 3622 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 3623 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 3624 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 3625 })(window, document, 'script', 'dataLayer', '@GoogleTagManagerID'); 3626 </script> 3627 } 3628 3629 @helper RenderGoogleTagManagerBodySnippet() 3630 { 3631 <!-- Google Tag Manager (noscript) --> 3632 <noscript> 3633 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID" 3634 height="0" width="0" style="display:none;visibility:hidden"></iframe> 3635 </noscript> 3636 <!-- End Google Tag Manager (noscript) --> 3637 } 3638 3639 @helper RenderFacebookPixel() 3640 { 3641 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 3642 3643 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 3644 { 3645 3646 3647 <!-- Facebook Pixel Code --> 3648 <script> 3649 3650 window.addEventListener('CookieInformationConsentGiven', function (event) { 3651 if (CookieInformation.getConsentGivenFor('cookie_cat_marketing')) { 3652 3653 !function(f,b,e,v,n,t,s) 3654 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 3655 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 3656 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 3657 n.queue=[];t=b.createElement(e);t.async=!0; 3658 t.src=v;s=b.getElementsByTagName(e)[0]; 3659 s.parentNode.insertBefore(t,s)}(window, document,'script', 3660 'https://connect.facebook.net/en_US/fbevents.js'); 3661 fbq('init', '@FacebookPixelID'); 3662 fbq('track', 'PageView'); 3663 } 3664 }, false); 3665 </script> 3666 <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> 3667 } 3668 } 3669 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3670 3671 @using System 3672 @using System.Web 3673 @using System.Collections.Generic 3674 @using Dynamicweb.Rapido.Blocks 3675 @using Dynamicweb.Rapido.Blocks.Extensibility 3676 @using Dynamicweb.Security.UserManagement 3677 @using Dynamicweb.Security.UserManagement.ExternalAuthentication 3678 @using Dynamicweb.Rapido.Blocks.Components.General 3679 3680 @{ 3681 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master"); 3682 3683 Block loginModal = new Block() 3684 { 3685 Id = "LoginModal", 3686 SortId = 10, 3687 Component = new Modal 3688 { 3689 Id = "SignIn", 3690 Heading = new Heading 3691 { 3692 Level = 0, 3693 Title = Translate("Sign in") 3694 }, 3695 Width = ModalWidth.Sm, 3696 BodyTemplate = RenderLoginForm() 3697 } 3698 }; 3699 3700 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal); 3701 } 3702 3703 @helper RenderLoginForm() 3704 { 3705 int pageId = Model.TopPage.ID; 3706 string userSignedInErrorText = ""; 3707 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 3708 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 3709 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 3710 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Pageview.Page.ID != GetPageIdByNavigationTag("SignInPage") && Model.LogOnFailed; 3711 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 3712 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 3713 3714 ProviderCollection providers = Provider.GetActiveProviders(); 3715 3716 if (Model.LogOnFailed) 3717 { 3718 switch (Model.LogOnFailedReason) 3719 { 3720 case LogOnFailedReason.PasswordLengthInvalid: 3721 userSignedInErrorText = Translate("Password length is invalid"); 3722 break; 3723 case LogOnFailedReason.IncorrectLogin: 3724 userSignedInErrorText = Translate("Invalid email or password"); 3725 break; 3726 case LogOnFailedReason.ExceededFailedLogOnLimit: 3727 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked"); 3728 break; 3729 case LogOnFailedReason.LoginLocked: 3730 userSignedInErrorText = Translate("The user account is temporarily locked"); 3731 break; 3732 case LogOnFailedReason.PasswordExpired: 3733 userSignedInErrorText = Translate("The password has expired and needs to be renewed"); 3734 break; 3735 default: 3736 userSignedInErrorText = Translate("An unknown error occured"); 3737 break; 3738 } 3739 } 3740 3741 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm" }; 3742 3743 TextField passwordField = new TextField { Id = "login-password", Type = TextFieldType.Password, Name = "password", Label = Translate("Password"), Required = true }; 3744 3745 if (!hideForgotPasswordLink) { 3746 passwordField.Link = new Link { Title = Translate("Forgot password?"), Href = "/Default.aspx?id=" + signInProfilePageId + "&LoginAction=Recovery" }; 3747 } 3748 3749 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) }); 3750 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" }); 3751 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" }); 3752 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" }); 3753 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true }); 3754 form.Add(passwordField); 3755 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error }); 3756 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") }); 3757 form.Add(new Button { ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event)" }); 3758 3759 foreach (Provider LoginProvider in providers) 3760 { 3761 var ProviderName = LoginProvider.Name.ToLower(); 3762 form.Add(new Link { 3763 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID, 3764 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After }, 3765 ButtonLayout = ButtonLayout.LinkClean, 3766 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName, 3767 AltText = ProviderName 3768 }); 3769 } 3770 3771 if (!hideCreateAccountLink) { 3772 form.Add(new Text { Content = "<div class=\"u-border-top u-full-width u-margin-bottom--lg\"></div>" }); 3773 form.Add(new Link 3774 { 3775 Href = "/Default.aspx?id=" + createAccountPageId, 3776 ButtonLayout = ButtonLayout.LinkClean, 3777 Title = Translate("Create account"), 3778 CssClass = "u-full-width u-ta-center" 3779 }); 3780 } 3781 3782 @Render(form) 3783 3784 if (showModalOnStart) 3785 { 3786 <script> 3787 document.getElementById("SignInModalTrigger").checked = true; 3788 </script> 3789 } 3790 } 3791 3792 3793 3794 3795 3796 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3797 { 3798 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3799 3800 @using System 3801 @using System.Web 3802 @using System.Collections.Generic 3803 @using Dynamicweb.Rapido.Blocks.Extensibility 3804 @using Dynamicweb.Rapido.Blocks 3805 @using Dynamicweb.Rapido.Services 3806 3807 3808 @functions { 3809 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3810 } 3811 3812 @{ 3813 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"; 3814 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 3815 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed(); 3816 3817 Block mobileHeader = new Block() 3818 { 3819 Id = "MobileTop", 3820 SortId = 10, 3821 Template = RenderMobileTop(), 3822 SkipRenderBlocksList = true 3823 }; 3824 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader); 3825 3826 Block mobileHeaderNavigation = new Block() 3827 { 3828 Id = "MobileHeaderNavigation", 3829 SortId = 10, 3830 Template = RenderMobileHeaderNavigation(), 3831 SkipRenderBlocksList = true, 3832 BlocksList = new List<Block> { 3833 new Block { 3834 Id = "MobileHeaderNavigationTrigger", 3835 SortId = 10, 3836 Template = RenderMobileHeaderNavigationTrigger() 3837 } 3838 } 3839 }; 3840 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation); 3841 3842 Block mobileHeaderLogo = new Block() 3843 { 3844 Id = "MobileHeaderLogo", 3845 SortId = 20, 3846 Template = RenderMobileHeaderLogo(), 3847 SkipRenderBlocksList = true 3848 }; 3849 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo); 3850 3851 Block mobileHeaderActions = new Block() 3852 { 3853 Id = "MobileHeaderActions", 3854 SortId = 30, 3855 Template = RenderMobileTopActions(), 3856 SkipRenderBlocksList = true 3857 }; 3858 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions); 3859 3860 if (!mobileHideSearch) 3861 { 3862 Block mobileHeaderSearch = new Block 3863 { 3864 Id = "MobileHeaderSearch", 3865 SortId = 10, 3866 Template = RenderMobileTopSearch() 3867 }; 3868 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch); 3869 } 3870 3871 Block mobileHeaderMiniCart; 3872 3873 if (!mobileHideCart) 3874 { 3875 mobileHeaderMiniCart = new Block 3876 { 3877 Id = "MobileHeaderMiniCart", 3878 SortId = 20, 3879 Template = RenderMobileTopMiniCart() 3880 }; 3881 3882 Block miniCartCounterScriptTemplate = new Block 3883 { 3884 Id = "MiniCartCounterScriptTemplate", 3885 Template = RenderMobileMiniCartCounterContent() 3886 }; 3887 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 3888 } 3889 else 3890 { 3891 mobileHeaderMiniCart = new Block 3892 { 3893 Id = "MobileHeaderMiniCart", 3894 SortId = 20 3895 }; 3896 } 3897 3898 if (!mobileHideSearch) 3899 { 3900 Block mobileHeaderSearchBar = new Block() 3901 { 3902 Id = "MobileHeaderSearchBar", 3903 SortId = 30, 3904 Template = RenderMobileTopSearchBar() 3905 }; 3906 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar); 3907 } 3908 3909 switch (mobileTopLayout) 3910 { 3911 case "nav-left": 3912 mobileHeaderNavigation.SortId = 10; 3913 mobileHeaderLogo.SortId = 20; 3914 mobileHeaderActions.SortId = 30; 3915 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3916 break; 3917 case "nav-right": 3918 mobileHeaderLogo.SortId = 10; 3919 mobileHeaderActions.SortId = 20; 3920 mobileHeaderNavigation.SortId = 30; 3921 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3922 break; 3923 case "nav-search-left": 3924 mobileHeaderNavigation.SortId = 10; 3925 mobileHeaderLogo.SortId = 20; 3926 mobileHeaderActions.SortId = 30; 3927 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3928 break; 3929 case "search-left": 3930 mobileHeaderActions.SortId = 10; 3931 mobileHeaderLogo.SortId = 20; 3932 mobileHeaderNavigation.SortId = 30; 3933 mobileHeaderMiniCart.SortId = 0; 3934 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3935 break; 3936 } 3937 } 3938 3939 3940 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3941 3942 @using System 3943 @using System.Web 3944 @using Dynamicweb.Rapido.Blocks.Extensibility 3945 @using Dynamicweb.Rapido.Blocks 3946 3947 @{ 3948 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3949 } 3950 3951 3952 3953 3954 @helper RenderMobileTop() { 3955 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList(); 3956 3957 <nav class="main-navigation-mobile dw-mod"> 3958 <div class="center-container top-container__center-container dw-mod"> 3959 <div class="grid grid--align-center"> 3960 @RenderBlockList(subBlocks) 3961 </div> 3962 </div> 3963 </nav> 3964 } 3965 3966 @helper RenderMobileHeaderNavigation() { 3967 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList(); 3968 3969 <div class="grid__col-auto-width"> 3970 <ul class="menu dw-mod"> 3971 @RenderBlockList(subBlocks) 3972 </ul> 3973 </div> 3974 } 3975 3976 @helper RenderMobileHeaderNavigationTrigger() { 3977 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 3978 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label> 3979 </li> 3980 } 3981 3982 @helper RenderMobileHeaderLogo() { 3983 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList(); 3984 3985 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"; 3986 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : ""; 3987 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 3988 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName"); 3989 3990 string mobileLogo = "/Files/Images/logo-dynamicweb.png"; 3991 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null) 3992 { 3993 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded; 3994 } 3995 3996 if (Path.GetExtension(mobileLogo).ToLower() != ".svg") 3997 { 3998 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&amp;width=100&amp;crop=5&amp;Compression=75&amp;image=" + mobileLogo; 3999 } 4000 else 4001 { 4002 mobileLogo = HttpUtility.UrlDecode(mobileLogo); 4003 } 4004 4005 <div class="grid__col-auto grid__col--bleed"> 4006 <div class="grid__cell @centeredLogo"> 4007 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod"> 4008 @*<img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />*@ 4009 <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> 4010 </a> 4011 </div> 4012 4013 @RenderBlockList(subBlocks) 4014 </div> 4015 } 4016 4017 @helper RenderMobileTopActions() { 4018 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList(); 4019 4020 <div class="grid__col-auto-width"> 4021 <ul class="menu dw-mod"> 4022 @RenderBlockList(subBlocks) 4023 </ul> 4024 </div> 4025 } 4026 4027 @helper RenderMobileTopSearch() { 4028 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4029 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4030 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 4031 </label> 4032 </li> 4033 } 4034 4035 @helper RenderMobileTopMiniCart() { 4036 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 4037 int cartPageId = GetPageIdByNavigationTag("CartPage"); 4038 double cartProductsCount = Model.Cart.TotalProductsCount; 4039 4040 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper"> 4041 <div class="mini-cart dw-mod"> 4042 <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"> 4043 <div class="u-inline u-position-relative"> 4044 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i> 4045 <div class="mini-cart__counter dw-mod"> 4046 <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"> 4047 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount"> 4048 @cartProductsCount 4049 </div> 4050 </div> 4051 </div> 4052 </div> 4053 </a> 4054 </div> 4055 </li> 4056 } 4057 4058 @helper RenderMobileTopSearchBar() 4059 { 4060 string searchFeedId = ""; 4061 string searchSecondFeedId = ""; 4062 int groupsFeedId; 4063 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4064 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4065 string resultPageLink; 4066 string searchPlaceholder; 4067 string searchType = "product-search"; 4068 string searchTemplate; 4069 string searchContentTemplate = ""; 4070 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4071 bool showGroups = true; 4072 4073 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4074 { 4075 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4076 resultPageLink = contentSearchPageLink; 4077 searchPlaceholder = Translate("Search page"); 4078 groupsFeedId = 0; 4079 searchType = "content-search"; 4080 searchTemplate = "SearchPagesTemplate"; 4081 showGroups = false; 4082 } 4083 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4084 { 4085 searchFeedId = productsPageId + "&feed=true"; 4086 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4087 resultPageLink = Converter.ToString(productsPageId); 4088 searchPlaceholder = Translate("Search products or pages"); 4089 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4090 searchType = "combined-search"; 4091 searchTemplate = "SearchProductsTemplateWrap"; 4092 searchContentTemplate = "SearchPagesTemplateWrap"; 4093 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4094 } 4095 else 4096 { 4097 resultPageLink = Converter.ToString(productsPageId); 4098 searchFeedId = productsPageId + "&feed=true"; 4099 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4100 searchPlaceholder = Translate("Search products"); 4101 searchTemplate = "SearchProductsTemplate"; 4102 searchType = "product-search"; 4103 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4104 } 4105 4106 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" /> 4107 4108 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4109 <div class="center-container top-container__center-container dw-mod"> 4110 <div class="grid"> 4111 <div class="grid__col-auto"> 4112 <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"> 4113 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4114 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4115 { 4116 <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> 4117 } 4118 else 4119 { 4120 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4121 <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> 4122 <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> 4123 </div> 4124 } 4125 <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> 4126 </div> 4127 </div> 4128 <div class="grid__col-auto-width"> 4129 <ul class="menu dw-mod"> 4130 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4131 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4132 <i class="fas fa-times fa-1_5x"></i> 4133 </label> 4134 </li> 4135 </ul> 4136 </div> 4137 </div> 4138 </div> 4139 </div> 4140 } 4141 4142 @helper RenderMobileMiniCartCounterContent() 4143 { 4144 <script id="MiniCartCounterContent" type="text/x-template"> 4145 {{#.}} 4146 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 4147 {{numberofproducts}} 4148 </div> 4149 {{/.}} 4150 </script> 4151 } 4152 </text> 4153 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4154 4155 @using System 4156 @using System.Web 4157 @using System.Collections.Generic 4158 @using Dynamicweb.Rapido.Blocks.Extensibility 4159 @using Dynamicweb.Rapido.Blocks 4160 4161 @functions { 4162 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4163 } 4164 4165 @{ 4166 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4167 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4168 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4169 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4170 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4171 bool mobileHideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4172 4173 Block mobileNavigation = new Block() 4174 { 4175 Id = "MobileNavigation", 4176 SortId = 10, 4177 Template = MobileNavigation(), 4178 SkipRenderBlocksList = true 4179 }; 4180 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4181 4182 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4183 { 4184 Block mobileNavigationSignIn = new Block 4185 { 4186 Id = "MobileNavigationSignIn", 4187 SortId = 10, 4188 Template = RenderMobileNavigationSignIn() 4189 }; 4190 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4191 } 4192 4193 Block mobileNavigationMenu = new Block 4194 { 4195 Id = "MobileNavigationMenu", 4196 SortId = 20, 4197 Template = RenderMobileNavigationMenu() 4198 }; 4199 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4200 4201 Block mobileNavigationActions = new Block 4202 { 4203 Id = "MobileNavigationActions", 4204 SortId = 30, 4205 Template = RenderMobileNavigationActions(), 4206 SkipRenderBlocksList = true 4207 }; 4208 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4209 4210 if (!mobileNavigationItemsHideSignIn) 4211 { 4212 if (Model.CurrentUser.ID <= 0) 4213 { 4214 Block mobileNavigationSignInAction = new Block 4215 { 4216 Id = "MobileNavigationSignInAction", 4217 SortId = 10, 4218 Template = RenderMobileNavigationSignInAction() 4219 }; 4220 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4221 4222 if (!mobileHideCreateAccountLink) 4223 { 4224 Block mobileNavigationCreateAccountAction = new Block 4225 { 4226 Id = "MobileNavigationCreateAccountAction", 4227 SortId = 20, 4228 Template = RenderMobileNavigationCreateAccountAction() 4229 }; 4230 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4231 } 4232 } 4233 else 4234 { 4235 if (!mobileHideMyOrdersLink) 4236 { 4237 Block mobileNavigationOrdersAction = new Block 4238 { 4239 Id = "MobileNavigationOrdersAction", 4240 SortId = 20, 4241 Template = RenderMobileNavigationOrdersAction() 4242 }; 4243 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4244 } 4245 if (!mobileHideMyFavoritesLink) 4246 { 4247 Block mobileNavigationFavoritesAction = new Block 4248 { 4249 Id = "MobileNavigationFavoritesAction", 4250 SortId = 30, 4251 Template = RenderMobileNavigationFavoritesAction() 4252 }; 4253 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction); 4254 } 4255 if (!mobileHideMySavedCardsLink) 4256 { 4257 Block mobileNavigationSavedCardsAction = new Block 4258 { 4259 Id = "MobileNavigationFavoritesAction", 4260 SortId = 30, 4261 Template = RenderMobileNavigationSavedCardsAction() 4262 }; 4263 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4264 } 4265 4266 Block mobileNavigationSignOutAction = new Block 4267 { 4268 Id = "MobileNavigationSignOutAction", 4269 SortId = 40, 4270 Template = RenderMobileNavigationSignOutAction() 4271 }; 4272 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4273 } 4274 } 4275 4276 if (Model.Languages.Count > 1) 4277 { 4278 Block mobileNavigationLanguagesAction = new Block 4279 { 4280 Id = "MobileNavigationLanguagesAction", 4281 SortId = 50, 4282 Template = RenderMobileNavigationLanguagesAction() 4283 }; 4284 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4285 } 4286 } 4287 4288 4289 @helper MobileNavigation() 4290 { 4291 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4292 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4293 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4294 4295 <!-- Trigger for mobile navigation --> 4296 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4297 4298 <!-- Mobile navigation --> 4299 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4300 <button type="button" class="mobile-navigation-close" onclick="document.getElementById('MobileNavTrigger').checked = false"> 4301 <i class="fal fa-times"></i> 4302 </button> 4303 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper"> 4304 @RenderBlockList(subBlocks) 4305 </div> 4306 </nav> 4307 4308 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4309 } 4310 4311 @helper RenderMobileNavigationSignIn() 4312 { 4313 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4314 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4315 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4316 string myProfilePageLink = linkStart + myProfilePageId; 4317 string userName = Model.CurrentUser.FirstName; 4318 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4319 { 4320 userName += " " + Model.CurrentUser.LastName; 4321 } 4322 if (string.IsNullOrEmpty(userName)) 4323 { 4324 userName = Model.CurrentUser.Name; 4325 } 4326 if (string.IsNullOrEmpty(userName)) 4327 { 4328 userName = Model.CurrentUser.UserName; 4329 } 4330 if (string.IsNullOrEmpty(userName)) 4331 { 4332 userName = Model.CurrentUser.Email; 4333 } 4334 4335 <ul class="menu menu-mobile"> 4336 <li class="menu-mobile__item"> 4337 <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> 4338 </li> 4339 </ul> 4340 } 4341 4342 @helper RenderMobileNavigationMenu() 4343 { 4344 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4345 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4346 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4347 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4348 int startLevel = 0; 4349 4350 @RenderNavigation(new 4351 { 4352 id = "mobilenavigation", 4353 cssclass = "menu menu-mobile dwnavigation", 4354 startLevel = @startLevel, 4355 ecomStartLevel = @startLevel + 1, 4356 endlevel = @levels, 4357 expandmode = "all", 4358 template = @menuTemplate 4359 }) 4360 4361 if (isSlidesDesign) 4362 { 4363 <script> 4364 function goToLevel(level) { 4365 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4366 } 4367 4368 document.addEventListener('DOMContentLoaded', function () { 4369 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4370 }); 4371 </script> 4372 } 4373 4374 if (renderPagesInToolBar) 4375 { 4376 @RenderNavigation(new 4377 { 4378 id = "topToolsMobileNavigation", 4379 cssclass = "menu menu-mobile dwnavigation", 4380 template = "ToolsMenuForMobile.xslt" 4381 }) 4382 } 4383 } 4384 4385 @helper RenderMobileNavigationActions() 4386 { 4387 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4388 4389 <ul class="menu menu-mobile"> 4390 @RenderBlockList(subBlocks) 4391 </ul> 4392 } 4393 4394 @helper RenderMobileNavigationSignInAction() 4395 { 4396 <li class="menu-mobile__item"> 4397 <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> 4398 </li> 4399 } 4400 4401 @helper RenderMobileNavigationCreateAccountAction() 4402 { 4403 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4404 4405 <li class="menu-mobile__item"> 4406 <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> 4407 </li> 4408 } 4409 4410 @helper RenderMobileNavigationProfileAction() 4411 { 4412 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4413 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4414 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4415 string myProfilePageLink = linkStart + myProfilePageId; 4416 4417 <li class="menu-mobile__item"> 4418 <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> 4419 </li> 4420 } 4421 4422 @helper RenderMobileNavigationOrdersAction() 4423 { 4424 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4425 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4426 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4427 string myOrdersPageLink = linkStart + myOrdersPageId; 4428 string ordersIcon = "fas fa-list"; 4429 4430 <li class="menu-mobile__item"> 4431 <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> 4432 </li> 4433 } 4434 4435 @helper RenderMobileNavigationFavoritesAction() 4436 { 4437 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4438 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4439 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4440 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4441 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"; 4442 4443 4444 <li class="menu-mobile__item"> 4445 <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> 4446 </li> 4447 } 4448 4449 @helper RenderMobileNavigationSavedCardsAction() 4450 { 4451 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4452 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4453 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4454 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4455 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"; 4456 4457 <li class="menu-mobile__item"> 4458 <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> 4459 </li> 4460 } 4461 4462 @helper RenderMobileNavigationSignOutAction() 4463 { 4464 int pageId = Model.TopPage.ID; 4465 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"; 4466 4467 <li class="menu-mobile__item"> 4468 <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> 4469 </li> 4470 } 4471 4472 @helper RenderMobileNavigationLanguagesAction() 4473 { 4474 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4475 4476 string selectedLanguage = ""; 4477 foreach (var lang in Model.Languages) 4478 { 4479 if (lang.IsCurrent) 4480 { 4481 selectedLanguage = lang.Name; 4482 } 4483 } 4484 4485 <li class="menu-mobile__item dw-mod"> 4486 @if (isSlidesDesign) 4487 { 4488 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4489 } 4490 else 4491 { 4492 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4493 } 4494 <div class="menu-mobile__link__wrap"> 4495 <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> 4496 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4497 </div> 4498 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4499 @if (isSlidesDesign) 4500 { 4501 <li class="menu-mobile__item dw-mod"> 4502 <div class="menu-mobile__link__wrap"> 4503 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4504 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back u-hidden"></label> 4505 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link menu-mobile__link--back dw-mod">@Translate("Back")</label> 4506 </div> 4507 </li> 4508 } 4509 @foreach (var lang in Model.Languages) 4510 { 4511 <li class="menu-mobile__item dw-mod"> 4512 <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> 4513 </li> 4514 } 4515 </ul> 4516 </li> 4517 }</text> 4518 } 4519 else 4520 { 4521 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4522 4523 @using System 4524 @using System.Web 4525 @using System.Collections.Generic 4526 @using Dynamicweb.Rapido.Blocks.Extensibility 4527 @using Dynamicweb.Rapido.Blocks 4528 4529 @functions { 4530 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4531 } 4532 4533 @{ 4534 Block masterTools = new Block() 4535 { 4536 Id = "MasterDesktopTools", 4537 SortId = 10, 4538 Template = RenderDesktopTools(), 4539 SkipRenderBlocksList = true, 4540 BlocksList = new List<Block> 4541 { 4542 new Block { 4543 Id = "MasterDesktopToolsText", 4544 SortId = 10, 4545 Template = RenderDesktopToolsText(), 4546 Design = new Design 4547 { 4548 Size = "auto", 4549 HidePadding = true, 4550 RenderType = RenderType.Column 4551 } 4552 }, 4553 new Block { 4554 Id = "MasterDesktopToolsNavigation", 4555 SortId = 20, 4556 Template = RenderDesktopToolsNavigation(), 4557 Design = new Design 4558 { 4559 Size = "auto-width", 4560 HidePadding = true, 4561 RenderType = RenderType.Column 4562 } 4563 } 4564 } 4565 }; 4566 headerBlocksPage.Add("MasterHeader", masterTools); 4567 4568 Block masterDesktopExtra = new Block() 4569 { 4570 Id = "MasterDesktopExtra", 4571 SortId = 10, 4572 Template = RenderDesktopExtra(), 4573 SkipRenderBlocksList = true 4574 }; 4575 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4576 4577 Block masterDesktopNavigation = new Block() 4578 { 4579 Id = "MasterDesktopNavigation", 4580 SortId = 20, 4581 Template = RenderDesktopNavigation(), 4582 SkipRenderBlocksList = true 4583 }; 4584 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4585 } 4586 4587 @* Include the Blocks for the page *@ 4588 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4589 4590 @using System 4591 @using System.Web 4592 @using Dynamicweb.Rapido.Blocks.Extensibility 4593 @using Dynamicweb.Rapido.Blocks 4594 4595 @{ 4596 Block masterDesktopLogo = new Block 4597 { 4598 Id = "MasterDesktopLogo", 4599 SortId = 10, 4600 Template = RenderDesktopLogo(), 4601 Design = new Design 4602 { 4603 Size = "auto-width", 4604 HidePadding = true, 4605 RenderType = RenderType.Column, 4606 CssClass = "grid--align-self-center" 4607 } 4608 }; 4609 4610 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4611 } 4612 4613 4614 @helper RenderDesktopLogo() 4615 { 4616 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4617 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4618 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4619 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4620 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 4621 if (Path.GetExtension(logo).ToLower() != ".svg") 4622 { 4623 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 4624 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 4625 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 4626 } 4627 else 4628 { 4629 logo = HttpUtility.UrlDecode(logo); 4630 } 4631 4632 @*<div class="logo @alignClass dw-mod">*@ 4633 <a href="/" class="logo dw-mod u-block"> 4634 @*<img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" />*@ 4635 <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> 4636 </a> 4637 @*</div>*@ 4638 } 4639 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4640 4641 @using System 4642 @using System.Web 4643 @using Dynamicweb.Rapido.Blocks.Extensibility 4644 @using Dynamicweb.Rapido.Blocks 4645 4646 @functions { 4647 bool isMegaMenu; 4648 } 4649 4650 @{ 4651 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 4652 Block masterDesktopMenu = new Block 4653 { 4654 Id = "MasterDesktopMenu", 4655 SortId = 10, 4656 Template = RenderDesktopMenu(), 4657 Design = new Design 4658 { 4659 Size = "auto", 4660 HidePadding = true, 4661 RenderType = RenderType.Column 4662 } 4663 }; 4664 4665 if (isMegaMenu) 4666 { 4667 masterDesktopMenu.Design.CssClass = "u-reset-position"; 4668 } 4669 4670 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 4671 } 4672 4673 @helper RenderDesktopMenu() 4674 { 4675 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4676 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 4677 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 4678 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 4679 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4680 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 4681 int startLevel = renderPagesInToolBar ? 1 : 0; 4682 4683 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 4684 4685 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 4686 @if (!isMegaMenu) 4687 { 4688 @RenderNavigation(new 4689 { 4690 id = "topnavigation", 4691 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4692 startLevel = startLevel, 4693 ecomStartLevel = startLevel + 1, 4694 endlevel = 5, 4695 expandmode = "all", 4696 template = "BaseMenuWithDropdown.xslt" 4697 }); 4698 } 4699 else 4700 { 4701 @RenderNavigation(new 4702 { 4703 id = "topnavigation", 4704 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4705 startLevel = startLevel, 4706 ecomStartLevel = startLevel + 1, 4707 endlevel = 5, 4708 promotionImage = megamenuPromotionImage, 4709 promotionLink = promotionLink, 4710 expandmode = "all", 4711 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 4712 template = "BaseMegaMenu.xslt" 4713 }); 4714 } 4715 </div> 4716 } 4717 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4718 4719 @using System 4720 @using System.Web 4721 @using Dynamicweb.Rapido.Blocks.Extensibility 4722 @using Dynamicweb.Rapido.Blocks 4723 4724 @{ 4725 Block masterDesktopActionsMenu = new Block 4726 { 4727 Id = "MasterDesktopActionsMenu", 4728 SortId = 10, 4729 Template = RenderDesktopActionsMenu(), 4730 Design = new Design 4731 { 4732 CssClass = "u-flex" 4733 }, 4734 SkipRenderBlocksList = true 4735 4736 }; 4737 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 4738 4739 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 4740 { 4741 Block masterDesktopActionsHeaderButton = new Block 4742 { 4743 Id = "MasterDesktopActionsHeaderButton", 4744 SortId = 60, 4745 Template = RenderHeaderButton() 4746 }; 4747 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 4748 } 4749 } 4750 4751 @helper RenderDesktopActionsMenu() 4752 { 4753 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 4754 4755 <ul class="menu u-flex dw-mod"> 4756 @RenderBlockList(subBlocks) 4757 </ul> 4758 } 4759 4760 @helper RenderHeaderButton() 4761 { 4762 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 4763 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 4764 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 4765 4766 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 4767 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-left" href="@headerButtonLink">@headerButtonText</a> 4768 </li> 4769 } 4770 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4771 4772 @using System 4773 @using System.Web 4774 @using Dynamicweb.Core; 4775 @using System.Text.RegularExpressions 4776 @using Dynamicweb.Rapido.Blocks.Extensibility 4777 @using Dynamicweb.Rapido.Blocks 4778 4779 @{ 4780 Block masterDesktopActionsMenuLanguageSelector = new Block 4781 { 4782 Id = "MasterDesktopActionsMenuLanguageSelector", 4783 SortId = 40, 4784 Template = RenderLanguageSelector() 4785 }; 4786 4787 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 4788 } 4789 4790 @helper RenderLanguageSelector() 4791 { 4792 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4793 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 4794 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4795 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() : ""; 4796 string widthClass = "menu__item--fixed-width"; 4797 if (Model.Languages.Count > 1) 4798 { 4799 <li id="miniLanguageSelector" class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 4800 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 4801 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i> 4802 </div> 4803 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 4804 @foreach (var lang in Model.Languages) 4805 { 4806 string langCode = Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower(); 4807 string langInfo = "<span class=\"flag-icon flag-icon-" + langCode + " u-margin-right\"></span>" + lang.Name; 4808 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4809 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4810 string link = "/Default.aspx?AreaID=" + Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID; 4811 4812 if (langCode == "se") 4813 { 4814 link = "https://www.denform.se/"; 4815 } 4816 else if (langCode == "de") 4817 { 4818 link = "https://www.denform.de/"; 4819 } 4820 4821 if (languageViewType == "flag-culture") 4822 { 4823 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName; 4824 } 4825 4826 if (languageViewType == "flag") 4827 { 4828 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>"; 4829 widthClass = ""; 4830 } 4831 4832 if (languageViewType == "name") 4833 { 4834 langInfo = lang.Name; 4835 } 4836 4837 if (languageViewType == "culture") 4838 { 4839 langInfo = cultureName; 4840 widthClass = ""; 4841 } 4842 4843 <div class="menu__item dw-mod @widthClass"> 4844 <a href="@link" class="menu-dropdown__link dw-mod">@langInfo</a> 4845 </div> 4846 } 4847 @* Links to service forms *@ 4848 <div class="menu__item dw-mod @widthClass"> 4849 <a href="https://denform.dk/Default.aspx?ID=11236" class="menu-dropdown__link dw-mod"><span class="flag-icon flag-icon-gb"></span></a> 4850 </div> 4851 <div class="menu__item dw-mod @widthClass"> 4852 <a href="https://denform.dk/Default.aspx?ID=11203" class="menu-dropdown__link dw-mod"><span class="flag-icon flag-icon-fr"></span></a> 4853 </div> 4854 <div class="menu__item dw-mod @widthClass"> 4855 <a href="https://denform.dk/Default.aspx?ID=11228" class="menu-dropdown__link dw-mod"><span class="flag-icon flag-icon-is"></span></a> 4856 </div> 4857 </div> 4858 </li> 4859 } 4860 } 4861 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4862 4863 @using System 4864 @using System.Web 4865 @using Dynamicweb.Rapido.Blocks.Extensibility 4866 @using Dynamicweb.Rapido.Blocks 4867 4868 @{ 4869 Block masterDesktopActionsMenuSignIn = new Block 4870 { 4871 Id = "MasterDesktopActionsMenuSignIn", 4872 SortId = 20, 4873 Template = RenderSignIn() 4874 }; 4875 4876 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 4877 } 4878 4879 @helper RenderSignIn() 4880 { 4881 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4882 string userInitials = ""; 4883 int pageId = Model.TopPage.ID; 4884 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4885 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 4886 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4887 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4888 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4889 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4890 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 4891 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4892 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4893 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4894 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4895 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4896 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 4897 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4898 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 4899 4900 string linkStart = "/Default.aspx?ID="; 4901 if (Model.CurrentUser.ID <= 0) 4902 { 4903 linkStart += signInProfilePageId + "&RedirectPageId="; 4904 } 4905 4906 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 4907 string myProfilePageLink = linkStart + myProfilePageId; 4908 string myOrdersPageLink = linkStart + myOrdersPageId; 4909 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4910 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4911 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 4912 4913 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 4914 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"; 4915 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 4916 4917 if (Model.CurrentUser.ID != 0) 4918 { 4919 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 4920 } 4921 4922 if (!navigationItemsHideSignIn) 4923 { 4924 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4925 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 4926 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4927 4928 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod"> 4929 <div class="@menuLinkClass dw-mod"> 4930 @if (Model.CurrentUser.ID <= 0) 4931 { 4932 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x" title="@Translate("Sign in")"></i> 4933 } 4934 else 4935 { 4936 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a> 4937 } 4938 </div> 4939 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 4940 <ul class="list list--clean dw-mod"> 4941 @if (Model.CurrentUser.ID <= 0) 4942 { 4943 <li> 4944 <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> 4945 </li> 4946 4947 if (!hideCreateAccountLink) 4948 { 4949 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 4950 } 4951 if (!hideForgotPasswordLink) 4952 { 4953 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 4954 } 4955 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4956 { 4957 @RenderSeparator() 4958 } 4959 } 4960 @if (!hideMyProfileLink) 4961 { 4962 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 4963 } 4964 @if (!hideMyOrdersLink) 4965 { 4966 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 4967 } 4968 @if (!hideMyFavoritesLink) 4969 { 4970 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 4971 } 4972 @if (!hideMySavedCardsLink) 4973 { 4974 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 4975 } 4976 @if (!hideMyOrderDraftsLink) 4977 { 4978 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 4979 } 4980 @if (Model.CurrentUser.ID > 0) 4981 { 4982 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4983 { 4984 @RenderSeparator() 4985 } 4986 4987 //Check if impersonation is on 4988 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4989 { 4990 <li> 4991 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 4992 @Translate("Sign out") 4993 </div> 4994 </li> 4995 } else { 4996 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 4997 } 4998 } 4999 </ul> 5000 </div> 5001 </li> 5002 } 5003 } 5004 5005 @helper RenderListItem(string link, string text, string icon = null) { 5006 <li> 5007 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)"> 5008 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5009 </a> 5010 </li> 5011 } 5012 5013 @helper RenderSeparator() 5014 { 5015 <li class="list__seperator dw-mod"></li> 5016 } 5017 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5018 5019 @using System 5020 @using System.Web 5021 @using Dynamicweb.Rapido.Blocks.Extensibility 5022 @using Dynamicweb.Rapido.Blocks 5023 5024 @{ 5025 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5026 5027 Block masterDesktopActionsMenuFavorites = new Block 5028 { 5029 Id = "MasterDesktopActionsMenuFavorites", 5030 SortId = 30, 5031 Template = RenderFavorites() 5032 }; 5033 5034 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5035 { 5036 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5037 } 5038 } 5039 5040 @helper RenderFavorites() 5041 { 5042 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5043 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5044 5045 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5046 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5047 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5048 5049 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5050 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5051 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5052 </a> 5053 </li> 5054 } 5055 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5056 5057 @using System 5058 @using System.Web 5059 @using Dynamicweb.Rapido.Blocks.Extensibility 5060 @using Dynamicweb.Rapido.Blocks 5061 @using Dynamicweb.Rapido.Services 5062 5063 @{ 5064 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5065 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5066 5067 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5068 { 5069 Block masterDesktopActionsMenuMiniCart = new Block 5070 { 5071 Id = "MasterDesktopActionsMenuMiniCart", 5072 SortId = 60, 5073 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5074 SkipRenderBlocksList = true, 5075 BlocksList = new List<Block>() 5076 }; 5077 5078 Block miniCartCounterScriptTemplate = new Block 5079 { 5080 Id = "MiniCartCounterScriptTemplate", 5081 Template = RenderMiniCartCounterContent() 5082 }; 5083 5084 //dropdown layout is default 5085 RazorEngine.Templating.TemplateWriter layoutTemplate; 5086 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5087 5088 switch (miniCartLayout) 5089 { 5090 case "dropdown": 5091 layoutTemplate = RenderMiniCartDropdownLayout(); 5092 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5093 break; 5094 case "panel": 5095 layoutTemplate = RenderMiniCartPanelLayout(); 5096 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5097 break; 5098 case "modal": 5099 layoutTemplate = RenderMiniCartModalLayout(); 5100 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5101 break; 5102 case "none": 5103 default: 5104 layoutTemplate = RenderMiniCartDropdownLayout(); 5105 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5106 break; 5107 } 5108 5109 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5110 { 5111 Id = "MiniCartTrigger", 5112 Template = miniCartTriggerTemplate 5113 }); 5114 5115 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5116 { 5117 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5118 { 5119 Id = "MiniCartLayout", 5120 Template = layoutTemplate 5121 }); 5122 } 5123 5124 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5125 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5126 } 5127 5128 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5129 { 5130 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block { 5131 Id = "CartInitialization" 5132 }); 5133 } 5134 } 5135 5136 @helper RenderMiniCart(bool hasMouseEnterEvent) 5137 { 5138 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5139 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5140 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5141 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5142 string mouseEvent = ""; 5143 string id = "MiniCart"; 5144 if (hasMouseEnterEvent) 5145 { 5146 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5147 id = "miniCartTrigger"; 5148 } 5149 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5150 @RenderBlockList(subBlocks) 5151 </li> 5152 } 5153 5154 @helper RenderMiniCartTriggerLabel() 5155 { 5156 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5157 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5158 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5159 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5160 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5161 5162 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')" title="@Translate("Cart")"> 5163 <div class="u-inline u-position-relative"> 5164 <i class="@cartIcon fa-1_5x"></i> 5165 @RenderMiniCartCounter() 5166 </div> 5167 </div> 5168 } 5169 5170 @helper RenderMiniCartTriggerLink() 5171 { 5172 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5173 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5174 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5175 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5176 5177 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5178 <span class="u-inline u-position-relative"> 5179 <i class="@cartIcon fa-1_5x"></i> 5180 @RenderMiniCartCounter() 5181 </span> 5182 </a> 5183 } 5184 5185 @helper RenderMiniCartCounter() 5186 { 5187 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5188 string cartProductsCount = Model.Cart.TotalProductsCount.ToString(); 5189 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5190 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5191 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5192 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5193 5194 if (showPrice && counterPosition == "right") 5195 { 5196 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5197 } 5198 5199 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5200 <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"> 5201 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()"> 5202 @cartProductsCount @cartProductsTotalPrice 5203 </span> 5204 </span> 5205 </span> 5206 } 5207 5208 @helper RenderMiniCartCounterContent() 5209 { 5210 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5211 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5212 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5213 5214 <script id="MiniCartCounterContent" type="text/x-template"> 5215 {{#.}} 5216 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 5217 @if (showPriceInMiniCartCounter) 5218 { 5219 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5220 } 5221 else 5222 { 5223 <text>{{numberofproducts}}</text> 5224 } 5225 </span> 5226 {{/.}} 5227 </script> 5228 } 5229 5230 @helper RenderMiniCartDropdownLayout() 5231 { 5232 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5233 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5234 5235 <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"> 5236 <div class="mini-cart-dropdown__inner dw-mod"> 5237 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5238 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5239 <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> 5240 </div> 5241 </div> 5242 </div> 5243 } 5244 5245 @helper RenderMiniCartPanelLayout() 5246 { 5247 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5248 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5249 5250 <div class="mini-cart grid__cell dw-mod"> 5251 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5252 <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"> 5253 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5254 <div class="panel__content u-full-width dw-mod"> 5255 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3> 5256 <div class="panel__content-body panel__content-body--cart dw-mod"> 5257 <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> 5258 </div> 5259 </div> 5260 </div> 5261 </div> 5262 } 5263 5264 @helper RenderMiniCartModalLayout() 5265 { 5266 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5267 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5268 5269 <div class="mini-cart grid__cell dw-mod"> 5270 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5271 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5272 <label for="miniCartTrigger" class="modal-overlay"></label> 5273 <div class="modal modal--md modal--top-right dw-mod"> 5274 <div class="modal__body u-flex grid--direction-column dw-mod"> 5275 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5276 <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> 5277 </div> 5278 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5279 </div> 5280 </div> 5281 </div> 5282 } 5283 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5284 5285 @using System 5286 @using System.Web 5287 @using Dynamicweb.Rapido.Blocks.Extensibility 5288 @using Dynamicweb.Rapido.Blocks 5289 5290 @{ 5291 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5292 5293 Block masterDesktopActionsMenuOrderDraft = new Block 5294 { 5295 Id = "MasterDesktopActionsMenuOrderDraft", 5296 SortId = 40, 5297 Template = RenderOrderDraft() 5298 }; 5299 5300 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5301 { 5302 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5303 } 5304 } 5305 5306 @helper RenderOrderDraft() 5307 { 5308 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5309 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5310 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5311 5312 5313 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5314 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5315 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5316 5317 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5318 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5319 <span class="u-inline u-position-relative"> 5320 <i class="@draftIcon fa-1_5x"></i> 5321 </span> 5322 </a> 5323 </li> 5324 } 5325 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5326 5327 @using System 5328 @using System.Web 5329 @using Dynamicweb.Rapido.Blocks.Extensibility 5330 @using Dynamicweb.Rapido.Blocks 5331 5332 @{ 5333 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5334 5335 Block masterDesktopActionsMenuDownloadCart = new Block 5336 { 5337 Id = "MasterDesktopActionsMenuDownloadCart", 5338 SortId = 50, 5339 Template = RenderDownloadCart() 5340 }; 5341 5342 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5343 { 5344 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5345 } 5346 } 5347 5348 @helper RenderDownloadCart() 5349 { 5350 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5351 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5352 5353 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5354 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5355 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5356 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5357 5358 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5359 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5360 <span class="u-inline u-position-relative"> 5361 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5362 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5363 </span> 5364 </a> 5365 </li> 5366 } 5367 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5368 5369 @using System 5370 @using System.Web 5371 @using Dynamicweb.Rapido.Blocks.Extensibility 5372 @using Dynamicweb.Rapido.Blocks 5373 5374 @functions { 5375 public class SearchConfiguration 5376 { 5377 public string searchFeedId { get; set; } 5378 public string searchSecondFeedId { get; set; } 5379 public int groupsFeedId { get; set; } 5380 public string resultPageLink { get; set; } 5381 public string searchPlaceholder { get; set; } 5382 public string searchType { get; set; } 5383 public string searchTemplate { get; set; } 5384 public string searchContentTemplate { get; set; } 5385 public string searchValue { get; set; } 5386 public bool showGroups { get; set; } 5387 5388 public SearchConfiguration() 5389 { 5390 searchFeedId = ""; 5391 searchSecondFeedId = ""; 5392 searchType = "product-search"; 5393 searchContentTemplate = ""; 5394 showGroups = true; 5395 } 5396 } 5397 } 5398 @{ 5399 Block masterSearchBar = new Block 5400 { 5401 Id = "MasterSearchBar", 5402 SortId = 40, 5403 Template = RenderSearch("bar"), 5404 Design = new Design 5405 { 5406 Size = "auto", 5407 HidePadding = true, 5408 RenderType = RenderType.Column 5409 } 5410 }; 5411 5412 Block masterSearchAction = new Block 5413 { 5414 Id = "MasterDesktopActionsMenuSearch", 5415 SortId = 10, 5416 Template = RenderSearch() 5417 }; 5418 5419 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5420 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5421 } 5422 5423 @helper RenderSearch(string type = "mini-search") 5424 { 5425 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5426 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5427 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5428 5429 SearchConfiguration searchConfiguration = null; 5430 5431 switch (searchType) { 5432 case "contentSearch": 5433 searchConfiguration = new SearchConfiguration() { 5434 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5435 resultPageLink = contentSearchPageLink, 5436 searchPlaceholder = Translate("Search page"), 5437 groupsFeedId = 0, 5438 searchType = "content-search", 5439 searchTemplate = "SearchPagesTemplate", 5440 showGroups = false 5441 }; 5442 break; 5443 case "combinedSearch": 5444 searchConfiguration = new SearchConfiguration() { 5445 searchFeedId = productsPageId + "&feed=true", 5446 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5447 resultPageLink = Converter.ToString(productsPageId), 5448 searchPlaceholder = Translate("Search products or pages"), 5449 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5450 searchType = "combined-search", 5451 searchTemplate = "SearchProductsTemplateWrap", 5452 searchContentTemplate = "SearchPagesTemplateWrap", 5453 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5454 }; 5455 break; 5456 default: //productSearch 5457 searchConfiguration = new SearchConfiguration() { 5458 resultPageLink = Converter.ToString(productsPageId), 5459 searchFeedId = productsPageId + "&feed=true", 5460 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5461 searchPlaceholder = Translate("Search products"), 5462 searchTemplate = "SearchProductsTemplate", 5463 searchType = "product-search", 5464 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5465 }; 5466 break; 5467 } 5468 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5469 5470 if (type == "mini-search") { 5471 @RenderMiniSearch(searchConfiguration) 5472 } else { 5473 @RenderSearchBar(searchConfiguration) 5474 } 5475 } 5476 5477 @helper RenderSearchBar(SearchConfiguration options) 5478 { 5479 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5480 data-page-size="7" 5481 data-search-feed-id="@options.searchFeedId" 5482 data-search-second-feed-id="@options.searchSecondFeedId" 5483 data-result-page-id="@options.resultPageLink" 5484 data-groups-page-id="@options.groupsFeedId" 5485 data-search-type="@options.searchType"> 5486 @if (options.showGroups) 5487 { 5488 <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> 5489 <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> 5490 } 5491 <div class="typeahead-search-field"> 5492 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5493 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5494 { 5495 <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> 5496 } 5497 else 5498 { 5499 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 5500 <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> 5501 <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> 5502 </div> 5503 } 5504 </div> 5505 <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> 5506 </div> 5507 } 5508 5509 @helper RenderMiniSearch(SearchConfiguration options) 5510 { 5511 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5512 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5513 5514 <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"> 5515 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 5516 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 5517 </div> 5518 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 5519 <div class="typeahead js-typeahead" id="ProductSearchBar" 5520 data-page-size="7" 5521 data-search-feed-id="@options.searchFeedId" 5522 data-search-second-feed-id="@options.searchSecondFeedId" 5523 data-result-page-id="@options.resultPageLink" 5524 data-search-type="@options.searchType"> 5525 <div class="typeahead-search-field"> 5526 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5527 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5528 { 5529 <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> 5530 } 5531 else 5532 { 5533 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 5534 <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> 5535 <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> 5536 </div> 5537 } 5538 </div> 5539 </div> 5540 </div> 5541 </li> 5542 } 5543 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5544 5545 @using System 5546 @using System.Web 5547 @using Dynamicweb.Rapido.Blocks.Extensibility 5548 @using Dynamicweb.Rapido.Blocks 5549 5550 @{ 5551 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5552 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 5553 5554 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 5555 5556 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 5557 headerConfigurationPage.RemoveBlock(configDesktopLogo); 5558 5559 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 5560 headerConfigurationPage.RemoveBlock(configDesktopMenu); 5561 5562 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 5563 headerConfigurationPage.RemoveBlock(configSearchBar); 5564 5565 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 5566 headerConfigurationPage.RemoveBlock(configSearchAction); 5567 5568 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 5569 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 5570 5571 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 5572 5573 switch (headerConfigurationTopLayout) 5574 { 5575 case "condensed": //2 5576 configDesktopLogo.Design.Size = "auto-width"; 5577 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5578 5579 configDesktopMenu.SortId = 20; 5580 configDesktopMenu.Design.Size = "auto"; 5581 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5582 5583 configDesktopActionsMenu.SortId = 30; 5584 configDesktopActionsMenu.Design.Size = "auto-width"; 5585 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5586 5587 if (!headerConfigurationHideSearch) 5588 { 5589 configSearchBar.SortId = 40; 5590 configSearchBar.Design.Size = "12"; 5591 configDesktopExtra.SortId = 50; 5592 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5593 } 5594 break; 5595 case "splitted": //3 5596 configDesktopLogo.Design.Size = "auto"; 5597 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5598 5599 if (!headerConfigurationHideSearch) 5600 { 5601 configSearchBar.SortId = 20; 5602 configSearchBar.Design.Size = "auto"; 5603 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5604 } 5605 5606 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5607 5608 configDesktopActionsMenu.SortId = 20; 5609 configDesktopActionsMenu.Design.Size = "auto-width"; 5610 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5611 break; 5612 case "splitted-center": //4 5613 configDesktopLogo.Design.Size = "auto"; 5614 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5615 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5616 5617 configDesktopActionsMenu.SortId = 30; 5618 configDesktopActionsMenu.Design.Size = "auto-width"; 5619 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5620 5621 if (!headerConfigurationHideSearch) 5622 { 5623 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5624 } 5625 break; 5626 case "minimal": //5 5627 configDesktopLogo.Design.Size = "auto-width"; 5628 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5629 5630 configDesktopMenu.Design.Size = "auto"; 5631 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5632 5633 configDesktopActionsMenu.SortId = 20; 5634 configDesktopActionsMenu.Design.Size = "auto-width"; 5635 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5636 5637 if (!headerConfigurationHideSearch) 5638 { 5639 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5640 } 5641 break; 5642 case "minimal-center": //6 5643 configDesktopLogo.Design.Size = "auto-width"; 5644 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5645 5646 configDesktopMenu.Design.Size = "auto"; 5647 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5648 5649 configDesktopActionsMenu.SortId = 20; 5650 configDesktopActionsMenu.Design.Size = "auto-width"; 5651 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5652 5653 if (!headerConfigurationHideSearch) 5654 { 5655 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5656 } 5657 break; 5658 case "minimal-right": //7 5659 configDesktopLogo.Design.Size = "auto-width"; 5660 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5661 5662 configDesktopMenu.Design.Size = "auto"; 5663 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5664 5665 configDesktopActionsMenu.SortId = 20; 5666 configDesktopActionsMenu.Design.Size = "auto-width"; 5667 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5668 5669 if (!headerConfigurationHideSearch) 5670 { 5671 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5672 } 5673 break; 5674 case "two-lines": //8 5675 configDesktopLogo.Design.Size = "auto"; 5676 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5677 5678 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5679 5680 configDesktopActionsMenu.SortId = 20; 5681 configDesktopActionsMenu.Design.Size = "auto-width"; 5682 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5683 5684 if (!headerConfigurationHideSearch) 5685 { 5686 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5687 } 5688 break; 5689 case "two-lines-centered": //9 5690 configDesktopLogo.Design.Size = "auto"; 5691 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5692 5693 configDesktopMenu.Design.Size = "auto-width"; 5694 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5695 5696 configDesktopActionsMenu.SortId = 20; 5697 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5698 5699 if (!headerConfigurationHideSearch) 5700 { 5701 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5702 } 5703 break; 5704 case "normal": //1 5705 default: 5706 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5707 5708 if (!headerConfigurationHideSearch) 5709 { 5710 configSearchBar.SortId = 20; 5711 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5712 } 5713 5714 configDesktopActionsMenu.SortId = 30; 5715 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5716 5717 configDesktopActionsMenu.Design.Size = "auto-width"; 5718 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5719 break; 5720 } 5721 } 5722 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5723 5724 @using System 5725 @using System.Web 5726 @using Dynamicweb.Rapido.Blocks.Extensibility 5727 @using Dynamicweb.Rapido.Blocks 5728 5729 @{ 5730 BlocksPage MasterHeader = BlocksPage.GetBlockPage("Master"); 5731 5732 Block MasterDesktopMenuRight = new Block 5733 { 5734 Id = "DesktopMenuRight", 5735 SortId = 11, 5736 Template = RenderDesktopMenuRight(), 5737 Design = new Design 5738 { 5739 CssClass = "u-flex" 5740 } 5741 }; 5742 5743 MasterHeader.Add("MasterDesktopNavigation", MasterDesktopMenuRight); 5744 } 5745 5746 @helper RenderDesktopMenuRight() 5747 { 5748 5749 <div class="grid__cell u-flex"> 5750 @RenderNavigation(new 5751 { 5752 id = "topnavigationright", 5753 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5754 ecomStartLevel = 1, 5755 template = "BaseMegaMenuRight.xslt" 5756 }); 5757 </div> 5758 } 5759 5760 5761 @helper RenderDesktopTools() 5762 { 5763 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 5764 5765 <div class="tools-navigation dw-mod"> 5766 @RenderBlockList(subBlocks) 5767 </div> 5768 } 5769 5770 @helper RenderDesktopToolsText() 5771 { 5772 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 5773 if (!string.IsNullOrEmpty(toolsText)) 5774 { 5775 <div class="u-margin-top u-margin-bottom">@toolsText</div> 5776 } 5777 } 5778 5779 @helper RenderDesktopToolsNavigation() 5780 { 5781 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5782 5783 if (renderPagesInToolBar) 5784 { 5785 @RenderNavigation(new 5786 { 5787 id = "topToolsNavigation", 5788 cssclass = "menu menu-tools dw-mod dwnavigation", 5789 template = "TopMenu.xslt" 5790 }) 5791 } 5792 } 5793 5794 @helper RenderDesktopNavigation() 5795 { 5796 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 5797 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5798 string alignClass = "grid--justify-center"; 5799 <nav class="main-navigation dw-mod"> 5800 @RenderBlockList(subBlocks) 5801 </nav> 5802 } 5803 5804 @helper RenderDesktopExtra() 5805 { 5806 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 5807 5808 if (subBlocks.Count > 0) 5809 { 5810 <div class="header header-top dw-mod"> 5811 @RenderBlockList(subBlocks) 5812 </div> 5813 } 5814 }</text> 5815 } 5816 5817 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5818 5819 @using System 5820 @using System.Web 5821 @using Dynamicweb.Rapido.Blocks.Extensibility 5822 @using Dynamicweb.Rapido.Blocks 5823 @using Dynamicweb.Rapido.Blocks.Components.General 5824 @using Dynamicweb.Frontend 5825 5826 @functions { 5827 int impersonationPageId; 5828 string impersonationLayout; 5829 int impersonationFeed; 5830 Block impersonationBar; 5831 5832 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 5833 { 5834 string username = ""; 5835 5836 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 5837 { 5838 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 5839 } 5840 else if (!string.IsNullOrEmpty(name)) 5841 { 5842 username = name; 5843 } 5844 else if (!string.IsNullOrEmpty(email)) 5845 { 5846 username = email; 5847 } 5848 else 5849 { 5850 username = userName; 5851 } 5852 return username; 5853 } 5854 5855 string getUserName(UserViewModel user) 5856 { 5857 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 5858 } 5859 5860 string getUserName(Dynamicweb.Security.UserManagement.User user) 5861 { 5862 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 5863 } 5864 } 5865 5866 @{ 5867 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 5868 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 5869 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 5870 5871 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0) 5872 { 5873 impersonationBar = new Block 5874 { 5875 Id = "ImpersonationBar", 5876 SortId = 50, 5877 Template = RenderImpersonation(), 5878 SkipRenderBlocksList = true, 5879 Design = new Design 5880 { 5881 Size = "auto-width", 5882 HidePadding = true, 5883 RenderType = RenderType.Column 5884 } 5885 }; 5886 5887 if (impersonationLayout == "top-bar") { 5888 impersonationBar.SortId = 9; 5889 } 5890 5891 Block impersonationContent = new Block 5892 { 5893 Id = "ImpersonationContent", 5894 SortId = 20 5895 }; 5896 5897 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 5898 { 5899 //Render stop impersonation view 5900 impersonationContent.Template = RenderStopImpersonationView(); 5901 5902 5903 Modal stopImpersonation = new Modal 5904 { 5905 Id = "StopImpersonation", 5906 Heading = new Heading { 5907 Level = 2, 5908 Title = Translate("Sign out"), 5909 Icon = new Icon { 5910 Name = "fa-sign-out", 5911 Prefix = "fas", 5912 LabelPosition = IconLabelPosition.After 5913 } 5914 }, 5915 Width = ModalWidth.Sm, 5916 BodyTemplate = RenderStopImpersonationForm() 5917 }; 5918 5919 Block stopImpersonationBlock = new Block 5920 { 5921 Id = "StopImpersonationBlock", 5922 SortId = 10, 5923 Component = stopImpersonation 5924 }; 5925 impersonationBar.BlocksList.Add(stopImpersonationBlock); 5926 } 5927 else 5928 { 5929 //Render main view 5930 switch (impersonationLayout) 5931 { 5932 case "right-lower-box": 5933 impersonationContent.BlocksList.Add( 5934 new Block { 5935 Id = "RightLowerBoxHeader", 5936 SortId = 10, 5937 Component = new Heading { 5938 Level = 5, 5939 Title = Translate("View the list of users you can sign in as"), 5940 CssClass = "impersonation-text" 5941 } 5942 } 5943 ); 5944 impersonationContent.BlocksList.Add( 5945 new Block { 5946 Id = "RightLowerBoxContent", 5947 SortId = 20, 5948 Template = RenderImpersonationControls() 5949 } 5950 ); 5951 break; 5952 case "right-lower-bar": 5953 impersonationContent.BlocksList.Add( 5954 new Block { 5955 Id = "RightLowerBarContent", 5956 SortId = 10, 5957 Template = RenderImpersonationControls() 5958 } 5959 ); 5960 break; 5961 case "bar": 5962 default: 5963 impersonationContent.BlocksList.Add( 5964 new Block { 5965 Id = "ViewListLink", 5966 SortId = 20, 5967 Template = RenderViewListLink() 5968 } 5969 ); 5970 impersonationContent.BlocksList.Add( 5971 new Block { 5972 Id = "BarTypeaheadSearch", 5973 SortId = 30, 5974 Template = RenderTypeaheadSearch() 5975 } 5976 ); 5977 break; 5978 } 5979 } 5980 impersonationBar.BlocksList.Add(impersonationContent); 5981 5982 impersonationBar.BlocksList.Add( 5983 new Block 5984 { 5985 Id = "ImpersonationSearchTemplates", 5986 SortId = 30, 5987 Template = RenderSearchResultTemplate() 5988 } 5989 ); 5990 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 5991 { 5992 impersonationBar.BlocksList.Add( 5993 new Block 5994 { 5995 Id = "ImpersonationSearchScripts", 5996 SortId = 40, 5997 Template = RenderSearchScripts() 5998 } 5999 ); 6000 } 6001 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6002 } 6003 } 6004 6005 @helper RenderImpersonation() 6006 { 6007 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6008 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6009 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6010 @if (impersonationLayout == "right-lower-box") 6011 { 6012 @RenderRightLowerBoxHeader() 6013 } 6014 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6015 @*Impersonation*@ 6016 @RenderBlockList(subBlocks) 6017 </div> 6018 </div> 6019 } 6020 6021 @helper RenderRightLowerBoxHeader() 6022 { 6023 <div class="impersonation__header dw-mod"> 6024 <div class="impersonation__title">@Translate("Impersonation")</div> 6025 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6026 @Render(new Icon 6027 { 6028 Prefix = "fas", 6029 Name = "fa-window-minimize" 6030 }) 6031 </label> 6032 </div> 6033 } 6034 6035 @helper RenderStopImpersonationView() 6036 { 6037 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6038 string userName = getUserName(Pageview.User); 6039 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> "; 6040 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; 6041 6042 if (impersonationLayout == "right-lower-box") 6043 { 6044 <div class="u-margin-bottom--lg u-ta-center"> 6045 @impersonationText 6046 </div> 6047 <div class="u-margin-bottom--lg u-ta-center"> 6048 @RenderSwitchAccountButton() 6049 </div> 6050 @RenderStopImpersonationButton() 6051 } 6052 else 6053 { 6054 <div class="grid grid--align-center impersonation__stop-wrap"> 6055 <div class="impersonation-bar-item dw-mod"> 6056 @impersonationText 6057 </div> 6058 <div class="impersonation-bar-item dw-mod"> 6059 @RenderSwitchAccountButton() 6060 </div> 6061 <div class="impersonation-bar-item dw-mod"> 6062 @RenderStopImpersonationButton() 6063 </div> 6064 </div> 6065 } 6066 } 6067 6068 @helper RenderSwitchAccountButton() { 6069 @Render(new Button 6070 { 6071 Href = "/Default.aspx?ID=" + impersonationPageId, 6072 ButtonType = ButtonType.Button, 6073 ButtonLayout = ButtonLayout.Clean, 6074 Title = Translate("Switch account"), 6075 Icon = new Icon { 6076 Name = "fa-users", 6077 Prefix = "fal", 6078 LabelPosition = IconLabelPosition.After 6079 }, 6080 CssClass = "u-no-margin u-color-inherit" 6081 }) 6082 } 6083 6084 @helper RenderStopImpersonationForm() 6085 { 6086 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6087 string userName = getUserName(Pageview.User); 6088 int pageId = Model.TopPage.ID; 6089 6090 <form method="post" class="u-no-margin"> 6091 @Render(new Button 6092 { 6093 ButtonType = ButtonType.Submit, 6094 ButtonLayout = ButtonLayout.Secondary, 6095 Title = Translate("Sign out as") + " " + userName, 6096 Href = "/Default.aspx?ID=" + impersonationPageId, 6097 CssClass = "btn--full", 6098 Name = "DwExtranetRemoveSecondaryUser" 6099 }) 6100 6101 @Render(new Button 6102 { 6103 ButtonType = ButtonType.Submit, 6104 ButtonLayout = ButtonLayout.Secondary, 6105 Title = Translate("Sign out as") + " " + secondaryUserName, 6106 Href = "/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, 6107 CssClass = "btn--full", 6108 Name = "DwExtranetRemoveSecondaryUser" 6109 }) 6110 </form> 6111 } 6112 6113 @helper RenderStopImpersonationButton() { 6114 @Render(new Button 6115 { 6116 ButtonType = ButtonType.Button, 6117 ButtonLayout = ButtonLayout.Clean, 6118 Title = Translate("Sign out"), 6119 Icon = new Icon { 6120 Name = "fa-sign-out", 6121 Prefix = "fal", 6122 LabelPosition = IconLabelPosition.After 6123 }, 6124 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6125 CssClass = "u-no-margin" 6126 }) 6127 } 6128 6129 @helper RenderImpersonationControls() 6130 { 6131 <div class="impersonation__controls"> 6132 @RenderViewListLink() 6133 @RenderSearchBox() 6134 </div> 6135 @RenderResultsList() 6136 } 6137 6138 @helper RenderViewListLink() 6139 { 6140 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6141 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6142 6143 @Render(new Link { 6144 ButtonLayout = ButtonLayout.None, 6145 Title = title, 6146 Href = "/Default.aspx?ID=" + impersonationPageId, 6147 CssClass = buttonClasses 6148 }) 6149 } 6150 6151 @helper RenderSearchBox() 6152 { 6153 <div class="impersonation__search-wrap"> 6154 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6155 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6156 <i class="fal fa-search"></i> 6157 </div> 6158 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6159 <i class="fal fa-times"></i> 6160 </div> 6161 </div> 6162 } 6163 6164 @helper RenderTypeaheadSearch() 6165 { 6166 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6167 data-page-size="5" 6168 data-search-feed-id="@impersonationFeed" 6169 data-result-page-id="@impersonationPageId" 6170 data-search-type="user-search" 6171 data-search-parameter-name="q"> 6172 6173 <div class="typeahead-search-field"> 6174 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 6175 <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> 6176 </div> 6177 </div> 6178 } 6179 6180 @helper RenderResultsList() 6181 { 6182 <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> 6183 } 6184 6185 @helper RenderSearchResultTemplate() 6186 { 6187 <script id="ImpersonationSearchResult" type="text/x-template"> 6188 {{#.}} 6189 {{#Users}} 6190 <li class="impersonation__search-results-item impersonation-user"> 6191 <form method="post" class="impersonation-user__form" name="account{{id}}"> 6192 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 6193 <div class="impersonation-user__info"> 6194 <div class="impersonation-user__name">{{userName}}</div> 6195 <div class="impersonation-user__number">{{customerNumber}}</div> 6196 </div> 6197 @Render(new Button 6198 { 6199 ButtonType = ButtonType.Submit, 6200 ButtonLayout = ButtonLayout.Secondary, 6201 Title = Translate("Sign in as"), 6202 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 6203 }) 6204 </form> 6205 </li> 6206 {{/Users}} 6207 {{#unless Users}} 6208 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 6209 @Translate("Your search gave 0 results") 6210 </li> 6211 {{/unless}} 6212 {{/.}} 6213 </script> 6214 } 6215 6216 @helper RenderSearchScripts() 6217 { 6218 <script> 6219 let inputDelayTimer; 6220 function searchKeyUpHandler(e) { 6221 clearTimeout(inputDelayTimer); 6222 let value = e.target.value; 6223 if (value != "") { 6224 inputDelayTimer = setTimeout(function () { 6225 updateResults(value); 6226 }, 500); 6227 } else { 6228 clearResults(); 6229 } 6230 }; 6231 6232 function updateResults(value) { 6233 if (value == "") { 6234 return null; 6235 } 6236 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 6237 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 6238 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 6239 } 6240 6241 function clearResults() { 6242 document.getElementById("ImpersonationBoxSearchField").value = ""; 6243 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 6244 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 6245 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 6246 } 6247 </script> 6248 } 6249 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6250 6251 @using System 6252 @using System.Web 6253 @using System.Collections.Generic 6254 @using Dynamicweb.Rapido.Blocks.Extensibility 6255 @using Dynamicweb.Rapido.Blocks 6256 6257 @{ 6258 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 6259 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 6260 6261 Block orderLines = new Block 6262 { 6263 Id = "MiniCartOrderLines", 6264 SkipRenderBlocksList = true, 6265 BlocksList = new List<Block> 6266 { 6267 new Block { 6268 Id = "MiniCartOrderLinesList", 6269 SortId = 20, 6270 Template = RenderMiniCartOrderLinesList() 6271 } 6272 } 6273 }; 6274 6275 Block orderlinesScriptTemplates = new Block 6276 { 6277 Id = "OrderlinesScriptTemplates" 6278 }; 6279 6280 if (orderlinesView == "table") 6281 { 6282 orderLines.Template = RenderMiniCartOrderLinesTable(); 6283 orderLines.BlocksList.Add( 6284 new Block 6285 { 6286 Id = "MiniCartOrderlinesTableHeader", 6287 SortId = 10, 6288 Template = RenderMiniCartOrderLinesHeader() 6289 } 6290 ); 6291 6292 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 6293 } 6294 else 6295 { 6296 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 6297 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 6298 } 6299 6300 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 6301 6302 Block miniCartScriptTemplates = new Block() 6303 { 6304 Id = "MasterMiniCartTemplates", 6305 SortId = 1, 6306 Template = RenderMiniCartScriptTemplates(), 6307 SkipRenderBlocksList = true, 6308 BlocksList = new List<Block> 6309 { 6310 orderLines, 6311 new Block { 6312 Id = "MiniCartFooter", 6313 Template = RenderMiniCartFooter(), 6314 SortId = 50, 6315 SkipRenderBlocksList = true, 6316 BlocksList = new List<Block> 6317 { 6318 new Block { 6319 Id = "MiniCartSubTotal", 6320 Template = RenderMiniCartSubTotal(), 6321 SortId = 30 6322 }, 6323 new Block { 6324 Id = "MiniCartFees", 6325 Template = RenderMiniCartFees(), 6326 SortId = 40 6327 }, 6328 new Block { 6329 Id = "MiniCartPoints", 6330 Template = RenderMiniCartPoints(), 6331 SortId = 50 6332 }, 6333 new Block { 6334 Id = "MiniCartTotal", 6335 Template = RenderMiniCartTotal(), 6336 SortId = 60 6337 }, 6338 new Block { 6339 Id = "MiniCartDisclaimer", 6340 Template = RenderMiniCartDisclaimer(), 6341 SortId = 70 6342 }, 6343 new Block { 6344 Id = "MiniCartActions", 6345 Template = RenderMiniCartActions(), 6346 SortId = 80 6347 } 6348 } 6349 } 6350 } 6351 }; 6352 6353 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 6354 } 6355 6356 @helper RenderMiniCartScriptsTableTemplates() 6357 { 6358 <script id="MiniCartOrderline" type="text/x-template"> 6359 {{#unless isEmpty}} 6360 <tr> 6361 <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> 6362 <td class="u-va-middle"> 6363 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a> 6364 {{#if variantname}} 6365 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 6366 {{/if}} 6367 {{#if unitname}} 6368 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 6369 {{/if}} 6370 </td> 6371 <td class="u-ta-right u-va-middle">{{quantity}}</td> 6372 <td class="u-ta-right u-va-middle"> 6373 {{#if pointsTotal}} 6374 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6375 {{else}} 6376 {{totalprice}} 6377 {{/if}} 6378 </td> 6379 </tr> 6380 {{/unless}} 6381 </script> 6382 6383 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6384 {{#unless isEmpty}} 6385 <tr class="table__row--no-border"> 6386 <td class="u-w60px">&nbsp;</td> 6387 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 6388 <td class="u-ta-right">&nbsp;</td> 6389 <td class="u-ta-right">{{totalprice}}</td> 6390 </tr> 6391 {{/unless}} 6392 </script> 6393 } 6394 6395 @helper RenderMiniCartScriptsListTemplates() 6396 { 6397 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6398 6399 <script id="MiniCartOrderline" type="text/x-template"> 6400 {{#unless isEmpty}} 6401 <div class="mini-cart-orderline grid dw-mod"> 6402 <div class="grid__col-4"> 6403 <a href="{{link}}" class="{{hideimage}}"> 6404 <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}}"> 6405 </a> 6406 </div> 6407 <div class="grid__col-8"> 6408 <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> 6409 {{#if variantname}} 6410 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 6411 {{/if}} 6412 {{#if unitname}} 6413 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 6414 {{/if}} 6415 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 6416 6417 <div class="grid__cell-footer"> 6418 <div class="grid__cell"> 6419 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 6420 {{#if pointsTotal}} 6421 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6422 {{else}} 6423 {{totalprice}} 6424 {{/if}} 6425 </div> 6426 <button type="button" 6427 title="@Translate("Remove orderline")" 6428 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 6429 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 6430 </div> 6431 </div> 6432 </div> 6433 </div> 6434 {{/unless}} 6435 </script> 6436 6437 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6438 {{#unless isEmpty}} 6439 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 6440 <div class="grid__col-4"> 6441 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 6442 </div> 6443 <div class="grid__col-8">{{totalprice}}</div> 6444 </div> 6445 {{/unless}} 6446 </script> 6447 } 6448 6449 @helper RenderMiniCartScriptTemplates() 6450 { 6451 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 6452 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6453 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 6454 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6455 6456 <script id="MiniCartContent" type="text/x-template"> 6457 {{#.}} 6458 {{#unless isEmpty}} 6459 @if (miniCartUseGoogleTagManager) 6460 { 6461 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 6462 } 6463 @RenderBlockList(subBlocks) 6464 {{/unless}} 6465 {{/.}} 6466 </script> 6467 } 6468 6469 @helper RenderMiniCartOrderLinesTable() 6470 { 6471 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6472 6473 <div class="u-overflow-auto"> 6474 <table class="table mini-cart-table dw-mod"> 6475 @RenderBlockList(subBlocks) 6476 </table> 6477 </div> 6478 } 6479 6480 @helper RenderMiniCartOrderLinesBlocks() 6481 { 6482 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6483 6484 <div class="u-overflow-auto"> 6485 @RenderBlockList(subBlocks) 6486 </div> 6487 } 6488 6489 @helper RenderMiniCartOrderLinesHeader() 6490 { 6491 <thead> 6492 <tr> 6493 <td>&nbsp;</td> 6494 <td>@Translate("Product")</td> 6495 <td class="u-ta-right">@Translate("Qty")</td> 6496 <td class="u-ta-right" width="120">@Translate("Price")</td> 6497 </tr> 6498 </thead> 6499 } 6500 6501 @helper RenderMiniCartOrderLinesList() 6502 { 6503 <text> 6504 {{#OrderLines}} 6505 {{#ifCond template "===" "CartOrderline"}} 6506 {{>MiniCartOrderline}} 6507 {{/ifCond}} 6508 {{#ifCond template "===" "CartOrderlineMobile"}} 6509 {{>MiniCartOrderline}} 6510 {{/ifCond}} 6511 {{#ifCond template "===" "CartOrderlineDiscount"}} 6512 {{>MiniCartOrderlineDiscount}} 6513 {{/ifCond}} 6514 {{/OrderLines}} 6515 </text> 6516 } 6517 6518 @helper RenderMiniCartFees() 6519 { 6520 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6521 if (!pointShop) 6522 { 6523 <text> 6524 {{#unless hidePaymentfee}} 6525 <div class="grid"> 6526 <div class="grid__col-6 grid__col--bleed-y"> 6527 {{paymentmethod}} 6528 </div> 6529 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 6530 </div> 6531 {{/unless}} 6532 </text> 6533 } 6534 <text> 6535 {{#unless hideShippingfee}} 6536 <div class="grid"> 6537 <div class="grid__col-6 grid__col--bleed-y"> 6538 {{shippingmethod}} 6539 </div> 6540 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 6541 </div> 6542 {{/unless}} 6543 </text> 6544 <text> 6545 {{#if hasTaxSettings}} 6546 <div class="grid"> 6547 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 6548 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 6549 </div> 6550 {{/if}} 6551 </text> 6552 } 6553 6554 @helper RenderMiniCartFooter() 6555 { 6556 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 6557 6558 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 6559 @RenderBlockList(subBlocks) 6560 </div> 6561 } 6562 6563 @helper RenderMiniCartActions() 6564 { 6565 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6566 6567 <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> 6568 <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> 6569 } 6570 6571 @helper RenderMiniCartPoints() 6572 { 6573 <text> 6574 {{#if earnings}} 6575 <div class="grid"> 6576 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 6577 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6578 <div> 6579 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 6580 </div> 6581 </div> 6582 </div> 6583 {{/if}} 6584 </text> 6585 } 6586 6587 @helper RenderMiniCartSubTotal() 6588 { 6589 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 6590 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6591 if (!pointShop) 6592 { 6593 <text> 6594 {{#unless hideSubTotal}} 6595 <div class="grid dw-mod u-bold"> 6596 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 6597 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6598 @if (hasTaxSettings) 6599 { 6600 <text>{{subtotalpricewithouttaxes}}</text> 6601 } 6602 else 6603 { 6604 <text>{{subtotalprice}}</text> 6605 } 6606 </div> 6607 </div> 6608 {{/unless}} 6609 </text> 6610 } 6611 } 6612 6613 @helper RenderMiniCartTotal() 6614 { 6615 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6616 6617 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 6618 <div class="grid__col-6">@Translate("Total")</div> 6619 <div class="grid__col-6 grid--align-end"> 6620 <div> 6621 @if (pointShop) 6622 { 6623 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 6624 } 6625 else 6626 { 6627 <text>{{totalprice}}</text> 6628 } 6629 </div> 6630 </div> 6631 </div> 6632 } 6633 6634 @helper RenderMiniCartDisclaimer() 6635 { 6636 <text> 6637 {{#if showCheckoutDisclaimer}} 6638 <div class="grid u-margin-bottom u-ta-right"> 6639 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 6640 </div> 6641 {{/if}} 6642 </text> 6643 } 6644 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6645 6646 @using Dynamicweb.Rapido.Blocks.Extensibility 6647 @using Dynamicweb.Rapido.Blocks 6648 @using Dynamicweb.Rapido.Blocks.Components.General 6649 @using Dynamicweb.Rapido.Blocks.Components 6650 @using Dynamicweb.Rapido.Services 6651 6652 @{ 6653 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 6654 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 6655 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 6656 6657 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 6658 { 6659 if (addToCartNotificationType == "modal") 6660 { 6661 Block addToCartNotificationModal = new Block 6662 { 6663 Id = "AddToCartNotificationModal", 6664 Template = RenderAddToCartNotificationModal() 6665 }; 6666 6667 Block addToCartNotificationScript = new Block 6668 { 6669 Id = "AddToCartNotificationScript", 6670 Template = RenderAddToCartNotificationModalScript() 6671 }; 6672 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 6673 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6674 } 6675 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 6676 { 6677 Block addToCartNotificationScript = new Block 6678 { 6679 Id = "AddToCartNotificationScript", 6680 Template = RenderAddToCartNotificationToggleScript() 6681 }; 6682 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6683 } 6684 } 6685 } 6686 6687 @helper RenderAddToCartNotificationModal() 6688 { 6689 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 6690 } 6691 6692 @helper RenderAddToCartNotificationModalScript() 6693 { 6694 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6695 6696 <script id="LastAddedProductTemplate" type="text/x-template"> 6697 @{ 6698 6699 Modal lastAddedProduct = new Modal 6700 { 6701 Id = "LastAddedProduct", 6702 Heading = new Heading 6703 { 6704 Level = 2, 6705 Title = Translate("Product is added to the cart") 6706 }, 6707 Width = ModalWidth.Md, 6708 BodyTemplate = RenderModalContent() 6709 }; 6710 6711 lastAddedProduct.AddActions( 6712 new Button 6713 { 6714 ButtonType = ButtonType.Button, 6715 ButtonLayout = ButtonLayout.Secondary, 6716 Title = Translate("Continue shopping"), 6717 CssClass = "u-pull--left u-no-margin btn--sm", 6718 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6719 }, 6720 new Link 6721 { 6722 Href = "/Default.aspx?ID=" + cartPageId, 6723 ButtonLayout = ButtonLayout.Secondary, 6724 CssClass = "u-pull--right u-no-margin btn--sm", 6725 Title = Translate("Proceed to checkout"), 6726 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6727 } 6728 ); 6729 6730 @Render(lastAddedProduct) 6731 } 6732 </script> 6733 <script> 6734 document.addEventListener('addToCart', function (event) { 6735 Cart.ShowLastAddedProductModal(event.detail); 6736 }); 6737 </script> 6738 } 6739 6740 @helper RenderModalContent() 6741 { 6742 <div class="grid"> 6743 <div class="grid__col-2"> 6744 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 6745 </div> 6746 <div class="u-padding grid--align-self-center"> 6747 <span>{{quantity}}</span> x 6748 </div> 6749 <div class="grid__col-auto grid--align-self-center"> 6750 <div>{{productInfo.name}}</div> 6751 {{#if productInfo.variantName}} 6752 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 6753 {{/if}} 6754 {{#if productInfo.unitName}} 6755 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 6756 {{/if}} 6757 </div> 6758 </div> 6759 } 6760 6761 @helper RenderAddToCartNotificationToggleScript() 6762 { 6763 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6764 6765 <script> 6766 document.addEventListener('addToCart', function () { 6767 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 6768 }); 6769 </script> 6770 } 6771 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6772 6773 @using System 6774 @using System.Web 6775 @using System.Collections.Generic 6776 @using Dynamicweb.Rapido.Blocks.Extensibility 6777 @using Dynamicweb.Rapido.Blocks 6778 @using Dynamicweb.Rapido.Blocks.Components.General 6779 6780 @functions { BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); } 6781 6782 @{ 6783 Block masterFooterContent = new Block() 6784 { 6785 Id = "MasterFooterContent", 6786 SortId = 10, 6787 Template = RenderFooter(), 6788 SkipRenderBlocksList = true 6789 }; 6790 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 6791 } 6792 6793 @helper RenderFooter() 6794 { 6795 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 6796 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 6797 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 6798 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 6799 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 6800 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 6801 6802 //Custom Fields 6803 string footerPrivacyPolicy = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("PrivacyPolicyLink"); 6804 string footerTermsAndConditions = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("TermsAndConditionsLink"); 6805 string footerPrivacyPolicyText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("PrivacyPolicyLinkText"); 6806 string footerTermsAndConditionsText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("TermsAndConditionsLinkText"); 6807 string footerTrustpilot = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("TrustpilotLink"); 6808 6809 <footer class="nc-footer"> 6810 <section class="nc-footer__content-wrap"> 6811 <section class="nc-footer__grid"> 6812 <div class="nc-footer__grid-item"> 6813 <h4 class="nc-footer__grid-header"> 6814 @footerColumnOneHeader 6815 </h4> 6816 <div class="nc-footer__grid-rte"> 6817 @footerColumnOneContent 6818 @if (Model.Area.ID == 24 || Model.Area.ID == 25 || Model.Area.ID == 26) 6819 { 6820 if (Dynamicweb.Security.UserManagement.User.IsExtranetUserLoggedIn()) 6821 { 6822 <p> 6823 <a href="/Admin/Public/extranetlogoff.aspx">@Translate("LogOut", "Log out")</a> 6824 </p> 6825 } 6826 else 6827 { 6828 <p> 6829 <a href="/Default.aspx?Id=@GetPageIdByNavigationTag("SignInPage")">@Translate("Login", "Login")</a> 6830 </p> 6831 } 6832 } 6833 </div> 6834 </div> 6835 <div class="nc-footer__grid-item"> 6836 <h4 class="nc-footer__grid-header"> 6837 @footerColumnTwoHeader 6838 </h4> 6839 <div class="nc-footer__grid-rte"> 6840 @footerColumnTwoContent 6841 </div> 6842 </div> 6843 <div class="nc-footer__grid-item"> 6844 <h4 class="nc-footer__grid-header"> 6845 @footerColumnThreeHeader 6846 </h4> 6847 <div class="nc-footer__grid-rte"> 6848 @footerColumnThreeContent 6849 </div> 6850 </div> 6851 </section> 6852 <section class="nc-footer__newsletter"> 6853 <div class="nc-footer__newsletter-content"> 6854 <h3 class="nc-footer__newsletter-first-header"> 6855 @Translate("Newsletter", "Nyhedsbrev") 6856 </h3> 6857 <div class="nc-footer__newsletter-first-image"> 6858 <img src="/Files/Images/vinkende-kvinder.svg" alt="Alternate Text"/> 6859 </div> 6860 <div class="nc-footer__newsletter-second-image"> 6861 <img src="/Files/Images/kvinde-der-jubler.svg" alt="Alternate Text"/> 6862 </div> 6863 <h3 class="nc-footer__newsletter-second-header"> 6864 @Translate("FooterTextNewsletter", "...50% af alle vores nyhedsbreve omhandler tilbud og gode rabatter") 6865 </h3> 6866 </div> 6867 <div class="w-100 h-100 nc-footer__newsletter-form d-flex"> 6868 <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"> 6869 @Translate("FooterSubscribe", "Tilmeld") 6870 </a> 6871 </div> 6872 </section> 6873 </section> 6874 <div class="nc-footer__copyright"> 6875 <div class="nc-footer__privacy"> 6876 <a href="@footerPrivacyPolicy" class="nc-footer__privacy-link"> 6877 @footerPrivacyPolicyText 6878 </a> 6879 <a href="@footerTermsAndConditions" class="nc-footer__privacy-link"> 6880 @footerTermsAndConditionsText 6881 </a> 6882 </div> 6883 <div class="nc-footer__socials nc-footer-seperator"> 6884 <a href="@footerTrustpilot" target="_blank" class="nc-footer__social-link" rel="noopener"> 6885 <img src="\Files\Images\SocialIcons\trustpilot.svg" alt="Trustpilot" class="nc-footer__social-link-icon"/> 6886 </a> 6887 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 6888 { 6889 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 6890 string socialIconClass = socialIcon.SelectedValue; 6891 string socialIconTitle = socialIcon.SelectedName; 6892 string socialLink = socialitem.GetString("Link"); 6893 6894 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="nc-footer__social-link" rel="noopener"> 6895 <i class="@socialIconClass fa-2x nc-footer__social-link-icon"></i> 6896 </a> 6897 } 6898 </div> 6899 <div class="nc-footer__billing nc-footer-seperator"> 6900 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 6901 { 6902 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 6903 string paymentImage = null; 6904 string paymentTitle = paymentItem.SelectedName; 6905 var selected = paymentItem.SelectedOptions.FirstOrDefault(); 6906 if (selected != null) 6907 { 6908 paymentImage = selected.Icon; 6909 } 6910 <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"/> 6911 } 6912 </div> 6913 <div class="nc-footer__sponsoring nc-footer-seperator"> 6914 @foreach (var sponsorItem in Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("SponsorLinks")) 6915 { 6916 var socialIcon = sponsorItem.GetFile("Image")?.Path; 6917 string sponsorLink = sponsorItem.GetString("Link"); 6918 6919 <a href="@sponsorLink" target="_blank" class="nc-footer__sponsor-link" rel="noopener"> 6920 <img src="@socialIcon" alt="Alternate Text" class="nc-footer__sponsor-icon"/> 6921 </a> 6922 } 6923 </div> 6924 </div> 6925 </footer> 6926 } 6927 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 6928 6929 @using System 6930 @using System.Web 6931 @using System.Collections.Generic 6932 @using Dynamicweb.Rapido.Blocks.Extensibility 6933 @using Dynamicweb.Rapido.Blocks 6934 @using Dynamicweb.Ecommerce.Common 6935 @using Denform.Website.CustomModules 6936 6937 @{ 6938 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 6939 6940 Block masterScriptReferences = new Block() 6941 { 6942 Id = "MasterScriptReferences", 6943 SortId = 1, 6944 Template = RenderMasterScriptReferences() 6945 }; 6946 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 6947 } 6948 6949 @helper RenderMasterScriptReferences() { 6950 <script src="@TemplateHelper.GetRevisionNumber("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js")"></script> 6951 <script src="@TemplateHelper.GetRevisionNumber("/Files/Templates/Designs/Rapido/js/master.min.js")"></script> 6952 6953 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 6954 { 6955 <script src="@TemplateHelper.GetRevisionNumber("/Files/Templates/Designs/Rapido/js/custom.min.js")"></script> 6956 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js"); 6957 } 6958 6959 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 6960 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js"); 6961 } 6962 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6963 6964 @using System 6965 @using System.Web 6966 @using System.Collections.Generic 6967 @using Dynamicweb.Rapido.Blocks.Extensibility 6968 @using Dynamicweb.Rapido.Blocks 6969 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 6970 @using Dynamicweb.Rapido.Services 6971 6972 @{ 6973 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 6974 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 6975 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 6976 6977 if (!navigationItemsHideSearch || isFavoriteList) 6978 { 6979 Block masterSearchScriptTemplates = new Block() 6980 { 6981 Id = "MasterSearchScriptTemplates", 6982 SortId = 1, 6983 Template = RenderSearchScriptTemplates() 6984 }; 6985 6986 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 6987 } 6988 } 6989 6990 @helper RenderSearchScriptTemplates() 6991 { 6992 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 6993 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 6994 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 6995 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 6996 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 6997 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 6998 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 6999 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 7000 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7001 7002 <script id="SearchGroupsTemplate" type="text/x-template"> 7003 {{#.}} 7004 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 7005 {{/.}} 7006 </script> 7007 7008 <script id="SearchProductsTemplate" type="text/x-template"> 7009 {{#each .}} 7010 {{#Product}} 7011 {{#ifCond template "!==" "SearchMore"}} 7012 <li class="dropdown__item dropdown__item--seperator dw-mod"> 7013 @if (useFacebookPixel) 7014 { 7015 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 7016 } 7017 @if (useGoogleTagManager) 7018 { 7019 <text>{{{googleEnchantImpression googleImpression}}}</text> 7020 } 7021 <div> 7022 <a href="{{link}}" 7023 class="js-typeahead-link u-color-inherit u-pull--left" 7024 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 7025 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 7026 <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> 7027 <div class="u-pull--left"> 7028 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}{{#if variantName}}, {{variantName}}{{/if}}</div> 7029 @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 7030 { 7031 if (pointShopOnly) 7032 { 7033 <text> 7034 {{#if havePointPrice}} 7035 <div> 7036 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 7037 </div> 7038 {{else}} 7039 <small class="help-text u-no-margin">@Translate("Not available")</small> 7040 {{/if}} 7041 {{#unless canBePurchasedWithPoints}} 7042 {{#if havePointPrice}} 7043 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 7044 {{/if}} 7045 {{/unless}} 7046 </text> 7047 } 7048 else 7049 { 7050 <div>{{price}}</div> 7051 } 7052 } 7053 </div> 7054 </a> 7055 <div class="u-margin-left u-pull--right"> 7056 @{ 7057 var viewBtn = new Link 7058 { 7059 Href = "{{link}}", 7060 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 7061 ButtonLayout = ButtonLayout.Secondary, 7062 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside", 7063 Title = Translate("View") 7064 }; 7065 } 7066 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7067 { 7068 <text>{{#if hideAddToCartButton}}</text> 7069 @Render(viewBtn) 7070 <text>{{else}}</text> 7071 @Render(new AddToCartButton 7072 { 7073 HideTitle = true, 7074 ProductId = "{{productId}}", 7075 ProductInfo = "{{productInfo}}", 7076 BuyForPoints = pointShopOnly, 7077 OnClick = "{{facebookPixelAction}}", 7078 CssClass = "u-w80px u-no-margin js-ignore-click-outside", 7079 Icon = new Icon { 7080 CssClass = "js-ignore-click-outside" 7081 }, 7082 ExtraAttributes = new Dictionary<string, string> 7083 { 7084 { "{{disabledBuyButton}}", "" } 7085 } 7086 }) 7087 <text>{{/if}}</text> 7088 } 7089 else if (showViewButton) 7090 { 7091 @Render(viewBtn) 7092 } 7093 @if (showAddToDownloadButton) 7094 { 7095 <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}}"> 7096 <i class="fas fa-plus js-button-icon"></i> 7097 </button> 7098 } 7099 </div> 7100 </div> 7101 </li> 7102 {{/ifCond}} 7103 {{#ifCond template "===" "SearchMore"}} 7104 {{>SearchMoreProducts}} 7105 {{/ifCond}} 7106 {{/Product}} 7107 {{else}} 7108 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7109 @Translate("Your search gave 0 results") 7110 </li> 7111 {{/each}} 7112 </script> 7113 7114 <script id="SearchMoreProducts" type="text/x-template"> 7115 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7116 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7117 @Translate("View all") 7118 </a> 7119 </li> 7120 </script> 7121 7122 <script id="SearchMorePages" type="text/x-template"> 7123 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7124 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7125 @Translate("View all") 7126 </a> 7127 </li> 7128 </script> 7129 7130 <script id="SearchPagesTemplate" type="text/x-template"> 7131 {{#each .}} 7132 {{#ifCond template "!==" "SearchMore"}} 7133 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 7134 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 7135 <div class="u-margin-right u-inline"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 7136 <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> 7137 </a> 7138 </li> 7139 {{/ifCond}} 7140 {{#ifCond template "===" "SearchMore"}} 7141 {{>SearchMorePages}} 7142 {{/ifCond}} 7143 {{else}} 7144 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7145 @Translate("Your search gave 0 results") 7146 </li> 7147 {{/each}} 7148 </script> 7149 7150 <script id="SearchPagesTemplateWrap" type="text/x-template"> 7151 <div class="dropdown__column-header">@Translate("Pages")</div> 7152 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7153 {{>SearchPagesTemplate}} 7154 </ul> 7155 </script> 7156 7157 <script id="SearchProductsTemplateWrap" type="text/x-template"> 7158 <div class="dropdown__column-header">@Translate("Products")</div> 7159 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7160 {{>SearchProductsTemplate}} 7161 </ul> 7162 </script> 7163 } 7164 7165 @using Dynamicweb.Rapido.Blocks.Components 7166 @using Dynamicweb.Rapido.Blocks.Components.General 7167 @using Dynamicweb.Rapido.Blocks 7168 @using System.IO 7169 7170 7171 @using Dynamicweb.Rapido.Blocks.Components.General 7172 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7173 7174 7175 @* Component *@ 7176 7177 @helper RenderVariantMatrix(VariantMatrix settings) { 7178 if (settings != null) 7179 { 7180 int productLoopCounter = 0; 7181 int groupCount = 0; 7182 List<VariantOption> firstDimension = new List<VariantOption>(); 7183 List<VariantOption> secondDimension = new List<VariantOption>(); 7184 List<VariantOption> thirdDimension = new List<VariantOption>(); 7185 7186 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 7187 { 7188 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 7189 { 7190 if (groupCount == 0) { 7191 firstDimension.Add(variantOptions); 7192 } 7193 if (groupCount == 1) 7194 { 7195 secondDimension.Add(variantOptions); 7196 } 7197 if (groupCount == 2) 7198 { 7199 thirdDimension.Add(variantOptions); 7200 } 7201 } 7202 groupCount++; 7203 } 7204 7205 int rowCount = 0; 7206 int columnCount = 0; 7207 7208 <script> 7209 var variantsCollection = []; 7210 </script> 7211 7212 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 7213 @if (groupCount == 1) 7214 { 7215 <tbody> 7216 @foreach (VariantOption firstVariantOption in firstDimension) 7217 { 7218 var variantId = firstVariantOption.Id; 7219 <tr> 7220 <td class="u-bold"> 7221 @firstVariantOption.Name 7222 </td> 7223 <td> 7224 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7225 </td> 7226 </tr> 7227 productLoopCounter++; 7228 } 7229 7230 <tr> 7231 <td>&nbsp;</td> 7232 <td> 7233 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7234 </td> 7235 </tr> 7236 </tbody> 7237 } 7238 @if (groupCount == 2) 7239 { 7240 <thead> 7241 <tr> 7242 <td>&nbsp;</td> 7243 @foreach (VariantOption variant in secondDimension) 7244 { 7245 <td>@variant.Name</td> 7246 } 7247 </tr> 7248 </thead> 7249 <tbody> 7250 @foreach (VariantOption firstVariantOption in firstDimension) 7251 { 7252 string variantId = ""; 7253 columnCount = 0; 7254 7255 <tr> 7256 <td class="u-min-w120px">@firstVariantOption.Name</td> 7257 7258 @foreach (VariantOption secondVariantOption in secondDimension) 7259 { 7260 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 7261 <td> 7262 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7263 </td> 7264 7265 columnCount++; 7266 7267 productLoopCounter++; 7268 } 7269 7270 <td> 7271 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7272 </td> 7273 </tr> 7274 7275 rowCount++; 7276 } 7277 7278 @{ 7279 columnCount = 0; 7280 } 7281 7282 <tr> 7283 <td>&nbsp;</td> 7284 @foreach (VariantOption secondVariantOption in secondDimension) 7285 { 7286 <td> 7287 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7288 </td> 7289 7290 columnCount++; 7291 } 7292 <td>&nbsp;</td> 7293 </tr> 7294 </tbody> 7295 } 7296 @if (groupCount == 3) 7297 { 7298 <thead> 7299 <tr> 7300 <td>&nbsp;</td> 7301 @foreach (VariantOption thirdVariantOption in thirdDimension) 7302 { 7303 <td>@thirdVariantOption.Name</td> 7304 } 7305 </tr> 7306 </thead> 7307 <tbody> 7308 @foreach (VariantOption firstVariantOption in firstDimension) 7309 { 7310 int colspan = (thirdDimension.Count + 1); 7311 7312 <tr> 7313 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 7314 </tr> 7315 7316 foreach (VariantOption secondVariantOption in secondDimension) 7317 { 7318 string variantId = ""; 7319 columnCount = 0; 7320 7321 <tr> 7322 <td class="u-min-w120px">@secondVariantOption.Name</td> 7323 7324 @foreach (VariantOption thirdVariantOption in thirdDimension) 7325 { 7326 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 7327 7328 <td> 7329 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7330 </td> 7331 7332 columnCount++; 7333 productLoopCounter++; 7334 } 7335 7336 <td> 7337 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7338 </td> 7339 </tr> 7340 rowCount++; 7341 } 7342 } 7343 7344 @{ 7345 columnCount = 0; 7346 } 7347 7348 <tr> 7349 <td>&nbsp;</td> 7350 @foreach (VariantOption thirdVariantOption in thirdDimension) 7351 { 7352 <td> 7353 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7354 </td> 7355 7356 columnCount++; 7357 } 7358 <td>&nbsp;</td> 7359 </tr> 7360 </tbody> 7361 } 7362 </table> 7363 7364 <script> 7365 document.addEventListener("DOMContentLoaded", function (event) { 7366 MatrixUpdateQuantity("@settings.ProductId"); 7367 }); 7368 7369 MatrixUpdateQuantity = function (productId) { 7370 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 7371 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 7372 7373 var qtyRowArr = []; 7374 var qtyColumnArr = []; 7375 7376 var totalQty = 0; 7377 7378 for (var i = 0; i < allQtyFields.length; i++) { 7379 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 7380 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 7381 } 7382 7383 for (var i = 0; i < allQtyFields.length; i++) { 7384 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 7385 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 7386 totalQty += parseFloat(allQtyFields[i].value); 7387 } 7388 7389 //Update row counters 7390 for (var i = 0; i < qtyRowArr.length; i++) { 7391 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7392 7393 if (qtyRowArr[i] != undefined && qtyCounter != null) { 7394 var currentCount = qtyCounter.innerHTML; 7395 qtyCounter.innerHTML = qtyRowArr[i]; 7396 7397 if (currentCount != qtyCounter.innerHTML) { 7398 qtyCounter.classList.add("qty-field--active"); 7399 } 7400 } 7401 7402 } 7403 7404 //Update column counters 7405 for (var i = 0; i < qtyColumnArr.length; i++) { 7406 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7407 7408 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 7409 var currentCount = qtyCounter.innerHTML; 7410 qtyCounter.innerHTML = qtyColumnArr[i]; 7411 7412 if (currentCount != qtyCounter.innerHTML) { 7413 qtyCounter.classList.add("qty-field--active"); 7414 } 7415 } 7416 } 7417 7418 if (document.getElementById("TotalQtyCount_" + productId)) { 7419 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 7420 } 7421 7422 //Clean up animations 7423 setTimeout(function () { 7424 for (var i = 0; i < qtyRowArr.length; i++) { 7425 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7426 if (qtyCounter != null) { 7427 qtyCounter.classList.remove("qty-field--active"); 7428 } 7429 } 7430 for (var i = 0; i < qtyColumnArr.length; i++) { 7431 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7432 if (qtyCounter != null) { 7433 qtyCounter.classList.remove("qty-field--active"); 7434 } 7435 } 7436 }, 1000); 7437 } 7438 </script> 7439 } 7440 } 7441 7442 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 7443 { 7444 string loopCount = productLoopCounter.ToString(); 7445 7446 bool combinationFound = false; 7447 double stock = 0; 7448 double quantityValue = 0; 7449 string note = ""; 7450 7451 VariantProduct variantProduct = null; 7452 7453 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 7454 { 7455 stock = variantProduct.Stock; 7456 quantityValue = variantProduct.Quantity; 7457 combinationFound = true; 7458 } 7459 7460 if (combinationFound) 7461 { 7462 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 7463 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 7464 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 7465 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 7466 <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"> 7467 7468 if (stock != 0) 7469 { 7470 <small>@Translate("Stock") @stock</small> 7471 } 7472 7473 <script> 7474 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 7475 variantsCollection.push(variants); 7476 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 7477 </script> 7478 } 7479 else 7480 { 7481 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 7482 } 7483 } 7484 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7485 7486 @* Component *@ 7487 7488 @helper RenderAddToCart(AddToCart settings) 7489 { 7490 //set Id for quantity selector to get it's value from button 7491 if (settings.QuantitySelector != null) 7492 { 7493 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 7494 { 7495 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 7496 } 7497 7498 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 7499 7500 if (settings.Disabled) 7501 { 7502 settings.QuantitySelector.Disabled = true; 7503 } 7504 7505 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 7506 { 7507 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 7508 } 7509 } 7510 7511 if (settings.Disabled) 7512 { 7513 settings.AddButton.Disabled = true; 7514 } 7515 7516 settings.AddButton.CssClass += " btn--condensed"; 7517 7518 //unitsSelector 7519 if (settings.UnitSelector != null) 7520 { 7521 if (settings.Disabled) 7522 { 7523 settings.QuantitySelector.Disabled = true; 7524 } 7525 } 7526 7527 if (Pageview.Device.ToString() == "Mobile") { 7528 if (settings.UnitSelector != null) 7529 { 7530 <div class="margin-sm margin-position-bottom"> 7531 @Render(settings.UnitSelector) 7532 </div> 7533 } 7534 } 7535 7536 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7537 @if (Pageview.Device.ToString() != "Mobile") { 7538 if (settings.UnitSelector != null) 7539 { 7540 @Render(settings.UnitSelector) 7541 } 7542 } 7543 @if (settings.QuantitySelector != null) 7544 { 7545 @Render(settings.QuantitySelector) 7546 } 7547 @Render(settings.AddButton) 7548 </div> 7549 } 7550 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7551 7552 @* Component *@ 7553 7554 @helper RenderAddToCartButton(AddToCartButton settings) 7555 { 7556 if (!settings.HideTitle) 7557 { 7558 if (string.IsNullOrEmpty(settings.Title)) 7559 { 7560 if (settings.BuyForPoints) 7561 { 7562 settings.Title = Translate("Buy with points"); 7563 } 7564 else 7565 { 7566 settings.Title = Translate("Add to cart"); 7567 } 7568 } 7569 } 7570 else 7571 { 7572 settings.Title = ""; 7573 } 7574 7575 if (settings.Icon == null) 7576 { 7577 settings.Icon = new Icon(); 7578 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 7579 } 7580 7581 if (string.IsNullOrEmpty(settings.Icon.Name)) 7582 { 7583 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 7584 } 7585 7586 settings.OnClick = "Cart.AddToCart(event, { " + 7587 "id: '" + settings.ProductId + "'," + 7588 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 7589 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 7590 (settings.BuyForPoints ? "buyForPoints: true," : "") + 7591 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 7592 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 7593 "});" + settings.OnClick; 7594 7595 @RenderButton(settings) 7596 } 7597 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7598 7599 @* Component *@ 7600 7601 @helper RenderUnitSelector(UnitSelector settings) 7602 { 7603 if (string.IsNullOrEmpty(settings.Id)) 7604 { 7605 settings.Id = Guid.NewGuid().ToString("N"); 7606 } 7607 var disabledClass = settings.Disabled ? "disabled" : ""; 7608 7609 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 7610 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7611 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 7612 <div class="dropdown__content dw-mod"> 7613 @settings.OptionsContent 7614 </div> 7615 <label class="dropdown-trigger-off" for="@settings.Id"></label> 7616 </div> 7617 } 7618 @using System.Reflection 7619 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7620 7621 @* Component *@ 7622 7623 @helper RenderQuantitySelector(QuantitySelector settings) 7624 { 7625 var attributes = new Dictionary<string, string>(); 7626 7627 /*base settings*/ 7628 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 7629 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 7630 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 7631 if (settings.Disabled) { attributes.Add("disabled", "true"); } 7632 if (settings.Required) { attributes.Add("required", "true"); } 7633 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 7634 /*end*/ 7635 7636 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 7637 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 7638 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 7639 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 7640 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 7641 if (settings.Min == null) { settings.Min = 1; } 7642 attributes.Add("min", settings.Min.ToString()); 7643 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 7644 if (settings.Value == null) { settings.Value = 1; } 7645 attributes.Add("value", settings.Value.ToString()); 7646 attributes.Add("type", "number"); 7647 7648 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7649 7650 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 7651 } 7652 @using Dynamicweb.Rapido.Blocks.Components 7653 7654 @using Dynamicweb.Frontend 7655 @using Dynamicweb.Frontend.Devices 7656 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7657 @using Dynamicweb.Rapido.Blocks.Components.General 7658 @using System.Collections.Generic; 7659 7660 @* Component *@ 7661 7662 @helper RenderCustomerCenterList(CustomerCenterList settings) 7663 { 7664 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 7665 string hideActions = isTouchDevice ? "u-block" : ""; 7666 7667 <table class="table data-list dw-mod"> 7668 @if (settings.GetHeaders().Length > 0) { 7669 <thead> 7670 <tr class="u-bold"> 7671 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 7672 { 7673 var attributes = new Dictionary<string, string>(); 7674 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 7675 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 7676 attributes.Add("align", header.Align.ToString()); 7677 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7678 7679 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 7680 } 7681 </tr> 7682 </thead> 7683 } 7684 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 7685 { 7686 int columnCount = 0; 7687 int totalColumns = listItem.GetInfoItems().Length; 7688 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 7689 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 7690 7691 var attributes = new Dictionary<string, string>(); 7692 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 7693 7694 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7695 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 7696 <tr> 7697 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 7698 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 7699 7700 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 7701 @if (!string.IsNullOrEmpty(listItem.Title)) { 7702 <div class="u-bold">@listItem.Title</div> 7703 } 7704 @if (!string.IsNullOrEmpty(listItem.Description)) { 7705 <div>@listItem.Description</div> 7706 } 7707 </td> 7708 } 7709 7710 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 7711 { 7712 var infoAttributes = new Dictionary<string, string>(); 7713 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 7714 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 7715 infoAttributes.Add("align", infoItem.Align.ToString()); 7716 7717 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7718 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 7719 7720 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 7721 @if (!string.IsNullOrEmpty(infoItem.Title)) { 7722 <div>@infoItem.Title</div> 7723 } 7724 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 7725 <div><small>@infoItem.Subtitle</small></div> 7726 } 7727 </td> 7728 7729 columnCount++; 7730 } 7731 </tr> 7732 <tr> 7733 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 7734 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 7735 @foreach (ButtonBase action in listItem.GetActions()) 7736 { 7737 action.ButtonLayout = ButtonLayout.LinkClean; 7738 action.Icon.CssClass += " u-full-height"; 7739 action.CssClass += " data-list__action-button link"; 7740 7741 @Render(action) 7742 } 7743 </div> 7744 </td> 7745 </tr> 7746 </tbody> 7747 } 7748 </table> 7749 } 7750 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7751 7752 @using System 7753 @using System.Web 7754 @using System.Collections.Generic 7755 @using Dynamicweb.Rapido.Blocks.Extensibility 7756 @using Dynamicweb.Rapido.Blocks 7757 7758 @{ 7759 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 7760 7761 Block primaryBottomSnippets = new Block() 7762 { 7763 Id = "MasterJavascriptInitializers", 7764 SortId = 100, 7765 Template = RenderPrimaryBottomSnippets() 7766 }; 7767 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 7768 7769 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7770 { 7771 Block miniCartPageId = new Block 7772 { 7773 Id = "MiniCartPageId", 7774 Template = RenderMiniCartPageId() 7775 }; 7776 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, miniCartPageId); 7777 } 7778 } 7779 7780 @helper RenderPrimaryBottomSnippets() 7781 { 7782 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 7783 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7784 7785 if (isWireframeMode) 7786 { 7787 <script> 7788 Wireframe.Init(true); 7789 </script> 7790 } 7791 7792 7793 if (useGoogleTagManager) 7794 { 7795 <script> 7796 document.addEventListener('addToCart', function(event) { 7797 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 7798 if (typeof googleImpression == "string") { 7799 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 7800 } 7801 dataLayer.push({ 7802 'event': 'addToCart', 7803 'ecommerce': { 7804 'currencyCode': googleImpression.currency, 7805 'add': { 7806 'products': [{ 7807 'name': googleImpression.name, 7808 'id': googleImpression.id, 7809 'price': googleImpression.price, 7810 'brand': googleImpression.brand, 7811 'category': googleImpression.category, 7812 'variant': googleImpression.variant, 7813 'quantity': event.detail.quantity 7814 }] 7815 } 7816 } 7817 }); 7818 }); 7819 </script> 7820 } 7821 7822 //if digitalwarehouse 7823 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 7824 { 7825 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 7826 7827 if (string.IsNullOrEmpty(cartContextId)) 7828 { 7829 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 7830 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 7831 cartContextId = cartSettings.OrderContextID; 7832 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 7833 } 7834 7835 <script> 7836 let downloadCart = new DownloadCart({ 7837 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 7838 contextId: "@cartContextId", 7839 addButtonText: "@Translate("Add")", 7840 removeButtonText: "@Translate("Remove")" 7841 }); 7842 </script> 7843 } 7844 7845 <!--$$Javascripts--> 7846 } 7847 7848 @helper RenderMiniCartPageId() 7849 { 7850 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7851 <script> 7852 window.cartId = "@miniCartFeedPageId"; 7853 </script> 7854 } 7855 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7856 7857 @using System 7858 @using System.Web 7859 @using System.Collections.Generic 7860 @using Dynamicweb.Rapido.Blocks 7861 7862 @{ 7863 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 7864 7865 } 7866 7867 7868 @functions { 7869 public class ManifestIcon 7870 { 7871 public string src { get; set; } 7872 public string type { get; set; } 7873 public string sizes { get; set; } 7874 } 7875 7876 public class Manifest 7877 { 7878 public string name { get; set; } 7879 public string short_name { get; set; } 7880 public string start_url { get; set; } 7881 public string display { get; set; } 7882 public string background_color { get; set; } 7883 public string theme_color { get; set; } 7884 public List<ManifestIcon> icons { get; set; } 7885 } 7886 } 7887 7888 <!DOCTYPE html> 7889 7890 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 7891 7892 7893 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 7894 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 7895 7896 7897 7898 @helper RenderMasterHead() { 7899 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 7900 7901 <head> 7902 <!-- Rapido version 3.4.3 --> 7903 7904 @RenderBlockList(subBlocks) 7905 </head> 7906 } 7907 7908 @helper RenderMasterMetadata() { 7909 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 7910 var brandColors = swatches.GetColorSwatch(1); 7911 string brandColorOne = brandColors.Palette["BrandColor1"]; 7912 7913 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 7914 Manifest manifest = new Manifest 7915 { 7916 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 7917 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"), 7918 start_url = "/", 7919 display = "standalone", 7920 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 7921 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 7922 }; 7923 7924 manifest.icons = new List<ManifestIcon> { 7925 new ManifestIcon { 7926 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 7927 sizes = "192x192", 7928 type = "image/png" 7929 }, 7930 new ManifestIcon { 7931 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 7932 sizes = "512x512", 7933 type = "image/png" 7934 }, 7935 new ManifestIcon { 7936 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 7937 sizes = "1024x1024", 7938 type = "image/png" 7939 } 7940 }; 7941 7942 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 7943 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 7944 string currentManifest = File.ReadAllText(manifestFilePath); 7945 7946 if (manifestJSON != currentManifest) 7947 { 7948 File.WriteAllText(manifestFilePath, manifestJSON); 7949 } 7950 } 7951 7952 <meta charset="utf-8" /> 7953 <title>@Model.Title</title> 7954 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7955 <meta name="theme-color" content="#FFFFF" /> 7956 <meta name="facebook-domain-verification" content="i8xp0abqgkfnjzf38bqiuxoswk2qh9" /> 7957 <meta name="facebook-domain-verification" content="xic4imranv06kj7c6klvyinw2si2me" /> 7958 7959 7960 7961 if (!Model.MetaTags.Contains("og:image")) { 7962 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"))); 7963 } 7964 7965 if (!Model.MetaTags.Contains("og:description")) { 7966 Pageview.Meta.AddTag("og:description", Model.Description); 7967 } 7968 7969 Pageview.Meta.AddTag("og:title", Model.Title); 7970 Pageview.Meta.AddTag("og:site_name", Model.Name); 7971 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 7972 Pageview.Meta.AddTag("og:type", "Website"); 7973 7974 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.")) 7975 { 7976 Pageview.Meta.AddTag("robots", "noindex,nofollow"); 7977 } 7978 7979 if (!string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"))) { 7980 Pageview.Meta.AddTag("fb:app_id", Model.Area.Item.GetItem("Settings").GetString("FacebookAppID")); 7981 } 7982 7983 @Model.MetaTags 7984 } 7985 7986 @helper RenderMasterCss() { 7987 var fonts = new string[] { 7988 getFontFamily("Layout", "HeaderFont"), 7989 getFontFamily("Layout", "SubheaderFont"), 7990 getFontFamily("Layout", "TertiaryHeaderFont"), 7991 getFontFamily("Layout", "BodyText"), 7992 getFontFamily("Layout", "Header", "ToolsFont"), 7993 getFontFamily("Layout", "Header", "NavigationFont"), 7994 getFontFamily("Layout", "MobileNavigation", "Font"), 7995 getFontFamily("ProductList", "Facets", "HeaderFont"), 7996 getFontFamily("ProductPage", "PriceFontDesign"), 7997 getFontFamily("Ecommerce", "SaleSticker", "Font"), 7998 getFontFamily("Ecommerce", "NewSticker", "Font"), 7999 getFontFamily("Ecommerce", "CustomSticker", "Font") 8000 }; 8001 8002 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 8003 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 8004 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 8005 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 8006 if (useFontAwesomePro) 8007 { 8008 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 8009 } 8010 8011 //Favicon 8012 <link href="@favicon" rel="icon" type="image/png"> 8013 8014 //Base (Default, wireframe) styles 8015 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 8016 8017 //Rapido Css from Website Settings 8018 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 8019 8020 //Ignite Css (Custom site specific styles) 8021 <link rel="stylesheet" id="igniteCss" type="text/css" href="@TemplateHelper.GetRevisionNumber("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css")"> 8022 8023 //Font awesome 8024 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 8025 8026 //Flag icon 8027 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 8028 8029 @*//Google fonts 8030 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))); 8031 8032 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">*@ 8033 8034 8035 8036 PushPromise(favicon); 8037 PushPromise(fontAwesomeCssLink); 8038 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 8039 PushPromise(autoCssLink); 8040 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 8041 PushPromise("/Files/Images/placeholder.gif"); 8042 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 8043 } 8044 8045 @helper RenderMasterManifest() { 8046 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 8047 { 8048 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 8049 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 8050 } 8051 } 8052 8053 @helper RenderMasterBody() { 8054 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 8055 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 8056 if (!String.IsNullOrEmpty(designLayout)) { 8057 designLayout = "class=\"" + designLayout + "\""; 8058 } 8059 8060 <body @designLayout> 8061 @RenderBlockList(subBlocks) 8062 </body> 8063 } 8064 8065 @helper RenderMasterHeader() 8066 { 8067 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 8068 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8069 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 8070 8071 <header class="top-container @stickyTop dw-mod" id="Top"> 8072 @RenderBlockList(subBlocks) 8073 </header> 8074 } 8075 8076 @helper RenderMain() 8077 { 8078 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 8079 8080 <main class="site dw-mod"> 8081 @RenderBlockList(subBlocks) 8082 </main> 8083 } 8084 8085 @helper RenderPageContent() 8086 { 8087 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8088 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 8089 8090 <div id="Page" class="page @pagePos"> 8091 <section class="center-container content-container dw-mod" id="content"> 8092 8093 @RenderSnippet("Content") 8094 </section> 8095 </div> 8096 } 8097 8098 @* Hack to support nested helpers *@ 8099 @SnippetStart("Content") 8100 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8101 8102 8103 @using Dynamicweb.Extensibility 8104 @using Dynamicweb.Core 8105 @using Dynamicweb.Rapido.Blocks.Components 8106 @using Dynamicweb.Rapido.Blocks.Components.Articles 8107 @using Dynamicweb.Rapido.Blocks.Components.General 8108 @using Dynamicweb.Rapido.Blocks 8109 @using Dynamicweb.Content.Items 8110 8111 @functions { 8112 BlocksPage articlePage = BlocksPage.GetBlockPage("DynamicArticle"); 8113 8114 public string GetParentSettingsItem(string systemName) { 8115 string item = null; 8116 8117 Dynamicweb.Content.Page current = Dynamicweb.Services.Pages.GetPage(Model.ID); 8118 while (current != null && current.Parent != current) { 8119 var temp = current.Item != null ? current.Item[systemName] : ""; 8120 8121 if (temp != null) { 8122 item = temp.ToString(); 8123 8124 if (!String.IsNullOrEmpty(item) && !String.Equals("default", item, StringComparison.OrdinalIgnoreCase)) { 8125 break; 8126 } 8127 } 8128 8129 current = current.Parent; 8130 } 8131 8132 return item; 8133 } 8134 8135 public string GetArticleCategory(int pageId) 8136 { 8137 string categoryName = null; 8138 8139 //Secure that the article is not in the root folder = Actual has a category 8140 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent != null) { 8141 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent != null) { 8142 if (!String.IsNullOrEmpty(Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent.ItemType)) 8143 { 8144 categoryName = Dynamicweb.Services.Pages.GetPage(pageId).Parent.GetDisplayName(); 8145 } 8146 } 8147 } 8148 8149 return categoryName; 8150 } 8151 8152 public string GetArticleCategoryColor(int pageId) 8153 { 8154 string categoryColor = ""; 8155 8156 //Secure that the article is not in the root folder = Actual has a category 8157 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent != null) { 8158 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent != null) { 8159 if (!String.IsNullOrEmpty(Dynamicweb.Services.Pages.GetPage(pageId).Parent.Parent.ItemType)) 8160 { 8161 if (Dynamicweb.Services.Pages.GetPage(pageId).Parent.Item["CategoryColor"] != null) 8162 { 8163 var service = new ColorSwatchService(); 8164 categoryColor = Dynamicweb.Services.Pages.GetPage(pageId).Parent.Item["CategoryColor"].ToString(); 8165 8166 if (!categoryColor.Contains("#")) { 8167 categoryColor = service.GetHexColor(Converter.ToInt32(Model.Area.ID), categoryColor); 8168 } 8169 } 8170 } 8171 } 8172 } 8173 8174 return categoryColor; 8175 } 8176 } 8177 8178 @{ 8179 string listPageId = Converter.ToString(GetPageIdByNavigationTag("DynamicListFeed")); 8180 string parentPageId = Dynamicweb.Services.Pages.GetPage(Model.ID).Parent.ID.ToString(); 8181 string topLayout = Model.Item.GetList("TopLayout") != null ? Model.Item.GetList("TopLayout").SelectedValue : "default"; 8182 topLayout = topLayout == "default" && GetParentSettingsItem("ArticleTopLayout") != null ? GetParentSettingsItem("ArticleTopLayout").ToString().ToLower() : topLayout; 8183 string textLayout = Model.Item.GetList("TextLayout") != null ? Model.Item.GetList("TextLayout").SelectedValue : "default"; 8184 textLayout = textLayout == "default" && GetParentSettingsItem("ArticleTextLayout") != null ? GetParentSettingsItem("ArticleTextLayout").ToString().ToLower() : textLayout; 8185 string imageLayout = Model.Item.GetList("ImageLayout") != null ? Model.Item.GetList("ImageLayout").SelectedValue : "default"; 8186 imageLayout = imageLayout == "default" && GetParentSettingsItem("ArticleImageLayout") != null ? GetParentSettingsItem("ArticleImageLayout").ToString().ToLower() : imageLayout; 8187 8188 string imageColumns = imageLayout == "straight" && textLayout != "full" ? "8" : "12"; 8189 string contentColumns = textLayout != "full" ? "8" : "12"; 8190 8191 int externalParagraphId = Model.Item.GetItem("CTAParagraphLink") != null ? Model.Item.GetItem("CTAParagraphLink").ParagraphID : 0; 8192 8193 ArticleHeaderLayout headerLayout; 8194 8195 switch (topLayout) 8196 { 8197 case "default": 8198 headerLayout = ArticleHeaderLayout.Clean; 8199 break; 8200 case "split": 8201 headerLayout = ArticleHeaderLayout.Split; 8202 break; 8203 case "banner": 8204 headerLayout = ArticleHeaderLayout.Banner; 8205 break; 8206 case "overlay": 8207 headerLayout = ArticleHeaderLayout.Overlay; 8208 break; 8209 default: 8210 headerLayout = ArticleHeaderLayout.Clean; 8211 break; 8212 } 8213 8214 8215 Block articleContainer = new Block 8216 { 8217 Id = "ArticleContainer", 8218 SortId = 10, 8219 Design = new Design 8220 { 8221 RenderType = RenderType.Row 8222 }, 8223 BlocksList = new List<Block> { 8224 new Block { 8225 Id = "ArticleBody", 8226 SortId = 30, 8227 Design = new Design { 8228 RenderType = RenderType.Column, 8229 Size = "12", 8230 HidePadding = true 8231 } 8232 } 8233 } 8234 }; 8235 articlePage.Add(articleContainer); 8236 8237 ButtonLayout topBannerButtonLayout = ButtonLayout.Primary; 8238 8239 switch (Model.Item.GetString("ButtonDesign")) { 8240 case "primary": 8241 topBannerButtonLayout = ButtonLayout.Primary; 8242 break; 8243 case "secondary": 8244 topBannerButtonLayout = ButtonLayout.Secondary; 8245 break; 8246 case "teritary": 8247 topBannerButtonLayout = ButtonLayout.Tertiary; 8248 break; 8249 case "link": 8250 topBannerButtonLayout = ButtonLayout.Link; 8251 break; 8252 } 8253 8254 ArticleHeader topBanner = new ArticleHeader 8255 { 8256 Layout = headerLayout, 8257 Image = new Image { Path = Model.Item.GetFile("Image"), ImageDefault = new ImageSettings { Width = 1920, Height = 640 } }, 8258 Heading = Model.Item.GetString("Title"), 8259 Subheading = Model.Item.GetString("Summary"), 8260 TextColor = "#fff", 8261 Author = Model.Item.GetString("Author"), 8262 Date = Model.Item.GetString("Date"), 8263 Category = GetArticleCategory(Model.ID), 8264 CategoryColor = GetArticleCategoryColor(Model.ID), 8265 Link = Model.Item.GetString("Link"), 8266 LinkText = Model.Item.GetString("LinkText"), 8267 ButtonLayout = topBannerButtonLayout, 8268 RatingScore = Model.Item.GetString("Rating") != null ? Converter.ToInt32(Model.Item.GetList("Rating").SelectedValue) : 0, 8269 RatingOutOf = Model.Item.GetString("Rating") != null ? Model.Item.GetList("Rating").Options.Count : 0, 8270 ExternalParagraphId = externalParagraphId 8271 }; 8272 8273 Block articleTop = new Block 8274 { 8275 Id = "ArticleHead", 8276 SortId = 20, 8277 Component = topBanner, 8278 Design = new Design 8279 { 8280 RenderType = RenderType.Column, 8281 Size = "12", 8282 HidePadding = true, 8283 CssClass = "article-head" 8284 } 8285 }; 8286 articlePage.Add("ArticleContainer", articleTop); 8287 8288 8289 Block articleBodyRow = new Block 8290 { 8291 Id = "ArticleBodyRow", 8292 SortId = 10, 8293 SkipRenderBlocksList = true 8294 }; 8295 articlePage.Add("ArticleBody", articleBodyRow); 8296 8297 8298 if (Model.Item.GetString("Paragraphs") != null) 8299 { 8300 int count = 0; 8301 foreach (var paragraph in Model.Item.GetItems("Paragraphs")) 8302 { 8303 if (!paragraph.GetBoolean("RenderAsQuote")) 8304 { 8305 string enableDropCap = Model.Item.GetString("EnableDropCap") != null ? Model.Item.GetList("EnableDropCap").SelectedValue.ToLower() : "default"; 8306 enableDropCap = enableDropCap == "default" && GetParentSettingsItem("EnableDropCap") != null ? GetParentSettingsItem("EnableDropCap").ToString().ToLower() : enableDropCap; 8307 string text = paragraph.GetString("Text") != null ? paragraph.GetString("Text") : ""; 8308 8309 if (!String.IsNullOrEmpty(text) && enableDropCap == "true" && count == 0 && paragraph.GetString("Text").Substring(0, 3) == "<p>") 8310 { 8311 string firstLetter = paragraph.GetString("Text").Substring(3, 1); 8312 text = paragraph.GetString("Text").Remove(3, 1); 8313 text = text.Insert(3, "<span class=\"article__drop-cap\">" + firstLetter + "</span>"); 8314 } 8315 8316 if (paragraph.GetFile("Image") != null) 8317 { 8318 string imageTitle = !string.IsNullOrEmpty(paragraph.GetString("Heading")) ? paragraph.GetString("Heading") : ""; 8319 8320 Block articleParagraphImage = new Block 8321 { 8322 Id = "ArticleParagraph" + count + "Image", 8323 SortId = (count * 10), 8324 Design = new Design 8325 { 8326 RenderType = RenderType.Column, 8327 Size = imageColumns, 8328 CssClass = "u-color-light--bg u-padding--lg" 8329 } 8330 }; 8331 8332 if (imageLayout == "banner") 8333 { 8334 ArticleBanner banner = new ArticleBanner 8335 { 8336 Image = new Image { Path = paragraph.GetFile("Image"), ImageDefault = new ImageSettings { Height = 650, Width = 1300 }, Caption = paragraph.GetString("ImageCaption") }, 8337 Heading = imageTitle, 8338 UseFilters = false 8339 }; 8340 articleParagraphImage.Component = banner; 8341 } 8342 else 8343 { 8344 ArticleImage image = new ArticleImage 8345 { 8346 Image = new Image 8347 { 8348 Path = paragraph.GetFile("Image"), 8349 Title = imageTitle, 8350 ImageDefault = new ImageSettings { Height = 650, Width = 1300 }, 8351 Caption = paragraph.GetString("ImageCaption") 8352 } 8353 }; 8354 articleParagraphImage.Component = image; 8355 } 8356 8357 articlePage.Add("ArticleBodyRow", articleParagraphImage); 8358 } 8359 8360 if (!String.IsNullOrEmpty(paragraph.GetString("VideoURL"))) 8361 { 8362 Block articleParagraphVideo = new Block 8363 { 8364 Id = "ArticleParagraph" + count + "Video", 8365 SortId = (count * 10) + 1, 8366 Component = new ArticleVideo { Url = paragraph.GetString("VideoURL"), AutoPlay = "false" }, 8367 Design = new Design 8368 { 8369 RenderType = RenderType.Column, 8370 Size = imageColumns, 8371 CssClass = "u-color-light--bg u-padding--lg" 8372 } 8373 }; 8374 articlePage.Add("ArticleBodyRow", articleParagraphVideo); 8375 } 8376 8377 if (!String.IsNullOrEmpty(paragraph.GetString("Heading"))) 8378 { 8379 Block articleParagraphHeader = new Block 8380 { 8381 Id = "ArticleParagraph" + count + "Heading", 8382 SortId = (count * 10) + 2, 8383 Component = new ArticleSubHeader { Title = paragraph.GetString("Heading") }, 8384 Design = new Design 8385 { 8386 RenderType = RenderType.Column, 8387 Size = contentColumns, 8388 CssClass = "u-color-light--bg u-padding--lg" 8389 } 8390 }; 8391 articlePage.Add("ArticleBodyRow", articleParagraphHeader); 8392 } 8393 8394 if (!String.IsNullOrEmpty(text)) 8395 { 8396 Block articleParagraphText = new Block 8397 { 8398 Id = "ArticleParagraph" + count + "Text", 8399 SortId = (count * 10) + 3, 8400 Component = new ArticleText { Text = text }, 8401 Design = new Design 8402 { 8403 RenderType = RenderType.Column, 8404 Size = contentColumns, 8405 CssClass = "u-color-light--bg u-padding--lg" 8406 } 8407 }; 8408 8409 articlePage.Add("ArticleBodyRow", articleParagraphText); 8410 } 8411 } 8412 else 8413 { 8414 if (!String.IsNullOrEmpty(paragraph.GetString("Text"))) 8415 { 8416 string quoteText = paragraph.GetString("Text") != null ? paragraph.GetString("Text") : ""; 8417 string quoteAuthor = paragraph.GetString("Heading") != null ? paragraph.GetString("Heading") : ""; 8418 8419 Block articleParagraphQuote = new Block 8420 { 8421 Id = "ArticleParagraph" + count + "Quote", 8422 SortId = (count * 10) + 3, 8423 Component = new ArticleQuote { Image = new Image { Path = paragraph.GetFile("Image") }, Text = quoteText, Author = quoteAuthor }, 8424 Design = new Design 8425 { 8426 RenderType = RenderType.Column, 8427 Size = contentColumns, 8428 CssClass = "u-color-light--bg u-padding--lg" 8429 } 8430 }; 8431 articlePage.Add("ArticleBodyRow", articleParagraphQuote); 8432 } 8433 } 8434 8435 count++; 8436 } 8437 } 8438 8439 articleBodyRow.Component = new ArticleBodyRow { SubBlocks = articleBodyRow.BlocksList, TopLayout = topLayout, TextLayout = textLayout }; 8440 8441 8442 //Related 8443 string showRelatedArtices = Model.Item.GetString("ShowRelatedArticles") != null ? Model.Item.GetList("ShowRelatedArticles").SelectedValue.ToLower() : "default"; 8444 showRelatedArtices = showRelatedArtices == "default" && GetParentSettingsItem("ShowRelatedArticles") != null ? GetParentSettingsItem("ShowRelatedArticles").ToString().ToLower() : showRelatedArtices; 8445 8446 if (showRelatedArtices == "true") 8447 { 8448 Block articleRelated = new Block 8449 { 8450 Id = "ArticleRelated", 8451 SortId = 30, 8452 Component = new ArticleRelated { Title = Translate("Related articles"), FeedPageId = listPageId, Query = "sourceType=Page&sourcePage=" + parentPageId, PageSize = 4, CurrentPageId = Model.ID.ToString() }, 8453 Design = new Design 8454 { 8455 RenderType = RenderType.Column, 8456 Size = "12" 8457 } 8458 }; 8459 articlePage.Add("ArticleContainer", articleRelated); 8460 } 8461 } 8462 8463 8464 @using System 8465 @using System.Web 8466 @using System.Collections.Generic 8467 @using Dynamicweb.Rapido.Blocks 8468 8469 @{ 8470 BlocksPage dynamicArticleCustomBlocksPage = BlocksPage.GetBlockPage("DynamicArticle"); 8471 8472 } 8473 8474 8475 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 8476 @RenderBlockList(articlePage.BlocksRoot.BlocksList) 8477 @SnippetEnd("Content") 8478 8479 @helper RenderIosTabletFix() { 8480 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 8481 { 8482 <script> 8483 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 8484 if (isIpadIOS) { 8485 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 8486 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 8487 } 8488 </script> 8489 } 8490 } 8491 8492 </html> 8493 8494