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_4bcaa9cc8f584c4f9f2ccb4be73fbb41.Execute() in C:\inetpub\wwwroot\Applications\prelive.australismusic.com.au\Files\Templates\Designs\Rapido\_parsed\DynamicArticle.parsed.cshtml:line 8702
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

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