Exception in template (Designs\botex\eCom/Productlist/botex-espresso.cshtml): System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.eeacbdbbecfdedc.Execute()
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context)
at RazorEngine.Templating.TemplateService.Run(ITemplate template, DynamicViewBag viewBag)
at RazorEngine.Templating.TemplateService.Parse(String razorTemplate, Object model, DynamicViewBag viewBag, String cacheName)
at RazorEngine.Razor.Parse[T](String razorTemplate, T model, String cacheName)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
@inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module @using Dynamicweb.Content.Items.Metadata @using Dynamicweb.Content.Items @using System.Globalization; @using System.Text.RegularExpressions; @using Dynamicweb.Ecommerce.Common; @using Co3.Espresso.Website.Services;@functions {CultureInfo AreaCultureInfo = Dynamicweb.Frontend.PageView.Current().Area.CultureInfo;public string getProductLink( string groupID, string productID, string variantID = "" ) {string result = string.Empty;string displayPage = ProductService.Instance.GetGroupDisplayPage( groupID );if( string.IsNullOrEmpty( displayPage ) == false ) {if( string.IsNullOrEmpty( variantID ) == false ) {result = "{0}&ProductID={1}&variantID={2}";result = string.Format( result, displayPage, productID, variantID );}else {result = "{0}&ProductID={1}";result = string.Format( result, displayPage, productID );}}return result;}public bool isProductGroupPublishedOnWebsite( string groupID ) {bool result = false;string displayPage = ProductService.Instance.GetGroupDisplayPage( groupID );if( string.IsNullOrEmpty( displayPage ) == false ) {result = true;}return result;}public string getNewsLink( string categoryName, string newsID ) {string result = NewsService.Instance.GetNewsDisplayPage( categoryName, newsID );string displayPage = NewsService.Instance.GetNewsDisplayPage( categoryName, newsID );if( string.IsNullOrEmpty( displayPage ) == false ) {result = "/" + displayPage.Replace( "Id", "ID" ).Replace( "#", "&PID=" ) + "&M=NewsV2&Action=1&NewsID=" + newsID;//result = SearchEngineFriendlyURLs.GetFriendlyUrl( result );}return result;}public string getImageURL( string url, int width = 2560, int height = 0, int crop = 0, int quality = 75, string format = "jpg" ) {string result = string.Empty;if( string.IsNullOrEmpty( url ) == false ) {result = "/admin/public/getimage.ashx?Image={0}&Width={1}&Height={2}&Format={3}&Quality={4}&Crop={5}";result = string.Format( result, url, width, height, format, quality, crop );}return result;}public string getPriceFormatted( string price ) {string result = string.Empty;if( string.IsNullOrEmpty( price ) == true ) {price = Context.Currency.Format(0.00, false);}if ( Context.Currency.SymbolPlace == 0 ) {result = string.Format( "<span class=\"e-product-price-symbol\">{1}</span>&nbsp;{0}", price, Context.Currency.Symbol );}else{result = string.Format( "{0}&nbsp;<span class=\"e-product-price-symbol\">{1}</span>", price, Context.Currency.Code );}return result;}public string getShortDate( DateTime date ) {string result = string.Empty;result = date.Date.ToString( AreaCultureInfo.DateTimeFormat.ShortDatePattern ).Replace( "-" , "." );return result;}public string getLongDate( DateTime date ) {string result = string.Empty;result = date.Date.ToString( AreaCultureInfo.DateTimeFormat.LongDatePattern );return result;} } @{string pageUrl = GetGlobalValue("Global:Pageview.Url");string sortBy = string.IsNullOrEmpty(System.Web.HttpContext.Current.Request["SortBy"]) ? Espresso.Item.ModuleOverride_SortBy : System.Web.HttpContext.Current.Request["SortBy"];string sortOrder = string.IsNullOrEmpty(System.Web.HttpContext.Current.Request["SortOrder"]) ? Espresso.Item.ModuleOverride_SortOrder : System.Web.HttpContext.Current.Request["SortOrder"];string pageSize = string.IsNullOrEmpty(System.Web.HttpContext.Current.Request["PageSize"]) ? Espresso.Item.ModuleOverride_PageSize : System.Web.HttpContext.Current.Request["PageSize"];string pageNum = string.IsNullOrEmpty(System.Web.HttpContext.Current.Request["PageNum"]) ? GetString("Ecom:ProductList.CurrentPage") : System.Web.HttpContext.Current.Request["PageNum"];string productListClassList = "col-12";if( Espresso.Item.FiltersShow == "True" ) {productListClassList = "col-12 col-lg-8 col-xl-9";}var paragraph = Dynamicweb.Frontend.PageView.Current().CurrentParagraph;Item item = Dynamicweb.Content.Items.ItemManager.Storage.GetById(paragraph.ItemType, paragraph.ItemId);string includeResponsiveWidthId = item["ItemWidth"].ToString();Item includeResponsiveWidth = Dynamicweb.Content.Items.ItemManager.Storage.GetById("ParagraphInclude_WidthResponsive", includeResponsiveWidthId);dynamic width = new {xs = includeResponsiveWidth["xs"] ?? "12",sm = includeResponsiveWidth["sm"] ?? "6",md = includeResponsiveWidth["md"] ?? "4",lg = includeResponsiveWidth["lg"] ?? "4",xl = includeResponsiveWidth["xl"] ?? "4"}; }<div class="js-e-productlist js-e-loading-overlay-override">@if( Espresso.Item.SortShow == "True" || Espresso.Item.PagingShow == "True" || Espresso.Item.HeadingShow == "True" ){ <div class="js-e-productslist-header small"> <div class="row align-items-end"> @if( ( Espresso.Item.SortShow == "True" || Espresso.Item.PagingShow == "True" ) && Espresso.Item.HeadingShow == "True" ){ <div class="col-md-12"> <h1 class="">@Espresso.Item.Name</h1> </div> } @if( Espresso.Item.FiltersShow == "True" ){ <div class="d-none d-lg-block col-lg-4 col-xl-3"> <div class="e-productslist-header"> <p class="h2 small m-0"> <i class="material-icons material-icons-large text-primary d-none">playlist_add_check</i> <small>@Translate( "eCom Productlist Filters - Customize Selection - Heading", "Customize selection" )</small> </p> </div> </div> } @if( Espresso.Item.SortShow == "True" || Espresso.Item.PagingShow == "True" || Espresso.Item.HeadingShow == "True" ){ <div class="@productListClassList px-1"> <div class="e-productslist-header small"> @if( ( Espresso.Item.SortShow == "False" && Espresso.Item.PagingShow == "False" ) && Espresso.Item.HeadingShow == "True" ){ <h1 class="h3 m-0">@Espresso.Item.Name (<span class="js-e-productlist-product-count"></span>)</h1> } else{ <div class="row"> @if( Espresso.Item.SortShow == "True" ){ @*<div class="col-6 @( Espresso.Item.PagingShow != "True" ? "ml-auto" : "" )"> <div class="js-e-productlist-sort">*@ <script id="js-e-handlebars-partial-productlist-sort" type="text/x-handlebars-template"> <fieldset class="form-inline"> <div class="form-group @( Espresso.Item.PagingShow != "True" ? "justify-content-end" : "" )"> @*<label for="Sort" class="mr-1"> @Translate( "eCom Productlist - Sorting - Label", "Sort: ") </label>*@ <select name="Sort" class="js-e-productlist-sort-select custom-select custom-select-sm" style="padding-bottom:0.25em; padding-right: 2em;"> <option value="Name ASC" {{#compare sort.sort '===' 'Name ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Name - ASC - Label", "Name - low to high")</option> <option value="Name DESC" {{#compare sort.sort '===' 'Name DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Name - DESC - Label", "Name - high to low")</option> @*<option value="Created ASC" {{#compare sort.sort '===' 'Created ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Created - ASC - Label", "Created")</option>*@ <option value="Price ASC" {{#compare sort.sort '===' 'Price ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - ASC - Label", "Price - low to high")</option> <option value="Price DESC" {{#compare sort.sort '===' 'Price DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - DESC - Label", "Price - high to low")</option> </select> </div> </fieldset> </script> @* </div> </div>*@ } @if( Espresso.Item.PagingShow == "True" ){ <div class="col-12"> <div class="row align-items-center d-flex e-products-paging h-100 small js-e-products-paging justify-content-center"> <script id="js-e-handlebars-tmpl-productlist-paging" type="text/x-handlebars-template"> <div class="col-6 text-left for-productslist-header"> @*<select name="Sort" class="js-e-productlist-sort-select custom-select custom-select-sm" style="padding-bottom:0.25em;"> <option value="Name DESC" {{#compare sort.sort '===' 'Name DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Name - DESC - Label", "Name")</option> <option value="Created ASC" {{#compare sort.sort '===' 'Created ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Created - ASC - Label", "Created")</option> <option value="Price ASC" {{#compare sort.sort '===' 'Price ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - ASC - Label", "Price - low to high")</option> <option value="Price DESC" {{#compare sort.sort '===' 'Price DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - DESC - Label", "Price - high to low")</option> </select>*@ {{> productlistSort}} </div> <div class="col-6 text-right for-productslist-header"> <small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> </div> <div class="col-4 text-left for-productslist-footer"> {{#compare page.prevPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.prevPage}}" class="btn-link js-e-productlist-set-pagenum" data-page-num="{{page.prevPage}}"> <span class="d-inline">@Translate( "eCom Productlist Paging - Previous - Text", "Previous" )</span> </a> {{/compare}} </div> <div class="col-4 text-center for-productslist-footer"> <small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> </div> <div class="col-4 text-right for-productslist-footer"> {{#compare page.nextPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.nextPage}}" class="btn-link js-e-productlist-set-pagenum" data-page-num="{{page.nextPage}}"> <span class="d-inline">@Translate( "eCom Productlist Paging - Next - Text", "Next" )</span></a> {{/compare}} </div> @*<small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> {{#compare page.prevPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.prevPage}}" class="btn-link btn-lg py-0 m-0 pos-a l-0 px-2 js-e-productlist-set-pagenum" data-page-num="{{page.prevPage}}"> <span class="d-none d-lg-inline">@Translate( "eCom Productlist Paging - Previous - Text", "Previous" )</span> </a> {{/compare}} {{#compare page.nextPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.nextPage}}" class="btn-link btn-lg py-0 m-0 pos-a r-0 px-2 js-e-productlist-set-pagenum" data-page-num="{{page.nextPage}}"> <span class="d-none d-lg-inline">@Translate( "eCom Productlist Paging - Next - Text", "Next" )</span></a> {{/compare}}*@ @*{{#compare page.pageSize '!==' 999}} {{#compare page.totalPages '>' 1 }} <a href="{{page.pagingUrl}}=9999" class="btn btn-link btn-lg p-0 pl-1 js-e-productlist-set-pagesize d-none d-md-inline" data-page-size="999"> @Translate( "eCom Productlist Paging - Show All - Text", "Show all") </a> {{/compare}} {{/compare}} {{#compare page.pageSize '===' 999}} <a href="#" class="btn btn-link btn-lg p-0 pl-1 js-e-productlist-set-pagesize d-none" data-page-size="@Espresso.Item.Pagesize">@Translate( "eCom Productlist Paging - Reset - Link", "Reset")</a> {{/compare}}*@ </script> </div> </div> } else{ <div class="col-6 order-first"><span class="js-e-productlist-product-count"></span> @Translate( "eCom Productlist - Product count - Text", "products")</div> } </div> } </div> </div> } @if( Espresso.Item.FiltersShow == "True" ){ <div class="col-12 d-lg-none"> <button class="btn btn-block btn-primary mb-2" type="button" data-toggle="modal" data-target="#js-e-productlist-filters-modal">@Translate( "eCom Productlist Filters - Customize Selection - Button", "Customize selection" )</button> </div> } </div> </div> } <div class="row"><div class="d-none d-lg-block col-lg-4 col-xl-3"><form class="js-e-productlist-form"><input type="hidden" name="ID" value="@Espresso.Page.ID"><input type="hidden" name="PageNum" value="@pageNum"><input type="hidden" name="PageUrl" value="@pageUrl"><input type="hidden" name="Sort" value="@sortBy @sortOrder"><input type="hidden" name="SortBy" value="@sortBy"><input type="hidden" name="SortOrder" value="@sortOrder"><input type="hidden" name="PageSize" value="@pageSize">@foreach ( LoopItem query in GetLoop( "Query.Parameters" ) ){if ( string.IsNullOrEmpty( query.GetString( "Parameter.Value" ) ) == false ){if ( query.GetBoolean( "Parameter.IsHandledAsFacet" ) == false && query.GetString( "Parameter.Name" ) != "q" ){<input type="hidden" name="@query.GetString( "Parameter.Name" )" value="@query.GetString( "Parameter.Value" )">}}}@if( Espresso.Item.FiltersShow == "True" ) {foreach (LoopItem facetGroup in GetLoop("FacetGroups") ) {<input type="hidden" name="fg" value="@facetGroup.GetString("FacetGroup.Name")">}<input type="hidden" class="js-e-visible-options-count" value="@Espresso.Item.FiltersVisibleOptionCount"><div id="js-e-productlist-filters">@*@foreach( LoopItem query in GetLoop("Query.Parameters") ) { if( string.IsNullOrEmpty( query.GetString("Parameter.Value") ) == false ) { <input type="hidden" name="@query.GetString("Parameter.Name")" value="@query.GetString("Parameter.Value")"> } }*@ <script id="js-e-handlebars-tmpl-productlist-filters" type="text/x-handlebars-template"> {{#if page.filtersAppliedCount}} <div class="e-productlist-filters-group"> <p class="e-productlist-filters-group-header font-weight-bold small mb-0"> <span class="e-productlist-filters-group-name small py-1">@Translate("eCom Productlist Filters - Selected - Text", "Selected filters")</span> @*<button type="button" class="small btn btn-link pr-0 js-e-productlist-filters-clear-all">@Translate("eCom Productlist Filters - Reset Filters - Button", "Reset all")</button>*@ <label class="small btn-link pr-0 py-1 my-0 js-e-productlist-filters-clear-all">@Translate("eCom Productlist Filters - Reset Filters - Button", "Reset all")</label> </p> <div class="small"> <ul class="e-productlist-filters-group-options-selected list-unstyled small mb-1"> {{#each facets}} {{#if selectedOptions.length}} {{#each selectedOptions}} <li class="e-productlist-filters-option-selected"><a class="js-e-productlist-filters-remove" href="#" data-value="{{value}}"><i class="material-icons material-icons-fixed text-danger text-left mr-1">clear</i>{{../name}}: {{label}}</a></li> {{/each}} {{/if}} {{/each}} {{#if page.q}} <li class="e-productlist-filters-option-selected"><a class="js-e-productlist-filters-search-clear" href="#"><i class="material-icons material-icons-fixed text-danger mr-1">clear</i>@Translate("eCom Productlist Filters - Search - Text", "Search"): {{page.q}}</a></li> {{/if}} {{#compare page.minPrice.clean '&&' page.maxPrice.clean}} <li class="e-productlist-filters-option-selected"><a class="js-e-productlist-filters-range-clear" href="#" data-group-id="js-e-productlist-filters-range-group-price"><i class="material-icons material-icons-fixed text-danger mr-1">clear</i>@Translate("eCom Productlist Filters - Price - Heading", "Price"): {{{page.minPrice.formatted}}} - {{{page.maxPrice.formatted}}}</a></li> {{/compare}} </ul> </div> </div> {{/if}} @if( Espresso.Item.FiltersNavigationShow == "True" ){ <div class="e-productlist-filters-group js-e-productlist-filters-group"> <p class="e-productlist-filters-group-header font-weight-bold small mb-0"> <a class="e-productlist-filters-group-collapse-toggle text-black" data-toggle="collapse" data-target="#e-productlist-filters-group-navigation"> <i class="material-icons">arrow_drop_down</i> <span class="e-productlist-filters-group-name small py-1"> @Espresso.Item.NavigationHeading </span> </a> </p> <fieldset id="e-productlist-filters-group-navigation" class="e-productlist-filters-group-options mb-2 small collapse show"> <div class="e-nav-local e-nav-local-vertical"> <nav class="e-nav-local-container"> <ul class="nav flex-column"> @RenderNavigation( new { id = "dwnav-local-" + Espresso.Id, parentid = string.IsNullOrEmpty( Espresso.Item.NavigationParentPage ) == false ? Espresso.Item.NavigationParentPage : Espresso.Page.ID, template = "local-vertical.xslt", startlevel = Espresso.Item.NavigationLevelStart, endlevel = Espresso.Item.NavigationLevelEnd, expandmode = "path", } ) </ul> </nav> </div> </fieldset> </div> } @if( Espresso.Item.FiltersSearchShow == "True" ){ <div class="e-productlist-filters-group js-e-productlist-filters-group"> <p class="e-productlist-filters-group-header font-weight-bold small mb-0"> <a class="e-productlist-filters-group-collapse-toggle {{#unless page.q}}collapsed{{/unless}}" data-toggle="collapse" data-target="#e-productlist-filters-group-search"> <i class="material-icons">arrow_drop_down</i> <span class="e-productlist-filters-group-name small py-1">@Translate("eCom Productlist Filters - Search - Heading", "Search")</span> </a> {{#if page.q}} <button type="button" class="btn btn-link pr-0 js-e-productlist-filters-search-clear"> @Translate("eCom Productlist Filter - Group Reset - Button", "Reset") </button> {{/if}} </p> <fieldset id="e-productlist-filters-group-search" class="e-productlist-filters-group-options mb-2 small collapse {{#if page.q}}show{{/if}}"> <div class="js-e-search-input-group e-search-input-group {{#unless page.q}}is-empty{{/unless}}"> <label class="e-search-label" for="filter_search"><i class="material-icons">search</i></label> <input type="text" class="js-e-search-input e-search-input e-productlist-filters-search-input form-control-plaintext" name="q" id="filter_search" value="{{page.q}}"> <span class="js-e-search-clear e-search-clear"><i class="material-icons">close</i></span> <button class="e-search-submit btn btn-primary js-e-productlist-filters-search-submit" type="button"><i class="material-icons pa-0">search</i></button> </div> </fieldset> </div> } {{#each facets}} {{#compare count '>' 0}} <div class="e-productlist-filters-group js-e-productlist-filters-group"> <p class="e-productlist-filters-group-header font-weight-bold small mb-0"> <a class="e-productlist-filters-group-collapse-toggle {{#unless selectedOptions.length }}{{#compare @@first '&&' @@root.page.hasNoInteraction}}{{else}}collapsed{{/compare}}{{/unless}}" data-toggle="collapse" data-target="#e-productlist-filters-group-{{param}}"> <i class="material-icons">arrow_drop_down</i> <span class="e-productlist-filters-group-name small py-1">{{label}}</span> </a> {{#if selectedOptions.length}} <label for="reset-filter-{{param}}" class="small m-0 btn-link pr-0"> @Translate("eCom Productlist Filter - Group Reset - Label", "Reset") </label> {{/if}} </p> <fieldset id="e-productlist-filters-group-{{param}}" class="e-productlist-filters-group-options js-e-productlist-filters-group-options mb-2 small collapse {{#if selectedOptions.length }}is-expanded{{else}}{{#compare @@first '&&' @@root.page.hasNoInteraction}}is-expanded{{/compare}}{{/if}}"> <div class="{{#compare count '>' @Espresso.Item.FiltersVisibleOptionCount }}js-e-productlist-filters-options-collapse-peek e-productlist-filters-options-collapse-peek is-peeking{{/compare}}"> <div class="e-productlist-filters-option js-e-productlist-filters-option"> <label for="reset-filter-{{param}}" class="custom-control custom-checkbox"> <input class="js-e-productlist-filters-option-reset-group custom-control-input" name="reset-filter-{{param}}" id="reset-filter-{{param}}" type="checkbox" value="true" {{#compare isCleared '||' isEmpty}}checked{{/compare}}> <span class="custom-control-indicator"></span> <span class="custom-control-description small">@Translate("eCom Productlist Filter - Options View All - Label", "All")</span> </label> </div> {{#each options}} <div class="e-productlist-filters-option js-e-productlist-filters-option {{#if isSelected}}is-selected{{/if}} {{#if isDisabled}}is-disabled text-muted{{/if}}"> <label for="{{id}}" class="custom-control custom-checkbox"> <input id="{{id}}" name="{{param}}" class="js-e-productlist-filter custom-control-input" type="checkbox" value="{{value}}" {{#if isSelected}}checked{{/if}} {{#if isDisabled}}disabled{{/if}}> <span class="custom-control-indicator"></span> <span class="custom-control-description small">{{label}} <span class="e-productlist-filters-option-count small text-muted">({{count}})</span></span> </label> </div> {{/each}} {{#compare count '>' @Espresso.Item.FiltersVisibleOptionCount }} <a href="#" class="js-e-productlist-filters-options-collapse-peek-toggle e-productlist-filters-options-collapse-peek-toggle small" data-closed-text="@Translate("eCom Productlist Filter - Options Show More - Link", "Show more")" data-open-text="@Translate("eCom Productlist Filter - Options Show Less - Link", "Show less")"><i class="material-icons">keyboard_arrow_down</i></a> {{/compare}} </div> </fieldset> </div> {{/compare}} {{/each}} @if( Espresso.Item.FiltersPriceRangeShow == "True" ){ <div class="e-productlist-filters-group js-e-productlist-filters-group"> <p class="e-productlist-filters-group-header font-weight-bold small mb-0"> <a class="e-productlist-filters-group-collapse-toggle {{#compare page.minPrice.clean '!!' page.maxPrice.clean}}collapsed{{/compare}}" data-toggle="collapse" data-target="#e-productlist-filters-group-pricerange"> <i class="material-icons">arrow_drop_down</i> <span class="e-productlist-filters-group-name small py-1">@Translate("eCom Productlist Filters - Price Range - Heading", "Price")</span> </a> {{#compare page.minPrice.clean '||' page.maxPrice.clean}} <button type="button" class="btn btn-link pr-0 js-e-productlist-filters-range-clear"> @Translate("eCom Productlist Filter - Group Reset - Button", "Reset") </button> {{/compare}} </p> <fieldset id="e-productlist-filters-group-pricerange" class="e-productlist-filters-group-options mb-2 small collapse {{#compare page.minPrice.clean '||' page.maxPrice.clean}}show{{/compare}}"> <div id="js-e-productlist-filters-range-group-price" class="row mt-1 e-productlist-filters-range-group js-e-productlist-filters-range-group"> <div class="col-12 col-lg-4 mb-1"> <input type="text" class="form-control js-e-productlist-filters-range js-e-productlist-filters-range-min" name="PriceRangeMin" id="PriceRangeMin" value="{{page.minPrice.clean}}" placeholder="@Translate("eCom Productlist Filters - Price Min - Text", "From")" min="0"> </div> <div class="col-12 col-lg-4 mb-1"> <input type="text" class="form-control js-e-productlist-filters-range js-e-productlist-filters-range-max" name="PriceRangeMax" id="PriceRangeMax" value="{{page.maxPrice.clean}}" placeholder="@Translate("eCom Productlist Filters - Price Max - Text", "To")" data-msg-rangeValid="@Translate("eCom Productlist Filters - Price Error - Msg", "Prices entered incorrectly")"> </div> <div class="col-12 col-lg-3"> <button type="button" class="btn btn-primary px-0 btn-sm btn-block e-productlist-filters-apply-range js-e-productlist-filters-apply-range"><i class="material-icons">sync</i></button> </div> </div> </fieldset> </div> } </div> </script> </div>}</form></div><div class="@productListClassList"><div id="js-e-productlist-products"><!-- Products for search engines that do not support dynamic rendering with js --> <ul itemscope itemtype="http://schema.org/ItemList">@foreach ( LoopItem product in GetLoop( "Products" ) ){string productLink = getProductLink( product.GetString("Ecom:Product.PrimaryOrFirstGroupID"), product.GetString("Ecom:Product.ID") );<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Product"><a href="@productLink" title="@product.GetString("Ecom:Product.Name")" itemprop="url"><h3 itemprop="name">@product.GetString("Ecom:Product.Name")</h3><p itemprop="description">@product.GetString("Ecom:Product.ShortDescription")</p></a></li>} </ul> @if ( GetLoop( "Ecom:ProductList.Pages" ).Count > 0 ) {<ol>@foreach ( LoopItem page in GetLoop( "Ecom:ProductList.Pages" ) ){string pagingPageUrl = page.GetString( "Ecom:ProductList.Pages.Page.Url" );string pagingPageNumber = page.GetString( "Ecom:ProductList.Pages.Page.Number" );<li><a href="@pagingPageUrl">@pagingPageNumber</a></li>}</ol> } <!--/ Products for search engines that do not support dynamic rendering with js -->@using Dynamicweb.Admin.dk.dynamicweb.templates <script id="js-e-handlebars-tmpl-productlist-products" type="text/x-handlebars-template"><div class="e-products"><div class="e-loading-overlay e-products-loading-overlay js-e-products-loading-overlay is-loading"><div class="e-loading-spinner"></div></div>{{#if page.productCount}}<div class="row">{{#each products}}@using Dynamicweb.Admin.dk.dynamicweb.templates <div class="col-@width.xs col-sm-@width.sm col-md-@width.md col-lg-@width.lg col-xl-@width.xl e-products-item-wrapper {{#if imageMedium}}with-bg{{/if}}"><div class="background-image" style="background-image: url('{{imageMedium}}');"></div><div class="e-products-item js-e-products-item"><div class="e-products-item-container"><div class="e-products-item-image-container"><a class="e-products-item-image-wrapper" href="{{url}}"><img src="{{imageSmall}}" alt="" class="e-products-item-image"></a></div><div class="e-products-item-text-container text-center p-1"><h3 class="e-products-item-name mb-0"><a href="{{url}}">{{name}}</a></h3>{{#if descriptionShortExtra01}}<p class="e-products-item-text mb-0"><a href="{{url}}">{{descriptionShortExtra01}}</a></p>{{/if}}<p class="e-products-item-text mb-0">{{#if hasVariants}}<a href="{{url}}"><small class="e-products-item-price small text-muted">@Translate( "eCom Productlist - From prices - Text", "Priser fra"): {{{lowestPrice}}}<br>{{{priceBefore}}}</small></a>{{else}}<small class="e-products-item-price small"><a href="{{url}}">{{{currency}}} {{{priceClean}}}{{{priceBefore}}}</a></small>{{/if}}</p></div></div></div> </div>{{/each}}</div>{{else}}<div class="alert alert-warning mt-2" role="alert"><strong><i class="material-icons material-icons-2x">sentiment_dissatisfied</i> @Translate( "eCom Productlist - Sorry - Text", "Sorry..")</strong><br> @Translate( "eCom Productlist - No Products - Text", "No products match your choices.")</div>{{/if}}</div> </script></div>@if( Espresso.Item.FooterShow == "True" ){ <div class="row"> <div class="col-12 px-0"> <div class="e-products-footer small row pt-1"> <div class="col-6"> <small>@Translate( "eCom Productlist - Price Info - Text Public", "All prices are incl. VAT" )</small> </div> @if( Espresso.Item.PagingShow == "True" ){ <div class="col-12"> <div class="row align-items-center d-flex e-products-paging h-100 small js-e-products-paging justify-content-center"> <script id="js-e-handlebars-tmpl-productlist-paging" type="text/x-handlebars-template"> <div class="col-6 text-left for-productslist-header"> @*<select name="Sort" class="js-e-productlist-sort-select custom-select custom-select-sm" style="padding-bottom:0.25em;"> <option value="Name DESC" {{#compare sort.sort '===' 'Name DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Name - DESC - Label", "Name")</option> <option value="Created ASC" {{#compare sort.sort '===' 'Created ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Created - ASC - Label", "Created")</option> <option value="Price ASC" {{#compare sort.sort '===' 'Price ASC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - ASC - Label", "Price - low to high")</option> <option value="Price DESC" {{#compare sort.sort '===' 'Price DESC'}}selected{{/compare}}>@Translate( "eCom Productlist - Sorting - Price - DESC - Label", "Price - high to low")</option> </select>*@ {{> productlistSort}} </div> <div class="col-6 text-right for-productslist-header"> <small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> </div> <div class="col-4 text-left for-productslist-footer"> {{#compare page.prevPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.prevPage}}" class="btn-link js-e-productlist-set-pagenum" data-page-num="{{page.prevPage}}"> <span class="d-inline">@Translate( "eCom Productlist Paging - Previous - Text", "Previous" )</span> </a> {{/compare}} </div> <div class="col-4 text-center for-productslist-footer"> <small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> </div> <div class="col-4 text-right for-productslist-footer"> {{#compare page.nextPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.nextPage}}" class="btn-link js-e-productlist-set-pagenum" data-page-num="{{page.nextPage}}"> <span class="d-inline">@Translate( "eCom Productlist Paging - Next - Text", "Next" )</span></a> {{/compare}} </div> @*<small class="text-nowrap"> {{#if page.productCount}} <strong>{{page.viewing.from}} - {{page.viewing.to}}</strong> @Translate( "eCom Productlist Paging - Product Count Of - Text", "of" ) {{/if}} <strong> {{page.productCount}}</strong> </small> {{#compare page.prevPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.prevPage}}" class="btn-link btn-lg py-0 m-0 pos-a l-0 px-2 js-e-productlist-set-pagenum" data-page-num="{{page.prevPage}}"> <span class="d-none d-lg-inline">@Translate( "eCom Productlist Paging - Previous - Text", "Previous" )</span> </a> {{/compare}} {{#compare page.nextPage '!==' 0 }} <a href="{{page.pagingUrl}}={{page.nextPage}}" class="btn-link btn-lg py-0 m-0 pos-a r-0 px-2 js-e-productlist-set-pagenum" data-page-num="{{page.nextPage}}"> <span class="d-none d-lg-inline">@Translate( "eCom Productlist Paging - Next - Text", "Next" )</span></a> {{/compare}}*@ @*{{#compare page.pageSize '!==' 999}} {{#compare page.totalPages '>' 1 }} <a href="{{page.pagingUrl}}=9999" class="btn btn-link btn-lg p-0 pl-1 js-e-productlist-set-pagesize d-none d-md-inline" data-page-size="999"> @Translate( "eCom Productlist Paging - Show All - Text", "Show all") </a> {{/compare}} {{/compare}} {{#compare page.pageSize '===' 999}} <a href="#" class="btn btn-link btn-lg p-0 pl-1 js-e-productlist-set-pagesize d-none" data-page-size="@Espresso.Item.Pagesize">@Translate( "eCom Productlist Paging - Reset - Link", "Reset")</a> {{/compare}}*@ </script> </div> </div> } @if ( Espresso.Item.FiltersShow == "True" ) { <button class="btn btn-block btn-primary mt-2 d-lg-none" type="button" data-toggle="modal" data-target="#js-e-productlist-filters-modal">@Translate( "eCom Productlist Filters - Customize Selection - Button", "Customize selection")</button> } </div> </div> </div> } </div></div> </div>@if( Espresso.Item.FiltersShow == "True" ) {<div id="js-e-productlist-filters-modal" class="modal fade e-productlist-filters-modal js-e-productlist-filters-modal modal-fullscreen d-lg-none" data-backdrop="false"> <script id="js-e-handlebars-tmpl-productlist-filters-modal" type="text/x-handlebars-template"> <div class="modal-dialog"> <div class="modal-content"> <button type="button" class="close" data-dismiss="modal"> <i class="material-icons">close</i> </button> <legend class="modal-header"> @Translate("eCom Productlist Filters - Customize Selection - Heading", "Customize Selection") </legend> <div class="modal-body"> <ul class="list-group"> <strong>@Translate("eCom Productlist Filters - Customize Selection - Heading", "Customize Selection")</strong> {{#each facets}} <li class="list-group-item e-productlist-filters-group"> <h4 class="mb-1"> <a id="filter-header-{{param}}" class="e-productlist-filters-group-header" data-toggle="collapse" data-target="#filter-modal-panel-{{param}}"> {{label}} {{#if selectedOptions.length}} <span>({{selectedOptions.length}})</span> {{/if}} <i class="material-icons e-productlist-filters-collapse-icon">arrow_drop_down</i> </a> </h4> <div id="filter-modal-panel-{{param}}" class="e-productlist-filters-collapse form-group collapse js-e-productlist-filters-collapse {{#if selectedOptions.length }}in{{/if}} mb-1"> <div class="row mt-2"> <div class="col-6 col-sm-4 col-md-3"> <input class="js-e-productlist-filters-reset-all" name="reset-filter-{{param}}" id="reset-filter-{{param}}" type="checkbox" value="true" {{#compare isCleared '||' isEmpty}}checked{{/compare}}> <label for="reset-filter-{{param}}"> @Translate("eCom Productlist Filters - All - Label", "All ") </label> </div> {{#each options}} <div class="col-6 col-sm-4 col-md-3"> <input type="checkbox" value="{{value}}" {{#if isSelected}}checked{{/if}} {{#if isDisabled}}disabled{{/if}}> <label class="js-e-productlist-filters-label-mobile" for="{{id}}"> {{label}} <span class="small">({{count}})</span> </label> </div> {{/each}} </div> </div> </li> {{/each}} @if ( Espresso.Item.FiltersPriceRangeShow == "True" ) { <li class="list-group-item e-productlist-filters-group"> <h4 class="mb-1"> <a id="filter-header-price" class="e-productlist-filters-group-header" data-toggle="collapse" data-target="#filter-modal-panel-price"> @Translate( "eCom Productlist Filters - Price Range - Heading", "Price" ) {{#compare page.minPrice.clean '&&' page.maxPrice.clean}} <span>(1)</span> {{/compare}} <i class="material-icons e-productlist-filters-collapse-icon">arrow_drop_down</i> </a> </h4> <div id="filter-modal-panel-price" class="e-productlist-filters-collapse form-group collapse js-e-productlist-filters-collapse {{#compare page.minPrice.clean '||' page.maxPrice.clean}}in{{/compare}} mb-1"> <div class="row mt-1 e-productlist-filters-range-group js-e-productlist-filters-range-group"> <div class="col-4"> <input type="number" class="form-control js-e-productlist-filters-range js-e-productlist-filters-range-min" name="PriceRangeMin" id="PriceRangeMinModal" value="{{page.minPrice.clean}}" placeholder="@Translate( "eCom Productlist - Filters Price Min - Text ", "From " )" min="0"> </div> <div class="col-4"> <input type="number" class="form-control js-e-productlist-filters-range js-e-productlist-filters-range-max" name="PriceRangeMax" id="PriceRangeMaxModal" value="{{page.maxPrice.clean}}" placeholder="@Translate( "eCom Productlist Filters - Price Max - Text ", "To " )" data-msg-pricerange="@Translate( "eCom Productlist Filters - Price Error - Msg ", "Prices entered incorrectly " )"> </div> <div class="col-1"> <button type="button" class="btn btn-link px-0 e-productlist-filters-clear-range js-e-productlist-filters-range-clear" data-group-id="js-e-productlist-filters-range-group-price"><i class="material-icons">clear</i></button> </div> <div class="col-3"> <button type="button" class="btn btn-primary px-0 btn-sm btn-block e-productlist-filters-apply-range js-e-productlist-filters-apply-range"><i class="material-icons">sync</i></button> </div> </div> </div> </li> } </ul> <div class="modal-footer"> <a href="#" class="btn btn-outline-primary js-e-productlist-filters-clear-all">@Translate("eCom Productlist Filters - Reset Filter - Link", "Reset all")</a> <button type="button" class="btn btn-primary" data-dismiss="modal"> @Translate("eCom Productlist Filters - Apply - Button", "Apply") </button> </div> </div> </div> </script> </div> }
keyboard_arrow_up