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_ec491c6e9f63471886b8ae9569c95d33.Execute() in D:\dynamicweb.net\Solutions\powertechnic.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\DynamicArticle.parsed.cshtml:line 8374
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

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