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