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ø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æs mere om Møblér kæ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å 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", "Å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