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