Error executing template "Designs/Mobler/_parsed/Clean_NoBreadcrumb.parsed.cshtml"
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Dynamicweb.Ecommerce.Products.GroupRelation.GetGroupRelationsByChildId(String childId)
   at Dynamicweb.Ecommerce.Products.Group.get_IsTopGroup()
   at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
   at Dynamicweb.Ecommerce.Products.GroupService.GetToplevelGroups()
   at CompiledRazorTemplates.Dynamic.RazorEngine_3f703a719b5e49e6943672771ed33794.Execute() in D:\dynamicweb.net\Solutions\mobler.LIVE\Files\Templates\Designs\Mobler\_parsed\Clean_NoBreadcrumb.parsed.cshtml:line 83
   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 @using System.Web; 2 @using System.Text.RegularExpressions 3 @using Dynamicweb.Core.Helpers 4 @using Dynamicweb.Frontend.Navigation 5 @using Dynamicweb.Rendering.Translation 6 @using Newtonsoft.Json 7 @using NuGet 8 @using Mobler.Website.CustomCode.Models 9 @using Vite.Dw.Extensions 10 @using HttpUtility = System.Web.HttpUtility 11 @using Mobler.Website.CustomCode.Frontend.V2.Helpers 12 13 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 14 15 @{ 16 string CurrentEcomShopId = Dynamicweb.Frontend.PageView.Current().Area.EcomShopId; 17 string CurrentEcomLanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID; 18 string MainShopLink = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("MainShopLink"); 19 string shopname = Website.GetShopName(); 20 string shopnameEncoded = HttpUtility.UrlEncode(shopname); 21 var shopInfo = Website.ShopInfo(); 22 string globalAreaName = GetGlobalValue("Global:Area.Name"); 23 24 string culture = Dynamicweb.Frontend.PageView.Current().Area.Culture; 25 string designFolder = Dynamicweb.Frontend.PageView.Current().Area.Layout.Design.Name; 26 27 string logoSrc = ""; 28 string logoSrcMobile = ""; 29 30 if (shopname.ToLower() != "møblér" && shopname.ToLower() != "mobler" && shopname.ToLower() != "m%c3%b8bl%c3%a9r" && !string.IsNullOrEmpty(shopname)) 31 { 32 logoSrc = "/Files/Templates/Designs/Mobler/dist/logos/mobler-" + shopname.Replace(" ", "").ToLower() + ".svg"; 33 logoSrcMobile = "/Files/Templates/Designs/Mobler/dist/logos/mobler-" + shopname.Replace(" ", "").ToLower() + "-mobile.svg"; 34 } else { 35 logoSrc = "/Files/Templates/Designs/Mobler/dist/logos/mobler.svg"; 36 logoSrcMobile = "/Files/Templates/Designs/Mobler/dist/logos/mobler.svg"; 37 } 38 39 //this defines a shoppage 40 if (GetString("Item.SystemName") == "TextPage") 41 { 42 shopname = GetString("DwPageName_2"); 43 } 44 45 string imageName = shopname.Replace(" ", string.Empty) + "-owner.png"; 46 string localShopPage = Website.localshopPage(); 47 string FindDealerPage = GetString("Item.Area.FindDealerPage"); 48 string CartPage = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("CartPage"); 49 50 string SearchNoResults = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("NoResults"); 51 string SearchPagePageSize = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SearchPagePageSize") != "0" ? Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SearchPagePageSize") : "20"; 52 string InstantSearchSize = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("InstantsearchPageSize") != "0" ? Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("InstantsearchPageSize") : "10"; 53 54 string SearchResultPageId = ""; 55 if (Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SearchResultPage").Split('=').Length > 1) 56 { 57 SearchResultPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SearchResultPage").Split('=')[1]; 58 } 59 string FooterLinkDestination = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("Link"); 60 int ShopPageId = GetInteger("Item.Area.ShopPageId"); 61 string SearchBarPlaceholder = Translate("SearchbarPlaceholderText", "S&oslash;g.."); 62 int GlobalNewsletterParagraphId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("GlobalNewsletterParagraphId"); 63 int CartCount = GetLoop("OrderLines").Count; 64 bool FirstShopWithSameName = true; 65 string SelectPlaceholder = Translate("ShopSelectPlaceholder", "Indtast by, postnummer eller adresse"); 66 string SelectNoResult = Translate("ShopSelectNoResult", "No such shop found"); 67 int ProductPage = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("PrimaryProductPage"); 68 69 DateTime today = DateTime.Today; 70 string currentYear = today.ToString("yyyy"); 71 72 string BannerBackgroundColor = GetString("Item.Area.BannerBackgroundColor"); 73 string BannerTextColor = GetString("Item.Area.BannerTextColor"); 74 var TopBarNav = GetLoop("Item.Area.TopBarNavigation"); 75 var TopbarHeaderContent = GetLoop("Item.Area.TopbarHeaderContent"); 76 string TilbudBgColor = !String.IsNullOrEmpty(GetString("Item.Area.TilbudBackgroundColor.Value")) ? GetString("Item.Area.TilbudBackgroundColor.Value") : "#00AB5D"; 77 string TilbudTextColor = !String.IsNullOrEmpty(GetString("Item.Area.TilbudTextColor.Value")) ? GetString("Item.Area.TilbudTextColor.Value") : "#FFFFFF"; 78 string StrongPriceBgColor = !String.IsNullOrEmpty(GetString("Item.Area.St_rkPrisBackgroundColor.Value")) ? GetString("Item.Area.St_rkPrisBackgroundColor.Value") : "#9d4778"; 79 string StrongPriceTextColor = !String.IsNullOrEmpty(GetString("Item.Area.St_rkPrisTextColor.Value")) ? GetString("Item.Area.St_rkPrisTextColor.Value") : "#FFFFFF"; 80 var uniqueSellingPoints = GetLoop("Item.Area.UniqueSellingPoints"); 81 string CookieText = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("CookieText"); 82 string CookieReadMore = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("CookieReadMoreText"); 83 var TopLevelGroups = Dynamicweb.Ecommerce.Services.ProductGroups.GetToplevelGroups().Where(g => g.ShopId == CurrentEcomShopId && g.LanguageId == CurrentEcomLanguageId && g.NavigationShowInMenu).ToList(); 84 string CurrentUri = HttpContext.Current.Request.Url.PathAndQuery.ToString().Replace("/Default.aspx", "Default.aspx"); 85 string convertedUri = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(CurrentUri); 86 string CanonicalUri = Website.createCanonical(); 87 string CanonicalDomain = "mobler.dk"; 88 if (Website.IsLocalWebshop()) 89 { 90 CanonicalDomain = System.Web.HttpContext.Current.Request.Url.Host; 91 } 92 string CanonicalURL = "https://" + CanonicalDomain + CanonicalUri; 93 string AvisLink = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("Avis"); 94 string FindShopSearchPlaceholder = Translate("HeaderNav.FindShopPlaceholder", "Indtast postnr., by eller adresse"); 95 string SetBannerEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("GetCartJson"); 96 bool ShowTopBanner = Mobler.Website.CustomCode.Frontend.V2.Helpers.MessageBanner.ShowMessageBanner(); 97 bool EnableTopBarHeader = GetBoolean("Item.Area.EnableTopBarHeader.Value"); 98 bool EnableTopBarNavigation = GetBoolean("Item.Area.EnableTopBarBanner.Value") && ShowTopBanner; 99 100 bool EnableGoogleShoppingScript = GetBoolean("Item.Area.EnableGoogleShoppingScript.Value"); 101 string GoogleShoppingContentKey = GetString("Item.Area.GoogleShoppingContentKey.Value"); 102 103 bool EnableFacebookScript = GetBoolean("Item.Area.EnableFacebookScript.Value"); 104 string FacebookScriptContentKey = GetString("Item.Area.FacebookScriptContentKey.Value"); 105 string PinterestDomainVerifyContentKey = GetString("Item.Area.PinterestDomainVerifyContentKey.Value"); 106 107 bool IsCheckoutStep = false || HttpContext.Current.Request.RawUrl.Contains("checkout"); 108 bool isCheckoutFirstStep = false || HttpContext.Current.Request.RawUrl.Contains("indkoebskurv"); 109 } 110 111 <!doctype html> 112 <html lang="da" class="box-border w-screen"> 113 114 <head> 115 <script> 116 // Temporary workaround for hiding the Cookiebot banner from Web Vitals scans 117 // https://support.cookiebot.com/hc/en-us/articles/360020501579-Google-Core-Web-Vitals-and-Cookiebot-CMP#h_01H05PZGDJ2TGTZBP5R1FC8EMH 118 window.addEventListener("CookiebotOnDialogInit", function() { 119 if (Cookiebot.getDomainUrlParam("CookiebotScan") === "true") 120 Cookiebot.setOutOfRegion(); 121 }); 122 </script> 123 <script id="Cookiebot" src="https://consent.cookiebot.com/uc.js" data-cbid="ec05aeab-ec7b-4d91-81fc-a8ebbcce1f2f" data-blockingmode="auto" type="text/javascript"></script> 124 <script data-cookieconsent="ignore"> 125 window.domGaTrackingEvents = []; 126 window.domFbqTrackingEvents = []; 127 128 window.dataLayer = window.dataLayer || []; 129 function gtag() { 130 dataLayer.push(arguments); 131 } 132 gtag("consent", "default", { 133 ad_storage: "denied", 134 analytics_storage: "denied", 135 functionality_storage: "denied", 136 personalization_storage: "denied", 137 security_storage: "granted", 138 wait_for_update: 500, 139 }); 140 gtag("set", "ads_data_redaction", true); 141 gtag("set", "url_passthrough", true); 142 </script> 143 @*GTM*@ 144 <script> 145 var ecomm_pagetype = "other"; 146 var ecomm_totalvalue = 0; 147 var ecomm_prodid = ""; 148 </script> 149 @RenderSnippet("DataLayerOverwrites") 150 151 @RenderSnippet("DataLayerOverwriteReceipt") 152 153 <!-- Google Tag Manager --> 154 <script data-cookieconsent="ignore">!function () { "use strict"; function e(e) { return function (e) { for (var t = 0, r = document.cookie.split(";"); t < r.length; t++) { var n = r[t].split("="); if (n[0].trim() === e) return n[1] } }(e) } function t(e) { return localStorage.getItem(e) } function r(e) { return window[e] } function n(e, t) { var r = document.querySelector(e); return t ? null == r ? void 0 : r.getAttribute(t) : null == r ? void 0 : r.textContent } !function (o, i, a, c, u, l, s, v, d, f, g) { var E, I, m, T; try { I = d && (m = navigator.userAgent, (T = new RegExp("Version/([0-9._]+)(.*Mobile)?.*Safari.*").exec(m)) && parseFloat(T[1]) >= 16.4) ? function (o, i, a) { void 0 === i && (i = ""); var c = { cookie: e, localStorage: t, jsVariable: r, cssSelector: n }, u = Array.isArray(i) ? i : [i]; if (o && c[o]) for (var l = c[o], s = 0, v = u; s < v.length; s++) { var d = v[s], f = a ? l(d, a) : l(d); if (f) return f } else console.warn("invalid uid source", o) }(d, "user_id", "") : void 0 } catch (e) { console.error(e) } var _ = o; _[c] = _[c] || [], _[c].push({ "gtm.start": (new Date).getTime(), event: "gtm.js" }); var p = i.getElementsByTagName(a)[0], A = I ? "&bi=" + encodeURIComponent(I) : "", N = i.createElement(a), D = I ? "kp" + v : v, R = !I && s ? s : "https://gtm.mobler.dk"; N.async = !0, N.src = R + "/" + D + ".js?id=GTM-PN9ZSS" + A, null === (E = p.parentNode) || void 0 === E || E.insertBefore(N, p) }(window, document, "script", "dataLayer", 0, 0, "", "rcuxkqbl", "cookie") }();</script> 155 <!-- End Google Tag Manager --> 156 <!-- Required meta tags --> 157 <meta charset="utf-8"> 158 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 159 160 @if (string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["productid"])) 161 { 162 163 164 <title>@GetValue("Title")</title> 165 @GetValue("MetaTags") 166 @GetValue("CopyRightNotice") 167 168 } 169 else 170 { 171 @RenderSnippet("ProductDetailsMeta") 172 } 173 174 @if ((Mobler.Website.CustomCode.Frontend.Helper.IsLocalWebshop() && !System.Web.HttpContext.Current.Request.RawUrl.ToLower().EndsWith("/om-os")) || (System.Web.HttpContext.Current.Request.Url.Host.ToLower().Contains("1stweb") && !System.Web.HttpContext.Current.Request.Url.PathAndQuery.ToLower().Contains("debug")) || System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToLower().Contains("groupid=pim-")) 175 { 176 <meta name="robots" content="noindex"> 177 } 178 179 @if (!Mobler.Website.CustomCode.Frontend.Helper.IsLocalWebshop()) 180 { 181 <link rel="canonical" href="@CanonicalURL"> 182 } 183 <meta property="og:url" content="@CanonicalURL"> 184 <meta property="og:title" content="@GetValue(" title")"=""> 185 186 <link rel="shortcut icon" type="image/ico" href="/Files/Templates/Designs/Mobler/public/icons/favicon.ico"> 187 188 @if (GetString("Item.SystemName") == "BlogPost") 189 { 190 string imageMasterPage = GetString("Item.Billede.Value"); 191 string TeaserText = Regex.Replace(GetString("Item.TeaserTekst"), "<.*?>", String.Empty); 192 <meta property="og:type" content="article"> 193 <meta property="og:description" content="@TeaserText"> 194 <meta property="og:image" content="@imageMasterPage"> 195 } 196 else if (GetString("Item.SystemName") == "Brand") 197 { 198 string imageMasterPage = GetString("Item.Logo.Value"); 199 string TeaserText = GetString("Item.Navn"); 200 <meta property="og:type" content="article"> 201 <meta property="og:description" content="@TeaserText"> 202 <meta property="og:image" content="@imageMasterPage"> 203 } 204 else if (System.Web.HttpContext.Current.Items["OverrideOgTags"] != null) 205 { 206 @RenderSnippet("OgTags") 207 } 208 else 209 { 210 <meta property="og:type" content="business.business"> 211 <meta property="og:description" content="@GetString(" meta.description")"=""> 212 <meta property="og:image" content="https://mobler.dk/Files/Templates/Designs/Mobler2018/dist/logos/mobler.svg"> 213 } 214 215 216 @if (EnableGoogleShoppingScript && !string.IsNullOrEmpty(GoogleShoppingContentKey)) 217 { 218 <meta name="google-site-verification" content="@GoogleShoppingContentKey"> 219 } 220 221 @if (EnableFacebookScript && !string.IsNullOrEmpty(FacebookScriptContentKey)) 222 { 223 <meta name="facebook-domain-verification" content="@FacebookScriptContentKey"> 224 } 225 226 @if (EnableFacebookScript && !string.IsNullOrEmpty(PinterestDomainVerifyContentKey)) 227 { 228 <meta name="p:domain_verify" content="@PinterestDomainVerifyContentKey"> 229 } 230 231 @Pageview.AddViteStyles() 232 233 <link rel="preconnect" href="https://content.cylindo.com" crossorigin=""> 234 235 236 @GetValue("Stylesheets") 237 @GetValue("Javascripts") 238 </head> 239 @{ 240 bool isBlackFriday = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetBoolean("BlackFridayTheme"); 241 string blackFridayThemeClass = isBlackFriday ? "theme--black-friday" : ""; 242 } 243 <body class="@blackFridayThemeClass overflow-x-hidden" data-bind="viewModel: 'MasterViewModel', Cookies" data-currentshopislocalwebshop="@Mobler.Website.CustomCode.Frontend.Helper.IsLocalWebshop()" data-mainshoplink="@MainShopLink" data-culture="@culture" data-design="@designFolder"> 244 245 <!-- Google Tag Manager (noscript) --> 246 <noscript><iframe src="https://gtm.mobler.dk/ns.html?id=GTM-PN9ZSS" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 247 <!-- End Google Tag Manager (noscript) --> 248 249 <siteheader></siteheader> 250 251 <div> 252 <header class="js-header"> 253 254 <!-- TODO: Add logic to SiteHeader --> 255 @if (EnableTopBarNavigation && !IsCheckoutStep && TopBarNav != null) 256 { 257 dynamic NotificationData = new 258 { 259 bannerStyle = new 260 { 261 backgroundColor = BannerBackgroundColor, 262 textColor = BannerTextColor 263 }, 264 bannerContent = TopBarNav.Select(item => new 265 { 266 link = item.GetString("Item.Area.TopBarNavigation.NavItemLink"), 267 text = item.GetString("Item.Area.TopBarNavigation.NavItemText") 268 }).ToList() 269 }; 270 object NotificationDataJson = HttpUtility.HtmlAttributeEncode(Newtonsoft.Json.JsonConvert.SerializeObject(NotificationData)); 271 <script>//console.log("%cNotificationDataJson", "color:white;background:rebeccapurple;padding:5px;", @Newtonsoft.Json.JsonConvert.SerializeObject(NotificationData, new Newtonsoft.Json.JsonSerializerSettings {ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore, PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects}));</script> 272 273 <notificationelement data-theme="info" data-content="@NotificationDataJson"></notificationelement> 274 @*<div class="container-fluid js-top-banner topbar-nav"> 275 276 <div class="text-center" style="background-color:@BannerBackgroundColor;"> 277 <div class="flex justify-center items- py-1"> 278 <ul class="list-none"> 279 @foreach (var navItem in TopBarNav) 280 { 281 string ItemLink = navItem.GetString("Item.Area.TopBarNavigation.NavItemLink"); 282 string ItemText = navItem.GetString("Item.Area.TopBarNavigation.NavItemText"); 283 <li> 284 <a class="nav-link p-1 rte-content" href='@ItemLink' style="color:@BannerTextColor;"> 285 @ItemText 286 </a> 287 </li> 288 } 289 </ul> 290 <div class="ml-2"> 291 <a href="#" data-bind="topBanner: { target: '.js-top-banner', endpoint: '@SetBannerEndpoint' }"> 292 <i class="fa-solid fa-xmark" style="color:@BannerTextColor;"></i> 293 </a> 294 </div> 295 </div> 296 </div> 297 </div>*@ 298 } 299 </header> 300 </div> 301 302 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 303 304 305 <div id="content1">@GetValue("DwContent(content1)")</div> 306 307 308 @if (!IsCheckoutStep) 309 { 310 if (!isCheckoutFirstStep) 311 { 312 var brandsLoop = @GetLoop("Item.Page.Brand_Icon.Value"); 313 <!-- TODO: (Out of scope) Clean this up so we don't repeat --> 314 <section class="container py-8"> 315 <div class="grid grid-cols-3 md:grid-cols-6 gap-4"> 316 @if (brandsLoop.Count <= 0) 317 { 318 foreach (var item in GetLoop("Item.Area.Featured_Brands")) 319 { 320 string Link = item.GetString("Item.Area.Featured_Brands.Brand.Value"); 321 var Brand = Firstweb.Custom.CustomCode.Frontend.Helpers.Brands.GetBrand(Link); 322 323 if (!String.IsNullOrEmpty(Brand.Name)) 324 { 325 <a href="@Brand.Link"> 326 <img width="900" height="400" class="img-fit-contain-x" src="/Admin/Public/GetImage.ashx?Image=@Brand.Logo&Format=webP&Quality=90&Height=400" alt="@Brand.Name" loading="lazy"> 327 </a> 328 } 329 } 330 } 331 else 332 { 333 foreach (var item in brandsLoop) 334 { 335 string image = item.GetString("Item.Page.Brand_Icon.Value.Image.Value"); 336 string link = item.GetString("Item.Page.Brand_Icon.Value.LinkDestination.Value"); 337 338 if (!String.IsNullOrEmpty(image)) 339 { 340 <a href="@link"> 341 <img width="900" height="400" class="img-fluid" src="/Admin/Public/GetImage.ashx?Image=@image&Format=webP&Quality=90&Height=400" alt="" loading="lazy"> 342 </a> 343 } 344 } 345 } 346 </div> 347 </section> 348 } 349 350 <section class="bg-beige pt-14 lg:pt-28"> 351 <div class="container flex flex-wrap"> 352 <div class="w-full md:w-3/4 lg:w-1/2 flex flex-col md:items-start gap-y-4"> 353 <a href="/" class="flex flex-col md:items-center"> 354 <img width="400" height="46" class="max-h-[46px] hidden md:inline-block" src="@logoSrc" alt='@Translate("LogoAltText", "Møblér: Alt indenfor møbler og boligindretning")' loading="lazy"> 355 <img width="400" height="46" class="max-h-[46px] w-full object-contain object-left inline md:hidden" src="@logoSrcMobile" alt='@Translate("LogoAltText", "Møblér: Alt indenfor møbler og boligindretning")' loading="lazy"> 356 @if (shopname.ToLower() != "møblér") 357 { 358 <small class="text-xs text-grey-dark text-center hidden md:block">@Translate("LogoServiceText", "Ordren serviceres af Møbler.dk")</small> 359 } 360 </a> 361 362 <!-- TODO: This has not been tested and styled --> 363 @if (shopnameEncoded == "M%c3%b8bl%c3%a9r") 364 { 365 <div> 366 <p class="mb-0 font-bold">@GetString("Item.Area.Header")</p> 367 <p> 368 @GetString("Item.Area.About") 369 </p> 370 <a href="@FooterLinkDestination"><u>@Translate("FooterAboutReadMore", "L&aelig;s mere om M&oslash;blér k&aelig;den her")</u></a> 371 </div> 372 } 373 else 374 { 375 if (GetString("Item.SystemName") == "TextPage") 376 { 377 string CurrentAboutUsShopName = GetString("DwPageName_2"); 378 shopInfo = Website.ShopInfo(CurrentAboutUsShopName); 379 shopname = CurrentAboutUsShopName; 380 } 381 382 <div class="flex flex-wrap gap-y-4 w-full"> 383 <div class="w-full md:w-1/2"> 384 <ul class="list-none"> 385 <li class="mb-2"><strong>@shopInfo.ShopName</strong></li> 386 <li>@shopInfo.Address</li> 387 <li>@shopInfo.PostalAndCity</li> 388 <li> 389 <a href="@localShopPage" class="underline text-black">@Translate("ShowOnMap", "Vis p&#229; kort")</a> 390 </li> 391 392 @if (!String.IsNullOrEmpty(shopInfo.Address1)) 393 { 394 <li>@shopInfo.Address1, @shopInfo.PostalAndCity1</li> 395 } 396 @if (!String.IsNullOrEmpty(shopInfo.Address2)) 397 { 398 <li>@shopInfo.Address2, @shopInfo.PostalAndCity2</li> 399 } 400 <li class="mt-4">@shopInfo.Phone</li> 401 <li> 402 <a href="mailto:@shopInfo.Email" class="underline text-black">@shopInfo.Email</a> 403 </li> 404 </ul> 405 </div> 406 407 <div class="w-full md:w-1/2"> 408 @if (shopInfo.ShopInformationList.Count > 0 || shopInfo.OpeningHours != null) 409 { 410 <p class="mb-2"><strong>@Translate("openinghours", "&#197;bningstider")</strong></p> 411 } 412 @if (shopInfo.ShopInformationList.Count > 0) 413 { 414 foreach (var row in shopInfo.ShopInformationList) 415 { 416 var rowClass = !string.IsNullOrEmpty(row.columnTwo) ? "basis-1/2" : ""; 417 <div class="flex gap-x-2"> 418 <div class="@rowClass"> 419 @row.columnOne 420 </div> 421 @if (!string.IsNullOrEmpty(row.columnTwo)) 422 { 423 <div>@row.columnTwo</div> 424 } 425 </div> 426 } 427 } 428 else if (shopInfo.OpeningHours != null) 429 { 430 <div class="flex flex-col justify-content items-center gap-2 md:items-start">@shopInfo.OpeningHours</div> 431 } 432 </div> 433 434 </div> 435 } 436 <ul class="list-none flex gap-2 mb-8"> 437 @foreach (var Some in GetLoop("Item.Area.SocialMediaIcons")) 438 { 439 string Link = Some.GetString("Item.Area.SocialMediaIcons.Link"); 440 string Icon = Some.GetString("Item.Area.SocialMediaIcons.Icon.Value"); 441 <li> 442 <a href="@Link" target="_blank" class="text-black text-2xl hover:text-grey-dark"> 443 <img width="37" height="37" src="/Admin/Public/GetImage.ashx?Image=@Icon&Format=webP&Quality=90&Height=40" alt="social icon" loading="lazy"> 444 </a> 445 </li> 446 } 447 448 @foreach (var Some in GetLoop("Item.Area.SocialMediaFontawesomeIcons")) 449 { 450 string Link = Some.GetString("Item.Area.SocialMediaFontawesomeIcons.Link"); 451 string Icon = Some.GetString("Item.Area.SocialMediaFontawesomeIcons.FontawesomeClass"); 452 <li> 453 <a href="@Link" target="_blank" class="text-black text-3xl hover:text-grey-dark"> 454 <i class="@Icon"></i> 455 </a> 456 </li> 457 } 458 </ul> 459 </div> 460 <div class="flex justify-center items-end w-full lg:w-2/4"> 461 @{ 462 string footerStaffImagePath = String.Format("/Files/Images/Owners/Large/{0}.png", shopname); 463 string footerStaffGetImage = ""; 464 if (!String.IsNullOrEmpty(footerStaffImagePath)) 465 { 466 footerStaffGetImage = "/Admin/Public/GetImage.ashx?Image=" + footerStaffImagePath + "&Format=webP&Quality=90&width=640&height=300"; 467 } 468 } 469 <img width="640" height="300" class="img-fit-contain-x" src="@footerStaffGetImage" alt="@shopname" loading="lazy"> 470 </div> 471 </div> 472 </section> 473 474 <section class="bg-beige-dark py-10"> 475 <div class="container"> 476 <div class="flex flex-wrap xl:flex-nowrap xl:flex-row gap-4 "> 477 <div class="w-full grid md:grid-cols-3 xl:grid-cols-6 gap-y-4 *:list-none *:text-center *:md:text-left *:text-sm *:leading-8"> 478 <ul class="list-none col-span-3 md:col-span-1"> 479 <strong>@GetString("Item.Area.Footer_Column_1_Header")</strong> 480 @foreach (var Link in GetLoop("Item.Area.Footer_Column_1_Links")) 481 { 482 string LinkText = Link.GetString("Item.Area.Footer_Column_1_Links.LinkText"); 483 string LinkDestination = "/Default.aspx?id=" + Link.GetString("Item.Area.Footer_Column_1_Links.Link"); 484 <li> 485 <a href="@LinkDestination" class="text-black hover:underline hover:text-black">@LinkText</a> 486 </li> 487 } 488 </ul> 489 <ul class="list-none col-span-3 md:col-span-1"> 490 <strong>@GetString("Item.Area.Footer_Column_2_Header")</strong> 491 @foreach (var Link in GetLoop("Item.Area.Footer_Column_2_Links")) 492 { 493 string LinkText = Link.GetString("Item.Area.Footer_Column_2_Links.LinkText"); 494 string LinkDestination = "/Default.aspx?id=" + Link.GetString("Item.Area.Footer_Column_2_Links.Link"); 495 <li> 496 <a href="@LinkDestination" class="text-sm text-black">@LinkText</a> 497 </li> 498 } 499 </ul> 500 <ul class="list-none col-span-3 md:col-span-1"> 501 <strong>@GetString("Item.Area.Footer_Column_3_Header")</strong> 502 @foreach (var Link in GetLoop("Item.Area.Footer_Column_3_Links")) 503 { 504 string LinkText = Link.GetString("Item.Area.Footer_Column_3_Links.LinkText"); 505 string LinkDestination = "/Default.aspx?id=" + Link.GetString("Item.Area.Footer_Column_3_Links.Link"); 506 <li> 507 <a href="@LinkDestination" class="text-sm text-black">@LinkText</a> 508 </li> 509 } 510 </ul> 511 512 <div class="col-span-3"> 513 <strong>@Translate("Co3.Newsletter.Headline.Text", "Møblérs nyhedsbrev")</strong> 514 <newsletter></newsletter> 515 </div> 516 </div> 517 </div> 518 </div> 519 </section> 520 521 <div class="py-4 bg-white"> 522 <div class="container flex flex-col md:flex-row gap-y-4"> 523 <div class="w-full xl:w-1/2 flex justify-center items-center md:justify-start text-xs"> 524 © @currentYear @Translate("Copyright", "Møblér. All Rights Reserved.") 525 </div> 526 <div class="w-full xl:w-1/2 flex items-center md:justify-end"> 527 <a href='@Translate("PersondataLink", "link")' class="text-xs underline text-black mr-2">@Translate("PersondataText", "Persondatapolitik")</a> 528 <paymentmethodlogos data-all-payments="true"></paymentmethodlogos> 529 </div> 530 531 </div> 532 </div> 533 } 534 535 <script type="module" src="https://viewer-cdn.cylindo.com/v1/index.mjs" defer=""></script> 536 537 @Pageview.AddViteScript() 538 </body> 539 </html> 540