Error executing template "Designs/Rapido/_parsed/Page.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<RenderMasterMetadata>b__200_0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 7999
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 253
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 163
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<RenderMasterHead>b__199_0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 7944
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 253
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 163
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 286
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 163
   at CompiledRazorTemplates.Dynamic.RazorEngine_0a524fcd7a07432793b6c36025b2be59.Execute() in D:\Dynamicweb.net\Solutions\Dynamicweb\aktrading.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 7934
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

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