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_25e0712543f54639b0be940c8549af91.Execute() in E:\Solutions\Live\Tefcold.Web\Files\Templates\Designs\Tefcold\_parsed\Basic_Page.parsed.cshtml:line 444
   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 Dynamicweb.Content 2 @using Dynamicweb.Frontend; 3 @using Dynamicweb.Security.UserManagement 4 @using NLWI.Core.Factory 5 @using Tefcold.Web.CustomCode.Extensions 6 @using Tefcold.Web.CustomCode.Items.Properties 7 @using Tefcold.Web.CustomCode.Razor 8 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 9 @{ 10 //Heine: Understående kan bruges såfremt der skal tjekkes på om man er i impersonation mode: 11 var isImpersonating = ObjectFactory.GetInstance<NORRIQ.SalesPersonLogin.Services.ImpersonationService>().IsCurrentlyImpersonating(); 12 var locationName = Pageview.User?.Name; 13 var item = Pageview.Area.Item.ToCodeFirstItem<Websites>(); 14 } 15 16 <!DOCTYPE html> 17 <html lang="@Pageview.Area.Culture"> 18 <head> 19 <meta charset='utf-8' /> 20 <meta name="description" content="@Model.Description" /> 21 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, shrink-to-fit=no" /> 22 <meta http-equiv="x-ua-compatible" content="ie=edge"> 23 @if (Model.Area.Item.GetBoolean("NoIndex")) 24 { 25 <!-- TODO: remove on launch--> 26 <meta name="robots" content="noindex, nofollow" /> 27 } 28 29 @if (!string.IsNullOrWhiteSpace(item.HeaderScript)) 30 { 31 @item.HeaderScript 32 } 33 34 <title>@Model.Title</title> 35 @Model.MetaTags 36 @if (Model.Area.Item.GetFile("Icon") != null) 37 { 38 <link href="@Model.Area.Item.GetFile("Icon").Path" rel="icon" type="image/png"> 39 } 40 <link href="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/css/Tefcold-min.css")" rel="stylesheet" /> 41 </head> 42 <body> 43 @* GTM **@ 44 <div id="app"> 45 @{ 46 string basicNavbarPrefix = "Header "; 47 var logo = Model.Area.Item.GetFile("Logo"); 48 var currencyCode = Pageview.User?.Currency ?? Pageview.Area.EcomCurrencyId; 49 } 50 <header class="basic_navbar" id="header"> 51 @if (isImpersonating) 52 { 53 <div class="impersonation-bar"> 54 <div class="basic_navbar-container"> 55 <p> 56 @Translate(basicNavbarPrefix + "debitor", "Debitor"): <b>@locationName</b> | <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("impersonation-choose-customer")?action=changeuser">@Translate("Change customer")</a> 57 </p> 58 </div> 59 </div> 60 } 61 <div class="basic_navbar-main"> 62 <div class="basic_navbar-container"> 63 64 <button type="button" 65 class="basic_navbar-burger" 66 aria-label="@Translate(basicNavbarPrefix + "Open main navigation", "Open main navigation")" 67 v-b-toggle.basic_navigation> 68 <span></span> 69 <span></span> 70 <span></span> 71 </button> 72 <a href="/" class="basic_navbar-logo" title="@Translate(basicNavbarPrefix + "Go to frontpage", "Go to frontpage")"> 73 @if (logo != null) 74 { 75 <img class="img-fluid" src="@logo.Path" alt="@Translate(basicNavbarPrefix + "Website Logo Alttext", "Website Logo Alttext")"/> 76 } 77 else 78 { 79 <i>@Translate(basicNavbarPrefix + "No logo found", "No logo found, please configure it in the Dynamicweb Administration")</i> 80 } 81 </a> 82 <collapse-hack inline-template> 83 <b-collapse class="basic_navbar-navigation" id="basic_navigation" tag="nav"> 84 @RenderNavigation(new {Template = "basic_navbar.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4}) 85 <ul class="basic_navbar-subnav"> 86 <li> 87 <button type="button" 88 v-b-toggle.languages 89 aria-label="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")"> 90 <img src="@Pageview.Area.Flag32X32" alt="@Pageview.Area.CultureInfo.EnglishName"/> 91 <span class="sr-only">@Pageview.Area.CultureInfo.EnglishName</span> 92 </button> 93 </li> 94 <li> 95 <button v-b-toggle.contacts 96 type="button" 97 aria-label="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")"> 98 <svg> 99 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 100 </svg> 101 <span class="sr-only">@Translate(basicNavbarPrefix + "Contacts", "Contacts")</span> 102 </button> 103 </li> 104 <li> 105 <button v-b-toggle.customer-center 106 type="button" 107 aria-label="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")"> 108 @if (Pageview.User == null) 109 { 110 <svg> 111 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user"></use> 112 </svg> 113 } 114 else 115 { 116 <svg style="width: 30px; height: 30px;"> 117 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user-check"></use> 118 </svg> 119 } 120 <span class="sr-only">@Translate(basicNavbarPrefix + "Login", "Login")</span> 121 </button> 122 </li> 123 <media-bank inline-template> 124 <li> 125 126 <form id="mediabankform" action="https://imagebank.tefcold.com/Home/LoginUser" method="post"> 127 <input id="mediabankformname" type="hidden" name="username"/> 128 <input id="mediabankformpassword" type="hidden" name="password"/> 129 <input type="hidden" value="false" name="persistent"/> 130 </form> 131 <a v-on:click="connect($event)" href="#"> 132 <svg width="28px" height="28px" fill="currentColor"> 133 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 134 </svg> 135 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 136 </a> 137 </li> 138 </media-bank> 139 <li> 140 <button type="button" 141 class="btn-close" 142 @@click="collapseAll" 143 aria-label="@Translate(basicNavbarPrefix + "Close Navigation", "Close Navigation")"> 144 <span></span> 145 <span></span> 146 </button> 147 </li> 148 </ul> 149 </b-collapse> 150 </collapse-hack> 151 <form class="basic_navbar-search" action="/Default.aspx"> 152 <search-shortcut inline-template> 153 <div style="display: none"></div></search-shortcut> 154 <label for="productsearch">Search</label> 155 <input name="ID" type="hidden" value="@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("searchresult")"> 156 <input name="PageSize" type="hidden" value="99"/> 157 <input type="search" placeholder="@Translate(basicNavbarPrefix + "Search", "Search")" id="productsearch" name="productsearch"> 158 <button type="submit"> 159 <span class="sr-only">@Translate(basicNavbarPrefix + "Search", "Search")</span> 160 <svg> 161 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#search"></use> 162 </svg> 163 </button> 164 </form> 165 <ul class="basic_navbar-functions"> 166 <li class="basic_navbar-languages relative"> 167 <button type="button" v-b-toggle.languages aria-label="@Translate(basicNavbarPrefix + "Choose Language", "Choose Language")"> 168 <span class="sr-only">@Pageview.Area.CultureInfo.EnglishName</span> 169 <img src="@Pageview.Area.Flag32X32" alt="@Pageview.Area.Culture - Flag"/> 170 </button> 171 <b-collapse id="languages" class="basic_navbar-dropdown" accordion="header" v-auto-close> 172 <div class="basic_navbar-body"> 173 <ul> 174 @foreach (var lang in Model.Area.Languages.Where(a => !a.IsCurrent)) 175 { 176 string langUrl; 177 string countryCode = lang.Culture.Split('-').Last(); 178 179 if (Dynamicweb.Context.Current.Request["GroupID"] != null) 180 { 181 langUrl = this.GetGroupUrl(Dynamicweb.Context.Current.Request["GroupID"], countryCode); 182 } 183 else if (!string.IsNullOrEmpty(lang.PrimaryDomain)) 184 { 185 try 186 { 187 var uriBuilder = new UriBuilder(Pageview.SearchFriendlyUrl); 188 uriBuilder.Host = !lang.PrimaryDomain.Contains("http") ? lang.PrimaryDomain : "https://" + lang.PrimaryDomain; 189 langUrl = uriBuilder.Uri.AbsoluteUri; 190 } 191 catch (Exception) 192 { 193 langUrl = Pageview.SearchFriendlyUrl; 194 } 195 } 196 else 197 { 198 langUrl = Pageview.SearchFriendlyUrl; 199 } 200 <li> 201 <a href="@langUrl"> 202 <img src="/Admin/Images/Flags/flag_@(countryCode).png" alt="@lang.Culture - Flag" /> 203 <span>@lang.Culture.Split('-').First()</span> 204 </a> 205 </li> 206 } 207 </ul> 208 </div> 209 </b-collapse> 210 </li> 211 <li class="basic_navbar-contacts @(Pageview.User != null ? "static" : "relative")"> 212 <button v-b-toggle.contacts 213 type="button" 214 aria-label="@Translate(basicNavbarPrefix + "Show contacts", "Show contacts")"> 215 <svg> 216 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 217 </svg> 218 <span class="sr-only">@Translate(basicNavbarPrefix + "Contacts", "Contacts")</span> 219 </button> 220 @{ 221 var impersonationGroupId = item.ImpersonationGroup.FirstOrDefault(); 222 IEnumerable<User> users = null; 223 IEnumerable<User> salesPersons = new List<User>(); 224 if (Pageview.User != null) 225 { 226 var salesPersonCode = Pageview.User.CustomFieldValues.FirstOrDefault(field => field.CustomField.Name == "Sales Person Code"); 227 var salesPersonsInitials = salesPersonCode?.Value?.ToString().Split(',') ?? new string[] { }; 228 salesPersonsInitials = salesPersonsInitials.Select(x => x.ToLower()).ToArray(); 229 230 if (!string.IsNullOrEmpty(impersonationGroupId)) 231 { 232 users = Group.GetGroupByID(int.Parse(impersonationGroupId)).Users; 233 } 234 if (users == null || Pageview.User == null) 235 { 236 salesPersons = new List<User>(); 237 } 238 else 239 { 240 salesPersons = users.Where(user => salesPersonsInitials.Contains(user.Email.ToLower().Split('@').FirstOrDefault() ?? "")); 241 } 242 } 243 244 } 245 <b-collapse id="contacts" class="@(Pageview.User != null ? "basic_navbar-megamenu" : "basic_navbar-dropdown")" v-auto-close accordion="header"> 246 <div class="basic_navbar-body"> 247 @if (Pageview.User != null) 248 { 249 if (salesPersons.Any()) 250 { 251 <p class="tefcold_salesperson-byline h1">@Translate(basicNavbarPrefix + "Your Sales Team", "Your Sales Team")</p> 252 } 253 foreach (var salesPerson in salesPersons) 254 { 255 <div class="tefcold_salesperson" itemscope itemtype="http://schema.org/Person"> 256 <figure> 257 <img src="@salesPerson.Image" class="img-fluid" alt="@salesPerson.Name" itemprop="image" /> 258 </figure> 259 <p itemprop="name">@salesPerson.Name</p> 260 <p itemprop="jobTitle">@salesPerson.JobTitle</p> 261 <p itemprop="telephone"> 262 <svg> 263 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#phone-alt"></use> 264 </svg> 265 <span>@salesPerson.PhonePrivate</span> 266 </p> 267 <p itemprop="telephone"> 268 <svg> 269 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#mobile-alt"></use> 270 </svg> 271 <span>@salesPerson.PhoneMobile</span> 272 </p> 273 <a href="@("mailto:" + @salesPerson.Email)" itemprop="email"> 274 <svg> 275 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#envelope"></use> 276 </svg> 277 <span>@salesPerson.Email</span> 278 </a> 279 </div> 280 } 281 282 } 283 <ul> 284 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("PhoneLabel")) 285 && !string.IsNullOrEmpty(Model.Area.Item.GetString("Phonenumber"))) 286 { 287 <li class="head"> 288 <strong> 289 @Model.Area.Item.GetString("PhoneLabel") 290 </strong> 291 <strong> 292 @Model.Area.Item.GetString("Phonenumber") 293 </strong> 294 </li> 295 } 296 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("ContactPage")) 297 && !string.IsNullOrEmpty(Model.Area.Item.GetString("ContactLabel"))) 298 { 299 <li> 300 <a href="@Model.Area.Item.GetString("ContactPage")"> 301 @Model.Area.Item.GetString("ContactLabel") 302 </a> 303 </li> 304 } 305 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("SalesPage")) 306 && !string.IsNullOrEmpty(Model.Area.Item.GetString("SalesLabel"))) 307 { 308 <li> 309 <a href="@Model.Area.Item.GetString("SalesPage")"> 310 @Model.Area.Item.GetString("SalesLabel") 311 </a> 312 </li> 313 } 314 </ul> 315 316 </div> 317 </b-collapse> 318 </li> 319 <li class="basic_navbar-user"> 320 <button v-b-toggle.customer-center type="button" aria-label="@Translate(basicNavbarPrefix + "Show Webshop Login", "Show Webshop Login")"> 321 @if (Pageview.User == null) 322 { 323 <svg> 324 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user"></use> 325 </svg> 326 } 327 else 328 { 329 <svg style="width: 30px; height: 30px;"> 330 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#user-check"></use> 331 </svg> 332 } 333 <span class="sr-only">@Translate(basicNavbarPrefix + "Login", "Login")</span> 334 </button> 335 336 337 <b-collapse id="customer-center" class="basic_navbar-dropdown" accordion="header" v-auto-close> 338 <div class="basic_navbar-body"> 339 @if (Pageview.User == null) 340 { 341 <head-login-form inline-template> 342 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" v-on:submit="submitLogin"> 343 <p> 344 <strong> 345 @Translate(basicNavbarPrefix + "Webshop Login", "Webshop Login") 346 </strong> 347 </p> 348 <input type="hidden" name="ID" id="ID" value=""/> 349 <div class="form-group"> 350 <label for="Username">@Translate(basicNavbarPrefix + "Username", "Username")</label> 351 <input id="Username" v-model="username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 352 </div> 353 <div class="form-group"> 354 <label for="Password">@Translate(basicNavbarPrefix + "Password", "Password")</label> 355 <input id="Password" v-model="password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 356 </div> 357 <div v-if="loginFailed"> 358 <p class="alert alert-warning"> 359 @Translate("Login failed", "Invalid credentials") 360 </p> 361 </div> 362 <div class="basic_login-buttons"> 363 <button type="submit" role="button" class="btn btn-primary btn-block" v-bind:class='{"loading": loading}' v-on:click="loading=true" id="loginBtn"> 364 @Translate(basicNavbarPrefix + "Login", "Login") 365 </button> 366 </div> 367 </form> 368 </head-login-form> 369 <ul> 370 <li> 371 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("forgotpassword")&amp;LoginAction=Recovery"> 372 @Translate(basicNavbarPrefix + "Forgot password", "Forgot password") 373 </a> 374 </li> 375 <li> 376 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("create-account")"> 377 @Translate(basicNavbarPrefix + "Create Webshop Account", "Create Webshop Account") 378 </a> 379 </li> 380 </ul> 381 } 382 else 383 { 384 <div class="active-user"> 385 <p><strong>@Pageview.User.Name</strong></p> 386 <p> 387 <a v-clear-cache:click.user href='/admin/public/extranetlogoff.aspx?ID=@(NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("home"))'> 388 @Translate(basicNavbarPrefix + "Sign out", "Sign out") 389 </a> 390 </p> 391 </div> 392 @RenderNavigation(new {Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = "customer-portal"}) 393 } 394 </div> 395 </b-collapse> 396 </li> 397 @if (Pageview.User != null && Pageview.User.AllowMediaBank()) 398 { 399 <media-bank inline-template> 400 <li class="basic_navbar-media"> 401 <form id="mediabankform" action="https://imagebank.tefcold.com/Home/LoginUser" method="post"> 402 <input id="mediabankformname" type="hidden" name="username"/> 403 <input id="mediabankformpassword" type="hidden" name="password"/> 404 <input type="hidden" value="false" name="persistent"/> 405 </form> 406 <a v-on:click="connect($event)" href="#" class="media"> 407 <svg width="28px" height="28px"> 408 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#photo-video"></use> 409 </svg> 410 <span class="sr-only">@Translate(basicNavbarPrefix + "Mediabank", "Mediabank")</span> 411 </a> 412 </li> 413 </media-bank> 414 415 } 416 @if (Pageview.Area.Culture == "da-DK" || Pageview.User != null) 417 { 418 <cart-icon cartlink="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("checkout")"></cart-icon> 419 } 420 </ul> 421 </div> 422 </div> 423 </header> 424 @using Dynamicweb.Frontend; 425 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 426 427 @Title("Page") 428 @Description("Default page template") 429 @{ 430 string basicPagePrefix = "Page "; 431 } 432 @if (Pageview.IsCurrentUserAllowed) 433 { 434 var pageLayout = !string.IsNullOrEmpty(Model.Item.GetValue<ListViewModel>("Layout").SelectedValue) ? Model.Item.GetValue<ListViewModel>("Layout").SelectedValue : "content-page-sidebar"; 435 var pageClass = pageLayout == "page-wide" ? "basic_page-wide" : "basic_page"; 436 if (!Model.Item.GetBoolean("HideBreadcrumb")) 437 { 438 if (Model.Area.Item.GetFile("TopImage") != null) 439 { 440 <figure> 441 <img src="/Admin/Public/GetImage.ashx?Height=200&amp;Compression=85&amp;Crop=6&amp;Image=@Model.Area.Item.GetFile("TopImage").Path" class="img-fluid" alt="webbanner" /> 442 </figure> 443 } 444 @RenderNavigation(new { Template = "basic_Breadcrumb.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 5 }) 445 } 446 <main class="@pageClass"> 447 @if (pageLayout == "content-page-sidebar" || pageLayout == "module-page-sidebar") 448 { 449 <aside class="basic_page-sidebar"> 450 @RenderNavigation(new { Template = "basic_Page.xslt", StartLevel = 1, EndLevel = 3 }) 451 </aside> 452 <div class="basic_page-content"> 453 @if (pageLayout == "content-page-sidebar" && !string.IsNullOrEmpty(Model.Item.GetString("Title").ToString()) || !string.IsNullOrEmpty(Model.Item.GetString("Text").ToString())) 454 { 455 <section class="basic_paragraph"> 456 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title").ToString())) 457 { 458 <header> 459 <h1> 460 @Model.Item.GetString("Title") 461 </h1> 462 </header> 463 } 464 @if (Model.Item.GetFile("Image") != null) 465 { 466 <figure> 467 <img src="@Model.Item.GetFile("Image").Path" alt="@Model.Item.GetString("Title")" class="img-fluid" /> 468 </figure> 469 } 470 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text").ToString())) 471 { 472 @Model.Item.GetString("Text") 473 } 474 </section> 475 } 476 @RenderPlaceholder() 477 </div> 478 } 479 else 480 { 481 @RenderPlaceholder() 482 } 483 </main> 484 } 485 else 486 { 487 <main class="basic_page"> 488 @RenderPlaceholder() 489 </main> 490 } 491 @helper RenderPlaceholder() 492 { 493 @Model.Placeholder("Content", "Content", "unwrap:true;default:true") 494 if (!String.IsNullOrEmpty(Model.Placeholder("Boxed"))) 495 { 496 <div class="grouped"> 497 @Model.Placeholder("Boxed", "Grouped Content", "unwrap:true") 498 </div> 499 } 500 } 501 502 @{ 503 string footerPrefix = "Footer "; 504 } 505 <footer class="basic_footer"> 506 <div class="basic_footer-wrap"> 507 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterOneTitle")) && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterOneText"))) 508 { 509 <div class="basic_footer-box"> 510 <div class="basic_footer-head" role="button" v-b-toggle.footer-one> 511 <h3>@Model.Area.Item.GetString("FooterOneTitle")</h3> 512 </div> 513 <b-collapse id="footer-one" class="basic_footer-collapse"> 514 <div class="basic_footer-body"> 515 @Model.Area.Item.GetString("FooterOneText") 516 </div> 517 </b-collapse> 518 </div> 519 } 520 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTitle")) 521 && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoText")) 522 || !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTag"))) 523 { 524 <div class="basic_footer-box"> 525 <div class="basic_footer-head" role="button" v-b-toggle.footer-two> 526 <h3>@Model.Area.Item.GetString("FooterTwoTitle")</h3> 527 </div> 528 <b-collapse id="footer-two" class="basic_footer-collapse"> 529 <div class="basic_footer-body"> 530 @Model.Area.Item.GetString("FooterTwoText") 531 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterTwoTag"))) 532 { 533 @RenderNavigation(new {Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = @Model.Area.Item.GetString("FooterTwoTag").ToString()}) 534 } 535 </div> 536 </b-collapse> 537 </div> 538 } 539 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTitle")) 540 && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeText")) 541 || !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTag"))) 542 { 543 <div class="basic_footer-box"> 544 <div class="basic_footer-head" role="button" v-b-toggle.footer-three> 545 <h3>@Model.Area.Item.GetString("FooterThreeTitle")</h3> 546 </div> 547 <b-collapse id="footer-three" class="basic_footer-collapse"> 548 <div class="basic_footer-body"> 549 @Model.Area.Item.GetString("FooterThreeText") 550 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterThreeTag"))) 551 { 552 @RenderNavigation(new {Template = "basic_Footer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4, NavigationTag = @Model.Area.Item.GetString("FooterThreeTag").ToString()}) 553 } 554 </div> 555 </b-collapse> 556 </div> 557 } 558 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterFourTitle")) && !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterFourText"))) 559 { 560 <div class="basic_footer-box"> 561 <div class="basic_footer-head" role="button" v-b-toggle.footer-four> 562 <h3>@Model.Area.Item.GetString("FooterFourTitle")</h3> 563 </div> 564 <b-collapse id="footer-four" class="basic_footer-collapse"> 565 <div class="basic_footer-body"> 566 @Model.Area.Item.GetString("FooterFourText") 567 </div> 568 </b-collapse> 569 </div> 570 } 571 </div> 572 573 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FooterCopyright"))) 574 { 575 576 <div class="basic_footer-sub"> 577 <div class="basic_footer-wrap"> 578 <div class="basic_footer-col"> 579 <p> 580 &copy; @DateTime.Now.Year @Model.Area.Item.GetString("FooterCopyright") 581 </p> 582 </div> 583 @if (Model.Area.Item.GetValue<ListViewModel>("Cards").SelectedValues.Any()) 584 { 585 <div class="basic_footer-col text-center cards"> 586 @foreach (var cards in Model.Area.Item.GetValue<ListViewModel>("Cards").SelectedValues) 587 { 588 <img src="/Files/Images/cards/@cards" alt="@cards.Split('.').First()"/> 589 } 590 </div> 591 } 592 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FacebookUrl")) 593 || !string.IsNullOrEmpty(Model.Area.Item.GetString("LinkedInUrl")) 594 || !string.IsNullOrEmpty(Model.Area.Item.GetString("YoutubeUrl"))) 595 { 596 <div class="basic_footer-col text-right some"> 597 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("FacebookUrl"))) 598 { 599 <a href="@Model.Area.Item.GetString("FacebookUrl")" target="_blank" aria-label="Facebook" rel="noreferrer"> 600 <svg> 601 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#facebook-square"></use> 602 </svg> 603 </a> 604 } 605 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("LinkedInUrl"))) 606 { 607 <a href="@Model.Area.Item.GetString("LinkedInUrl")" target="_blank" aria-label="LinkedIn" rel="noreferrer"> 608 <svg> 609 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#linkedin"></use> 610 </svg> 611 </a> 612 } 613 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("YoutubeUrl"))) 614 { 615 <a href="@Model.Area.Item.GetString("YoutubeUrl")" target="_blank" aria-label="Youtube" rel="noreferrer"> 616 <svg> 617 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#youtube-square"></use> 618 </svg> 619 </a> 620 } 621 @if (!string.IsNullOrEmpty(Model.Area.Item.GetString("SmileyUrl"))) 622 { 623 <a href="@Model.Area.Item.GetString("SmileyUrl")" target="_blank" aria-label="@Translate(footerPrefix + "smiley", "Elite Smiley")"> 624 <svg> 625 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#elite-smiley-nocolor"></use> 626 </svg> 627 </a> 628 } 629 </div> 630 } 631 </div> 632 </div> 633 } 634 </footer> 635 <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'> 636 <div></div> 637 </basic-alert> 638 </div> 639 640 <script type="text/x-template" id="cart-icon-template"> 641 @{ 642 string cartIconPrefix = "Minicart "; 643 } 644 <li> 645 <a :href="cartlink"> 646 <svg> 647 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#shopping-cart"></use> 648 </svg> 649 <span class="label">@Translate(cartIconPrefix + "Checkout", "Checkout")</span> 650 <strong v-if="!cartEmpty" class="cart-quantity">{{quantity}}</strong> 651 </a> 652 </li> 653 </script> 654 655 656 657 <script type="text/x-template" id="basic-facet-filter-template"> 658 @{ 659 string basicFacetPrefix = "Filter "; 660 } 661 <aside> 662 <template v-if="HasActiveFilter()"> 663 664 <p id="selected-filter-label" class="sr-only"> 665 @Translate(basicFacetPrefix + "Active", "Active") 666 </p> 667 <div class="basic_filter-active" aria-labelledby="selected-filter-label"> 668 <template v-for="facetFilter in facetFilters"> 669 <span v-for="option in SelectedOptions(facetFilter)" class="custom-control custom-filter"> 670 <input type="checkbox" 671 :id="'Selected-' + facetFilter.name + '-' + option.name" 672 :name="facetFilter.name" 673 :value="option.value" 674 :v-model="option.selected" 675 :checked="option.selected" 676 v-on:click="ToggleFilter(facetFilter.name,option)" 677 class="custom-control-input" /> 678 <label :for="'Selected-' + facetFilter.name + '-' + option.name" class="custom-control-label" :data-name="facetFilter.name"> 679 <span> 680 {{option.label}} 681 </span> 682 <svg> 683 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#times"></use> 684 </svg> 685 </label> 686 </span> 687 </template> 688 </div> 689 </template> 690 <b-collapse class="basic_filter" id="sidebar-filter"> 691 <template v-if="!error && facetFilters"> 692 <button type="button" class="btn-close" v-b-toggle.sidebar-filter.sidebar-overlay aria-label="@Translate(basicFacetPrefix + "Close Filter", "Close Filter")"> 693 <span></span> 694 <span></span> 695 </button> 696 <div class="basic_filter-groups"> 697 <div class="basic_filter-group" v-for="(facetFilter, index) in facetFilters"> 698 <p :id="'filter-group-' + facetFilter.name.toLowerCase().trim()" v-b-toggle="'filter-collapse-' + facetFilter.name.toLowerCase().trim()"> 699 <template v-if="facetFilter.name === 'ModelType'"> 700 @Translate(basicFacetPrefix + "ModelType", "Model / Type") 701 </template> 702 <template v-else-if="facetFilter.name === 'DoorType'"> 703 @Translate(basicFacetPrefix + "DoorType", " Door type") 704 </template> 705 <template v-else-if="facetFilter.name === 'ExternalHeight'"> 706 @Translate(basicFacetPrefix + "ExternalHeight", "External Height") (mm) 707 </template> 708 <template v-else-if="facetFilter.name === 'NetVolume'"> 709 @Translate(basicFacetPrefix + "NetVolume", "Net Volume") (l) 710 </template> 711 <template v-else-if="facetFilter.name === 'DoorNumber'"> 712 @Translate(basicFacetPrefix + "DoorNumber", " Number of doors") 713 </template> 714 <template v-else-if="facetFilter.name === 'ExteriorFinish'"> 715 @Translate(basicFacetPrefix + "ExteriorFinish", "Exterior Finish") 716 </template> 717 <template v-else-if="facetFilter.name === 'ExternalWidth'"> 718 @Translate(basicFacetPrefix + "ExternalWidth", "External Width") (mm) 719 </template> 720 <template v-else-if="facetFilter.name === 'GrossVolume'"> 721 @Translate(basicFacetPrefix + "GrossVolume", "Gross Volume") (l) 722 </template> 723 <template v-else-if="facetFilter.name === 'Bottles330'"> 724 @Translate(basicFacetPrefix + "Bottles330", "Capacity 330ml bottles") 725 </template> 726 <template v-else-if="facetFilter.name === 'Bottles500'"> 727 @Translate(basicFacetPrefix + "Bottles500", "Capacity 500ml bottles") 728 </template> 729 <template v-else-if="facetFilter.name === 'Cans330'"> 730 @Translate(basicFacetPrefix + "Cans330", "Capacity 300ml cans") 731 </template> 732 <template v-else-if="facetFilter.name === 'Cans500'"> 733 @Translate(basicFacetPrefix + "Cans500", "Capacity 500ml cans") 734 </template> 735 <template v-else-if="facetFilter.name === 'TemperatureRange'"> 736 @Translate(basicFacetPrefix + "TemperatureRange", "Temperature Range") 737 </template> 738 <template v-else-if="facetFilter.name === 'TemperatureRangeZone2'"> 739 @Translate(basicFacetPrefix + "TemperatureRangeZone2", "Tempature Range 2") 740 </template> 741 <template v-else-if="facetFilter.name === 'ShelfNumber'"> 742 @Translate(basicFacetPrefix + "ShelfNumber", "Number of shelfs") 743 </template> 744 <template v-else-if="facetFilter.name === 'LidType'"> 745 @Translate(basicFacetPrefix + "LidType", "Lid Type") 746 </template> 747 <template v-else-if="facetFilter.name === 'InteriorFinish'"> 748 @Translate(basicFacetPrefix + "InteriorFinish", "Interior Finish") 749 </template> 750 <template v-else-if="facetFilter.name === 'WineBottles750'"> 751 @Translate(basicFacetPrefix + "WineBottles750", "Capacity 750ml winebottles") 752 </template> 753 <template v-else> 754 {{facetFilter.name}} 755 </template> 756 <svg> 757 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/Files/dist/icons/icons.svg#chevron-up"></use> 758 </svg> 759 </p> 760 <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()"> 761 <template v-if="facetFilter.optionActiveCount > 5"> 762 <span v-for="option in facetFilter.options.slice(0, 5)" class="custom-control custom-checkbox facet-option"> 763 <input type="checkbox" class="custom-control-input" 764 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 765 :name="facetFilter.name" 766 :value="option.value" 767 :v-model="option.selected" 768 :checked="option.selected" 769 v-on:click="ToggleFilter(facetFilter.name,option)" /> 770 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 771 {{option.label}} <span class="count">({{option.count}})</span> 772 </label> 773 </span> 774 <b-collapse class="basic_filter-expand" :id="'filter-expand-' + facetFilter.name.toLowerCase().trim()" :visible="ShowMoreIfSelected(facetFilter.options, index)"> 775 <span v-for="option in facetFilter.options.slice(5)" class="custom-control custom-checkbox facet-option"> 776 <input type="checkbox" class="custom-control-input" 777 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 778 :name="facetFilter.name" 779 :value="option.value" 780 :v-model="option.selected" 781 :checked="option.selected" 782 v-on:click="ToggleFilter(facetFilter.name,option)" /> 783 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 784 {{option.label}} <span class="count">({{option.count}})</span> 785 </label> 786 </span> 787 </b-collapse> 788 <a v-b-toggle="'filter-expand-' + facetFilter.name.toLowerCase().trim()" class="basic_filter-expanding" v-if="facetFilter.optionActiveCount > 6"> 789 <span class="show-more">+ @Translate(basicFacetPrefix + "show more", "show more")</span> 790 <span class="show-less">- @Translate(basicFacetPrefix + "show less", "show less")</span> 791 </a> 792 </template> 793 <template v-else> 794 <span v-for="option in facetFilter.options" class="custom-control custom-checkbox facet-option"> 795 <input type="checkbox" class="custom-control-input" 796 :id="'UnSelected-' + facetFilter.name + '-' + option.name" 797 :name="facetFilter.name" 798 :value="option.value" 799 :v-model="option.selected" 800 :checked="option.selected" 801 v-on:click="ToggleFilter(facetFilter.name,option)" /> 802 <label :for="'UnSelected-' + facetFilter.name + '-' + option.name" class="custom-control-label"> 803 {{option.label}} <span class="count">({{option.count}})</span> 804 </label> 805 </span> 806 </template> 807 </b-collapse> 808 </div> 809 </div> 810 </template> 811 </b-collapse> 812 </aside> 813 </script> 814 <script type="text/x-template" id="add-to-basket-simple-template"> 815 @{ 816 string addToBasketSimplePrifix = "BuyButton "; 817 } 818 <div class="form-flex" v-if="priceWithoutVat > 0" v-bind:class="[{added: IsAdded}, {adding: IsAdding}, {disabled: !canAdd}]"> 819 820 <label for="quantity">@Translate(addToBasketSimplePrifix + "Quantity", "Quantity")</label> 821 <input class="form-control" type="number" name="quantity" v-model="quantity" autocomplete="off" onclick="this.setSelectionRange(0, this.value.length)"> 822 <button :disabled="!canAdd" :class="buttonClass" v-on:click="addToBasketAndResetQuantity()" aria-label="@Translate(addToBasketSimplePrifix + "Add", "Add")"> 823 <slot> 824 <svg> 825 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#shopping-cart"> 826 </use> 827 </svg> 828 <span> 829 @Translate(addToBasketSimplePrifix + "Add to basket", "Add to basket") 830 </span> 831 </slot> 832 833 </button> 834 835 <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> 836 <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> 837 <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> 838 </div> 839 </script> 840 841 <script type="text/x-template" id="quick-add-template"> 842 @{ 843 string quickAddPrifix = "BuyButton "; 844 } 845 <div v-bind:class="[{added: IsAdded}, {adding: IsAdding}]"> 846 <label for="quantity">@Translate(quickAddPrifix + "Quantity", "Quantity")</label> 847 <input class="form-control" type="number" id="quantity" name="quantity" v-model="quantity" autocomplete="off"> 848 </div> 849 </script> 850 851 <script type="text/x-template" id="add-to-basket-button-only-template"> 852 @{ 853 string addToBasketPrefix = "BuyButton "; 854 } 855 <div v-bind:class="[{added: IsAdded}, {adding: IsAdding}]"> 856 <button :class="buttonClass" v-on:click="addToBasket()"> 857 <slot> 858 @Translate(addToBasketPrefix + "Add to basket", "Add to basket") 859 </slot> 860 </button> 861 </div> 862 </script> 863 <script type="text/x-template" id="async-price-template"> 864 @{ 865 string asyncPrefix = "Async "; 866 867 } 868 869 <div :class="classType + (loading ? ' loading' : '')"> 870 <template> 871 <p :class="classType + '--error'" v-if="error">{{error}}</p> 872 </template> 873 <template v-if="!loading"> 874 <template v-if="!forceAskForPrice && price.netUnitPrice.priceWithoutVat"> 875 876 <p class="price"> 877 <span itemprop="price" :content="price.netUnitPrice.priceWithoutVat">{{ price.netUnitPrice.priceWithoutVat | currency(price.currencyCode) }}</span> 878 <span class="sr-only" itemprop="priceCurrency" content="@(Pageview.User?.Currency ?? Pageview.Area.EcomCurrencyId)">@(Pageview.User?.Currency ?? Pageview.Area.EcomCurrencyId)</span> 879 </p> 880 <small>@Translate(asyncPrefix + "price without vat", "Price without VAT")</small> 881 </template> 882 <template v-if="!price?.netUnitPrice?.priceWithoutVat || forceAskForPrice"> 883 <a :href="'mailto:@Translate("Ask for a price EMAIL.","info@tefcold.dk")?subject=' + '@Translate("Ask for a price.")' + ' - ' + product.product.name + ' - ' + product.product.shortDescription + '&body=@Translate("ProductName EMAIL (BODY)", "Produktnavn: ") ' + product.product.name + ' - @Translate("ProductShortName EMAIL (BODY)", "Kort produktnavn: ") ' + product.product.shortDescription" class="btn btn-outline-secondary btn-sm">@Translate("Ask for a price.", "Spørg om pris.")</a> 884 </template> 885 </template> 886 </div> 887 </script> 888 <script type="text/x-template" id="pagination-template"> 889 @{ 890 string paginationPrefix = "Pagination "; 891 } 892 <nav aria-label="@Translate(paginationPrefix + "Productlist pagination", "Productlist pagination")"> 893 <ul class="pagination"> 894 <li :class="['page-item', currentPage == 1 ? 'disabled' : '' ]"> 895 <a class="page-link" v-on:click="togglePrevPage()" aria-label="@Translate(paginationPrefix + "Previous Page", "Previous Page")" v-bind:aria-disabled="currentPage > 1 ? 'true' : null"> 896 <svg> 897 <use xmlns:xlink="http://www.w3.org/1999/xlink" 898 xlink:href="/files/dist/icons/icons.svg#chevron-left"> 899 </use> 900 </svg> 901 </a> 902 </li> 903 <template v-if="hasGroupId"> 904 <li v-if="showPage(n)" v-for="n in totalPages" :key="n" :class="(n == currentPage ? 'page-item active' : 'page-item')"> 905 <a v-on:click="togglePage(n)" v-bind:aria-current="(n == currentPage ? 'true' : '')" class="page-link"> 906 {{n}} 907 </a> 908 </li> 909 </template> 910 <template v-else> 911 <li class="page-item"> 912 <span class="page-label"> 913 {{currentPage}} 914 </span> 915 </li> 916 <li class="page-item"> 917 <span class="page-label"> 918 @Translate(paginationPrefix + "of", "of") 919 </span> 920 </li> 921 <li class="page-item"> 922 <span class="page-label"> 923 {{totalPages}} 924 </span> 925 </li> 926 </template> 927 <li :class="'page-item' + (currentPage >= totalPages ? ' disabled' : '')"> 928 <a v-on:click="toggleNextPage()" aria-label="@Translate(paginationPrefix + "Next Page", "Next Page")" class="page-link" v-bind:aria-disabled="totalPages > currentPage ? 'true' : null"> 929 <svg class="icon-pagination"> 930 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#chevron-right"></use> 931 </svg> 932 </a> 933 </li> 934 </ul> 935 </nav> 936 </script> 937 <script type="text/x-template" id="product-specification-list-view-template"> 938 <div class="basic_listview-data"> 939 <template v-if="!isSparePart"> 940 <p itemprop="description"> 941 {{ SpecificationHelpers.GetFirstSpecificationValueOrDefault('GrossNetVolume',productSpecifications)}} {{ SpecificationHelpers.GetSpecificationUnit(SpecificationHelpers.GetSpecificationByKey('GrossNetVolume',productSpecifications))}} 942 <br /> 943 {{ SpecificationHelpers.GetFirstSpecificationValueOrDefault('ExternalDimensionWeb',productSpecifications)}} 944 945 </p> 946 </template> 947 <p itemprop="sku">@Translate("PLP No.", "No.") {{productNumber}}</p> 948 </div> 949 </script> 950 <script type="text/x-template" id="product-spare-parts-view-template"> 951 @{ 952 string basicPimPrefix = "PDP "; 953 } 954 <div> 955 <button class="btn-collapse" id="spareparts" v-b-toggle.spareparts-list> 956 @Translate(basicPimPrefix + "spare parts", "Spare Parts") 957 </button> 958 <template> 959 <b-collapse id="spareparts-list" accordion="specs2"> 960 <template> 961 <div class="body-collapse full pb-0"> 962 <ul class="basic_pim-spares"> 963 <li> 964 <a :href="explodedDrawing" target="_blank"> 965 <svg> 966 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 967 </svg> 968 @Translate(basicPimPrefix + "view exploded drawing of spare parts", "View exploded drawing of spare parts") 969 </a> 970 </li> 971 <li :data-point="spare.product.position" class="basic_pim-spare" v-for="spare in spareParts"> 972 <div class="head"> 973 <a href="#" v-on:click="navigateToSpare($event,spare.product.id)" class="name">{{spare.product.productName}}</a> 974 <p class="sku">{{spare.product.number}}</p> 975 </div> 976 @if (Pageview.User != null) 977 { 978 <div class="foot"> 979 <async-price class-type="asyncprice-spare" 980 :product="spare" 981 :default-price="spare.product.price" 982 list-price="true" 983 > 984 </async-price> 985 <add-to-basket-simple 986 :product="spare" 987 :unit-of-measure="'PCS'" 988 button-class="btn btn-primary" 989 class="addtobasketsimple-plp" 990 :price-without-vat="spare.product.price" 991 language-id="@Pageview.Area.EcomLanguageId" 992 :only-spare-parts="@(Pageview.User.OnlySpareParts().ToString().ToLower())" 993 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())"> 994 </add-to-basket-simple> 995 </div> 996 } 997 @*<p>DEBUG: {{spare}}</p>*@ 998 </li> 999 1000 </ul> 1001 </div> 1002 </template> 1003 </b-collapse> 1004 </template> 1005 </div> 1006 1007 </script> 1008 <script type="text/x-template" id="variant-list-template"> 1009 <ul class="variants" v-if="initialVariant.product.hasVariants" > 1010 <li> 1011 <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"/> 1012 <label :for="'main-' + initialVariant.product.id" :style="getImageOrColor(initialVariant.product.variantImage,initialVariant.product.variantValue)"></label> 1013 </li> 1014 <li v-for="variant in initialVariant.product.simpleVariants"> 1015 <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" /> 1016 <label :for="'color-'+variant.product.id+ '-' + variant.product.variantId" :style="getImageOrColor(variant.product.variantImage,variant.product.variantValue)"> 1017 </label> 1018 </li> 1019 </ul> 1020 </script> 1021 <script type="text/x-template" id="product-template"> 1022 <article itemscope itemtype="https://schema.org/Product" v-if="product.product" v-bind:key="product.product.number"> 1023 <span class="badge"> 1024 1025 <img v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Height=50&amp;Compression=85&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('Stickers',product.specifications)" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1026 1027 </span> 1028 <a :href="product.product.url" itemprop="url"> 1029 <figure style="min-height: 1px;"> 1030 1031 <img v-if="SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=' + SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" 1032 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1033 <img v-if="!SpecificationHelpers.GetFirstSpecificationValueOrDefault('WebPrimaryImage',product.specifications)" :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=/Files/Images/default.jpg'" 1034 v-bind:alt="product.product.name" itemprop="image" class="img-fluid" /> 1035 </figure> 1036 <header> 1037 <h1 itemprop="name">{{product.product.name}}</h1> 1038 <p itemprop="category">{{product.product.shortDescription}}</p> 1039 <product-specification-list-view :product-specifications="product.specifications" 1040 :product-number="product.product.number" 1041 :is-spare-part="product.product.isSparePart"> 1042 </product-specification-list-view> 1043 </header> 1044 </a> 1045 <template v-if="plpClass=='basic_listview-list'"> 1046 <ul class="basic_listview-specs"> 1047 <li v-for="item in SpecificationHelpers.GetPrettyBulletPoints(product.specifications)"> 1048 {{item}} 1049 </li> 1050 </ul> 1051 @*{{ product.Product.LongDescription }}*@ 1052 </template> 1053 1054 @if (!Pageview.IsAllowedToShop()) 1055 { 1056 <footer> 1057 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("create-account")" class="btn btn-outline-secondary btn-sm"> 1058 @Translate("create account", "Create account") 1059 </a> 1060 <buying-component inline-template :selected-product="product" :initial-product="initialProduct"> 1061 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1062 </buying-component> 1063 </footer> 1064 } 1065 else 1066 { 1067 <buying-component inline-template :selected-product="product" :initial-product="initialProduct"> 1068 <footer itemprop="offers" itemscope="" itemtype="https://schema.org/Offer"> 1069 <variant-list :initial-variant="initialProduct" :currently-selected="selectedProduct"></variant-list> 1070 <async-price class-type="asyncprice-plp" 1071 :product="selectedProduct" 1072 :default-price="selectedProduct.product.defaultPrice.priceWithoutVat" 1073 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 1074 list-price="true" 1075 :should-emit-warranties="@((Pageview.IsAllowedToShop()).ToString().ToLower())" 1076 :force-ask-for-price="(!selectedProduct.product.isSparePart && @((Pageview.User.OnlySpareParts()).ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())"> 1077 </async-price> 1078 <add-to-basket-simple :product="selectedProduct" 1079 :unit-of-measure="'PCS'" 1080 button-class="btn btn-primary" 1081 class="addtobasketsimple-plp" 1082 :price-without-vat="currentItemPriceWithoutVat" 1083 language-id="@Pageview.Area.EcomLanguageId" 1084 :only-spare-parts="@(Pageview.User.OnlySpareParts().ToString().ToLower())" 1085 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())"> 1086 </add-to-basket-simple> 1087 </footer> 1088 </buying-component> 1089 } 1090 1091 </article> 1092 1093 </script> 1094 <script type="text/x-template" id="quick-search-template"> 1095 <div class="quicksearch-component"> 1096 <div class="quickorder-form"> 1097 <slot name="right-box"></slot> 1098 <div class="quickorder-box"> 1099 <h2>@Translate("Find products")</h2> 1100 <div class="quickorder-input"> 1101 <label for="quickOrderSearch">@Translate("Product name or number")</label> 1102 <input type="text" 1103 :id="id" 1104 v-model="search" 1105 @@keydown.enter="enter" 1106 @@keydown.down="down" 1107 @@keydown.up="up" 1108 @@input="onSearchInput" 1109 class="form-control form-control-lg" 1110 autocomplete="chrome-off" 1111 placeholder="@Translate("Quick order search term")" /> 1112 <label for="quickOrderQty">@Translate("Quantity")</label> 1113 <input type="number" 1114 v-model.number="quantity" 1115 @@change="chosenProduct()" 1116 @@keydown.enter="chosenProduct()" 1117 class="form-control form-control-lg" 1118 id="quickOrderQty" 1119 placeholder="0" 1120 autocomplete="chrome-off" /> 1121 1122 </div> 1123 <ul v-if="filterList.length > 0 && open" class="quickorder-list"> 1124 <li v-for="(product,index) in filterList" 1125 :class="{'active': isSelected(index)}"> 1126 <button @@click="suggestClick(index)"> 1127 {{concatNameAndNumber(product)}} 1128 </button> 1129 1130 </li> 1131 </ul> 1132 1133 <div class="quickorder-product" v-if="currentChosenProduct"> 1134 <p><strong>{{currentChosenProduct.name}}</strong><small>{{currentChosenProduct.shortDescription}}</small></p> 1135 <product-specification-list-view v-if="searchProductSpecs !== null" 1136 :product-specifications="searchProductSpecs" 1137 :product-number="currentChosenProduct.number"> 1138 </product-specification-list-view> 1139 <async-price class-type="quickorder-product-price" 1140 :product="currentChosenProduct" 1141 unit-of-measure="" 1142 :only-price="true" 1143 default-price-without-vat="0" 1144 :force-ask-for-price="(!currentChosenProduct.isSparePart && @(Pageview.User.OnlySpareParts().ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())" 1145 @@price="handlePriceUpdate"> 1146 </async-price> 1147 </div> 1148 </div> 1149 </div> 1150 <p v-if="showPriceError">@Translate("QuickOrderZeroPriceError","Can not add product with zero price")</p> 1151 <div class="quickorder-cart" v-if="productsToOrder.length > 0"> 1152 <table class="table table-striped table-flex"> 1153 <thead> 1154 <tr> 1155 <th>@Translate("Product")</th> 1156 <th>@Translate("Specifications")</th> 1157 <th>@Translate("Quantity")</th> 1158 <th class="cell-right">@Translate("Price")</th> 1159 <th>&nbsp;</th> 1160 </tr> 1161 </thead> 1162 <tbody> 1163 <tr v-for="(product,index) in productsToOrder"> 1164 <td class="cell-prod"> 1165 <strong>{{product.name}}</strong> 1166 <small>{{product.shortDescription}}</small> 1167 </td> 1168 <td class="cell-specs"> 1169 <product-specification-list-view :product-specifications="product.productSpecifications" 1170 :product-number="product.number"> 1171 </product-specification-list-view> 1172 </td> 1173 <td class="cell-specs"> 1174 <strong>{{product.quantity}}</strong> 1175 </td> 1176 <td class="cell-price cell-right"> 1177 <async-price class-type="quickorder-product-price" 1178 :product="quickOrderProductToSimpleProduct(product)" 1179 unit-of-measure="" 1180 :only-price="true" 1181 default-price-without-vat="0" 1182 @@warranty-update="setWarranty($event,product)" 1183 :force-ask-for-price="(!product.isSparePart && @(Pageview.User.OnlySpareParts().ToString().ToLower())) || @(Pageview.User.OnlyView().ToString().ToLower())"> 1184 1185 </async-price> 1186 </td> 1187 <td class="cell-trash"> 1188 <button @@click="removeOrderline(index)" aria-label="@Translate("Delete product")" class="text-danger"> 1189 <svg> 1190 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#trash-alt"></use> 1191 </svg> 1192 </button> 1193 </td> 1194 </tr> 1195 </tbody> 1196 </table> 1197 <slot name="button"></slot> 1198 1199 </div> 1200 </div> 1201 </script> 1202 1203 <script src="@NORRIQ.Common8.Razor.TimestampSource.GetSourceWithTimestamp("/Files/dist/scripts/bundle.min.js")"></script> 1204 <script> 1205 AppStart.VueProvider.init({ 1206 webApiUrl: '@System.Web.Configuration.WebConfigurationManager.AppSettings["WebApiProxyUrl"]', 1207 currencyCode: '@currencyCode', 1208 locale: '@Pageview.Area.Culture', 1209 currencyLeft: false, 1210 currencySpacing: true, 1211 currencySymbol: '@currencyCode', 1212 currencyDecimalSeparator: ',', 1213 currencyGroupSeparator: '.', 1214 currencyDecimalDigits: 2, 1215 dateFormatShort: '@Pageview.Area.Dateformat' 1216 }); 1217 </script> 1218 <script append="replace"></script> 1219 </body> 1220 </html>