Error executing template "Designs/Rapido/eCom/Productlist/ProductsRender.cshtml"System.NullReferenceException: Object reference not set to an instance of an object.at CompiledRazorTemplates.Dynamic.RazorEngine_d63eded3735e4dfe980517531a0ba4d0.b__21_0(TextWriter __razor_helper_writer) in D:\web\websites\NewSpaldings\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 2023at RazorEngine.Templating.TemplateWriter.ToString()at System.Lazy`1.CreateValue()at System.Lazy`1.LazyInitValue()at CompiledRazorTemplates.Dynamic.RazorEngine_d63eded3735e4dfe980517531a0ba4d0.<>c__DisplayClass2_0.b__0(TextWriter __razor_helper_writer) in D:\web\websites\NewSpaldings\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 168at CompiledRazorTemplates.Dynamic.RazorEngine_d63eded3735e4dfe980517531a0ba4d0.<>c__DisplayClass1_0.b__0(TextWriter __razor_helper_writer) in D:\web\websites\NewSpaldings\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 82at CompiledRazorTemplates.Dynamic.RazorEngine_d63eded3735e4dfe980517531a0ba4d0.Execute() in D:\web\websites\NewSpaldings\Files\Templates\Designs\Rapido\eCom\Productlist\ProductsRender.cshtml:line 1972at 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.b__0(TextWriter writer)at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)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.Rapido.Blocks 13 14 @functions { 15 BlocksPage productListPage = BlocksPage.GetBlockPage("ProductList"); 16 } 17 18 @{ 19 Block pageContainer = new Block() 20 { 21 Id = "PageContainer", 22 Template = RenderPageContainer(), 23 SkipRenderBlocksList = true 24 }; 25 productListPage.Add(pageContainer); 26 27 Block productListNavigation = new Block() 28 { 29 Id = "Navigation", 30 SortId = 20, 31 Design = new Design 32 { 33 RenderType = RenderType.Column, 34 Size = "3" 35 } 36 }; 37 productListPage.Add("PageContainer", productListNavigation); 38 39 Block productListContainer = new Block() 40 { 41 Id = "ProductList", 42 SortId = 30, 43 Template = RenderProductList(), 44 SkipRenderBlocksList = true 45 }; 46 productListPage.Add("PageContainer", productListContainer); 47 48 Block productListSnippets = new Block() 49 { 50 Id = "BottomSnippets", 51 SortId = 40 52 }; 53 productListPage.Add(productListSnippets); 54 } 55 56 @* This is required for the product list feed to work *@ 57 @GetValue("DoNotRenderProductListTemplate") 58 59 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 60 @using System.Text.RegularExpressions 61 @using System.Collections.Generic 62 @using System.Reflection 63 @using System.Web.UI.HtmlControls 64 @using Dynamicweb.Rapido.Blocks.Components 65 @using Dynamicweb.Rapido.Blocks.Components.Articles 66 @using Dynamicweb.Rapido.Blocks.Components.Documentation 67 @using Dynamicweb.Rapido.Blocks 68 69 70 @*--- START: Base block renderers ---*@ 71 72 @helper RenderBlockList(List<Block> blocks) 73 { 74 blocks = blocks.OrderBy(item => item.SortId).ToList(); 75 76 foreach (Block item in blocks) 77 { 78 <!-- START: @item.Id --> 79 80 if (item.Design == null) 81 { 82 @RenderBlock(item) 83 } 84 else if (item.Design.RenderType == RenderType.None) { 85 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 86 87 <div class="@cssClass dw-mod"> 88 @RenderBlock(item) 89 </div> 90 } 91 else if (item.Design.RenderType != RenderType.Hide) 92 { 93 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 94 95 if (!item.SkipRenderBlocksList) { 96 if (item.Design.RenderType == RenderType.Row) 97 { 98 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 99 @RenderBlock(item)100 </div>101 }102103 if (item.Design.RenderType == RenderType.Column)104 {105 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";106 string size = item.Design.Size ?? "12";107 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;108109 <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">110 @RenderBlock(item)111 </div>112 }113114 if (item.Design.RenderType == RenderType.Table)115 {116 <table class="table @cssClass dw-mod" id="Block__@item.Id">117 @RenderBlock(item)118 </table>119 }120121 if (item.Design.RenderType == RenderType.TableRow)122 {123 <tr class="@cssClass dw-mod" id="Block__@item.Id">124 @RenderBlock(item)125 </tr>126 }127128 if (item.Design.RenderType == RenderType.TableColumn)129 {130 <td class="@cssClass dw-mod" id="Block__@item.Id">131 @RenderBlock(item)132 </td>133 }134135 if (item.Design.RenderType == RenderType.CardHeader)136 {137 <div class="card-header @cssClass dw-mod">138 @RenderBlock(item)139 </div>140 }141142 if (item.Design.RenderType == RenderType.CardBody)143 {144 <div class="card @cssClass dw-mod">145 @RenderBlock(item)146 </div>147 }148149 if (item.Design.RenderType == RenderType.CardFooter)150 {151 <div class="card-footer @cssClass dw-mod">152 @RenderBlock(item)153 </div>154 }155 }156 else157 {158 @RenderBlock(item)159 }160 }161162 <!-- END: @item.Id -->163 }164 }165166 @helper RenderBlock(Block item)167 {168 if (item.Template != null)169 {170 @BlocksPage.RenderTemplate(item.Template)171 }172173 if (item.Component != null)174 {175 string methodName = item.Component.HelperName;176 dynamic[] methodParameters = new dynamic[1];177 methodParameters[0] = item.Component;178 Type methodType = this.GetType();179 MethodInfo generalMethod = methodType.GetMethod(methodName);180181 if (generalMethod != null) {182 @generalMethod.Invoke(this, methodParameters).ToString();183 } else {184 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked");185 }186 }187188 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList)189 {190 @RenderBlockList(item.BlocksList)191 }192 }193194 @*--- END: Base block renderers ---*@195196197 @* Include the Blocks for the page *@198 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>199 @using Dynamicweb.Core200 @using System201 @using System.Web202 @using System.Collections.Generic203 @using Dynamicweb.Rapido.Blocks204205 @{206 BlocksPage productListProductsBlocksPage = BlocksPage.GetBlockPage("ProductList");207208 Block productsBlock = new Block209 {210 Id = "Views",211 SortId = 30,212 Template = RenderProducts()213 };214215 productListProductsBlocksPage.Add("ProductList", productsBlock);216 }217218 @helper RenderProducts()219 {220 @*This is part of a script template *@221222 <div id="ProductsContainer" data-template="{{listTemplate}}" class="grid product-list grid--external-bleed-x dw-mod" data-save-cookie="true">223 {{#ProductsContainer}}224 {{> (lookup . 'template') }}225 {{/ProductsContainer}}226 </div>227 }228 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>229 @using Dynamicweb.Core230 @using System231 @using System.Web232 @using System.Collections.Generic233 @using Dynamicweb.Rapido.Blocks234235 @if (Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableListView"))236 {237 BlocksPage productList = BlocksPage.GetBlockPage("ProductList");238239 Block listViewButton = new Block240 {241 Id = "ProductItemContainer",242 Name = "th-list",243 SortId = 10244 };245 productList.Add("Views", listViewButton);246247 Block listViewScripts = new Block248 {249 Id = "ListViewScripts",250 SortId = 20,251 Template = ListView()252 };253 productList.Add("BottomSnippets", listViewScripts);254 }255256 @helper ListView()257 {258 string pageId = GetGlobalValue("Global:Page.ID");259 bool onlyPreview = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Pageview.User == null;260 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");261 bool showPrice = !Pageview.AreaSettings.GetItem("ProductList").GetBoolean("HidePrice");262 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fas fa-shopping-cart";263 bool showCartButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("ShowAddToCartButton");264 bool showViewButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("ShowViewButton");265 bool showFavoriteButton = !Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("HideFavoriteButton");266 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("ShowAddToDownloadButton");267 bool showStock = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("ShowStockAndShipping");268 bool showNumber = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("ShowProductNumber");269 bool showVariantSelector = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetList("Variants").SelectedValue == "selector" ? true : false;270 bool showStaticVariants = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetList("Variants").SelectedValue == "static" ? true : false;271 string viewMoreText = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetString("ViewMoreText")) ? Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetString("ViewMoreText") : "View";272 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));273 bool showVATPrice = Pageview.AreaSettings.GetItem("ProductList").GetBoolean("ShowBothPricesWithWithoutVAT");274 bool isPricesWithVATEnabled = Converter.ToBoolean(Pageview.Area.EcomPricesWithVat);275 string imageZoomOnHover = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("HoverImageZoom") ? "image-hover--zoom" : "";276 bool secondaryImage = Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetString("HoverAlternatineImage") != null ? Pageview.AreaSettings.GetItem("ProductList").GetItem("ListView").GetBoolean("HoverAlternatineImage") : false;277 bool preventWebSale = GetBoolean("Ecom:Product:Field.SLPreventWebSale");278279 <script id="ProductItemContainer" type="text/x-template">280 {{#.}}281 <div id="Product{{id}}" class="grid__col-12 js-product dw-mod" data-template="ProductItem" data-preloader="overlay">282 {{#Product}}283 {{>ProductItem}}284 {{/Product}}285 </div>286 {{/.}}287 </script>288289 <script id="ProductItem" type="text/x-template">290 {{#.}}291 @if (useGoogleTagManager)292 {293 <text>{{{googleEnchantImpression 'Product catalogue' currency googleImpression}}}</text>294 }295 <input type="hidden" name="ProductLoopCounter{{id}}" value="{{id}}" />296 <input type="hidden" name="ProductID{{id}}" value="{{productId}}" />297 <input type="hidden" value="{{variantid}}" name="VariantID{{id}}" id="Variant_{{id}}" />298299 <div class="grid product-list__list-item dw-mod">300 <div class="grid__col-md-4 {{noImage}} product-list__list-item__left u-no-padding u-color-light--bg dw-mod @imageZoomOnHover">301 <div class="grid__cell">302 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}" class="u-position-relative u-block image-hover__wrapper dw-mod">303 <img class="grid__cell-img grid__cell-img--centered b-lazy" src="/Files/Images/placeholder.gif"304 data-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&DoNotUpscale=true&FillCanvas=true&image={{image}}"305 @if (secondaryImage) { <text>306 {{#if secondaryImage}}307 data-secondary-image-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{secondaryImage}}"308 {{/if}}309 </text> }310 alt="{{name}}" />311 {{#StickersContainers}}312 {{>StickersContainer}}313 {{/StickersContainers}}314 </a>315 </div>316 </div>317 <div class="grid__col-md-auto product-list__list-item__right dw-mod">318 <div>319 <div class="u-pull--left">320 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}">321 <h2 class="u-no-margin">{{name}}</h2>322 </a>323324 @if (showNumber)325 {326 <div class="item-number dw-mod">{{number}}</div>327 }328329 @if (!onlyPreview && showStock)330 {331 <text>332 {{#if stockText}}333 <div>334 <span class="stock-icon {{stockState}} u-no-margin dw-mod" title="{{stockText}}"></span>335 <span class="u-margin-right--lg"> {{stockText}}</span>336 </div>337 {{/if}}338 {{#if deliveryText}}339 <div>340 <span class="u-margin-right--lg"> {{deliveryText}}</span>341 </div>342 {{/if}}343 </text>344 }345346 </div>347348 @if (showFavoriteButton)349 {350 <div class="favorites u-pull--right {{hasVariants}} dw-mod" {{hasVariants}}>351 {{#Favorite}}352 {{>FavoriteTemplate}}353 {{/Favorite}}354 </div>355 }356 </div>357358 <div class="grid__cell u-margin-top u-margin-bottom">359 {{{description}}}360 </div>361362 @if (showCartButton && showVariantSelector)363 {364 <div data-template="VariantsTemplate" class="js-variants grid__cell" data-combinations="{{combinationsStringArray}}" data-variants="{{variantsStringArray}}" data-variant-selections="{{variantSelections}}" data-total-variant-groups="{{variantGroupsCount}}" data-selection-complete="UpdateData" data-page-id="@pageId" data-product-id="{{productId}}">365 {{#Variants}}366 {{>VariantsTemplate}}367 {{/Variants}}368 </div>369 <small class="js-help-text help-text {{hideViewMore}} {{hideHelpText}}">@Translate("Please select variant!")</small>370 }371372 @if (showStaticVariants)373 {374 <text>375 {{#Variants}}376 {{>StaticVariantsTemplate}}377 {{/Variants}}378 {{#ifCond variantGroupsCount '>' 1}}379 <div class="static-variant">380 @Translate("More options available")381 </div>382 {{/ifCond}}383 </text>384 }385386 @if (!onlyPreview)387 {388 <div class="grid__cell-footer">389 <div class="grid__cell">390 <div class="product-list__list-item__price-actions dw-mod">391 @if (showPrice)392 {393 <div class="u-margin-bottom">394 @if (pointShopOnly)395 {396 <text>397 {{#if havePointPrice}}398 <div class="price price--product-list dw-mod">{{points}} @Translate("points")</div>399 {{else}}400 @Translate("Not available")401 {{/if}}402 </text>403 }404 else405 {406407 if (!onlyPreview)408 {409410 <text>411 {{#ifCond preventWebSale "===" false}}412 {{#unless HidePrice}}413 <div class="price price--product-list dw-mod">{{price}}</div>414 <div class="before-price {{onSale}} dw-mod">{{discount}}</div>415 {{/unless}}416 {{/ifCond}}417 </text>418419 }420421 if (showVATPrice)422 {423 <small class="vat-price vat-price--product-list dw-mod">424 @if (isPricesWithVATEnabled)425 {426 @Translate("excl. VAT") <text>({{priceWithoutVAT}})</text>427 }428 else429 {430 @Translate("incl. VAT") <text>({{priceWithVAT}})</text>431 }432 </small>433 }434 }435 </div>436 }437438 @if (showCartButton)439 {440 string hasVariantsClass = "";441 if (!showVariantSelector)442 {443 hasVariantsClass = "{{hasVariants}}";444 }445446 if (pointShopOnly)447 {448 <text>449 {{#unless canBePurchasedWithPoints}}450 {{#if havePointPrice}}451 <small class="help-text u-no-margin u-margin-bottom">@Translate("Not enough points to buy this")</small>452 {{/if}}453 {{/unless}}454 </text>455 }456 <text>457 {{#unless preventWebSale}}458 {{#unless HidePrice}}459 <div class="buttons-collection buttons-collection--right @hasVariantsClass">460 @if (pointShopOnly)461 {462 <button type="button" id="CartButton_{{id}}" class="btn btn--primary btn--condensed u-no-margin dw-mod u-pull--right js-cart-btn {{disabledBuyButton}} {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"463 onclick="Cart.AddToCart(event, {464 id: '{{productId}}',465 variantId: '{{variantid}}',466 unitId: '{{unitId}}',467 quantity: 1,468 buyForPoints: true,469 productInfo: {{productInfo}},470 }); {{facebookPixelAction}}" {{disabledBuyButton}}>471 <i class="@cartIcon"></i><span class="u-hidden-xs u-hidden-xxs"> @Translate("Buy with points")</span>472 </button>473 }474 else475 {476 <button type="button" id="CartButton_{{id}}" class="js-cart-btn btn btn--primary btn--condensed u-pull--right dw-mod {{disabledBuyButton}}" name="submit"477 onclick="Cart.AddToCart(event, {478 id: '{{productId}}',479 variantId: '{{variantid}}',480 unitId: '{{unitId}}',481 quantity: document.getElementById('Quantity_{{id}}').value,482 productInfo: {{productInfo}},483 }); {{facebookPixelAction}}" {{disabledBuyButton}}>484 <i class="@cartIcon"></i><span class="u-hidden-xs u-hidden-xxs"> @Translate("Add to cart")</span>485 </button>486 <input type="number" class="u-w80px u-margin-right u-pull--right use-btn-primary-height" id="Quantity_{{id}}" name="Quantity{{id}}" value="1" min="1" step="1" onkeypress="return event.charCode >= 48 && event.charCode <= 57">487 }488489 <input type="checkbox" id="UnitOptions_{{id}}" class="dropdown-trigger" />490 <div class="dropdown u-w150px u-w100px--xs use-btn-primary-height {{hasUnits}} dw-mod">491 <label class="dropdown__header dropdown__btn dw-mod" for="UnitOptions_{{id}}">{{unitName}}</label>492 <div id="unitOptions" class="dropdown__content dw-mod">493 {{#unitOptions}}494 {{>UnitOption}}495 {{/unitOptions}}496 </div>497 <label class="dropdown-trigger-off" for="UnitOptions_{{id}}"></label>498 </div>499 <input type="hidden" value="{{unitId}}" name="Unit{{id}}" id="Unit_{{id}}" />500 </div>501 {{/unless }}502 {{/unless }}503 @if (Pageview.AreaID == 1 && Pageview.User == null)504 {505506 }507 else508 {509 <text>510 {{#if preventWebSale}}511 {{#unless Discontinued}}512 <p>@Translate("Please call", "Please call")</p>513 {{/unless}}514 {{/if}}515 </text>516 }517 </text>518 if (showViewButton)519 {520 if (Pageview.User == null)521 {522 <text>523 {{#if HidePrice}}524 <div class="buttons-collection buttons-collection--right">525 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>526 </div>527 {{/if}}528 </text>529 }530 }531 }532 else if (showViewButton)533 {534 <div class="buttons-collection buttons-collection--right">535 <a href="{{link}}" id="CartButton_{{id}}" title="@Translate(viewMoreText)" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" class="btn btn--secondary btn--full u-no-margin dw-mod">536 @Translate(viewMoreText)537 </a>538 </div>539 }540541 </div>542 </div>543 </div>544 }545 else546 {547 <text>548 {{#if Discontinued}}549 <p>@Translate("DISCONTINUED_A", "DISCONTINUED_A")</p>550 {{/if}}551 </text>552 {553 <div class="grid__cell-footer">554 <div class="grid__cell">555 <div class="product-list__list-item__price-actions dw-mod">556 @if (Pageview.User == null)557 {558 <text>559 {{#if SLGuestPricing}}560 <div class="price price--product-list dw-mod">{{price}}</div>561 <div class="before-price {{onSale}} dw-mod">{{discount}}</div>562 {{/if}}563 </text>564 }565 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>566567 </div>568 </div>569 </div>570 @*<button type="button" id="CartButton_{{id}}" class="u-hidden"></button>*@571 }572 }573574 @if (showAddToDownloadButton && Pageview.User != null)575 {576 <div class="grid__cell-footer @((showCartButton || showViewButton) ? "u-margin-top" : "" )">577 <div class="grid__cell">578 <button type="button" class="btn btn--primary btn--condensed u-no-margin u-pull--right dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}">579 <i class="fas fa-plus js-button-icon"></i>580 <span class="js-button-text">@Translate("Add")</span>581 </button>582 </div>583 </div>584 }585 </div>586 </div>587 {{/.}}588 </script>589 }590 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>591 @using Dynamicweb.Core592 @using System593 @using System.Web594 @using System.Collections.Generic595 @using Dynamicweb.Rapido.Blocks596597 @if (Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableGridView"))598 {599 BlocksPage productList = BlocksPage.GetBlockPage("ProductList");600601 Block gridViewButton = new Block602 {603 Id = "ProductGridItemContainer",604 Name = "th",605 SortId = 20606 };607 productList.Add("Views", gridViewButton);608609 Block gridViewScripts = new Block610 {611 Id = "GridViewScripts",612 SortId = 20,613 Template = GridView()614 };615 productList.Add("BottomSnippets", gridViewScripts);616 }617618 @helper GridView()619 {620 bool onlyPreview = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Pageview.User == null;621 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");622 bool showPrice = !Pageview.AreaSettings.GetItem("ProductList").GetBoolean("HidePrice");623 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fas fa-shopping-cart";624 string columnsCount = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetList("Columns") != null ? Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetList("Columns").SelectedValue : "4";625 bool showCartButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowAddToCartButton");626 bool showViewButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowViewButton");627 bool showFavoriteButton = !Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("HideFavoriteButton");628 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowAddToDownloadButton");629 bool showStock = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowStockAndShipping");630 bool showNumber = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowProductNumber");631 bool showStaticVariants = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("ShowStaticVariants");632 string cartButtonText = Converter.ToInt32(columnsCount) >= 4 && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" ? Translate("Add to cart") : "";633 string viewMoreText = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetString("ViewMoreText")) ? Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetString("ViewMoreText") : "View";634 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));635 bool showVATPrice = Pageview.AreaSettings.GetItem("ProductList").GetBoolean("ShowBothPricesWithWithoutVAT");636 bool isPricesWithVATEnabled = Converter.ToBoolean(Pageview.Area.EcomPricesWithVat);637 string imageZoomOnHover = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("HoverImageZoom") ? "image-hover--zoom" : "";638 bool secondaryImage = Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetString("HoverAlternatineImage") != null ? Pageview.AreaSettings.GetItem("ProductList").GetItem("GridView").GetBoolean("HoverAlternatineImage") : false;639 string footerClasses = showStaticVariants ? "u-min-h120px" : "";640641642 <script id="ProductGridItemContainer" type="text/x-template">643 {{#.}}644 <div id="Product{{id}}" data-template="ProductGridItem" data-preloader="overlay" class="grid__col-lg-@columnsCount grid__col-md-@columnsCount grid__col-sm-@columnsCount grid__col-xs-6 product-list__grid-item @imageZoomOnHover dw-mod">645 {{#Product}}646 {{>ProductGridItem}}647 {{/Product}}648649 </div>650 {{/.}}651 </script>652653 <script id="ProductGridItem" type="text/x-template">654 {{#.}}655 @if (useGoogleTagManager)656 {657 <text>{{{googleEnchantImpression 'Product catalogue' currency googleImpression}}}</text>658 }659 <input type="hidden" name="ProductLoopCounter{{id}}" value="{{id}}" />660 <input type="hidden" name="ProductID{{id}}" value="{{productId}}" />661 <input type="hidden" name="wishListID{{id}}" id="wishListID{{id}}" value="0" />662663 <div class="grid__cell product-list__grid-item__image dw-mod {{noImage}}">664 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}" class="u-block u-position-relative image-hover__wrapper dw-mod">665 <img class="grid__cell-img grid__cell-img--centered u-padding b-lazy" src="/Files/Images/placeholder.gif"666 data-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{image}}"667 @if (secondaryImage) { <text>668 {{#if secondaryImage}}669 data-secondary-image-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{secondaryImage}}"670 {{/if}}671 </text> }672 alt="{{name}}" />673 {{#StickersContainers}}674 {{>StickersContainer}}675 {{/StickersContainers}}676 </a>677 @if (showFavoriteButton)678 {679 <div class="favorites favorites--for-grid-view u-pull--right {{hasVariants}} dw-mod" {{hasVariants}}>680 {{#Favorite}}681 {{>FavoriteTemplate}}682 {{/Favorite}}683 </div>684 }685 </div>686687 <div class="grid__cell product-list__grid-item__price-info dw-mod">688 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}">689 <h6 class="u-condensed-text">{{name}}</h6>690 </a>691 @if (showNumber)692 {693 <div class="item-number dw-mod">{{number}}</div>694 }695696 @if (showPrice && !onlyPreview)697 {698 if (pointShopOnly)699 {700 <text>701 {{#if havePointPrice}}702 <div class="price price--product-list dw-mod">{{points}} @Translate("points")</div>703 {{else}}704 @Translate("Not available")705 {{/if}}706 </text>707 }708 else709 {710 if (!onlyPreview && showPrice)711 {712713 if (!onlyPreview)714 {715716 <text>717 {{#ifCond preventWebSale "===" false}}718 {{#unless HidePrice}}719 <div class="price price--product-list dw-mod">{{price}}</div>720 <div class="before-price {{onSale}} dw-mod">{{discount}}</div>721 {{/unless}}722 {{/ifCond}}723 </text>724725 }726727 if (showVATPrice)728 {729 <div class="vat-price vat-price--product-list u-margin-top dw-mod">730 @if (isPricesWithVATEnabled)731 {732 <span>@Translate("excl. VAT")</span><span> ({{priceWithoutVAT}})</span>733 }734 else735 {736 <span>@Translate("incl. VAT")</span><span> ({{priceWithVAT}})</span>737 }738 </div>739 }740 }741742743744 }745746 }747 <input type="hidden" value="{{unitId}}" name="Unit{{id}}" id="Unit_{{id}}" />748 <input type="hidden" value="{{variantid}}" name="VariantID{{id}}" id="Variant_{{id}}" />749 @*<input type="hidden" id="Quantity_{{id}}" name="Quantity{{id}}" value="1" min="1">*@750 </div>751752 <div class="product-list__grid-item__footer @footerClasses dw-mod">753 @if (!onlyPreview)754 {755 <text>756 {{#unless preventWebSale}}757 {{#unless HidePrice}}758 <div class="u-ta-center u-inline-block">759 <div class="buttons-collection {{hideBuyOptions}}">760 @if (pointShopOnly)761 {762 <button type="button" id="CartButton_{{id}}" class="btn btn--primary btn--condensed u-no-margin dw-mod js-cart-btn {{disabledBuyButton}} {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"763 onclick="Cart.AddToCart(event, {764 id: {{productId}}',765 variantId: '{{variantid}}',766 unitId: '{{unitId}}',767 quantity: 1,768 buyForPoints: true,769 productInfo: {{productInfo}},770 }); {{facebookPixelAction}}" {{disabledBuyButton}}>771 <i class="@cartIcon"></i><span class="u-hidden-xs u-hidden-xxs"> @Translate("Buy with points")</span>772 </button>773 }774 else775 {776 <button type="button" id="CartButton_{{id}}" class="js-cart-btn btn btn--primary btn--condensed u-no-margin u-pull--right dw-mod {{disabledBuyButton}}" name="submit"777 onclick="Cart.AddToCart(event, {778 id: '{{productId}}',779 variantId: '{{variantid}}',780 unitId: '{{unitId}}',781 quantity: document.getElementById('Quantity_{{id}}').value,782 productInfo: {{productInfo}},783 }); {{facebookPixelAction}}" {{disabledBuyButton}}>784 <i class="@cartIcon"></i><span class="u-hidden-xs u-hidden-xxs"> @cartButtonText</span>785 </button>786 <input type="number" class="u-w80px u-pull--right use-btn-primary-height" id="Quantity_{{id}}" name="Quantity{{id}}" value="1" min="1" step="1" onkeypress="return event.charCode >= 48 && event.charCode <= 57">787 }788 </div>789 </div>790 {{/unless }}791 {{/unless }}792 @if (Pageview.AreaID == 1 && Pageview.User == null)793 {794795 }796 else797 {798 <text>799 {{#if preventWebSale}}800 {{#unless Discontinued}}801 <p>@Translate("Please call", "Please call")</p>802 {{/unless}}803 {{/if}}804 </text>805 }806807 </text>808 if (showViewButton)809 {810 //hideViewMore handlebar value in class attribute811 if (Pageview.User == null)812 {813 <text>814 {{#if HidePrice}}815 <div class="u-ta-center">816 <label for="SignInModalTrigger" class="button--productdetail" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>817 <label for="SignupModalTrigger" class="button--productdetail" onclick="setTimeout(function () { document.getElementById('SignUpModal').focus() }, 10)">@Translate("Sign up")</label>818819 </div>820 {{/if }}821 </text>822 }823 }824825 }826 else if (showViewButton)827 {828 <div class="u-ta-center">829 @if (onlyPreview)830 {831 <label for="SignInModalTrigger" class="button--productdetail" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>832 <label for="SignupModalTrigger" class="button--productdetail" onclick="setTimeout(function () { document.getElementById('SignUpModal').focus() }, 10)">@Translate("Sign up")</label>833 }834835 @*<a href="{{link}}" id="CartButton_{{id}}" class="btn btn--secondary btn--full u-no-margin dw-mod" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="@Translate(viewMoreText)">@Translate(viewMoreText)</a>*@836 </div>837 }838839 @if (!onlyPreview && showStock)840 {841 <div class="u-margin-top">842 {{#if stockText}}843 <div><span class="stock-icon {{stockState}} u-no-margin dw-mod" title="{{stockText}}"></span> {{stockText}}</div>844 <div>845 {{#if deliveryText}}846 {{deliveryText}}847 {{else}}848 {{/if}}849 </div>850 {{/if}}851 </div>852 }853854 @if (showStaticVariants)855 {856 <text>857 {{#Variants}}858 {{>StaticVariantsTemplate}}859 {{/Variants}}860861 {{#ifCond variantGroupsCount '>' 1}}862 <div class="static-variant">863 @Translate("More options available")864 </div>865 {{/ifCond}}866867 {{#ifCond variantGroupsCount '==' 0}}868 <div class="static-variant"></div>869 {{/ifCond}}870 </text>871 }872873 @if (showAddToDownloadButton && Pageview.User != null)874 {875 <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}}">876 <i class="fas fa-plus js-button-icon"></i>877 <span class="js-button-text">@Translate("Add")</span>878 </button>879 }880 </div>881 {{/.}}882 </script>883 }884 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>885 @using Dynamicweb.Core886 @using System887 @using System.Web888 @using System.Collections.Generic889 @using Dynamicweb.Rapido.Blocks890891 @if (Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableDetailsView"))892 {893 BlocksPage productList = BlocksPage.GetBlockPage("ProductList");894895 Block detailsViewButton = new Block896 {897 Id = "ProductDetailsItemContainer",898 Name = "list",899 SortId = 30900 };901 productList.Add("Views", detailsViewButton);902903 Block detailsViewScripts = new Block904 {905 Id = "DetailsViewScripts",906 SortId = 30,907 Template = DetailsView()908 };909 productList.Add("BottomSnippets", detailsViewScripts);910 }911912 @helper DetailsView()913 {914 bool onlyPreview = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Pageview.User == null;915 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");916 bool showPrice = !Pageview.AreaSettings.GetItem("ProductList").GetBoolean("HidePrice");917 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fas fa-shopping-cart";918 bool showCartButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowAddToCartButton");919 bool showViewButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowViewButton");920 bool showFavoriteButton = !Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("HideFavoriteButton");921 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowAddToDownloadButton");922 bool showStock = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowStockAndShipping");923 bool showImage = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowImage");924 bool showNumber = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowProductNumber");925 bool showStaticVariants = Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetBoolean("ShowStaticVariants");926 string viewMoreText = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetString("ViewMoreText")) ? Pageview.AreaSettings.GetItem("ProductList").GetItem("DetailsView").GetString("ViewMoreText") : "View";927 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));928 bool showVATPrice = Pageview.AreaSettings.GetItem("ProductList").GetBoolean("ShowBothPricesWithWithoutVAT");929 bool isPricesWithVATEnabled = Converter.ToBoolean(Pageview.Area.EcomPricesWithVat);930931 <script id="ProductDetailsItemContainer" type="text/x-template">932 {{#.}}933 <div id="Product{{id}}" data-template="ProductDetailsItem" data-preloader="overlay" class="grid__col-12 u-no-padding-y" style="z-index: {{zIndex}}">934 {{#Product}}935 {{>ProductDetailsItem}}936 {{/Product}}937 </div>938 {{/.}}939 </script>940941 if (Pageview.Device.ToString() != "Mobile")942 {943 <script id="ProductDetailsItem" type="text/x-template">944 {{#.}}945 @if (useGoogleTagManager)946 {947 <text>{{{googleEnchantImpression 'Product catalogue' currency googleImpression}}}</text>948 }949 <input type="hidden" name="ProductLoopCounter{{id}}" value="{{id}}" />950 <input type="hidden" name="ProductID{{id}}" value="{{productId}}" />951 <div class="product-list__details-item grid__col-12 dw-mod">952 <div class="product-list__details-item__left grid__cell dw-mod">953 @if (showImage)954 {955 <div class="lightbox u-hidden-xxs">956 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}">957 <img class="lightbox__image {{noImage}}" src="/Admin/Public/GetImage.ashx?width=220&height=220&crop=5&Compression=75&image={{image}}" alt="{{name}}" />958 <div class="u-margin-right {{noImage}}">959 <img class="b-lazy" src="/Files/Images/placeholder.gif"960 data-src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{image}}"961 alt="{{name}}" />962 </div>963 </a>964 </div>965 }966 <div class="u-margin-left u-margin-right">967 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}">968 <h6 class="u-no-margin">{{name}}</h6>969 </a>970 <div class="item-number item-number--compressed dw-mod">971 @if (showNumber)972 {973 <div class="item-number dw-mod">{{number}}</div>974 }975976 @if (!onlyPreview && showStock)977 {978 <text>979 {{#if stockText}}980 <div>981 <span class="stock-icon {{stockState}} u-no-margin dw-mod" title="{{stockText}}"></span>982 <span class="u-margin-right--lg"> {{stockText}}</span>983 </div>984 {{/if}}985 {{#if deliveryText}}986 <div>987 <span class="u-margin-right--lg"> {{deliveryText}}</span>988 </div>989 {{/if}}990 </text>991 }992 </div>993 @if (showStaticVariants)994 {995 <span>996 {{#Variants}}997 {{>StaticVariantsTemplate}}998 {{/Variants}}999 </span>1000 <text>1001 {{#ifCond variantGroupsCount '>' 1}}1002 <div class="static-variant">1003 @Translate("More options available")1004 </div>1005 {{/ifCond}}1006 </text>1007 }1008 <div class="grid__cell-footer stickers-container stickers-container--row u-margin-top dw-mod">1009 {{#StickersContainers}}1010 {{#Stickers}}1011 {{>MiniSticker}}1012 {{/Stickers}}1013 {{/StickersContainers}}1014 </div>1015 </div>1016 </div>1017 <div class="product-list__details-item__right grid__cell dw-mod">1018 @if (!onlyPreview && showCartButton)1019 {1020 <div class="u-margin-right">1021 <input type="checkbox" id="UnitOptions_{{id}}" class="dropdown-trigger" />1022 <div class="dropdown u-w120px use-btn-primary-height {{hasUnits}} dw-mod">1023 <label class="dropdown__header dropdown__btn dw-mod" for="UnitOptions_{{id}}">{{unitName}}</label>1024 <div id="unitOptions" class="dropdown__content dw-mod">1025 {{#unitOptions}}1026 {{>UnitOption}}1027 {{/unitOptions}}1028 </div>1029 <label class="dropdown-trigger-off" for="UnitOptions_{{id}}"></label>1030 </div>1031 <input type="hidden" value="{{unitId}}" name="Unit{{id}}" id="Unit_{{id}}" />1032 <input type="hidden" value="{{variantid}}" name="VariantID{{id}}" id="Variant_{{id}}" />1033 </div>1034 }10351036 <div class="u-min-w140px product-list__details-item-price-block">1037 <div class="u-ta-right u-padding-right">1038 @if (pointShopOnly)1039 {1040 <text>1041 {{#if havePointPrice}}1042 <div class="price price--product-list price--micro dw-mod">{{points}} @Translate("points")</div>1043 {{else}}1044 @Translate("Not available")1045 {{/if}}1046 </text>1047 }1048 else1049 {10501051 if (!onlyPreview)1052 {1053 <text>1054 {{#ifCond preventWebSale "===" false}}1055 {{#unless HidePrice}}1056 <div class="price price--product-list dw-mod">{{price}}</div>1057 <div class="before-price {{onSale}} dw-mod">{{discount}}</div>1058 {{/unless}}1059 {{/ifCond}}1060 </text>1061 }106210631064 if (showVATPrice)1065 {1066 <small class="vat-price vat-price--micro dw-mod">1067 @if (isPricesWithVATEnabled)1068 {1069 @Translate("excl. VAT") <text>({{priceWithoutVAT}})</text>1070 }1071 else1072 {1073 @Translate("incl. VAT") <text>({{priceWithVAT}})</text>1074 }1075 </small>1076 }1077 }1078 </div>1079 </div>10801081 @if (!onlyPreview && showCartButton)1082 {1083 if (!pointShopOnly)1084 {1085 <text>1086 {{#unless preventWebSale}}1087 {{#unless HidePrice}}1088 <div class="{{hideBuyOptions}}">1089 <input type="number" class="u-w100px u-no-margin u-margin-right use-btn-primary-height" id="Quantity_{{id}}" name="Quantity{{id}}" value="1" min="1" step="1" onkeypress="return event.charCode >= 48 && event.charCode <= 57">1090 </div>1091 {{/unless }}1092 {{/unless }}1093 </text>1094 }1095 <text>1096 {{#unless preventWebSale}}1097 {{#unless HidePrice}}1098 <div class="{{hideBuyOptions}}">1099 @if (pointShopOnly)1100 {1101 <button type="button" id="CartButton_{{id}}" class="btn btn--primary btn--condensed u-no-margin dw-mod js-cart-btn {{disabledBuyButton}} {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"1102 onclick="Cart.AddToCart(event, {1103 id: '{{productId}}',1104 variantId: '{{variantId}}',1105 unitId: '{{UnitId}}',1106 quantity: 1,1107 buyForPoints: true,1108 productInfo: {{productInfo}},1109 }); {{facebookPixelAction}}" {{disabledBuyButton}}>1110 <i class="@cartIcon"></i><span> @Translate("Buy with points")</span>1111 </button>1112 }1113 else1114 {1115 <button type="button" id="CartButton_{{id}}" class="js-cart-btn btn btn--primary btn--condensed u-pull--right u-no-margin dw-mod {{disabledBuyButton}}" name="submit"1116 onclick="Cart.AddToCart(event, {1117 id: '{{productId}}',1118 variantId: '{{variantid}}',1119 unitId: '{{unitId}}',1120 quantity: document.getElementById('Quantity_{{id}}').value,1121 productInfo: {{productInfo}},1122 }); {{facebookPixelAction}}" {{disabledBuyButton}}>1123 <i class="@cartIcon"></i>1124 </button>1125 }1126 </div>1127 {{/unless }}1128 {{/unless }}1129 @if (Pageview.AreaID == 1 && Pageview.User == null)1130 {11311132 }1133 else1134 {1135 <text>1136 {{#if preventWebSale}}1137 {{#unless Discontinued}}1138 <p>@Translate("Please call", "Please call")</p>1139 {{/unless}}1140 {{/if}}1141 </text>1142 }1143 </text>11441145 if (showViewButton)1146 {1147 //#unless hideViewMore1148 if (Pageview.User == null)1149 {1150 <text>1151 {{#if HidePrice}}1152 <div>1153 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>1154 </div>1155 {{/if }}1156 </text>1157 }1158 }1159 }1160 else if (showViewButton)1161 {1162 <div>1163 @*<a href="{{link}}" class="btn btn--secondary u-no-margin dw-mod" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="@Translate(viewMoreText)">@Translate(viewMoreText)</a>*@1164 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>11651166 </div>1167 }1168 @if (showFavoriteButton && Pageview.User != null)1169 {1170 <div class="favorites u-margin {{hasVariants}} dw-mod" {{hasVariants}}>1171 {{#Favorite}}1172 {{>FavoriteTemplate}}1173 {{/Favorite}}1174 </div>1175 <div class="favorites favorites--lg u-hidden {{hasVariants}} dw-mod" {{hasVariants}}>1176 {{#Favorite}}1177 {{>FavoriteListItem}}1178 {{/Favorite}}1179 </div>1180 }1181 @if (showAddToDownloadButton && Pageview.User != null)1182 {1183 <button type="button" class="btn btn--primary u-no-margin btn--condensed u-margin-left u-margin-right dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}">1184 <i class="fas fa-plus js-button-icon"></i>1185 </button>1186 }1187 </div>1188 </div>1189 {{/.}}1190 </script>1191 }1192 else1193 {1194 <script id="ProductDetailsItem" type="text/x-template">1195 {{#.}}1196 @if (useGoogleTagManager)1197 {1198 <text>{{{googleEnchantImpression 'Product catalogue' currency googleImpression}}}</text>1199 }1200 <input type="hidden" name="ProductLoopCounter{{id}}" value="{{id}}" />1201 <input type="hidden" name="ProductID{{id}}" value="{{productId}}" />1202 <div class="grid__col-12 dw-mod">1203 <div class="grid__cell u-color-light--bg dw-mod">1204 <div class="u-margin">1205 <a href="{{link}}" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}">1206 <h6 class="u-no-margin">{{name}}</h6>1207 </a>1208 <div class="item-number item-number--compressed dw-mod">1209 @if (showNumber)1210 {1211 <div class="item-number dw-mod">{{number}}</div>1212 }12131214 @if (!onlyPreview && showStock)1215 {1216 <span>1217 <span class="stock-icon {{stockState}} u-no-margin dw-mod" title="{{stockText}}"></span>1218 <span> {{stockText}}</span>1219 {{deliveryText}}1220 </span>1221 }1222 </div>1223 @if (showStaticVariants)1224 {1225 <span>1226 {{#Variants}}1227 {{>StaticVariantsTemplate}}1228 {{/Variants}}1229 </span>1230 <text>1231 {{#ifCond variantGroupsCount '>' 1}}1232 <div class="static-variant">1233 @Translate("More options available")1234 </div>1235 {{/ifCond}}1236 </text>1237 }1238 <div class="grid__cell-footer stickers-container stickers-container--row u-margin-top dw-mod">1239 {{#StickersContainers}}1240 {{#Stickers}}1241 {{>MiniSticker}}1242 {{/Stickers}}1243 {{/StickersContainers}}1244 </div>1245 </div>1246 <div class="u-ta-right u-margin-bottom product-list__details-item-price-block dw-mod">1247 @if (pointShopOnly)1248 {1249 <text>1250 {{#if havePointPrice}}1251 <div class="price price--product-list price--micro dw-mod">{{points}} @Translate("points")</div>1252 {{else}}1253 @Translate("Not available")1254 {{/if}}1255 </text>1256 }1257 else1258 {1259 <div class="before-price {{onSale}} before-price--micro dw-mod">{{discount}}</div>1260 <div class="price price--product-list price--micro dw-mod">{{price}}</div>126112621263 }1264 </div>1265 </div>1266 <div class="grid__cell u-color-light--bg dw-mod">1267 <div class="collection u-pull--right u-no-margin u-margin dw-mod">1268 @if (!onlyPreview && showCartButton)1269 {1270 <div>1271 <input type="checkbox" id="UnitOptions_{{id}}" class="dropdown-trigger" />1272 <div class="dropdown u-w120px use-btn-primary-height {{hasUnits}} dw-mod">1273 <label class="dropdown__header dropdown__btn dw-mod" for="UnitOptions_{{id}}">{{unitName}}</label>1274 <div id="unitOptions" class="dropdown__content dw-mod">1275 {{#unitOptions}}1276 {{>UnitOption}}1277 {{/unitOptions}}1278 </div>1279 <label class="dropdown-trigger-off" for="UnitOptions_{{id}}"></label>1280 </div>1281 <input type="hidden" value="{{unitId}}" name="Unit{{id}}" id="Unit_{{id}}" />1282 <input type="hidden" value="{{variantid}}" name="VariantID{{id}}" id="Variant_{{id}}" />1283 </div>1284 }12851286 @if (!onlyPreview && showCartButton)1287 {1288 if (!pointShopOnly)1289 {1290 <div class="{{hideBuyOptions}}">1291 <input type="number" class="u-w50px u-no-margin use-btn-primary-height" id="Quantity_{{id}}" name="Quantity{{id}}" value="1" min="1" step="1" onkeypress="return event.charCode >= 48 && event.charCode <= 57">1292 </div>1293 }1294 <div class="{{hideBuyOptions}}">1295 @if (pointShopOnly)1296 {1297 <button type="button" id="CartButton_{{id}}" class="btn btn--primary btn--condensed u-no-margin dw-mod js-cart-btn {{disabledBuyButton}} {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"1298 onclick="Cart.AddToCart(event, {1299 id: '{{productId}}',1300 variantId: '{{variantId}}',1301 unitId: '{{UnitId}}',1302 quantity: 1,1303 buyForPoints: true,1304 productInfo: {{productInfo}},1305 }); {{facebookPixelAction}}" {{disabledBuyButton}}>1306 <i class="@cartIcon"></i><span> @Translate("Buy with points")</span>1307 </button>1308 }1309 else1310 {1311 <button type="button" id="CartButton_{{id}}" class="js-cart-btn btn btn--primary btn--condensed u-pull--right u-no-margin dw-mod {{disabledBuyButton}}" name="submit"1312 onclick="Cart.AddToCart(event, {1313 id: '{{productId}}',1314 variantId: '{{variantid}}',1315 unitId: '{{unitId}}',1316 quantity: document.getElementById('Quantity_{{id}}').value,1317 productInfo: {{productInfo}},1318 }); {{facebookPixelAction}}" {{disabledBuyButton}}>1319 <i class="@cartIcon"></i>1320 </button>1321 }1322 </div>1323 if (showViewButton)1324 {1325 <text>1326 {{#unless hideViewMore}}1327 <div>1328 <a href="{{link}}" class="btn btn--secondary u-no-margin dw-mod" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="@Translate("View")">@Translate("View")</a>1329 </div>1330 {{/unless}}1331 </text>1332 }1333 }1334 else if (showViewButton)1335 {1336 <div>1337 <a href="{{link}}" class="btn btn--secondary u-no-margin dw-mod" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="@Translate("View")">@Translate("View")</a>1338 </div>1339 }1340 @if (showFavoriteButton && Pageview.User != null)1341 {1342 <div class="favorites u-margin {{hasVariants}} dw-mod" {{hasVariants}}>1343 {{#Favorite}}1344 {{>FavoriteTemplate}}1345 {{/Favorite}}1346 </div>1347 <div class="favorites favorites--lg u-hidden {{hasVariants}} dw-mod" {{hasVariants}}>1348 {{#Favorite}}1349 {{>FavoriteListItem}}1350 {{/Favorite}}1351 </div>1352 }1353 </div>1354 </div>1355 </div>1356 {{/.}}1357 </script>1358 }1359 }1360 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1361 @using Dynamicweb.Core1362 @using System1363 @using System.Web1364 @using System.Collections.Generic1365 @using Dynamicweb.Rapido.Blocks13661367 @{1368 BlocksPage productListMenuBlocksPage = BlocksPage.GetBlockPage("ProductList");13691370 if (Pageview.Page.PropertyItem["LeftMenu"] != null && Converter.ToString(Pageview.Page.PropertyItem["LeftMenu"]) == "True" && Pageview.Page.NavigationSettings != null && Pageview.Page.NavigationSettings.UseEcomGroups) {1371 Block productListMenuBlock = new Block1372 {1373 Id = "Menu",1374 SortId = 20,1375 Template = RenderProductListMenu()1376 };13771378 productListMenuBlocksPage.Add("Navigation", productListMenuBlock);1379 }1380 }13811382 @helper RenderProductListMenu()1383 {1384 var navigationMarkup = RenderNavigation(new1385 {1386 id = "leftnav",1387 cssclass = "dwnavigation",1388 startLevel = 1,1389 endlevel = 5,1390 template = "LeftNavigation.xslt",1391 mode = "ecom"1392 });13931394 <h2 class="u-margin-bottom">@Translate("Product categories")</h2>13951396 <div class="u-padding-bottom--lg">1397 @navigationMarkup1398 </div>1399 }1400 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1401 @using Dynamicweb.Core1402 @using System1403 @using System.Web1404 @using System.Collections.Generic1405 @using Dynamicweb.Rapido.Blocks14061407 @{1408 BlocksPage productListFacetsBlocksPage = BlocksPage.GetBlockPage("ProductList");14091410 string facetsBlockViewMode = !String.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode")) ? Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode").ToLower() : "left";14111412 if (facetsBlockViewMode == "left" && Pageview.Device.ToString() != "Mobile")1413 {1414 Block facetsBlock = new Block1415 {1416 Id = "Facets",1417 SortId = 30,1418 Template = RenderProductListFacets()1419 };1420 productListFacetsBlocksPage.Add("Navigation", facetsBlock);1421 }14221423 if (facetsBlockViewMode == "top" || Pageview.Device.ToString() == "Mobile")1424 {1425 Block facetsBlock = new Block1426 {1427 Id = "Facets",1428 SortId = 10,1429 Template = RenderProductListTopFacets()1430 };1431 productListFacetsBlocksPage.Add("ProductList", facetsBlock);1432 }143314341435 Block facetSelections = new Block1436 {1437 Id = "FacetSelections",1438 SortId = 20,1439 Template = RenderFacetSelections()1440 };1441 productListFacetsBlocksPage.Add("ProductList", facetSelections);1442 }14431444 @helper RenderFacetSelections()1445 {1446 @*This is part of a script template *@1447 <div class="grid">1448 <div class="grid__col-12 grid__col--bleed">1449 <div class="collection u-no-margin" id="selectedFacets">1450 {{#FacetSelections}}1451 {{> (lookup . 'template') }}1452 {{/FacetSelections}}1453 </div>1454 </div>1455 </div>1456 }14571458 @helper RenderProductListFacets()1459 {1460 @*This is part of a script template *@1461 <div class="u-margin-bottom--lg">1462 <h2 class="u-no-margin">@Translate("Filters")</h2>1463 </div>14641465 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" />1466 <div class="facets-container facets-container--left expandable--collapsed dw-mod" data-trigger="CheckFacetGroups">1467 {{#FacetGroups}}1468 <input type="checkbox" id="OptionsGroup_{{name}}" class="expand-trigger js-remember-state" {{defaultState}} />14691470 <div class="expand-container facets-container__box dw-mod js-filter">1471 <label class="expand-container__btn facets-container__header dw-mod" for="OptionsGroup_{{name}}">{{name}}</label>1472 <div class="expand-container__content dw-mod">1473 <div class="u-margin {{showFilter}}">1474 <input type="text" class="u-full-width u-no-margin" onkeyup="Filter.FilterItems(event)" placeholder="@Translate("Search")" />1475 </div>1476 <div class="facets-container__list dw-mod">1477 {{#FacetOptions}}1478 {{#ifCond template "===" "Checkboxes"}}1479 {{>Checkboxes}}1480 {{/ifCond}}1481 {{#ifCond template "===" "Range"}}1482 {{>Checkboxes}}1483 {{/ifCond}}1484 {{#ifCond template "===" "Weight"}}1485 {{>Checkboxes}}1486 {{/ifCond}}1487 {{#ifCond template "===" "Tags"}}1488 {{>Tags}}1489 {{/ifCond}}1490 {{#ifCond template "===" "Colors"}}1491 {{>Colors}}1492 {{/ifCond}}1493 {{/FacetOptions}}1494 </div>1495 </div>1496 </div>1497 {{/FacetGroups}}1498 </div>1499 <label for="CheckFacetGroups" class="btn btn--primary btn--full dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Select filters")</label>1500 <label for="CheckFacetGroups" class="btn btn--primary btn--full dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Close filters")</label>1501 }15021503 @helper RenderProductListTopFacets()1504 {1505 @*This is part of a script template *@1506 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" />1507 <div class="grid grid--external-bleed-x dw-mod expandable--collapsed facets-container facets-container--top" data-trigger="CheckFacetGroups">1508 {{#FacetGroups}}1509 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-4 grid__col-xs-12">1510 <input type="checkbox" id="OptionsGroup_{{counter}}" class="dropdown-trigger" />1511 <div class="dropdown dw-mod js-filter">1512 <label class="dropdown__header dropdown__btn dw-mod" for="OptionsGroup_{{counter}}">{{name}}</label>1513 <div class="dropdown__content dropdown__content--padding dw-mod">1514 <div class="u-margin-bottom {{showFilter}}">1515 <input type="text" class="u-full-width u-no-margin" onkeyup="Filter.FilterItems(event)" placeholder="@Translate("Search")" />1516 </div>1517 {{#FacetOptions}}1518 {{#ifCond template "===" "Checkboxes"}}1519 {{>Checkboxes}}1520 {{/ifCond}}1521 {{#ifCond template "===" "Range"}}1522 {{>Checkboxes}}1523 {{/ifCond}}1524 {{#ifCond template "===" "Weight"}}1525 {{>Checkboxes}}1526 {{/ifCond}}1527 {{#ifCond template "===" "Tags"}}1528 {{>Tags}}1529 {{/ifCond}}1530 {{#ifCond template "===" "Colors"}}1531 {{>Colors}}1532 {{/ifCond}}1533 {{/FacetOptions}}1534 </div>1535 <label class="dropdown-trigger-off" for="OptionsGroup_{{counter}}"></label>1536 </div>1537 </div>1538 {{/FacetGroups}}1539 </div>1540 <label for="CheckFacetGroups" class="btn btn--primary btn--full dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Select filters")</label>1541 <label for="CheckFacetGroups" class="btn btn--primary btn--full dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Close filters")</label>1542 }15431544 @*Facets*@1545 <script id="Checkboxes" type="text/x-template">1546 <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}}>1547 <label class="{{disabled}} checkbox-facet dw-mod" data-filter-value="{{label}}" for="{{queryParameter}}{{value}}">1548 <span class="checkbox-facet__label dw-mod">{{label}}</span>1549 <span class="checkbox-facet__count dw-mod">({{count}})</span>1550 </label>1551 </script>15521553 <script id="Tags" type="text/x-template">1554 <button type="button" class="btn btn--tag {{selected}} {{disabled}}" data-filter-value="{{label}}" data-check="{{selected}}" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" {{disabled}}>1555 {{label}} <span class="facets-group__counter">({{count}})</span>1556 </button>1557 </script>15581559 <script id="Colors" type="text/x-template">1560 <button type="button" class="btn btn--colorbox u-margin-right {{selected}} {{disabled}}" data-filter-value="{{label}}" style="background-color: {{value}}" title="{{label}}" data-check="{{selected}}" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" {{disabled}}></button>1561 </script>15621563 @*Facet selections*@1564 <script id="SelectedFilter" type="text/x-template">1565 <button type="button" class="btn btn--tag" data-check="checked" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" title="@Translate("Remove filter")">1566 {{group}}: {{label}} <i class="fas fa-times"></i>1567 </button>1568 </script>15691570 <script id="SelectedColorFilter" type="text/x-template">1571 <button type="button" class="btn btn--tag" data-check="checked" onclick="Facets.UpdateFacets(this);" name="{{queryParameter}}" value="[{{value}}]" title="@Translate("Remove filter")">1572 {{group}}: <div class="btn__colorbox" style="background-color: {{label}}"></div> <i class="fas fa-times"></i>1573 </button>1574 </script>15751576 <script id="ResetFilters" type="text/x-template">1577 <button type="button" class="btn btn--tag" onclick="Facets.ResetFacets();">1578 @Translate("Reset all filters") <i class="fas fa-redo"></i>1579 </button>1580 </script>1581 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1582 @using Dynamicweb.Core1583 @using System1584 @using System.Web1585 @using System.Collections.Generic1586 @using Dynamicweb.Rapido.Blocks15871588 @{1589 BlocksPage productListMoreBlocksPage = BlocksPage.GetBlockPage("ProductList");15901591 Block moreBlock = new Block1592 {1593 Id = "More",1594 SortId = 40,1595 Template = RenderListMore()1596 };15971598 productListMoreBlocksPage.Add("ProductList", moreBlock);1599 }16001601 @helper RenderListMore()1602 {1603 @*This is part of a script template *@1604 string groupID = HttpContext.Current.Request.QueryString.Get("groupid");1605 string listId = HttpContext.Current.Request.QueryString.Get("ListID");1606 bool isFavoriteList = !string.IsNullOrEmpty(listId);1607 string moreFeedFullUrl = GetGlobalValue("Global:Pageview.Url.Raw") + "&feed=true";1608 moreFeedFullUrl += !isFavoriteList ? "&DoNotShowVariantsAsSingleProducts=True" : "";1609 string columnCss = Pageview.Device.ToString() == "Mobile" ? "grid__col--bleed" : "grid__col--bleed-y";16101611 <div class="grid">1612 <div class="grid__col-12 @columnCss">1613 <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&groupid=@groupID{{loadMoreFeedParams}}" onclick="LoadMore.Next(this)" {{nextdisabled}}>@Translate("Load") {{pageSizeText}} @Translate("more")</button>1614 <button type="button" class="btn btn--clean" onclick="window.scroll(0, 0)">@Translate("Return to top")</button>1615 </div>1616 </div>1617 }1618 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1619 @using Dynamicweb.Core1620 @using System1621 @using System.Web1622 @using System.Collections.Generic1623 @using Dynamicweb.Rapido.Blocks16241625 @{1626 BlocksPage productListBottomSnippetsPage = BlocksPage.GetBlockPage("ProductList");16271628 Block productListStickers = new Block1629 {1630 Id = "Stickers",1631 SortId = 10,1632 Template = RenderStickersTemplates()1633 };1634 productListBottomSnippetsPage.Add("BottomSnippets", productListStickers);16351636 Block productListUnits = new Block1637 {1638 Id = "Units",1639 SortId = 20,1640 Template = RenderUnitTemplates()1641 };1642 productListBottomSnippetsPage.Add("BottomSnippets", productListUnits);16431644 Block productListVariants = new Block1645 {1646 Id = "Variants",1647 SortId = 30,1648 Template = RenderVariantTemplates()1649 };1650 productListBottomSnippetsPage.Add("BottomSnippets", productListVariants);16511652 Block productListFavorites = new Block1653 {1654 Id = "Favorites",1655 SortId = 40,1656 Template = RenderFavoritesTemplates()1657 };1658 productListBottomSnippetsPage.Add("BottomSnippets", productListFavorites);16591660 Block productListPreRender = new Block1661 {1662 Id = "PreRenders",1663 SortId = 50,1664 Template = RenderPreRenderTemplates()1665 };1666 productListBottomSnippetsPage.Add("BottomSnippets", productListPreRender);16671668 Block productListInitializers = new Block1669 {1670 Id = "Initializers",1671 SortId = 60,1672 Template = RenderInitializers()1673 };1674 productListBottomSnippetsPage.Add("BottomSnippets", productListInitializers);1675 }16761677 @helper RenderStickersTemplates() {1678 <script id="StickersContainer" type="text/x-template">1679 <div class="stickers-container stickers-container--{{position}} dw-mod">1680 {{#Stickers}}1681 {{>Sticker}}1682 {{/Stickers}}1683 </div>1684 </script>16851686 <script id="Sticker" type="text/x-template">1687 <div class="stickers-container__tag {{className}} dw-mod">{{text}}</div>1688 </script>16891690 <script id="MiniSticker" type="text/x-template">1691 <div class="stickers-container__tag stickers-container__tag--micro {{className}} dw-mod">{{text}}</div>1692 </script>1693 }16941695 @helper RenderUnitTemplates() {1696 <script id="UnitOption" type="text/x-template">1697 <div class="dropdown__item dw-mod" onclick="HandlebarsBolt.UpdateContent('Product{{id}}', '{{link}}&feed=true&UnitID={{value}}&rid={{id}}')">{{name}}</div>1698 </script>1699 }17001701 @helper RenderVariantTemplates() {1702 <script id="VariantsTemplate" type="text/x-template">1703 {{#.}}1704 <div>1705 <div class="u-bold">{{name}}</div>1706 <div>1707 {{#VariantOptions}}1708 {{>VariantOption}}1709 {{/VariantOptions}}1710 </div>1711 </div>1712 {{/.}}1713 </script>17141715 <script id="VariantOption" type="text/x-template">1716 {{#if color}}1717 <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>1718 {{else}}1719 {{#if image}}1720 <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}}" />1721 {{else}}1722 <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>1723 {{/if}}1724 {{/if}}1725 </script>17261727 <script id="StaticVariantsTemplate" type="text/x-template">1728 {{#.}}1729 {{#if isFirstGroup}}1730 <div>1731 {{#VariantOptions}}1732 {{>StaticVariantOption}}1733 {{/VariantOptions}}1734 </div>1735 {{/if}}1736 {{/.}}1737 </script>17381739 <script id="StaticVariantOption" type="text/x-template">1740 {{#if color}}1741 <div class="static-variant static-variant--color dw-mod" style="background-color: {{color}}" title="{{name}}"></div>1742 {{else}}1743 <div class="static-variant dw-mod">{{name}} </div>1744 {{/if}}1745 </script>17461747 <script id="VariantOptionImage" type="text/x-template">1748 <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}} />1749 </script>1750 }17511752 @helper RenderFavoritesTemplates() {1753 <script id="FavoriteTemplate" type="text/x-template">1754 <div class="favorites-list u-ta-left">1755 <label for="FavoriteTrigger_{{id}}" class="u-no-margin js-favorite-btn"><i class="{{favoriteIcon}} fa-1_5x"></i></label>1756 <input type="checkbox" id="FavoriteTrigger_{{id}}" class="dropdown-trigger" />1757 <div class="dropdown dropdown--absolute-position">1758 <div class="dropdown__content dropdown__content--show-left dropdown__content--padding u-w220px dw-mod">1759 <ul class="list list--clean dw-mod">1760 {{#FavoriteLists}}1761 {{>FavoriteListItem}}1762 {{/FavoriteLists}}1763 </ul>1764 </div>1765 <label class="dropdown-trigger-off" for="FavoriteTrigger_{{id}}"></label>1766 </div>1767 </div>1768 </script>17691770 <script id="FavoriteListItem" type="text/x-template">1771 <li>1772 <a href="{{link}}" class="list__link u-no-underline dw-mod" onclick="Scroll.SavePosition(event); {{facebookPixelAction}}"><i class="{{favoriteIcon}}"></i> {{name}}</a>1773 </li>1774 </script>1775 }17761777 @helper RenderPreRenderTemplates() {1778 string facetsViewMode = !String.IsNullOrEmpty(Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode")) ? Pageview.AreaSettings.GetItem("ProductList").GetString("FacetsViewMode").ToLower() : "left";17791780 <script id="ProductPreRenderContainer" type="text/x-template">1781 @if (facetsViewMode == "left" && Pageview.Device.ToString() != "Mobile")1782 {1783 <div class="grid__col-3">1784 <div class="pre-render-element pre-render-element--xs"></div>1785 <div class="pre-render-element pre-render-element--md"></div>1786 <div class="pre-render-element pre-render-element--md"></div>1787 <div class="pre-render-element pre-render-element--md"></div>1788 </div>1789 }1790 <div class="grid__col-auto">1791 <div class="pre-render-element pre-render-element--xs"></div>1792 <div class="pre-render-element pre-render-element--lg"></div>1793 <div class="pre-render-element pre-render-element--lg"></div>1794 <div class="pre-render-element pre-render-element--lg"></div>1795 <div class="pre-render-element pre-render-element--lg"></div>1796 </div>1797 </script>1798 }17991800 @helper RenderInitializers() {1801 <script>1802 document.addEventListener("DOMContentLoaded", function (event) {1803 document.getElementById("productList").addEventListener('contentLoaded', function (e) {1804 if (getTarget(e).id === "productList") {1805 Search.Init();1806 Facets.Init("selectedFacets", "productList");1807 }1808 }, false);1809 });1810 </script>1811 }18121813 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1814 @using Dynamicweb.Core1815 @using System1816 @using System.Web1817 @using System.Linq1818 @using System.Collections.Generic1819 @using Dynamicweb.Rapido.Blocks18201821 @functions {1822 BlocksPage productListActionsBlocksPage = BlocksPage.GetBlockPage("ProductList");1823 }18241825 @{1826 productListActionsBlocksPage.Add("ProductList", new Block1827 {1828 Id = "Actions",1829 SortId = 10,1830 Template = RenderListActions()1831 });18321833 productListActionsBlocksPage.Add("BottomSnippets", new Block() {1834 Id = "ListViewSelectListener",1835 Template = RenderListViewSelectListener()1836 });1837 }18381839 @helper RenderListActions()1840 {1841 @*This is part of a script template *@18421843 bool showSorting = Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableSorting");1844 bool onlyPreview = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Pageview.User == null;1845 string listId = HttpContext.Current.Request.QueryString.Get("ListID");1846 bool isFavoriteList = !string.IsNullOrEmpty(listId);1847 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fas fa-shopping-cart";18481849 List<Block> subBlocks = this.productListActionsBlocksPage.GetBlockListById("Views").OrderBy(item => item.SortId).ToList();18501851 <div class="grid u-margin-bottom--lg">1852 @if (!isFavoriteList)1853 {1854 <div class="grid__col--bleed-y grid__col-md-auto u-no-padding-x">1855 <h2 class="u-no-margin"><i class="{{headerIcon}}"></i>{{header}}</h2>1856 <h6 class="u-no-margin">{{groupDescription}}</h6>1857 </div>1858 }1859 <div class="grid--align-end grid__col--bleed-y grid__col-md-auto u-no-padding-x grid--align-self-center">1860 <div class="collection u-no-margin">1861 @if (showSorting)1862 {1863 if (Pageview.Device.ToString() != "Mobile")1864 {1865 <h5 class="u-inline-block u-margin-right">@Translate("Sort by")</h5>1866 }1867 else1868 {1869 <h5 class="u-inline-block u-margin-right">@Translate("Sort")</h5>1870 }1871 <input type="checkbox" id="ProductSort" class="dropdown-trigger" />1872 <div class="dropdown u-w150px u-w120px--xs u-margin-right u-inline-block dw-mod">1873 <label class="dropdown__header dropdown__btn dropdown__btn--small dw-mod" for="ProductSort">{{selectedSort}}</label>1874 <div class="dropdown__content dw-mod">1875 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: '', SortOrder: '' }, true);">@Translate("Default")</div>1876 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Created', SortOrder: 'DESC'}, true);">@Translate("Newest")</div>1877 @if (!onlyPreview)1878 {1879 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Price', SortOrder: 'ASC' }, true);">@Translate("Price low - high")</div>1880 <div class="dropdown__item" onclick="HandlebarsBolt.UpdateQueryParameters('productList', { SortBy: 'Price', SortOrder: 'DESC' }, true);">@Translate("Price high - low")</div>1881 }1882 </div>1883 <label class="dropdown-trigger-off" for="ProductSort"></label>1884 </div>1885 }18861887 @if (subBlocks.Count > 1)1888 {1889 foreach (Block item in subBlocks)1890 {1891 <input type="radio" class="tag-btn-trigger" id="ListViewBtn_@item.Id" name="ViewBtnGroup">1892 <label for="ListViewBtn_@item.Id" class="btn btn--tag u-no-margin" onclick="HandlebarsBolt.UpdateTemplate('ProductsContainer', '@item.Id')"><i class="fas fa-@item.Name"></i></label>1893 }1894 }18951896 @if (isFavoriteList)1897 {1898 if (Pageview.Device.ToString() != "Mobile")1899 {1900 <button type="submit" class="btn btn--primary btn--sm dw-mod u-no-margin">@Translate("Buy all") <i class="@cartIcon"></i></button>1901 }1902 else1903 {1904 <button type="submit" class="btn btn--primary btn--full btn--sm u-margin-top dw-mod">@Translate("Buy all") <i class="@cartIcon"></i></button>1905 }1906 }1907 </div>1908 </div>1909 </div>1910 }19111912 @helper RenderListViewSelectListener()1913 {1914 /* the same block code placed in ProductListFeed.cshtml */1915 Dictionary<string, bool> views = new Dictionary<string, bool>()1916 {1917 { "ProductItemContainer", Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableListView") },1918 { "ProductGridItemContainer", Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableGridView") },1919 { "ProductDetailsItemContainer", Pageview.AreaSettings.GetItem("ProductList").GetBoolean("EnableDetailsView") }1920 };19211922 string defaultView = Pageview.AreaSettings.GetItem("ProductList").GetList("DefaultListView") != null ? Pageview.AreaSettings.GetItem("ProductList").GetList("DefaultListView").SelectedValue : "";19231924 if (!string.IsNullOrEmpty(defaultView) && views[defaultView])1925 {1926 defaultView = defaultView;1927 }1928 else1929 {1930 defaultView = views.FirstOrDefault(x => x.Value).Key ?? "ProductItemContainer";1931 }19321933 <script>1934 let defaultTemplate = '@defaultView';1935 let container = 'productList';1936 let cookieName = 'ProductsContainerTemplate';19371938 document.addEventListener('DOMContentLoaded', function (event) {1939 document.getElementById(container).addEventListener('contentLoaded', function () {1940 let selectedMode = RememberState.GetCookie(cookieName);1941 let element = document.getElementById('ListViewBtn_' + (selectedMode != null ? selectedMode : defaultTemplate));1942 if (element != null) {1943 element.checked = true;1944 }1945 }, false);1946 });1947 </script>1948 }1949 @if (File.Exists(HttpContext.Current.Server.MapPath("/Files/Templates/Designs/Rapido/eCom/ProductList/Blocks/Custom__Blocks.cshtml")))1950 {1951 <text>@inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>1952 @using Dynamicweb.Core1953 @using System1954 @using System.Web1955 @using System.Collections.Generic1956 @using Dynamicweb.Rapido.Blocks19571958 @{1959 BlocksPage customBlocksPage = BlocksPage.GetBlockPage("ProductList");19601961 }</text>1962 }19631964 @if (productListNavigation.BlocksList.Count < 1) {1965 productListNavigation.Design.RenderType = RenderType.Hide;1966 }19671968 <form name="multiForm" id="multiForm" method="post">1969 <input type="hidden" name="CartCmd" id="CartCmd" value="addMulti" />1970 <input type="hidden" name="OrderContext" id="OrderContext" value="" />1971 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@1972 @RenderBlockList(productListPage.BlocksRoot.BlocksList)1973 </form>19741975 @helper RenderPageContainer() {1976 string groupid = HttpContext.Current.Request.QueryString["groupid"] == null ? string.Empty : HttpContext.Current.Request.QueryString["groupid"].ToString();1977 string Search = HttpContext.Current.Request.QueryString["Search"] == null ? string.Empty : HttpContext.Current.Request.QueryString["Search"].ToString();1978 List<Block> subBlocks = this.productListPage.GetBlockListById("PageContainer").OrderBy(item => item.SortId).ToList();19791980 string pageUrl = GetGlobalValue("Global:Pageview.Url.Raw");1981 string listId = HttpContext.Current.Request.QueryString.Get("ListID");1982 bool isFavoriteList = !string.IsNullOrEmpty(listId);1983 string feedFullUrl = pageUrl + "&feed=true";1984 feedFullUrl += !isFavoriteList ? "&DoNotShowVariantsAsSingleProducts=True" : "";1985 string smallDeviceCss = Pageview.Device.ToString() == "Mobile" ? "" : "u-padding";19861987 <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="overlay"></div>19881989 <script id="ProductContainer" type="text/x-template">1990 {{#each .}}1991 @RenderBlockList(subBlocks)1992 {{else}}1993 @if (!string.IsNullOrEmpty(groupid))1994 {1995 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-12 grid__col-xs-12 dw-mod">1996 <h2 class="u-margin-bottom">@Translate("Product categories")</h2>19971998 <div class="u-padding-bottom--lg">19992000 @RenderNavigation(new2001 {2002 id = "leftnav",2003 cssclass = "dwnavigation",2004 startLevel = 1,2005 endlevel = 4,2006 template = "LeftNavigationEcom.xslt",2007 expandmode = "path"2008 })2009 </div>2010 </div>201120122013 var groupService = new Dynamicweb.Ecommerce.Products.GroupService();2014 Dynamicweb.Ecommerce.Products.Group group = null;2015 if (!string.IsNullOrEmpty(groupid))2016 {2017 group = groupService.GetGroup(groupid);2018 }201920202021 <div class="grid__col-auto">2022 <div class="grid__cell">2023 <h2 class="u-margin-bottom">@group.Name</h2>2024 <h6 class="u-margin-bottom">@group.Description</h6>2025 <div class="grid product-list grid--external-bleed-x dw-mod">20262027 @if (group != null && group.HasChildGroups)2028 {2029 foreach (var g in group.Subgroups)2030 {2031 var link = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?id=2200&groupid=" + g.Id);20322033 if (Pageview.Area.ID == 28)2034 {2035 link = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?id=2200&groupid=" + g.Id);2036 var regex = new Regex(Regex.Escape("products/"));2037 link = regex.Replace(link, "", 1);2038 }20392040 var image = g.LargeImage;2041 if (!string.IsNullOrEmpty(image) && image != "Images/Ecom/Machines/")2042 {2043 if (image.StartsWith("/"))2044 {2045 image = "/Files" + image;2046 }2047 else2048 {2049 image = "/Files/" + image;2050 }2051 }2052 else2053 {2054 image = "/Files/Images/Ecom/Groups/S-web-base.jpg";2055 }2056 <div class="grid__col-lg-4 grid__col-md-4 grid__col-sm-4 grid__col-xs-6 product-list__grid-item image-hover--zoom dw-mod">2057 <div class="grid__cell product-list__grid-item__image dw-mod ">2058 <a href="@link" title="@g.Name" class="u-block u-position-relative image-hover__wrapper dw-mod">2059 <img class="grid__cell-img grid__cell-img--centered u-padding b-lazy b-loaded" src="/Admin/Public/GetImage.ashx?width=300&height=300&Compression=75&FillCanvas=true&DoNotUpscale=true&image=@image" alt="@g.Name">2060 </a>2061 </div>2062 <div class="grid__cell product-list__grid-item__price-info dw-mod">2063 <a href="@link" title="@g.Name">2064 <h6 class="u-condensed-text">@g.Name</h6>2065 </a>2066 </div>2067 </div>2068 }2069 }20702071 </div>2072 </div>2073 </div>20742075 }2076 else if (!string.IsNullOrEmpty(Search))2077 {2078 <div class="grid__col-auto">2079 @Pageview.AreaSettings.GetItem("Custom").GetString("ProductNotFoundContent");2080 </div>2081 }2082 {{/each}}2083 </script>2084 }20852086 @helper RenderProductList() {2087 @*This is part of a script template *@20882089 List<Block> subBlocks = productListPage.GetBlockListById("ProductList").OrderBy(item => item.SortId).ToList();20902091 string pageId = GetGlobalValue("Global:Page.ID");2092 string pageUrl = GetGlobalValue("Global:Pageview.Url.Raw");2093 string listId = HttpContext.Current.Request.QueryString.Get("ListID");2094 bool isFavoriteList = !string.IsNullOrEmpty(listId);2095 string feedFullUrl = pageUrl + "&feed=true";2096 feedFullUrl += !isFavoriteList ? "&DoNotShowVariantsAsSingleProducts=True" : "";2097 string smallDeviceCss = Pageview.Device.ToString() == "Mobile" ? "" : "";20982099 <div class="grid__col-sm-auto grid__col-xs-12 @smallDeviceCss">2100 @if (isFavoriteList)2101 {2102 string searchPlaceholder = Translate("Search favorite products", "Search favorite products");2103 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";21042105 <div class="grid__cell">2106 <div class="u-pull--left">2107 <h2 class="u-no-margin"><i class="{{headerIcon}}"></i>{{header}}</h2>2108 </div>2109 <div class="grid__col--bleed grid__col-6 u-pull--right">2110 <div class="u-margin-bottom">2111 <div class="typeahead u-color-inherit js-typeahead" data-page-size="10" id="FavoritesSearch" data-list-id="@listId" data-search-feed-id="@pageId&feed=true" data-result-page-id="@pageId">2112 <input type="text" class="typeahead-search-field u-no-margin u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">2113 <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=@listId" data-init-onload="false" data-preloader="minimal"></ul>2114 <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>2115 </div>2116 </div>2117 </div>2118 </div>2119 }21202121 <div class="grid__cell">2122 @RenderBlockList(subBlocks)2123 </div>2124 </div>2125 }