Error executing template "Designs/junckers/_parsed/espresso.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_f551d89ba5cb42d1bcbd1a7061466cfb.Execute() in D:\dynamicweb.net\Solutions\junckers.espresso4.dk\Files\Templates\Designs\junckers\_parsed\espresso.parsed.cshtml:line 109
   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.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase 2 @using System.Web 3 @using System.IO 4 @using Co3.Espresso.Website.Services 5 @using Dynamicweb 6 @using Dynamicweb.Content 7 @using Dynamicweb.Content.Items 8 @using Dynamicweb.Frontend 9 @using Page = Dynamicweb.Content.Page 10 @{ 11 string globalAreaLang = GetGlobalValue( "Global:Area.Lang" ); 12 string globalPageID = GetGlobalValue( "Global:Page.ID" ); 13 string globalAreaId = GetGlobalValue( "Global:Area.ID" ); 14 string baseUrl = GetGlobalValue( "Global:Request.Scheme" ) + "://" + GetGlobalValue( "Global:Request.Host" ); 15 string openGraphUrl = baseUrl + GetGlobalValue( "Global:Pageview.Url" ); 16 string openGraphImage = baseUrl + Espresso.OpenGraphImage; 17 string productIdParam = "" + Dynamicweb.Context.Current.Request["productid"]; 18 string variantIdParam = "" + Dynamicweb.Context.Current.Request["variantid"]; 19 bool isProductPage = string.IsNullOrEmpty(productIdParam) == false; 20 string pdfProductId = HttpUtility.HtmlAttributeEncode(productIdParam); 21 string pdfPageId = HttpUtility.HtmlAttributeEncode( globalPageID ); 22 string pageCanonical = PageView.Current().Page.MetaCanonical; 23 string globalValueUrl = GetGlobalValue("Global:Pageview.Url"); 24 string globalPrimarydomainNoSubdomain = GetGlobalValue("Global:Area.Primarydomain").Replace( "www.", "" ); 25 string canonicalPageView = String.Format("{0}://{1}{2}", GetGlobalValue("Global:Request.Scheme"), GetGlobalValue("Global:Request.Host"), globalValueUrl); 26 bool isRequestingPDF = Dynamicweb.Context.Current.Request[ "pdfgeneratorworking" ] == "true" || Dynamicweb.Context.Current.Request[ "newpdf" ] == "true" || Dynamicweb.Context.Current.Request[ "newpdf" ] == "test"; 27 bool useNewGtmScript = globalAreaId == "17" || globalAreaId == "54" || globalAreaId == "52" || globalAreaId == "69" || globalAreaId == "16" || globalAreaId == "24" || globalAreaId == "23" || globalAreaId == "22" || globalAreaId == "18" || globalAreaId == "68" || globalAreaId == "65" || globalAreaId == "1" || globalAreaId == "53" ? true : false; 28 bool useOldGtmScript = globalAreaId != "17" && globalAreaId != "54" && globalAreaId != "52" && globalAreaId != "69" && globalAreaId != "16" && globalAreaId != "24" && globalAreaId != "23" && globalAreaId != "22" && globalAreaId != "18" && globalAreaId != "68" && globalAreaId != "65" && globalAreaId != "1" && globalAreaId != "53" ? true : false; 29 30 if ( isRequestingPDF ) 31 { 32 Espresso.Area.OptimizedLoading = false; 33 Espresso.StylesheetAttributeRel = Espresso.Area.OptimizedLoading ? "preload" : "stylesheet"; 34 Espresso.StylesheetAttributeMedia = Espresso.Area.OptimizedLoading ? "only x" : "all"; 35 } 36 37 if (Dynamicweb.Context.Current.Request.Params.AllKeys.Contains("download")) 38 { 39 Dynamicweb.Content.Page currentPage = PageView.Current().Page; 40 string documentationPdf = currentPage.Item["DocumentationPdf"]?.ToString() ?? string.Empty; 41 42 if (isProductPage && string.IsNullOrEmpty(documentationPdf)) 43 { 44 string tecDoc1Value = GetString("Ecom:Product.CategoryField.FloorTechnicalDocuments.TecDoc1.Value.Clean"); 45 46 if (string.IsNullOrEmpty(tecDoc1Value)) 47 { 48 Dynamicweb.Ecommerce.Products.Product dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(productIdParam, variantIdParam, false); 49 tecDoc1Value = dwProduct.GetCategoryValue("FloorTechnicalDocuments", "TecDoc1")?.ToString() ?? string.Empty; 50 } 51 52 if (!string.IsNullOrEmpty(tecDoc1Value)) 53 { 54 string[] valueParts = tecDoc1Value.ToLowerInvariant().Split(new[] { "id=" }, StringSplitOptions.None); 55 56 if (int.TryParse(valueParts.LastOrDefault(), out int pageId)) 57 { 58 Page docPage = Dynamicweb.Content.Services.Pages.GetPage(pageId); 59 if (docPage != null) 60 { 61 documentationPdf = docPage.Item["DocumentationPdf"]?.ToString() ?? string.Empty; 62 } 63 } 64 } 65 } 66 67 if (!string.IsNullOrEmpty(documentationPdf) && documentationPdf.ToLowerInvariant().Contains(".pdf")) 68 { 69 Dynamicweb.Context.Current.Response.Redirect(documentationPdf); 70 } 71 } 72 73 74 string isUsingCookiebot = string.Empty; 75 76 if ( GetBoolean( "Item.Area.IsUsingCookiebot.Value" ) == false ) 77 { 78 isUsingCookiebot = "false"; 79 } 80 else 81 { 82 isUsingCookiebot = "true"; 83 } 84 } 85 <!DOCTYPE html> 86 <html lang="@globalAreaLang"> 87 <head> 88 @* @GetValue( "CopyRightNotice" ) *@ 89 <meta charset="utf-8"> 90 <meta content="width=device-width, initial-scale=1, shrink-to-fit=no, minimal-ui" name="viewport"> 91 <meta content="ie=edge" http-equiv="x-ua-compatible"> 92 93 @if ( isProductPage == false ) 94 { 95 <title>@GetValue("Title")</title> 96 @GetValue("MetaTags") 97 @GetValue("CopyRightNotice") 98 99 if ( string.IsNullOrEmpty(pageCanonical) == true ) 100 { 101 <link rel="canonical" href="@canonicalPageView"> 102 } 103 } 104 else 105 { 106 @RenderSnippet( "productMetaTags" ) 107 } 108 109 @if ( Espresso.Area.OptimizedLoading ) 110 { 111 @Espresso.CriticalCSS 112 } 113 <link crossorigin="" href="https://fonts.gstatic.com/" rel="preconnect"> 114 <link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500%7CMaterial+Icons" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style"> 115 <link href="/Files/Templates/Designs/junckers/_assets/_dist/css/default.css?v=1.1.32" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style"> 116 @if ( isRequestingPDF ) 117 { 118 <link href="/Files/Templates/Designs/junckers/_assets/_dist/css/junckers-pdf.css?v=2.026" media="all" rel="stylesheet"> 119 } 120 121 @*if ( PageView.Current().Page.ID != 29515 ) 122 { 123 <script type='text/javascript' src='https://platform-api.sharethis.com/js/sharethis.js#property=601be95843bf770011180384&product=sop' async='async'></script> 124 }*@ 125 126 @if ( Espresso.Area.OptimizedLoading ) 127 { 128 @Espresso.CriticalJS 129 } 130 @* *@ 131 <link rel="shortcut icon" href="@Espresso.Area.Item.Favicon"> 132 @* @GetValue( "MetaTags" ) *@ 133 @if ( Espresso.IsStagingUrl == true ) 134 { 135 <meta content="noindex,nofollow" name="robots"> 136 } 137 <meta property="og:url" content="@openGraphUrl"> 138 <meta property="og:title" content="@Espresso.OpenGraphTitle"> 139 <meta property="og:description" content="@Espresso.OpenGraphDescription"> 140 <meta property="og:image" content="@openGraphImage"> 141 <meta content="website" property="og:type"> 142 @if ( string.IsNullOrEmpty( Espresso.Area.Item.GoogleSiteVerification ) == false ) 143 { 144 <meta name="google-site-verification" content="@Espresso.Area.Item.GoogleSiteVerification"> 145 } 146 @{ 147 if ( 1 == 2 ) 148 { 149 @GetValue( "Stylesheets" ) 150 } 151 } 152 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" && useOldGtmScript ) 153 { 154 <!-- Google Tag Manager --> 155 <script data-cookieconsent="ignore"> 156 ( function ( w, d, s, l, i ) { 157 w[ l ] = w[ l ] || []; 158 w[ l ].push( { 159 'gtm.start': new Date().getTime(), 160 event: 'gtm.js' 161 } ); 162 var f = d.getElementsByTagName( s )[ 0 ], 163 j = d.createElement( s ), 164 dl = l != 'dataLayer' ? '&l=' + l : ''; 165 j.async = true; 166 j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 167 f.parentNode.insertBefore( j, f ); 168 } )( window, document, 'script', 'dataLayer', '@Espresso.Area.GoogleTagManagerID' ); 169 </script> 170 <!-- End Google Tag Manager --> 171 } 172 173 @if ( useNewGtmScript ) 174 { 175 <!-- Google Tag Manager --> 176 <script data-cookieconsent="ignore"> 177 ( function ( w, d, s, l, i ) { 178 w[ l ] = w[ l ] || []; 179 w[ l ].push( { 180 'gtm.start': new Date().getTime(), 181 event: 'gtm.js' 182 } ); 183 var f = d.getElementsByTagName( s )[ 0 ], 184 j = d.createElement( s ); 185 j.async = true; 186 j.src = 'https://ztdqselj.@globalPrimarydomainNoSubdomain/16ztdqselj.js?' + i; 187 f.parentNode.insertBefore( j, f ); 188 } )( window, document, 'script', 'dataLayer', 'bfp9a=AwhYNCUpWTQmWzEjPD5SDFdeS0JXABpHABkLEBoBBglECA4%3D' ); 189 </script> 190 <!-- End Google Tag Manager --> 191 } 192 193 <!-- Hreflang --> 194 @{ 195 @* Get areas from service *@ 196 Dynamicweb.Content.AreaService areaService = new Dynamicweb.Content.AreaService(); 197 Dynamicweb.Ecommerce.Products.ProductService productService = new Dynamicweb.Ecommerce.Products.ProductService(); 198 IList<Area> areas = areaService.GetAreas(); 199 200 bool pageHasParams = HttpContext.Current.Request.QueryString.HasKeys(); 201 string[] expectedParams = new[] { "ID", "productid" }; 202 IEnumerable<string> additionalParams = HttpContext.Current.Request.QueryString.AllKeys.Where( k => !expectedParams.Contains( k ) ); 203 bool pageHasAllowedParams = true; 204 205 if ( pageHasParams == true ) 206 { 207 if ( additionalParams.Any() ) 208 { 209 pageHasAllowedParams = false; 210 } 211 } 212 213 bool pageHasXDefault = false; 214 string fallbackXDefaultEnglishPageUrl = string.Empty; 215 string fallbackXDefaultPageUrl = string.Empty; 216 217 @* Get current page's relation-text from page-item *@ 218 string currentPageRelation = PageView.Current().Page.Item["PageRelation"] != null ? PageView.Current().Page.Item["PageRelation"].ToString() : string.Empty; 219 220 @* Frontpage must have 'frontpage' as relation-text *@ 221 string CONST_frontpageRelation = "frontpage"; 222 223 if ( pageHasAllowedParams == true ) 224 { 225 @* Iterate areas *@ 226 foreach ( Area area in areas ) 227 { 228 if ( area.Active == true ) 229 { 230 @* Get current area's culture *@ 231 string culture = area.Culture; 232 @* Check for IsDefault Hreflang on area *@ 233 string isDefaultHrefLang = area.Item["IsDefaultHrefLang"] != null ? area.Item["IsDefaultHrefLang"].ToString() : string.Empty; 234 @* Check for override-culture text on area *@ 235 string hreflangCultureOverride = area.Item["HreflangLanguageOverride"] != null ? area.Item["HreflangLanguageOverride"].ToString() : string.Empty; 236 237 @* Get scheme and domain *@ 238 string scheme = GetGlobalValue( "Global:Request.Scheme" ); 239 240 string domain = area.DomainLock; 241 @* If we have a primary domain call pageservice and get pages *@ 242 if ( string.IsNullOrEmpty( currentPageRelation ) == false && string.IsNullOrEmpty( domain ) == false ) 243 { 244 Dynamicweb.Content.PageService pageService = new Dynamicweb.Content.PageService(); 245 IEnumerable<Dynamicweb.Content.Page> pages = pageService.GetPagesByAreaID( area.ID ); 246 247 @* Iterate pages in area - check if is active + has item + has item-pagerelation + item-pagerelation equals current pagerelation *@ 248 foreach ( Dynamicweb.Content.Page page in pages.Where( p => p.Published && !p.Hidden && p.Item != null && p.Item["PageRelation"] != null && p.Item["PageRelation"].ToString().Equals( currentPageRelation ) ) ) 249 { 250 string productId = HttpContext.Current.Request["productid"]; 251 252 string url = string.Empty; 253 254 if ( string.IsNullOrEmpty( productId ) == false ) 255 { 256 @* Build url to area product page *@ 257 Dynamicweb.Ecommerce.Products.Product product = productService.GetProductById( productId, "", area.EcomLanguageId ); 258 if ( product != null && product.Active == true ) 259 { 260 string prodUrl = string.Format( "Default.aspx?ID={0}&ProductId={1}", page.ID, product.Id ); 261 url = string.Format( "{0}://{1}{2}", scheme, domain, SearchEngineFriendlyURLs.GetFriendlyUrl( prodUrl, area.EcomLanguageId ) ); 262 } 263 } 264 else 265 { 266 @* Build url to area page *@ 267 url = string.Format( "{0}://{1}{2}", scheme, domain, SearchEngineFriendlyURLs.GetFriendlyUrl( page.GetPageHrefValue() ) ); 268 if ( string.IsNullOrEmpty( fallbackXDefaultPageUrl ) == true ) 269 { 270 fallbackXDefaultPageUrl = url; 271 } 272 273 if ( string.IsNullOrEmpty( fallbackXDefaultEnglishPageUrl ) == true && culture.ToLower().Contains( "en" ) == true ) 274 { 275 fallbackXDefaultEnglishPageUrl = url; 276 } 277 } 278 279 @* If our current page relation match frontpage - set link to domain only *@ 280 if ( currentPageRelation == CONST_frontpageRelation ) 281 { 282 url = string.Format( "{0}://{1}", scheme, domain ); 283 } 284 285 @* If our area item has checked in Default hreflang, we render x-default link *@ 286 if ( isDefaultHrefLang == "True" ) 287 { 288 <link rel="alternate" hreflang="x-default" href="@url"> 289 pageHasXDefault = true; 290 } 291 292 @* If we have a value in the area-item to overrule the culture, override the value here *@ 293 if ( string.IsNullOrEmpty( hreflangCultureOverride ) == false ) 294 { 295 culture = hreflangCultureOverride; 296 } 297 298 @* Render hreflang-link *@ 299 if ( string.IsNullOrEmpty( url ) == false ) 300 { 301 <link rel="alternate" hreflang="@culture.ToLower()" href="@url"> 302 } 303 } 304 } 305 } 306 } 307 308 if ( pageHasXDefault == false ) 309 { 310 if ( string.IsNullOrEmpty( fallbackXDefaultEnglishPageUrl ) ) 311 { 312 <link rel="alternate" hreflang="x-default" href="@fallbackXDefaultPageUrl"> 313 } 314 else 315 { 316 <link rel="alternate" hreflang="x-default" href="@fallbackXDefaultEnglishPageUrl"> 317 } 318 } 319 } 320 } 321 <!-- End Hreflang --> 322 323 @if ( string.IsNullOrEmpty( GetString( "Item.Area.MailchimpPopupScript.Value" ) ) == false ) 324 { 325 @GetString( "Item.Area.MailchimpPopupScript.Value" ) 326 } 327 328 @if ( string.IsNullOrEmpty( GetString( "Item.MailchimpPopupScript.Value" ) ) == false ) 329 { 330 @GetString( "Item.MailchimpPopupScript.Value" ) 331 } 332 333 @GetValue("Stylesheets") 334 @GetValue("Javascripts") 335 </head> 336 337 @{ 338 Item globalPageItem = null; 339 340 if ( string.IsNullOrWhiteSpace( Espresso.DynamicwebPage.ShortCut ) == false ) 341 { 342 globalPageItem = Co3.Junckers.Frontend.Services.EnglishLanguagesPageItemService.Instance.GetPageItem( Espresso.DynamicwebPage.ShortCut ); 343 } 344 345 string pdfLink = string.Format( "{0}&newpdf=true&gid={1}", GetGlobalValue( "Global:Pageview.Url.Raw" ).Replace( "&newpdf=true", string.Empty ).Replace( "&newpdf=test", string.Empty ), Guid.NewGuid().ToString( "N" ) ); 346 347 string junckersHasDocumentationPdfLink = string.Empty; 348 349 if ( globalAreaLang == "en" && globalPageItem != null ) 350 { 351 junckersHasDocumentationPdfLink = globalPageItem["DocumentationPdf"] != null ? globalPageItem["DocumentationPdf"].ToString() : string.Empty; 352 } 353 else 354 { 355 junckersHasDocumentationPdfLink = string.IsNullOrEmpty( GetString( "Item.DocumentationPdf.Value" ) ) == false ? GetString( "Item.DocumentationPdf.Value" ) : string.Empty; 356 } 357 } 358 359 <body class="@Espresso.Item.CustomClasses @Espresso.Area.OptimizedLoading" data-pdf="@junckersHasDocumentationPdfLink" data-cookiebot="@isUsingCookiebot"> 360 361 @SnippetStart( "PasswordProtectedPage" ) 362 @{ 363 string pwProtectedPageContent = ""; 364 } 365 @foreach ( LoopItem pwProtectedPage in GetLoop( "Item.Area.PasswordProtectedPage" ) ) 366 { 367 string pwProtectedPagePageID = pwProtectedPage.GetString( "Item.Area.PasswordProtectedPage.PasswordProtectedPage_PageID" ); 368 369 if ( globalPageID == pwProtectedPagePageID ) 370 { 371 pwProtectedPageContent = pwProtectedPage.GetString( "Item.Area.PasswordProtectedPage.PasswordProtectedPage_Content" ); 372 @pwProtectedPageContent 373 } 374 } 375 @if ( pwProtectedPageContent == "" ) 376 { 377 <h1>Login</h1> 378 <p class="lead">@Translate( "Junckers_PasswordPage_Text", "Input password" )</p> 379 } 380 @SnippetEnd( "PasswordProtectedPage" ) 381 382 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" && useOldGtmScript ) 383 { 384 <!-- Google Tag Manager (noscript) --> 385 <noscript> 386 <iframe src="https://www.googletagmanager.com/ns.html?id=@Espresso.Area.GoogleTagManagerID" height="0" width="0" style="display: none; visibility: hidden"></iframe> 387 </noscript> 388 <!-- End Google Tag Manager (noscript) --> 389 } 390 @if ( useNewGtmScript ) 391 { 392 <!-- Google Tag Manager (noscript) --> 393 <noscript> 394 <iframe src="https://ztdqselj.@globalPrimarydomainNoSubdomain/ns.html?id=GTM-NL7TPMZ" height="0" width="0" style="display:none;visibility:hidden"></iframe> 395 </noscript> 396 <!-- End Google Tag Manager (noscript) --> 397 } 398 @using Co3.Espresso.Website.Models.FrontEnd 399 @{ 400 Espresso.Canvas.ClassList.AddClasses( "js-e-canvas is-loading" ); 401 if ( Espresso.Item.CanvasFullscreen == "True" ) 402 { 403 Espresso.Canvas.ClassList.AddClasses( "is-fullscreen" ); 404 } 405 if ( Espresso.Item.DisablePDFHeader != null && Espresso.Item.DisablePDFHeader == "True" ) 406 { 407 Espresso.ContentArea.ClassList.AddClasses( "pdf-header-disabled" ); 408 } 409 } 410 411 412 413 @using System.Globalization 414 @using Co3.Espresso.Base.Extensions 415 @using Co3.Espresso.DownloadManager.Models 416 @using Co3.Espresso.Website.Models.FrontEnd 417 @using Co3.Espresso.Website.Services 418 @using Dynamicweb.Content 419 @using Dynamicweb.Frontend 420 @using Dynamicweb.Rendering 421 @using EcomContext = Dynamicweb.Ecommerce.Common.Context 422 423 @functions { 424 425 public string getCountryCodeFromArea( Area area ) 426 { 427 RegionInfo regionInfo = new RegionInfo( area.CultureInfo.LCID ); 428 return regionInfo.TwoLetterISORegionName; 429 } 430 431 public dynamic GetPriceInfo( string beforePrice = "", string basicPrice = "" ) 432 { 433 double vat = EcomContext.Country.Vat; 434 double dblBeforePrice = 0; 435 double.TryParse( beforePrice, out dblBeforePrice ); 436 double dblBasicPrice = 0; 437 double.TryParse( basicPrice, out dblBasicPrice ); 438 double dblBeforePriceWithVat = 0; 439 double dblDiffPrice = 0; 440 int pct = 0; 441 442 if ( dblBeforePrice > 0 ) 443 { 444 dblBeforePriceWithVat = dblBeforePrice * ( ( vat / 100d ) + 1 ); 445 if ( dblBeforePriceWithVat > dblBasicPrice ) 446 { 447 dblDiffPrice = dblBeforePriceWithVat - dblBasicPrice; 448 pct = (int)Math.Ceiling((( 100d / dblBeforePriceWithVat ) * dblDiffPrice)); 449 } 450 } 451 452 dynamic returnValue = new 453 { 454 beforePriceWithVat = dblBeforePriceWithVat, 455 beforePriceWithVatFormatted = ProductService.Instance.GetPriceFormatted(dblBeforePriceWithVat), 456 basicPrice = dblBasicPrice, 457 basicPriceFormatted = ProductService.Instance.GetPriceFormatted(dblBasicPrice), 458 diffPrice = dblDiffPrice, 459 diffPriceFormatted = ProductService.Instance.GetPriceFormatted(dblDiffPrice), 460 pct = pct, 461 vat = vat 462 }; 463 return returnValue; 464 } 465 466 } 467 468 469 @helper ProductDescription(string sectionClasses = "e-section", bool sectionCollapse = false, string contentClasses = null, string heading = null, string content = null) 470 { 471 if ( string.IsNullOrEmpty( content ) == false ) 472 { 473 ClassList headingClassList = new ClassList(); 474 headingClassList.AddClasses( "col-12" ); 475 ClassList contentClassList = new ClassList(); 476 contentClassList.AddClasses( "col-12" ); 477 478 @sectionStart( sectionClasses: sectionClasses, sectionCollapse: sectionCollapse, contentClasses: contentClasses ) 479 480 if ( string.IsNullOrEmpty( heading ) == false ) 481 { 482 <div class="@headingClassList"> 483 <h2>@heading</h2> 484 </div> 485 } 486 <div class="@contentClassList"> 487 @content 488 </div> 489 490 @sectionEnd() 491 } 492 } 493 494 495 @helper ProductVideo(string sectionClasses = "e-section", string contentClasses = null, string heading = null, string videoURL = null) 496 { 497 if ( string.IsNullOrEmpty( videoURL ) == false ) 498 { 499 ClassList headingClassList = new ClassList(); 500 headingClassList.AddClasses( "col-12" ); 501 ClassList contentClassList = new ClassList(); 502 contentClassList.AddClasses( "col-12" ); 503 504 505 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses ) 506 507 if ( string.IsNullOrEmpty( heading ) == false ) 508 { 509 <div class="@headingClassList"> 510 <h2>@heading</h2> 511 </div> 512 } 513 514 <div class="@contentClassList"> 515 <div class="embed-responsive embed-responsive-16by9 mb-2"> 516 <iframe class="embed-responsive-item" src="@videoURL" width="1080" height="608" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe> 517 </div> 518 </div> 519 @sectionEnd() 520 } 521 } 522 523 @helper ProductRelatedProducts(string sectionClasses = "e-section p-section p-section-bg-white pt-3 border-bottom", string contentClasses = null, string heading = null, 524 IEnumerable<RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem> productLoop = null) 525 { 526 if ( productLoop != null && productLoop.Any() == true ) 527 { 528 ClassList headingClassList = new ClassList(); 529 headingClassList.AddClasses( "col-10 mx-auto" ); 530 ClassList contentClassList = new ClassList(); 531 contentClassList.AddClasses( "col-10 mx-auto" ); 532 533 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses ) 534 535 if ( string.IsNullOrEmpty( heading ) == false ) 536 { 537 <div class="@headingClassList"> 538 <h2>@heading</h2> 539 </div> 540 } 541 542 543 <div class="@contentClassList"> 544 <div class="e-products mb-2"> 545 <div class="row"> 546 @{ 547 string productlistItemClassList = ProductlistService.Instance.GetGridItemWidth( null ).ToResponsiveClasses(); 548 } 549 @foreach ( RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product in productLoop ) 550 { 551 @ProductlistItem( product, productlistItemClassList ) 552 } 553 </div> 554 </div> 555 </div> 556 557 @sectionEnd() 558 } 559 } 560 561 @helper ProductlistItem(RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product, string productlistItemClassList = null) 562 { 563 if ( product != null ) 564 { 565 dynamic productData = new 566 { 567 id = product.GetString( "Ecom:Product.ID" ), 568 url = ProductService.Instance.GetProductLink( product.GetString( "Ecom:Product.PrimaryOrFirstGroupID" ), product.GetString( "Ecom:Product.ID" ) ), 569 number = product.GetString( "Ecom:Product.Number" ), 570 name = product.GetString( "Ecom:Product.Name" ), 571 imageLarge = ImageService.Instance.GetImageURL( product.GetString( "Ecom:Product.ImageLarge.Clean" ), 450, 350, 5 ), 572 price = ProductService.Instance.GetPriceFormatted( product.GetDouble( "Ecom:Product.Price.Price" ) ), 573 descriptionShortExtra01 = product.GetString( "Ecom:Product:Field.DescriptionShortExtra01" ), 574 descriptionShort = product.GetString( "Ecom:Product.ShortDescription" ), 575 stock = new 576 { 577 id = product.GetString( "Ecom:Product:Stock.ID" ), 578 quantity = product.GetString( "Ecom:Product.Stock" ), 579 text = product.GetString( "Ecom:Product:Stock.Text" ), 580 delivery = product.GetString( "Ecom:Product:Stock.DeliveryText" ) 581 } 582 }; 583 584 <div class="@productlistItemClassList"> 585 <div class="e-products-item js-e-products-item"> 586 <div class="e-products-item-container"> 587 <div class="junckers-relatedproducts-item-image-container" style="background: url(@productData.imageLarge)"> 588 @if ( string.IsNullOrEmpty( productData.descriptionShort ) == false ) 589 {<div class="junckers-relatedproducts-item-text-container py-1"> 590 <p class="e-products-item-text mb-0 px-2 small"> 591 <strong>Package Size</strong> 592 </p> 593 <p class="e-products-item-text mb-0 text-muted px-2 small"> 594 @productData.descriptionShort 595 </p> 596 </div> 597 } 598 </div> 599 <div class="e-products-item-text-container text-center"> 600 <h3 class="e-products-item-name mb-0"> 601 @productData.name 602 </h3> 603 @* <p class="e-products-item-text mb-0"> *@ 604 @* <small class="e-products-item-price small text-muted"> *@ 605 @* <a href="@productData.url"> *@ 606 @* @productData.price *@ 607 @* </a> *@ 608 @* </small> *@ 609 @* </p> *@ 610 </div> 611 </div> 612 </div> 613 </div> 614 } 615 } 616 617 618 @helper sectionStart(string sectionClasses = "e-section", string contentClasses = null, bool sectionCollapse = false, string collapseToggleTextExpand = "Se mere", string collapseToggleTextCollapse = "Se mindre") 619 { 620 ClassList sectionClassList = new ClassList(); 621 sectionClassList.AddClasses( sectionClasses ); 622 ClassList contentClassList; 623 string collapseId = Guid.NewGuid().ToString( "N" ); 624 ClassList collapseToggleClassList = new ClassList(); 625 if ( contentClasses == null ) 626 { 627 contentClassList = Co3.Espresso.Website.Services.PageService.Instance.GetResponsiveClassesFromPageItem( PageView.Current().Page.Item ); 628 } 629 else 630 { 631 contentClassList = new ClassList(); 632 contentClassList.AddClasses( contentClasses ); 633 } 634 if ( sectionCollapse == true ) 635 { 636 sectionClassList.AddClasses( "p-section-collapse js-p-section-collapse" ); 637 collapseToggleClassList.AddClasses( contentClasses ); 638 collapseToggleClassList.AddClasses( "p-section-collapse-toggle collapsed order-last text-center" ); 639 contentClassList.AddClasses( "p-section-collapse-content collapse is-md" ); 640 } 641 @:<section class="@sectionClassList"> 642 @:<div class="container-fluid"> 643 @:<div class="row"> 644 645 if ( sectionCollapse == true ) 646 // TODO: SplitPattern into seperate heler function 647 { 648 <div class="@collapseToggleClassList" data-toggle="collapse" data-target="#@collapseId"> 649 <button class="btn btn-primary p-section-collapse-toggle-btn" type="button"> 650 <i class="material-icons p-section-collapse-toggle-icon">keyboard_arrow_down</i> 651 </button> 652 <small class="p-section-collapse-toggle-text h4" data-expand-text="@collapseToggleTextExpand" data-collapse-text="@collapseToggleTextCollapse"></small> 653 </div> 654 } 655 656 @:<div class="@contentClassList" id="@collapseId"> 657 @:<div class="row"> 658 } 659 660 @helper sectionEnd() 661 { 662 @:</div> 663 @:</div> 664 @:</div> 665 @:</div> 666 @:</section> 667 } 668 669 670 671 672 <div class="e-loading-overlay e-page-loading-overlay is-loading js-e-page-loading-overlay"> 673 <div class="e-loading-spinner"></div> 674 </div> 675 676 677 678 <div class="@Espresso.Canvas.ClassList"> 679 @{ 680 ClassList headerClassList = new ClassList(); 681 headerClassList.AddClasses( "e-header js-e-header is-sticky" ); 682 if ( Espresso.Item.HeaderTransparent == "True" ) 683 { 684 headerClassList.AddClasses( "is-transparent" ); 685 } 686 687 ClassList logoClassList = new ClassList(); 688 logoClassList.AddClasses( "e-logo" ); 689 690 string backButtonLink = Espresso.Item.BackButtonLink; 691 ClassList backButtonClassList = new ClassList(); 692 ClassList backButtonIconClassList = new ClassList(); 693 if ( Espresso.Item.BackButton == "True" ) 694 { 695 backButtonClassList.AddClasses( "btn btn-sm btn-secondary my-1 align-self-center" ); 696 if ( backButtonLink == "" || backButtonLink == "/" ) 697 { 698 backButtonLink = "/"; 699 backButtonClassList.AddClasses( "js-e-back-link" ); 700 } 701 backButtonIconClassList.AddClasses( "material-icons" ); 702 if ( Espresso.Item.BackButtonPosition == "right" ) 703 { 704 backButtonClassList.AddClasses( "order-last" ); 705 logoClassList.AddClasses( "order-first" ); 706 } 707 else 708 { 709 backButtonClassList.AddClasses( "order-first" ); 710 logoClassList.AddClasses( "mr-0 ml-auto order-last" ); 711 } 712 if ( Espresso.Item.BackButtonIcon == "arrow_back" ) 713 { 714 backButtonClassList.AddClasses( "arrow-left" ); 715 backButtonIconClassList.AddClasses( "d-none" ); 716 } 717 else if ( Espresso.Item.BackButtonIcon == "arrow_forward" ) 718 { 719 backButtonClassList.AddClasses( "arrow-right" ); 720 backButtonIconClassList.AddClasses( "d-none" ); 721 } 722 } 723 724 string logoPrimary = Espresso.Area.Item.LogoPrimary; 725 string logoSecondary = Espresso.Area.Item.LogoSecondary; 726 if ( string.IsNullOrEmpty( logoSecondary ) == true ) 727 { 728 logoSecondary = logoPrimary; 729 } 730 string tagline = Espresso.Area.Item.Tagline; 731 Dictionary< string, string > navigationHtml = new Dictionary< string, string > 732 { 733 { 734 "global", RenderNavigation( new 735 { 736 id = "dwnav-global", 737 template = "global.xslt", 738 startlevel = 1, 739 endlevel = 8, 740 expandmode = "all" 741 } ) 742 }, 743 { 744 "utilities-primary", RenderNavigation( new 745 { 746 id = "dwnav-utilities-primary", 747 template = "utilities.xslt", 748 startlevel = 4, 749 endlevel = 5, 750 expandmode = "all", 751 parenttag = "utilities-primary" 752 } ) 753 }, 754 { 755 "utilities-secondary", RenderNavigation( new 756 { 757 id = "dwnav-utilities-secondary", 758 template = "utilities.xslt", 759 startlevel = 4, 760 endlevel = 4, 761 expandmode = "all", 762 parenttag = "utilities-secondary" 763 } ) 764 }, 765 { 766 "hamburger-header", RenderNavigation( new 767 { 768 id = "dwnav-hamburger-header", 769 template = "utilities.xslt", 770 startlevel = 4, 771 endlevel = 4, 772 expandmode = "all", 773 parenttag = "hamburger-header" 774 } ) 775 }, 776 { 777 "hamburger-aside", RenderNavigation( new 778 { 779 id = "dwnav-hamburger-aside", 780 template = "utilities.xslt", 781 startlevel = 4, 782 endlevel = 4, 783 expandmode = "all", 784 parenttag = "hamburger-aside" 785 } ) 786 } 787 }; 788 } 789 @if ( Espresso.Item.HeaderHide != "True" ) 790 { 791 <header class="@headerClassList" data-autohide="true"> 792 793 <div class="e-header-hamburger"> 794 @sectionStart( "e-header-section e-section", "col-12" ) 795 <div class="col-12 e-header-section-content"> 796 <div class="@logoClassList"> 797 <a class="e-logo-link" href="/"> 798 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary"> 799 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary"> 800 @if ( string.IsNullOrEmpty( tagline ) == false ) 801 { 802 <p class="e-logo-tagline">@tagline</p> 803 } 804 </a> 805 </div> 806 @if ( Espresso.Item.NavigationHide != "True" ) 807 { 808 <section class="e-nav-hamburger-header"> 809 <ul class="nav"> 810 @navigationHtml[ "hamburger-header" ] 811 @* TODO: Move to xslt *@ 812 <li class="e-nav-item-hamburger-open nav-item"> 813 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#"> 814 <i class="e-nav-pageicon material-icons">menu</i> 815 <span class="e-nav-pagename">@Translate( "Header - Hamburger menu open - Button", "Menu" )</span> 816 </a> 817 </li> 818 </ul> 819 </section> 820 } 821 @if ( Espresso.Item.BackButton == "True" ) 822 { 823 <a class="@backButtonClassList" href="@backButtonLink"> 824 @if ( Espresso.Item.BackButtonIcon != "" ) 825 { 826 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i> 827 } 828 @Espresso.Item.BackButtonText 829 </a> 830 } 831 </div> 832 @sectionEnd() 833 </div> 834 <div class="e-nav js-e-nav modal p-0" data-backdrop="false"> 835 <div class="e-nav-container navbar"> 836 837 @sectionStart( "e-header-section e-section", "col-12" ) 838 <div class="col-12 e-header-section-content"> 839 <div class="@logoClassList"> 840 <a class="e-logo-link" href="/"> 841 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName"> 842 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary"> 843 @if ( string.IsNullOrEmpty( tagline ) == false ) 844 { 845 <p class="e-logo-tagline">@tagline</p> 846 } 847 </a> 848 </div> 849 850 @if ( Espresso.Item.NavigationHide != "True" ) 851 { 852 <nav class="e-nav-global js-e-nav-global"> 853 <ul class="nav"> 854 @navigationHtml[ "global" ] 855 </ul> 856 </nav> 857 858 <div class="e-nav-item-hamburger-close"> 859 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#"> 860 <i class="e-nav-pageicon material-icons">close</i> 861 <span class="e-nav-pagename">@Translate( "Header - Hamburger menu close - Button", "Close" )</span> 862 </a> 863 </div> 864 865 if ( string.IsNullOrEmpty( navigationHtml[ "utilities-primary" ] ) == false ) 866 { 867 @:</div> 868 @sectionEnd() 869 @sectionStart( "bg-tertiary e-header-section e-section", "col-12" ) 870 @:<div class="col-12 e-header-section-content"> 871 872 <nav class="e-nav-utilities-primary js-e-nav-utilities-primary"> 873 <ul class="nav"> 874 @navigationHtml[ "utilities-primary" ] 875 </ul> 876 </nav> 877 } 878 if ( string.IsNullOrEmpty( navigationHtml[ "utilities-secondary" ] ) == false ) 879 { 880 <nav class="e-nav-utilities-secondary"> 881 <ul class="nav"> 882 @navigationHtml[ "utilities-secondary" ] 883 </ul> 884 </nav> 885 } 886 if ( string.IsNullOrEmpty( navigationHtml[ "hamburger-aside" ] ) == false ) 887 { 888 <nav class="e-nav-hamburger-aside"> 889 <ul class="nav"> 890 @navigationHtml[ "hamburger-aside" ] 891 </ul> 892 </nav> 893 } 894 } 895 @if ( Espresso.Item.BackButton == "True" ) 896 { 897 <a class="@backButtonClassList" href="@backButtonLink"> 898 @if ( Espresso.Item.BackButtonIcon != "" ) 899 { 900 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i> 901 } 902 @Espresso.Item.BackButtonText 903 </a> 904 } 905 </div> 906 @sectionEnd() 907 908 </div> 909 </div> 910 911 </header> 912 } 913 914 915 916 @using Dynamicweb.Security.UserManagement 917 @{ 918 User currentUser = User.get_Current( PagePermissionLevels.Frontend ); 919 if ( currentUser != null ) 920 { 921 User currentSecondaryUser = currentUser.CurrentSecondaryUser; 922 if ( currentSecondaryUser != null ) 923 { 924 @sectionStart( "e-section bg-warning", "col-12" ) 925 <div class="align-self-center col-12 col-lg-9 col-md-8 my-1"> 926 <p class="line-height-sm mb-0 text-center text-md-left"> 927 <i class="material-icons material-icons-2x">supervisor_account</i> You are currently impersonating this user: <strong>@currentUser.Name</strong> 928 </p> 929 </div> 930 <div class="align-self-center col-12 col-lg-3 col-md-4 my-1"> 931 <form class="mb-0 small text-center text-md-right" method="post" action="@Espresso.Area.Item.ExtranetImpersonationPage"> 932 <button class="btn btn-primary" name="DwExtranetRemoveSecondaryUser" type="submit">Stop impersonation</button> 933 </form> 934 </div> 935 @sectionEnd() 936 } 937 } 938 } 939 940 941 <main class="e-content"> 942 @using Dynamicweb.Content; 943 @using Dynamicweb.Extensibility; 944 @{ 945 string eBreadcrumbClasslist = "e-breadcrumb js-e-breadcrumb d-none d-lg-block"; 946 if ( Espresso.Item.Breadcrumb != "auto" && Espresso.Item.Breadcrumb != "none" && String.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false ) 947 { 948 eBreadcrumbClasslist += string.Format( " e-breadcrumb-{0}", Espresso.Item.Breadcrumb ); 949 } 950 string navigationHtmlBreadcrumb = RenderNavigation( new 951 { 952 id = "dwnav-breadcrumb", 953 template = "breadcrumb.xslt", 954 startlevel = 1, 955 endlevel = 10, 956 expandmode = "pathonly" 957 } ); 958 } 959 960 @if ( string.IsNullOrEmpty( navigationHtmlBreadcrumb ) == false && Espresso.Item.Breadcrumb != "none" && string.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false ) 961 { 962 <section class="e-section @eBreadcrumbClasslist"> 963 <div class="container-fluid"> 964 <div class="row"> 965 <div class="col-12"> 966 <div class="row"> 967 968 <div class="col-12"> 969 <nav class="e-breadcrumb-container"> 970 <ol class="breadcrumb nav text-muted"> 971 <li class="breadcrumb-item m-0 p-0"> 972 <a class="arrow-left breadcrumb-back-link js-e-back-link px-0" href="/">@Translate( "Breadcrumb - Back link", "Back" )</a> 973 <span class="breadcrumb-prefix-text"> 974 @Translate( "Breadcrumb - Prefix - Text", "You are here:" ) 975 </span> 976 <a href="/"> 977 @ServiceLocator.Current.GetPageService().GetFirstPageForArea( GetInteger( "DwAreaID" ) ).MenuText 978 </a> 979 </li> 980 @navigationHtmlBreadcrumb 981 </ol> 982 </nav> 983 </div> 984 985 </div> 986 </div> 987 </div> 988 </div> 989 </section> 990 } 991 992 993 <article id="dwcontentmain" class="e-content-main @Espresso.ContentArea.ClassList"> 994 @{ 995 string NavigationLocalHorizontalClassList = "e-nav-local e-nav-local-horizontal js-e-nav-local-horizontal"; 996 string NavigationLocalHorizontalContainerClassList = "e-nav-local-container"; 997 if( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" ) { 998 NavigationLocalHorizontalClassList += " " + Espresso.Item.NavigationLocalCustomClasses; 999 if( Espresso.Item.NavigationLocalSticky == "True" ) { 1000 NavigationLocalHorizontalClassList += " is-sticky"; 1001 } 1002 if( Espresso.Item.NavigationLocalAbsolute == "True" ) { 1003 NavigationLocalHorizontalClassList += " is-absolute"; 1004 } 1005 else{ 1006 if( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" ) { 1007 NavigationLocalHorizontalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop; 1008 } 1009 if( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" ) { 1010 NavigationLocalHorizontalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom; 1011 } 1012 } 1013 } 1014 } 1015 @if( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" ) { 1016 <section class="e-section @NavigationLocalHorizontalClassList"> 1017 <div class="container-fluid"> 1018 <div class="row"> 1019 <div class="col-12"> 1020 <div class="row"> 1021 1022 <div class="col-12"> 1023 <nav id="dwnav-local-@Espresso.DynamicwebPage.ID" class="@NavigationLocalHorizontalContainerClassList"> 1024 <ul class="nav justify-content-start"> 1025 @if( Espresso.Item.NavigationLocalHeading != "" ){ 1026 <li class="e-nav-local-heading"><h2>@Espresso.Item.NavigationLocalHeading</h2></li> 1027 } 1028 @RenderNavigation( new { 1029 id = "dwnav-local-" + Espresso.DynamicwebPage.ID, 1030 parentid = string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) == false ? Espresso.Item.NavigationLocalParentPage : Espresso.DynamicwebPage.ID, 1031 template = string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false ? Espresso.Item.NavigationLocalTemplate : "local-" + Espresso.Item.NavigationLocalLayout + ".xslt", 1032 startlevel = Espresso.Item.NavigationLocalLevelStart, 1033 endlevel = Espresso.Item.NavigationLocalLevelEnd, 1034 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path", 1035 } ) 1036 </ul> 1037 </nav> 1038 </div> 1039 1040 </div> 1041 </div> 1042 </div> 1043 </div> 1044 </section> 1045 } 1046 1047 1048 @{ 1049 string NavigationLocalVerticalClassList = "e-nav-local e-nav-local-vertical js-e-nav-local-vertical"; 1050 string NavigationLocalVerticalContainerClassList = "e-nav-local-container"; 1051 string NavigationLocalVerticalTemplate = "local-" + Espresso.Item.NavigationLocalLayout + ".xslt"; 1052 if ( string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false && Path.GetExtension( Espresso.Item.NavigationLocalTemplate ) == ".xslt" ) 1053 { 1054 NavigationLocalVerticalTemplate = Path.GetFileName( Espresso.Item.NavigationLocalTemplate ); 1055 } 1056 1057 if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" ) 1058 { 1059 NavigationLocalVerticalClassList += " " + Espresso.Item.NavigationLocalCustomClasses; 1060 //NavigationLocalVerticalClassList += " col-3"; 1061 1062 if ( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" ) 1063 { 1064 NavigationLocalVerticalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop; 1065 } 1066 if ( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" ) 1067 { 1068 NavigationLocalVerticalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom; 1069 } 1070 1071 if ( Espresso.Item.NavigationLocalSticky == "True" ) 1072 { 1073 NavigationLocalVerticalClassList += " is-sticky"; 1074 } 1075 1076 if ( Espresso.Item.NavigationLocalAbsolute == "True" ) 1077 { 1078 NavigationLocalVerticalClassList += " is-absolute"; 1079 } 1080 else 1081 { 1082 Espresso.ContentSection.ClassList.Clear(); 1083 Espresso.ContentSection.ClassList.AddClasses( "wtf col-12 col-lg-9 ml-auto" ); 1084 } 1085 } 1086 } 1087 1088 @if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" ) 1089 { 1090 <section class="e-section @NavigationLocalVerticalClassList"> 1091 <div class="container-fluid"> 1092 <div class="row"> 1093 <div class="col-12"> 1094 <div class="row"> 1095 1096 <div class="col-3"> 1097 <nav id="dwnav-local-@Espresso.DynamicwebPage.ID" class="@NavigationLocalVerticalContainerClassList"> 1098 <ul class="flex-column nav"> 1099 @if ( Espresso.Item.NavigationLocalHeading != "" ) 1100 { 1101 <li class="e-nav-local-heading"> 1102 <h2>@Espresso.Item.NavigationLocalHeading</h2> 1103 </li> 1104 } 1105 @RenderNavigation( new 1106 { 1107 id = "dwnav-local-" + Espresso.DynamicwebPage.ID, 1108 parentid = string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) == false ? Espresso.Item.NavigationLocalParentPage : Espresso.DynamicwebPage.ID, 1109 template = NavigationLocalVerticalTemplate, 1110 startlevel = Espresso.Item.NavigationLocalLevelStart, 1111 endlevel = Espresso.Item.NavigationLocalLevelEnd, 1112 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path", 1113 } ) 1114 </ul> 1115 </nav> 1116 </div> 1117 1118 </div> 1119 </div> 1120 </div> 1121 </div> 1122 </section> 1123 } 1124 1125 1126 @sectionStart() 1127 @GetValue("DwContent(dwcontentmain)") 1128 @sectionEnd() 1129 </article> 1130 </main> 1131 @using System.Globalization 1132 @using Dynamicweb.Frontend 1133 @{ 1134 string FooterContentClassList = "e-footer-content e-section"; 1135 if ( Espresso.Item.ContentAnimate == "True" ) 1136 { 1137 @* FooterContentClassList += " js-e-scroll-reveal"; *@ 1138 } 1139 } 1140 @if ( Espresso.Item.FooterHide != "True" ) 1141 { 1142 <footer class="e-footer"> 1143 <article class="e-footer-wrapper"> 1144 <section class="@FooterContentClassList"> 1145 <div class="container-fluid"> 1146 <div class="row"> 1147 @if ( string.IsNullOrEmpty( Espresso.Area.Item.FooterParagraphs ) == false ) 1148 { 1149 foreach ( string paragraphID in Espresso.Area.Item.FooterParagraphs.Split( new char[] { ',' }, StringSplitOptions.None ) ) 1150 { 1151 @RenderParagraphContent( int.Parse( paragraphID ) ) 1152 ; 1153 } 1154 } 1155 @if ( string.IsNullOrEmpty( GetString( "DwNavigation(dwnavutilitiessecondaryfooter)" ) ) == false ) 1156 { 1157 <div class="col-12"> 1158 <aside class="e-nav-utilities-secondary"> 1159 <ul class="nav nav-inline"> 1160 @GetValue("DwNavigation(dwnavutilitiessecondaryfooter)") 1161 </ul> 1162 </aside> 1163 </div> 1164 } 1165 </div> 1166 </div> 1167 </section> 1168 <section class="e-footer-copyright e-section"> 1169 <div class="container-fluid"> 1170 <div class="row align-items-center"> 1171 <div class="col-12 col-sm-7"> 1172 <p class="e-copyright"> 1173 @Translate( "Footer - Copyright - Text", "Copyright &copy;" ) 1174 @GetGlobalValue( "Global:Server.Date.Year" ) 1175 @Espresso.Area.Item.CompanyName. 1176 @Translate( "Footer - All Rights Reserved - Text", "All rights reserved." ) 1177 </p> 1178 </div> 1179 <div class="col-12 col-sm-5 text-left text-sm-right"> 1180 <p class="website-by-co3"><a href="https://www.co3.dk/pim" target="_blank">Website: Co3</a></p> 1181 <p class="pdf-only">@Translate( "Footer - PDF created - Text", "PDf created:" ) @DateTime.Now.ToString( PageView.Current().Area.CultureInfo )</p> 1182 </div> 1183 </div> 1184 </div> 1185 </section> 1186 </article> 1187 </footer> 1188 } 1189 1190 @if( string.IsNullOrEmpty( GetString("DwContent(dwcontentcta)") ) == false ) { 1191 <aside id="dwcontentcta" class="js-e-cta e-cta is-hidden fixed-top"> 1192 <section class="e-section"> 1193 <div class="container-fluid"> 1194 <div class="row no-gutters"> 1195 <div class="col-12"> 1196 <div class="row no-gutters justify-content-center align-items-center"> 1197 @GetValue("DwContent(dwcontentcta)") 1198 @* <p><a class="d-flex align-items-center justify-content-center justify-content-lg-left text-black text-decoration-none small" href="/bliv-ringet-op"><i class="material-icons material-icons-large text-primary mr-1">phone</i>Bliv ringet op</a></p> *@ 1199 </div> 1200 </div> 1201 </div> 1202 </div> 1203 </section> 1204 </aside> 1205 } 1206 1207 <div class="e-cart-msg modal fade small" id="js-e-cart-msg" data-backdrop="false"> 1208 <div class="modal-dialog e-cart-msg-modal-dialog"> 1209 <div class="modal-content"> 1210 <div class="modal-header"> 1211 <h4 class="m-0 js-e-cart-msg-heading modal-title"> 1212 <i class="material-icons material-icons-large text-black">check_circle</i> 1213 <span>@Translate( "eCom Cart - Product Added - Heading", "Added to your cart" )</span> 1214 </h4> 1215 <button class="close" data-dismiss="modal" type="button"> 1216 <i class="material-icons">close</i> 1217 </button> 1218 </div> 1219 <div class="modal-body d-none"> 1220 <div class="js-e-cart-msg-content"> 1221 <script id="js-e-handlebars-tmpl-cart-msg-lastadded" type="text/x-handlebars-template"> 1222 <div class="row"> 1223 {{#each cart.lastAdded}} 1224 <div class="col-12 py-1"> 1225 <div class="row"> 1226 <div class="col-4"> 1227 <a class="" href="{{url}}"> 1228 <img alt="" class="img-fluid" src="{{imageLarge}}"> 1229 </a> 1230 </div> 1231 <div class="col-8"> 1232 <h3 class="mb-0"> 1233 <a href="{{url}}" class="text-decoration-none">{{name}}</a> 1234 </h3> 1235 <p class="mb-0"> 1236 <a href="{{url}}" class="text-auto text-decoration-none"> 1237 {{{price}}}<br> 1238 {{{stock.text}}}<br> 1239 {{{stock.delivery}}}<br> 1240 </a> 1241 </p> 1242 </div> 1243 </div> 1244 </div> 1245 {{/each}} 1246 </div> 1247 </script> 1248 </div> 1249 </div> 1250 <div class="bg-light e-cart-msg-footer modal-footer border-top-0"> 1251 <a class="btn btn-secondary mr-1" href="/shop/cart" data-dismiss="modal">@Translate( "eCom Checkout - Continue Shopping - Button","Continue Shopping" )</a> 1252 <a class="arrow-right btn btn-success" href="/shop/cart">@Translate( "eCom Checkout - Go to cart - Button","Go to cart" )</a> 1253 </div> 1254 </div> 1255 </div> 1256 </div> 1257 1258 </div> 1259 1260 <div class="modal fade e-search js-e-search js-e-search-modal modal-fullscreen" data-backdrop="false" data-keyboard="true" data-focus="true"> 1261 <div class="modal-dialog"> 1262 <div class="modal-content"> 1263 1264 <div class="modal-header"> 1265 <a class="btn btn-sm btn-secondary js-e-back-link arrow-left" href="/" data-dismiss="modal"> 1266 @Translate("Search - Back button", "Back") 1267 </a> 1268 <div class="e-logo"> 1269 <a href="/" class="e-logo-link my-0"> 1270 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary"> 1271 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary"> 1272 </a> 1273 </div> 1274 </div> 1275 1276 <div class="modal-body"> 1277 1278 <div class="container-fluid"> 1279 1280 <div class="e-search-form-container"> 1281 <div class="row justify-content-center"> 1282 <div class="col-12 col-md-10 col-lg-8 col-xl-6 mt-3"> 1283 <form action="" class="e-search-form js-e-search-form"> 1284 <div class="js-e-search-input-group e-search-input-group is-empty"> 1285 <label class="e-search-label" for="e-search-input"><i class="material-icons">search</i></label> 1286 @{ string Translate_Search_InputText = Translate("Search - Input Placeholder - Text", "Search"); } 1287 <input type="text" class="js-e-search-input e-search-input form-control-plaintext border-0" name="q" id="e-search-input" placeholder="@Translate_Search_InputText"> 1288 <span class="js-e-search-clear e-search-clear"><i class="material-icons">close</i></span> 1289 <button class="e-search-submit btn btn-primary" type="submit"><i class="material-icons">search</i></button> 1290 </div> 1291 </form> 1292 </div> 1293 </div> 1294 </div> 1295 1296 <div class="js-e-search-result-container e-search-result-container"> 1297 1298 <div class="row justify-content-center"> 1299 <div class="col-12 col-md-10 col-lg-8 col-xl-6"> 1300 <p class="e-search-result-info small text-muted mt-1 mb-3"><span class="js-e-search-result-count">0</span> @Translate("Search - Result Count - Text", "results")</p> 1301 </div> 1302 </div> 1303 1304 <div class="row justify-content-center"> 1305 <div class="col-12 col-xl-10"> 1306 <div class="js-e-search-result-products e-search-result-products is-empty mb-4"> 1307 <script id="js-e-handlebars-tmpl-search-result-item-product" type="text/x-handlebars-template"> 1308 <div class="e-products"> 1309 <div class="row"> 1310 {{#loop products}} 1311 <div class="col-6 col-sm-6 col-md-4 col-lg-4"> 1312 <div class="e-products-item"> 1313 <div class="e-products-item-container"> 1314 <div class="e-products-item-image-container"> 1315 <a class="e-products-item-image-wrapper" href="{{url}}"> 1316 <img src="{{imageMedium}}" alt="" class="e-products-item-image j-img-productcategory-{{category}}"> 1317 </a> 1318 </div> 1319 <div class="e-products-item-text-container text-center small"> 1320 <h3 class="e-products-item-name mb-0"><a href="{{url}}">{{name}}</a></h3> 1321 {{#if floorCategoryName}} 1322 <p>{{{floorCategoryName}}}</p> 1323 {{/if}} 1324 {{#if descriptionShortExtra01}} 1325 <p class="e-products-item-text mb-0 small"> 1326 <a href="{{url}}"> 1327 {{descriptionShortExtra01}} 1328 </a> 1329 </p> 1330 {{/if}} 1331 @* <p class="e-products-item-text mb-0 small"> *@ 1332 @* <span class="e-products-item-price"> *@ 1333 @* <a href="{{url}}"> *@ 1334 @* {{{price}}} *@ 1335 @* </a> *@ 1336 @* </span> *@ 1337 @* </p> *@ 1338 </div> 1339 </div> 1340 </div> 1341 </div> 1342 {{/loop}} 1343 </div> 1344 <p class="js-e-search-products-show-all text-center"><a href="" class="btn btn-secondary px-6">@Translate("Search - View All Products - Button", "View All Products")</a></p> 1345 </div> 1346 </script> 1347 </div> 1348 </div> 1349 </div> 1350 1351 <div class="row justify-content-center"> 1352 <div class="col-12 col-md-10 col-lg-8 col-xl-6"> 1353 <div class="js-e-search-result-pages e-search-result-pages is-empty mb-3"> 1354 <script id="js-e-handlebars-tmpl-search-result-item-page" type="text/x-handlebars-template"> 1355 <div class="row"> 1356 {{#loop pages}} 1357 <div class="col-12"> 1358 <p class="mb-0"><a href="{{{url}}}" class="text-bold">{{{title}}}</a></p> 1359 <p class="mb-0 small text-truncate"> 1360 <a href="{{{url}}}" class="text-auto text-muted text-decoration-none"><span class="d-none d-sm-inline">@GetGlobalValue( "Global:Request.Host" )</span>{{{url}}}</a></p> 1361 <p class="small">{{{text}}}...</p> 1362 </div> 1363 {{/loop}} 1364 </div> 1365 </script> 1366 </div> 1367 </div> 1368 </div> 1369 1370 <div class="js-e-search-loading-overlay e-loading-overlay e-search-loading-overlay"> 1371 <div class="e-loading-spinner"></div> 1372 </div> 1373 1374 </div> 1375 1376 </div> 1377 </div> 1378 </div> 1379 </div> 1380 </div> 1381 1382 @if( Espresso.Area.Item.BackToTopLink == "True" ){ 1383 <a href="#top" class="e-back-to-top js-e-back-to-top"><i class="material-icons">keyboard_arrow_up</i></a> 1384 } 1385 1386 1387 1388 1389 <div class="d-none flex-column"> 1390 <div class="bg-primary"> 1391 <br> 1392 </div> 1393 <div class="bg-secondary"> 1394 <br> 1395 </div> 1396 <div class="bg-tertiary"> 1397 <br> 1398 </div> 1399 </div> 1400 <script data-cookieconsent="ignore" async="" src="/Files/Templates/Designs/junckers/_assets/_dist/js/default.js?v=1.17.4"></script> 1401 1402 <a class="js-junckers-documentation-link junckers-documentation-pdf-link js-junckers-pdf-link pdf-hidden" href="#" target="_blank" data-product-id="@pdfProductId" data-page-id="@pdfPageId"> 1403 <i class="material-icons">picture_as_pdf</i> 1404 </a> 1405 </body> 1406 @GetValue( "CopyRightNotice" ) 1407 </html> 1408