Error executing template "Designs/Tefcold/_parsed/Basic_Page.parsed.cshtml"
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.MakeGroupTree(GroupCollection groups, Page page, NavigationItem parentNode, Int32 thisLevel, Int32 maxLevel, Page productPage)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.MakeGroupTree(Page page, NavigationItem parentNode)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.Process(NavigationItem node)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.ProcessTree(RootNavigationItem rootNode, NavigationType navigationType)
   at Dynamicweb.Frontend.XmlNavigation.MakeXml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, Int32 selectedAreaId)
   at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, String name, String xsltPath, Int32 selectedAreaId, Boolean sitemapMode, NameValueCollection settings, NameValueCollection attributes, IncludeMode mode)
   at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(NameValueCollection settings, NameValueCollection attributes)
   at Dynamicweb.Rendering.TemplateBase`1.RenderNavigation(Object settings)
   at CompiledRazorTemplates.Dynamic.RazorEngine_f2601fd525b74e7087c37017f96d14b9.Execute() in E:\Solutions\Live\Tefcold.Web\Files\Templates\Designs\Tefcold\_parsed\Basic_Page.parsed.cshtml:line 575
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @using System.Globalization 2 @using Dynamicweb 3 @using Dynamicweb.Content 4 @using Dynamicweb.Frontend; 5 @using Dynamicweb.Security.UserManagement 6 @using NLWI.Core.Factory 7 @using NORRIQ.SalesPersonLogin.Services 8 @using Dynamicweb.Ecommerce.International 9 @using Tefcold.Web.CustomCode.Extensions 10 @using Tefcold.Web.CustomCode.Items.Properties 11 @using Tefcold.Web.CustomCode.Items.Settings 12 @using Tefcold.Web.CustomCode.LanguageSwitch 13 @using Tefcold.Web.CustomCode.Razor 14 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 15 @{ 16 //Heine: Understående kan bruges såfremt der skal tjekkes på om man er i impersonation mode: 17 var isImpersonating = ImpersonationService.IsCurrentlyImpersonating(); 18 var locationName = Pageview.User?.Name; 19 var websiteSettings = Pageview.Area.Item.ToCodeFirstItem<Websites>(); 20 LanguageService languageService = new LanguageService(); 21 var languagesJson = Newtonsoft.Json.JsonConvert.SerializeObject(languageService.GetLanguages()); 22 } 23 24 <!DOCTYPE html> 25 <html lang="@Pageview.Area.Culture"> 26 <head> 27 <meta charset='utf-8' /> 28 <meta name="description" content="@Model.Description" /> 29 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, shrink-to-fit=no" /> 30 <meta http-equiv="x-ua-compatible" content="ie=edge"> 31 @if (Model.Area.Item.GetBoolean("NoIndex")) 32 { 33 <!-- TODO: remove on launch--> 34 <meta name="robots" content="noindex, nofollow" /> 35 } 36 37 @if (!string.IsNullOrWhiteSpace(websiteSettings.HeaderScript)) 38 { 39 @websiteSettings.HeaderScript 40 } 41 42 @if (!string.IsNullOrWhiteSpace(websiteSettings.GoogleTagManagerId)) 43 { 44 <script> 45 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 46 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 47 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 48 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 49 })(window,document,'script','dataLayer','@websiteSettings.GoogleTagManagerId'); 50 </script> 51 } 52 53 <title>@Model.Title</title> 54 @Model.MetaTags 55 @if (Model.Area.Item.GetFile("Icon") != null) 56 { 57 <link href="@Model.Area.Item.GetFile("Icon").Path" rel="icon" type="image/png"> 58 } 59 <link rel="preload" href="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/css/Tefcold-min.css")" as="style" /> 60 <link rel="stylesheet" async href="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/css/Tefcold-min.css")" /> 61 @*<link href="/Files/dist/css/Tefcold-min.css" rel="stylesheet" />*@ 62 </head> 63 <body> 64 @if (!string.IsNullOrWhiteSpace(websiteSettings.GoogleTagManagerId)) 65 { 66 <!-- Google Tag Manager (noscript) --> 67 <noscript> 68 <iframe src="https://www.googletagmanager.com/ns.html?id=@websiteSettings.GoogleTagManagerId" 69 height="0" width="0" style="display: none; visibility: hidden"></iframe> 70 </noscript> 71 <!-- End Google Tag Manager (noscript) --> 72 } 73 <div id="app"> 74 @{ 75 string basicNavbarPrefix = "Header "; 76 var logo = Model.Area.Item.GetFile("Logo"); 77 var currencyCode = Pageview.User?.Currency ?? Pageview.Area.EcomCurrencyId; 78 } 79 <header class="basic_navbar@(websiteSettings.EcomNav ? " has-groupsnavbar":"")" id="header"> 80 @if (isImpersonating) 81 { 82 <div class="impersonation-bar"> 83 <div class="basic_navbar-container"> 84 <p> 85 @Translate(basicNavbarPrefix + "debitor", "Debitor"): <b>@locationName</b> | <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("impersonation-choose-customer")?action=changeuser">@Translate("Change customer")</a> 86 </p> 87 </div> 88 </div> 89 } 90 <div class="basic_navbar-main"> 91 <div class="basic_navbar-container"> 92 <a href="/" class="basic_navbar-logo" title="@Translate(basicNavbarPrefix + "Go to frontpage", "Go to frontpage")"> 93 @if (logo != null) 94 { 95 <img class="img-fluid" src="@logo.Path" alt="@Translate(basicNavbarPrefix + "Website Logo Alttext", "Website Logo Alttext")" /> 96 } 97 else 98 { 99 <i>@Translate(basicNavbarPrefix + "No logo found", "No logo found, please configure it in the Dynamicweb Administration")</i> 100 } 101 </a> 102 <collapse-hack inline-template> 103 <b-collapse class="basic_navbar-navigation" id="basic_navigation" tag="@(websiteSettings.EcomNav ? "div" : "nav")"> 104 @if (!websiteSettings.EcomNav) 105 { 106 @RenderNavigation(new { Template = "basic_navbar.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4 }) 107 } 108 else 109 { 110 @RenderNavigation(new { Template = "basic_navbar-extreme.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4 }) 111 } 112 <ul class="basic_navbar-subnav"> 113 <li> 114 <button type="button" 115 v-b-toggle.languages 116 aria-label="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")" 117 title="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")"> 118 <img src="@Pageview.Area.Flag32X32" alt="@Pageview.Area.CultureInfo.EnglishName" /> 119 <span class="sr-only">@Pageview.Area.CultureInfo.EnglishName</span> 120 </button> 121 </li> 122 <li> 123 <button v-b-toggle.contacts 124 type="button" 125 aria-label="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")" 126 title="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")"> 127 <svg> 128 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 129 </svg> 130 <span class="sr-only">@Translate(basicNavbarPrefix + "Contacts", "Contacts")</span> 131 </button> 132 </li> 133 <li> 134 <button v-b-toggle.customer-center 135 type="button" 136 aria-label="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")" 137 title="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")"> 138 @if (Pageview.User == null) 139 { 140 <svg> 141 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user"></use> 142 </svg> 143 } 144 else 145 { 146 <svg style="width: 30px; height: 30px;"> 147 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user-check"></use> 148 </svg> 149 } 150 <span class="sr-only">@Translate(basicNavbarPrefix + "Login", "Login")</span> 151 </button> 152 </li> 153 @if (Pageview.User != null) 154 { 155 <li> 156 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("quickorder")" title="@Translate(basicNavbarPrefix + "Quickorder", "Quickorder")"> 157 <svg width="28px" height="28px"> 158 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#quickorder"></use> 159 </svg> 160 <span class="sr-only">@Translate(basicNavbarPrefix + "Quickorder", "Quickorder")</span> 161 </a> 162 </li> 163 } 164 @if (Pageview.User != null && Pageview.User.AllowMediaBank()) 165 { 166 @*<media-bank inline-template> 167 <li> 168 <form id="mediabankform" action="https://imagebank.tefcold.com/Home/LoginUser" method="post"> 169 <input id="mediabankformname" type="hidden" name="username" /> 170 <input id="mediabankformpassword" type="hidden" name="password" /> 171 <input type="hidden" value="false" name="persistent" /> 172 </form> 173 <a v-on:click="connect($event)" href="#" title="@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")"> 174 <svg width="28px" height="28px" fill="currentColor"> 175 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 176 </svg> 177 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 178 </a> 179 </li> 180 </media-bank>*@ 181 <li> 182 <a href="@Translate(basicNavbarPrefix + "Mediabank Link", "http://media.tefcold.com")" target="_blank" title="@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")"> 183 <svg width="28px" height="28px" fill="currentColor"> 184 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 185 </svg> 186 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 187 </a> 188 </li> 189 } 190 <li> 191 <button type="button" 192 class="btn-close" 193 @@click="collapseAll" 194 aria-label="@Translate(basicNavbarPrefix + "Close Navigation", "Close Navigation")" 195 title="@Translate(basicNavbarPrefix + "Close Navigation", "Close Navigation")"> 196 <span></span> 197 <span></span> 198 </button> 199 </li> 200 </ul> 201 </b-collapse> 202 </collapse-hack> 203 @if (websiteSettings.SearchAheadActivated) 204 { 205 <instant-search base-class="basic_navbar-search" :min-search-length="@websiteSettings.KeyStrokes" :number-of-hits="@websiteSettings.SearchHits" :product-search-paragraph-id="@websiteSettings.ProductSearchParagraphId" 206 :content-search-paragraph-id="@websiteSettings.ContentSearchParagraphId"></instant-search> 207 } 208 else 209 { 210 211 <form class="basic_navbar-search" action="/Default.aspx"> 212 <search-shortcut inline-template> 213 <div style="display: none"></div> 214 </search-shortcut> 215 <label for="productsearch">Search</label> 216 <input name="ID" type="hidden" value="@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("searchresult")"> 217 <input name="PageSize" type="hidden" value="99" /> 218 <input type="search" placeholder="@Translate(basicNavbarPrefix + "Search", "Search")" id="productsearch" name="productsearch"> 219 <button type="submit"> 220 <span class="sr-only">@Translate(basicNavbarPrefix + "Search", "Search")</span> 221 <svg> 222 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#search"></use> 223 </svg> 224 </button> 225 </form> 226 } 227 228 <ul class="basic_navbar-functions"> 229 <li class="basic_navbar-languages relative"> 230 <button type="button" v-b-toggle.languages aria-label="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")" title="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")"> 231 <span class="sr-only">@Pageview.Area.CultureInfo.EnglishName</span> 232 @if (Pageview.Area.Culture == "en-GB") 233 { 234 <img src="/Files/Images/globe-flag.png" alt="@Pageview.Area.Culture - Flag" width="32" height="32" /> 235 } 236 else 237 { 238 <img src="@Pageview.Area.Flag32X32" alt="@Pageview.Area.Culture - Flag" width="32" height="32" /> 239 } 240 @*@if (Pageview.Area.Culture == "en-GB") 241 { 242 <svg width="32" height="32" fill="currentColor"> 243 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#globe"></use> 244 </svg> 245 } 246 else 247 { 248 <img src="@Pageview.Area.Flag32X32" alt="@Pageview.Area.Culture - Flag" /> 249 }*@ 250 </button> 251 <b-collapse id="languages" class="basic_navbar-dropdown" accordion="header" v-auto-close> 252 <div class="basic_navbar-body languages-dropdown"> 253 <ul class="master-area"> 254 <li class="head"> 255 @if (Pageview.AreaID == 12 || Pageview.AreaID == 13) 256 { 257 <strong>@Translate(basicNavbarPrefix + "Tefcold Cz Languages", "TEFCOLD CZ s.r.o.")</strong> 258 } 259 else 260 { 261 <strong>@Translate(basicNavbarPrefix + "Tefcol Group Languages", "TEFCOLD A/S")</strong> 262 } 263 </li> 264 @foreach (var lang in Model.Languages) 265 { 266 @RenderLanguage(lang) 267 } 268 </ul> 269 <ul class="sub-area"> 270 271 @foreach (var masterArea in Dynamicweb.Services.Areas.GetMasterAreas().Where(a => !Model.Languages.Any(s => a.ID == s.ID))) 272 { 273 <li class="head"> 274 @if (Pageview.AreaID == 12 || Pageview.AreaID == 13) 275 { 276 <strong>@Translate(basicNavbarPrefix + "Tefcol Group Languages", "TEFCOLD A/S")</strong> 277 } 278 else 279 { 280 <strong>@Translate(basicNavbarPrefix + "Tefcold Cz Languages", "TEFCOLD CZ s.r.o.")</strong> 281 } 282 </li> 283 if (Pageview.AreaID != masterArea.ID) 284 { 285 <li class="@masterArea.ID"> 286 @renderArea(masterArea, websiteSettings) 287 </li> 288 } 289 foreach (var lang in masterArea.Languages.Where(s => s.Active && s.ID != Pageview.AreaID)) 290 { 291 <li class="is-lang"> 292 @renderArea(lang, websiteSettings) 293 </li> 294 } 295 } 296 297 </ul> 298 <ul class="uk-area"> 299 <li class="head"><strong>@Translate(basicNavbarPrefix + "Tefcol UK Languages", "TEFCOLD UK")</strong></li> 300 <li> 301 <a href="@Translate(basicNavbarPrefix + "Tefcold UK Url", "//tefcold.co.uk")" target="_blank"> 302 303 <img src="/Admin/Images/Flags/flag_GB.png" alt="en-GB - Flag" loading="lazy" /> 304 <span>@Translate(basicNavbarPrefix + "Tefcold UK Label", "tefcold.co.uk")</span> 305 </a> 306 </li> 307 </ul> 308 </div> 309 </b-collapse> 310 </li> 311 <li class="basic_navbar-contacts @(Pageview.User != null ? "static" : "relative")"> 312 <button v-b-toggle.contacts 313 type="button" 314 aria-label="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")" 315 title="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")"> 316 <svg> 317 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 318 </svg> 319 <span class="sr-only">@Translate(basicNavbarPrefix + "Contacts", "Contacts")</span> 320 </button> 321 @{ 322 var impersonationGroupId = websiteSettings.ImpersonationGroup.FirstOrDefault(); 323 IEnumerable<User> users = null; 324 IEnumerable<User> salesPersons = new List<User>(); 325 if (Pageview.User != null) 326 { 327 var salesPersonCode = Pageview.User.CustomFieldValues.FirstOrDefault(field => field.CustomField.Name == "Sales Person Code"); 328 var salesPersonsInitials = salesPersonCode?.Value?.ToString().Split(',') ?? new string[] { }; 329 salesPersonsInitials = salesPersonsInitials.Select(x => x.ToLower()).ToArray(); 330 331 if (!string.IsNullOrEmpty(impersonationGroupId)) 332 { 333 users = Group.GetGroupByID(int.Parse(impersonationGroupId)).Users; 334 } 335 if (users == null || Pageview.User == null) 336 { 337 salesPersons = new List<User>(); 338 } 339 else 340 { 341 salesPersons = users.Where(user => salesPersonsInitials.Contains(user.Email.ToLower().Split('@').FirstOrDefault() ?? "")); 342 } 343 } 344 345 } 346 <b-collapse id="contacts" class="@(Pageview.User != null ? "basic_navbar-megamenu" : "basic_navbar-dropdown")" v-auto-close accordion="header"> 347 <div class="basic_navbar-body"> 348 @if (Pageview.User != null) 349 { 350 if (salesPersons.Any()) 351 { 352 <p class="tefcold_salesperson-byline h1">@Translate(basicNavbarPrefix + "Your Sales Team", "Your Sales Team")</p> 353 } 354 foreach (var salesPerson in salesPersons) 355 { 356 <div class="tefcold_salesperson" itemscope itemtype="http://schema.org/Person"> 357 <figure> 358 <img src="@salesPerson.Image" class="img-fluid" alt="@salesPerson.Name" itemprop="image" loading="lazy" /> 359 </figure> 360 <p itemprop="name">@salesPerson.Name</p> 361 <p itemprop="jobTitle">@salesPerson.JobTitle</p> 362 <p itemprop="telephone"> 363 <svg> 364 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 365 </svg> 366 <span>@salesPerson.PhonePrivate</span> 367 </p> 368 <p itemprop="telephone"> 369 <svg> 370 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#mobile-alt"></use> 371 </svg> 372 <span>@salesPerson.PhoneMobile</span> 373 </p> 374 <a href="@("mailto:" + @salesPerson.Email)" itemprop="email"> 375 <svg> 376 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#envelope"></use> 377 </svg> 378 <span>@salesPerson.Email</span> 379 </a> 380 </div> 381 } 382 } 383 <ul> 384 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("PhoneLabel")) 385 && !string.IsNullOrEmpty(Model.Area.Item.GetString("Phonenumber"))) 386 { 387 <li class="head"> 388 <strong> 389 @Model.Area.Item.GetString("PhoneLabel") 390 </strong> 391 <strong> 392 @Model.Area.Item.GetString("Phonenumber") 393 </strong> 394 </li> 395 } 396 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("ContactPage")) 397 && !string.IsNullOrEmpty(Model.Area.Item.GetString("ContactLabel"))) 398 { 399 <li> 400 <a href="@Model.Area.Item.GetString("ContactPage")"> 401 @Model.Area.Item.GetString("ContactLabel") 402 </a> 403 </li> 404 } 405 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("SalesPage")) 406 && !string.IsNullOrEmpty(Model.Area.Item.GetString("SalesLabel"))) 407 { 408 <li> 409 <a href="@Model.Area.Item.GetString("SalesPage")"> 410 @Model.Area.Item.GetString("SalesLabel") 411 </a> 412 </li> 413 } 414 </ul> 415 416 </div> 417 </b-collapse> 418 </li> 419 <li class="basic_navbar-user"> 420 <button v-b-toggle.customer-center type="button" aria-label="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")" title="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")"> 421 @if (Pageview.User == null) 422 { 423 <svg> 424 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user"></use> 425 </svg> 426 } 427 else 428 { 429 <svg style="width: 30px; height: 30px;"> 430 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user-check"></use> 431 </svg> 432 } 433 <span class="sr-only">@Translate(basicNavbarPrefix + "Login", "Login")</span> 434 </button> 435 436 437 <b-collapse id="customer-center" class="basic_navbar-dropdown" accordion="header" v-auto-close> 438 <div class="basic_navbar-body"> 439 @if (Pageview.User == null) 440 { 441 <head-login-form inline-template> 442 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" v-on:submit="submitLogin"> 443 <p> 444 <strong> 445 @Translate(basicNavbarPrefix + "Webshop Login", "Webshop Login") 446 </strong> 447 </p> 448 <input type="hidden" name="ID" id="ID" value="" /> 449 <div class="form-group"> 450 <label for="Username">@Translate(basicNavbarPrefix + "Username", "Username")</label> 451 <input id="Username" v-model="username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 452 </div> 453 <div class="form-group"> 454 <label for="Password">@Translate(basicNavbarPrefix + "Password", "Password")</label> 455 <input id="Password" v-model="password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 456 </div> 457 <div v-if="loginFailed"> 458 <p class="alert alert-warning"> 459 @Translate("Login failed", "Invalid credentials") 460 </p> 461 </div> 462 <div class="basic_login-buttons"> 463 <button type="submit" role="button" class="btn btn-primary btn-block" v-bind:class='{"loading": loading}' v-on:click="loading=true" id="loginBtn"> 464 @Translate(basicNavbarPrefix + "Login", "Login") 465 </button> 466 </div> 467 </form> 468 </head-login-form> 469 <ul> 470 <li> 471 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("forgotpassword")&amp;LoginAction=Recovery"> 472 @Translate(basicNavbarPrefix + "Forgot password", "Forgot password") 473 </a> 474 </li> 475 <li> 476 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("contact")"> 477 @Translate(basicNavbarPrefix + "Create Webshop Account", "Create Webshop Account") 478 </a> 479 </li> 480 </ul> 481 } 482 else 483 { 484 <div class="active-user"> 485 <p><strong>@Pageview.User.Name</strong></p> 486 <p> 487 <a v-clear-cache:click.user href='/admin/public/extranetlogoff.aspx?ID=@(NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("home"))'> 488 @Translate(basicNavbarPrefix + "Sign out", "Sign out") 489 </a> 490 </p> 491 </div> 492 @RenderNavigation(new { Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = "customer-portal" }) 493 } 494 </div> 495 </b-collapse> 496 </li> 497 @if (Pageview.User != null && Pageview.User.AllowMediaBank()) 498 { 499 @*<media-bank inline-template> 500 <li> 501 <form id="mediabankform" action="https://imagebank.tefcold.com/Home/LoginUser" method="post"> 502 <input id="mediabankformname" type="hidden" name="username" /> 503 <input id="mediabankformpassword" type="hidden" name="password" /> 504 <input type="hidden" value="false" name="persistent" /> 505 </form> 506 <a v-on:click="connect($event)" href="#" title="@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")"> 507 <svg width="28px" height="28px" fill="currentColor"> 508 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 509 </svg> 510 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 511 </a> 512 </li> 513 </media-bank>*@ 514 <li> 515 <a href="@Translate(basicNavbarPrefix + "Mediabank Link", "http://media.tefcold.com")" target="_blank" title="@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")"> 516 <svg width="28px" height="28px" fill="currentColor"> 517 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 518 </svg> 519 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 520 </a> 521 </li> 522 523 } 524 @if (Pageview.User != null) 525 { 526 <li class="basic_navbar-quick"> 527 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("quickorder")" title="@Translate(basicNavbarPrefix + "Quickorder", "Quickorder")"> 528 <svg width="28px" height="28px"> 529 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#quickorder"></use> 530 </svg> 531 <span class="sr-only">@Translate(basicNavbarPrefix + "Quickorder", "Quickorder")</span> 532 </a> 533 </li> 534 } 535 @if (websiteSettings.b2cshopping || Pageview.User != null) 536 { 537 <cart-icon cartlink="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("checkout")"></cart-icon> 538 } 539 <li class="basic_navbar-toggle"> 540 <button type="button" 541 aria-label="@Translate(basicNavbarPrefix + "Open main navigation", "Open main navigation")" 542 title="@Translate(basicNavbarPrefix + "Open main navigation", "Open main navigation")" 543 v-b-toggle.basic_navigation> 544 <svg width="28px" height="28px"> 545 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#bars"></use> 546 </svg> 547 <span class="sr-only">@Translate(basicNavbarPrefix + "Open main navigation", "Open main navigation")</span> 548 </button> 549 </li> 550 </ul> 551 552 </div> 553 </div> 554 </header> 555 @using Dynamicweb.Frontend; 556 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 557 558 @Title("Page") 559 @Description("Default page template") 560 @{ 561 string basicPagePrefix = "Page "; 562 } 563 @if (Pageview.IsCurrentUserAllowed) 564 { 565 var pageLayout = !string.IsNullOrEmpty(Model.Item.GetValue<ListViewModel>("Layout").SelectedValue) ? Model.Item.GetValue<ListViewModel>("Layout").SelectedValue : "content-page-sidebar"; 566 var pageClass = pageLayout == "page-wide" ? "basic_page-wide" : "basic_page"; 567 if (!Model.Item.GetBoolean("HideBreadcrumb")) 568 { 569 if (Model.Area.Item.GetFile("TopImage") != null) 570 { 571 <figure> 572 <img src="/Admin/Public/GetImage.ashx?Height=200&amp;Compression=85&amp;Crop=6&amp;Image=@Model.Area.Item.GetFile("TopImage").Path" class="img-fluid" alt="webbanner" /> 573 </figure> 574 } 575 @RenderNavigation(new { Template = "basic_Breadcrumb.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 5 }) 576 } 577 <main class="@pageClass"> 578 @if (pageLayout == "content-page-sidebar" || pageLayout == "module-page-sidebar") 579 { 580 <aside class="basic_page-sidebar"> 581 @RenderNavigation(new { Template = "basic_Page.xslt", StartLevel = 1, EndLevel = 3 }) 582 </aside> 583 <div class="basic_page-content"> 584 @if (pageLayout == "content-page-sidebar" && !string.IsNullOrEmpty(Model.Item.GetString("Title").ToString()) || !string.IsNullOrEmpty(Model.Item.GetString("Text").ToString())) 585 { 586 <section class="basic_paragraph"> 587 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title").ToString())) 588 { 589 <header> 590 <h1> 591 @Model.Item.GetString("Title") 592 </h1> 593 </header> 594 } 595 @if (Model.Item.GetFile("Image") != null) 596 { 597 <figure> 598 <img src="@Model.Item.GetFile("Image").Path" alt="@Model.Item.GetString("Title")" class="img-fluid" /> 599 </figure> 600 } 601 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text").ToString())) 602 { 603 @Model.Item.GetString("Text") 604 } 605 </section> 606 } 607 @RenderPlaceholder() 608 </div> 609 } 610 else 611 { 612 @RenderPlaceholder() 613 } 614 </main> 615 } 616 else 617 { 618 <main class="basic_page"> 619 @RenderPlaceholder() 620 </main> 621 } 622 @helper RenderPlaceholder() 623 { 624 @Model.Placeholder("Content", "Content", "unwrap:true;default:true") 625 if (!String.IsNullOrEmpty(Model.Placeholder("Boxed"))) 626 { 627 <div class="grouped"> 628 @Model.Placeholder("Boxed", "Grouped Content", "unwrap:true") 629 </div> 630 } 631 } 632 633 @{ 634 string footerPrefix = "Footer "; 635 } 636 <footer class="basic_footer"> 637 <div class="basic_footer-wrap basic_footer-main"> 638 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterOneTitle")) && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterOneText"))) 639 { 640 <div class="basic_footer-box"> 641 <div class="basic_footer-head" role="button" v-b-toggle.footer-one> 642 <h3>@Model.Area.Item.GetString("FooterOneTitle")</h3> 643 </div> 644 <b-collapse id="footer-one" class="basic_footer-collapse"> 645 <div class="basic_footer-body"> 646 @Model.Area.Item.GetString("FooterOneText") 647 </div> 648 </b-collapse> 649 </div> 650 } 651 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTitle")) 652 && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoText")) 653 || !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTag"))) 654 { 655 <div class="basic_footer-box"> 656 <div class="basic_footer-head" role="button" v-b-toggle.footer-two> 657 <h3>@Model.Area.Item.GetString("FooterTwoTitle")</h3> 658 </div> 659 <b-collapse id="footer-two" class="basic_footer-collapse"> 660 <div class="basic_footer-body"> 661 @Model.Area.Item.GetString("FooterTwoText") 662 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTag"))) 663 { 664 @RenderNavigation(new { Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = @Model.Area.Item.GetString("FooterTwoTag").ToString() }) 665 } 666 </div> 667 </b-collapse> 668 </div> 669 } 670 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTitle")) 671 && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeText")) 672 || !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTag"))) 673 { 674 <div class="basic_footer-box"> 675 <div class="basic_footer-head" role="button" v-b-toggle.footer-three> 676 <h3>@Model.Area.Item.GetString("FooterThreeTitle")</h3> 677 </div> 678 <b-collapse id="footer-three" class="basic_footer-collapse"> 679 <div class="basic_footer-body"> 680 @Model.Area.Item.GetString("FooterThreeText") 681 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTag"))) 682 { 683 @RenderNavigation(new { Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = @Model.Area.Item.GetString("FooterThreeTag").ToString() }) 684 } 685 </div> 686 </b-collapse> 687 </div> 688 } 689 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterFourTitle")) && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterFourText"))) 690 { 691 <div class="basic_footer-box"> 692 <div class="basic_footer-head" role="button" v-b-toggle.footer-four> 693 <h3>@Model.Area.Item.GetString("FooterFourTitle")</h3> 694 </div> 695 <b-collapse id="footer-four" class="basic_footer-collapse"> 696 <div class="basic_footer-body"> 697 @Model.Area.Item.GetString("FooterFourText") 698 </div> 699 </b-collapse> 700 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FacebookUrl")) 701 || !string.IsNullOrEmpty(Model.Area.Item.GetString("LinkedInUrl")) 702 || !string.IsNullOrEmpty(Model.Area.Item.GetString("YoutubeUrl"))) 703 { 704 <div class="some"> 705 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FacebookUrl"))) 706 { 707 <a href="@Model.Area.Item.GetString("FacebookUrl")" target="_blank" aria-label="Facebook" rel="noreferrer"> 708 <svg> 709 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#facebook-square"></use> 710 </svg> 711 </a> 712 } 713 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("LinkedInUrl"))) 714 { 715 <a href="@Model.Area.Item.GetString("LinkedInUrl")" target="_blank" aria-label="LinkedIn" rel="noreferrer"> 716 <svg> 717 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#linkedin"></use> 718 </svg> 719 </a> 720 } 721 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("YoutubeUrl"))) 722 { 723 <a href="@Model.Area.Item.GetString("YoutubeUrl")" target="_blank" aria-label="Youtube" rel="noreferrer"> 724 <svg> 725 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#youtube-square"></use> 726 </svg> 727 </a> 728 } 729 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("SmileyUrl"))) 730 { 731 <a href="@Model.Area.Item.GetString("SmileyUrl")" target="_blank" aria-label="@Translate(footerPrefix + "smiley", "Elite Smiley")" rel="noreferrer"> 732 <svg> 733 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#happy-smiley"></use> 734 </svg> 735 </a> 736 } 737 </div> 738 } 739 </div> 740 } 741 </div> 742 @if (Model.Area.Item.GetFile("GroupLogo") != null) 743 { 744 <div class="basic_footer-group"> 745 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("GroupLogo"))) 746 { 747 <a href="@Model.Area.Item.GetString("GroupLink")" target="_blank" title="@Translate(footerPrefix + "tefcold group logo alt", "Part of Tefcold Group")"> 748 <img src="@Model.Area.Item.GetFile("GroupLogo").Path" class="img-fluid" alt="@Translate(footerPrefix + "tefcold group logo alt", "Part of Tefcold Group")" /> 749 </a> 750 } 751 else 752 { 753 <img src="@Model.Area.Item.GetFile("GroupLogo").Path" class="img-fluid" alt="@Translate(footerPrefix + "tefcold group logo alt", "Part of Tefcold Group")" /> 754 } 755 </div> 756 } 757 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterCopyright"))) 758 { 759 760 <div class="basic_footer-sub"> 761 <div class="basic_footer-wrap"> 762 763 <p> 764 &copy; @DateTime.Now.Year @Model.Area.Item.GetString("FooterCopyright") 765 </p> 766 @RenderNavigation(new { Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = "footer" }) 767 768 @if (Model.Area.Item.GetValue<ListViewModel>("Cards").SelectedValues.Any()) 769 { 770 <div class="text-center cards"> 771 @foreach (var cards in Model.Area.Item.GetValue<ListViewModel>("Cards").SelectedValues) 772 { 773 <img src="/Files/Images/cards/@cards" alt="@cards.Split('.').First()" loading="lazy" /> 774 } 775 </div> 776 } 777 778 </div> 779 </div> 780 } 781 </footer> 782 <compare-banner class="comparison-footer" inline-template> 783 <div v-if="productsToCompare >= 1" class="comparison-footer"> 784 @{ 785 string comparisonFooterPrefix = "Comparison "; 786 } 787 <template v-if="productsToCompare >= 2"> 788 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("compare")" class="btn btn-primary btn-lg btn-block"> 789 <svg class="icon"> 790 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#balance-scale"></use> 791 </svg> 792 <span> 793 @Translate(comparisonFooterPrefix + "Click to compare", "Click to compare") 794 <strong>{{productsToCompare}}</strong> 795 @Translate(comparisonFooterPrefix + "products", "products") 796 </span> 797 </a> 798 </template> 799 <template v-else> 800 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("compare")" class="btn btn-primary btn-lg btn-block no-click"> 801 <svg class="icon"> 802 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#balance-scale"></use> 803 </svg> 804 <span> 805 @Translate(comparisonFooterPrefix + "You need 2 product to compare", "You need <strong>2</strong> products to compare") 806 </span> 807 </a> 808 </template> 809 </div> 810 </compare-banner> 811 <basic-alert inline-template alertmessage='@Translate("Internet Explore Alert Message", "Website does not work properly on Internet Explorer, change browser for optimal user experience")' sessionstoragekey='IEHasBeenAlert'> 812 <div></div> 813 </basic-alert> 814 </div> 815 816 @helper RenderLanguage(PageLanguageViewModel lang) 817 { 818 if (Pageview.AreaID == lang.ID) 819 { 820 return; 821 822 } 823 824 if (Pageview.AreaID == lang.ID) 825 { 826 return; 827 828 } 829 830 var langCode = lang.Culture.Split('-').Last(); 831 var cultureInfo = CultureInfo.GetCultureInfo(lang.Culture); 832 var language = cultureInfo.NativeName.Split('(')[0]; 833 var url = SearchEngineFriendlyURLs.GetFriendlyUrl(lang.Page.ID); 834 var query = System.Web.HttpUtility.ParseQueryString(System.Web.HttpContext.Current.Request.QueryString.ToString()); 835 var allowedQuery = new HashSet<string> { "groupid", "productid", "variantid" }; 836 var shopIdSplit = "-at-SHOP"; 837 var shopId = Services.Pages.GetPage(lang.Page.ID).Area.EcomShopId; 838 foreach (var kv in query.AllKeys) 839 { 840 if (kv != null && allowedQuery.Contains(kv.ToLower())) 841 { 842 var queryValue = query[kv]; 843 var indexOfShopId = queryValue.IndexOf(shopIdSplit, StringComparison.InvariantCultureIgnoreCase); 844 if (indexOfShopId > 0) 845 { 846 var withOutShopId = queryValue.Substring(0, indexOfShopId); 847 query[kv] = withOutShopId + "-at-" + shopId; 848 } 849 } 850 else 851 { 852 query.Remove(kv); 853 } 854 } 855 856 857 var langArea = Dynamicweb.Services.Areas.GetArea(lang.ID); 858 var protocol = langArea.SslMode == 2 ? "https:" : "http"; 859 var host = lang.PrimaryDomain; 860 861 if (string.IsNullOrWhiteSpace(host)) 862 { 863 var domains = langArea.Domain.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()); 864 host = (domains.FirstOrDefault(s => !s.Equals("localhost")) ?? "").TrimEnd('/'); 865 } 866 var urlencodedQuery = $"{protocol}://{host}{url}{(query.HasKeys() ? "?" + query.ToString() : "")}"; 867 868 <li> 869 <a href="@urlencodedQuery"> 870 @if (lang.Culture == "en-GB") 871 { 872 <img src="/Files/Images/globe-flag.png" alt="@lang.Culture - Flag" width="32" height="32" loading="lazy" /> 873 } 874 else 875 { 876 <img src="/Admin/Images/Flags/flag_@(langCode).png" alt="@lang.Culture - Flag" width="32" height="32" loading="lazy" /> 877 } 878 @*@if (lang.Culture == "en-GB") 879 { 880 <svg width="32" height="32" fill="#3a3b3c"> 881 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#globe"></use> 882 </svg> 883 } 884 else 885 { 886 <img src="/Admin/Images/Flags/flag_@(langCode).png" alt="@lang.Culture - Flag" loading="lazy" /> 887 }*@ 888 <span>@Translate("lang_" + lang.Culture.Split('-').First(), lang.Culture.Split('-').First())</span> 889 </a> 890 </li> 891 } 892 893 894 @helper renderArea(Area lang, Websites websiteSettings) 895 { 896 var protocol = lang.SslMode == 2 ? "https:" : "http"; 897 var host = lang.DomainLock; 898 string countryCode = lang.Culture.Split('-').Last(); 899 if (string.IsNullOrWhiteSpace(host)) 900 { 901 var domains = lang.Domain.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()); 902 host = (domains.FirstOrDefault(s => !s.Equals("localhost")) ?? "").TrimEnd('/'); 903 } 904 var langUrl = $"{protocol}://{host}"; 905 var langSettings = lang.Item.ToCodeFirstItem<Websites>(); 906 if (langSettings.NoIndex && !websiteSettings.NoIndex) 907 { 908 var pageId = NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag(countryCode + "Redirect"); 909 langUrl = pageId > 0 ? $"/Default.aspx?ID={pageId}" : ""; 910 } 911 <a href="@langUrl"> 912 @if (lang.Culture == "en-GB") 913 { 914 <img src="/Files/Images/globe-flag.png" alt="@lang.Culture - Flag" width="32" height="32" class="img-fluid" loading="lazy" /> 915 } 916 else 917 { 918 <img src="/Admin/Images/Flags/flag_@(countryCode).png" alt="@lang.Culture - Flag" width="32" height="32" class="img-fluid" loading="lazy" /> 919 } 920 <span>@Translate("lang_" + lang.Culture.Split('-').First(), lang.Culture.Split('-').First())</span> 921 </a> 922 923 } 924 925 <script type="text/x-template" id="cart-icon-template"> 926 @{ 927 string cartIconPrefix = "Minicart "; 928 } 929 <li> 930 <a :href="cartlink" title="@Translate(cartIconPrefix + "Checkout", "Checkout")"> 931 <svg> 932 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#shopping-cart"></use> 933 </svg> 934 <span class="label">@Translate(cartIconPrefix + "Checkout", "Checkout")</span> 935 <strong v-if="!cartEmpty" class="cart-quantity">{{quantity}}</strong> 936 </a> 937 </li> 938 </script> 939 940 941 942 <script type="text/x-template" id="basic-facet-filter-template"> 943 @{ 944 string basicFacetPrefix = "Filter "; 945 } 946 <aside> 947 <template v-if="HasActiveFilter()"> 948 949 <p id="selected-filter-label" class="sr-only"> 950 @Translate(basicFacetPrefix + "Active", "Active") 951 </p> 952 <div class="basic_filter-active" aria-labelledby="selected-filter-label"> 953 <template v-for="facetFilter in facetFilters"> 954 <span v-for="option in SelectedOptions(facetFilter)" class="custom-control custom-filter"> 955 <input type="checkbox" 956 :id="'Selected-' + facetFilter.name + '-' + option.name" 957 :name="facetFilter.name" 958 :value="option.value" 959 :v-model="option.selected" 960 :checked="option.selected" 961 v-on:click="ToggleFilter(facetFilter.name,option)" 962 class="custom-control-input" /> 963 <label :for="'Selected-' + facetFilter.name + '-' + option.name" class="custom-control-label" :data-name="facetFilter.name"> 964 <span> 965 {{option.label}} 966 </span> 967 <svg> 968 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#times"></use> 969 </svg> 970 </label> 971 </span> 972 </template> 973 </div> 974 </template> 975 <b-collapse class="basic_filter" id="sidebar-filter"> 976 <template v-if="!error && facetFilters"> 977 <button type="button" class="btn-close" v-b-toggle.sidebar-filter.sidebar-overlay aria-label="@Translate(basicFacetPrefix + "Close Filter", "Close Filter")"> 978 <span></span> 979 <span></span> 980 </button> 981 <div class="basic_filter-groups"> 982 <div class="basic_filter-group" v-for="(facetFilter, index) in facetFilters"> 983 <p :id="'filter-group-' + facetFilter.name.toLowerCase().trim()" v-b-toggle="'filter-collapse-' + facetFilter.name.toLowerCase().trim()"> 984 <template v-if="facetFilter.name === 'ModelType'"> 985 @Translate(basicFacetPrefix + "ModelType", "Model / Type") 986 </template> 987 <template v-else-if="facetFilter.name === 'DoorType'"> 988 @Translate(basicFacetPrefix + "DoorType", " Door type") 989 </template> 990 <template v-else-if="facetFilter.name === 'ExternalHeight'"> 991 @Translate(basicFacetPrefix + "ExternalHeight", "External Height") (mm) 992 </template> 993 <template v-else-if="facetFilter.name === 'NetVolume'"> 994 @Translate(basicFacetPrefix + "NetVolume", "Net Volume") (l) 995 </template> 996 <template v-else-if="facetFilter.name === 'DoorNumber'"> 997 @Translate(basicFacetPrefix + "DoorNumber", " Number of doors") 998 </template> 999 <template v-else-if="facetFilter.name === 'ExteriorFinish'"> 1000 @Translate(basicFacetPrefix + "ExteriorFinish", "Exterior Finish") 1001 </template> 1002 <template v-else-if="facetFilter.name === 'ExternalWidth'"> 1003 @Translate(basicFacetPrefix + "ExternalWidth", "External Width") (mm) 1004 </template> 1005 <template v-else-if="facetFilter.name === 'GrossVolume'"> 1006 @Translate(basicFacetPrefix + "GrossVolume", "Gross Volume") (l) 1007 </template> 1008 <template v-else-if="facetFilter.name === 'Bottles330'"> 1009 @Translate(basicFacetPrefix + "Bottles330", "Capacity 330ml bottles") 1010 </template> 1011 <template v-else-if="facetFilter.name === 'Bottles500'"> 1012 @Translate(basicFacetPrefix + "Bottles500", "Capacity 500ml bottles") 1013 </template> 1014 <template v-else-if="facetFilter.name === 'Cans330'"> 1015 @Translate(basicFacetPrefix + "Cans330", "Capacity 300ml cans") 1016 </template> 1017 <template v-else-if="facetFilter.name === 'Cans500'"> 1018 @Translate(basicFacetPrefix + "Cans500", "Capacity 500ml cans") 1019 </template> 1020 <template v-else-if="facetFilter.name === 'TemperatureRange'"> 1021 @Translate(basicFacetPrefix + "TemperatureRange", "Temperature Range") 1022 </template> 1023 <template v-else-if="facetFilter.name === 'TemperatureRangeZone2'"> 1024 @Translate(basicFacetPrefix + "TemperatureRangeZone2", "Tempature Range 2") 1025 </template> 1026 <template v-else-if="facetFilter.name === 'ShelfNumber'"> 1027 @Translate(basicFacetPrefix + "ShelfNumber", "Number of shelfs") 1028 </template> 1029 <template v-else-if="facetFilter.name === 'LidType'"> 1030 @Translate(basicFacetPrefix + "LidType", "Lid Type") 1031 </template> 1032 <template v-else-if="facetFilter.name === 'InteriorFinish'"> 1033 @Translate(basicFacetPrefix + "InteriorFinish", "Interior Finish") 1034 </template> 1035 <template v-else-if="facetFilter.name === 'WineBottles750'"> 1036 @Translate(basicFacetPrefix + "WineBottles750", "Capacity 750ml winebottles") 1037 </template> 1038 <template v-else> 1039 {{facetFilter.name}} 1040 </template> 1041 <svg> 1042 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/Files/dist/icons/icons.svg#chevron-up"></use> 1043 </svg> 1044 </p> 1045 <b-collapse :id="'filter-collapse-' + facetFilter.name.toLowerCase().trim()" :visible="ShowGroupIfSelected(facetFilter.options, index)" class="basic_filter-collapsing" :aria-labelledby="'filter-group-' + facetFilter.name.toLowerCase().trim()"> 1046 <template v-if="facetFilter.renderType === 'Range'"> 1047 <basic-range-slider @@change="updateRange(facetFilter,$event)" :min="getMinRange(facetFilter)" :max="getMaxRange(facetFilter)" :init-min="getInitMin(facetFilter)" :init-max="getInitMax(facetFilter)"></basic-range-slider> 1048 </template> 1049 1050 <template v-else-if="facetFilter.optionActiveCount > 5"> 1051 <span v-for="option in facetFilter.options.slice(0, 5)" class="custom-control custom-checkbox facet-option"> 1052 <input type="checkbox" class="custom-control-input" 1053 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 1054 :name="facetFilter.name" 1055 :value="option.value" 1056 :v-model="option.selected" 1057 :checked="option.selected" 1058 v-on:click="ToggleFilter(facetFilter.name,option)" /> 1059 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 1060 {{option.label}} <span class="count">({{option.count}})</span> 1061 </label> 1062 </span> 1063 <b-collapse class="basic_filter-expand" :id="'filter-expand-' + facetFilter.name.toLowerCase().trim()" :visible="ShowMoreIfSelected(facetFilter.options, index)"> 1064 <span v-for="option in facetFilter.options.slice(5)" class="custom-control custom-checkbox facet-option"> 1065 <input type="checkbox" class="custom-control-input" 1066 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 1067 :name="facetFilter.name" 1068 :value="option.value" 1069 :v-model="option.selected" 1070 :checked="option.selected" 1071 v-on:click="ToggleFilter(facetFilter.name,option)" /> 1072 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 1073 {{option.label}} <span class="count">({{option.count}})</span> 1074 </label> 1075 </span> 1076 </b-collapse> 1077 <a v-b-toggle="'filter-expand-' + facetFilter.name.toLowerCase().trim()" class="basic_filter-expanding" v-if="facetFilter.optionActiveCount > 6"> 1078 <span class="show-more">+ @Translate(basicFacetPrefix + "show more", "show more")</span> 1079 <span class="show-less">- @Translate(basicFacetPrefix + "show less", "show less")</span> 1080 </a> 1081 </template> 1082 <template v-else> 1083 <span v-for="option in facetFilter.options" class="custom-control custom-checkbox facet-option"> 1084 <input type="checkbox" class="custom-control-input" 1085 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 1086 :name="facetFilter.name" 1087 :value="option.value" 1088 :v-model="option.selected" 1089 :checked="option.selected" 1090 v-on:click="ToggleFilter(facetFilter.name,option)" /> 1091 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 1092 {{option.label}} <span class="count">({{option.count}})</span> 1093 </label> 1094 </span> 1095 </template> 1096 </b-collapse> 1097 </div> 1098 </div> 1099 </template> 1100 </b-collapse> 1101 </aside> 1102 </script> 1103 <script type="text/x-template" id="add-to-basket-simple-template"> 1104 @{ 1105 string addToBasketSimplePrifix = "BuyButton "; 1106 } 1107 <div class="form-flex" v-if="priceWithoutVat > 0" v-bind:class="[{added: IsAdded}, {adding: IsAdding}, {disabled: !canAdd}]"> 1108 1109 <label for="quantity">@Translate(addToBasketSimplePrifix + "Quantity", "Quantity")</label> 1110 <input class="form-control" type="tel" name="quantity" v-model="quantity" autocomplete="off" onclick="this.setSelectionRange(0, this.value.length)"> 1111 <button :disabled="!canAdd" :class="buttonClass" v-on:click="addToBasketAndResetQuantity()" aria-label="@Translate(addToBasketSimplePrifix + "Add", "Add")"> 1112 <slot> 1113 <svg> 1114 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#shopping-cart"> 1115 </use> 1116 </svg> 1117 <span> 1118 @Translate(addToBasketSimplePrifix + "Add to basket", "Add to basket") 1119 </span> 1120 </slot> 1121 1122 </button> 1123 1124 <span v-if="itemStockLocationState == 5" v-b-tooltip.hover.focus="'@Translate(addToBasketSimplePrifix + "The item is out of stock","The item is out of stock").Replace(System.Environment.NewLine,"").Replace("'","\\'")'" class="addtobasket-help">?</span> 1125 <span v-if="itemStockLocationState == 4" v-b-tooltip.hover.focus="'@Translate(addToBasketSimplePrifix + "cant buy this product info","This product is not available from the currently chosen stock location!").Replace(System.Environment.NewLine,"").Replace("'","\\'")'" class="addtobasket-help">?</span> 1126 <span v-if="itemStockLocationState == 50" v-b-tooltip.hover.focus="'@Translate(addToBasketSimplePrifix + "no stock information available","Could not find any stock information on this product!").Replace(System.Environment.NewLine,"").Replace("'","\\'")'" class="addtobasket-help">?</span> 1127 </div> 1128 </script> 1129 1130 <script type="text/x-template" id="quick-add-template"> 1131 @{ 1132 string quickAddPrifix = "BuyButton "; 1133 } 1134 <div v-bind:class="[{added: IsAdded}, {adding: IsAdding}]"> 1135 <label for="quantity">@Translate(quickAddPrifix + "Quantity", "Quantity")</label> 1136 <input class="form-control" type="number" id="quantity" name="quantity" v-model="quantity" autocomplete="off"> 1137 </div> 1138 </script> 1139 1140 <script type="text/x-template" id="add-to-basket-button-only-template"> 1141 @{ 1142 string addToBasketPrefix = "BuyButton "; 1143 } 1144 <div v-bind:class="[{added: IsAdded}, {adding: IsAdding}]"> 1145 <button :class="buttonClass" v-on:click="addToBasket()"> 1146 <slot> 1147 @Translate(addToBasketPrefix + "Add to basket", "Add to basket") 1148 </slot> 1149 </button> 1150 </div> 1151 </script> 1152 @using Dynamicweb.Frontend 1153 @using Tefcold.Web.CustomCode.Items 1154 @{ 1155 string asyncPrefix = "Async "; 1156 var website = PageView.Current().Area.GetWebsiteSettings(); 1157 } 1158 <script type="text/x-template" id="async-price-template"> 1159 <div :class="classType + (loading ? ' loading' : '') + (hasDiscount ? ' has-discount' : '')"> 1160 <template> 1161 <p :class="classType + '--error'" v-if="error">{{error}}</p> 1162 </template> 1163 <template v-if="!loading"> 1164 <template v-if="!forceAskForPrice && price.netUnitPrice.priceWithoutVat"> 1165 <meta itemprop="price" :content="price.netUnitPrice.priceWithoutVat" /> 1166 <meta itemprop="priceCurrency" content="@(Pageview.User?.Currency ?? Pageview.Area.EcomCurrencyId)" /> 1167 <div class="price-withoutvat"> 1168 <span class="price-label">@Translate(asyncPrefix + "price without vat", "Price without VAT")</span> 1169 <p class="price"> 1170 <span class="unit-price">{{ price.netUnitPrice.priceWithoutVat | currency(price.currencyCode) }}</span> 1171 @if (website.ShowPriceWitVatAndDiscount) 1172 { 1173 <small class="prev-price" v-if="hasDiscount && price.unitPrice.priceWithoutVat">{{ price.unitPrice.priceWithoutVat | currency(price.currencyCode) }}</small> 1174 } 1175 </p> 1176 </div> 1177 1178 @if (website.ShowPriceWitVatAndDiscount) 1179 { 1180 <template v-if="!listView"> 1181 <div class="price-withvat"> 1182 <span class="price-label">@Translate(asyncPrefix + "price with vat", "Price with VAT")</span> 1183 <p class="price"> 1184 <span class="unit-price">{{ price.netUnitPrice.priceWithVat | currency(price.currencyCode) }}</span> 1185 <small class="prev-price" v-if="hasDiscount && !listView && price.unitPrice.priceWithVat">{{ price.unitPrice.priceWithVat | currency(price.currencyCode) }}</small> 1186 </p> 1187 1188 </div> 1189 </template> 1190 } 1191 </template> 1192 <template v-if="!price?.netUnitPrice?.priceWithoutVat || forceAskForPrice"> 1193 <a :href="'mailto:@Translate("Ask for a price EMAIL.","info@tefcold.dk")?subject=' + '@Translate("Ask for a price.")' + ' - ' + product.product.name + ' - ' + product.product.shortDescription + '&body=@Translate("ProductName EMAIL (BODY)", "Produktnavn: ") ' + product.product.name + ' - @Translate("ProductShortName EMAIL (BODY)", "Kort produktnavn: ") ' + product.product.shortDescription" class="btn btn-outline-secondary btn-sm">@Translate("Ask for a price.", "Spørg om pris.")</a> 1194 </template> 1195 </template> 1196 </div> 1197 </script> 1198 <script type="text/x-template" id="pagination-template"> 1199 @{ 1200 string paginationPrefix = "Pagination "; 1201 } 1202 <nav aria-label="@Translate(paginationPrefix + "Productlist pagination", "Productlist pagination")"> 1203 <ul class="pagination"> 1204 <li :class="['page-item', currentPage == 1 ? 'disabled' : '' ]"> 1205 <a class="page-link" v-on:click="togglePrevPage()" aria-label="@Translate(paginationPrefix + "Previous Page", "Previous Page")" v-bind:aria-disabled="currentPage > 1 ? 'true' : null"> 1206 <svg> 1207 <use xmlns:xlink="http://www.w3.org/1999/xlink" 1208 xlink:href="/files/dist/icons/icons.svg#chevron-left"> 1209 </use> 1210 </svg> 1211 </a> 1212 </li> 1213 <template v-if="hasGroupId"> 1214 <li v-if="showPage(n)" v-for="n in totalPages" :key="n" :class="(n == currentPage ? 'page-item active' : 'page-item')"> 1215 <a v-on:click="togglePage(n)" v-bind:aria-current="(n == currentPage ? 'true' : '')" class="page-link"> 1216 {{n}} 1217 </a> 1218 </li> 1219 </template> 1220 <template v-else> 1221 <li class="page-item"> 1222 <span class="page-label"> 1223 {{currentPage}} 1224 </span> 1225 </li> 1226 <li class="page-item"> 1227 <span class="page-label"> 1228 @Translate(paginationPrefix + "of", "of") 1229 </span> 1230 </li> 1231 <li class="page-item"> 1232 <span class="page-label"> 1233 {{totalPages}} 1234 </span> 1235 </li> 1236 </template> 1237 <li :class="'page-item' + (currentPage >= totalPages ? ' disabled' : '')"> 1238 <a v-on:click="toggleNextPage()" aria-label="@Translate(paginationPrefix + "Next Page", "Next Page")" class="page-link" v-bind:aria-disabled="totalPages > currentPage ? 'true' : null"> 1239 <svg class="icon-pagination"> 1240 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#chevron-right"></use> 1241 </svg> 1242 </a> 1243 </li> 1244 </ul> 1245 </nav> 1246 </script> 1247 <script type="text/x-template" id="product-specification-list-view-template"> 1248 <div class="basic_listview-data"> 1249 <template v-if="!isSparePart"> 1250 <p itemprop="description"> 1251 {{ SpecificationHelpers.GetFirstSpecificationValueOrDefault('GrossNetVolume',productSpecifications)}} {{ SpecificationHelpers.GetSpecificationUnit(SpecificationHelpers.GetSpecificationByKey('GrossNetVolume',productSpecifications))}} 1252 <br /> 1253 {{ SpecificationHelpers.GetFirstSpecificationValueOrDefault('ExternalDimensionWeb',productSpecifications)}} 1254 1255 </p> 1256 </template> 1257 <p itemprop="sku">@Translate("PLP No.", "No.") {{productNumber}}</p> 1258 </div> 1259 </script> 1260 @using Tefcold.Web.CustomCode.Extensions 1261 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Ecommerce.ProductCatalog.ProductViewModel> 1262 <script type="text/x-template" id="product-spare-parts-view-template"> 1263 @{ 1264 string basicPimPrefix = "PDP "; 1265 } 1266 <div v-if="sparePartReportExist || hasExplodedDrawing || spareParts.length > 0"> 1267 <button class="btn-collapse" id="spareparts" v-b-toggle.spareparts-list> 1268 @Translate(basicPimPrefix + "spare parts", "Spare Parts") 1269 </button> 1270 <template> 1271 <b-collapse id="spareparts-list" visible accordion="specs2"> 1272 <template> 1273 <div class="body-collapse full pb-0"> 1274 <ul class="basic_pim-spares"> 1275 <template v-if="sparePartReportExist"> 1276 <li> 1277 <a href="#" v-on:click="getSparePartReport($event)" target="_blank"> 1278 <svg> 1279 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 1280 </svg> 1281 @Translate(basicPimPrefix + "spare part list", "Spare part list") 1282 </a> 1283 </li> 1284 </template> 1285 <li v-if="hasExplodedDrawing"> 1286 <a :href="explodedDrawing" target="_blank"> 1287 <svg> 1288 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 1289 </svg> 1290 @Translate(basicPimPrefix + "view exploded drawing of spare parts", "View exploded drawing of spare parts") 1291 </a> 1292 </li> 1293 <li :data-point="spare.product.position" class="basic_pim-spare" v-for="spare in spareParts"> 1294 <div class="head"> 1295 <a href="#" v-on:click="navigateToSpare($event,spare.product.id)" class="name">{{spare.product.productName}}</a> 1296 <p class="sku">{{spare.product.number}}</p> 1297 </div> 1298 1299 @if (Pageview.IsAllowedToShop()) 1300 { 1301 <div class="foot"> 1302 <async-price class-type="asyncprice-spare" 1303 :product="spare" 1304 :default-price="spare.product.price" 1305 list-price="true" 1306 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1307 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1308 1309 </async-price> 1310 <add-to-basket-simple :product="spare" 1311 :unit-of-measure="'PCS'" 1312 :sparepart-location="sparepartLocation" 1313 button-class="btn btn-primary" 1314 class="addtobasketsimple-plp" 1315 :price-without-vat="spare.product.price" 1316 language-id="@Pageview.Area.EcomLanguageId" 1317 :only-spare-parts="@(Pageview.User.OnlySpareParts().ToString().ToLower())" 1318 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 1319 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1320 </add-to-basket-simple> 1321 </div> 1322 } 1323 @*<p>DEBUG: {{spare}}</p>*@ 1324 </li> 1325 1326 </ul> 1327 </div> 1328 </template> 1329 </b-collapse> 1330 </template> 1331 </div> 1332 1333 </script> 1334 <script type="text/x-template" id="variant-list-template"> 1335 <ul class="variants" v-if="initialVariant.product.hasVariants" > 1336 <li> 1337 <input v-model="variantId" @@click="changeVariantClickHandler($event)" :value="initialVariant.product.variantId" type="radio" :name="'main-' + initialVariant.product.id" :id="'main-' + initialVariant.product.id" :disabled="readOnly"/> 1338 <label :for="'main-' + initialVariant.product.id" :style="getImageOrColor(initialVariant.product.variantImage,initialVariant.product.variantValue)"></label> 1339 </li> 1340 <li v-for="variant in initialVariant.product.simpleVariants"> 1341 <input v-model="variantId" @@click="changeVariantClickHandler($event)" :value="variant.product.variantId" type="radio" :name="'color-'+variant.product.id + '-' + variant.product.variantId" :id="'color-'+variant.product.id + '-' + variant.product.variantId" /> 1342 <label :for="'color-'+variant.product.id+ '-' + variant.product.variantId" :style="getImageOrColor(variant.product.variantImage,variant.product.variantValue)"> 1343 </label> 1344 </li> 1345 </ul> 1346 </script> 1347 @using Dynamicweb.Ecommerce.International 1348 @{ 1349 string plpProductPrefix2 = "PLP "; 1350 } 1351 <script type="text/x-template" id="product-template"> 1352 1353 <article itemscope itemtype="https://schema.org/Product" v-if="product.product" v-bind:key="product.product.number"> 1354 <span class="badge"> 1355 <img v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Height=50&amp;Compression=85&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1356 </span> 1357 <a :href="product.product.url" itemprop="url"> 1358 <figure style="min-height: 1px;"> 1359 1360 <img v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" 1361 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1362 <img v-if="!SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=/Files/Images/default.jpg'" 1363 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1364 </figure> 1365 <header> 1366 <h1 itemprop="name">{{product.product.name}}</h1> 1367 <p itemprop="category">{{product.product.shortDescription}}</p> 1368 <div class="flex-list"> 1369 <product-specification-list-view :product-specifications="product.specifications" 1370 :product-number="product.product.number" 1371 :is-spare-part="product.product.isSparePart"> 1372 </product-specification-list-view> 1373 @if (Pageview.IsAllowedToShop()) 1374 { 1375 <template v-if="plpClass=='basic_listview-grid'"> 1376 <buying-component inline-template :selected-product="product" :initial-product="initialProduct"> 1377 <template v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)"> 1378 <div class="energy-data"> 1379 <a :href="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyLabel',selectedProduct.specifications)" target="_blank" class="energy-label"> 1380 <img :src="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)" alt="Energy Label" class="img-fluid img-energy" height="25" /> 1381 </a> 1382 <a href="#" v-on:click="getProductReport($event,selectedProduct.product.number,selectedProduct.product.name,selectedProduct.product.languageId)" target="_blank" class="energy-link"> 1383 <small>@Translate("PDP product sheet", "Product Sheet")</small> 1384 </a> 1385 </div> 1386 </template> 1387 </buying-component> 1388 </template> 1389 } 1390 </div> 1391 </header> 1392 </a> 1393 <template v-if="plpClass=='basic_listview-list'"> 1394 <ul class="basic_listview-specs"> 1395 <li v-for="item in SpecificationHelpers.GetPrettyBulletPoints(product.specifications)"> 1396 {{item}} 1397 </li> 1398 </ul> 1399 @*{{ product.Product.LongDescription }}*@ 1400 </template> 1401 1402 1403 @if (!Pageview.IsAllowedToShop()) 1404 { 1405 <footer> 1406 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("contact")" class="btn btn-outline-secondary btn-sm"> 1407 @Translate("create account", "Create account") 1408 </a> 1409 <buying-component inline-template :selected-product="product" :initial-product="initialProduct"> 1410 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1411 </buying-component> 1412 </footer> 1413 } 1414 else 1415 { 1416 <buying-component inline-template :selected-product="product" :plp-class="plpClass" :initial-product="initialProduct"> 1417 <footer itemprop="offers" itemscope="" itemtype="https://schema.org/Offer"> 1418 1419 <template v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications) && plpClass == 'basic_listview-list'"> 1420 <div class="energy-price"> 1421 <div class="variant-price"> 1422 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1423 <async-price class-type="asyncprice-plp" 1424 :product="selectedProduct" 1425 :default-price="selectedProduct.product.defaultPrice.priceWithoutVat" 1426 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1427 list-price="true" 1428 :should-emit-warranties="@((Pageview.IsAllowedToShop()).ToString().ToLower())" 1429 :force-ask-for-price="(!selectedProduct.product.isSparePart && @((Pageview.User.OnlySpareParts()).ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1430 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1431 </async-price> 1432 </div> 1433 <div class="energy-data"> 1434 <a :href="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyLabel',selectedProduct.specifications)" class="energy-label" target="_blank"> 1435 <img :src="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)" alt="Energy Label" class="img-fluid img-energy" height="25" /> 1436 </a> 1437 <a href="#" v-on:click="getProductReport($event,selectedProduct.product.number,selectedProduct.product.name,selectedProduct.product.languageId)" target="_blank" class="energy-link"> 1438 <small>@Translate("PDP product sheet", "Product Sheet")</small> 1439 </a> 1440 </div> 1441 </div> 1442 </template> 1443 <template v-else> 1444 <div class="variant-price"> 1445 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1446 <async-price class-type="asyncprice-plp" 1447 :product="selectedProduct" 1448 :default-price="selectedProduct.product.defaultPrice.priceWithoutVat" 1449 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1450 list-price="true" 1451 :should-emit-warranties="@((Pageview.IsAllowedToShop()).ToString().ToLower())" 1452 :force-ask-for-price="(!selectedProduct.product.isSparePart && @((Pageview.User.OnlySpareParts()).ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1453 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1454 </async-price> 1455 </div> 1456 </template> 1457 <div class="plp-buttons"> 1458 <div class="btn-group"> 1459 <add-to-compare :product-number="selectedProduct.product.number"></add-to-compare> 1460 @if (Pageview.IsCurrentlyB2B()) 1461 { 1462 <favorite-lists :ui-error-message-translation="'@Translate(plpProductPrefix2 + " Error while retrieving favorite list","Error while retrieving favorite list")'" :is-favorite-mode="@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("favorites") == @Pageview.ID" :product="selectedProduct"></favorite-lists> 1463 } 1464 </div> 1465 <add-to-basket-simple :product="selectedProduct" 1466 :unit-of-measure="'PCS'" 1467 button-class="btn btn-primary" 1468 class="addtobasketsimple-plp" 1469 :price-without-vat="currentItemPriceWithoutVat" 1470 language-id="@Pageview.Area.EcomLanguageId" 1471 :only-spare-parts="@(Pageview.User.OnlySpareParts().ToString().ToLower())" 1472 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 1473 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1474 </add-to-basket-simple> 1475 </div> 1476 </footer> 1477 </buying-component> 1478 } 1479 1480 </article> 1481 1482 </script> 1483 <script type="text/x-template" id="product-template-cz"> 1484 @{ 1485 string plpProductPrefix = "PLP "; 1486 } 1487 <article itemscope itemtype="https://schema.org/Product" v-if="product.product" v-bind:key="product.product.number"> 1488 <span class="stickers"> 1489 <span class="sticker" v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)"> 1490 <img :src="'/Admin/Public/GetImage.ashx?Height=50&amp;Compression=85&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)" 1491 alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" 1492 class="img-fluid" /> 1493 </span> 1494 <span v-if="ShowDiscount" class="sticker discount"> 1495 -{{discount}}% 1496 </span> 1497 </span> 1498 <a :href="product.product.url" itemprop="url" :title="['@Translate(plpProductPrefix + "More info about", "More info about") ' + product.product.name]"> 1499 <figure style="min-height: 1px;"> 1500 1501 <img v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" 1502 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1503 <img v-if="!SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=/Files/Images/default.jpg'" 1504 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1505 </figure> 1506 <header> 1507 <h1 itemprop="name">{{product.product.name}}</h1> 1508 <p itemprop="category">{{product.product.shortDescription}}</p> 1509 <div class="flex-list"> 1510 <product-specification-list-view :product-specifications="product.specifications" 1511 :product-number="product.product.number" 1512 :is-spare-part="product.product.isSparePart"> 1513 </product-specification-list-view> 1514 <template v-if="plpClass=='basic_listview-grid'"> 1515 <buying-component inline-template :selected-product="product" :initial-product="initialProduct"> 1516 <template v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)"> 1517 <div class="energy-data"> 1518 <a :href="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyLabel',selectedProduct.specifications)" target="_blank" class="energy-label"> 1519 <img :src="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)" alt="Energy Label" class="img-fluid img-energy" height="25" /> 1520 </a> 1521 <a href="#" v-on:click="getProductReport($event,selectedProduct.product.number,selectedProduct.product.name,selectedProduct.product.languageId)" target="_blank" class="energy-link"> 1522 <small>@Translate("PDP product sheet", "Product Sheet")</small> 1523 </a> 1524 </div> 1525 </template> 1526 </buying-component> 1527 </template> 1528 </div> 1529 </header> 1530 </a> 1531 <template v-if="plpClass=='basic_listview-list'"> 1532 <ul class="basic_listview-specs"> 1533 <li v-for="item in SpecificationHelpers.GetPrettyBulletPoints(product.specifications)"> 1534 {{item}} 1535 </li> 1536 </ul> 1537 </template> 1538 <buying-component @@discount="onDiscount($event)" inline-template :selected-product="product" :initial-product="initialProduct"> 1539 <footer itemprop="offers" itemscope="" itemtype="https://schema.org/Offer"> 1540 1541 1542 <template v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications) && plpClass == 'basic_listview-list'"> 1543 <div class="energy-price"> 1544 <div class="variant-price"> 1545 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1546 <async-price class-type="asyncprice-plp" 1547 :product="selectedProduct" 1548 :default-price="selectedProduct.product.defaultPrice.priceWithoutVat" 1549 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1550 list-price="true" 1551 :should-emit-warranties="@((Pageview.IsAllowedToShop()).ToString().ToLower())" 1552 :force-ask-for-price="(!selectedProduct.product.isSparePart && @((Pageview.User.OnlySpareParts()).ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1553 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))" 1554 @@discount="onDiscount($event)" 1555 :list-view="true"> 1556 </async-price> 1557 </div> 1558 <div class="energy-data"> 1559 <a :href="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyLabel',selectedProduct.specifications)" class="energy-label" target="_blank"> 1560 <img :src="SpecificationHelpers.GetFirstSpecificationValueOrDefault('EnergyArrow',selectedProduct.specifications)" alt="Energy Label" class="img-fluid img-energy" height="25" /> 1561 </a> 1562 <a href="#" v-on:click="getProductReport($event,selectedProduct.product.number,selectedProduct.product.name,selectedProduct.product.languageId)" target="_blank" class="energy-link"> 1563 <small>@Translate("PDP product sheet", "Product Sheet")</small> 1564 </a> 1565 </div> 1566 </div> 1567 </template> 1568 <template v-else> 1569 <div class="variant-price"> 1570 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1571 <async-price class-type="asyncprice-plp" 1572 :product="selectedProduct" 1573 :default-price="selectedProduct.product.defaultPrice.priceWithoutVat" 1574 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1575 list-price="true" 1576 :should-emit-warranties="@((Pageview.IsAllowedToShop()).ToString().ToLower())" 1577 :force-ask-for-price="(!selectedProduct.product.isSparePart && @((Pageview.User.OnlySpareParts()).ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1578 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))" 1579 @@discount="onDiscount($event)" 1580 :list-view="true"> 1581 </async-price> 1582 </div> 1583 </template> 1584 <div class="btn-group"> 1585 <add-to-compare :product-number="selectedProduct.product.number"></add-to-compare> 1586 @if (Pageview.IsCurrentlyB2B()) 1587 { 1588 <favorite-lists :ui-error-message-translation="'@Translate(plpProductPrefix + " Error while retrieving favorite list","Error while retrieving favorite list")'" :is-favorite-mode="@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("favorites") == @Pageview.ID" :product="selectedProduct"></favorite-lists> 1589 } 1590 </div> 1591 <add-to-basket-simple :product="selectedProduct" 1592 :unit-of-measure="'PCS'" 1593 button-class="btn btn-primary" 1594 class="addtobasketsimple-plp" 1595 :price-without-vat="currentItemPriceWithoutVat" 1596 language-id="@Pageview.Area.EcomLanguageId" 1597 :only-spare-parts="@(Pageview.User.OnlySpareParts().ToString().ToLower())" 1598 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 1599 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1600 </add-to-basket-simple> 1601 </footer> 1602 </buying-component> 1603 </article> 1604 </script> 1605 <script type="text/x-template" id="quick-search-template"> 1606 <div class="quicksearch-component"> 1607 <div class="quickorder-form"> 1608 <slot name="right-box"></slot> 1609 <div class="quickorder-box"> 1610 <h2>@Translate("Find products")</h2> 1611 <div class="quickorder-input"> 1612 <label for="quickOrderSearch">@Translate("Product name or number")</label> 1613 <input type="text" 1614 :id="id" 1615 v-model="search" 1616 @@keydown.enter="enter" 1617 @@keydown.down="down" 1618 @@keydown.up="up" 1619 @@input="onSearchInput" 1620 class="form-control form-control-lg" 1621 autocomplete="chrome-off" 1622 placeholder="@Translate("Quick order search term")" 1623 :disabled="disabled"/> 1624 <label for="quickOrderQty">@Translate("Quantity")</label> 1625 <input type="number" 1626 v-model.number="quantity" 1627 @@change="chosenProduct()" 1628 @@keydown.enter="chosenProduct()" 1629 class="form-control form-control-lg" 1630 id="quickOrderQty" 1631 placeholder="0" 1632 autocomplete="chrome-off" 1633 :disabled="disabled"/> 1634 1635 </div> 1636 <ul v-if="filterList.length > 0 && open" class="quickorder-list"> 1637 <li v-for="(product,index) in filterList" 1638 :class="{'active': isSelected(index)}"> 1639 <button @@click="suggestClick(index)"> 1640 {{concatNameAndNumber(product)}} 1641 </button> 1642 1643 </li> 1644 </ul> 1645 1646 <div class="quickorder-product" v-if="currentChosenProduct"> 1647 <p><strong>{{currentChosenProduct.name}}</strong><small>{{currentChosenProduct.shortDescription}}</small></p> 1648 <product-specification-list-view v-if="searchProductSpecs !== null" 1649 :product-specifications="searchProductSpecs" 1650 :product-number="currentChosenProduct.number"> 1651 </product-specification-list-view> 1652 <async-price class-type="quickorder-product-price" 1653 :product="currentChosenProduct" 1654 unit-of-measure="" 1655 :only-price="true" 1656 default-price-without-vat="0" 1657 :force-ask-for-price="(!currentChosenProduct.isSparePart && @(Pageview.User.OnlySpareParts().ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1658 @@price="handlePriceUpdate" 1659 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1660 </async-price> 1661 </div> 1662 </div> 1663 </div> 1664 <p v-if="showPriceError">@Translate("QuickOrderZeroPriceError","Can not add product with zero price")</p> 1665 <div class="quickorder-cart" v-if="productsToOrder.length > 0"> 1666 <table class="table table-striped table-flex"> 1667 <thead> 1668 <tr> 1669 <th>@Translate("Product")</th> 1670 <th>@Translate("Specifications")</th> 1671 <th>@Translate("Quantity")</th> 1672 <th class="cell-right">@Translate("Price")</th> 1673 <th>&nbsp;</th> 1674 </tr> 1675 </thead> 1676 <tbody> 1677 <tr v-for="(product,index) in productsToOrder"> 1678 <td class="cell-prod"> 1679 <strong>{{product.name}}</strong> 1680 <small>{{product.shortDescription}}</small> 1681 </td> 1682 <td class="cell-specs"> 1683 <product-specification-list-view :product-specifications="product.productSpecifications" 1684 :product-number="product.number"> 1685 </product-specification-list-view> 1686 </td> 1687 <td class="cell-specs"> 1688 <input class="form-control" type="number" v-model="product.quantity" @@input="updateQuantity()" /> 1689 </td> 1690 <td class="cell-price cell-right"> 1691 <async-price class-type="quickorder-product-price" 1692 :product="quickOrderProductToSimpleProduct(product)" 1693 unit-of-measure="" 1694 :only-price="true" 1695 default-price-without-vat="0" 1696 :should-emit-warranties="true" 1697 @@qo-warranty-update="setWarranty($event,product)" 1698 :force-ask-for-price="(!product.isSparePart && @(Pageview.User.OnlySpareParts().ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1699 standard-customer="@(string.IsNullOrEmpty(Pageview.AreaSettings.GetString("StandardCustomer")) ? "" : Pageview.AreaSettings.GetString("StandardCustomer"))"> 1700 1701 </async-price> 1702 </td> 1703 <td class="cell-trash"> 1704 <button @@click="removeOrderline(index)" aria-label="@Translate("Delete product")" class="text-danger"> 1705 <svg> 1706 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#trash-alt"></use> 1707 </svg> 1708 </button> 1709 </td> 1710 </tr> 1711 </tbody> 1712 </table> 1713 <slot name="button"></slot> 1714 1715 </div> 1716 </div> 1717 </script> 1718 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 1719 @{ 1720 //This template contains everything for the favoritelist items. 1721 string favoriteListPrefix = "FavoriteList "; 1722 } 1723 <span id="favoritelistitem_confirm_delete_on_all" style="display: none; visibility: hidden">@Translate(favoriteListPrefix + "_confirm_delete_all", "Er du sikker på at du vil fjerne produktet {0} fra alle lister ?")</span> 1724 1725 <script type="text/x-template" id="favorite-item-template"> 1726 <div class="custom-control custom-checkbox"> 1727 <input type="checkbox" :checked="isActive" v-on:change="toggleItem()" :id="'fav-' +favoriteList.id" class="custom-control-input" /> 1728 <label :for="'fav-' + favoriteList.id" class="custom-control-label"> 1729 {{favoriteList.name}} 1730 </label> 1731 1732 @*<input type="checkbox" :value="favoriteList.id" :checked="isItemAddedToThisList(favoriteList)" v-on:change="toggleItem($event, favoriteList.id)" class="form-check-input" /> 1733 <label :for="'fav-' + favoriteList.id" class="form-check-label"> 1734 {{favoriteList.name}} 1735 </label>*@ 1736 </div> 1737 </script> 1738 <!-- 1739 1740 <button class="btn btn-favorite favorite" title="Add to favorite" aria-label="@Translate("Favorite", "Favorite" )" v-on:click="toggleItem()"> 1741 <svg> 1742 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#snowflake"></use> 1743 </svg> 1744 </button> 1745 --> 1746 <script type="text/x-template" id="favorite-list-template"> 1747 <div class="fav"> 1748 <button :aria-controls="'favorite' + product.product.id" :class="['btn btn-favorite', {'is-open': showingMenu}, {'is-selected': isActive}]" aria-label="@Translate(favoriteListPrefix + "Favorite", "Favorite" )" :title="isActive ? '@Translate(favoriteListPrefix + "Remove from favorites","Remove from favorites")' : '@Translate(favoriteListPrefix + "Add to favorites","Add to favorites")'" v-on:click="toggleItem()"> 1749 <svg> 1750 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#snowflake"></use> 1751 </svg> 1752 </button> 1753 <div class="fav-overlay" v-autoClose.nonPath="closeToggle" :id="'favorite' + product.product.id"> 1754 <div class="fav-arrow" v-if="showingMenu"></div> 1755 <div class="fav-inwrap" v-if="showingMenu"> 1756 <template v-if="loading"> 1757 <div class="text-center"> 1758 <span class="spinner-md-default"></span> 1759 </div> 1760 </template> 1761 <em class="error" v-if="uiErrorMessage">{{uiErrorMessage}}</em> 1762 <template v-if="!loading && !uiErrorMessage"> 1763 <p class="fav-title">@Translate(favoriteListPrefix + "Favoritliste", "Favoritliste")</p> 1764 <template v-if="favoriteLists && favoriteLists.length > '0'"> 1765 <p class="fav-teaser"> 1766 @Translate(favoriteListPrefix + "Tilføj eller fjern markering.", "Tilføj eller fjern markering.") 1767 </p> 1768 <div class="fav-lists"> 1769 <favorite-item v-for="favoriteList in favoriteLists" :favorite-list="favoriteList" :product="product" :key="favoriteList.id" /> 1770 </div> 1771 <div class="fav-new"> 1772 <div class="custom-control custom-checkbox"> 1773 <input type="checkbox" v-model="addNewList" id="addNewListCheckbox" class="custom-control-input" /> 1774 <label for="addNewListCheckbox" class="custom-control-label"> 1775 @Translate(favoriteListPrefix + "Ny favoritliste", "Ny favoritliste") 1776 </label> 1777 </div> 1778 </div> 1779 <div v-if="addNewList" class="fav-form"> 1780 <label for="addNewListNameInput" class="sr-only">@Translate(favoriteListPrefix + "Navn", "Navn")</label> 1781 <input type="text" id="addNewListNameInput" v-model="addNewListNameInput" class="form-control form-control-sm new-list-name-input" placeholder="@Translate(favoriteListPrefix + "Navn", "Navn")" v-on:keyup.enter="saveAsNewList" /> 1782 <button v-on:click="saveAsNewList" class="btn btn-secondary btn-sm">@Translate(favoriteListPrefix + "Gem", "Gem")</button> 1783 </div> 1784 </template> 1785 <template v-else> 1786 <p class="fav-teaser">@Translate(favoriteListPrefix + "NoFavoritliste", "Du har endnu ingen favoritlister, angiv navn for at oprette en.")</p> 1787 <div class="fav-form"> 1788 <label for="addNewListNameInput" class="sr-only">@Translate(favoriteListPrefix + "Navn", "Navn")</label> 1789 <input type="text" id="addNewListNameInput" v-model="addNewListNameInput" class="form-control form-control-sm new-list-name-input" placeholder="@Translate(favoriteListPrefix + "Navn", "Navn")" v-on:keyup.enter="saveAsNewList" /> 1790 <button v-on:click="saveAsNewList" class="btn btn-secondary btn-sm">@Translate(favoriteListPrefix + "Gem", "Gem")</button> 1791 </div> 1792 </template> 1793 </template> 1794 </div> 1795 </div> 1796 </div> 1797 </script> 1798 1799 <script type="text/x-template" id="basic-range-slider-template"> 1800 @{ 1801 string rangeFacetPrefix = "Filter "; 1802 } 1803 <div class="facet-option"> 1804 <vue-slider :key="key" @@drag-end="onChange" @@click="onChange" :min-range="1" v-model="value" :dotSize="20" :min="min" :max="max" :clickable="false"></vue-slider> 1805 <div class="vue-slider-fields"> 1806 <div class="form-group"> 1807 <label for="minValue" class="sr-only">@Translate(rangeFacetPrefix + "Minimum Value", "Minimum Value")</label> 1808 <input class="form-control form-control-sm" type="number" @@blur="onChange" id="minValue" name="minValue" v-model="minValue" /> 1809 </div> 1810 <div class="form-group"> 1811 <label for="maxValue" class="sr-only">@Translate(rangeFacetPrefix + "Maximum Value", "Maximum Value")</label> 1812 <input class="form-control form-control-sm" type="number" @@blur="onChange" id="maxValue" name="maxValue" v-model="maxValue" /> 1813 </div> 1814 </div> 1815 </div> 1816 </script> 1817 1818 1819 1820 <script type="text/x-template" id="add-compare-template"> 1821 <button @@click="onClick" :class="['btn btn-compare', {'is-selected':isInCompare}]" :title="[isInCompare ? '@Translate(plpProductPrefix + "Remove from Compare", "Remove from Compare")' : '@Translate(plpProductPrefix + "Add to compare", "Add to compare")']"> 1822 <svg> 1823 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#balance-scale"></use> 1824 </svg> 1825 </button> 1826 </script> 1827 @using Dynamicweb.Frontend 1828 @{ 1829 string instantSearchPrefix = "InstantSearch "; 1830 } 1831 <script type="text/x-template" id="instant-search-template"> 1832 <form v-bind:class="baseClass" action="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("searchresult")" v-autoClose="closeFoldOut"> 1833 <div class="basic_instantsearch"> 1834 <label for="searchTerm" class="sr-only">@Translate(instantSearchPrefix + "Search", "Search")</label> 1835 <input type="search" 1836 placeholder="@Translate(instantSearchPrefix + "Search", "Search")" 1837 id="searchTerm" 1838 name="search" 1839 autocomplete="off" 1840 v-model="searchTerm" 1841 v-on:focus="openSearch"> 1842 <button type="submit"> 1843 <span class="sr-only">@Translate(instantSearchPrefix + "Search", "Search")</span> 1844 <svg> 1845 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/Files/dist/icons/icons.svg#search"></use> 1846 </svg> 1847 </button> 1848 <div class="fold-out" v-bind:class="{ active: foldActive, 'has-results': showResults }"> 1849 <template v-if="searchTerm == null"> 1850 <p class="search-string">@Translate(instantSearchPrefix + "Type something", "Type something")</p> 1851 </template> 1852 <template v-else-if="queryLoading"> 1853 <div class="is-loading"> 1854 <span class="spinner-lg-default"></span> 1855 </div> 1856 </template> 1857 <template v-else-if="!showResults"> 1858 <p class="search-string"> 1859 @Translate(instantSearchPrefix + "Empty search...", "Empty search...") 1860 </p> 1861 </template> 1862 <div class="fold-out-grid" v-else> 1863 <div class="fold-out-col is-content"> 1864 <ul v-if="groups?.length>0" class="fold-out-content"> 1865 <li> 1866 <strong>@Translate(instantSearchPrefix + "Categories", "Categories")</strong> 1867 </li> 1868 <li v-for="group in groups"> 1869 <a :href="group.url"> 1870 {{group.groupName}} 1871 </a> 1872 </li> 1873 </ul> 1874 <ul v-if="contents?.length>0" class="fold-out-content"> 1875 <li> 1876 <strong>@Translate(instantSearchPrefix + "Content", "Content")</strong> 1877 </li> 1878 <li v-for="content in contents"> 1879 <a :href="content.url"> 1880 {{content.pageTitle}} 1881 </a> 1882 </li> 1883 <li v-if="hasMoreContent" class="show-all"> 1884 <a :href="'@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("searchresult")?search=' + searchTerm + '&show=content'">@Translate(instantSearchPrefix + "See all", "Se alle")</a> 1885 </li> 1886 </ul> 1887 </div> 1888 <div class="fold-out-col is-products" v-if="products?.length > 0"> 1889 <ul class="fold-out-products"> 1890 <li> 1891 <strong>@Translate(instantSearchPrefix + "Products", "Products")</strong> 1892 </li> 1893 <li v-for="product in products"> 1894 <figure> 1895 <img :src="'/Admin/Public/GetImage.ashx?Width=50&amp;Height=50&amp;fillcanvas=true&amp;Compression=85&amp;Crop=5&amp;Image=' + (product.imageLink ? product.imageLink : '/Files/Images/Default.jpg')" /> 1896 </figure> 1897 <div> 1898 <a :href="product.url"> 1899 {{product.name}} 1900 </a> 1901 <small>{{product.number}}</small> 1902 </div> 1903 </li> 1904 <li v-if="hasMoreProducts" class="show-all"> 1905 <a :href="'@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("searchresult")?search=' + searchTerm + '&show=products'">@Translate(instantSearchPrefix + "See all", "Se alle")</a> 1906 </li> 1907 </ul> 1908 1909 </div> 1910 <div class="fold-out-col is-spareparts" v-if="spareParts?.length > 0"> 1911 <ul class="fold-out-products"> 1912 <li> 1913 <strong>@Translate(instantSearchPrefix + "Spareparts", "Spare parts")</strong> 1914 </li> 1915 <li v-for="product in spareParts"> 1916 <figure> 1917 <img :src="'/Admin/Public/GetImage.ashx?Width=50&amp;Height=50&amp;fillcanvas=true&amp;Compression=85&amp;Crop=5&amp;Image=' + (product.imageLink ? product.imageLink : '/Files/Images/Default.jpg')" /> 1918 </figure> 1919 <div> 1920 <a :href="product.url"> 1921 {{product.name}} 1922 </a> 1923 <small>{{product.number}}</small> 1924 </div> 1925 </li> 1926 <li v-if="hasMoreSpares" class="show-all"> 1927 <a :href="'@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("searchresult")?search=' + searchTerm + '&show=spares'">@Translate(instantSearchPrefix + "See all", "Se alle")</a> 1928 </li> 1929 </ul> 1930 </div> 1931 </div> 1932 @*<div v-if="searchTerm != '' && showResults && !queryLoading" class="actions"> 1933 <a :href="'@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("searchresult")?search=' + searchTerm">@Translate(instantSearchPrefix + "See all", "Se alle")</a> 1934 </div>*@ 1935 </div> 1936 </div> 1937 </form> 1938 </script> 1939 1940 1941 1942 <script src="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/scripts/vendors~bundle.min.js")"></script> 1943 <script src="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/scripts/bundle.min.js")"></script> 1944 @{ 1945 var currentUser = NORRIQ.Universal.Identity.Dw.UserViewModel.GetCurrentUser<Tefcold.Web.Api.Models.UserViewModelWithMediaBank>(); 1946 var jsonUser = Newtonsoft.Json.JsonConvert.SerializeObject(currentUser); 1947 } 1948 <script async> 1949 AppStart.VueProvider.init({ 1950 webApiUrl: '@System.Web.Configuration.WebConfigurationManager.AppSettings["WebApiProxyUrl"]', 1951 user: @jsonUser, 1952 currencyCode: '@currencyCode', 1953 locale: '@Pageview.Area.Culture', 1954 currencyLeft: false, 1955 currencySpacing: true, 1956 currencySymbol: '@currencyCode', 1957 currencyDecimalSeparator: ',', 1958 currencyGroupSeparator: '.', 1959 currencyDecimalDigits: 2, 1960 dateFormatShort: '@Pageview.Area.Dateformat', 1961 shopId: '@Pageview.Area.EcomShopId', 1962 languages: `@languagesJson` 1963 }); 1964 </script> 1965 1966 <script append="replace"></script> 1967 </body> 1968 </html>