Error executing template "Designs/Rapido/eCom/Productlist/ProductsRender.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at Dynamicweb.Ecommerce.Products.GroupService.GetSubgroups(Group group, Boolean showUnTranslated) at Dynamicweb.Ecommerce.Products.GroupService.HasSubgroups(Group group) at CompiledRazorTemplates.Dynamic.RazorEngine_e40fa8dc5adb46d083909c9982036958.<RenderPageContainer>b__95_0(TextWriter __razor_helper_writer) in D:\wwwroot\nevotex\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 4223 at RazorEngine.Templating.TemplateWriter.ToString() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at CompiledRazorTemplates.Dynamic.RazorEngine_e40fa8dc5adb46d083909c9982036958.<>c__DisplayClass5_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in D:\wwwroot\nevotex\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 225 at CompiledRazorTemplates.Dynamic.RazorEngine_e40fa8dc5adb46d083909c9982036958.<>c__DisplayClass4_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in D:\wwwroot\nevotex\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 135 at CompiledRazorTemplates.Dynamic.RazorEngine_e40fa8dc5adb46d083909c9982036958.Execute() in D:\wwwroot\nevotex\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 4204 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.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb.Frontend.Devices 3 @using Dynamicweb.Extensibility 4 @using Dynamicweb.Content 5 @using Dynamicweb.Core 6 @using System 7 @using System.IO 8 @using System.Web 9 @using System.Collections.Generic; 10 @using System.Linq 11 @using System.Text.RegularExpressions 12 @using Dynamicweb.Ecommerce; 13 @using Dynamicweb.Rapido.Blocks 14 @using Dynamicweb.Rapido.Blocks.Components.General 15 16 @functions { 17 BlocksPage productListPage = BlocksPage.GetBlockPage("ProductList"); 18 Dynamicweb.Frontend.ItemViewModel productListSettings = null; 19 20 string favoriteListId = HttpContext.Current.Request.QueryString.Get("ListID"); 21 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 22 23 } 24 25 @{ 26 27 productListSettings = Pageview.AreaSettings.GetItem("ProductList"); 28 29 30 31 // productlistTemplate 32 33 Block pageContainer = new Block() 34 { 35 Id = "PageContainer", 36 Template = RenderPageContainer(), 37 SkipRenderBlocksList = true, 38 BlocksList = new List<Block> { 39 new Block 40 { 41 Id = "ProductListHeader", 42 SortId = 10, 43 Template = RenderProductListHeader(), 44 SkipRenderBlocksList = true, 45 BlocksList = new List<Block> { 46 new Block 47 { 48 Id = "ProductListTitle", 49 SortId = 10, 50 Design = new Design 51 { 52 CssClass = isFavoriteList ? "grid__col-xs-12 grid__col-md-4" : "grid__col-xs-12 grid__col-md-6" 53 }, 54 Template = RenderProductListTitle() 55 } 56 } 57 } 58 } 59 }; 60 productListPage.Add(pageContainer); 61 62 Block productListNavigation = new Block() 63 { 64 Id = "Navigation", 65 SortId = 20, 66 Design = new Design 67 { 68 RenderType = RenderType.Column, 69 Size = "3" 70 } 71 }; 72 productListPage.Add("PageContainer", productListNavigation); 73 74 Block productListContainer = new Block() 75 { 76 Id = "ProductList", 77 SortId = 30, 78 Template = RenderProductList(), 79 SkipRenderBlocksList = true 80 }; 81 productListPage.Add("PageContainer", productListContainer); 82 83 if (isFavoriteList) 84 { 85 productListPage.Add("ProductListHeader", new Block 86 { 87 Id = "FavoriteListSearch", 88 SortId = 20, 89 Template = RenderFavoriteListSearch(), 90 Design = new Design 91 { 92 CssClass = "grid__col-sm-4 u-margin-bottom u-margin-top grid--align-self-center" 93 } 94 }); 95 } 96 97 Block productListSnippets = new Block() 98 { 99 Id = "BottomSnippets", 100 SortId = 40 101 }; 102 productListPage.Add(productListSnippets); 103 } 104105 @* This is required for the product list feed to work *@ 106 @GetValue("DoNotRenderProductListTemplate") 107108 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 109 @using System.Text.RegularExpressions 110 @using System.Collections.Generic 111 @using System.Reflection 112 @using System.Web 113 @using System.Web.UI.HtmlControls 114 @using Dynamicweb.Rapido.Blocks.Components 115 @using Dynamicweb.Rapido.Blocks.Components.Articles 116 @using Dynamicweb.Rapido.Blocks.Components.Documentation 117 @using Dynamicweb.Rapido.Blocks 118119120 @*--- START: Base block renderers ---*@ 121122 @helper RenderBlockList(List<Block> blocks) 123 { 124 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 125 blocks = blocks.OrderBy(item => item.SortId).ToList(); 126127 foreach (Block item in blocks) 128 { 129 if (debug) { 130 <!-- Block START: @item.Id --> 131 } 132133 if (item.Design == null) 134 { 135 @RenderBlock(item) 136 } 137 else if (item.Design.RenderType == RenderType.None) { 138 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 139140 <div class="@cssClass dw-mod"> 141 @RenderBlock(item) 142 </div> 143 } 144 else if (item.Design.RenderType != RenderType.Hide) 145 { 146 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 147148 if (!item.SkipRenderBlocksList) { 149 if (item.Design.RenderType == RenderType.Row) 150 { 151 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 152 @RenderBlock(item) 153 </div> 154 } 155156 if (item.Design.RenderType == RenderType.Column) 157 { 158 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 159 string size = item.Design.Size ?? "12"; 160 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 161162 <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"> 163 @RenderBlock(item) 164 </div> 165 } 166167 if (item.Design.RenderType == RenderType.Table) 168 { 169 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 170 @RenderBlock(item) 171 </table> 172 } 173174 if (item.Design.RenderType == RenderType.TableRow) 175 { 176 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 177 @RenderBlock(item) 178 </tr> 179 } 180181 if (item.Design.RenderType == RenderType.TableColumn) 182 { 183 <td class="@cssClass dw-mod" id="Block__@item.Id"> 184 @RenderBlock(item) 185 </td> 186 } 187188 if (item.Design.RenderType == RenderType.CardHeader) 189 { 190 <div class="card-header @cssClass dw-mod"> 191 @RenderBlock(item) 192 </div> 193 } 194195 if (item.Design.RenderType == RenderType.CardBody) 196 { 197 <div class="card @cssClass dw-mod"> 198 @RenderBlock(item) 199 </div> 200 } 201202 if (item.Design.RenderType == RenderType.CardFooter) 203 { 204 <div class="card-footer @cssClass dw-mod"> 205 @RenderBlock(item) 206 </div> 207 } 208 } 209 else 210 { 211 @RenderBlock(item) 212 } 213 } 214215 if (debug) { 216 <!-- Block END: @item.Id --> 217 } 218 } 219 } 220221 @helper RenderBlock(Block item) 222 { 223 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 224225 if (item.Template != null) 226 { 227 @BlocksPage.RenderTemplate(item.Template) 228 } 229230 if (item.Component != null) 231 { 232 string customSufix = "Custom"; 233 string methodName = item.Component.HelperName; 234235 ComponentBase[] methodParameters = new ComponentBase[1]; 236 methodParameters[0] = item.Component; 237 Type methodType = this.GetType(); 238239 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 240 MethodInfo generalMethod = methodType.GetMethod(methodName); 241242 try { 243 if (debug) { 244 <!-- Component: @methodName.Replace("Render", "") --> 245 } 246 @customMethod.Invoke(this, methodParameters).ToString(); 247 } catch { 248 try { 249 @generalMethod.Invoke(this, methodParameters).ToString(); 250 } catch(Exception ex) { 251 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 252 } 253 } 254 } 255256 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 257 { 258 @RenderBlockList(item.BlocksList) 259 } 260 } 261262 @*--- END: Base block renderers ---*@ 263264 @using Dynamicweb.Rapido.Blocks.Components 265 @using Dynamicweb.Rapido.Blocks.Components.General 266 @using Dynamicweb.Rapido.Blocks 267 @using System.IO 268269 @* Required *@ 270 @using Dynamicweb.Rapido.Blocks.Components 271 @using Dynamicweb.Rapido.Blocks.Components.General 272 @using Dynamicweb.Rapido.Blocks 273274275 @helper Render(ComponentBase component) 276 { 277 if (component != null) 278 { 279 @component.Render(this) 280 } 281 } 282283 @* Components *@ 284 @using System.Reflection 285 @using Dynamicweb.Rapido.Blocks.Components.General 286287288 @* Component *@ 289290 @helper RenderIcon(Icon settings) 291 { 292 if (settings != null) 293 { 294 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 295296 if (settings.Name != null) 297 { 298 if (string.IsNullOrEmpty(settings.Label)) 299 { 300 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 301 } 302 else 303 { 304 if (settings.LabelPosition == IconLabelPosition.Before) 305 { 306 <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> 307 } 308 else 309 { 310 <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> 311 } 312 } 313 } 314 else if (!string.IsNullOrEmpty(settings.Label)) 315 { 316 @settings.Label 317 } 318 } 319 } 320 @using System.Reflection 321 @using Dynamicweb.Rapido.Blocks.Components.General 322 @using Dynamicweb.Rapido.Blocks.Components 323 @using Dynamicweb.Core 324325 @* Component *@ 326327 @helper RenderButton(Button settings) 328 { 329 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 330 { 331 Dictionary<string, string> attributes = new Dictionary<string, string>(); 332 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 333 if (settings.Disabled) { 334 attributes.Add("disabled", "true"); 335 classList.Add("disabled"); 336 } 337338 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 339 { 340 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 341 @RenderConfirmDialog(settings); 342 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 343 } 344345 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 346 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 347 if (!string.IsNullOrEmpty(settings.AltText)) 348 { 349 attributes.Add("title", settings.AltText); 350 } 351 else if (!string.IsNullOrEmpty(settings.Title)) 352 { 353 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty); 354 cleanTitle = cleanTitle.Replace(" ", " "); 355 attributes.Add("title", cleanTitle); 356 } 357358 var onClickEvents = new List<string>(); 359 if (!string.IsNullOrEmpty(settings.OnClick)) 360 { 361 onClickEvents.Add(settings.OnClick); 362 } 363 if (!string.IsNullOrEmpty(settings.Href)) 364 { 365 onClickEvents.Add("location.href='" + settings.Href + "'"); 366 } 367 if (onClickEvents.Count > 0) 368 { 369 attributes.Add("onClick", string.Join(";", onClickEvents)); 370 } 371372 if (settings.ButtonLayout != ButtonLayout.None) 373 { 374 classList.Add("btn"); 375 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 376 if (btnLayout == "linkclean") 377 { 378 btnLayout = "link-clean"; //fix 379 } 380 classList.Add("btn--" + btnLayout); 381 } 382383 if (settings.Icon == null) 384 { 385 settings.Icon = new Icon(); 386 } 387388 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : ""; 389 settings.Icon.Label = settings.Title; 390391 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 392393 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 394 } 395 } 396397 @helper RenderConfirmDialog(Button settings) 398 { 399 Modal confirmDialog = new Modal { 400 Id = settings.Id, 401 Width = ModalWidth.Sm, 402 Heading = new Heading 403 { 404 Level = 2, 405 Title = settings.ConfirmTitle 406 }, 407 BodyText = settings.ConfirmText 408 }; 409410 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 411 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 412413 @Render(confirmDialog) 414 } 415 @using Dynamicweb.Rapido.Blocks.Components.General 416 @using Dynamicweb.Rapido.Blocks.Components 417 @using Dynamicweb.Core 418419 @helper RenderDashboard(Dashboard settings) 420 { 421 var widgets = settings.GetWidgets(); 422423 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 424 { 425 //set bg color for them 426427 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 428 int r = Convert.ToInt16(color.R); 429 int g = Convert.ToInt16(color.G); 430 int b = Convert.ToInt16(color.B); 431432 var count = widgets.Length; 433 var max = Math.Max(r, Math.Max(g, b)); 434 double step = 255.0 / (max * count); 435 var i = 0; 436 foreach (var widget in widgets) 437 { 438 i++; 439440 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 441 widget.BackgroundColor = shade; 442 } 443 } 444445 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 446 @foreach (var widget in widgets) 447 { 448 <div class="dashboard__widget"> 449 @Render(widget) 450 </div> 451 } 452 </div> 453 } 454 @using Dynamicweb.Rapido.Blocks.Components.General 455 @using Dynamicweb.Rapido.Blocks.Components 456457 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 458 { 459 if (!string.IsNullOrEmpty(settings.Link)) 460 { 461 var backgroundStyles = ""; 462 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 463 { 464 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 465 } 466467 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 468 <div class="u-center-middle u-color-light"> 469 @if (settings.Icon != null) 470 { 471 settings.Icon.CssClass += "widget__icon"; 472 @Render(settings.Icon) 473 } 474 <div class="widget__title">@settings.Title</div> 475 </div> 476 </a> 477 } 478 } 479 @using Dynamicweb.Rapido.Blocks.Components.General 480 @using Dynamicweb.Rapido.Blocks.Components 481482 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 483 { 484 var backgroundStyles = ""; 485 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 486 { 487 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 488 } 489490 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 491 <div class="u-center-middle u-color-light"> 492 @if (settings.Icon != null) 493 { 494 settings.Icon.CssClass += "widget__icon"; 495 @Render(settings.Icon) 496 } 497 <div class="widget__counter">@settings.Count</div> 498 <div class="widget__title">@settings.Title</div> 499 </div> 500 </div> 501 } 502 @using System.Reflection 503 @using Dynamicweb.Rapido.Blocks.Components.General 504 @using Dynamicweb.Rapido.Blocks.Components 505 @using Dynamicweb.Core 506507 @* Component *@ 508509 @helper RenderLink(Link settings) 510 { 511 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 512 { 513 Dictionary<string, string> attributes = new Dictionary<string, string>(); 514 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 515 if (settings.Disabled) 516 { 517 attributes.Add("disabled", "true"); 518 classList.Add("disabled"); 519 } 520521 if (!string.IsNullOrEmpty(settings.AltText)) 522 { 523 attributes.Add("title", settings.AltText); 524 } 525 else if (!string.IsNullOrEmpty(settings.Title)) 526 { 527 attributes.Add("title", settings.Title); 528 } 529530 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 531 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 532 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 533 attributes.Add("href", settings.Href); 534535 if (settings.ButtonLayout != ButtonLayout.None) 536 { 537 classList.Add("btn"); 538 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 539 if (btnLayout == "linkclean") 540 { 541 btnLayout = "link-clean"; //fix 542 } 543 classList.Add("btn--" + btnLayout); 544 } 545546 if (settings.Icon == null) 547 { 548 settings.Icon = new Icon(); 549 } 550 settings.Icon.Label = settings.Title; 551552 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 553 { 554 settings.Rel = LinkRelType.Noopener; 555 } 556 if (settings.Target != LinkTargetType.None) 557 { 558 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 559 } 560 if (settings.Download) 561 { 562 attributes.Add("download", "true"); 563 } 564 if (settings.Rel != LinkRelType.None) 565 { 566 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 567 } 568569 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 570 } 571 } 572 @using System.Reflection 573 @using Dynamicweb.Rapido.Blocks.Components 574 @using Dynamicweb.Rapido.Blocks.Components.General 575 @using Dynamicweb.Rapido.Blocks 576577578 @* Component *@ 579580 @helper RenderRating(Rating settings) 581 { 582 if (settings.Score > 0) 583 { 584 int rating = settings.Score; 585 string iconType = "fa-star"; 586587 switch (settings.Type.ToString()) { 588 case "Stars": 589 iconType = "fa-star"; 590 break; 591 case "Hearts": 592 iconType = "fa-heart"; 593 break; 594 case "Lemons": 595 iconType = "fa-lemon"; 596 break; 597 case "Bombs": 598 iconType = "fa-bomb"; 599 break; 600 } 601602 <div class="u-ta-right"> 603 @for (int i = 0; i < settings.OutOf; i++) 604 { 605 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 606 } 607 </div> 608 } 609 } 610 @using System.Reflection 611 @using Dynamicweb.Rapido.Blocks.Components.General 612 @using Dynamicweb.Rapido.Blocks.Components 613614615 @* Component *@ 616617 @helper RenderSelectFieldOption(SelectFieldOption settings) 618 { 619 Dictionary<string, string> attributes = new Dictionary<string, string>(); 620 if (settings.Checked) { attributes.Add("selected", "true"); } 621 if (settings.Disabled) { attributes.Add("disabled", "true"); } 622 if (settings.Value != null) { attributes.Add("value", settings.Value); } 623 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 624625 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 626 } 627 @using System.Reflection 628 @using Dynamicweb.Rapido.Blocks.Components.General 629 @using Dynamicweb.Rapido.Blocks.Components 630631632 @* Component *@ 633634 @helper RenderNavigation(Navigation settings) { 635 @RenderNavigation(new 636 { 637 id = settings.Id, 638 cssclass = settings.CssClass, 639 startLevel = settings.StartLevel, 640 endlevel = settings.EndLevel, 641 expandmode = settings.Expandmode, 642 sitemapmode = settings.SitemapMode, 643 template = settings.Template 644 }) 645 } 646 @using Dynamicweb.Rapido.Blocks.Components.General 647 @using Dynamicweb.Rapido.Blocks.Components 648649650 @* Component *@ 651652 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 653 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 654 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 655 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 656 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 657 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 658 settings.SitemapMode = false; 659660 @RenderNavigation(settings) 661 } 662 @using Dynamicweb.Rapido.Blocks.Components.General 663 @using Dynamicweb.Rapido.Blocks.Components 664665666 @* Component *@ 667668 @helper RenderLeftNavigation(LeftNavigation settings) { 669 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 670 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 671 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 672 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 673 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 674675 <div class="grid__cell"> 676 @RenderNavigation(settings) 677 </div> 678 } 679 @using System.Reflection 680 @using Dynamicweb.Rapido.Blocks.Components.General 681 @using Dynamicweb.Core 682683 @* Component *@ 684685 @helper RenderHeading(Heading settings) 686 { 687 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 688 { 689 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 690 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 691692 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 693 if (!string.IsNullOrEmpty(settings.Link)) 694 { 695 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 696 } 697 else 698 { 699 if (settings.Icon == null) 700 { 701 settings.Icon = new Icon(); 702 } 703 settings.Icon.Label = settings.Title; 704 @Render(settings.Icon) 705 } 706 @("</" + tagName + ">"); 707 } 708 } 709 @using Dynamicweb.Rapido.Blocks.Components 710 @using Dynamicweb.Rapido.Blocks.Components.General 711 @using Dynamicweb.Rapido.Blocks 712713714 @* Component *@ 715716 @helper RenderImage(Image settings) 717 { 718 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 719 { 720 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 721 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 722723 if (settings.Caption != null) 724 { 725 @:<div> 726 } 727728 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 729 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 730731 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 732 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 733 @if (settings.Link != null) 734 { 735 <a href="@settings.Link"> 736 @RenderTheImage(settings) 737 </a> 738 } 739 else 740 { 741 @RenderTheImage(settings) 742 } 743 </div> 744 </div> 745746 if (settings.Caption != null) 747 { 748 <span class="image-caption dw-mod">@settings.Caption</span> 749 @:</div> 750 } 751 } 752 else 753 { 754 if (settings.Caption != null) 755 { 756 @:<div> 757 } 758 if (!string.IsNullOrEmpty(settings.Link)) 759 { 760 <a href="@settings.Link"> 761 @RenderTheImage(settings) 762 </a> 763 } 764 else 765 { 766 @RenderTheImage(settings) 767 } 768769 if (settings.Caption != null) 770 { 771 <span class="image-caption dw-mod">@settings.Caption</span> 772 @:</div> 773 } 774 } 775 } 776777 @helper RenderTheImage(Image settings) 778 { 779 if (settings != null) 780 { 781 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg"; 782 string placeholderImage = "/Files/Images/placeholder.gif"; 783 string imageEngine = "/Admin/Public/GetImage.ashx?"; 784785 string imageStyle = ""; 786787 switch (settings.Style) 788 { 789 case ImageStyle.Ball: 790 imageStyle = "grid__cell-img--ball"; 791 break; 792793 case ImageStyle.Triangle: 794 imageStyle = "grid__cell-img--triangle"; 795 break; 796 } 797798 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 799 { 800 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 801802 if (settings.ImageDefault != null) 803 { 804 settings.ImageDefault.Height = settings.ImageDefault.Width; 805 } 806 if (settings.ImageMedium != null) 807 { 808 settings.ImageMedium.Height = settings.ImageMedium.Width; 809 } 810 if (settings.ImageSmall != null) 811 { 812 settings.ImageSmall.Height = settings.ImageSmall.Width; 813 } 814 } 815816 string defaultImage = imageEngine; 817 string imageSmall = ""; 818 string imageMedium = ""; 819820 if (settings.DisableImageEngine) 821 { 822 defaultImage = settings.Path; 823 } 824 else 825 { 826 if (settings.ImageDefault != null) 827 { 828 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 829830 if (settings.Path.GetType() != typeof(string)) 831 { 832 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 833 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 834 } 835 else 836 { 837 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 838 } 839840 defaultImage += "&AlternativeImage=" + alternativeImage; 841 } 842843 if (settings.ImageSmall != null) 844 { 845 imageSmall = "data-src-small=\"" + imageEngine; 846 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 847848 if (settings.Path.GetType() != typeof(string)) 849 { 850 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 851 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 852 } 853 else 854 { 855 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 856 } 857858 imageSmall += "&alternativeImage=" + alternativeImage; 859860 imageSmall += "\""; 861 } 862863 if (settings.ImageMedium != null) 864 { 865 imageMedium = "data-src-medium=\"" + imageEngine; 866 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 867868 if (settings.Path.GetType() != typeof(string)) 869 { 870 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 871 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 872 } 873 else 874 { 875 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 876 } 877878 imageMedium += "&alternativeImage=" + alternativeImage; 879880 imageMedium += "\""; 881 } 882 } 883884 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 885 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 886 if (!string.IsNullOrEmpty(settings.Title)) 887 { 888 optionalAttributes.Add("alt", settings.Title); 889 optionalAttributes.Add("title", settings.Title); 890 } 891892 if (settings.DisableLazyLoad) 893 { 894 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 895 } 896 else 897 { 898 <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) /> 899 } 900 } 901 } 902 @using System.Reflection 903 @using Dynamicweb.Rapido.Blocks.Components.General 904 @using Dynamicweb.Rapido.Blocks.Components 905906 @* Component *@ 907908 @helper RenderFileField(FileField settings) 909 { 910 var attributes = new Dictionary<string, string>(); 911 if (string.IsNullOrEmpty(settings.Id)) 912 { 913 settings.Id = Guid.NewGuid().ToString("N"); 914 } 915916 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 917 if (settings.Disabled) { attributes.Add("disabled", "true"); } 918 if (settings.Required) { attributes.Add("required", "true"); } 919 if (settings.Multiple) { attributes.Add("multiple", "true"); } 920 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 921 if (string.IsNullOrEmpty(settings.ChooseFileText)) 922 { 923 settings.ChooseFileText = Translate("Choose file"); 924 } 925 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 926 { 927 settings.NoFilesChosenText = Translate("No files chosen..."); 928 } 929 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 930931 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 932933 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 934 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 935936 attributes.Add("type", "file"); 937 if (settings.Value != null) { attributes.Add("value", settings.Value); } 938 settings.CssClass = "u-full-width " + settings.CssClass; 939940 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 941942 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 943 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 944 { 945 <div class="u-full-width"> 946 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 947 @if (settings.Link != null) { 948 <div class="u-pull--right"> 949 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 950 @Render(settings.Link) 951 </div> 952 } 953 </div> 954955 } 956957 @if (!string.IsNullOrEmpty(settings.HelpText)) 958 { 959 <small class="form__help-text">@settings.HelpText</small> 960 } 961962 <div class="form__field-combi file-input u-no-margin dw-mod"> 963 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 964 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 965 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 966 @if (settings.UploadButton != null) 967 { 968 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 969 @Render(settings.UploadButton) 970 } 971 </div> 972 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 973 </div> 974 } 975 @using System.Reflection 976 @using Dynamicweb.Rapido.Blocks.Components.General 977 @using Dynamicweb.Rapido.Blocks.Components 978 @using Dynamicweb.Core 979 @using System.Linq 980981 @* Component *@ 982983 @helper RenderDateTimeField(DateTimeField settings) 984 { 985 if (string.IsNullOrEmpty(settings.Id)) 986 { 987 settings.Id = Guid.NewGuid().ToString("N"); 988 } 989990 var textField = new TextField { 991 Name = settings.Name, 992 Id = settings.Id, 993 Label = settings.Label, 994 HelpText = settings.HelpText, 995 Value = settings.Value, 996 Disabled = settings.Disabled, 997 Required = settings.Required, 998 ErrorMessage = settings.ErrorMessage, 999 CssClass = settings.CssClass, 1000 WrapperCssClass = settings.WrapperCssClass, 1001 OnChange = settings.OnChange, 1002 OnClick = settings.OnClick, 1003 Link = settings.Link, 1004 ExtraAttributes = settings.ExtraAttributes, 1005 // 1006 Placeholder = settings.Placeholder 1007 }; 10081009 @Render(textField) 10101011 List<string> jsAttributes = new List<string>(); 10121013 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 10141015 if (!string.IsNullOrEmpty(settings.DateFormat)) 1016 { 1017 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1018 } 1019 if (!string.IsNullOrEmpty(settings.MinDate)) 1020 { 1021 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1022 } 1023 if (!string.IsNullOrEmpty(settings.MaxDate)) 1024 { 1025 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1026 } 1027 if (settings.IsInline) 1028 { 1029 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1030 } 1031 if (settings.EnableTime) 1032 { 1033 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1034 } 1035 if (settings.EnableWeekNumbers) 1036 { 1037 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1038 } 10391040 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 10411042 <script> 1043 document.addEventListener("DOMContentLoaded", function () { 1044 flatpickr("#@textField.Id", { 1045 @string.Join(",", jsAttributes) 1046 }); 1047 }); 1048 </script> 1049 } 1050 @using System.Reflection 1051 @using Dynamicweb.Rapido.Blocks.Components.General 1052 @using Dynamicweb.Rapido.Blocks.Components 10531054 @* Component *@ 10551056 @helper RenderTextField(TextField settings) 1057 { 1058 var attributes = new Dictionary<string, string>(); 1059 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1060 { 1061 settings.Id = Guid.NewGuid().ToString("N"); 1062 } 10631064 /*base settings*/ 1065 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1066 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1067 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1068 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1069 if (settings.Required) { attributes.Add("required", "true"); } 1070 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1071 /*end*/ 10721073 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1074 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1075 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1076 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1077 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1078 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1079 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1080 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1081 if (settings.Value != null) { attributes.Add("value", settings.Value); } 10821083 settings.CssClass = "u-full-width " + settings.CssClass; 10841085 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 10861087 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 10881089 string noMargin = "u-no-margin"; 1090 if (!settings.ReadOnly) { 1091 noMargin = ""; 1092 } 10931094 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1095 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1096 { 1097 <div class="u-full-width"> 1098 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1099 @if (settings.Link != null) { 1100 settings.Link.ButtonLayout = ButtonLayout.LinkClean; 11011102 <div class="u-pull--right"> 1103 @Render(settings.Link) 1104 </div> 1105 } 1106 </div> 11071108 } 11091110 @if (!string.IsNullOrEmpty(settings.HelpText)) 1111 { 1112 <small class="form__help-text">@settings.HelpText</small> 1113 } 11141115 @if (settings.ActionButton != null) 1116 { 1117 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1118 <div class="form__field-combi u-no-margin dw-mod"> 1119 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1120 @Render(settings.ActionButton) 1121 </div> 1122 } 1123 else 1124 { 1125 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1126 } 11271128 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1129 </div> 1130 } 1131 @using System.Reflection 1132 @using Dynamicweb.Rapido.Blocks.Components.General 1133 @using Dynamicweb.Rapido.Blocks.Components 11341135 @* Component *@ 11361137 @helper RenderNumberField(NumberField settings) 1138 { 1139 var attributes = new Dictionary<string, string>(); 1140 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1141 { 1142 settings.Id = Guid.NewGuid().ToString("N"); 1143 } 11441145 /*base settings*/ 1146 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1147 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1148 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1149 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1150 if (settings.Required) { attributes.Add("required", "true"); } 1151 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1152 /*end*/ 11531154 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1155 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1156 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1157 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1158 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1159 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1160 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1161 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1162 attributes.Add("type", "number"); 11631164 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 11651166 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1167 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1168 { 1169 <div class="u-full-width"> 1170 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1171 @if (settings.Link != null) { 1172 <div class="u-pull--right"> 1173 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1174 @Render(settings.Link) 1175 </div> 1176 } 1177 </div> 11781179 } 11801181 @if (!string.IsNullOrEmpty(settings.HelpText)) 1182 { 1183 <small class="form__help-text">@settings.HelpText</small> 1184 } 11851186 @if (settings.ActionButton != null) 1187 { 1188 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1189 <div class="form__field-combi u-no-margin dw-mod"> 1190 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1191 @Render(settings.ActionButton) 1192 </div> 1193 } 1194 else 1195 { 1196 <div class="form__field-combi u-no-margin dw-mod"> 1197 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1198 </div> 1199 } 12001201 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1202 </div> 1203 } 1204 @using System.Reflection 1205 @using Dynamicweb.Rapido.Blocks.Components.General 1206 @using Dynamicweb.Rapido.Blocks.Components 120712081209 @* Component *@ 12101211 @helper RenderTextareaField(TextareaField settings) 1212 { 1213 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1214 string id = settings.Id; 1215 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1216 { 1217 id = Guid.NewGuid().ToString("N"); 1218 } 12191220 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1221 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1222 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1223 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1224 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1225 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1226 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1227 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1228 if (settings.Required) { attributes.Add("required", "true"); } 1229 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1230 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1231 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1232 attributes.Add("name", settings.Name); 12331234 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 12351236 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1237 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1238 { 1239 <div class="u-full-width"> 1240 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1241 @if (settings.Link != null) { 1242 <div class="u-pull--right"> 1243 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1244 @Render(settings.Link) 1245 </div> 1246 } 1247 </div> 1248 } 12491250 @if (!string.IsNullOrEmpty(settings.HelpText)) 1251 { 1252 <small class="form__help-text">@settings.HelpText</small> 1253 } 12541255 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 12561257 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1258 </div> 1259 } 1260 @using System.Reflection 1261 @using Dynamicweb.Rapido.Blocks.Components.General 1262 @using Dynamicweb.Rapido.Blocks.Components 126312641265 @* Component *@ 12661267 @helper RenderHiddenField(HiddenField settings) { 1268 var attributes = new Dictionary<string, string>(); 1269 attributes.Add("type", "hidden"); 1270 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1271 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1272 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 12731274 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1275 } 1276 @using System.Reflection 1277 @using Dynamicweb.Rapido.Blocks.Components.General 1278 @using Dynamicweb.Rapido.Blocks.Components 12791280 @* Component *@ 12811282 @helper RenderCheckboxField(CheckboxField settings) 1283 { 1284 var attributes = new Dictionary<string, string>(); 1285 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1286 { 1287 settings.Id = Guid.NewGuid().ToString("N"); 1288 } 12891290 /*base settings*/ 1291 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1292 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1293 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1294 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1295 if (settings.Required) { attributes.Add("required", "true"); } 1296 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1297 /*end*/ 12981299 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 13001301 attributes.Add("type", "checkbox"); 1302 if (settings.Checked) { attributes.Add("checked", "true"); } 1303 settings.CssClass = "form__control " + settings.CssClass; 1304 if (settings.Value != null) { attributes.Add("value", settings.Value); } 13051306 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 13071308 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1309 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1310 @if (!string.IsNullOrEmpty(settings.Label)) 1311 { 1312 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1313 } 13141315 @if (settings.Link != null) { 1316 <span> 1317 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1318 @Render(settings.Link) 1319 </span> 1320 } 13211322 @if (!string.IsNullOrEmpty(settings.HelpText)) 1323 { 1324 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small> 1325 } 1326 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1327 </div> 1328 } 1329 @using System.Reflection 1330 @using Dynamicweb.Rapido.Blocks.Components.General 1331 @using Dynamicweb.Rapido.Blocks.Components 133213331334 @* Component *@ 13351336 @helper RenderCheckboxListField(CheckboxListField settings) 1337 { 1338 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1339 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1340 { 1341 <div class="u-full-width"> 1342 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1343 @if (settings.Link != null) { 1344 <div class="u-pull--right"> 1345 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1346 @Render(settings.Link) 1347 </div> 1348 } 1349 </div> 13501351 } 13521353 <div class="u-pull--left"> 1354 @if (!string.IsNullOrEmpty(settings.HelpText)) 1355 { 1356 <small class="form__help-text">@settings.HelpText</small> 1357 } 13581359 @foreach (var item in settings.Options) 1360 { 1361 if (settings.Required) 1362 { 1363 item.Required = true; 1364 } 1365 if (settings.Disabled) 1366 { 1367 item.Disabled = true; 1368 } 1369 if (!string.IsNullOrEmpty(settings.Name)) 1370 { 1371 item.Name = settings.Name; 1372 } 1373 if (!string.IsNullOrEmpty(settings.CssClass)) 1374 { 1375 item.CssClass += settings.CssClass; 1376 } 13771378 /* value is not supported */ 13791380 if (!string.IsNullOrEmpty(settings.OnClick)) 1381 { 1382 item.OnClick += settings.OnClick; 1383 } 1384 if (!string.IsNullOrEmpty(settings.OnChange)) 1385 { 1386 item.OnChange += settings.OnChange; 1387 } 1388 @Render(item) 1389 } 13901391 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1392 </div> 13931394 </div> 1395 } 1396 @using Dynamicweb.Rapido.Blocks.Components.General 13971398 @* Component *@ 13991400 @helper RenderSearch(Search settings) 1401 { 1402 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1403 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 14041405 if (string.IsNullOrEmpty(settings.Id)) 1406 { 1407 settings.Id = Guid.NewGuid().ToString("N"); 1408 } 14091410 var resultAttributes = new Dictionary<string, string>(); 14111412 if (settings.PageSize != 0) 1413 { 1414 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1415 } 1416 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1417 { 1418 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1419 if (!string.IsNullOrEmpty(groupValue)) 1420 { 1421 resultAttributes.Add("data-selected-group", groupValue); 1422 } 1423 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1424 { 1425 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1426 } 1427 } 1428 resultAttributes.Add("data-force-init", "true"); 1429 if (settings.GoToFirstSearchResultOnEnter) 1430 { 1431 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1432 } 1433 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1434 { 1435 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1436 } 1437 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1438 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 14391440 if (settings.SecondSearchData != null) 1441 { 1442 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1443 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1444 } 1445 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1446 { 1447 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1448 } 14491450 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 14511452 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 14531454 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1455 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1456 { 1457 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1458 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1459 } 14601461 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 14621463 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1464 @if (settings.SecondSearchData != null) 1465 { 1466 <div class="search__column search__column--products dw-mod"> 1467 <div class="search__column-header dw-mod">@Translate("Products")</div> 1468 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1469 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1470 { 1471 @Render(new Link { 1472 Title = Translate("View all"), 1473 CssClass = "js-view-all-button u-margin", 1474 Href = settings.SearchData.ResultsPageUrl 1475 }); 1476 } 1477 </div> 1478 <div class="search__column search__column--pages dw-mod"> 1479 <div class="search__column-header">@Translate("Pages")</div> 1480 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1481 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1482 { 1483 @Render(new Link 1484 { 1485 Title = Translate("View all"), 1486 CssClass = "js-view-all-button u-margin", 1487 Href = settings.SecondSearchData.ResultsPageUrl 1488 }); 1489 } 1490 </div> 1491 } 1492 else 1493 { 1494 <div class="search__column search__column--only dw-mod"> 1495 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1496 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1497 { 1498 @Render(new Link { 1499 Title = Translate("View all"), 1500 CssClass = "js-view-all-button u-margin", 1501 Href = settings.SearchData.ResultsPageUrl 1502 }); 1503 } 1504 </div> 1505 } 1506 </div> 15071508 @if (settings.SearchButton != null) 1509 { 1510 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1511 if (settings.RenderDefaultSearchIcon) 1512 { 1513 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1514 } 1515 @Render(settings.SearchButton); 1516 } 1517 </div> 1518 } 1519 @using System.Reflection 1520 @using Dynamicweb.Rapido.Blocks.Components.General 1521 @using Dynamicweb.Rapido.Blocks.Components 152215231524 @* Component *@ 15251526 @helper RenderSelectField(SelectField settings) 1527 { 1528 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1529 { 1530 settings.Id = Guid.NewGuid().ToString("N"); 1531 } 15321533 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1534 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1535 { 1536 <div class="u-full-width"> 1537 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1538 @if (settings.Link != null) { 1539 <div class="u-pull--right"> 1540 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1541 @Render(settings.Link) 1542 </div> 1543 } 1544 </div> 1545 } 15461547 @if (!string.IsNullOrEmpty(settings.HelpText)) 1548 { 1549 <small class="form__help-text">@settings.HelpText</small> 1550 } 15511552 @if (settings.ActionButton != null) 1553 { 1554 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1555 <div class="form__field-combi u-no-margin dw-mod"> 1556 @RenderSelectBase(settings) 1557 @Render(settings.ActionButton) 1558 </div> 1559 } 1560 else 1561 { 1562 @RenderSelectBase(settings) 1563 } 15641565 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1566 </div> 1567 } 15681569 @helper RenderSelectBase(SelectField settings) 1570 { 1571 var attributes = new Dictionary<string, string>(); 15721573 /*base settings*/ 1574 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1575 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1576 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1577 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1578 if (settings.Required) { attributes.Add("required", "true"); } 1579 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1580 /*end*/ 15811582 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 15831584 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1585 @if (settings.Default != null) 1586 { 1587 @Render(settings.Default) 1588 } 15891590 @foreach (var item in settings.Options) 1591 { 1592 if (settings.Value != null) { 1593 item.Checked = item.Value == settings.Value; 1594 } 1595 @Render(item) 1596 } 1597 </select> 1598 } 1599 @using System.Reflection 1600 @using Dynamicweb.Rapido.Blocks.Components.General 1601 @using Dynamicweb.Rapido.Blocks.Components 16021603 @* Component *@ 16041605 @helper RenderRadioButtonField(RadioButtonField settings) 1606 { 1607 var attributes = new Dictionary<string, string>(); 1608 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1609 { 1610 settings.Id = Guid.NewGuid().ToString("N"); 1611 } 16121613 /*base settings*/ 1614 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1615 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1616 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1617 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1618 if (settings.Required) { attributes.Add("required", "true"); } 1619 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1620 /*end*/ 16211622 attributes.Add("type", "radio"); 1623 if (settings.Checked) { attributes.Add("checked", "true"); } 1624 settings.CssClass = "form__control " + settings.CssClass; 1625 if (settings.Value != null) { attributes.Add("value", settings.Value); } 16261627 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 16281629 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1630 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1631 @if (!string.IsNullOrEmpty(settings.Label)) 1632 { 1633 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1634 } 1635 @if (!string.IsNullOrEmpty(settings.HelpText)) 1636 { 1637 <small class="form__help-text">@settings.HelpText</small> 1638 } 1639 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1640 </div> 1641 } 1642 @using System.Reflection 1643 @using Dynamicweb.Rapido.Blocks.Components.General 1644 @using Dynamicweb.Rapido.Blocks.Components 164516461647 @* Component *@ 16481649 @helper RenderRadioButtonListField(RadioButtonListField settings) 1650 { 1651 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 16521653 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1654 @if (!string.IsNullOrEmpty(settings.Label)) 1655 { 1656 <label>@settings.Label</label> 1657 } 1658 @if (!string.IsNullOrEmpty(settings.HelpText)) 1659 { 1660 <small class="form__help-text">@settings.HelpText</small> 1661 } 16621663 @foreach (var item in settings.Options) 1664 { 1665 if (settings.Required) 1666 { 1667 item.Required = true; 1668 } 1669 if (settings.Disabled) 1670 { 1671 item.Disabled = true; 1672 } 1673 if (!string.IsNullOrEmpty(settings.Name)) 1674 { 1675 item.Name = settings.Name; 1676 } 1677 if (settings.Value != null && settings.Value == item.Value) 1678 { 1679 item.Checked = true; 1680 } 1681 if (!string.IsNullOrEmpty(settings.OnClick)) 1682 { 1683 item.OnClick += settings.OnClick; 1684 } 1685 if (!string.IsNullOrEmpty(settings.OnChange)) 1686 { 1687 item.OnChange += settings.OnChange; 1688 } 1689 if (!string.IsNullOrEmpty(settings.CssClass)) 1690 { 1691 item.CssClass += settings.CssClass; 1692 } 1693 @Render(item) 1694 } 16951696 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1697 </div> 1698 } 1699 @using System.Reflection 1700 @using Dynamicweb.Rapido.Blocks.Components.General 1701 @using Dynamicweb.Rapido.Blocks.Components 170217031704 @* Component *@ 17051706 @helper RenderNotificationMessage(NotificationMessage settings) 1707 { 1708 if (!string.IsNullOrEmpty(settings.Message)) 1709 { 1710 var attributes = new Dictionary<string, string>(); 1711 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 17121713 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1714 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower(); 1715 string minHeightClass = settings.Icon != null ? "u-min-h70px" : ""; 17161717 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)> 1718 @if (settings.Icon != null) { 1719 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message; 1720 @Render(settings.Icon) 1721 } else { 1722 @settings.Message 1723 } 1724 </div> 1725 } 1726 } 1727 @using Dynamicweb.Rapido.Blocks.Components.General 172817291730 @* Component *@ 17311732 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1733 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 17341735 <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> 1736 @if (settings.SubBlocks != null) { 1737 @RenderBlockList(settings.SubBlocks) 1738 } 1739 </div> 1740 } 1741 @using System.Reflection 1742 @using Dynamicweb.Rapido.Blocks.Components.General 1743 @using Dynamicweb.Rapido.Blocks.Components 1744 @using System.Text.RegularExpressions 174517461747 @* Component *@ 17481749 @helper RenderSticker(Sticker settings) { 1750 if (!String.IsNullOrEmpty(settings.Title)) { 1751 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1752 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 17531754 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1755 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1756 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1757 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1758 optionalAttributes.Add("style", styleTag); 1759 } 17601761 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1762 } 1763 } 17641765 @using System.Reflection 1766 @using Dynamicweb.Rapido.Blocks.Components.General 1767 @using Dynamicweb.Rapido.Blocks.Components 176817691770 @* Component *@ 17711772 @helper RenderStickersCollection(StickersCollection settings) 1773 { 1774 if (settings.Stickers.Count > 0) 1775 { 1776 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 17771778 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1779 @foreach (Sticker sticker in settings.Stickers) 1780 { 1781 @Render(sticker) 1782 } 1783 </div> 1784 } 1785 } 17861787 @using Dynamicweb.Rapido.Blocks.Components.General 178817891790 @* Component *@ 17911792 @helper RenderForm(Form settings) { 1793 if (settings != null) 1794 { 1795 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1796 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1797 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1798 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1799 var enctypes = new Dictionary<string, string> 1800 { 1801 { "multipart", "multipart/form-data" }, 1802 { "text", "text/plain" }, 1803 { "application", "application/x-www-form-urlencoded" } 1804 }; 1805 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1806 optionalAttributes.Add("method", settings.Method.ToString()); 18071808 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1809 { 1810 @settings.FormStartMarkup 1811 } 1812 else 1813 { 1814 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1815 } 18161817 foreach (var field in settings.GetFields()) 1818 { 1819 @Render(field) 1820 } 18211822 @:</form> 1823 } 1824 } 1825 @using System.Reflection 1826 @using Dynamicweb.Rapido.Blocks.Components.General 1827 @using Dynamicweb.Rapido.Blocks.Components 182818291830 @* Component *@ 18311832 @helper RenderText(Text settings) 1833 { 1834 @settings.Content 1835 } 1836 @using System.Reflection 1837 @using Dynamicweb.Rapido.Blocks.Components.General 1838 @using Dynamicweb.Rapido.Blocks.Components 183918401841 @* Component *@ 18421843 @helper RenderContentModule(ContentModule settings) { 1844 if (!string.IsNullOrEmpty(settings.Content)) 1845 { 1846 @settings.Content 1847 } 1848 } 1849 @using System 1850 @using System.Reflection 1851 @using Dynamicweb.Rapido.Blocks.Components.General 1852 @using Dynamicweb.Rapido.Blocks.Components 185318541855 @* Component *@ 18561857 @helper RenderModal(Modal settings) { 1858 if (settings != null) 1859 { 1860 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 18611862 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 18631864 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 18651866 <div class="modal-container"> 1867 @if (!settings.DisableDarkOverlay) 1868 { 1869 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1870 } 1871 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1872 @if (settings.Heading != null) 1873 { 1874 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1875 { 1876 <div class="modal__header"> 1877 @Render(settings.Heading) 1878 </div> 1879 } 1880 } 1881 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1882 @if (!string.IsNullOrEmpty(settings.BodyText)) 1883 { 1884 <div class="modal__body_text">@settings.BodyText</div> 18851886 } 1887 @if (settings.BodyTemplate != null) 1888 { 1889 @settings.BodyTemplate 1890 } 1891 @{ 1892 var actions = settings.GetActions(); 1893 } 1894 </div> 1895 @if (actions.Length > 0) 1896 { 1897 <div class="modal__footer"> 1898 @foreach (var action in actions) 1899 { 1900 if (Pageview.Device.ToString() != "Mobile") { 1901 action.CssClass += " u-no-margin"; 1902 } else { 1903 action.CssClass += " u-full-width u-margin-bottom"; 1904 } 19051906 @Render(action) 1907 } 1908 </div> 1909 } 1910 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 1911 </div> 1912 </div> 1913 } 1914 } 1915 @using Dynamicweb.Rapido.Blocks.Components.General 19161917 @* Component *@ 19181919 @helper RenderMediaListItem(MediaListItem settings) 1920 { 1921 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1922 @if (!string.IsNullOrEmpty(settings.Label)) 1923 { 1924 if (!string.IsNullOrEmpty(settings.Link)) 1925 { 1926 @Render(new Link 1927 { 1928 Href = settings.Link, 1929 CssClass = "media-list-item__sticker dw-mod", 1930 ButtonLayout = ButtonLayout.None, 1931 Title = settings.Label, 1932 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1933 }) 1934 } 1935 else if (!string.IsNullOrEmpty(settings.OnClick)) 1936 { 1937 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1938 <span class="u-uppercase">@settings.Label</span> 1939 </span> 1940 } 1941 else 1942 { 1943 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1944 <span class="u-uppercase">@settings.Label</span> 1945 </span> 1946 } 1947 } 1948 <div class="media-list-item__wrap"> 1949 <div class="media-list-item__info dw-mod"> 1950 <div class="media-list-item__header dw-mod"> 1951 @if (!string.IsNullOrEmpty(settings.Title)) 1952 { 1953 if (!string.IsNullOrEmpty(settings.Link)) 1954 { 1955 @Render(new Link 1956 { 1957 Href = settings.Link, 1958 CssClass = "media-list-item__name dw-mod", 1959 ButtonLayout = ButtonLayout.None, 1960 Title = settings.Title, 1961 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1962 }) 1963 } 1964 else if (!string.IsNullOrEmpty(settings.OnClick)) 1965 { 1966 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1967 } 1968 else 1969 { 1970 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1971 } 1972 } 19731974 @if (!string.IsNullOrEmpty(settings.Status)) 1975 { 1976 <div class="media-list-item__state dw-mod">@settings.Status</div> 1977 } 1978 </div> 1979 @{ 1980 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1981 } 19821983 @Render(settings.InfoTable) 1984 </div> 1985 <div class="media-list-item__actions dw-mod"> 1986 <div class="media-list-item__actions-list dw-mod"> 1987 @{ 1988 var actions = settings.GetActions(); 19891990 foreach (ButtonBase action in actions) 1991 { 1992 action.ButtonLayout = ButtonLayout.None; 1993 action.CssClass += " media-list-item__action link"; 19941995 @Render(action) 1996 } 1997 } 1998 </div> 19992000 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 2001 { 2002 settings.SelectButton.CssClass += " u-no-margin"; 20032004 <div class="media-list-item__action-button"> 2005 @Render(settings.SelectButton) 2006 </div> 2007 } 2008 </div> 2009 </div> 2010 </div> 2011 } 2012 @using Dynamicweb.Rapido.Blocks.Components.General 2013 @using Dynamicweb.Rapido.Blocks.Components 20142015 @helper RenderTable(Table settings) 2016 { 2017 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2018 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 20192020 var enumToClasses = new Dictionary<TableDesign, string> 2021 { 2022 { TableDesign.Clean, "table--clean" }, 2023 { TableDesign.Bordered, "table--bordered" }, 2024 { TableDesign.Striped, "table--striped" }, 2025 { TableDesign.Hover, "table--hover" }, 2026 { TableDesign.Compact, "table--compact" }, 2027 { TableDesign.Condensed, "table--condensed" }, 2028 { TableDesign.NoTopBorder, "table--no-top-border" } 2029 }; 2030 string tableDesignClass = ""; 2031 if (settings.Design != TableDesign.None) 2032 { 2033 tableDesignClass = enumToClasses[settings.Design]; 2034 } 20352036 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 20372038 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 20392040 <table @ComponentMethods.AddAttributes(resultAttributes)> 2041 @if (settings.Header != null) 2042 { 2043 <thead> 2044 @Render(settings.Header) 2045 </thead> 2046 } 2047 <tbody> 2048 @foreach (var row in settings.Rows) 2049 { 2050 @Render(row) 2051 } 2052 </tbody> 2053 @if (settings.Footer != null) 2054 { 2055 <tfoot> 2056 @Render(settings.Footer) 2057 </tfoot> 2058 } 2059 </table> 2060 } 2061 @using Dynamicweb.Rapido.Blocks.Components.General 2062 @using Dynamicweb.Rapido.Blocks.Components 20632064 @helper RenderTableRow(TableRow settings) 2065 { 2066 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2067 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 20682069 var enumToClasses = new Dictionary<TableRowDesign, string> 2070 { 2071 { TableRowDesign.NoBorder, "table__row--no-border" }, 2072 { TableRowDesign.Border, "table__row--border" }, 2073 { TableRowDesign.TopBorder, "table__row--top-line" }, 2074 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2075 { TableRowDesign.Solid, "table__row--solid" } 2076 }; 20772078 string tableRowDesignClass = ""; 2079 if (settings.Design != TableRowDesign.None) 2080 { 2081 tableRowDesignClass = enumToClasses[settings.Design]; 2082 } 20832084 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 20852086 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 20872088 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2089 @foreach (var cell in settings.Cells) 2090 { 2091 if (settings.IsHeaderRow) 2092 { 2093 cell.IsHeader = true; 2094 } 2095 @Render(cell) 2096 } 2097 </tr> 2098 } 2099 @using Dynamicweb.Rapido.Blocks.Components.General 2100 @using Dynamicweb.Rapido.Blocks.Components 2101 @using Dynamicweb.Core 21022103 @helper RenderTableCell(TableCell settings) 2104 { 2105 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2106 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2107 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2108 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2109 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 21102111 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 21122113 string tagName = settings.IsHeader ? "th" : "td"; 21142115 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2116 @settings.Content 2117 @("</" + tagName + ">"); 2118 } 2119 @using System.Linq 2120 @using Dynamicweb.Rapido.Blocks.Components.General 21212122 @* Component *@ 21232124 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2125 { 2126 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2127 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 21282129 if (settings.NumberOfPages > 1) 2130 { 2131 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2132 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2133 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 21342135 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2136 @if (settings.ShowPagingInfo) 2137 { 2138 <div class="pager__info dw-mod"> 2139 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2140 </div> 2141 } 2142 <ul class="pager__list dw-mod"> 2143 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2144 { 2145 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2146 } 2147 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2148 { 2149 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2150 } 2151 @if (settings.GetPages().Any()) 2152 { 2153 foreach (var page in settings.GetPages()) 2154 { 2155 @Render(page) 2156 } 2157 } 2158 else 2159 { 2160 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2161 { 2162 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2163 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2164 } 2165 } 2166 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2167 { 2168 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2169 } 2170 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2171 { 2172 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2173 } 2174 </ul> 2175 </div> 2176 } 2177 } 21782179 @helper RenderPaginationItem(PaginationItem settings) 2180 { 2181 if (settings.Icon == null) 2182 { 2183 settings.Icon = new Icon(); 2184 } 21852186 settings.Icon.Label = settings.Label; 2187 <li class="pager__btn dw-mod"> 2188 @if (settings.IsActive) 2189 { 2190 <span class="pager__num pager__num--current dw-mod"> 2191 @Render(settings.Icon) 2192 </span> 2193 } 2194 else 2195 { 2196 <a href="@settings.Link" class="pager__num dw-mod"> 2197 @Render(settings.Icon) 2198 </a> 2199 } 2200 </li> 2201 } 220222032204 @using Dynamicweb.Rapido.Blocks.Components.General 2205 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 220622072208 @using Dynamicweb.Rapido.Blocks.Components 2209 @using Dynamicweb.Rapido.Blocks.Components.General 2210 @using Dynamicweb.Rapido.Blocks 2211 @using System.IO 221222132214 @using Dynamicweb.Rapido.Blocks.Components.General 2215 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 221622172218 @* Component *@ 22192220 @helper RenderVariantMatrix(VariantMatrix settings) { 2221 if (settings != null) 2222 { 2223 int productLoopCounter = 0; 2224 int groupCount = 0; 2225 List<VariantOption> firstDimension = new List<VariantOption>(); 2226 List<VariantOption> secondDimension = new List<VariantOption>(); 2227 List<VariantOption> thirdDimension = new List<VariantOption>(); 22282229 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 2230 { 2231 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 2232 { 2233 if (groupCount == 0) { 2234 firstDimension.Add(variantOptions); 2235 } 2236 if (groupCount == 1) 2237 { 2238 secondDimension.Add(variantOptions); 2239 } 2240 if (groupCount == 2) 2241 { 2242 thirdDimension.Add(variantOptions); 2243 } 2244 } 2245 groupCount++; 2246 } 22472248 int rowCount = 0; 2249 int columnCount = 0; 22502251 <script> 2252 var variantsCollection = []; 2253 </script> 22542255 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 2256 @if (groupCount == 1) 2257 { 2258 <tbody> 2259 @foreach (VariantOption firstVariantOption in firstDimension) 2260 { 2261 var variantId = firstVariantOption.Id; 2262 <tr> 2263 <td class="u-bold"> 2264 @firstVariantOption.Name 2265 </td> 2266 <td> 2267 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2268 </td> 2269 </tr> 2270 productLoopCounter++; 2271 } 22722273 <tr> 2274 <td> </td> 2275 <td> 2276 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2277 </td> 2278 </tr> 2279 </tbody> 2280 } 2281 @if (groupCount == 2) 2282 { 2283 <thead> 2284 <tr> 2285 <td> </td> 2286 @foreach (VariantOption variant in secondDimension) 2287 { 2288 <td>@variant.Name</td> 2289 } 2290 </tr> 2291 </thead> 2292 <tbody> 2293 @foreach (VariantOption firstVariantOption in firstDimension) 2294 { 2295 string variantId = ""; 2296 columnCount = 0; 22972298 <tr> 2299 <td class="u-min-w120px">@firstVariantOption.Name</td> 23002301 @foreach (VariantOption secondVariantOption in secondDimension) 2302 { 2303 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 2304 <td> 2305 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2306 </td> 23072308 columnCount++; 23092310 productLoopCounter++; 2311 } 23122313 <td> 2314 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 2315 </td> 2316 </tr> 23172318 rowCount++; 2319 } 23202321 @{ 2322 columnCount = 0; 2323 } 23242325 <tr> 2326 <td> </td> 2327 @foreach (VariantOption secondVariantOption in secondDimension) 2328 { 2329 <td> 2330 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2331 </td> 23322333 columnCount++; 2334 } 2335 <td> </td> 2336 </tr> 2337 </tbody> 2338 } 2339 @if (groupCount == 3) 2340 { 2341 <thead> 2342 <tr> 2343 <td> </td> 2344 @foreach (VariantOption thirdVariantOption in thirdDimension) 2345 { 2346 <td>@thirdVariantOption.Name</td> 2347 } 2348 </tr> 2349 </thead> 2350 <tbody> 2351 @foreach (VariantOption firstVariantOption in firstDimension) 2352 { 2353 int colspan = (thirdDimension.Count + 1); 23542355 <tr> 2356 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 2357 </tr> 23582359 foreach (VariantOption secondVariantOption in secondDimension) 2360 { 2361 string variantId = ""; 2362 columnCount = 0; 23632364 <tr> 2365 <td class="u-min-w120px">@secondVariantOption.Name</td> 23662367 @foreach (VariantOption thirdVariantOption in thirdDimension) 2368 { 2369 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 23702371 <td> 2372 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2373 </td> 23742375 columnCount++; 2376 productLoopCounter++; 2377 } 23782379 <td> 2380 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 2381 </td> 2382 </tr> 2383 rowCount++; 2384 } 2385 } 23862387 @{ 2388 columnCount = 0; 2389 } 23902391 <tr> 2392 <td> </td> 2393 @foreach (VariantOption thirdVariantOption in thirdDimension) 2394 { 2395 <td> 2396 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2397 </td> 23982399 columnCount++; 2400 } 2401 <td> </td> 2402 </tr> 2403 </tbody> 2404 } 2405 </table> 24062407 <script> 2408 document.addEventListener("DOMContentLoaded", function (event) { 2409 MatrixUpdateQuantity("@settings.ProductId"); 2410 }); 24112412 MatrixUpdateQuantity = function (productId) { 2413 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 2414 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 24152416 var qtyRowArr = []; 2417 var qtyColumnArr = []; 24182419 var totalQty = 0; 24202421 for (var i = 0; i < allQtyFields.length; i++) { 2422 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 2423 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 2424 } 24252426 for (var i = 0; i < allQtyFields.length; i++) { 2427 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 2428 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 2429 totalQty += parseFloat(allQtyFields[i].value); 2430 } 24312432 //Update row counters 2433 for (var i = 0; i < qtyRowArr.length; i++) { 2434 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 24352436 if (qtyRowArr[i] != undefined && qtyCounter != null) { 2437 var currentCount = qtyCounter.innerHTML; 2438 qtyCounter.innerHTML = qtyRowArr[i]; 24392440 if (currentCount != qtyCounter.innerHTML) { 2441 qtyCounter.classList.add("qty-field--active"); 2442 } 2443 } 24442445 } 24462447 //Update column counters 2448 for (var i = 0; i < qtyColumnArr.length; i++) { 2449 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 24502451 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 2452 var currentCount = qtyCounter.innerHTML; 2453 qtyCounter.innerHTML = qtyColumnArr[i]; 24542455 if (currentCount != qtyCounter.innerHTML) { 2456 qtyCounter.classList.add("qty-field--active"); 2457 } 2458 } 2459 } 24602461 if (document.getElementById("TotalQtyCount_" + productId)) { 2462 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 2463 } 24642465 //Clean up animations 2466 setTimeout(function () { 2467 for (var i = 0; i < qtyRowArr.length; i++) { 2468 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 2469 if (qtyCounter != null) { 2470 qtyCounter.classList.remove("qty-field--active"); 2471 } 2472 } 2473 for (var i = 0; i < qtyColumnArr.length; i++) { 2474 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 2475 if (qtyCounter != null) { 2476 qtyCounter.classList.remove("qty-field--active"); 2477 } 2478 } 2479 }, 1000); 2480 } 2481 </script> 2482 } 2483 } 24842485 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 2486 { 2487 string loopCount = productLoopCounter.ToString(); 24882489 bool combinationFound = false; 2490 double stock = 0; 2491 double quantityValue = 0; 2492 string note = ""; 24932494 VariantProduct variantProduct = null; 24952496 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 2497 { 2498 stock = variantProduct.Stock; 2499 quantityValue = variantProduct.Quantity; 2500 combinationFound = true; 2501 } 25022503 if (combinationFound) 2504 { 2505 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 2506 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 2507 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 2508 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 2509 <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"> 25102511 if (stock != 0) 2512 { 2513 <small>@Translate("Stock") @stock</small> 2514 } 25152516 <script> 2517 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 2518 variantsCollection.push(variants); 2519 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 2520 </script> 2521 } 2522 else 2523 { 2524 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 2525 } 2526 } 2527 @using System 2528 @using Dynamicweb.Rapido.Blocks.Components 2529 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2530 @using Nevotex.Data.Entities 2531 @* Component *@ 25322533 @helper RenderAddToCart(CustomAddToCart settings) 2534 { 2535 //set Id for quantity selector to get it's value from button 2536 if (settings.QuantitySelector != null) 2537 { 2538 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 2539 { 2540 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 2541 } 25422543 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 25442545 if (settings.Disabled) 2546 { 2547 settings.QuantitySelector.Disabled = true; 2548 } 25492550 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 2551 { 2552 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 2553 } 2554 } 25552556 if (settings.Disabled) 2557 { 2558 settings.AddButton.Disabled = true; 2559 } 25602561 settings.AddButton.CssClass += " btn--condensed"; 25622563 //unitsSelector 2564 if (settings.UnitSelector != null) 2565 { 2566 if (settings.Disabled) 2567 { 2568 settings.QuantitySelector.Disabled = true; 2569 } 2570 } 25712572 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 2573 @if (settings.UnitSelector != null) 2574 { 2575 @Render(settings.UnitSelector) 2576 } 2577 @if (settings.QuantitySelector != null) 2578 { 2579 @Render(settings.QuantitySelector) 2580 } 2581 @Render(settings.AddButton) 2582 </div> 2583 } 2584 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2585 @using Dynamicweb.Rapido.Blocks.Components.General 2586 @using Nevotex.Data.Entities 25872588 @* Component *@ 25892590 @helper RenderAddToCartButton(CustomAddToCartBtn settings) 2591 { 2592 if (!settings.HideTitle) 2593 { 2594 if (string.IsNullOrEmpty(settings.Title)) 2595 { 2596 if (settings.BuyForPoints) 2597 { 2598 settings.Title = Translate("Buy with points"); 2599 } 2600 else 2601 { 2602 settings.Title = Translate("Add to cart"); 2603 } 2604 } 2605 } 2606 else 2607 { 2608 settings.Title = ""; 2609 } 26102611 if (settings.Icon == null) 2612 { 2613 settings.Icon = new Icon(); 2614 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 2615 } 26162617 if (string.IsNullOrEmpty(settings.Icon.Name)) 2618 { 2619 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 2620 } 26212622 var errorMessage = Translate("Felaktigt antal, köp kan endast göras i jämt antal av"); 26232624 settings.OnClick = "if(CheckMultiple('Quantity_" + settings.ProductId + "', '{{multiple}}'))Cart.AddToCart(event, { " + 2625 "id: '" + settings.ProductId + "'," + 2626 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 2627 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 2628 (settings.BuyForPoints ? "buyForPoints: true," : "") + 2629 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 2630 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 2631 "});" + settings.OnClick; 26322633 @RenderButton(settings) 2634 } 2635 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 26362637 @* Component *@ 26382639 @helper RenderUnitSelector(UnitSelector settings) 2640 { 2641 if (string.IsNullOrEmpty(settings.Id)) 2642 { 2643 settings.Id = Guid.NewGuid().ToString("N"); 2644 } 2645 var disabledClass = settings.Disabled ? "disabled" : ""; 26462647 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 2648 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 2649 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 2650 <div class="dropdown__content dw-mod"> 2651 @settings.OptionsContent 2652 </div> 2653 <label class="dropdown-trigger-off" for="@settings.Id"></label> 2654 </div> 2655 } 2656 @using System.Reflection 2657 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 26582659 @* Component *@ 26602661 @helper RenderQuantitySelector(QuantitySelector settings) 2662 { 2663 var attributes = new Dictionary<string, string>(); 26642665 /*base settings*/ 2666 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2667 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 2668 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 2669 if (settings.Disabled) { attributes.Add("disabled", "true"); } 2670 if (settings.Required) { attributes.Add("required", "true"); } 2671 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 2672 /*end*/ 26732674 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 2675 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 2676 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 2677 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 2678 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 2679 if (settings.Min == null) { settings.Min = 1; } 2680 attributes.Add("min", settings.Min.ToString()); 2681 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 2682 if (settings.Value == null) { settings.Value = 1; } 2683 attributes.Add("value", settings.Value.ToString()); 2684 attributes.Add("type", "number"); 26852686 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 26872688 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 2689 } 2690 @using Dynamicweb.Rapido.Blocks.Components 26912692 @using Dynamicweb.Frontend 2693 @using Dynamicweb.Frontend.Devices 2694 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2695 @using Dynamicweb.Rapido.Blocks.Components.General 2696 @using System.Collections.Generic; 26972698 @* Component *@ 26992700 @helper RenderCustomerCenterList(CustomerCenterList settings) 2701 { 2702 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 2703 string hideActions = isTouchDevice ? "u-block" : ""; 27042705 <table class="table data-list dw-mod"> 2706 @if (settings.GetHeaders().Length > 0) { 2707 <thead> 2708 <tr class="u-bold"> 2709 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 2710 { 2711 var attributes = new Dictionary<string, string>(); 2712 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 2713 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 2714 attributes.Add("align", header.Align.ToString()); 2715 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 27162717 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 2718 } 2719 </tr> 2720 </thead> 2721 } 2722 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 2723 { 2724 int columnCount = 0; 2725 int totalColumns = listItem.GetInfoItems().Length; 2726 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 2727 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 27282729 var attributes = new Dictionary<string, string>(); 2730 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 27312732 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 2733 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 2734 <tr> 2735 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 2736 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 27372738 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 2739 @if (!string.IsNullOrEmpty(listItem.Title)) { 2740 <div class="u-bold">@listItem.Title</div> 2741 } 2742 @if (!string.IsNullOrEmpty(listItem.Description)) { 2743 <div>@listItem.Description</div> 2744 } 2745 </td> 2746 } 27472748 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 2749 { 2750 var infoAttributes = new Dictionary<string, string>(); 2751 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 2752 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 2753 infoAttributes.Add("align", infoItem.Align.ToString()); 27542755 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 2756 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 27572758 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 2759 @if (!string.IsNullOrEmpty(infoItem.Title)) { 2760 <div>@infoItem.Title</div> 2761 } 2762 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 2763 <div><small>@infoItem.Subtitle</small></div> 2764 } 2765 </td> 27662767 columnCount++; 2768 } 2769 </tr> 2770 <tr> 2771 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 2772 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 2773 @foreach (ButtonBase action in listItem.GetActions()) 2774 { 2775 action.ButtonLayout = ButtonLayout.LinkClean; 2776 action.Icon.CssClass += " u-full-height"; 2777 action.CssClass += " data-list__action-button link"; 27782779 @Render(action) 2780 } 2781 </div> 2782 </td> 2783 </tr> 2784 </tbody> 2785 } 2786 </table> 2787 } 27882789 @* Include the Blocks for the page *@ 2790 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2791 @using Dynamicweb.Core 2792 @using System 2793 @using System.Web 2794 @using System.Collections.Generic 2795 @using Dynamicweb.Rapido.Blocks 27962797 @{ 2798 BlocksPage productListProductsBlocksPage = BlocksPage.GetBlockPage("ProductList"); 27992800 Block productsBlock = new Block 2801 { 2802 Id = "Views", 2803 SortId = 30, 2804 Template = RenderProducts() 2805 }; 28062807 productListProductsBlocksPage.Add("ProductList", productsBlock); 2808 } 28092810 @helper RenderProducts() 2811 { 2812 @*This is part of a script template *@ 28132814 <div id="ProductsContainer" data-template="{{listTemplate}}" class="grid product-list grid--external-bleed-x dw-mod grid--align-content-start" data-save-cookie="true"> 2815 {{#ProductsContainer}} 2816 {{> (lookup . 'template') }} 2817 {{/ProductsContainer}} 2818 </div> 2819 } 282028212822 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2823 @using Dynamicweb.Core 2824 @using System 2825 @using System.Web 2826 @using System.Collections.Generic 2827 @using Dynamicweb.Rapido.Blocks 2828 @using Dynamicweb.Rapido.Blocks.Components 2829 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2830 @using Dynamicweb.Rapido.Blocks.Components.General 2831 @using Dynamicweb.Rapido.Services 2832 @using Nevotex.Data.Entities 28332834 @functions { 2835 BlocksPage gridViewPage = BlocksPage.GetBlockPage("ProductList"); 2836 Dynamicweb.Frontend.ItemViewModel gridViewSettings = null; 2837 } 28382839 @if (true) 2840 { 2841 //gridViewSettings = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView"); 28422843 BlocksPage gridViewPage = BlocksPage.GetBlockPage("ProductList"); 28442845 gridViewPage.Add("Views", new Block 2846 { 2847 Id = "ProductGridItemContainer", 2848 Name = "th", 2849 SortId = 20 2850 }); 28512852 Block gridViewScripts = new Block 2853 { 2854 Id = "GridViewScripts", 2855 SortId = 20, 2856 Template = GridView(), 2857 BlocksList = new List<Block> { 2858 new Block 2859 { 2860 Id = "GridViewItem", 2861 SortId = 10, 2862 Template = RenderGridViewItem(), 2863 SkipRenderBlocksList = true, 2864 BlocksList = new List<Block> { 2865 new Block 2866 { 2867 Id = "GridViewItemHiddenProperties", 2868 SortId = 10, 2869 Template = RenderGridViewItemHiddenProperties() 2870 }, 2871 new Block 2872 { 2873 Id = "GridViewItemImageContainer", 2874 SortId = 20, 2875 SkipRenderBlocksList = true, 2876 Template = RenderGridViewItemImageContainer(), 2877 BlocksList = new List<Block> { 2878 new Block 2879 { 2880 Id = "GridViewItemImage", 2881 SortId = 10, 2882 Template = RenderGridViewItemImage() 2883 }, 2884 new Block 2885 { 2886 Id = "GridViewItemStickers", 2887 SortId = 20, 2888 Template = RenderGridViewItemStickers() 2889 } 2890 } 2891 }, 2892 new Block 2893 { 2894 Id = "GridViewItemInfoContainer", 2895 SortId = 30, 2896 SkipRenderBlocksList = true, 2897 Template = RenderGridViewItemInfoContainer(), 2898 BlocksList = new List<Block> { 2899 new Block 2900 { 2901 Id = "GridViewItemTitle", 2902 SortId = 10, 2903 Template = RenderGridViewItemTitle() 2904 } 2905 } 2906 }, 2907 new Block 2908 { 2909 Id = "GridViewItemFooter", 2910 SortId = 40, 2911 SkipRenderBlocksList = true, 2912 Template = RenderGridViewItemFooter(), 2913 BlocksList = new List<Block> { 2914 new Block 2915 { 2916 Id = "GridViewItemActions", 2917 SortId = 10, 2918 Template = RenderGridViewItemActions() 2919 } 2920 } 2921 } 2922 } 2923 } 2924 } 2925 }; 292629272928292929302931 gridViewPage.Add("BottomSnippets", gridViewScripts); 29322933 //favorites 2934 bool gridViewShowFavoriteButton = true; 29352936 if (gridViewShowFavoriteButton) 2937 { 2938 gridViewPage.Add("GridViewItemImageContainer", new Block 2939 { 2940 Id = "GridViewItemFavorites", 2941 SortId = 30, 2942 Template = RenderGridViewItemFavorites() 2943 }); 2944 } 29452946 //number 2947 bool gridViewShowNumber = true; 29482949 if (gridViewShowNumber) 2950 { 2951 gridViewPage.Add("GridViewItemInfoContainer", new Block 2952 { 2953 Id = "GridViewItemNumber", 2954 SortId = 20, 2955 Template = RenderGridViewItemNumber() 2956 }); 2957 } 29582959296029612962 //price 2963 bool gridViewShowPrice = true; 2964 if (gridViewShowPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 2965 { 2966 gridViewPage.Add("GridViewItemInfoContainer", new Block 2967 { 2968 Id = "GridViewItemPrice", 2969 SortId = 30, 2970 Template = RenderGridViewItemPrice() 2971 }); 2972 } 29732974 //stock 2975 bool gridViewShowStock = false; 29762977 if (User.IsStockInfoAllowed() && gridViewShowStock) 2978 { 2979 gridViewPage.Add("GridViewItemFooter", new Block 2980 { 2981 Id = "GridViewItemStockAndDelivery", 2982 SortId = 20, 2983 Template = RenderGridViewItemStockAndDelivery() 2984 }); 2985 } 29862987 //static variants 2988 bool gridViewShowStaticVariants = false; 29892990 if (gridViewShowStaticVariants) 2991 { 2992 gridViewPage.Add("GridViewItemFooter", new Block 2993 { 2994 Id = "GridViewItemStaticVariants", 2995 SortId = 30, 2996 Template = RenderGridViewItemStaticVariants() 2997 }); 2998 } 29993000 //download button 3001 bool gridViewShowAddToDownloadButton = false; 30023003 if (gridViewShowAddToDownloadButton && Pageview.User != null) 3004 { 3005 gridViewPage.Add("GridViewItemFooter", new Block 3006 { 3007 Id = "GridViewItemDownloadButton", 3008 SortId = 40, 3009 Template = RenderGridViewItemDownloadButton() 3010 }); 3011 } 3012 } 30133014 @helper GridView() 3015 { 3016 int columnsCount = 3; 3017 string imageZoomOnHover = "image-hover--zoom"; 30183019 <script id="ProductGridItemContainer" type="text/x-template"> 3020 {{#.}} 3021 <div id="Product{{id}}" data-template="GridViewItem" data-preloader="overlay" class="grid__col-lg-{{columnCss}} grid__col-md-{{columnCss}} grid__col-sm-{{columnCss}} grid__col-xs-6 product-list__grid-item @imageZoomOnHover dw-mod"> 3022 {{#Product}} 3023 {{>GridViewItem}} 3024 {{/Product}} 3025 </div> 3026 {{/.}} 3027 </script> 3028 } 30293030 @helper RenderGridViewItem() 3031 { 3032 List<Block> subBlocks = gridViewPage.GetBlockListById("GridViewItem"); 30333034 <script id="GridViewItem" type="text/x-template"> 3035 {{#.}} 3036 <div class="grid__col--auto js-product-scroll-trigger u-no-padding u-full-height" data-params="{{googleImpression}}"> 3037 @RenderBlockList(subBlocks) 3038 </div> 3039 {{/.}} 3040 </script> 3041 } 30423043 @helper RenderGridViewItemHiddenProperties() 3044 { 3045 <input type="hidden" name="ProductLoopCounter{{id}}" value="{{id}}" /> 3046 <input type="hidden" name="ProductID{{id}}" value="{{productId}}" /> 3047 <input type="hidden" name="VariantID{{id}}" value="{{variantid}}" id="Variant_{{id}}" /> 3048 <input type="hidden" name="UnitID{{id}}" value="{{unitId}}" id="Unit_{{id}}" /> 3049 <input type="hidden" name="Quantity{{id}}" value="1" id="Quantity_{{id}}" /> 3050 } 30513052 @helper RenderGridViewItemImageContainer() 3053 { 3054 List<Block> subBlocks = gridViewPage.GetBlockListById("GridViewItemImageContainer"); 30553056 <div class="grid__cell product-list__grid-item__image dw-mod {{imageBorder}} {{noImage}}"> 3057 @RenderBlockList(subBlocks) 3058 </div> 3059 } 30603061 @helper RenderGridViewItemImage() 3062 { 3063 bool secondaryImage = false; 30643065 <a href="{{link}}" 3066 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 3067 title="{{{name}}}{{#if variantName}}, {{variantName}}{{/if}}" 3068 class="u-block u-position-relative image-hover__wrapper dw-mod"> 3069 <img width="168" height="168" class="grid__cell-img grid__cell-img--centered u-padding b-lazy" src="/Files/Images/placeholder.gif" 3070 data-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop={{cropMode}}&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{image}}" 3071 @if (secondaryImage) { <text> 3072 {{#if secondaryImage}} 3073 data-secondary-image-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{secondaryImage}}" 3074 {{/if}} 3075 </text> } 3076 alt="{{{name}}}{{#if variantName}}, {{variantName}}{{/if}}" /> 3077 </a> 3078 } 30793080 @helper RenderGridViewItemStickers() 3081 { 3082 <text> 3083 {{#StickersContainers}} 3084 {{>StickersContainer}} 3085 {{/StickersContainers}} 3086 </text> 3087 } 30883089 @helper RenderGridViewItemFavorites() 3090 { 3091 <div class="favorites favorites--for-grid-view u-pull--right {{hasVariants}} dw-mod" {{hasVariants}}> 3092 {{#Favorite}} 3093 {{>FavoriteTemplate}} 3094 {{/Favorite}} 3095 </div> 3096 } 30973098 @helper RenderGridViewItemInfoContainer() 3099 { 3100 List<Block> subBlocks = gridViewPage.GetBlockListById("GridViewItemInfoContainer"); 31013102 <div class="grid__cell product-list__grid-item__price-info dw-mod {{paddingFix}} "> 3103 @RenderBlockList(subBlocks) 3104 </div> 3105 } 31063107 @helper RenderGridViewItemTitle() 3108 { 3109 <a href="{{link}}" class="u-color-inherit" onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" title="{{{name}}}{{#if variantName}}, {{variantName}}{{/if}}"> 3110 <h6 class="u-condensed-text u-bold">{{{name}}}{{#if variantName}}, {{variantName}}{{/if}}</h6> 3111 </a> 3112 } 31133114 @helper RenderGridViewItemNumber() 3115 { 311631173118 <div class="item-number dw-mod {{displayCss}} {{hideArticleNumberCss}} ">@Translate("ArtNr", "Art. nr"): {{number}} </div> 3119312031213122 // login to see price 3123 bool userLoggedIn = Dynamicweb.Security.UserManagement.User.IsExtranetUserLoggedIn(); 31243125 if (!userLoggedIn && (Pageview.AreaID == 21 || Pageview.AreaID == 24 || Pageview.AreaID == 25)) 3126 { 3127 <div class="u-ta-left dw-mod {{displayCss}}"> 3128 <label for="SignInModalTrigger" class="item-number sign-in-modal-trigger-button" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)"> 3129 @Translate("Logga_in_for_pris_och_kop") 3130 </label> 3131 </div> 3132 } 31333134 } 313531363137 @helper RenderGridViewItemPrice() 3138 { 3139 int columnsCount = 4; 3140 bool pointShopOnly = false; 3141 bool showCartButton = false; 3142 bool showVATPrice = false; 3143 bool isPricesWithVATEnabled = Dynamicweb.Ecommerce.Common.Context.DisplayPricesWithVat; 31443145 if (pointShopOnly) 3146 { 3147 <text> 3148 {{#if havePointPrice}} 3149 <div class="price price--product-list dw-mod">{{points}} @Translate("points")</div> 3150 @if (showCartButton) 3151 { 3152 <text> 3153 {{#unless canBePurchasedWithPoints}} 3154 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 3155 {{/unless}} 3156 </text> 3157 } 3158 {{else}} 3159 @Translate("Not available") 3160 {{/if}} 3161 </text> 31623163 } 3164 else 3165 { 3166 <div class="price price--product-list dw-mod">{{price}}</div> 3167 <div class="before-price {{onSale}} dw-mod">{{discount}}</div> 3168 if (showVATPrice) 3169 { 3170 <div class="vat-price vat-price--product-list u-margin-top dw-mod"> 3171 @if (columnsCount <= 4) 3172 { 3173 if (isPricesWithVATEnabled) 3174 { 3175 <span>@Translate("excl. VAT")</span><span> ({{priceWithoutVAT}})</span> 3176 } 3177 else 3178 { 3179 <span>@Translate("incl. VAT")</span><span> ({{priceWithVAT}})</span> 3180 } 3181 } 3182 else 3183 { 3184 if (isPricesWithVATEnabled) 3185 { 3186 <div>@Translate("excl. VAT")</div><div>({{priceWithoutVAT}})</div> 3187 } 3188 else 3189 { 3190 <div>@Translate("incl. VAT")</div><div>({{priceWithVAT}})</div> 3191 } 3192 } 3193 </div> 3194 } 3195 <text> 3196 {{#if priceRRP}} 3197 <div><small>@Translate("RRP") {{priceRRP}}</small></div> 3198 {{/if}} 3199 </text> 3200 } 3201 } 32023203 @helper RenderGridViewItemFooter() 3204 { 3205 List<Block> subBlocks = gridViewPage.GetBlockListById("GridViewItemFooter"); 3206 bool showStaticVariants = false; 32073208 <div class="product-list__grid-item__footer dw-mod {{displayCss}}"> 3209 @RenderBlockList(subBlocks) 3210 </div> 3211 } 32123213 @helper RenderGridViewItemViewButton() 3214 { 3215 string viewMoreText = "View"; 32163217 @Render(new Link 3218 { 3219 Href = "{{link}}", 3220 Id = "CartButton_{{id}}", 3221 Title = Translate(viewMoreText), 3222 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 3223 ButtonLayout = ButtonLayout.Secondary, 3224 CssClass = "u-no-margin" 3225 }); 3226 } 32273228 @helper RenderGridViewItemAddToCart() 3229 { 3230 bool pointShopOnly = false; 3231 string wrapperClass = "buttons-collection--center"; 3232 int columnsCount = 4; 3233 bool hideButtonText = columnsCount >= 4 || Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet"; 32343235 if (pointShopOnly && columnsCount <= 4) 3236 { 3237 hideButtonText = false; 3238 } 32393240 var addToCartBtn = new CustomAddToCart 3241 { 3242 WrapperCssClass = wrapperClass, 3243 AddButton = new CustomAddToCartBtn 3244 { 3245 HideTitle = hideButtonText, 3246 ProductId = "{{productId}}", 3247 VariantId = "{{variantid}}", 3248 UnitId = "{{unitId}}", 3249 ProductInfo = "{{productInfo}}", 3250 BuyForPoints = pointShopOnly, 3251 OnClick = "{{facebookPixelAction}}", 3252 ExtraAttributes = new Dictionary<string, string> 3253 { 3254 { "{{disabledBuyButton}}", "" } 3255 } 3256 } 3257 }; 32583259 if (!pointShopOnly) 3260 { 3261 addToCartBtn.QuantitySelector = new QuantitySelector 3262 { 3263 Id = "Quantity{{id}}" 3264 }; 3265 } 32663267 @Render(addToCartBtn) 3268 } 32693270 @helper RenderGridViewItemActions() 3271 { 3272 bool showCartButton = false; 3273 bool showViewButton = true; 32743275 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 3276 { 3277 if (showCartButton) 3278 { 3279 if (!showViewButton) 3280 { 3281 <text>{{#if hideAddToCartButton}}</text> 3282 <div>@RenderGridViewItemViewButton()</div> 3283 <text>{{else}}</text> 3284 @RenderGridViewItemAddToCart() 3285 <text>{{/if}}</text> 3286 } 3287 else 3288 { 3289 @RenderGridViewItemAddToCart() 3290 } 3291 } 3292 else if (showViewButton) 3293 { 3294 <div>@RenderGridViewItemViewButton()</div> 3295 } 3296 } 3297 else if (showViewButton) 3298 { 3299 <div>@RenderGridViewItemViewButton()</div> 3300 } 3301 } 33023303 @helper RenderGridViewItemStockAndDelivery() 3304 { 3305 <text>{{#if stockText}}</text> 3306 <div class="u-margin-top"> 3307 <div><span class="stock-icon {{stockState}} u-no-margin dw-mod" title="{{stockText}}"></span> {{stockText}}</div> 3308 <div> 3309 {{#if deliveryText}} 3310 {{deliveryText}} 3311 {{else}} 3312 - 3313 {{/if}} 3314 </div> 3315 </div> 3316 <text>{{/if}}</text> 3317 } 33183319 @helper RenderGridViewItemStaticVariants() 3320 { 3321 string variantsSize = "sm"; 33223323 <text> 3324 {{#Variants}} 3325 @if (variantsSize == "lg") 3326 { 3327 <text> 3328 {{>StaticVariantsLgTemplate}} 3329 </text> 3330 } 3331 else 3332 { 3333 <text> 3334 {{>StaticVariantsTemplate}} 3335 </text> 3336 } 3337 {{/Variants}} 33383339 {{#ifCond variantGroupsCount '>' 1}} 3340 <div class="static-variant"> 3341 @Translate("More options available") 3342 </div> 3343 {{/ifCond}} 33443345 {{#ifCond variantGroupsCount '==' 0}} 3346 <div class="static-variant"></div> 3347 {{/ifCond}} 3348 </text> 3349 } 33503351 @helper RenderGridViewItemDownloadButton() 3352 { 3353 <button type="button" class="btn btn--primary u-no-margin u-margin-top btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 3354 @Render(new Icon { Prefix = "fas", Name = "fa-plus", CssClass = "js-button-icon" }) 3355 <span class="js-button-text">@Translate("Add")</span> 3356 </button> 3357 } 33583359 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3360 @using Dynamicweb.Core 3361 @using System 3362 @using System.Web 3363 @using System.Collections.Generic 3364 @using Dynamicweb.Rapido.Blocks 33653366 @{ 3367 /* 3368 BlocksPage productListPromotionsBlocksPage = BlocksPage.GetBlockPage("ProductList"); 33693370 Block productListPromotions = new Block 3371 { 3372 Id = "Promotions", 3373 SortId = 10, 3374 Template = RenderProductListPromotions() 3375 }; 3376 productListPromotionsBlocksPage.Add("PageContainer", productListPromotions); 3377 */ 3378 } 33793380 @helper RenderProductListPromotions() 3381 { 3382 @*This is part of a script template *@ 33833384 //string listId = HttpContext.Current.Request.QueryString.Get("ListID"); 3385 //bool isFavoriteList = !string.IsNullOrEmpty(listId); 3386 string smallDeviceCss = ""; 33873388 if (false) 3389 { 3390 switch ("Disable") 3391 { 3392 case "OnlyText": 3393 <article class="grid__col-12 u-margin-bottom @smallDeviceCss"> 3394 <h1>{{groupName}}</h1> 3395 {{{groupDescription}}} 3396 {{#ifCond groupPromotionLink "!==" ""}} 3397 <div> 3398 <a href="{{groupPromotionLink}}" class="btn btn--primary">{{groupPromotionLinkText}}</a> 3399 </div> 3400 {{/ifCond}} 3401 </article> 3402 break; 3403 case "TextAndImage": 3404 <article class="grid__col-12 u-margin-bottom @smallDeviceCss"> 3405 <div class="grid grid--bleed"> 3406 <div class="grid__col-md-6"> 3407 <h1>{{groupName}}</h1> 3408 {{{groupDescription}}} 3409 {{#ifCond groupPromotionLink "!==" ""}} 3410 <div> 3411 <a href="{{groupPromotionLink}}" class="btn btn--primary">{{groupPromotionLinkText}}</a> 3412 </div> 3413 {{/ifCond}} 3414 </div> 3415 {{#ifCond groupPromotionImage "!==" ""}} 3416 <div class="grid__col-md-6"> 3417 <img src="/Admin/Public/GetImage.ashx?width=600&crop=5&Compression=75&DoNotUpscale=true&image={{groupPromotionImage}}" alt="{{groupName}}" class="background-image__cover" /> 3418 </div> 3419 {{/ifCond}} 3420 </div> 3421 </article> 3422 break; 3423 case "Banner": 3424 <text> 3425 {{#ifCond groupPromotionImage "!==" ""}} 3426 <article class="grid__col-12 u-margin-bottom @smallDeviceCss"> 3427 <div class="u-color-light grid center-container center-container--with-background-image grid__col--bg" style="background-image:url('{{groupPromotionImage}}');"> 3428 <div class="grid__col-12 u-middle"> 3429 <div class="grid__cell"> 3430 {{{groupDescription}}} 3431 {{#ifCond groupPromotionLink "!==" ""}} 3432 <div> 3433 <a href="{{groupPromotionLink}}" class="btn btn--primary">{{groupPromotionLinkText}}</a> 3434 </div> 3435 {{/ifCond}} 3436 </div> 3437 </div> 3438 </div> 3439 </article> 3440 {{/ifCond}} 3441 </text> 3442 break; 3443 } 3444 } 3445 } 3446 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3447 @using Dynamicweb.Core 3448 @using System 3449 @using System.Web 3450 @using System.Collections.Generic 3451 @using Dynamicweb.Rapido.Blocks 34523453 @{ 3454 BlocksPage productListMenuBlocksPage = BlocksPage.GetBlockPage("ProductList"); 34553456 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && 3457 Converter.ToString(Pageview.Page.PropertyItem["LeftMenu"]) == "True" && 3458 Pageview.Page.NavigationSettings != null && 3459 Pageview.Page.NavigationSettings.UseEcomGroups) { 34603461 Block productListMenuBlock = new Block 3462 { 3463 Id = "Menu", 3464 SortId = 20, 3465 Template = RenderProductListMenu() 3466 }; 34673468 productListMenuBlocksPage.Add("Navigation", productListMenuBlock); 3469 } 3470 } 34713472 @helper RenderProductListMenu() 3473 { 3474 var navigationMarkup = RenderNavigation(new 3475 { 3476 id = "leftnav", 3477 cssclass = "dwnavigation", 3478 startLevel = 1, 3479 endlevel = 5, 3480 template = "LeftNavigation.xslt", 3481 mode = "ecom" 3482 }); 34833484 <h2 class="u-margin-bottom">@Translate("Product categories")</h2> 34853486 <div class="u-padding-bottom--lg"> 3487 @navigationMarkup 3488 </div> 3489 } 3490 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3491 @using Dynamicweb.Core 3492 @using System 3493 @using System.Web 3494 @using System.Collections.Generic 3495 @using Dynamicweb.Rapido.Blocks 3496 @using Dynamicweb.Rapido.Blocks.Components.General 34973498 @{ 3499 BlocksPage productListFacetsBlocksPage = BlocksPage.GetBlockPage("ProductList"); 3500 string facetsBlockViewMode = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode")) ? Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode").ToLower() : "left"; 35013502 if (facetsBlockViewMode == "left" && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 3503 { 3504 Block facetsBlock = new Block 3505 { 3506 Id = "Facets", 3507 SortId = 30, 3508 Template = RenderProductListFacets() 3509 }; 3510 productListFacetsBlocksPage.Add("Navigation", facetsBlock); 3511 } 35123513 if (facetsBlockViewMode == "top" || Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3514 { 3515 Block facetsBlock = new Block 3516 { 3517 Id = "Facets", 3518 SortId = 10, 3519 Template = RenderProductListTopFacets() 3520 }; 3521 productListFacetsBlocksPage.Add("ProductList", facetsBlock); 3522 } 35233524 Block facetSelections = new Block 3525 { 3526 Id = "FacetSelections", 3527 SortId = 20, 3528 Template = RenderFacetSelections() 3529 }; 3530 productListFacetsBlocksPage.Add("ProductList", facetSelections); 35313532 Block checkboxFacetTemplate = new Block 3533 { 3534 Id = "CheckboxFacet", 3535 SortId = 30, 3536 Template = RenderCheckboxFacets() 3537 }; 3538 productListFacetsBlocksPage.Add("BottomSnippets", checkboxFacetTemplate); 35393540 Block tagsFacetTemplate = new Block 3541 { 3542 Id = "TagsFacet", 3543 SortId = 40, 3544 Template = RenderTagsFacets() 3545 }; 3546 productListFacetsBlocksPage.Add("BottomSnippets", tagsFacetTemplate); 35473548 Block colorsFacetTemplate = new Block 3549 { 3550 Id = "ColorFacet", 3551 SortId = 50, 3552 Template = RenderColorFacets() 3553 }; 3554 productListFacetsBlocksPage.Add("BottomSnippets", colorsFacetTemplate); 35553556 Block selectedFilter = new Block 3557 { 3558 Id = "SelectedFilter", 3559 SortId = 60, 3560 Template = RenderSelectedFilter() 3561 }; 3562 productListFacetsBlocksPage.Add("BottomSnippets", selectedFilter); 35633564 Block selectedColorFilter = new Block 3565 { 3566 Id = "SelectedColorFilter", 3567 SortId = 70, 3568 Template = RenderSelectedColorFilter() 3569 }; 3570 productListFacetsBlocksPage.Add("BottomSnippets", selectedColorFilter); 35713572 Block resetFilters = new Block 3573 { 3574 Id = "ResetFilters", 3575 SortId = 80, 3576 Template = RenderResetFilters() 3577 }; 3578 productListFacetsBlocksPage.Add("BottomSnippets", resetFilters); 3579 } 35803581 @helper RenderFacetSelections() 3582 { 3583 @*This is part of a script template *@ 3584 <text> 3585 {{#if FacetSelections}} 3586 <div class="buttons-collection u-margin-bottom" id="selectedFacets"> 3587 {{#FacetSelections}} 3588 {{>(lookup . 'template')}} 3589 {{/FacetSelections}} 3590 </div> 3591 {{/if}} 3592 </text> 3593 } 35943595 @helper RenderProductListFacets() { 3596 var facetSettings = Pageview.AreaSettings.GetItem("ProductList").GetItem("Facets"); 3597 string boxDisplay = facetSettings.GetList("BoxDisplay") != null ? facetSettings.GetList("BoxDisplay").SelectedValue : "scroll"; 35983599 string facetMoreClass = ( boxDisplay == "view-more" ? "facets-container__list--more" : ""); 36003601 @*This is part of a script template *@ 36023603 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" /> 3604 <div class="facets-container facets-container--left expandable--collapsed dw-mod" data-trigger="CheckFacetGroups"> 3605 {{#FacetGroups}} 3606 <input type="checkbox" id="OptionsGroup_{{name}}" class="expand-trigger js-remember-state" {{defaultState}} /> 36073608 <div class="expand-container facets-container__box dw-mod js-filter"> 3609 <label class="expand-container__btn facets-container__header dw-mod" for="OptionsGroup_{{name}}">{{name}}</label> 3610 <div class="expand-container__content js-facet-container dw-mod" data-input="OptionsGroup_{{name}}"> 3611 <div class="facets-container__search {{showFilter}} dw-mod"> 3612 <input type="text" class="u-full-width u-no-margin" onkeyup="Filter.FilterItems(event)" placeholder="@Translate("Search")" /> 3613 </div> 3614 <div id="facetList{{name}}" class="facets-container__list @facetMoreClass dw-mod"> 3615 {{#FacetOptions}} 3616 {{#ifCond template "===" "Checkboxes"}} 3617 {{>Checkboxes}} 3618 {{/ifCond}} 3619 {{#ifCond template "===" "Range"}} 3620 {{>Checkboxes}} 3621 {{/ifCond}} 3622 {{#ifCond template "===" "Weight"}} 3623 {{>Checkboxes}} 3624 {{/ifCond}} 3625 {{#ifCond template "===" "Tags"}} 3626 {{>Tags}} 3627 {{/ifCond}} 3628 {{#ifCond template "===" "Colors"}} 3629 {{>Colors}} 3630 {{/ifCond}} 3631 {{/FacetOptions}} 3632 <div class="u-hidden js-filter-not-found"> 3633 @Translate("Your search gave 0 results") 3634 </div> 3635 </div> 36363637 @if ( boxDisplay == "view-more" ) { 3638 <div class="facets-container__more js-facet-expand"> 3639 @Render(new Button { 3640 Title = "<span class=js-facet-trigger-text>" + Translate("View more") + "</span>", 3641 ButtonType = ButtonType.Button, 3642 ButtonLayout = ButtonLayout.Clean, 3643 CssClass = "facets-container__more-button js-facet-trigger u-flex u-no-margin u-full-width", 3644 OnClick = "Facets.ExpandToggle(this)", 3645 ExtraAttributes = new Dictionary<string, string>{ 3646 {"data-target", "facetList{{name}}"}, 3647 {"data-toggle-text", Translate("Show less")}, 3648 }, 3649 Icon = new Icon { 3650 Prefix = "fal", 3651 Name = "fa-angle-down", 3652 } 3653 }) 3654 </div> 3655 } 3656 </div> 3657 </div> 3658 {{/FacetGroups}} 3659 </div> 3660 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-no-margin dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Select filters")</label> 3661 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-no-margin dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Close filters")</label> 3662 } 36633664 @helper RenderProductListTopFacets() 3665 { 3666 @*This is part of a script template *@ 3667 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" /> 3668 <div class="grid grid--external-bleed dw-mod expandable--collapsed facets-container facets-container--top u-margin-bottom" data-trigger="CheckFacetGroups"> 3669 @if (Pageview.Device.ToString() == "Mobile"){ 3670 string dropdownCssClass = Pageview.Device.ToString() == "Mobile" ? "u-flex-grow--1" : ""; 36713672 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-4 grid__col-xs-12"> 3673 <input type="checkbox" id="ProductSort" class="dropdown-trigger" /> 3674 <div class="dropdown u-inline-block @dropdownCssClass dw-mod"> 3675 <label class="dropdown__header dropdown__btn dropdown__btn--small dw-mod" for="ProductSort">{{selectedSort}}</label> 3676 <div class="dropdown__content dw-mod"> 3677 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: '', SortOrder: '' }, true);">@Translate("Default")</div> 3678 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Created', SortOrder: 'DESC'}, true);">@Translate("Newest")</div> 3679 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'NameForSort', SortOrder: 'ASC'}, true);">@Translate("Name A - Z")</div> 3680 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'NameForSort', SortOrder: 'DESC'}, true);">@Translate("Name Z - A")</div> 3681 @if (Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 3682 { 3683 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Price', SortOrder: 'ASC' }, true);">@Translate("Price low - high")</div> 3684 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Price', SortOrder: 'DESC' }, true);">@Translate("Price high - low")</div> 3685 } 3686 </div> 3687 <label class="dropdown-trigger-off" for="ProductSort"></label> 3688 </div> 3689 </div> 3690 } 36913692 {{#FacetGroups}} 3693 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-4 grid__col-xs-12"> 3694 <input type="checkbox" id="OptionsGroup_{{counter}}" class="dropdown-trigger" /> 3695 <div class="dropdown dw-mod js-filter"> 3696 <label class="dropdown__header dropdown__btn dw-mod" for="OptionsGroup_{{counter}}">{{name}}</label> 3697 <div class="dropdown__content dropdown__content--padding dw-mod"> 3698 <div class="u-margin-bottom {{showFilter}}"> 3699 <input type="text" class="u-full-width u-no-margin" onkeyup="Filter.FilterItems(event)" placeholder="@Translate("Search")" /> 3700 </div> 3701 {{#FacetOptions}} 3702 {{#ifCond template "===" "Checkboxes"}} 3703 {{>Checkboxes}} 3704 {{/ifCond}} 3705 {{#ifCond template "===" "Range"}} 3706 {{>Checkboxes}} 3707 {{/ifCond}} 3708 {{#ifCond template "===" "Weight"}} 3709 {{>Checkboxes}} 3710 {{/ifCond}} 3711 {{#ifCond template "===" "Tags"}} 3712 {{>Tags}} 3713 {{/ifCond}} 3714 {{#ifCond template "===" "Colors"}} 3715 {{>Colors}} 3716 {{/ifCond}} 3717 {{/FacetOptions}} 3718 <div class="u-hidden js-filter-not-found"> 3719 @Translate("Your search gave 0 results") 3720 </div> 3721 </div> 3722 <label class="dropdown-trigger-off" for="OptionsGroup_{{counter}}"></label> 3723 </div> 3724 </div> 3725 {{/FacetGroups}} 3726 </div> 3727 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-margin-bottom--lg dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Select filters")</label> 3728 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-margin-bottom--lg dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Close filters")</label> 3729 } 37303731 @helper RenderCheckboxFacets() 3732 { 3733 <script id="Checkboxes" type="text/x-template"> 3734 <div class="form__field-group u-no-margin dw-mod"> 3735 <input type="checkbox" class="{{selected}} checkbox-facet__checkbox form__control dw-mod" onclick="Facets.UpdateFacets(this);" id="{{queryParameter}}{{value}}" name="{{queryParameter}}" value="[{{value}}]" {{selected}} {{disabled}}> 3736 <label class="{{disabled}} checkbox-facet dw-mod" data-filter-value="{{label}}" for="{{queryParameter}}{{value}}"> 3737 <span class="checkbox-facet__label dw-mod">{{label}}</span> 3738 <span class="checkbox-facet__count dw-mod">{{#if showCount}}({{count}}){{/if}}</span> 3739 </label> 3740 </div> 3741 </script> 3742 } 37433744 @helper RenderTagsFacets() 3745 { 3746 <script id="Tags" type="text/x-template"> 3747 <button type="button" class="btn btn--tag {{selected}} {{disabled}} dw-mod" data-filter-value="{{label}}" data-check="{{selected}}" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" {{disabled}}> 3748 {{label}} <span class="facets-group__counter dw-mod">({{count}})</span> 3749 </button> 3750 </script> 3751 } 37523753 @helper RenderColorFacets() 3754 { 3755 <script id="Colors" type="text/x-template"> 3756 <button type="button" class="btn btn--colorbox u-margin-right {{selected}} {{disabled}} dw-mod" data-filter-value="{{label}}" style="background-color: {{value}}" title="{{label}}" data-check="{{selected}}" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" {{disabled}}></button> 3757 </script> 3758 } 37593760 @helper RenderSelectedFilter() 3761 { 3762 <script id="SelectedFilter" type="text/x-template"> 3763 <button type="button" class="btn btn--tag dw-mod" data-check="checked" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" title="@Translate("Remove filter")"> 3764 {{group}}: {{label}} <i class="fal fa-times"></i> 3765 </button> 3766 </script> 3767 } 37683769 @helper RenderSelectedColorFilter() 3770 { 3771 <script id="SelectedColorFilter" type="text/x-template"> 3772 <button type="button" class="btn btn--tag dw-mod" data-check="checked" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" title="@Translate("Remove filter")"> 3773 {{group}}: <div class="btn__colorbox dw-mod" style="background-color: {{value}}"></div> <i class="fas fa-times"></i> 3774 </button> 3775 </script> 3776 } 37773778 @helper RenderResetFilters() 3779 { 3780 <script id="ResetFilters" type="text/x-template"> 3781 <button type="button" class="btn btn--tag" onclick="Facets.ResetFacets();"> 3782 @Translate("Reset all filters") <i class="fal fa-redo"></i> 3783 </button> 3784 </script> 3785 } 378637873788 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3789 @using Dynamicweb.Core 3790 @using System 3791 @using System.Web 3792 @using System.Collections.Generic 3793 @using Dynamicweb.Rapido.Blocks 37943795 @{ 3796 BlocksPage productListMoreBlocksPage = BlocksPage.GetBlockPage("ProductList"); 37973798 Block moreBlock = new Block 3799 { 3800 Id = "More", 3801 SortId = 40, 3802 Template = RenderListMore() 3803 }; 38043805 productListMoreBlocksPage.Add("ProductList", moreBlock); 3806 } 38073808 @helper RenderListMore() 3809 { 3810 @*This is part of a script template *@ 3811 string groupID = HttpContext.Current.Request.QueryString.Get("groupid"); 3812 string listId = HttpContext.Current.Request.QueryString.Get("ListID"); 3813 bool isFavoriteList = !string.IsNullOrEmpty(listId); 3814 string moreFeedFullUrl = GetGlobalValue("Global:Pageview.Url.Raw") + "&feed=true"; 3815 moreFeedFullUrl += !isFavoriteList ? "&DoNotShowVariantsAsSingleProducts=True" : ""; 3816 string columnCss = Pageview.Device.ToString() == "Mobile" ? "grid__col--bleed" : "u-no-padding"; 3817 <text> 3818 {{#if ProductsContainer}} 3819 <div class="grid"> 3820 <div class="grid__col-12 @columnCss"> 3821 <button type="button" id="LoadMoreButton" class="btn btn--primary btn--full {{nextdisabled}} dw-mod" data-current="{{currentPage}}" data-page-size="{{pageSize}}" data-total="{{totalPages}}" data-container="ProductsContainer" data-feed-url="@moreFeedFullUrl&{{loadMoreFeedParams}}" onclick="LoadMore.Next(this)" {{nextdisabled}}>@Translate("Load") {{pageSizeText}} @Translate("more")</button> 3822 <button type="button" class="btn btn--clean" onclick="window.scroll(0, 0)">@Translate("Return to top")</button> 3823 </div> 3824 </div> 3825 {{/if}} 3826 </text> 3827 } 3828 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3829 @using Dynamicweb.Core 3830 @using System 3831 @using System.Web 3832 @using System.Collections.Generic 3833 @using Dynamicweb.Rapido.Blocks 3834 @using Dynamicweb.Rapido.Blocks.Components 3835 @using Dynamicweb.Rapido.Blocks.Components.General 38363837 @{ 3838 BlocksPage productListBottomSnippetsPage = BlocksPage.GetBlockPage("ProductList"); 38393840 Block productListStickers = new Block 3841 { 3842 Id = "Stickers", 3843 SortId = 10, 3844 Template = RenderStickersTemplates() 3845 }; 3846 productListBottomSnippetsPage.Add("BottomSnippets", productListStickers); 38473848 Block productListUnits = new Block 3849 { 3850 Id = "Units", 3851 SortId = 20, 3852 Template = RenderUnitTemplates() 3853 }; 3854 productListBottomSnippetsPage.Add("BottomSnippets", productListUnits); 38553856 Block productListVariants = new Block 3857 { 3858 Id = "Variants", 3859 SortId = 30, 3860 Template = RenderVariantTemplates() 3861 }; 3862 productListBottomSnippetsPage.Add("BottomSnippets", productListVariants); 38633864 Block productListFavorites = new Block 3865 { 3866 Id = "Favorites", 3867 SortId = 40, 3868 Template = RenderFavoritesTemplates() 3869 }; 3870 productListBottomSnippetsPage.Add("BottomSnippets", productListFavorites); 38713872 Block productListPreRender = new Block 3873 { 3874 Id = "PreRenders", 3875 SortId = 50, 3876 Template = RenderPreRenderTemplates() 3877 }; 3878 productListBottomSnippetsPage.Add("BottomSnippets", productListPreRender); 38793880 Block productListInitializers = new Block 3881 { 3882 Id = "Initializers", 3883 SortId = 60, 3884 Template = RenderInitializers() 3885 }; 3886 productListBottomSnippetsPage.Add("BottomSnippets", productListInitializers); 3887 } 388838893890 @helper RenderFavoritesTemplates() 3891 { 3892 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star"; 3893 string favoriteIcon = "fas fa-" + selectedFavoriteIcon; 3894 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon; 3895 bool useFacebookPixel = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 3896 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID"); 38973898 <script id="FavoriteTemplate" type="text/x-template"> 3899 <div class="favorites-list u-ta-left js-favorites-list"> 3900 @Render(new Button { 3901 CssClass = "u-no-margin js-favorite-btn", 3902 Icon = new Icon 3903 { 3904 Name = "{{#if isInAnyFavoriteList}}" + favoriteIcon + "{{else}}" + favoriteOutlineIcon + "{{/if}}", 3905 CssClass = "fa-1_5x", 3906 LabelPosition = IconLabelPosition.After 3907 }, 3908 ButtonLayout = ButtonLayout.LinkClean, 3909 ButtonType = ButtonType.Button, 3910 OnClick = "document.getElementById('FavoriteTrigger_{{id}}').checked = true" 3911 }) 3912 <input type="checkbox" id="FavoriteTrigger_{{id}}" class="dropdown-trigger" /> 3913 <div class="dropdown dropdown--position-32px"> 3914 <div class="dropdown__content dropdown__content--show-left dropdown__content--padding u-w220px dw-mod"> 3915 <ul class="list list--clean dw-mod"> 3916 {{#FavoriteLists}} 3917 {{>FavoriteListItem}} 3918 {{/FavoriteLists}} 3919 </ul> 3920 </div> 3921 <label class="dropdown-trigger-off" for="FavoriteTrigger_{{id}}"></label> 3922 </div> 3923 </div> 3924 </script> 39253926 <script id="FavoriteListItem" type="text/x-template"> 3927 <li> 3928 @{ 3929 var button = new Button { 3930 CssClass = "list__link u-no-underline", 3931 OnClick = "toggleFavAction(this, event)", 3932 Icon = new Icon { Name = "{{#if isInFavoriteList}}" + favoriteIcon + "{{else}}" + favoriteOutlineIcon + "{{/if}}", LabelPosition = IconLabelPosition.After }, 3933 AltText = "{{#if isInFavoriteList}}" + Translate("Remove from") + " {{name}}{{else}}" + Translate("Add to") + " {{name}}{{/if}}", 3934 Title = "{{name}}", 3935 ButtonType = ButtonType.Button, 3936 ButtonLayout = ButtonLayout.LinkClean, 3937 ExtraAttributes = new Dictionary<string, string> 3938 { 3939 { "data-list-id", "{{listId}}" }, 3940 { "data-list-name", "{{name}}" }, 3941 { "data-remove-link", "{{removeLink}}" }, 3942 { "data-add-link", "{{addLink}}" }, 3943 { "data-is-in-list", "{{isInFavoriteList}}" }, 39443945 } 3946 }; 3947 if (useFacebookPixel) 3948 { 3949 button.ExtraAttributes.Add("data-facebook-object", "{{facebookPixelAddAction}}"); 3950 } 3951 } 3952 @Render(button) 3953 </li> 3954 </script> 39553956 <script> 3957 @if (!string.IsNullOrEmpty(currentFavoriteListId)) 3958 { 3959 <text> 3960 window.currentFavoriteListId = "@currentFavoriteListId"; 3961 </text> 3962 } 3963 function toggleFavAction(button, event) { 3964 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 3965 Scroll.SavePosition(event); 3966 @if (useFacebookPixel) 3967 { 3968 <text> 3969 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 3970 </text> 3971 } 3972 location.href = button.getAttribute('data-add-link'); 3973 return; 3974 } 3975 let isAdd = button.getAttribute('data-is-in-list') == "false"; 3976 Request.Fetch().get( 3977 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 3978 function (result) { 3979 button.querySelector('i').className = isAdd ? '@favoriteIcon u-margin-right--lg' : '@favoriteOutlineIcon u-margin-right--lg'; 3980 button.setAttribute('data-is-in-list', isAdd); 3981 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name')) 3982 let favList = button.closest('.js-favorites-list'); 3983 let favBtn = favList.querySelector('.js-favorite-btn i'); 3984 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 3985 if (isInAnyFavoriteList) { 3986 favBtn.className = '@favoriteIcon' + ' fa-1_5x'; 3987 } else { 3988 favBtn.className = '@favoriteOutlineIcon' + ' fa-1_5x'; 3989 } 3990 @if (useFacebookPixel) 3991 { 3992 <text> 3993 if (isAdd) { 3994 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 3995 } 3996 </text> 3997 } 3998 if (window.currentFavoriteListId != null) { //if this page is favorite list 3999 let listId = button.getAttribute("data-list-id"); 4000 if (listId == window.currentFavoriteListId && !isAdd) { 4001 location.reload(); 4002 } 4003 } 4004 }, 4005 function () { 4006 console.error("FavoriteLists: Error in ToggleFavAction request"); 4007 }, 4008 false 4009 ); 4010 } 4011 </script> 4012 } 40134014 @helper RenderStickersTemplates() 4015 { 4016 <script id="StickersContainer" type="text/x-template"> 4017 <div class="stickers-container stickers-container--{{{convertStickerPositionToClassName Position}}} dw-mod"> 4018 {{#Stickers}} 4019 {{>Sticker}} 4020 {{/Stickers}} 4021 </div> 4022 </script> 40234024 <script id="Sticker" type="text/x-template"> 4025 <div class="stickers-container__tag {{CssClass}} dw-mod">{{Title}}</div> 4026 </script> 40274028 <script id="MiniSticker" type="text/x-template"> 4029 <div class="stickers-container__tag stickers-container__tag--micro {{CssClass}} dw-mod">{{Title}}</div> 4030 </script> 4031 } 40324033 @helper RenderUnitTemplates() 4034 { 4035 <script id="UnitOption" type="text/x-template"> 4036 <div class="dropdown__item dw-mod" onclick="HandlebarsBolt.UpdateContent(this.closest('.js-product').id, '{{link}}&feed=true&UnitID={{value}}')">{{name}}</div> 4037 </script> 4038 } 40394040 @helper RenderVariantTemplates() { 4041 <script id="VariantsTemplate" type="text/x-template"> 4042 {{#.}} 4043 <div> 4044 <div> 4045 {{#VariantOptions}} 4046 {{>VariantOption}} 4047 {{/VariantOptions}} 4048 </div> 4049 </div> 4050 {{/.}} 4051 </script> 40524053 <script id="VariantOption" type="text/x-template"> 4054 {{#if color}} 4055 <button type="button" data-variant-id="{{variantId}}" data-variant-group="{{groupId}}" onclick="MatchVariants.SelectThis(event)" class="btn btn--colorbox u-margin-right {{disabled}} {{selected}} js-variant-option" data-check="{{selected}}" {{disabled}} style="background-color: {{color}}"></button> 4056 {{else}} 4057 {{#if image}} 4058 <img data-variant-id="{{variantId}}" data-variant-group="{{groupId}}" src="{{image}}" onclick="MatchVariants.SelectThis(event)" alt="{{name}}" title="{{name}}" class="btn btn--tag {{selected}} js-variant-option" data-check="{{selected}}" /> 4059 {{else}} 4060 <button type="button" data-variant-id="{{variantId}}" data-variant-group="{{groupId}}" onclick="MatchVariants.SelectThis(event)" class="btn btn--tag {{disabled}} {{selected}} js-variant-option" data-check="{{selected}}" {{disabled}}>{{name}}</button> 4061 {{/if}} 4062 {{/if}} 4063 </script> 40644065 <script id="DropdownVariantsTemplate" type="text/x-template"> 4066 {{#.}} 4067 <div> 4068 <div class="u-bold">{{name}}</div> 4069 <select id="VariantSelector_{{id}}" class="u-full-width dw-mod" name="VariantSelector_{{id}}" onchange="MatchVariants.SelectOnChange(event)" > 4070 <option>@Translate("Choose")</option> 4071 {{#VariantOptions}} 4072 {{>DropdownVariantOption}} 4073 {{/VariantOptions}} 4074 </select> 4075 </div> 4076 {{/.}} 4077 </script> 40784079 <script id="DropdownVariantOption" type="text/x-template"> 4080 <option class="js-variant-option {{selected}}" id="{{groupId}}_{{variantId}}" value="{{groupId}}_{{variantId}}" data-variant-id="{{variantId}}" data-variant-group="{{groupId}}" {{#if selected}}selected{{/if}} data-check="{{selected}}">{{name}}</option> 4081 </script> 40824083 <script id="StaticVariantsTemplate" type="text/x-template"> 4084 {{#.}} 4085 {{#if isFirstGroup}} 4086 <div> 4087 {{#VariantOptions}} 4088 {{>StaticVariantOption}} 4089 {{/VariantOptions}} 4090 </div> 4091 {{/if}} 4092 {{/.}} 4093 </script> 40944095 <script id="StaticVariantOption" type="text/x-template"> 4096 {{#if color}} 4097 <div class="static-variant static-variant--color dw-mod" style="background-color: {{color}}" title="{{name}}"></div> 4098 {{else}} 4099 <div class="static-variant dw-mod">{{name}} </div> 4100 {{/if}} 4101 </script> 410241034104 <script id="StaticVariantsLgTemplate" type="text/x-template"> 4105 {{#.}} 4106 {{#if isFirstGroup}} 4107 <div class="padding-size-xs"> 4108 {{#VariantOptions}} 4109 {{>StaticVariantLgOption}} 4110 {{/VariantOptions}} 4111 </div> 4112 {{/if}} 4113 {{/.}} 4114 </script> 41154116 <script id="StaticVariantLgOption" type="text/x-template"> 4117 {{#if color}} 4118 <div class="static-variant static-variant--color static-variant--color--lg dw-mod" style="background-color: {{color}}" title="{{name}}"></div> 4119 {{else}} 4120 <div class="static-variant dw-mod">{{name}} </div> 4121 {{/if}} 4122 </script> 41234124 <script id="VariantOptionImage" type="text/x-template"> 4125 <img data-variant-id="{{variantId}}" data-friends="{{friendsList}}" data-variant-group="{{groupId}}" onclick="MatchVariants.SelectThis(event)" src="/Admin/Public/GetImage.ashx?width=100&height=50&crop=5&Compression=75&image=/Images/{{image}}" alt="{{name}}" title="{{name}}" class="btn btn--tag {{disabled}} {{selected}} js-variant-option" data-check="{{selected}}" {{disabled}} /> 4126 </script> 4127 } 41284129 @helper RenderPreRenderTemplates() { 4130 string facetsViewMode = !String.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode")) ? Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode").ToLower() : "left"; 41314132 <script id="ProductPreRenderContainer" type="text/x-template"> 4133 @if (facetsViewMode == "left" && Pageview.Device.ToString() != "Mobile") 4134 { 4135 <div class="grid__col-3"> 4136 <div class="pre-render-element pre-render-element--xs"></div> 4137 <div class="pre-render-element pre-render-element--md"></div> 4138 <div class="pre-render-element pre-render-element--md"></div> 4139 <div class="pre-render-element pre-render-element--md"></div> 4140 </div> 4141 } 4142 <div class="grid__col-auto"> 4143 <div class="pre-render-element pre-render-element--xs"></div> 4144 <div class="pre-render-element pre-render-element--lg"></div> 4145 <div class="pre-render-element pre-render-element--lg"></div> 4146 <div class="pre-render-element pre-render-element--lg"></div> 4147 <div class="pre-render-element pre-render-element--lg"></div> 4148 </div> 4149 </script> 4150 } 41514152 @helper RenderInitializers() { 4153 <script> 4154 document.addEventListener("DOMContentLoaded", function (event) { 4155 document.getElementById("productList").addEventListener('contentLoaded', function (e) { 4156 if (getTarget(e).id === "productList") { 4157 Search.Init(); 4158 Facets.Init("selectedFacets", "productList"); 4159 } 4160 }, false); 41614162 @{ 4163 bool useGoogleTagManager = false; 41644165 if (useGoogleTagManager) 4166 { 4167 <text> 4168 Scroll.AddIsInViewportListener(".js-product-scroll-trigger", function (elem) { 4169 let googleImpression = JSON.parse(elem.getAttribute("data-params")); 4170 googleEnchantImpression(googleImpression); 4171 elem.classList.remove("js-product-scroll-trigger"); 4172 }); 4173 </text> 4174 } 4175 } 41764177 }); 4178 </script> 4179 } 418041814182 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4183 @using Dynamicweb.Core 4184 @using System 4185 @using System.Web 4186 @using System.Collections.Generic 4187 @using Dynamicweb.Rapido.Blocks 41884189 @{ 4190 BlocksPage customBlocksPage = BlocksPage.GetBlockPage("ProductList"); 41914192 } 419341944195 @if (productListNavigation.BlocksList.Count == 0) 4196 { 4197 productListNavigation.Design.RenderType = RenderType.Hide; 4198 } 41994200 <form name="multiForm" id="multiForm" method="post" onkeypress="return event.keyCode != 13;"> 4201 @* onkeypress is the fix for disabling submit form on Enter key from any field in product list *@ 4202 <input type="hidden" name="CartCmd" id="CartCmd" value="addMulti" /> 4203 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 4204 @RenderBlockList(productListPage.BlocksRoot.BlocksList) 4205 </form> 42064207 @helper RenderPageContainer() 4208 { 4209 List<Block> subBlocks = this.productListPage.GetBlockListById("PageContainer").OrderBy(item => item.SortId).ToList(); 4210 var groupid = HttpContext.Current.Request.QueryString["groupid"]; 4211 string pageUrl = GetGlobalValue("Global:Pageview.Url.Raw"); 4212 string feedFullUrl = pageUrl + "&feed=true"; 4213 feedFullUrl += !isFavoriteList ? "&DoNotShowVariantsAsSingleProducts=True" : ""; 4214 string smallDeviceCss = Pageview.Device.ToString() == "Mobile" ? "" : "u-padding"; 4215 string pageId = Convert.ToString(Dynamicweb.Frontend.PageView.Current().Page.ID); 4216 string groupUrl = $"/default.aspx?id={pageId}&GroupId="; 4217 var renderGroups = true; 4218 var renderProducts = true; 4219 var group = Services.ProductGroups.GetGroup(groupid); 42204221 if (!string.IsNullOrWhiteSpace(groupid)) 4222 { 4223 if (Services.ProductGroups.HasSubgroups(group)) 4224 { 4225 renderProducts = false; 4226 } 4227 else 4228 { 4229 renderGroups = false; 4230 } 42314232 } 423342344235423642374238 if (groupid == "GROUP318" || groupid == "GROUP758" || groupid == "1011atSHOP17" || groupid == "1011atSHOP16" || groupid == "1011atSHOP15") 4239 { 4240 renderGroups = false; 4241 } 4242424342444245 if (renderGroups) 4246 { 4247 <section class="multiple-paragraphs-container multiple-paragraphs-container--spacing-sm dw-mod groupheader-fix"> 4248 <div class="paragraph-container__grid--bleed-x "> 4249 <div class="grid grid--align-content-start js-handlebars-root" id="groupList" data-template="GroupContainer" data-pre-render-template="ProductPreRenderContainer" data-json-feed="@feedFullUrl" data-no-result-template="NoGroupsFound" data-preloader="overlay"></div> 4250 </div> 4251 </section> 4252 } 42534254 if (renderProducts) 4255 { 4256 <div class="grid grid--align-content-start @smallDeviceCss js-handlebars-root" id="productList" data-template="ProductContainer" data-pre-render-template="ProductPreRenderContainer" data-json-feed="@feedFullUrl" data-preloader="minimal"></div> 4257 } 4258 else 4259 { 4260 <div id="productList"></div> 4261 } 42624263426442654266 <script id="GroupContainer" type="text/x-template"> 4267 {{#.}} 42684269 {{#if groupLargeImage}} 4270 <div class="grid"> 4271 <div class="grid__col-12 grid__col--bleed-x"> 4272 <div class="grid__cell group-image"> 4273 <img src="{{groupLargeImage}}" alt="{{groupName}}" /> 4274 </div> 4275 </div> 4276 </div> 4277 {{/if}} 42784279 <div class="grid"> 4280 <div class="grid__col-12"> 4281 <div class="grid__cell"> 4282 <div class="u-pull--left"> 4283 <h1><i class="{{headerIcon}}"></i>{{groupName}}</h1> 4284 <div class="u-margin-bottom-lg">{{{groupDescription}}}</div> 4285 </div> 4286 </div> 4287 </div> 4288 </div> 42894290 <div class="grid"> 4291 <div class="grid__col-12 grid__col--bleed-x"> 4292 <div class="grid__cell"> 4293 <div id="GroupsContainer" class="grid product-list dw-mod" data-template="GroupGridItemContainer" data-preloader="minimal"> 4294 {{#GroupsContainer}} 4295 {{>GroupGridItemContainer}} 4296 {{/GroupsContainer}} 4297 </div> 4298 </div> 4299 </div> 4300 </div> 4301430243034304 {{/.}} 4305 </script> 43064307 <script id="GroupGridItemContainer" type="text/x-template"> 4308 {{#.}} 4309 <div id="Group{{id}}" class="grid__col-lg-3 grid__col-md-3 grid__col-sm-3 grid__col-xs-6 product-list__list-item dw-mod" style="{{hide}}" data-template="GroupGridItem" data-preloader="false"> 4310 {{#Group}} 4311 {{>GroupGridItem}} 4312 {{/Group}} 4313 </div> 4314 {{/.}} 4315 </script> 43164317 <script id="GroupGridItem" type="text/x-template"> 4318 {{#.}} 4319 <div class="grid__cell u-border dw-mod {{noImage}}"> 4320 <a href="@groupUrl{{link}}" onclick="Scroll.SavePosition(event)"><img class="grid__cell-img grid__cell-sm-img--centered" src="/Admin/Public/GetImage.ashx?width=350&height=350&crop=0&Compression=75&image={{image}}" alt="{{name}}" /></a> 4321 </div> 43224323 <div class="grid__cell dw-mod u-margin-top"> 4324 <a href="@groupUrl{{link}}" onclick="Scroll.SavePosition(event)" title="{{name}}"><h6 class="u-condensed-text grid__cell-sm-img--centered">{{name}}</h6></a> 4325 </div> 4326 {{/.}} 4327 </script> 432843294330 <script id="ProductContainer" type="text/x-template"> 4331 {{#each .}} 4332 @RenderBlockList(subBlocks) 4333 {{else}} 43344335 @{ 4336 var searchText = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : ""; 43374338 if (!string.IsNullOrWhiteSpace(searchText)) 4339 { 4340 <div class="grid__col-12"> 4341 <h2 class="u-ta-center">@Translate("Your search gave 0 results")</h2> 4342 </div> 4343 } 43444345 } 43464347 {{/each}} 4348 </script> 4349 } 43504351 @helper RenderProductList() 4352 { 4353 @*This is part of a script template *@ 43544355 List<Block> subBlocks = productListPage.GetBlockListById("ProductList").OrderBy(item => item.SortId).ToList(); 4356 string smallDeviceCss = Pageview.Device.ToString() == "Mobile" ? "u-no-padding" : ""; 4357 string columnClass = "auto"; 43584359 if (productListPage.GetBlockListById("Navigation").Count == 0) 4360 { 4361 columnClass = "12"; 4362 } 436343644365 <div class="grid__col-@columnClass @smallDeviceCss"> 4366 @RenderBlockList(subBlocks) 4367 </div> 4368 } 43694370 @helper RenderProductListHeader() 4371 { 4372 List<Block> subBlocks = this.productListPage.GetBlockListById("ProductListHeader"); 4373 bool enableSeparationLine = productListSettings.GetBoolean("EnableSeparationLine"); 4374 string className = (enableSeparationLine != null && enableSeparationLine ? "u-border-bottom u-padding-bottom" : ""); 43754376 <div class="grid grid--align-content-start grid--justify-start grid--bleed u-margin-bottom--lg u-padding grid--wrap u-flex-grow--0 dw-mod"> 4377 <div class="grid @className"> 4378 <div class="u-pull--left"> 4379 <h1><i class="{{headerIcon}}"></i>{{groupName}}</h1> 4380 <div class="u-margin-bottom-lg">{{{groupDescription}}}</div> 4381 </div> 43824383 @RenderBlockList(subBlocks) 4384 </div> 4385 </div> 4386 } 43874388 @helper RenderProductListTitle() 4389 { 4390 var header = new Heading { Title = "{{{header}}}", CssClass = "u-no-margin" }; 4391 var searchText = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : ""; 43924393 if (isFavoriteList) 4394 { 4395 var selectedFavoriteIcon = "star"; 4396 header.Icon = new Icon { Prefix = "fas", Name = "fa-" + selectedFavoriteIcon, LabelPosition = IconLabelPosition.After }; 4397 @Render(header) 4398 } 439944004401 if (!string.IsNullOrWhiteSpace(searchText)) 4402 { 4403 @Render(header) 4404 } 440544064407 } 44084409 @helper RenderFavoriteListSearch() 4410 { 4411 string pageId = GetGlobalValue("Global:Page.ID"); 4412 string pageUrl = GetGlobalValue("Global:Pageview.Url.Raw"); 4413 string feedFullUrl = pageUrl + "&feed=true"; 4414 string searchPlaceholder = Translate("Search favorite products"); 4415 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 44164417 <div class="typeahead u-color-inherit typeahead--favorites js-typeahead" data-page-size="10" id="FavoritesSearch" data-list-id="@favoriteListId" data-search-feed-id="@pageId&feed=true" data-result-page-id="@pageId"> 4418 <input type="text" class="typeahead-search-field u-no-margin u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue"> 4419 <ul class="dropdown dropdown--absolute-position u-full-width js-handlebars-root js-typeahead-search-content u-min-w220px u-full-width dw-mod" id="FavoritesSearchContent" data-template="SearchProductsTemplate" data-json-feed="@feedFullUrl&ListID=@favoriteListId" data-init-onload="false" data-preloader="minimal"></ul> 4420 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fas fa-search"></i></button> 4421 </div> 4422 }