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