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