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