Error executing template "Designs/Swift/Paragraph/Swift_Text.cshtml"
System.InvalidOperationException: A prior operation on this collection was interrupted by an exception. Collection's state is no longer trusted.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Container.VerifyIntegrity()
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Container.CreateEntryNoResize(TKey key, TValue value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Add(TKey key, TValue value)
at Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.MarkupTextLiteralSyntax.SetAnnotations(SyntaxAnnotation[] annotations)
at Microsoft.AspNetCore.Razor.Language.Legacy.TokenizerBackedParser`1.GetNodeWithSpanContext[TNode](TNode node)
at Microsoft.AspNetCore.Razor.Language.Legacy.HtmlMarkupParser.OtherParserBlock(SyntaxListBuilder`1& builder)
at Microsoft.AspNetCore.Razor.Language.Legacy.HtmlMarkupParser.ParseDocument()
at Microsoft.AspNetCore.Razor.Language.Legacy.RazorParser.Parse(RazorSourceDocument source)
at Microsoft.AspNetCore.Razor.Language.DefaultRazorEngine.Process(RazorCodeDocument document)
at Microsoft.AspNetCore.Razor.Language.RazorTemplateEngine.GenerateCode(RazorCodeDocument codeDocument)
at RazorEngine.Compilation.CompilerServiceBase.GenerateCodeFile(RazorTemplateEngine templateEngine, RazorCodeDocument document)
at RazorEngine.Compilation.CompilerServiceBase.GetGeneratorResult(IEnumerable`1 namespaces, TypeContext context)
at RazorEngine.Compilation.CompilerServiceBase.GetCodeCompileUnit(TypeContext context)
at Dynamicweb.Rendering.Compatibility.RoslynCompilerServiceBase.CompileType(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource razorTemplate, Type modelType)
at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, 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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel>
2 @using Dynamicweb.Ecommerce.ProductCatalog
3 @functions
4 {
5 private string RenderCustomCSS(IEnumerable<string> decorations)
6 {
7 var cssClasses = new List<string>();
8
9 foreach (var itemId in decorations)
10 {
11 var item = Dynamicweb.Content.Services.Items.GetItem("Swift_Css", itemId);
12 item.TryGetValue("Class", out object classes);
13
14 if (classes is null)
15 {
16 continue;
17 }
18
19 var cssString = (string)classes;
20
21 if (cssString.StartsWith("["))
22 {
23 var cssArray = Dynamicweb.Core.Converter.Deserialize<string[]>(cssString);
24 cssClasses.AddRange(cssArray);
25 }
26 else
27 {
28 cssClasses.Add(cssString.Replace(",", " "));
29 }
30 }
31
32 return string.Join(" ", cssClasses).Trim();
33 }
34 }
35
36 @{
37 string layout = Model.Item.GetRawValueString("Layout", "text-start");
38 layout = layout == "alignLeft" ? "align-items-start text-start" : layout;
39 layout = layout == "alignCenter" ? "align-items-center text-center" : layout;
40 layout = layout == "alignRight" ? "align-items-end text-end" : layout;
41 layout = layout == "alignLeftMiddle" ? "align-items-start text-start justify-content-center" : layout;
42
43 string contentPadding = Model.Item.GetRawValueString("ContentPadding", string.Empty);
44 contentPadding = contentPadding == "none" ? "p-0" : contentPadding;
45 contentPadding = contentPadding == "small" ? "p-3 p-md-3" : contentPadding;
46 contentPadding = contentPadding == "large" ? "p-5 p-md-5" : contentPadding;
47
48 //Backward compatibility (Vertical align)
49 string verticalAlign = string.Empty;
50 if (!string.IsNullOrEmpty(Model.Item.GetString("verticalAlign")))
51 {
52 verticalAlign = verticalAlign == "vertical-align-top" ? "justify-content-start" : verticalAlign;
53 verticalAlign = verticalAlign == "vertical-align-center" ? "justify-content-center" : verticalAlign;
54 verticalAlign = verticalAlign == "vertical-align-bottom" ? "justify-content-end" : verticalAlign;
55 }
56
57 string maxWidth = Model.Item.GetRawValueString("TextReadability", "max-width-on");
58 maxWidth = maxWidth == "max-width-on" ? " mw-75ch" : maxWidth;
59 maxWidth = maxWidth == "max-width-off" ? string.Empty : maxWidth;
60
61 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : string.Empty;
62 var decorations = Model.Item?.GetList("CssDecorations")?.GetRawValue().OfType<string>() ?? Enumerable.Empty<string>();
63 string css = RenderCustomCSS(decorations);
64
65 Dynamicweb.Frontend.LinkViewModel link1 = new Dynamicweb.Frontend.LinkViewModel();
66 Dynamicweb.Frontend.LinkViewModel link2 = new Dynamicweb.Frontend.LinkViewModel();
67
68 string linkType1 = Model.Item.GetRawValueString("LinkType", "page");
69 string linkType2 = Model.Item.GetRawValueString("LinkType2", "page2");
70
71 if (linkType1 == "page" && Model.Item.GetLink("ButtonLink") != null)
72 {
73 link1 = Model.Item.GetLink("ButtonLink");
74 }
75
76 if (linkType2 == "page2" && Model.Item.GetLink("ButtonLink2") != null)
77 {
78 link2 = Model.Item.GetLink("ButtonLink2");
79 }
80
81 if (linkType1 == "product-group")
82 {
83 IList<ProductGroupViewModel> selectedGroups = Model.Item.GetValue<IList<ProductGroupViewModel>>("ProductGroupLink");
84 IList<string> groupIds = new List<string> { };
85
86 if (selectedGroups != null)
87 {
88 foreach (var fromGroup in selectedGroups)
89 {
90 groupIds.Add(fromGroup.Id);
91 }
92 }
93
94 link1 = new Dynamicweb.Frontend.LinkViewModel()
95 {
96 Url = "/Default.aspx?ID=" + GetPageIdByNavigationTag("Shop") + "&GroupID=" + string.Join(",", groupIds)
97 };
98 }
99
100 if (linkType2 == "product-group2")
101 {
102 IList<ProductGroupViewModel> selectedGroups = Model.Item.GetValue<IList<ProductGroupViewModel>>("ProductGroupLink2");
103 IList<string> groupIds = new List<string> { };
104
105 if (selectedGroups != null)
106 {
107 foreach (var fromGroup in selectedGroups)
108 {
109 groupIds.Add(fromGroup.Id);
110 }
111 }
112
113 link2 = new Dynamicweb.Frontend.LinkViewModel()
114 {
115 Url = "/Default.aspx?ID=" + GetPageIdByNavigationTag("Shop") + "&GroupID=" + string.Join(",", groupIds).Trim(),
116 IsExternal = false
117 };
118 }
119
120 if (linkType1 == "product")
121 {
122 ProductListViewModel products = Model.Item.GetValue<ProductListViewModel>("ProductLink");
123 IList<string> productIds = new List<string> { };
124
125 if (products != null && products.Products.Any())
126 {
127 foreach (var product in products.Products)
128 {
129 productIds.Add(product.Id);
130 }
131
132 string productParameter = productIds.Count == 1 ? "ProductID" : "MainProductId";
133 string productLink = products.Products?.FirstOrDefault()?.GetProductLink(GetPageIdByNavigationTag("Shop"), false);
134 productLink = productIds.Count != 1 ? "/Default.aspx?ID=" + GetPageIdByNavigationTag("Shop") + "&" + productParameter + "=" + string.Join(",", productIds).Trim() : productLink;
135
136 link1 = new Dynamicweb.Frontend.LinkViewModel()
137 {
138 Url = productLink
139 };
140 }
141 }
142
143 if (linkType2 == "product2")
144 {
145 ProductListViewModel products = Model.Item.GetValue<ProductListViewModel>("ProductLink2");
146 IList<string> productIds = new List<string> { };
147
148 if (products != null && products.Products.Any())
149 {
150 foreach (var product in products.Products)
151 {
152 productIds.Add(product.Id);
153 }
154
155 string productParameter = productIds.Count == 1 ? "ProductID" : "MainProductId";
156 string productLink = products.Products?.FirstOrDefault()?.GetProductLink(GetPageIdByNavigationTag("Shop"), false);
157 productLink = productIds.Count != 1 ? "/Default.aspx?ID=" + GetPageIdByNavigationTag("Shop") + "&" + productParameter + "=" + string.Join(",", productIds).Trim() : productLink;
158
159 link2 = new Dynamicweb.Frontend.LinkViewModel()
160 {
161 Url = productLink,
162 IsExternal = false
163 };
164 }
165 }
166 }
167
168 <div class="h-100 position-relative d-flex flex-column mb-0-last-child @contentPadding @verticalAlign @(layout)@(theme) @(css) item_@Model.Item.SystemName.ToLower()">
169 <div id="@Model.ID" class="user-select-none position-absolute top-0" style="scroll-margin-top:var(--header-height,150px)"></div>
170
171 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle"))
172 {
173 string titleColor = Model.Item.GetString("TitleColor", "text-inherit");
174 string titleOpacity = Model.Item.GetString("TitleOpacity", "opacity-100");
175 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h3");
176 string headingLevel = Model.Item.GetString("HeadingLevel", "h2");
177 string headingLevelStart = $"<{headingLevel} class=\"{titleFontSize} {titleColor} {titleOpacity}{maxWidth} mb-3\">";
178 string headingLevelStop = $"</{headingLevel}>";
179
180 @headingLevelStart
181 @Model.Item.GetString("Title")
182 @headingLevelStop
183 }
184
185 @if (!string.IsNullOrEmpty(Model.Item.GetString("Lead")))
186 {
187 string subtitleColor = Model.Item.GetString("SubtitleColor", "text-inherit");
188 string subtitleOpacity = Model.Item.GetString("SubtitleOpacity", "opacity-100");
189 string subtitleFontSize = Model.Item.GetRawValueString("SubtitleFontSize", "fs-5");
190
191 <p class="@subtitleFontSize @subtitleColor @subtitleOpacity lead mb-3@(maxWidth)">
192 @Model.Item.GetString("Lead")
193 </p>
194 }
195
196 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text")))
197 {
198 string textColor = Model.Item.GetString("TextColor", "text-inherit");
199 string textOpacity = Model.Item.GetString("TextOpacity", "opacity-100");
200
201 <div class="mb-0-last-child @textColor @(textOpacity)@(maxWidth)">
202 @Model.Item.GetString("Text")
203 </div>
204 }
205
206 @if (link1 is object && !string.IsNullOrEmpty(link1.Url) || link2 is object && !string.IsNullOrEmpty(link2.Url))
207 {
208 string target1 = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link1.IsExternal ? "target=\"_blank\"" : string.Empty;
209 string target2 = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link2.IsExternal ? "target=\"_blank\"" : string.Empty;
210 string rel1 = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link1.IsExternal ? "rel=\"noopener\"" : string.Empty;
211 string rel2 = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link2.IsExternal ? "rel=\"noopener\"" : string.Empty;
212 string buttonLabel1 = Model.Item.GetString("ButtonLabel", string.Empty);
213 string buttonLabel2 = Model.Item.GetString("ButtonLabel2", string.Empty);
214 string buttonStyle1 = Model.Item.GetRawValueString("ButtonStyle", string.Empty);
215 buttonStyle1 = buttonStyle1 == "primary" ? "btn-primary " : buttonStyle1;
216 buttonStyle1 = buttonStyle1 == "secondary" ? "btn-secondary " : buttonStyle1;
217 buttonStyle1 = buttonStyle1 == "link" ? "btn-link" : buttonStyle1;
218 string buttonStyle2 = Model.Item.GetRawValueString("ButtonStyle2", string.Empty);
219 buttonStyle2 = buttonStyle2 == "primary" ? "btn-primary " : buttonStyle2;
220 buttonStyle2 = buttonStyle2 == "secondary" ? "btn-secondary " : buttonStyle2;
221 buttonStyle2 = buttonStyle2 == "link" ? "btn-link" : buttonStyle2;
222 string stretchedLink1 = Model.Item.GetRawValueString("StretchedLink", "column-not-clickable");
223 string stretchedLink2 = Model.Item.GetRawValueString("StretchedLink2", "column-not-clickable");
224 string stretchedLinkClass = stretchedLink1 == "column-clickable" && string.IsNullOrEmpty(link2.Url) && string.IsNullOrEmpty(buttonLabel2) ? "stretched-link" : string.Empty;
225 string stretchedLinkClass2 = stretchedLink2 == "column-clickable" && string.IsNullOrEmpty(link1.Url) && string.IsNullOrEmpty(buttonLabel1) ? "stretched-link" : string.Empty;
226 string alignmentClass = string.Empty;
227
228 if (Model.Item.GetString("Layout") == "alignCenter")
229 {
230 alignmentClass = " justify-content-center";
231 }
232
233 <div class="d-flex flex-wrap gap-3 mt-3@(alignmentClass)">
234 @if (link1 != null && !string.IsNullOrEmpty(link1.Url))
235 {
236 if (!string.IsNullOrEmpty(buttonLabel1))
237 {
238 <a href="@link1.Url" @target1 @rel1 class="text-nowrap btn @(buttonStyle1)@(stretchedLinkClass)">@buttonLabel1</a>
239 }
240 else
241 {
242 <a href="@link1.Url" @target1 @rel1 class="@(stretchedLinkClass)">
243 <span class="visually-hidden">@Model.Item.GetString("Title")</span>
244 </a>
245 }
246 }
247
248 @if (link2 != null && !string.IsNullOrEmpty(link2.Url))
249 {
250 if (!string.IsNullOrEmpty(buttonLabel2))
251 {
252 <a href="@link2.Url" @target2 @rel2 class="text-nowrap btn @(buttonStyle2)@(stretchedLinkClass2)">@buttonLabel2</a>
253 }
254 else
255 {
256 <a href="@link2.Url" @target2 @rel2 class="@(stretchedLinkClass2)">
257 <span class="visually-hidden">@Model.Item.GetString("Title")</span>
258 </a>
259 }
260 }
261 </div>
262 }
263 </div>
264
265
Error executing template "CookieWarning/Cookies.cshtml"
System.InvalidOperationException: A prior operation on this collection was interrupted by an exception. Collection's state is no longer trusted.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Container.VerifyIntegrity()
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Container.CreateEntryNoResize(TKey key, TValue value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.Add(TKey key, TValue value)
at Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.MarkupTextLiteralSyntax.SetAnnotations(SyntaxAnnotation[] annotations)
at Microsoft.AspNetCore.Razor.Language.Legacy.TokenizerBackedParser`1.GetNodeWithSpanContext[TNode](TNode node)
at Microsoft.AspNetCore.Razor.Language.Legacy.HtmlMarkupParser.OtherParserBlock(SyntaxListBuilder`1& builder)
at Microsoft.AspNetCore.Razor.Language.Legacy.HtmlMarkupParser.ParseDocument()
at Microsoft.AspNetCore.Razor.Language.Legacy.RazorParser.Parse(RazorSourceDocument source)
at Microsoft.AspNetCore.Razor.Language.DefaultRazorEngine.Process(RazorCodeDocument document)
at Microsoft.AspNetCore.Razor.Language.RazorTemplateEngine.GenerateCode(RazorCodeDocument codeDocument)
at RazorEngine.Compilation.CompilerServiceBase.GenerateCodeFile(RazorTemplateEngine templateEngine, RazorCodeDocument document)
at RazorEngine.Compilation.CompilerServiceBase.GetGeneratorResult(IEnumerable`1 namespaces, TypeContext context)
at RazorEngine.Compilation.CompilerServiceBase.GetCodeCompileUnit(TypeContext context)
at Dynamicweb.Rendering.Compatibility.RoslynCompilerServiceBase.CompileType(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource razorTemplate, Type modelType)
at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, 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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2 @using Dynamicweb.Environment;
3
4 @{
5 var categories = CookieManager.GetCategories();
6
7 string cookieNoticeLink = Pageview.AreaSettings.GetLink("CookiePolicyLink") != null ? Pageview.AreaSettings.GetLink("CookiePolicyLink").Url : "";
8 string privacyPolicyLink = Pageview.AreaSettings.GetLink("PrivacyPolicyLink") != null ? Pageview.AreaSettings.GetLink("PrivacyPolicyLink").Url : "";
9 int cookieNoticePageID = Pageview.AreaSettings.GetLink("CookiePolicyLink") != null ? Pageview.AreaSettings.GetLink("CookiePolicyLink").PageId : 0;
10 int privacyPolicyPageID = Pageview.AreaSettings.GetLink("PrivacyPolicyLink") != null ? Pageview.AreaSettings.GetLink("PrivacyPolicyLink").PageId : 0;
11 string googleTagManagerID = Pageview.AreaSettings.GetString("GoogleTagManagerID");
12
13 string layout = Pageview.AreaSettings.GetRawValueString("CookieLayout", "modal");
14
15 layout = Pageview.Page.ID == cookieNoticePageID || Pageview.Page.ID == privacyPolicyPageID ? "both" : layout;
16 }
17
18 @if (!Pageview.IsVisualEditorMode) {
19 if (layout == "banner" || layout == "both")
20 {
21 string bannerTheme = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetRawValueString("CookieBannerTheme")) ? " theme " + Pageview.AreaSettings.GetRawValueString("CookieBannerTheme").Replace(" ", "").Trim().ToLower() : "theme light";
22
23 <div class="position-fixed bottom-0 w-100 shadow @bannerTheme" id="dwCookieBanner">
24 <div class="align-items-center grid p-3">
25 @if (layout == "banner")
26 {
27 <div class="g-col-12 g-col-md-6 g-col-lg-8">
28 <span>@Translate("By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing")</span>
29 </div>
30 <div class="g-col-12 g-col-md-6 g-col-lg-4">
31 <div class="grid grid-1 grid-sm-2">
32 <button type="button" onclick="setOptInCookie(2)" class="btn btn-primary" id="CookiesAcceptAll">
33 @Translate("Accept all")
34 </button>
35 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" id="CookiesDeclineAll">
36 @Translate("Decline")
37 </button>
38 </div>
39 </div>
40 }
41 @if (layout == "both")
42 {
43 <div class="g-col-12 g-col-lg-6 g-col-xxl-8">
44 <span>@Translate("By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing")</span>
45 </div>
46 <div class="g-col-12 g-col-lg-6 g-col-xxl-4">
47 <div class="grid grid-1 grid-sm-3">
48 <button type="button" class="btn btn-link" data-bs-toggle="modal" data-bs-target="#dwCookieModal">
49 @Translate("Customize settings")
50 </button>
51 <button type="button" onclick="setOptInCookie(2)" class="btn btn-secondary" id="CookiesAcceptAll">
52 @Translate("Accept all")
53 </button>
54 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" id="CookiesDeclineAll">
55 @Translate("Decline")
56 </button>
57 </div>
58 </div>
59 }
60 </div>
61 </div>
62 }
63
64 if (layout == "modal" || layout == "both")
65 {
66 string modalTheme = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetRawValueString("CookieModalTheme")) ? " theme " + Pageview.AreaSettings.GetRawValueString("CookieModalTheme").Replace(" ", "").Trim().ToLower() : "theme light";
67
68 <div class="modal fade" id="dwCookieModal">
69 <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" style="max-width:560px;">
70 <div class="modal-content @modalTheme">
71 <div style="overflow-y:auto;overflow-x:hidden">
72 <div class="p-3 p-md-4 overflow-auto" style="max-height:50vh;">
73 <div class="h3 mb-3">@Translate("You control your data")</div>
74 <p>@Translate("We and our partners use technologies, including cookies, to collect information about you for various purposes, including"):</p>
75 <ol>
76 <li>@Translate("Functionality")</li>
77 <li>@Translate("Statistics")</li>
78 <li>@Translate("Marketing")</li>
79 </ol>
80 <p>@Translate("By clicking 'Accept All' you consent to all these purposes. You can also choose to indicate what purposes you will consent to using the custom selections and then click 'Accept selected'").</p>
81
82 @if (!string.IsNullOrEmpty(cookieNoticeLink) || !string.IsNullOrEmpty(privacyPolicyLink))
83 {
84 <p>@Translate("You can read more about our use of cookies and other technologies, as well as our collection and processing of personal data by clicking here"):</p>
85 }
86
87 @if (!string.IsNullOrEmpty(cookieNoticeLink))
88 {
89 <a href="@cookieNoticeLink" class="d-block mb-3" id="CookiesReadModeAbout">@Translate("Read more about Cookies")</a>
90 }
91 @if (!string.IsNullOrEmpty(privacyPolicyLink))
92 {
93 <a href="@privacyPolicyLink" class="d-block" id="CookiesPrivacyPolicy">@Translate("Our privacy policy")</a>
94 }
95 </div>
96
97 <div class="p-3 px-md-4 border-top">
98 <div class="grid grid-1 grid-sm-2 gap-3">
99 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" data-bs-dismiss="modal" id="dwCookieDeclineAll">@Translate("Decline")</button>
100 @if (categories.Any())
101 {
102 <button type="button" onclick="acceptCustomSetup()" class="btn btn-secondary d-none" data-bs-dismiss="modal" id="dwCookieAcceptSelected">@Translate("Accept selected")</button>
103 }
104 <button type="button" onclick="setOptInCookie(2)" class="btn btn-secondary" data-bs-dismiss="modal" id="dwCookieAcceptAll">@Translate("Accept All")</button>
105 </div>
106 </div>
107
108 @if (categories.Any())
109 {
110 int categoriesCount = 0;
111 int totalCategories = categories.Count();
112
113 <form id="dwCookieModalCustomForm" method="post" action="/Admin/Public/CookieOptInLevelConfig.aspx">
114 <input type="hidden" name="cmd" value="SetCookieOptInLevel">
115 <input type="hidden" name="OptInLevel" id="OptInLevel" value="1">
116 <div class="grid grid-2 grid-sm-4 gap-0 px-md-3 border-top border-1">
117 <div class="p-3">
118 <label class="form-check-label" for="dwCookieNecessary"><span>@Translate("Necessary")</span></label>
119 <div class="form-check form-switch form-control-lg py-0">
120 <input class="form-check-input opacity-100" type="checkbox" id="dwCookieNecessary" checked disabled style="background-color: rgba(0,0,0,0.1);">
121 </div>
122 </div>
123 @foreach (var category in categories)
124 {
125 string border = categoriesCount < (totalCategories - 1) ? "" : "";
126
127 <div class="p-3 @(border)">
128 <label class="form-check-label" for="CookieCategory_@category"><span>@Translate(category)</span></label>
129 <div class="form-check form-switch form-control-lg py-0">
130 <input class="form-check-input js-checkbox" type="checkbox" name="OptInCategory" value="@category" id="CookieCategory_@category" onchange="toggleAcceptSelected()" style="background-color: rgba(0,0,0,0.1);">
131 </div>
132 </div>
133 categoriesCount++;
134 }
135 </div>
136 </form>
137 }
138 </div>
139 </div>
140 </div>
141 </div>
142 }
143
144
145 <script>
146 async function setOptInCookie(optInLevel) {
147 let response = await fetch("/admin/public/CookieOptInLevelConfig.aspx?cmd=SetCookieOptInLevel&OptInLevel=" + optInLevel);
148 @if (!string.IsNullOrWhiteSpace(googleTagManagerID)){
<text>
149 if (optInLevel == '2') {
150 consentGrantedAll();
151 }
152 </text>
153 }
154
155 if (response.ok) {
156 if (document.querySelector("#dwCookieBanner")) {
157 document.querySelector("#dwCookieBanner").classList.add("d-none");
158 }
159 document.location.reload();
160 return false;
161 } else {
162 return false;
163 }
164 }
165
166 async function acceptCustomSetup() {
167 var form = document.querySelector("#dwCookieModalCustomForm");
168
169 let formData = new FormData(form);
170 var fetchOptions = {
171 method: 'POST',
172 body: formData
173 };
174
175 for (const value of formData.values()) {
176 console.log(value);
177 if (value == 'Marketing') {
console.log('Granting marketing cookies')
consentGrantedMarketing();
178 }
179 if (value == 'Statistical') {
180 console.log('Granting statistical cookies')
181 consentGrantedAnalyticsStorage();
182 }
183 }
184
185
186 let response = await fetch(form.action, fetchOptions);
187
188 if (response.ok) {
189 if (document.querySelector("#dwCookieBanner")) {
190 document.querySelector("#dwCookieBanner").classList.add("d-none");
191 }
192 document.location.reload();
193 return false;
194 } else {
195 return false;
196 }
197 }
198
199
200 function consentGrantedAll() {
201 consentGrantedMarketing();
202 consentGrantedAnalyticsStorage();
203 }
204 function consentGrantedMarketing() {
205 consentGrantedAdStorage();
206 consentGrantedAdUserData();
207 consentGrantedAdPersonalization();
208 }
209
210 function consentGrantedAdStorage() {
211 if (!window.dataLayer) return;
212 gtag('consent', 'update', {
213 'ad_storage': 'granted'
214 });
215 }
216
217 function consentGrantedAdUserData() {
218 if (!window.dataLayer) return;
219 gtag('consent', 'update', {
220 'ad_user_data': 'granted'
221 });
222 }
223
224 function consentGrantedAdPersonalization() {
225 if (!window.dataLayer) return;
226 gtag('consent', 'update', {
227 'ad_personalization': 'granted'
228 });
229 }
230
231 function consentGrantedAnalyticsStorage() {
232 if (!window.dataLayer) return;
233 gtag('consent', 'update', {
234 'analytics_storage': 'granted'
235 });
236 }
237
238 function toggleAcceptSelected() {
239 var cookieCalegoriesElement = document.querySelector("#dwCookieModalCustomForm");
240 var enableAcceptSelected = false;
241
242 cookieCalegoriesElement.querySelectorAll(".js-checkbox").forEach(function (field) {
243 if (field.checked == true) {
244 enableAcceptSelected = true;
245 }
246 });
247
248 if (enableAcceptSelected) {
249 document.querySelector("#dwCookieDeclineAll").classList.add("d-none");
250 document.querySelector("#dwCookieAcceptSelected").classList.remove("d-none");
251 } else {
252 document.querySelector("#dwCookieDeclineAll").classList.remove("d-none");
253 document.querySelector("#dwCookieAcceptSelected").classList.add("d-none");
254 }
255 }
256
257 function showCookieModal() {
258 var cookieModal = new bootstrap.Modal(document.querySelector('#dwCookieModal'), {
259 backdrop: 'static'
260 });
261 cookieModal.show();
262 }
263 </script>
264
265 if (layout == "modal")
266 {
267 <script type="module">
268 showCookieModal();
269 </script>
270 }
271 }
272