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