Error executing template "Designs/Rapido/_parsed/Page.parsed.cshtml"
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) ---> System.ComponentModel.Win32Exception (0x80004005): The network path was not found
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Dynamicweb.Data.DatabaseConnectionProvider.CreateConnection(Boolean open)
at Dynamicweb.Data.Database.CreateConnection()
at Dynamicweb.Data.Database.CreateDataReader(CommandBuilder commandBuilder, IDbConnection connection, IDbTransaction transaction, Int32 commandTimeout)
at Dynamicweb.Ecommerce.Assortments.AssortmentRepository.GetAssortmentGroupHierarchy(String assortmentId, String languageId)
at Dynamicweb.Ecommerce.Assortments.Assortment.<.ctor>b__1_4()
at System.Lazy`1.CreateValue()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Lazy`1.get_Value()
at Dynamicweb.Ecommerce.Assortments.AssortmentService.HasAccessToGroup(Group group, User user)
at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.MakeGroupTree(IEnumerable`1 groups, Page page, NavigationItem parentNode, Int32 thisLevel, Int32 maxLevel, Page productPage)
at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.MakeGroupTree(Page page, NavigationItem parentNode)
at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.Process(NavigationItem node)
at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.ProcessTree(RootNavigationItem rootNode, NavigationType navigationType)
at Dynamicweb.Frontend.XmlNavigation.MakeXml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, Int32 selectedAreaId)
at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, String name, String xsltPath, Int32 selectedAreaId, Boolean sitemapMode, NameValueCollection settings, NameValueCollection attributes, IncludeMode mode)
at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(NameValueCollection settings, NameValueCollection attributes)
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<RenderDesktopToolsNavigationCustom>b__67_0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 3005
at RazorEngine.Templating.TemplateWriter.ToString()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 159
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 143
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<RenderDesktopTools>b__30_0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 1325
at RazorEngine.Templating.TemplateWriter.ToString()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 159
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 125
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<RenderMasterHeaderCustom>b__65_0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 2986
at RazorEngine.Templating.TemplateWriter.ToString()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 159
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 125
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<RenderMainCustom>b__64_0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 2972
at RazorEngine.Templating.TemplateWriter.ToString()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 159
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 125
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 166
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 125
at CompiledRazorTemplates.Dynamic.RazorEngine_ac7c277834a64e9da978f34a6bcd44c9.Execute() in E:\Dynamicweb\Solutions\Kruuse\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 4379
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()
ClientConnectionId:00000000-0000-0000-0000-000000000000
Error Number:53,State:0,Class:20
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2
3 @* Rapido version 3.0.1 *@
4
5 @using System.Web;
6 @using Dynamicweb.Frontend
7 @using Dynamicweb.Frontend.Devices
8 @using Dynamicweb.Extensibility
9 @using Dynamicweb.Content
10 @using Dynamicweb.Security
11 @using Dynamicweb.Core
12 @using System
13 @using System.Web
14 @using System.IO
15 @using Dynamicweb.Rapido.Blocks
16
17 @functions {
18 BlocksPage masterPage = BlocksPage.GetBlockPage("Master");
19
20 string getFontFamily(params string[] items)
21 {
22 var itemParent = Pageview.AreaSettings;
23 foreach (var item in items)
24 {
25 itemParent = itemParent.GetItem(item);
26 if (itemParent == null)
27 {
28 return null;
29 }
30 }
31
32 var googleFont = itemParent.GetGoogleFont("FontFamily");
33 if (googleFont == null)
34 {
35 return null;
36 }
37 return googleFont.Family.Replace(" ", "+");
38 }
39 }
40 @{
41 //Font settings
42 var fonts = new string[] {
43 getFontFamily("Layout", "HeaderFont"),
44 getFontFamily("Layout", "SubheaderFont"),
45 getFontFamily("Layout", "TertiaryHeaderFont"),
46 getFontFamily("Layout", "Header", "ToolsFont"),
47 getFontFamily("Layout", "Header", "NavigationFont"),
48 getFontFamily("Layout", "MobileNavigation", "Font"),
49 getFontFamily("ProductList", "Facets", "HeaderFont"),
50 getFontFamily("ProductPage", "PriceFontDesign"),
51 getFontFamily("Ecommerce", "SaleSticker", "Font"),
52 getFontFamily("Ecommerce", "NewSticker", "Font"),
53 getFontFamily("Ecommerce", "CustomSticker", "Font")
54 };
55
56 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
57 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
58 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
59 }
60
61 @{
62 Block master = new Block()
63 {
64 Id = "Master",
65 BlocksList = new List<Block> {
66 new Block {
67 Id = "MasterTopSnippets",
68 SortId = 10
69 },
70 new Block {
71 Id = "MasterMain",
72 SortId = 20,
73 Template = RenderMain(),
74 SkipRenderBlocksList = true,
75 BlocksList = new List<Block> {
76 new Block
77 {
78 Id = "MasterHeader",
79 SortId = 10,
80 Template = RenderMasterHeader(),
81 SkipRenderBlocksList = true
82 },
83 new Block {
84 Id = "MasterPageContent",
85 SortId = 20,
86 Template = RenderPageContent()
87 }
88 }
89 },
90 new Block {
91 Id = "MasterFooter",
92 SortId = 30
93 },
94 new Block {
95 Id = "MasterReferences",
96 SortId = 40
97 },
98 new Block {
99 Id = "MasterBottomSnippets",
100 SortId = 50
101 }
102 }
103 };
104 masterPage.Add(master);
105 }
106
107 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@
108 @using System.Text.RegularExpressions
109 @using System.Collections.Generic
110 @using Dynamicweb.Rapido.Blocks
111
112
113 @*--- START: Base block renderers ---*@
114
115 @helper RenderBlockList(List<Block> blocks)
116 {
117 blocks = blocks.OrderBy(item => item.SortId).ToList();
118
119 foreach (Block item in blocks)
120 {
121 <!-- START: @item.Id -->
122
123 if (item.Design == null)
124 {
125 @RenderBlock(item)
126 }
127 else if (item.Design.RenderType != RenderType.Hide)
128 {
129 if (item.Design.RenderType == RenderType.Row)
130 {
131 <div class="grid grid--align-content-start">
132 @RenderBlock(item)
133 </div>
134 }
135
136 if (item.Design.RenderType == RenderType.Column)
137 {
138 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";
139 string size = item.Design.Size != null ? item.Design.Size : "12";
140 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;
141
142 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding" id="Block__@item.Id">
143 @RenderBlock(item)
144 </div>
145 }
146
147 if (item.SkipRenderBlocksList == true)
148 {
149 @RenderBlock(item)
150 }
151 }
152
153 <!-- END: @item.Id -->
154 }
155 }
156
157 @helper RenderBlock(Block item)
158 {
159 if (item.Template != null)
160 {
161 @BlocksPage.RenderTemplate(item.Template)
162 }
163
164 if (item.BlocksList.Count > 0 && item.SkipRenderBlocksList == false)
165 {
166 @RenderBlockList(item.BlocksList)
167 }
168 }
169
170 @*--- END: Base block renderers ---*@
171
172
173 @* Include the Blocks for the page *@
174 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
175
176 @using System
177 @using System.Web
178 @using System.Collections.Generic
179 @using Dynamicweb.Rapido.Blocks.Extensibility
180 @using Dynamicweb.Rapido.Blocks
181
182 @{
183 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
184
185 Block tagManager = new Block()
186 {
187 Id = "TagManager",
188 SortId = 1,
189 Template = RenderGoogleTagManager()
190 };
191
192 Block facebookPixel = new Block()
193 {
194 Id = "FacebookPixel",
195 SortId = 2,
196 Template = RenderFacebookPixel()
197 };
198
199 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManager);
200 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel);
201 }
202
203 @helper RenderGoogleTagManager() {
204 string GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID") != null ? Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID") : "";
205
206 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
207 {
208 <script>
209 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
210 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
211 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
212 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
213 })(window,document,'script','dataLayer','@GoogleTagManagerID');
214 </script>
215 <!-- Google Tag Manager (noscript) -->
216 <noscript>
217 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
218 height="0" width="0" style="display:none;visibility:hidden"></iframe>
219 </noscript>
220 <!-- End Google Tag Manager (noscript) -->
221 }
222 }
223
224 @helper RenderFacebookPixel() {
225 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID") != null ? Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID") : "";
226
227 if (!string.IsNullOrWhiteSpace(FacebookPixelID))
228 {
229 <!-- Facebook Pixel Code -->
230 <script>
231 !function(f,b,e,v,n,t,s)
232 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
233 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
234 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
235 n.queue=[];t=b.createElement(e);t.async=!0;
236 t.src=v;s=b.getElementsByTagName(e)[0];
237 s.parentNode.insertBefore(t,s)}(window, document,'script',
238 'https://connect.facebook.net/en_US/fbevents.js');
239 fbq('init', '@FacebookPixelID');
240 fbq('track', 'PageView');
241 </script>
242 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
243 }
244 }
245 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
246
247 @using System
248 @using System.Web
249 @using System.Collections.Generic
250 @using Dynamicweb.Rapido.Blocks.Extensibility
251 @using Dynamicweb.Rapido.Blocks
252
253
254 @{
255 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master");
256
257 Block loginModal = new Block()
258 {
259 Id = "LoginModal",
260 SortId = 10,
261 Template = LoginModal()
262 };
263
264 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal);
265 }
266
267 @helper LoginModal() {
268 int pageId = Model.TopPage.ID;
269 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
270 string userSignedInErrorText = "";
271 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
272 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
273 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
274
275 if (Model.LogOnFailed) {
276 switch (Model.LogOnFailedReason)
277 {
278 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordLengthInvalid:
279 userSignedInErrorText = Translate("Password length is invalid");
280 break;
281 case Dynamicweb.Security.UserManagement.LogOnFailedReason.IncorrectLogin:
282 userSignedInErrorText = Translate("Invalid email or password");
283 break;
284 case Dynamicweb.Security.UserManagement.LogOnFailedReason.ExceededFailedLogOnLimit:
285 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
286 break;
287 case Dynamicweb.Security.UserManagement.LogOnFailedReason.LoginLocked:
288 userSignedInErrorText = Translate("The user account is temporarily locked");
289 break;
290 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordExpired:
291 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
292 break;
293 default:
294 userSignedInErrorText = Translate("An unknown error occured");
295 break;
296 }
297 }
298
299 <!-- Trigger for the login modal -->
300 <input type="checkbox" id="SignInModalTrigger" class="modal-trigger" @userSignedInError />
301
302 <!-- Login modal -->
303 <div class="modal-container">
304 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
305 <div class="modal modal--xs" id="SignInModal">
306 <div class="modal__header">
307 <h2>@Translate("Sign in")</h2>
308 </div>
309 <div class="modal__body">
310 <form method="post" id="LoginForm" class="u-no-margin">
311 <input type="hidden" name="ID" value="@pageId" />
312 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
313 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
314 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate("Email")" />
315 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate("Password")" />
316 <div class="field-error dw-mod">@userSignedInErrorText</div>
317
318 <div class="form__field-group dw-mod">
319 <input type="checkbox" id="LoginRememberMe" name="Autologin" checked="checked" value="True" class="form__control">
320 <label for="LoginRememberMe">
321 @Translate("Remember me", "Remember me")
322 </label>
323 </div>
324
325 <button type="submit" class="btn btn--primary btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
326
327 <a class="btn btn--link-clean dw-mod" href="@forgotPasswordPageLink">@Translate("Forgot your password?", "Forgot your password?")</a>
328
329 <a class="btn btn--link-clean dw-mod" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
330 </form>
331 </div>
332 </div>
333 </div>
334 }
335 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
336 {
337 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
338
339 @using System
340 @using System.Web
341 @using System.Collections.Generic
342 @using Dynamicweb.Rapido.Blocks.Extensibility
343 @using Dynamicweb.Rapido.Blocks
344
345
346 @functions {
347 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
348 }
349
350 @{
351 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
352 bool hideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
353 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
354 bool hideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
355
356
357 Block mobileHeader = new Block()
358 {
359 Id = "MobileTop",
360 SortId = 10,
361 Template = RenderMobileTop(),
362 SkipRenderBlocksList = true
363 };
364 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader);
365
366 Block mobileHeaderNavigation = new Block()
367 {
368 Id = "MobileHeaderNavigation",
369 SortId = 10,
370 Template = RenderMobileHeaderNavigation(),
371 SkipRenderBlocksList = true,
372 BlocksList = new List<Block> {
373 new Block {
374 Id = "MobileHeaderNavigationTrigger",
375 SortId = 10,
376 Template = RenderMobileHeaderNavigationTrigger()
377 }
378 }
379 };
380 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation);
381
382
383 Block mobileHeaderLogo = new Block()
384 {
385 Id = "MobileHeaderLogo",
386 SortId = 20,
387 Template = RenderMobileHeaderLogo(),
388 SkipRenderBlocksList = true
389 };
390 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo);
391
392 Block mobileHeaderActions = new Block()
393 {
394 Id = "MobileHeaderActions",
395 SortId = 30,
396 Template = RenderMobileTopActions(),
397 SkipRenderBlocksList = true
398 };
399 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions);
400
401 if (hideSearch == false)
402 {
403 Block mobileHeaderSearch = new Block
404 {
405 Id = "MobileHeaderSearch",
406 SortId = 10,
407 Template = RenderMobileTopSearch()
408 };
409 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch);
410 }
411
412 Block mobileHeaderMiniCart;
413
414 if (hideCart == false)
415 {
416 mobileHeaderMiniCart = new Block
417 {
418 Id = "MobileHeaderMiniCart",
419 SortId = 20,
420 Template = RenderMobileTopMiniCart()
421 };
422 }
423 else
424 {
425 mobileHeaderMiniCart = new Block
426 {
427 Id = "MobileHeaderMiniCart",
428 SortId = 20
429 };
430 }
431
432 if (hideSearch == false)
433 {
434 Block mobileHeaderSearchBar = new Block()
435 {
436 Id = "MobileHeaderSearchBar",
437 SortId = 30,
438 Template = RenderMobileTopSearchBar()
439 };
440 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar);
441 }
442
443 switch (mobileTopLayout)
444 {
445 case "nav-left":
446 mobileHeaderNavigation.SortId = 10;
447 mobileHeaderLogo.SortId = 20;
448 mobileHeaderActions.SortId = 30;
449 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
450 break;
451 case "nav-right":
452 mobileHeaderLogo.SortId = 10;
453 mobileHeaderActions.SortId = 20;
454 mobileHeaderNavigation.SortId = 30;
455 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
456 break;
457 case "nav-search-left":
458 mobileHeaderNavigation.SortId = 10;
459 mobileHeaderLogo.SortId = 20;
460 mobileHeaderActions.SortId = 30;
461 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
462 break;
463 case "search-left":
464 mobileHeaderActions.SortId = 10;
465 mobileHeaderLogo.SortId = 20;
466 mobileHeaderNavigation.SortId = 30;
467 mobileHeaderMiniCart.SortId = 0;
468 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
469 break;
470 }
471 }
472
473
474 @helper RenderMobileTop()
475 {
476 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList();
477
478 <nav class="main-navigation-mobile dw-mod">
479 <div class="center-container top-container__center-container dw-mod">
480 <div class="grid grid--align-center">
481 @RenderBlockList(subBlocks)
482 </div>
483 </div>
484 </nav>
485 }
486
487 @helper RenderMobileHeaderNavigation()
488 {
489 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList();
490
491 <div class="grid__col-auto-width">
492 <ul class="menu dw-mod">
493 @RenderBlockList(subBlocks)
494 </ul>
495 </div>
496 }
497
498 @helper RenderMobileHeaderNavigationTrigger()
499 {
500 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
501 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label>
502 </li>
503 }
504
505 @helper RenderMobileHeaderLogo()
506 {
507 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList();
508
509 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
510 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
511
512 string mobileLogo = "/Files/Images/logo-dynamicweb.png";
513 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null)
514 {
515 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded;
516 }
517
518 if (Path.GetExtension(mobileLogo).ToLower() != ".svg")
519 {
520 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&crop=5&Compression=75&image=" + mobileLogo;
521 }
522 else
523 {
524 mobileLogo = HttpUtility.UrlDecode(mobileLogo);
525 }
526
527 <div class="grid__col-auto">
528 <div class="logo dw-mod">
529 <a href="/Default.aspx?ID=@firstPageId">
530 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />
531 </a>
532 </div>
533
534 @RenderBlockList(subBlocks)
535 </div>
536 }
537
538 @helper RenderMobileTopActions()
539 {
540 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList();
541
542 <div class="grid__col-auto-width">
543 <ul class="menu dw-mod">
544 @RenderBlockList(subBlocks)
545 </ul>
546 </div>
547 }
548
549 @helper RenderMobileTopSearch()
550 {
551 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
552 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
553 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
554 </label>
555 </li>
556 }
557
558 @helper RenderMobileTopMiniCart() // NOTE: Change in original Razor file.
559 {
560 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
561 int cartPageId = GetPageIdByNavigationTag("CartPage");
562
563 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper" onmouseenter="Cart.UpdateMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
564 <div class="mini-cart dw-mod">
565 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button u-w50px">
566 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue"></i>
567 <div class="mini-cart__counter mini-cart__counter--inline dw-mod">
568 <div class="js-handlebars-root js-mini-cart-counter mobile-cart-wrap" id="cartCounter" data-template="MiniMobileCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
569 <div class="js-mini-cart-counter-content sp-mobile-cart-counter u-brand-color-five--bg">
570 @Model.Cart.TotalProductsCount.ToString()
571 </div>
572 </div>
573 </div>
574 </a>
575 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
576 {
577 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="miniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
578 }
579 </div>
580 </li>
581 }
582
583 @helper RenderMobileTopSearchBar()
584 {
585 string searchFeedId = "";
586 string searchSecondFeedId = "";
587 int groupsFeedId;
588 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
589 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
590 string resultPageLink;
591 string searchPlaceholder;
592 string searchType = "product-search";
593 string searchTemplate;
594 string searchContentTemplate = "";
595 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
596 bool showGroups = true;
597
598 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
599 {
600 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
601 resultPageLink = contentSearchPageLink;
602 searchPlaceholder = Translate("Search page");
603 groupsFeedId = 0;
604 searchType = "content-search";
605 searchTemplate = "SearchPagesTemplate";
606 showGroups = false;
607 }
608 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
609 {
610 searchFeedId = productsPageId + "&feed=true";
611 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
612 resultPageLink = Converter.ToString(productsPageId);
613 searchPlaceholder = Translate("Search products or pages");
614 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
615 searchType = "combined-search";
616 searchTemplate = "SearchProductsTemplateWrap";
617 searchContentTemplate = "SearchPagesTemplateWrap";
618 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
619 }
620 else
621 {
622 resultPageLink = Converter.ToString(productsPageId);
623 searchFeedId = productsPageId + "&feed=true";
624 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
625 searchPlaceholder = Translate("Search products");
626 searchTemplate = "SearchProductsTemplateWrap";
627 searchType = "product-search";
628 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
629 }
630
631
632 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" />
633
634 <div class="main-navigation-mobile typeahead-mobile dw-mod">
635 <div class="center-container top-container__center-container dw-mod">
636 <div class="grid">
637 <div class="grid__col-auto" style="position:initial;">
638 <div class="typeahead-mobile__search-field dw-mod js-typeahead sp-mobile-search" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType">
639 <div style="display:flex;justify-content:space-between">
640 <input type="text" class="js-typeahead-search-field u-no-margin u-full-width" placeholder="@searchPlaceholder" value="@searchValue">
641 <button type="button" class="btn btn--condensed btn--primary u-no-margin u-margin-left dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button>
642 </div>
643 @if (string.IsNullOrEmpty(searchSecondFeedId))
644 {
645 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod u-padding" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
646 }
647 else
648 {
649 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid">
650 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
651 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div>
652 </div>
653 }
654 </div>
655 </div>
656 <div class="grid__col-auto-width">
657 <ul class="menu dw-mod">
658 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
659 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
660 <i class="fas fa-times fa-1_5x"></i>
661 </label>
662 </li>
663 </ul>
664 </div>
665 </div>
666 </div>
667 </div>
668 } </text>
669 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
670
671 @using System
672 @using System.Web
673 @using System.Collections.Generic
674 @using Dynamicweb.Rapido.Blocks.Extensibility
675 @using Dynamicweb.Rapido.Blocks
676
677 @functions {
678 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master");
679 }
680
681 @{
682 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
683 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
684 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
685 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
686 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
687 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
688
689 Block mobileNavigation = new Block()
690 {
691 Id = "MobileNavigation",
692 SortId = 10,
693 Template = MobileNavigation(),
694 SkipRenderBlocksList = true
695 };
696 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation);
697
698 if (Model.CurrentUser.ID > 0 && !hideMyProfileLink)
699 {
700 Block mobileNavigationSignIn = new Block
701 {
702 Id = "MobileNavigationSignIn",
703 SortId = 10,
704 Template = RenderMobileNavigationSignIn()
705 };
706 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn);
707 }
708
709 Block mobileNavigationMenu = new Block
710 {
711 Id = "MobileNavigationMenu",
712 SortId = 20,
713 Template = RenderMobileNavigationMenu()
714 };
715 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu);
716
717 Block mobileNavigationActions = new Block
718 {
719 Id = "MobileNavigationActions",
720 SortId = 30,
721 Template = RenderMobileNavigationActions(),
722 SkipRenderBlocksList = true
723 };
724 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions);
725
726 if (!navigationItemsHideSignIn)
727 {
728 if (Model.CurrentUser.ID <= 0)
729 {
730 Block mobileNavigationSignInAction = new Block
731 {
732 Id = "MobileNavigationSignInAction",
733 SortId = 10,
734 Template = RenderMobileNavigationSignInAction()
735 };
736 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction);
737
738 if (!hideCreateAccountLink)
739 {
740 Block mobileNavigationCreateAccountAction = new Block
741 {
742 Id = "MobileNavigationCreateAccountAction",
743 SortId = 20,
744 Template = RenderMobileNavigationCreateAccountAction()
745 };
746 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction);
747 }
748 }
749 else
750 {
751 if (!hideMyOrdersLink)
752 {
753 Block mobileNavigationOrdersAction = new Block
754 {
755 Id = "MobileNavigationOrdersAction",
756 SortId = 20,
757 Template = RenderMobileNavigationOrdersAction()
758 };
759 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction);
760 }
761 if (!hideMyFavoritesLink)
762 {
763 Block mobileNavigationFavoritesAction = new Block
764 {
765 Id = "MobileNavigationFavoritesAction",
766 SortId = 30,
767 Template = RenderMobileNavigationFavoritesAction()
768 };
769 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction);
770 }
771 if (!hideMySavedCardsLink)
772 {
773 Block mobileNavigationSavedCardsAction = new Block
774 {
775 Id = "MobileNavigationSavedCardsAction",
776 SortId = 30,
777 Template = RenderMobileNavigationSavedCardsAction()
778 };
779 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction);
780 }
781
782 Block mobileNavigationSignOutAction = new Block
783 {
784 Id = "MobileNavigationSignOutAction",
785 SortId = 40,
786 Template = RenderMobileNavigationSignOutAction()
787 };
788 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction);
789 }
790 }
791
792 if (Model.Languages.Count > 1)
793 {
794 Block mobileNavigationLanguagesAction = new Block
795 {
796 Id = "MobileNavigationLanguagesAction",
797 SortId = 50,
798 Template = RenderMobileNavigationLanguagesAction()
799 };
800 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction);
801 }
802 }
803
804
805 @helper MobileNavigation()
806 {
807 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList();
808
809 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
810 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
811 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
812 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
813 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right";
814
815 <!-- Trigger for mobile navigation -->
816 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" />
817
818 <!-- Mobile navigation -->
819 <nav class="mobile-navigation mobile-navigation--@position dw-mod">
820 @RenderBlockList(subBlocks)
821 </nav>
822
823 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
824
825 if (!onlyPreview)
826 {
827 <div class="u-visually-hidden js-handlebars-root js-mini-cart" id="miniCart" data-template="MiniCartContent" data-cart-id="@cartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
828 }
829 }
830
831 @helper RenderMobileNavigationSignIn()
832 {
833 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
834 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
835 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
836 string myProfilePageLink = linkStart + myProfilePageId;
837 string userName = Model.CurrentUser.FirstName != null ? Model.CurrentUser.FirstName : "";
838 userName += " " + Model.CurrentUser.LastName != null ? Model.CurrentUser.LastName : "";
839 userName += userName == "" && Model.CurrentUser.UserName != null ? Model.CurrentUser.UserName : "";
840
841 <ul class="menu menu-mobile">
842 <li class="menu-mobile__item">
843 <a href="@myProfilePageLink" class="menu-mobile__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @userName</a>
844 </li>
845 </ul>
846 }
847
848 @helper RenderMobileNavigationMenu()
849 {
850 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
851 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt";
852 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3";
853 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
854 int startLevel = renderPagesInToolBar ? 1 : 0;
855
856 @RenderNavigation(new
857 {
858 id = "mobilenavigation",
859 cssclass = "menu menu-mobile dwnavigation",
860 startLevel = @startLevel,
861 ecomStartLevel = @startLevel + 1,
862 endlevel = @levels,
863 expandmode = "all",
864 template = @menuTemplate
865 })
866
867 if (renderPagesInToolBar)
868 {
869 @RenderNavigation(new
870 {
871 id = "topToolsMobileNavigation",
872 cssclass = "menu menu-mobile dwnavigation",
873 template = "ToolsMenuForMobile.xslt"
874 })
875 }
876 }
877
878 @helper RenderMobileNavigationActions()
879 {
880 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ;
881
882 <ul class="menu menu-mobile">
883 @RenderBlockList(subBlocks)
884 </ul>
885 }
886
887 @helper RenderMobileNavigationSignInAction()
888 {
889 <li class="menu-mobile__item">
890 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label>
891 </li>
892 }
893
894 @helper RenderMobileNavigationCreateAccountAction()
895 {
896 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
897
898 <li class="menu-mobile__item">
899 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a>
900 </li>
901 }
902
903 @helper RenderMobileNavigationProfileAction()
904 {
905 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
906 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
907 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
908 string myProfilePageLink = linkStart + myProfilePageId;
909
910 <li class="menu-mobile__item">
911 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("My Profile")</a>
912 </li>
913 }
914
915 @helper RenderMobileNavigationOrdersAction()
916 {
917 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
918 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
919 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
920 string myOrdersPageLink = linkStart + myOrdersPageId;
921
922 <li class="menu-mobile__item">
923 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="fas fa-list menu-mobile__link-icon"></i> @Translate("My Orders")</a>
924 </li>
925 }
926
927 @helper RenderMobileNavigationFavoritesAction()
928 {
929 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
930 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
931 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
932 string myFavoritesPageLink = linkStart + myFavoritesPageId;
933 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star";
934
935
936 <li class="menu-mobile__item">
937 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@favoritesIcon menu-mobile__link-icon"></i> @Translate("My Favorites")</a>
938 </li>
939 }
940
941 @helper RenderMobileNavigationSavedCardsAction()
942 {
943 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
944 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
945 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
946 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
947 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card";
948
949 <li class="menu-mobile__item">
950 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a>
951 </li>
952 }
953
954 @helper RenderMobileNavigationSignOutAction()
955 {
956 int pageId = Model.TopPage.ID;
957 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt";
958
959
960 <li class="menu-mobile__item">
961 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a>
962 </li>
963 }
964
965 @helper RenderMobileNavigationLanguagesAction()
966 {
967 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
968
969 string selectedLanguage = "";
970 foreach (var lang in Model.Languages)
971 {
972 if (lang.IsCurrent)
973 {
974 selectedLanguage = lang.Name;
975 }
976 }
977
978 <li class="menu-mobile__item dw-mod">
979 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
980 <div class="menu-mobile__link__wrap">
981 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue menu-mobile__link-icon"></i> @selectedLanguage</label>
982 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
983 </div>
984 <ul class="menu-mobile menu-mobile__submenu expand-menu">
985 @if (isSlidesDesign)
986 {
987 <li class="menu-mobile__item dw-mod">
988 <div class="menu-mobile__link__wrap">
989 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
990 <label for="MobileMenuCheck_Language" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
991 </div>
992 </li>
993 }
994 @foreach (var lang in Model.Languages)
995 {
996 <li class="menu-mobile__item dw-mod">
997 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a>
998 </li>
999 }
1000 </ul>
1001 </li>
1002 }</text>
1003 }
1004 else
1005 {
1006 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
1007
1008 @using System
1009 @using System.Web
1010 @using System.Collections.Generic
1011 @using Dynamicweb.Rapido.Blocks.Extensibility
1012 @using Dynamicweb.Rapido.Blocks
1013
1014 @functions {
1015 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master");
1016 }
1017
1018 @{
1019 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
1020 bool navigationActionHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
1021 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
1022 bool showSearchIcon = false;
1023 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1024
1025 if (topLayout == "minimal" || topLayout == "minimal-right" || topLayout == "two-lines" || topLayout == "two-lines-centered")
1026 {
1027 showSearchIcon = true;
1028 }
1029 bool headerOnlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
1030
1031 if (renderPagesInToolBar && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
1032 {
1033 Block masterTools = new Block()
1034 {
1035 Id = "MasterDesktopTools",
1036 SortId = 10,
1037 Template = RenderDesktopTools(),
1038 SkipRenderBlocksList = true,
1039 BlocksList = new List<Block>
1040 {
1041 new Block {
1042 Id = "MasterDesktopToolsText",
1043 SortId = 10,
1044 Template = RenderDesktopToolsText(),
1045 Design = new Design
1046 {
1047 Size = "auto",
1048 HidePadding = true,
1049 RenderType = RenderType.Column
1050 }
1051 },
1052 new Block {
1053 Id = "MasterDesktopToolsNavigation",
1054 SortId = 20,
1055 Template = RenderDesktopToolsNavigation(),
1056 Design = new Design
1057 {
1058 Size = "auto-width",
1059 HidePadding = true,
1060 RenderType = RenderType.Column
1061 }
1062 }
1063 }
1064 };
1065 headerBlocksPage.Add(MasterBlockId.MasterHeader, masterTools);
1066 };
1067
1068 Block masterDesktopExtra = new Block()
1069 {
1070 Id = "MasterDesktopExtra",
1071 SortId = 10,
1072 Template = RenderDesktopExtra(),
1073 SkipRenderBlocksList = true
1074 };
1075 headerBlocksPage.Add(MasterBlockId.MasterHeader, masterDesktopExtra);
1076
1077 Block masterDesktopNavigation = new Block()
1078 {
1079 Id = "MasterDesktopNavigation",
1080 SortId = 20,
1081 Template = RenderDesktopNavigation(),
1082 SkipRenderBlocksList = true
1083 };
1084 headerBlocksPage.Add(MasterBlockId.MasterHeader, masterDesktopNavigation);
1085
1086 Block masterDesktopLogo = new Block
1087 {
1088 Id = "MasterDesktopLogo",
1089 SortId = 10,
1090 Template = RenderDesktopLogo(),
1091 Design = new Design
1092 {
1093 Size = "auto-width",
1094 HidePadding = true,
1095 RenderType = RenderType.Column
1096 }
1097 };
1098
1099 Block masterDesktopMenu = new Block
1100 {
1101 Id = "MasterDesktopMenu",
1102 SortId = 20,
1103 Template = RenderDesktopMenu(),
1104 Design = new Design()
1105 {
1106 Size = "auto",
1107 HidePadding = true,
1108 RenderType = RenderType.Column
1109 }
1110 };
1111
1112 Block masterDesktopActionsMenuContainer = new Block
1113 {
1114 Id = "MasterDesktopActionsMenuContainer",
1115 SortId = 30,
1116 Design = new Design
1117 {
1118 RenderType = RenderType.Column,
1119 Size = "auto"
1120 }
1121 };
1122
1123 Block masterDesktopActionsMenu = new Block
1124 {
1125 Id = "MasterDesktopActionsMenu",
1126 SortId = 10,
1127 Template = RenderDesktopActionsMenu(),
1128 SkipRenderBlocksList = true
1129 };
1130
1131 if (!navigationActionHideSearch && showSearchIcon)
1132 {
1133 Block masterDesktopActionsMenuSearch = new Block
1134 {
1135 Id = "MasterDesktopActionsMenuSearch",
1136 SortId = 10,
1137 Template = RenderMiniSearch()
1138 };
1139 masterDesktopActionsMenu.Add(masterDesktopActionsMenuSearch);
1140 }
1141
1142 Block masterDesktopActionsMenuSignIn = new Block
1143 {
1144 Id = "MasterDesktopActionsMenuSignIn",
1145 SortId = 20,
1146 Template = RenderSignIn()
1147 };
1148 masterDesktopActionsMenu.Add(masterDesktopActionsMenuSignIn);
1149
1150 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0)
1151 {
1152 Block masterDesktopActionsMenuFavorites = new Block
1153 {
1154 Id = "MasterDesktopActionsMenuFavorites",
1155 SortId = 30,
1156 Template = RenderFavorites()
1157 };
1158 masterDesktopActionsMenu.Add(masterDesktopActionsMenuFavorites);
1159 }
1160
1161 Block masterDesktopActionsMenuLanguageSelector = new Block
1162 {
1163 Id = "MasterDesktopActionsMenuLanguageSelector",
1164 SortId = 40,
1165 Template = RenderLanguageSelector()
1166 };
1167 masterDesktopActionsMenu.Add(masterDesktopActionsMenuLanguageSelector);
1168
1169 if (!headerOnlyPreview)
1170 {
1171 Block masterDesktopActionsMenuMiniCart = new Block
1172 {
1173 Id = "MasterDesktopActionsMenuMiniCart",
1174 SortId = 50,
1175 Template = RenderMiniCart()
1176 };
1177 masterDesktopActionsMenu.Add(masterDesktopActionsMenuMiniCart);
1178 }
1179
1180 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink")))
1181 {
1182 Block masterDesktopActionsHeaderButton = new Block
1183 {
1184 Id = "MasterDesktopActionsHeaderButton",
1185 SortId = 60,
1186 Template = RenderHeaderButton()
1187 };
1188 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton);
1189 }
1190
1191 Block searchBar = new Block()
1192 {
1193 Id = "SearchBar",
1194 SortId = 40,
1195 Template = RenderSearchBar(),
1196 Design = new Design()
1197 {
1198 Size = "auto",
1199 HidePadding = true,
1200 RenderType = RenderType.Column
1201 }
1202 };
1203
1204 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
1205 {
1206 Block impersonationBar = new Block()
1207 {
1208 Id = "ImpersonationBar",
1209 SortId = 50,
1210 Template = RenderImpersonationBar(),
1211 Design = new Design()
1212 {
1213 Size = "auto-width",
1214 HidePadding = true,
1215 RenderType = RenderType.Column
1216 }
1217 };
1218 headerBlocksPage.Add(MasterBlockId.MasterHeader, impersonationBar);
1219 }
1220
1221 switch (topLayout)
1222 {
1223 case "condensed": //2
1224 masterDesktopLogo.SortId = 10;
1225 masterDesktopLogo.Design.Size = "auto-width";
1226 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopLogo);
1227 masterDesktopMenu.SortId = 20;
1228 masterDesktopMenu.Design.Size = "auto";
1229 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1230 masterDesktopActionsMenuContainer.SortId = 30;
1231 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1232 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1233 if (!navigationActionHideSearch)
1234 {
1235 searchBar.SortId = 40;
1236 searchBar.Design.Size = "12";
1237 masterDesktopExtra.SortId = 50;
1238 headerBlocksPage.Add("MasterDesktopExtra", searchBar);
1239 }
1240 break;
1241 case "minimal": //4
1242 masterDesktopLogo.SortId = 10;
1243 masterDesktopLogo.Design.Size = "auto-width";
1244 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopLogo);
1245 masterDesktopMenu.SortId = 10;
1246 masterDesktopMenu.Design.Size = "auto";
1247 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1248 masterDesktopActionsMenuContainer.SortId = 20;
1249 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1250 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1251 break;
1252 case "minimal-right": //5
1253 masterDesktopLogo.SortId = 10;
1254 masterDesktopLogo.Design.Size = "auto-width";
1255 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopLogo);
1256 masterDesktopMenu.SortId = 10;
1257 masterDesktopMenu.Design.Size = "auto";
1258 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1259 masterDesktopActionsMenuContainer.SortId = 20;
1260 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1261 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1262 break;
1263 case "two-lines": //6
1264 masterDesktopLogo.SortId = 10;
1265 masterDesktopLogo.Design.Size = "auto";
1266 headerBlocksPage.Add("MasterDesktopExtra", masterDesktopLogo);
1267 masterDesktopMenu.SortId = 10;
1268 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1269 masterDesktopActionsMenuContainer.SortId = 20;
1270 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1271 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1272 break;
1273 case "two-lines-centered": //7
1274 masterDesktopLogo.SortId = 10;
1275 masterDesktopLogo.Design.Size = "auto";
1276 headerBlocksPage.Add("MasterDesktopExtra", masterDesktopLogo);
1277 masterDesktopMenu.SortId = 10;
1278 masterDesktopMenu.Design.Size = "auto";
1279 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1280 masterDesktopActionsMenuContainer.SortId = 20;
1281 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1282 break;
1283 case "splitted": //3
1284 masterDesktopLogo.SortId = 10;
1285 masterDesktopLogo.Design.Size = "auto";
1286 headerBlocksPage.Add("MasterDesktopExtra", masterDesktopLogo);
1287 if (!navigationActionHideSearch)
1288 {
1289 searchBar.SortId = 20;
1290 searchBar.Design.Size = "auto";
1291 headerBlocksPage.Add("MasterDesktopExtra", searchBar);
1292 }
1293 masterDesktopMenu.SortId = 10;
1294 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1295 masterDesktopActionsMenuContainer.SortId = 20;
1296 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1297 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopActionsMenuContainer);
1298 break;
1299 case "normal": //1
1300 default:
1301 masterDesktopLogo.SortId = 10;
1302 headerBlocksPage.Add("MasterDesktopExtra", masterDesktopLogo);
1303 if (!navigationActionHideSearch)
1304 {
1305 searchBar.SortId = 20;
1306 headerBlocksPage.Add("MasterDesktopExtra", searchBar);
1307 }
1308 masterDesktopActionsMenuContainer.SortId = 30;
1309 headerBlocksPage.Add("MasterDesktopExtra", masterDesktopActionsMenuContainer);
1310 masterDesktopMenu.SortId = 10;
1311 masterDesktopActionsMenuContainer.Design.Size = "auto-width";
1312 headerBlocksPage.Add("MasterDesktopNavigation", masterDesktopMenu);
1313 break;
1314 }
1315
1316 headerBlocksPage.Add("MasterDesktopActionsMenuContainer", masterDesktopActionsMenu);
1317 }
1318
1319 @helper RenderDesktopTools()
1320 {
1321 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList();
1322
1323 <div class="tools-navigation dw-mod">
1324 <div class="center-container grid top-container__center-container dw-mod">
1325 @RenderBlockList(subBlocks)
1326 </div>
1327 </div>
1328 }
1329
1330 @helper RenderDesktopToolsText()
1331 {
1332 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
1333
1334 <div class="u-margin-top">@toolsText</div>
1335 }
1336
1337 @helper RenderDesktopToolsNavigation()
1338 {
1339 <div>
1340 @RenderNavigation(new
1341 {
1342 id = "topToolsNavigation",
1343 cssclass = "menu menu-tools dw-mod dwnavigation",
1344 template = "TopMenu.xslt"
1345 })
1346 </div>
1347 }
1348
1349 @helper RenderDesktopNavigation()
1350 {
1351 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
1352
1353 <nav class="main-navigation dw-mod">
1354 <div class="center-container top-container__center-container grid grid--align-center dw-mod">
1355 @RenderBlockList(subBlocks)
1356 </div>
1357 </nav>
1358 }
1359
1360 @helper RenderDesktopExtra()
1361 {
1362 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList();
1363
1364 if (subBlocks.Count > 0)
1365 {
1366 <div class="header header-top dw-mod">
1367 <div class="center-container top-container__center-container grid grid--align-center grid--justify-space-between dw-mod">
1368 @RenderBlockList(subBlocks)
1369 </div>
1370 </div>
1371 }
1372 }
1373
1374 @helper RenderDesktopLogo()
1375 {
1376 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
1377 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1378 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
1379 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
1380 string logoHeight = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetString("LogoHeight")) ? Model.Area.Item.GetItem("Layout").GetString("LogoHeight") : "40";
1381 logoHeight = logoHeight != "0" ? logoHeight : "40";
1382 if (Path.GetExtension(logo).ToLower() != ".svg")
1383 {
1384 logo = "/Admin/Public/GetImage.ashx?height=" + logoHeight + "&crop=5&Compression=75&image=" + logo;
1385
1386 if (Pageview.Device.ToString() == "Mobile")
1387 {
1388 logoHeight = "40";
1389 }
1390 }
1391 else
1392 {
1393 logo = HttpUtility.UrlDecode(logo);
1394 }
1395
1396 <div class="logo @alignClass dw-mod">
1397 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
1398 <img class="grid__cell-img logo__img dw-mod" src="@logo" />
1399 </a>
1400 </div>
1401 }
1402
1403 @helper RenderDesktopMenu()
1404 {
1405 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1406 string menuAlignment = topLayout == "two-lines-centered" || topLayout == "minimal-right" ? "u-pull--right" : "";
1407
1408 bool megaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue.ToLower() == "true" ? true : false;
1409 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
1410 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
1411 int startLevel = renderPagesInToolBar ? 1 : 0;
1412
1413 <div class="grid__cell">
1414 <div class="@menuAlignment">
1415 @if (!megaMenu)
1416 {
1417 @RenderNavigation(new
1418 {
1419 id = "topnavigation",
1420 cssclass = "menu dw-mod dwnavigation u-full-max-width",
1421 startLevel = @startLevel,
1422 ecomStartLevel = @startLevel + 1,
1423 endlevel = 5,
1424 expandmode = "all",
1425 template = "BaseMenuWithDropdown.xslt"
1426 });
1427 }
1428 else
1429 {
1430 @RenderNavigation(new
1431 {
1432 id = "topnavigation",
1433 cssclass = "menu dw-mod dwnavigation u-full-max-width",
1434 startLevel = @startLevel,
1435 ecomStartLevel = @startLevel + 1,
1436 endlevel = 5,
1437 promotionImage = megamenuPromotionImage,
1438 promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"),
1439 expandmode = "all",
1440 template = "BaseMegaMenu.xslt"
1441 });
1442 }
1443 </div>
1444 </div>
1445 }
1446
1447 @helper RenderDesktopActionsMenu()
1448 {
1449 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList();
1450
1451 <ul class="menu dw-mod">
1452 @RenderBlockList(subBlocks)
1453 </ul>
1454 }
1455
1456 @helper RenderLanguageSelector()
1457 {
1458 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1459 string liClasses = topLayout != "normal" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean dw-mod";
1460 string menuLinkClass = topLayout != "normal" ? "menu__link" : "header-menu__link";
1461 string languageViewType = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : "";
1462
1463 if (Model.Languages.Count > 1)
1464 {
1465 <li class="@liClasses is-dropdown is-dropdown--no-icon">
1466 <div class="@menuLinkClass menu__link--icon dw-mod">
1467 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i>
1468 </div>
1469 <div class="menu menu--dropdown dw-mod">
1470 @foreach (var lang in Model.Languages)
1471 {
1472 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name;
1473
1474 if (languageViewType == "flag")
1475 {
1476 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + "\"></span>";
1477 }
1478
1479 if (languageViewType == "name")
1480 {
1481 langInfo = lang.Name;
1482 }
1483
1484 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID&SetLang=true" class="menu-dropdown__item menu-dropdown__item--link dw-mod">@langInfo</a>
1485 }
1486 </div>
1487 </li>
1488 }
1489 }
1490
1491 @helper RenderMiniCart()
1492 {
1493 bool navigationItemsHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
1494 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
1495 int cartPageId = GetPageIdByNavigationTag("CartPage");
1496 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
1497
1498 if (!onlyPreview && !navigationItemsHideCart)
1499 {
1500 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1501 string liClasses = topLayout != "normal" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod" : "menu__item menu__item--horizontal menu--clean dw-mod";
1502 string menuLinkClass = topLayout != "normal" ? "menu__link" : "header-menu__link";
1503 string cartProductsCount = Model.Cart.TotalProductsCount.ToString();
1504 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue;
1505 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
1506 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : "";
1507 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : "";
1508
1509 if (showPrice && counterPosition == "right")
1510 {
1511 cartProductsCount = Translate("Cart") + "(" + cartProductsCount + ")";
1512 }
1513
1514
1515 <li class="@liClasses" id="miniCartWrapper" onmouseenter="Cart.UpdateMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
1516 <div class="mini-cart dw-mod">
1517 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="@menuLinkClass menu__link--icon dw-mod js-mini-cart-button">
1518 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i>
1519 <div class="mini-cart__counter dw-mod">
1520 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
1521 <div class="js-mini-cart-counter-content">
1522 @cartProductsCount
1523 @cartProductsTotalPrice
1524 </div>
1525 </div>
1526 </div>
1527 </a>
1528 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
1529 {
1530 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="miniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
1531 }
1532 </div>
1533 </li>
1534 }
1535 }
1536
1537 @helper RenderSignIn()
1538 {
1539 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
1540 string userInitials = "";
1541 int pageId = Model.TopPage.ID;
1542 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
1543 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
1544 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
1545 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
1546 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
1547 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
1548 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
1549 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
1550 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
1551 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
1552 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
1553 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
1554
1555 string linkStart = "/Default.aspx?ID=";
1556 if (Model.CurrentUser.ID <= 0)
1557 {
1558 linkStart = linkStart + signInProfilePageId + "&RedirectPageId=";
1559 }
1560
1561 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
1562 string myProfilePageLink = linkStart + myProfilePageId;
1563 string myOrdersPageLink = linkStart + myOrdersPageId;
1564 string myFavoritesPageLink = linkStart + myFavoritesPageId;
1565 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
1566
1567 if (Model.CurrentUser.ID != 0)
1568 {
1569 if (!String.IsNullOrEmpty(Model.CurrentUser.Name))
1570 {
1571 string[] names = Model.CurrentUser.Name.Split(' ');
1572 userInitials += Model.CurrentUser.Name.Substring(0, 1);
1573
1574 if (names.Length > 1)
1575 {
1576 userInitials += names[names.Length - 1].Substring(0, 1);
1577 }
1578 }
1579 else
1580 {
1581 userInitials += Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName != "" ? Model.CurrentUser.FirstName.Substring(0, 1) : "";
1582 userInitials += Model.CurrentUser.LastName != null && Model.CurrentUser.LastName != "" ? Model.CurrentUser.LastName.Substring(0, 1) : "";
1583 userInitials += userInitials.Length == 1 && Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName.Length > 1 ? Model.CurrentUser.FirstName.Substring(1, 2) : "";
1584 userInitials += userInitials == "" && Model.CurrentUser.Email != null && Model.CurrentUser.Email.Length > 1 ? Model.CurrentUser.Email.Substring(0, 2) : "";
1585 userInitials += userInitials == "" ? Model.CurrentUser.UserName.Substring(0, 2) : "";
1586 }
1587 }
1588
1589 if (!navigationItemsHideSignIn)
1590 {
1591 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1592 string liClasses = topLayout != "normal" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu__item--clean dw-mod";
1593 string menuLinkClass = topLayout != "normal" ? "menu__link" : "header-menu__link";
1594
1595 <li class="@liClasses is-dropdown is-dropdown--no-icon">
1596 <div class="@menuLinkClass menu__link--icon dw-mod">
1597 @if (Model.CurrentUser.ID <= 0)
1598 {
1599 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x"></i>
1600 }
1601 else
1602 {
1603 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>
1604 }
1605 </div>
1606 <div class="menu menu--dropdown sign-in-dropdown dw-mod">
1607 <ul class="list list--clean dw-mod">
1608 @if (Model.CurrentUser.ID <= 0)
1609 {
1610 <li>
1611 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>
1612 </li>
1613 if (!hideCreateAccountLink)
1614 {
1615 <li>
1616 <a href="/default.aspx?ID=@createAccountPageId" class="list__link dw-mod">@Translate("Create account")</a>
1617 </li>
1618 }
1619 <li>
1620 <a href="@forgotPasswordPageLink" class="list__link dw-mod">@Translate("Forgot your password?")</a>
1621 </li>
1622 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
1623 {
1624 <li class="list__seperator dw-mod"></li>
1625 }
1626 }
1627 @if (!hideMyProfileLink)
1628 {
1629 <li>
1630 <a href="@myProfilePageLink" class="list__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue u-margin-right"></i>@Translate("My Profile")</a>
1631 </li>
1632 }
1633 @if (!hideMyOrdersLink)
1634 {
1635 <li>
1636 <a href="@myOrdersPageLink" class="list__link dw-mod"><i class="fas fa-list u-margin-right"></i>@Translate("My Orders")</a>
1637 </li>
1638 }
1639 @if (!hideMyFavoritesLink)
1640 {
1641 <li>
1642 <a href="@myFavoritesPageLink" class="list__link dw-mod"><i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue u-margin-right"></i>@Translate("My Favorites")</a>
1643 </li>
1644 }
1645 @if (!hideMySavedCardsLink)
1646 {
1647 <li>
1648 <a href="@mySavedCardsPageLink" class="list__link dw-mod"><i class="fas fa-credit-card u-margin-right"></i>@Translate("My Saved cards")</a>
1649 </li>
1650 }
1651 @if (Model.CurrentUser.ID > 0)
1652 {
1653 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
1654 {
1655 <li class="list__seperator dw-mod"></li>
1656 }
1657 <li>
1658 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" class="list__link dw-mod">@Translate("Sign out")</a>
1659 </li>
1660 }
1661 </ul>
1662 </div>
1663 </li>
1664 }
1665 }
1666
1667 @helper RenderFavorites()
1668 {
1669 bool navigationItemsHideFavorites = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
1670 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
1671 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
1672
1673 string linkStart = "/Default.aspx?ID=";
1674 if (Model.CurrentUser.ID <= 0)
1675 {
1676 linkStart = linkStart + signInProfilePageId + "&RedirectPageId=";
1677 }
1678
1679 string myFavoritesPageLink = linkStart + myFavoritesPageId;
1680 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
1681 string liClasses = topLayout != "normal" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean dw-mod";
1682 string menuLinkClass = topLayout != "normal" ? "menu__link" : "header-menu__link";
1683
1684 <li class="@liClasses">
1685 <a href="@myFavoritesPageLink" class="@menuLinkClass menu__link--icon dw-mod">
1686 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i>
1687 </a>
1688 </li>
1689 }
1690
1691 @helper RenderHeaderButton()
1692 {
1693 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText");
1694 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink");
1695 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : "";
1696
1697 <li class="menu__item menu__item--horizontal menu--clean dw-mod">
1698 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a>
1699 </li>
1700 }
1701
1702 @helper RenderSearchBar(string alignment = "left")
1703 {
1704 string searchFeedId = "";
1705 string searchSecondFeedId = "";
1706 int groupsFeedId;
1707 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
1708 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
1709 string resultPageLink;
1710 string searchPlaceholder;
1711 string searchType = "product-search";
1712 string searchTemplate;
1713 string searchContentTemplate = "";
1714 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
1715 bool showGroups = true;
1716
1717 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
1718 {
1719 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
1720 resultPageLink = contentSearchPageLink;
1721 searchPlaceholder = Translate("Search page");
1722 groupsFeedId = 0;
1723 searchType = "content-search";
1724 searchTemplate = "SearchPagesTemplate";
1725 showGroups = false;
1726 }
1727 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
1728 {
1729 searchFeedId = productsPageId + "&feed=true";
1730 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
1731 resultPageLink = Converter.ToString(productsPageId);
1732 searchPlaceholder = Translate("Search products or pages");
1733 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
1734 searchType = "combined-search";
1735 searchTemplate = "SearchProductsTemplateWrap";
1736 searchContentTemplate = "SearchPagesTemplateWrap";
1737 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
1738 }
1739 else
1740 {
1741 resultPageLink = Converter.ToString(productsPageId);
1742 searchFeedId = productsPageId + "&feed=true";
1743 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
1744 searchPlaceholder = Translate("Search products");
1745 searchTemplate = "SearchProductsTemplate";
1746 searchType = "product-search";
1747 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
1748 }
1749
1750 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" data-page-size="7" id="ProductSearchBar" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-groups-page-id="@groupsFeedId" data-search-type="@searchType">
1751 @if (showGroups)
1752 {
1753 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
1754 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
1755 }
1756 <div class="typeahead-search-field">
1757 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
1758 @if (string.IsNullOrEmpty(searchSecondFeedId))
1759 {
1760 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
1761 }
1762 else
1763 {
1764 <div class="dropdown dropdown--absolute-position dropdown--combined grid @(alignment == "right" ? "dropdown--right-aligned" : "")">
1765 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
1766 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div>
1767 </div>
1768 }
1769 </div>
1770 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button>
1771 </div>
1772 }
1773
1774 @helper RenderMiniSearch()
1775 {
1776 string searchFeedId = "";
1777 string searchSecondFeedId = "";
1778 int groupsFeedId;
1779 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
1780 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
1781 string resultPageLink;
1782 string searchPlaceholder;
1783 string searchType = "product-search";
1784 string searchTemplate;
1785 string searchContentTemplate = "";
1786 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
1787 bool showGroups = true;
1788
1789 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
1790 {
1791 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
1792 resultPageLink = contentSearchPageLink;
1793 searchPlaceholder = Translate("Search page");
1794 groupsFeedId = 0;
1795 searchType = "content-search";
1796 searchTemplate = "SearchPagesTemplate";
1797 showGroups = false;
1798 }
1799 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
1800 {
1801 searchFeedId = productsPageId + "&feed=true";
1802 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
1803 resultPageLink = Converter.ToString(productsPageId);
1804 searchPlaceholder = Translate("Search products or pages");
1805 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
1806 searchType = "combined-search";
1807 searchTemplate = "SearchProductsTemplateWrap";
1808 searchContentTemplate = "SearchPagesTemplateWrap";
1809 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
1810 }
1811 else
1812 {
1813 resultPageLink = Converter.ToString(productsPageId);
1814 searchFeedId = productsPageId + "&feed=true";
1815 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
1816 searchPlaceholder = Translate("Search products");
1817 searchTemplate = "SearchProductsTemplate";
1818 searchType = "product-search";
1819 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
1820 }
1821
1822 <li class="menu__item menu__item--horizontal menu__item--top-level u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" onmouseover="document.getElementById('headerSearch').focus()">
1823 <div class="menu__link menu__link--icon dw-mod">
1824 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
1825 </div>
1826 <div class="menu menu--dropdown u-w380px top-micro-search dw-mod">
1827 <div class="typeahead js-typeahead" data-page-size="7" id="ProductSearchBar" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType">
1828 <div class="typeahead-search-field">
1829 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@searchPlaceholder" value="@searchValue">
1830 @if (string.IsNullOrEmpty(searchSecondFeedId))
1831 {
1832 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
1833 }
1834 else
1835 {
1836 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
1837 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
1838 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div>
1839 </div>
1840 }
1841 </div>
1842 </div>
1843 </div>
1844 </li>
1845 }
1846
1847 @helper RenderImpersonationBar()
1848 {
1849 int impersonationPageId = GetPageIdByNavigationTag("Impersonation");
1850
1851 <div class="u-color-warning--bg">
1852 <div class="center-container top-container__center-container dw-mod">
1853 @*Impersonation*@
1854 <div class="grid">
1855 <div class="grid--align-self-center grid__col-x">
1856 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
1857 {
1858 string stopImpersonateTranslation = Translate("Stop impersonation");
1859 string username = "";
1860 if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.FirstName) && !string.IsNullOrEmpty(Model.CurrentSecondaryUser.LastName))
1861 {
1862 username = Model.CurrentSecondaryUser.FirstName + " " + Model.CurrentSecondaryUser.LastName;
1863 }
1864 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Name))
1865 {
1866 username = Model.CurrentSecondaryUser.Name;
1867 }
1868 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Email))
1869 {
1870 username = Model.CurrentSecondaryUser.Email;
1871 }
1872 else
1873 {
1874 username = Model.CurrentSecondaryUser.UserName;
1875 }
1876 <div class="grid-cell">
1877 <div class="u-pull--left u-bold u-margin-top">
1878 <i class="fas fa-user-secret"></i>
1879 @Pageview.User.UserName<text> </text>@Translate("is impersonating")<text> </text>@username
1880 </div>
1881 <form method="post" class="u-pull--right u-no-margin">
1882 <input type="submit" class="btn btn--secondary dw-mod u-no-margin" name="DwExtranetRemoveSecondaryUser" value="@stopImpersonateTranslation">
1883 </form>
1884 </div>
1885 }
1886 else
1887 {
1888 string viewListTranslation = Translate("View the list of users you can impersonate");
1889 <div class="grid-cell u-bold">
1890 <i class="fas fa-user-secret"></i>
1891 <a href="/Default.aspx?ID=@impersonationPageId" title="@viewListTranslation" class="u-color-font-black">@viewListTranslation</a>
1892 </div>
1893 }
1894 </div>
1895 </div>
1896 </div>
1897 </div>
1898 }
1899
1900 </text>
1901 }
1902 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
1903
1904 @using System
1905 @using System.Web
1906 @using System.Collections.Generic
1907 @using Dynamicweb.Rapido.Blocks.Extensibility
1908 @using Dynamicweb.Rapido.Blocks
1909
1910 @functions {
1911 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
1912 }
1913
1914 @{
1915 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content") : "";
1916 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content") : "";
1917 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content") : "";
1918 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header") : "";
1919 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header") : "";
1920 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree") != null ? Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header") : "";
1921
1922 Block masterFooterContent = new Block()
1923 {
1924 Id = "MasterFooterContent",
1925 SortId = 10,
1926 Template = RenderFooter(),
1927 SkipRenderBlocksList = true
1928 };
1929 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
1930
1931 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
1932 {
1933 Block masterFooterColumnOne = new Block
1934 {
1935 Id = "MasterFooterColumnOne",
1936 SortId = 10,
1937 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
1938 Design = new Design {
1939 Size = "auto",
1940 RenderType = RenderType.Column
1941 }
1942 };
1943 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
1944 }
1945
1946 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
1947 {
1948 Block masterFooterColumnTwo = new Block
1949 {
1950 Id = "MasterFooterColumnTwo",
1951 SortId = 20,
1952 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent),
1953 Design = new Design
1954 {
1955 Size = "auto",
1956 RenderType = RenderType.Column
1957 }
1958 };
1959 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
1960 }
1961
1962 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
1963 {
1964 Block masterFooterColumnThree = new Block
1965 {
1966 Id = "MasterFooterColumnThree",
1967 SortId = 30,
1968 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent),
1969 Design = new Design
1970 {
1971 Size = "auto",
1972 RenderType = RenderType.Column
1973 }
1974 };
1975 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
1976 }
1977
1978 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
1979 {
1980 Block masterFooterNewsletterSignUp = new Block
1981 {
1982 Id = "MasterFooterNewsletterSignUp",
1983 SortId = 40,
1984 Template = RenderFooterNewsletterSignUp(),
1985 Design = new Design
1986 {
1987 Size = "auto",
1988 RenderType = RenderType.Column
1989 }
1990 };
1991 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp);
1992 }
1993
1994 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0)
1995 {
1996 Block masterFooterSocialLinks = new Block
1997 {
1998 Id = "MasterFooterSocialLinks",
1999 SortId = 50,
2000 Template = RenderFooterSocialLinks(),
2001 Design = new Design
2002 {
2003 Size = "auto",
2004 RenderType = RenderType.Column
2005 }
2006 };
2007 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
2008 }
2009
2010 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
2011 {
2012 Block masterFooterPayments = new Block
2013 {
2014 Id = "MasterFooterPayments",
2015 SortId = 60,
2016 Template = RenderFooterPayments(),
2017 Design = new Design
2018 {
2019 Size = "12",
2020 RenderType = RenderType.Column
2021 }
2022 };
2023 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
2024 }
2025
2026 Block masterFooterCopyright = new Block
2027 {
2028 Id = "MasterFooterCopyright",
2029 SortId = 70,
2030 Template = RenderFooterCopyright(),
2031 Design = new Design
2032 {
2033 Size = "12",
2034 RenderType = RenderType.Column
2035 }
2036 };
2037 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
2038
2039 }
2040
2041 @helper RenderFooter() {
2042 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
2043
2044 <footer class="footer dw-mod">
2045 <div class="center-container top-container__center-container dw-mod">
2046 <div class="grid grid--external-bleed-x">
2047 @RenderBlockList(subBlocks)
2048 </div>
2049 </div>
2050 </footer>
2051 }
2052
2053 @helper RenderFooterColumn(string header, string content) {
2054 <h3 class="footer__heading dw-mod">@header</h3>
2055 <div class="footer__content dw-mod">
2056 @content
2057 </div>
2058 }
2059
2060 @helper RenderFooterNewsletterSignUp() {
2061 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString();
2062
2063 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
2064 <div class="footer__content dw-mod">
2065 <p>@Translate("Sign up if you would like to receive occasional treats from us", "Sign up if you would like to receive occasional treats from us").</p>
2066 <form class="form dw-mod" name="NewsletterRedirect" action='/Default.aspx' method="get" enctype="multipart/form-data">
2067 <input name="ID" value="@newsletterSignUpPageId" type="hidden" />
2068 <div class="form__field-combi">
2069 <input name="NewsletterEmail" id="NewsletterEmail" type="text" placeholder='@Translate("Your email address", "Your email address")' />
2070 <input class="btn btn--primary btn--condensed dw-mod" type="submit" id="Submitter" value='@Translate("Go", "Go")' />
2071 </div>
2072 </form>
2073 </div>
2074 }
2075
2076 @helper RenderFooterSocialLinks() {
2077 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3>
2078 <div class="footer__content dw-mod">
2079 <div class="collection dw-mod">
2080 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
2081 {
2082 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
2083 string socialIconClass = socialIcon.SelectedValue;
2084 string socialIconTitle = socialIcon.SelectedName;
2085 string socialLink = socialitem.GetString("Link");
2086
2087 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px"><i class="@socialIconClass fa-2x"></i></a>
2088 }
2089 </div>
2090 </div>
2091 }
2092
2093 @helper RenderFooterPayments() {
2094 <div class="footer__content dw-mod">
2095 <div class="collection dw-mod">
2096 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments"))
2097 {
2098 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel;
2099 string paymentImage = null;
2100 string paymentTitle = paymentItem.SelectedName;
2101 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault();
2102 if (selected != null)
2103 {
2104 paymentImage = selected.Icon;
2105 }
2106
2107 <div class="footer__card-type">
2108 <img src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle" />
2109 </div>
2110 }
2111 </div>
2112 </div>
2113 }
2114
2115 @helper RenderFooterCopyright() {
2116 <div class="grid__col-12 footer__copyright dw-mod">
2117 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p>
2118 </div>
2119 }
2120
2121 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2122
2123 @using System
2124 @using System.Web
2125 @using System.Collections.Generic
2126 @using Dynamicweb.Rapido.Blocks.Extensibility
2127 @using Dynamicweb.Rapido.Blocks
2128
2129 @{
2130 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
2131 bool navigationItemsHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
2132
2133 if (!navigationItemsHideCart)
2134 {
2135 Block miniCartScriptTemplates = new Block()
2136 {
2137 Id = "MasterMiniCartTemplates",
2138 SortId = 1,
2139 Template = RenderMiniCartScriptTemplates(),
2140 SkipRenderBlocksList = true,
2141 BlocksList = new List<Block>
2142 {
2143 new Block {
2144 Id = "MiniCartHeader",
2145 SortId = 10,
2146 Template = RenderMiniCartHeader()
2147 },
2148 new Block {
2149 Id = "MiniCartOrderLines",
2150 SortId = 20,
2151 Template = RenderMiniCartOrderLines()
2152 },
2153 new Block {
2154 Id = "MiniCartFees",
2155 SortId = 30,
2156 Template = RenderMiniCartFees()
2157 },
2158 new Block {
2159 Id = "MiniCartPoints",
2160 SortId = 40,
2161 Template = RenderMiniCartPoints()
2162 },
2163 new Block {
2164 Id = "MiniCartTotal",
2165 SortId = 50 ,
2166 Template = RenderMiniCartTotal()
2167 }
2168 }
2169 };
2170
2171 miniCartBlocksPage.Add(MasterBlockId.MasterBottomSnippets, miniCartScriptTemplates);
2172 }
2173 }
2174
2175 @helper RenderMiniCartScriptTemplates()
2176 {
2177 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
2178
2179 int cartPageId = GetPageIdByNavigationTag("CartPage");
2180 bool showPriceInMiniCartCounter = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
2181 showPriceInMiniCartCounter = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue == "right" ? showPriceInMiniCartCounter : false;
2182 showPriceInMiniCartCounter = Pageview.Device.ToString() == "Mobile" ? false : showPriceInMiniCartCounter;
2183 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
2184 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
2185 string addingToCartNotification = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
2186 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
2187
2188
2189 <script id="MiniCartCounterContent" type="text/x-template">
2190 {{#.}}
2191 <div class="js-mini-cart-counter-content dw-mod">
2192 @if (showPriceInMiniCartCounter) {
2193 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
2194 } else {
2195 <text>{{numberofproducts}}</text>
2196 }
2197 </div>
2198 {{/.}}
2199 </script>
2200
2201 <script id="MiniCartContent" type="text/x-template">
2202 {{#.}}
2203 @if (useGoogleTagManager)
2204 {
2205 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
2206 }
2207 <div class="mini-cart-dropdown__inner {{isempty}} dw-mod">
2208 <h4 class="u-ta-center u-no-margin u-margin-bottom u-margin-top">@Translate("Shopping cart")</h4>
2209 <div class="mini-cart-dropdown__body dw-mod">
2210 <table class="table mini-cart-table dw-mod">
2211 @RenderBlockList(subBlocks)
2212 </table>
2213 </div>
2214
2215 <table class="table mini-cart-table dw-mod">
2216 <tr class="mini-cart-orderlines__footer dw-mod">
2217 <td colspan="2"><button type="button" class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);">@Translate("Empty cart")</button></td>
2218 <td colspan="2" class="u-ta-right"><a href="/Default.aspx?ID=@cartPageId" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a></td>
2219 </tr>
2220 </table>
2221 </div>
2222 {{/.}}
2223 </script>
2224
2225 <script id="MiniCartOrderline" type="text/x-template">
2226 <tr class="{{isempty}}">
2227 <td><a href="{{link}}" class="{{hideimage}}"><img src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}"></a></td>
2228 <td>
2229 <a href="{{link}}" class="mini-cart-orderlines__name" title="{{name}}">{{name}}</a>
2230 {{#if variantname}}
2231 <a href="{{link}}" class="mini-cart-orderlines__name mini-cart-orderlines__name--small">{{variantname}}</a>
2232 {{/if}}
2233 {{#if unitname}}
2234 <div class="mini-cart-orderlines__name mini-cart-orderlines__name--small">{{unitname}}</div>
2235 {{/if}}
2236 </td>
2237 <td class="u-ta-right">{{quantity}}</td>
2238 <td class="u-ta-right">
2239 {{#if pointsTotal}}
2240 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
2241 {{else}}
2242 {{totalprice}}
2243 {{/if}}
2244 </td>
2245 </tr>
2246 </script>
2247
2248 <script id="MiniCartOrderlineDiscount" type="text/x-template">
2249 <tr class="table__row--no-border {{isempty}}">
2250 <td> </td>
2251 <td><div class="mini-cart-orderlines__name dw-mod">{{name}}</div></td>
2252 <td class="u-ta-right"> </td>
2253 <td class="u-ta-right">{{totalprice}}</td>
2254 </tr>
2255 </script>
2256
2257 if (!onlyPreview && addingToCartNotification == "modal")
2258 {
2259 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
2260
2261 <script id="LastAddedProductTemplate" type="text/x-template">
2262 <!-- Trigger for the login modal -->
2263 <input type="checkbox" id="LastAddedProductModalTrigger" class="modal-trigger" />
2264
2265 <!-- Login modal -->
2266 <div class="modal-container">
2267 <label for="LastAddedProductModalTrigger" class="modal-overlay"></label>
2268 <div class="modal modal--md">
2269 <div class="modal__header">
2270 <h2>@Translate("Product is added to the cart")</h2>
2271 </div>
2272 <div class="modal__body">
2273 <div class="grid">
2274 <div class="grid__col-2">
2275 <a href="{{productInfo.link}}">
2276 <img src="{{productInfo.image}}" alt="{{productInfo.name}}" class="dw-mod" />
2277 </a>
2278 </div>
2279 <div class="u-padding grid--align-self-center">
2280 <span>{{quantity}}</span> x
2281 </div>
2282 <div class="grid__col-auto grid--align-self-center">
2283 <div>{{productInfo.name}}</div>
2284 {{#if productInfo.variantName}}
2285 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
2286 {{/if}}
2287 {{#if productInfo.unitName}}
2288 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
2289 {{/if}}
2290 </div>
2291 </div>
2292 <div class="modal__footer u-margin-top--lg">
2293 <label class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" for="LastAddedProductModalTrigger">@Translate("Continue shopping")</label>
2294 <a href="/cart" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a>
2295 </div>
2296 </div>
2297 <label class="modal__close-btn" for="LastAddedProductModalTrigger"></label>
2298 </div>
2299 </div>
2300 </script>
2301 <script>
2302 document.addEventListener('addToCart', function (event) {
2303 Cart.ShowLastAddedProductModal(event.detail);
2304 });
2305 </script>
2306 }
2307 else if (!onlyPreview && addingToCartNotification == "toggle")
2308 {
2309 <script>
2310 document.addEventListener('addToCart', function () {
2311 Cart.ToggleMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
2312 });
2313 </script>
2314 }
2315 }
2316
2317 @helper RenderMiniCartHeader() {
2318 <thead>
2319 <tr>
2320 <td> </td>
2321 <td>@Translate("Product")</td>
2322 <td class="u-ta-right">@Translate("Qty")</td>
2323 <td class="u-ta-right" width="120">@Translate("Price")</td>
2324 </tr>
2325 </thead>
2326 }
2327
2328 @helper RenderMiniCartOrderLines() {
2329 <text>
2330 {{#OrderLines}}
2331 {{#ifCond template "===" "CartOrderline"}}
2332 {{>MiniCartOrderline}}
2333 {{/ifCond}}
2334 {{#ifCond template "===" "CartOrderlineMobile"}}
2335 {{>MiniCartOrderline}}
2336 {{/ifCond}}
2337 {{#ifCond template "===" "CartOrderlineDiscount"}}
2338 {{>MiniCartOrderlineDiscount}}
2339 {{/ifCond}}
2340 {{/OrderLines}}
2341 </text>
2342 }
2343
2344 @helper RenderMiniCartFees() {
2345 <tr>
2346 <td><i class="fas fa-credit-card"></i></td>
2347 <td>{{paymentmethod}}</td>
2348 <td colspan="2" class="u-ta-right" width="130">{{paymentfee}}</td>
2349 </tr>
2350 <tr>
2351 <td><i class="fas fa-truck"></i></td>
2352 <td>{{shippingmethod}}</td>
2353 <td colspan="2" class="u-ta-right" width="130">{{shippingfee}}</td>
2354 </tr>
2355 }
2356
2357 @helper RenderMiniCartPoints() {
2358 <text>
2359 {{#if earnings}}
2360 <tr>
2361 <td colspan="2">@Translate("Earnings")</td>
2362 <td colspan="2" class="u-ta-right" width="130"><span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")</td>
2363 </tr>
2364 {{/if}}
2365 </text>
2366 }
2367
2368 @helper RenderMiniCartTotal() {
2369 <tr class="mini-cart-totals dw-mod">
2370 <td colspan="2">@Translate("Total")</td>
2371 <td class="u-ta-right">{{numberofproducts}}</td>
2372 <td class="u-ta-right" width="130">{{totalprice}}</td>
2373 </tr>
2374 }
2375 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2376
2377 @using System
2378 @using System.Web
2379 @using System.Collections.Generic
2380 @using Dynamicweb.Rapido.Blocks.Extensibility
2381 @using Dynamicweb.Rapido.Blocks
2382 @using Dynamicweb.Ecommerce.Common
2383
2384 @{
2385 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
2386
2387 Block masterScriptReferences = new Block()
2388 {
2389 Id = "MasterScriptReferences",
2390 SortId = 1,
2391 Template = RenderMasterScriptReferences()
2392 };
2393 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
2394 }
2395
2396 @helper RenderMasterScriptReferences() {
2397 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.11.js"></script>
2398 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script>
2399
2400 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
2401 {
2402 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script>
2403 }
2404 }
2405 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2406
2407 @using System
2408 @using System.Web
2409 @using System.Collections.Generic
2410 @using Dynamicweb.Rapido.Blocks.Extensibility
2411 @using Dynamicweb.Rapido.Blocks
2412
2413 @{
2414 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
2415 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
2416
2417 if (!navigationItemsHideSearch)
2418 {
2419 Block masterSearchScriptTemplates = new Block()
2420 {
2421 Id = "MasterSearchScriptTemplates",
2422 SortId = 1,
2423 Template = RenderSearchScriptTemplates()
2424 };
2425
2426 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
2427 }
2428 }
2429
2430 @helper RenderSearchScriptTemplates()
2431 {
2432 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
2433 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
2434 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
2435 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
2436 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
2437 bool isDigitalWarehouse = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("EnableDigitalWarehouse");
2438 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
2439
2440 <script id="SearchGroupsTemplate" type="text/x-template">
2441 {{#.}}
2442 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
2443 {{/.}}
2444 </script>
2445
2446 <script id="SearchProductsTemplate" type="text/x-template">
2447 {{#each .}}
2448 {{#Product}}
2449 {{#ifCond template "!==" "SearchMore"}}
2450 <li class="dropdown__item dropdown__item--seperator dw-mod">
2451 @if (useFacebookPixel)
2452 {
2453 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
2454 }
2455 @if (useGoogleTagManager)
2456 {
2457 <text>{{{googleEnchantImpression 'Search results' currency googleImpression}}}</text>
2458 }
2459 <div>
2460 <a href="{{link}}" class="js-typeahead-link u-color-inherit u-pull--left" onclick="{{googleImpressionClick}}" title="{{name}}">
2461 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}"></div>
2462 <div class="u-pull--left">
2463 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}</div>
2464 @if (!onlyPreview)
2465 {
2466 if (pointShopOnly)
2467 {
2468 <text>
2469 {{#if havePointPrice}}
2470 <div>
2471 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
2472 </div>
2473 {{else}}
2474 <small class="help-text u-no-margin">@Translate("Not available")</small>
2475 {{/if}}
2476 {{#unless canBePurchasedWithPoints}}
2477 {{#if havePointPrice}}
2478 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
2479 {{/if}}
2480 {{/unless}}
2481 </text>
2482 }
2483 else
2484 {
2485 <div>{{price}}</div>
2486 }
2487 }
2488 </div>
2489 </a>
2490 <div class="u-margin-left u-pull--right">
2491 @if (!onlyPreview)
2492 {
2493 if (pointShopOnly)
2494 {
2495 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"
2496 onclick="Cart.AddToCart(event, {
2497 id: '{{productId}}',
2498 quantity: 1,
2499 buyForPoints: true,
2500 productInfo: {{productInfo}}
2501 }); {{facebookPixelAction}}" {{disabledBuyButton}}>
2502 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
2503 </button>
2504 }
2505 else
2506 {
2507 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside"
2508 onclick="Cart.AddToCart(event, {
2509 id: '{{productId}}',
2510 quantity: 1,
2511 productInfo: {{productInfo}}
2512 }); {{facebookPixelAction}}">
2513 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
2514 </button>
2515 }
2516 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod {{hideViewMore}} js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
2517 }
2518 else if (isDigitalWarehouse)
2519 {
2520 <a class="btn btn--primary u-no-margin btn--condensed dw-mod" href="{{listLink}}"><i class="fas {{listIcon}}"></i></a>
2521 }
2522 else
2523 {
2524 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
2525 }
2526 </div>
2527 </div>
2528 </li>
2529 {{/ifCond}}
2530 {{#ifCond template "===" "SearchMore"}}
2531 {{>SearchMoreProducts}}
2532 {{/ifCond}}
2533 {{/Product}}
2534 {{else}}
2535 <li class="dropdown__item dropdown__item--seperator dw-mod">
2536 @Translate("Your search gave 0 results")
2537 </li>
2538 {{/each}}
2539 </script>
2540
2541 <script id="SearchMoreProducts" type="text/x-template">
2542 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
2543 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
2544 @Translate("View all")
2545 </a>
2546 </li>
2547 </script>
2548
2549 <script id="SearchMorePages" type="text/x-template">
2550 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
2551 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
2552 @Translate("View all")
2553 </a>
2554 </li>
2555 </script>
2556
2557 <script id="SearchPagesTemplate" type="text/x-template">
2558 {{#each .}}
2559 {{#ifCond template "!==" "SearchMore"}}
2560 <li class="dropdown__item dropdown__item--seperator dw-mod">
2561 <div>
2562 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link u-pull--left u-color-inherit">
2563 <div class="u-margin-right u-pull--left"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
2564 <div class="u-pull--left">
2565 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
2566 </div>
2567 </a>
2568 </div>
2569 </li>
2570 {{/ifCond}}
2571 {{#ifCond template "===" "SearchMore"}}
2572 {{>SearchMorePages}}
2573 {{/ifCond}}
2574 {{else}}
2575 <li class="dropdown__item dropdown__item--seperator dw-mod">
2576 @Translate("Your search gave 0 results")
2577 </li>
2578 {{/each}}
2579 </script>
2580
2581 <script id="SearchPagesTemplateWrap" type="text/x-template">
2582 <div class="dropdown__column-header">@Translate("Pages")</div>
2583 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
2584 {{>SearchPagesTemplate}}
2585 </ul>
2586 </script>
2587
2588 <script id="SearchProductsTemplateWrap" type="text/x-template">
2589 <div class="dropdown__column-header">@Translate("Products")</div>
2590 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
2591 {{>SearchProductsTemplate}}
2592 </ul>
2593 </script>
2594 }
2595
2596
2597 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2598
2599 @using System
2600 @using System.Web
2601 @using System.Collections.Generic
2602 @using Dynamicweb.Rapido.Blocks.Extensibility
2603 @using Dynamicweb.Rapido.Blocks
2604
2605 @{
2606 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
2607
2608 Block primaryBottomSnippets = new Block()
2609 {
2610 Id = "MasterJavascriptInitializers",
2611 SortId = 100,
2612 Template = RenderPrimaryBottomSnippets()
2613 };
2614 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
2615 }
2616
2617 @helper RenderPrimaryBottomSnippets()
2618 {
2619 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
2620 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
2621
2622 if (isWireframeMode)
2623 {
2624 <script>
2625 Wireframe.Init(true);
2626 </script>
2627 }
2628
2629
2630 if (useGoogleTagManager)
2631 {
2632 <script>
2633 document.addEventListener('addToCart', function(event) {
2634 var googleImpression = event.detail.productInfo.googleImpression;
2635 dataLayer.push({
2636 'event': 'addToCart',
2637 'ecommerce': {
2638 'currencyCode': '@Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency().Code',
2639 'add': {
2640 'products': [{
2641 'name': googleImpression.name,
2642 'id': googleImpression.id,
2643 'price': googleImpression.price,
2644 'brand': googleImpression.brand,
2645 'category': googleImpression.category,
2646 'variant': googleImpression.variant,
2647 'quantity': event.detail.quantity
2648 }]
2649 }
2650 }
2651 });
2652 });
2653 </script>
2654 }
2655
2656 <!--$$Javascripts-->
2657 }
2658 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2659
2660 @using System
2661 @using System.Text.RegularExpressions
2662
2663 @using Dynamicweb;
2664 @using Dynamicweb.Core
2665 @using Dynamicweb.Rapido.Blocks
2666 @using Dynamicweb.Rapido.Blocks.Extensibility
2667 @using Dynamicweb.Rapido.Blocks
2668
2669 @using Smartpage.CookieManager
2670
2671 @{
2672 BlocksPage masterBlocksBlocksPage = BlocksPage.GetBlockPage("Master");
2673
2674 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue == "custom")
2675 {
2676 /* Master main */
2677 var MasterMain = masterBlocksBlocksPage.GetBlockById("MasterMain");
2678 if (MasterMain != null)
2679 {
2680 MasterMain.Template = RenderMainCustom();
2681 }
2682
2683 /* Master header */
2684 var MasterHeader = masterBlocksBlocksPage.GetBlockById("MasterHeader");
2685 if (MasterHeader != null)
2686 {
2687 MasterHeader.Template = RenderMasterHeaderCustom();
2688 }
2689
2690 /* Tools text (USP) */
2691 var MasterDesktopToolsText = masterBlocksBlocksPage.GetBlockById("MasterDesktopToolsText");
2692 if (MasterDesktopToolsText != null)
2693 {
2694 MasterDesktopToolsText.Template = RenderDesktopToolsTextCustom();
2695 }
2696
2697 /* Tools navigation */
2698 var MasterDesktopToolsNavigation = masterBlocksBlocksPage.GetBlockById("MasterDesktopToolsNavigation");
2699 if (MasterDesktopToolsNavigation != null)
2700 {
2701 MasterDesktopToolsNavigation.Template = RenderDesktopToolsNavigationCustom();
2702 }
2703
2704 /* Language selector */
2705 var MasterDesktopActionsMenuLanguageSelector = masterBlocksBlocksPage.GetBlockById("MasterDesktopActionsMenuLanguageSelector");
2706 if (MasterDesktopActionsMenuLanguageSelector != null)
2707 {
2708 MasterDesktopActionsMenuLanguageSelector.Template = "";
2709 }
2710
2711 /* Sign in */
2712 var masterDesktopActionsMenuSignIn = masterBlocksBlocksPage.GetBlockById("masterDesktopActionsMenuSignIn");
2713 if (masterDesktopActionsMenuSignIn != null)
2714 {
2715 masterDesktopActionsMenuSignIn.Template = "";
2716 }
2717
2718 /* Search bar */
2719 var SearchBar = masterBlocksBlocksPage.GetBlockById("SearchBar");
2720 if (SearchBar != null)
2721 {
2722 SearchBar.Template = RenderSearchBarCustom();
2723 }
2724
2725 /* Search script */
2726 var MasterSearchScriptTemplates = masterBlocksBlocksPage.GetBlockById("MasterSearchScriptTemplates");
2727 if (MasterSearchScriptTemplates != null)
2728 {
2729 MasterSearchScriptTemplates.Template = RenderSearchScriptTemplatesCustom();
2730 }
2731
2732 /* Navigation links */
2733 var MasterDesktopActionsMenu = masterBlocksBlocksPage.GetBlockById("MasterDesktopActionsMenu");
2734 if (MasterDesktopActionsMenu != null)
2735 {
2736 masterBlocksBlocksPage.Add("MasterDesktopActionsMenu", new Block
2737 {
2738 Id = "masterDesktopActionsMenuNavigationLinks",
2739 SortId = 10,
2740 Template = RenderDesktopActionsMenuNavigationLinksCustom()
2741 });
2742 }
2743
2744 /* Favorites */
2745 var MasterDesktopActionsMenuFavorites = masterBlocksBlocksPage.GetBlockById("MasterDesktopActionsMenuFavorites");
2746 if (MasterDesktopActionsMenuFavorites != null && !Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites") && Model.CurrentUser.ID > 0)
2747 {
2748 MasterDesktopActionsMenuFavorites.Template = RenderFavoritesCustom();
2749 }
2750
2751 /* Mini cart */
2752 var MasterDesktopActionsMenuMiniCart = masterBlocksBlocksPage.GetBlockById("MasterDesktopActionsMenuMiniCart");
2753 if (MasterDesktopActionsMenuMiniCart != null)
2754 {
2755 MasterDesktopActionsMenuMiniCart.Template = RenderMiniCartCustom();
2756 }
2757
2758 /* Mini cart templates */
2759 var MasterMiniCartTemplates = masterBlocksBlocksPage.GetBlockById("MasterMiniCartTemplates");
2760 if (MasterMiniCartTemplates != null)
2761 {
2762 MasterMiniCartTemplates.Template = RenderMiniCartScriptTemplatesCustom();
2763
2764 /* Mini cart SubTotal */
2765 MasterMiniCartTemplates.Add(new Block
2766 {
2767 Id = "MiniCartSubTotal",
2768 SortId = 25,
2769 Template = RenderMiniCartSubTotalCustom()
2770 });
2771
2772 /* Mini cart VAT */
2773 MasterMiniCartTemplates.Add(new Block
2774 {
2775 Id = "MiniCartVAT",
2776 SortId = 45,
2777 Template = RenderMiniCartVATCustom()
2778 });
2779 }
2780
2781 /* Mini cart fees */
2782 var MiniCartFees = masterBlocksBlocksPage.GetBlockById("MiniCartFees");
2783 if (MiniCartFees != null)
2784 {
2785 MiniCartFees.Template = RenderMiniCartFeesCustom();
2786 }
2787
2788 /* Desktop navigation */
2789 var MasterDesktopNavigation = masterBlocksBlocksPage.GetBlockById("MasterDesktopNavigation");
2790 if (MasterDesktopNavigation != null)
2791 {
2792 MasterDesktopNavigation.Template = RenderDesktopNavigationCustom();
2793 }
2794
2795 /* Desktop menu */
2796 var MasterDesktopMenu = masterBlocksBlocksPage.GetBlockById("MasterDesktopMenu");
2797 if (MasterDesktopMenu != null)
2798 {
2799 MasterDesktopMenu.Template = RenderDesktopMenuCustom();
2800 }
2801 }
2802
2803 /* LoginModal */
2804 var masterBlocksBlocksPageLoginModal = masterBlocksBlocksPage.GetBlockById("LoginModal");
2805 if (masterBlocksBlocksPageLoginModal != null)
2806 {
2807 masterBlocksBlocksPageLoginModal.Template = LoginModalCustom();
2808 }
2809
2810 if (Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItem("SpNewsletterPopup") != null)
2811 {
2812 Block masterFooterNewsletterPopup = new Block
2813 {
2814 Id = "MasterFooterNewsletterPopup",
2815 SortId = 80,
2816 Template = RenderNewsletterPopup(),
2817 Design = new Design
2818 {
2819 Size = "12",
2820 RenderType = RenderType.Column
2821 }
2822 };
2823 masterBlocksBlocksPage.GetBlockById("MasterFooterContent").Add(masterFooterNewsletterPopup);
2824 }
2825
2826 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
2827 {
2828 masterBlocksBlocksPage.GetBlockById("MasterFooterNewsletterSignUp").Template = RenderFooterNewsletterSignUpCustom();
2829 }
2830
2831 masterBlocksBlocksPage.GetBlockById("MasterJavascriptInitializers").Template = RenderPrimaryBottomSnippetsCustom();
2832
2833 masterBlocksBlocksPage.GetBlockById("TagManager").Template = RenderGoogleTagManagerCustom();
2834 masterBlocksBlocksPage.GetBlockById("FacebookPixel").Template = RenderFacebookPixelCustom();
2835
2836 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
2837 if (!onlyPreview)
2838 {
2839 Block masterColliModalWithMultiplum = new Block
2840 {
2841 Id = "ColliModalWithMultiplum",
2842 SortId = 90,
2843 Template = RenderColliModalWithMultiplum()
2844 };
2845 masterBlocksBlocksPage.GetBlockById("Master").Add(masterColliModalWithMultiplum);
2846
2847 Block masterColliModalWithoutMultiplum = new Block
2848 {
2849 Id = "ColliModalWithoutMultiplum",
2850 SortId = 100,
2851 Template = RenderColliModalWithoutMultiplum()
2852 };
2853 masterBlocksBlocksPage.GetBlockById("Master").Add(masterColliModalWithoutMultiplum);
2854 }
2855
2856
2857
2858 Block masterAlertBoxModal = new Block
2859 {
2860 Id = "AlertBoxModal",
2861 SortId = 101,
2862 Template = RenderAlertBoxModal()
2863
2864 };
2865
2866 masterBlocksBlocksPage.GetBlockById("Master").Add(masterAlertBoxModal);
2867
2868
2869
2870 Block productListDiscontinued = new Block
2871 {
2872 Id = "Discontinued",
2873 SortId = 102,
2874 Template = RenderDiscontinuedTemplates()
2875 };
2876 masterBlocksBlocksPage.GetBlockById("Master").Add(productListDiscontinued);
2877 }
2878
2879 @{
2880
2881 BlocksPage customMasterDesktopLogoBlock = BlocksPage.GetBlockPage("Master");
2882
2883 Block masterDesktopLogoCustom = new Block
2884 {
2885 Id = "MasterDesktopLogo",
2886 SortId = 9,
2887 Template = RenderDesktopLogoCustom(),
2888 Design = new Design
2889 {
2890 Size = "auto-width",
2891 HidePadding = true,
2892 RenderType = RenderType.Column
2893 }
2894 };
2895 customMasterDesktopLogoBlock.ReplaceBlock(masterDesktopLogoCustom);
2896 }
2897
2898 @{
2899 BlocksPage customMobileNavigationBlockPage = BlocksPage.GetBlockPage("Master");
2900
2901 Block mobileNavigationLanguagesActionCustom = new Block
2902 {
2903 Id = "MobileNavigationLanguagesAction",
2904 SortId = 49,
2905 Template = RenderMobileNavigationLanguagesActionCustom()
2906 };
2907 customMobileNavigationBlockPage.ReplaceBlock(mobileNavigationLanguagesActionCustom);
2908
2909 }
2910
2911 @{
2912 Block RenderAxExceptionsBlock = new Block
2913 {
2914 Id = "RenderAxExceptions",
2915 SortId = 102,
2916 Template = RenderAxExceptions()
2917 };
2918 masterBlocksBlocksPage.GetBlockById("Master").Add(RenderAxExceptionsBlock);
2919
2920
2921 if (HttpContext.Current.Request.Browser.Browser == "InternetExplorer" || HttpContext.Current.Request.Browser.Browser == "IE")
2922 {
2923 Block spBrowserNotAllowedBanner = new Block()
2924 {
2925 Id = "BrowserNotAllowedBanner",
2926 SortId = 10,
2927 Template = SpRenderBrowserNotAllowedBanner()
2928 };
2929 masterBlocksBlocksPage.Add(MasterBlockId.MasterPageContent, spBrowserNotAllowedBanner);
2930 }
2931
2932 }
2933
2934
2935 @functions {
2936 CookieBot cookieBot = new CookieBot();
2937 }
2938
2939 @helper SpRenderBrowserNotAllowedBanner()
2940 {
2941
2942 string theLogo = Pageview.AreaSettings.GetItem("Layout").GetFile("LogoImage") != null ? Pageview.AreaSettings.GetItem("Layout").GetFile("LogoImage").ToString() : "";
2943 string BannerImage = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetFile("BottomBannerImage") != null ? Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetFile("BottomBannerImage").ToString() : "";
2944
2945 <div class="sp-browser-message-wrap">
2946 <div class="sp-inner">
2947 <img class="logo" src="@theLogo" />
2948 <h1 class="headline">@Translate("Dear visitor,")</h1>
2949
2950 <p class="text">
2951 @Translate("Our website does not support your browser.") <br />
2952 @Translate("We would very much like your visit, so please find below free links for installing another browser:")
2953 </p>
2954 <ul class="link-list">
2955 <li><a class="link" href="//www.google.com/chrome/">@Translate("Google Chrome")</a></li>
2956 <li><a class="link" href="//www.mozilla.org/">@Translate("Firefox")</a></li>
2957 </ul>
2958
2959 <p class="text">@Translate("We are looking forward to welcome you at kruuse.com!")</p>
2960 <br />
2961 <br />
2962 <img class="bottom-banner-image" src="@BannerImage" />
2963 </div>
2964 </div>
2965 }
2966
2967 @helper RenderMainCustom()
2968 {
2969 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
2970
2971 <main class="site dw-mod topLayoutCustom">
2972 @RenderBlockList(subBlocks)
2973 </main>
2974 }
2975
2976 @helper RenderMasterHeaderCustom()
2977 {
2978 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
2979 var isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
2980 var stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
2981
2982 var isNavigationStickyMinifiedMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetBoolean("SpStickyTopMinified");
2983 var stickyTopMinified = isNavigationStickyMinifiedMenu ? "top-container--sticky-minified" : "";
2984
2985 <header class="top-container @stickyTop @stickyTopMinified dw-mod" id="Top">
2986 @RenderBlockList(subBlocks)
2987 </header>
2988 }
2989
2990 @helper RenderDesktopToolsTextCustom()
2991 {
2992 var toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
2993
2994 <ul class="usp dw-mod">
2995 @foreach (var text in toolsText.Split(new Char[] { ';' }))
2996 {
2997 <li><i class="fas fa-check"></i> @text</li>
2998 }
2999 </ul>
3000 }
3001
3002 @helper RenderDesktopToolsNavigationCustom()
3003 {
3004 <ul id="topToolsNavigation" class="menu menu-tools dw-mod dwnavigation">
3005 @RenderNavigation(new
3006 {
3007 template = "SpTopMenu.xslt"
3008 })
3009 @RenderLanguageSelectorCustom()
3010 @RenderSignInCustom()
3011 </ul>
3012 }
3013
3014 @helper RenderDiscontinuedTemplates()
3015 {
3016 <script id="DiscontinuedTemplate" type="text/x-template">
3017 <div class="discontinue-container u-full-max-width u-no-margin padding-10px bg-light-grey">
3018 <h5 class="u-no-margin">@Translate("Produktet er udgået")</h5>
3019 {{#if replacementItemName}}
3020 <div class="grid__cell">
3021 <label class="u-margin-top">@Translate("Replacement product:")</label>
3022 </div>
3023 <div class="u-full-width">
3024 <div class="grid">
3025 <div class="grid__col-auto grid__col--bleed-x">
3026 <a href="{{replacementItemLink}}">
3027 <div id="ProductsContainer" class="grid product-list dw-mod">
3028 <div class="product-list__details-item__left sp-product-list-detail-replacement u-color-light--bg u-full-width u-position-relative u-border u-margin-top dw-mod">
3029
3030 <div class="u-hidden-xxs">
3031 {{#ifCond view "===" "grid"}}
3032 <img class="grid__cell-img grid__cell-img--centered u-padding b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{replacementItemImage}}" alt="{{replacementItemName}}" />
3033 {{/ifCond}}
3034 {{#ifCond view "!==" "grid"}}
3035 <img class="grid__cell-img grid__cell-img--centered u-padding b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=112&height=82&crop=5&Compression=75&FillCanvas=true&DoNotUpscale=true&image={{replacementItemImage}}" alt="{{replacementItemName}}" />
3036 {{/ifCond}}
3037 </div>
3038
3039 <div class="u-margin-left u-margin-right">
3040 <h6 class="u-condensed-text">{{replacementItemName}}</h6>
3041
3042 <div class="item-number u-no-margin">
3043 #{{replacementItemNumber}}
3044 </div>
3045
3046 <div class="u-margin-bottom">
3047 <span class="stock-icon {{replacementItemStockState}} u-no-margin dw-mod" title="{{replacementItemStockText}}"></span> {{replacementItemStockText}}{{deliveryText}}
3048 </div>
3049 </div>
3050 <div class="custom-button-placement-right-bottom dw-mod">
3051 <div class="btn btn--primary btn--condensed dw-mod u-margin vertical-align-sub">
3052 @Translate("View")
3053 </div>
3054 </div>
3055 </div>
3056 </div>
3057 </a>
3058 </div>
3059 </div>
3060 </div>
3061 {{/if}}
3062 </div>
3063 </script>
3064 }
3065
3066
3067 @helper RenderMobileNavigationLanguagesActionCustom()
3068 {
3069 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
3070
3071 string selectedLanguage = "";
3072 foreach (var lang in Model.Languages)
3073 {
3074 if (lang.IsCurrent)
3075 {
3076 selectedLanguage = lang.Name;
3077 }
3078 }
3079
3080 <li class="menu-mobile__item dw-mod">
3081 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
3082 <div class="menu-mobile__link__wrap">
3083 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue menu-mobile__link-icon"></i> @selectedLanguage</label>
3084 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
3085 </div>
3086 <ul class="menu-mobile menu-mobile__submenu expand-menu">
3087 @if (isSlidesDesign)
3088 {
3089 <li class="menu-mobile__item dw-mod">
3090 <div class="menu-mobile__link__wrap">
3091 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
3092 <label for="MobileMenuCheck_Language" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
3093 </div>
3094 </li>
3095 }
3096 @foreach (var lang in Model.Languages)
3097 {
3098 <li class="menu-mobile__item dw-mod">
3099 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID&SetLang=True">@lang.Name</a>
3100 </li>
3101 }
3102 </ul>
3103 </li>
3104 }
3105
3106
3107
3108
3109
3110 @helper RenderLanguageSelectorCustom()
3111 {
3112 if (Model.Languages.Count > 1)
3113 {
3114 var languageViewType = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : "";
3115 var currentLanguage = Model.Languages.First(i => i.IsCurrent).Name;
3116 var internationalID = Converter.ToInt32(Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetList("SpInternationalWebsite").SelectedValue);
3117
3118 <li class="menu-tools__item dw-mod is-dropdown is-dropdown--no-icon">
3119 <div class="menu-tools__link menu-tools__link-language menu__link--icon dw-mod">
3120 @currentLanguage
3121 <i class="fas fa-angle-down"></i>
3122 </div>
3123 <div class="menu menu--dropdown language-dropdown dw-mod">
3124 @foreach (var lang in Model.Languages)
3125 {
3126 Regex rx = new Regex(@"[A-Z]{2}");
3127 MatchCollection countryCode = rx.Matches(lang.Culture); // lang.Culture returns in format "da-DK"
3128
3129 var langInfo = "";
3130
3131
3132
3133 if (lang.ID == internationalID)
3134 {
3135 langInfo = "<span class=\"flag-icon custom-icon-international u-ta-center u-margin-right\"></span>" + lang.Name;
3136 }
3137 else
3138 {
3139 langInfo = "<span class=\"flag-icon flag-icon-" + Converter.ToString(countryCode[0]).ToLower() + " u-margin-right\"></span>" + lang.Name;
3140 }
3141
3142 if (languageViewType == "flag")
3143 {
3144 langInfo = "<span class=\"flag-icon flag-icon-" + Converter.ToString(countryCode[0]).ToLower() + "\"></span>";
3145 }
3146
3147 if (languageViewType == "name")
3148 {
3149 langInfo = lang.Name;
3150 }
3151
3152 <a href="/Default.aspx?ID=@lang.Page.ID&SetLang=true" class="menu-dropdown__item menu-dropdown__item--link dw-mod">@langInfo</a>
3153 }
3154 </div>
3155 </li>
3156 }
3157 }
3158
3159 @helper RenderSignInCustom()
3160 {
3161 var navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
3162 var userInitials = "";
3163 var pageId = Model.TopPage.ID;
3164
3165 var createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
3166 var myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
3167 var myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
3168 var myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
3169 var myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
3170 var mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
3171 var signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3172
3173 var myInvoicesPageId = GetPageIdByNavigationTag("InvoicesPage");
3174 var myBackordersPageId = GetPageIdByNavigationTag("BackordersPage");
3175 var myMostBoughtItemsPageId = GetPageIdByNavigationTag("MostBoughtItemsPage");
3176 var myNewsletterSettingsPageId = GetPageIdByNavigationTag("NewsletterSettingsPage");
3177
3178 var hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
3179 var hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
3180 var hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
3181 var hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
3182 var hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
3183
3184 var hideMyInvoicesLink = (myInvoicesPageId == 0);
3185 var hideMyBackordersLink = (myBackordersPageId == 0);
3186 var hideMyMostBoughtItemsLink = (myMostBoughtItemsPageId == 0);
3187 var hideMyNewsletterSettingsLink = (myNewsletterSettingsPageId == 0);
3188
3189 var linkStart = "/Default.aspx?ID=";
3190 if (Model.CurrentUser.ID <= 0)
3191 {
3192 linkStart = linkStart + signInProfilePageId + "&RedirectPageId=";
3193 }
3194
3195 var forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
3196 var myProfilePageLink = linkStart + myProfilePageId;
3197 var myOrdersPageLink = linkStart + myOrdersPageId;
3198 var myFavoritesPageLink = linkStart + myFavoritesPageId;
3199 var mySavedCardsPageLink = linkStart + mySavedCardsPageId;
3200
3201 var myInvoicesPageLink = linkStart + myInvoicesPageId;
3202 var myBackordersPageLink = linkStart + myBackordersPageId;
3203 var myMostBoughtItemsPageLink = linkStart + myMostBoughtItemsPageId;
3204 var myNewsletterSettingsPageLink = linkStart + myNewsletterSettingsPageId;
3205
3206 if (Model.CurrentUser.ID != 0)
3207 {
3208 if (!String.IsNullOrEmpty(Model.CurrentUser.Name))
3209 {
3210 string[] names = Model.CurrentUser.Name.Split(' ');
3211 userInitials += Model.CurrentUser.Name.Substring(0, 1);
3212
3213 if (names.Length > 1)
3214 {
3215 userInitials += names[names.Length - 1].Substring(0, 1);
3216 }
3217 }
3218 else
3219 {
3220 userInitials += Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName != "" ? Model.CurrentUser.FirstName.Substring(0, 1) : "";
3221 userInitials += Model.CurrentUser.LastName != null && Model.CurrentUser.LastName != "" ? Model.CurrentUser.LastName.Substring(0, 1) : "";
3222 userInitials += userInitials.Length == 1 && Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName.Length > 1 ? Model.CurrentUser.FirstName.Substring(1, 2) : "";
3223 userInitials += userInitials == "" && Model.CurrentUser.Email != null && Model.CurrentUser.Email.Length > 1 ? Model.CurrentUser.Email.Substring(0, 2) : "";
3224 userInitials += userInitials == "" ? Model.CurrentUser.UserName.Substring(0, 2) : "";
3225 }
3226 }
3227
3228 if (!navigationItemsHideSignIn)
3229 {
3230 <li class="menu-tools__item dw-mod is-dropdown is-dropdown--no-icon">
3231 <div class="menu-tools__link menu-tools__link-sign-in menu__link--icon dw-mod">
3232 @if (Model.CurrentUser.ID <= 0)
3233 {
3234 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fac-white"></i>
3235 @Translate("Login")
3236 }
3237 else
3238 {
3239 <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit">
3240 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fac-white"></i>
3241 @Translate("My account")
3242 </a>
3243 }
3244 </div>
3245 <div class="menu menu--dropdown sign-in-dropdown dw-mod">
3246 <ul class="list list--clean dw-mod">
3247 @if (Model.CurrentUser.ID <= 0)
3248 {
3249 <li>
3250 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>
3251 </li>
3252 if (!hideCreateAccountLink)
3253 {
3254 <li>
3255 <a href="/default.aspx?ID=@createAccountPageId" class="list__link dw-mod">@Translate("Create account")</a>
3256 </li>
3257 }
3258 <li>
3259 <a href="@forgotPasswordPageLink" class="list__link dw-mod">@Translate("Forgot your password?")</a>
3260 </li>
3261 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
3262 {
3263 <li class="list__seperator dw-mod"></li>
3264 }
3265 }
3266 @if (!hideMyProfileLink)
3267 {
3268 <li>
3269 <a href="@myProfilePageLink" class="list__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue u-margin-right"></i>@Translate("My profile")</a>
3270 </li>
3271 }
3272 @if (!hideMyFavoritesLink)
3273 {
3274 <li>
3275 <a href="@myFavoritesPageLink" class="list__link dw-mod"><i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue u-margin-right"></i>@Translate("My favorites")</a>
3276 </li>
3277 }
3278 @if (!hideMyOrdersLink)
3279 {
3280 <li>
3281 <a href="@myOrdersPageLink" class="list__link dw-mod"><i class="fas fa-list u-margin-right"></i>@Translate("My orders")</a>
3282 </li>
3283 }
3284 @if (!hideMyInvoicesLink)
3285 {
3286 <li>
3287 <a href="@myInvoicesPageLink" class="list__link dw-mod"><i class="fac fa-invoices u-margin-right"></i>@Translate("My invoices")</a>
3288 </li>
3289 }
3290 @if (!hideMyBackordersLink)
3291 {
3292 <li>
3293 <a href="@myBackordersPageLink" class="list__link dw-mod"><i class="fac fa-backorder u-margin-right"></i>@Translate("My backorders")</a>
3294 </li>
3295 }
3296 @if (!hideMyMostBoughtItemsLink)
3297 {
3298 <li>
3299 <a href="@myMostBoughtItemsPageLink" class="list__link dw-mod"><i class="fac fa-most-bought-item u-margin-right"></i>@Translate("My most bought items")</a>
3300 </li>
3301 }
3302 @if (!hideMyNewsletterSettingsLink)
3303 {
3304 <li>
3305 <a href="@myNewsletterSettingsPageLink" class="list__link dw-mod"><i class="fac fa-newsletter u-margin-right"></i>@Translate("My newsletter settings")</a>
3306 </li>
3307 }
3308 @if (!hideMySavedCardsLink)
3309 {
3310 <li>
3311 <a href="@mySavedCardsPageLink" class="list__link dw-mod"><i class="fas fa-credit-card u-margin-right"></i>@Translate("My saved cards")</a>
3312 </li>
3313 }
3314 @if (Model.CurrentUser.ID > 0)
3315 {
3316 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
3317 {
3318 <li class="list__seperator dw-mod"></li>
3319 }
3320
3321 var logoutLink = Dynamicweb.Context.Current.Request.RawUrl;
3322 logoutLink = logoutLink.Contains("CompletedOrderSecret") ? "/Default.aspx?ID=" + Model.Area.FirstActivePage.ID : logoutLink;
3323
3324 <li>
3325 <a href="@("/Admin/Public/ExtranetLogoff.aspx?Redirect=" + HttpUtility.UrlEncode(logoutLink))" class="list__link dw-mod">@Translate("Sign out")</a>
3326 </li>
3327 }
3328 </ul>
3329 </div>
3330 </li>
3331 }
3332 }
3333
3334 @helper RenderSearchBarCustom(string alignment = "left")
3335 {
3336 string searchFeedId = "";
3337 string searchSecondFeedId = "";
3338 int groupsFeedId;
3339 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
3340 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
3341 string resultPageLink;
3342 string searchPlaceholder;
3343 string searchType = "product-search";
3344 string searchTemplate;
3345 string searchContentTemplate = "";
3346 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
3347 bool showGroups = true;
3348
3349 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
3350 {
3351 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3352 resultPageLink = contentSearchPageLink;
3353 searchPlaceholder = Translate("Search page");
3354 groupsFeedId = 0;
3355 searchType = "content-search";
3356 searchTemplate = "SearchPagesTemplate";
3357 showGroups = false;
3358 }
3359 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
3360 {
3361 searchFeedId = Converter.ToString(GetPageIdByNavigationTag("ProductsSearchPage"));
3362 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3363 resultPageLink = Converter.ToString(productsPageId);
3364 searchPlaceholder = Translate("Search products or pages");
3365 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3366 searchType = "combined-search";
3367 searchTemplate = "SearchProductsTemplateWrap";
3368 searchContentTemplate = "SearchPagesTemplateWrap";
3369 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3370 }
3371 else
3372 {
3373 resultPageLink = Converter.ToString(productsPageId);
3374 searchFeedId = Converter.ToString(GetPageIdByNavigationTag("ProductsSearchPage"));
3375 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3376 searchPlaceholder = Translate("Search products");
3377 searchTemplate = "SearchProductsTemplateWrapGrid";
3378 searchType = "product-search";
3379 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3380 }
3381
3382 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" data-page-size="7" data-show-variants="false" id="ProductSearchBar" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-groups-page-id="@groupsFeedId" data-search-type="@searchType">
3383 @if (showGroups)
3384 {
3385 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
3386 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
3387 }
3388 <div class="typeahead-search-field">
3389 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue" onkeydown="enterButton('searchbutton');">
3390 @if (string.IsNullOrEmpty(searchSecondFeedId))
3391 {
3392 <div class="dropdown dropdown--absolute-position dropdown--combined grid js-handlebars-root js-typeahead-search-content sp-search-dropdown-content u-hidden" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
3393 }
3394 else
3395 {
3396 <div class="dropdown dropdown--absolute-position dropdown--combined grid @(alignment == "right" ? "dropdown--right-aligned" : "")">
3397 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-6 grid__col--bleed-y u-hidden" id="ProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
3398 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-6 grid__col--bleed-y u-hidden" id="ContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div>
3399 </div>
3400 }
3401 </div>
3402 <button id="searchbutton" type="button" class="btn btn--condensed btn--secondary u-no-margin dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x fac-white"></i></button>
3403 </div>
3404 }
3405
3406 @helper RenderSearchScriptTemplatesCustom()
3407 {
3408 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
3409 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
3410 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")) && cookieBot.Marketing;
3411 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
3412 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")) && cookieBot.Statistics;
3413 bool isDigitalWarehouse = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("EnableDigitalWarehouse");
3414 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
3415 var cartIcon = "fas fa-shopping-cart";
3416
3417 <script id="SearchGroupsTemplate" type="text/x-template">
3418 {{#.}}
3419 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
3420 {{/.}}
3421 </script>
3422
3423 <script id="SearchFavoriteProductsTemplate" type="text/x-template">
3424 {{#if .}}
3425 {{#.}}
3426 {{#each ProductsContainer}}
3427 {{>SearchProductsTemplate}}
3428 {{/each}}
3429 {{/.}}
3430 {{/if}}
3431 </script>
3432
3433 <script id="SearchProductsTemplate" type="text/x-template">
3434 {{#Product}}
3435 {{#ifCond template "!==" "SearchMore"}}
3436 <li class="dropdown__item dropdown__item--seperator dw-mod">
3437 @if (useFacebookPixel)
3438 {
3439 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
3440 }
3441 @if (useGoogleTagManager)
3442 {
3443
3444 <text>
3445 {{#if googleImpression.id}}
3446 {{#if googleImpression.name}}
3447 {{{googleEnchantImpression 'Search results' currency googleImpression}}}
3448 {{/if}}
3449 {{/if}}
3450 </text>
3451 }
3452 <div>
3453 <a href="{{link}}" class="js-typeahead-link u-color-inherit u-pull--left" onclick="{{googleImpressionClick}}" title="{{name}}">
3454 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" onerror="this.onerror=null;this.src='/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image=/Files/Images/missing_image.jpg';" alt="{{name}}"></div>
3455 <div class="u-pull--left">
3456 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}</div>
3457 @if (!onlyPreview)
3458 {
3459 if (pointShopOnly)
3460 {
3461 <text>
3462 {{#if havePointPrice}}
3463 <div>
3464 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
3465 </div>
3466 {{else}}
3467 <small class="help-text u-no-margin">@Translate("Not available")</small>
3468 {{/if}}
3469 {{#unless canBePurchasedWithPoints}}
3470 {{#if havePointPrice}}
3471 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
3472 {{/if}}
3473 {{/unless}}
3474 </text>
3475 }
3476 else
3477 {
3478 <text>
3479 {{#unless hasVariants}}
3480 <div>{{price}}</div>
3481 {{/unless}}
3482 {{#if isVariantMaster}}
3483 <div>@Translate("Smartpage:Variant.FromPrice.Text", "Fra:") {{variantFromPrice}}</div>
3484 {{/if}}
3485 </text>
3486 }
3487 }
3488 </div>
3489 </a>
3490 <div class="u-margin-left u-pull--right">
3491 @if (!onlyPreview)
3492 {
3493 <text>
3494 {{#unless hasVariants}}
3495 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside"
3496 onclick="Cart.AddToCart(event, {
3497 id: '{{productId}}',
3498 unitId: '{{unitId}}',
3499 quantity: 1,
3500 productInfo: {{productInfo}},
3501 multiplum: {{multiplum}},
3502 multiplumUnitId: '{{ProductDefaultUnitId}}',
3503 standardOrderQuantity: {{standardOrderQuantity}}
3504 }); {{facebookPixelAction}}">
3505 <i class="@cartIcon js-ignore-click-outside"></i>
3506 </button>
3507 {{else}}
3508 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
3509 {{/unless}}
3510 </text>
3511 }
3512 else if (isDigitalWarehouse)
3513 {
3514 <a class="btn btn--primary u-no-margin btn--condensed dw-mod" href="{{listLink}}"><i class="fas {{listIcon}}"></i></a>
3515 }
3516 else
3517 {
3518 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
3519 }
3520 </div>
3521 </div>
3522 </li>
3523 {{/ifCond}}
3524 {{#ifCond template "===" "SearchMore"}}
3525 {{>SearchMoreProducts}}
3526 {{/ifCond}}
3527 {{/Product}}
3528 </script>
3529
3530 <script id="SearchMoreProducts" type="text/x-template">
3531 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
3532 <a href="{{#if link}}{{link}}{{else}}/Default.aspx?ID=@productsPageId&GroupID={{groupId}}&Search={{searchParameter}}{{/if}}" class="btn btn--tertiary btn--full u-no-margin dw-mod js-typeahead-link">
3533 @string.Format(Translate("View all products ({0})"), "{{total}}")
3534 </a>
3535 </li>
3536 </script>
3537
3538 <script id="SearchMorePages" type="text/x-template">
3539 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
3540 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--tertiary btn--full u-no-margin dw-mod js-typeahead-link">
3541 @Translate("View all pages")
3542 </a>
3543 </li>
3544 </script>
3545
3546 <script id="SearchMoreFacets" type="text/x-template">
3547 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
3548 <a href="{{link}}" class="btn btn--tertiary btn--full u-no-margin dw-mod js-typeahead-link">
3549 @Translate("View all concepts")
3550 </a>
3551 </li>
3552 </script>
3553
3554 <script id="SearchPagesTemplate" type="text/x-template">
3555 {{#each .}}
3556 {{#ifCond template "!==" "SearchMore"}}
3557 <li class="dropdown__item dropdown__item--seperator dw-mod">
3558 <div>
3559 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link u-pull--left u-color-inherit">
3560 <div class="u-margin-right u-pull--left"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
3561 <div class="u-pull--left">
3562 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
3563 </div>
3564 </a>
3565 </div>
3566 </li>
3567 {{/ifCond}}
3568 {{#ifCond template "===" "SearchMore"}}
3569 {{>SearchMorePages}}
3570 {{/ifCond}}
3571 {{else}}
3572 <li class="dropdown__item dropdown__item--seperator dw-mod">
3573 @Translate("Your search gave 0 results")
3574 </li>
3575 {{/each}}
3576 </script>
3577
3578 <script id="SearchPagesTemplateWrap" type="text/x-template">
3579 <div class="dropdown__column-header">@Translate("Pages")</div>
3580 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
3581 {{>SearchPagesTemplate}}
3582 </ul>
3583 </script>
3584
3585 <script id="SearchProductsTemplateWrap" type="text/x-template">
3586 <div class="dropdown__column-header">@Translate("Products")</div>
3587 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
3588 {{#if .}}
3589 {{#.}}
3590 {{#each ProductsContainer}}
3591 {{>SearchProductsTemplate}}
3592 {{/each}}
3593 {{/.}}
3594 {{else}}
3595 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
3596 @Translate("Your search gave 0 results")
3597 </li>
3598 {{/if}}
3599 </ul>
3600 {{#.}}
3601 {{#each FacetGroups}}
3602 <div class="dropdown__column-header">{{name}}</div>
3603 <ul class="dropdown__list u-full-width u-margin-bottom u-block dw-mod">
3604 {{#each FacetOptions}}
3605 <li class="dropdown__item dropdown__item-block dw-mod">
3606 <a href="{{link}}" class="u-bold js-typeahead-name" title="{{name}}">{{label}}</a>
3607 </li>
3608 {{/each}}
3609 </ul>
3610 {{/each}}
3611 {{/.}}
3612 </script>
3613
3614 <script id="SearchProductsTemplateWrapGrid" type="text/x-template">
3615 <div class="grid__col-sm-6 grid__col--bleed-y">
3616 <div class="dropdown__column-header">@Translate("Products")</div>
3617 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
3618 {{#if .}}
3619 {{#.}}
3620 {{#each ProductsContainer}}
3621 {{>SearchProductsTemplate}}
3622 {{/each}}
3623 {{/.}}
3624 {{else}}
3625 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
3626 @Translate("Your search gave 0 results")
3627 </li>
3628 {{/if}}
3629 </ul>
3630 </div>
3631 <div class="grid__col-sm-6 grid__col--bleed-y">
3632 {{#.}}
3633 {{#each FacetGroups}}
3634 <div class="dropdown__column-header">{{name}}</div>
3635 <ul class="dropdown__list u-full-width u-margin-bottom u-block dw-mod">
3636 {{#if FacetOptions}}
3637 {{#.}}
3638 {{#each FacetOptions}}
3639 <li class="dropdown__item dropdown__item-block dw-mod">
3640 <a href="{{link}}" class="u-bold js-typeahead-name" title="{{label}}">{{label}}</a>
3641 </li>
3642 {{/each}}
3643 {{#if link}}
3644 {{>SearchMoreFacets}}
3645 {{/if}}
3646 {{/.}}
3647 {{else}}
3648 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
3649 @Translate("Your search gave 0 results")
3650 </li>
3651 {{/if}}
3652 </ul>
3653 {{/each}}
3654 {{/.}}
3655 </div>
3656 </script>
3657 }
3658
3659 @helper RenderDesktopActionsMenuNavigationLinksCustom()
3660 {
3661 var itemCustom = Model.Area.Item.GetItem("Custom");
3662 if (itemCustom != null)
3663 {
3664 var itemCustomSettings = itemCustom.GetItem("CustomSettings");
3665 if (itemCustomSettings != null)
3666 {
3667 var itemNavigationLinks = itemCustomSettings.GetItems("NavigationLinks");
3668 if (itemNavigationLinks != null)
3669 {
3670 foreach (var link in itemNavigationLinks)
3671 {
3672 <li class="menu__item menu__item--horizontal dw-mod in-hidden">
3673 <a href="@link.GetString("NavigationLinkLink")" class="menu__link menu-tools__link-navigation-link menu__link--icon dw-mod">
3674 <i class="@link.GetString("NavigationLinkIcon") fac-1_5x"></i>
3675 @link.GetString("NavigationLinkName")
3676 </a>
3677 </li>
3678 }
3679 }
3680 }
3681 }
3682 }
3683
3684 @helper RenderFavoritesCustom()
3685 {
3686 var navigationItemsHideFavorites = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
3687 var signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3688 var myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
3689
3690 var linkStart = "/Default.aspx?ID=";
3691 if (Model.CurrentUser.ID <= 0)
3692 {
3693 linkStart = linkStart + signInProfilePageId + "&RedirectPageId=";
3694 }
3695
3696 var myFavoritesPageLink = linkStart + myFavoritesPageId;
3697
3698 <li class="menu__item menu__item--horizontal dw-mod u-hidden-xxs">
3699 <a href="@myFavoritesPageLink" class="menu__link menu-tools__link-favorite menu__link--icon dw-mod">
3700 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fac-red fac-1_5x"></i>
3701 @Translate("Favorites")
3702 </a>
3703 </li>
3704 }
3705
3706 @helper RenderMiniCartCustom()
3707 {
3708 var navigationItemsHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
3709 var miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3710 var cartPageId = GetPageIdByNavigationTag("CartPage");
3711 var onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
3712 var cartClass = new string[] { "CartPage", "CartPageEmpty" }.Contains(Pageview.Page.NavigationTag) ? "u-hidden" : "";
3713
3714 if (!onlyPreview && !navigationItemsHideCart)
3715 {
3716 <li class="menu__item menu__item--horizontal @cartClass dw-mod" id="miniCartWrapper" onmouseenter="Cart.UpdateMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
3717 <div class="mini-cart dw-mod">
3718 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu-tools__link-cart menu__link--icon dw-mod js-mini-cart-button">
3719 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fac-green fac-1_5x"></i>
3720 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
3721 <div class="js-mini-cart-counter-content">
3722 @string.Format(Translate("Cart ({0})"), Model.Cart.TotalProductsCount.ToString())
3723 </div>
3724 </div>
3725 </a>
3726 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
3727 {
3728 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="miniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
3729 }
3730 </div>
3731 </li>
3732 }
3733 }
3734
3735 @helper RenderMiniCartScriptTemplatesCustom()
3736 {
3737 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
3738
3739 int cartPageId = GetPageIdByNavigationTag("CartPage");
3740 bool showPriceInMiniCartCounter = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
3741 showPriceInMiniCartCounter = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue == "right" ? showPriceInMiniCartCounter : false;
3742 showPriceInMiniCartCounter = Pageview.Device.ToString() == "Mobile" ? false : showPriceInMiniCartCounter;
3743 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")) && cookieBot.Statistics;
3744 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
3745 string addingToCartNotification = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
3746 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3747
3748
3749 <script id="MiniCartCounterContent" type="text/x-template">
3750 {{#.}}
3751 <div class="js-mini-cart-counter-content dw-mod">
3752 @string.Format(Translate("Cart ({0})"), "{{numberofproducts}}")
3753 </div>
3754 {{/.}}
3755 </script>
3756
3757 <script id="MiniMobileCartCounterContent" type="text/x-template">
3758 {{#.}}
3759 <div class="js-mini-cart-counter-content sp-mobile-cart-counter u-brand-color-five--bg">
3760 {{numberofproducts}}
3761 </div>
3762 {{/.}}
3763 </script>
3764
3765 <script id="MiniCartContent" type="text/x-template">
3766 {{#.}}
3767 @if (useGoogleTagManager)
3768 {
3769 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
3770 }
3771 <div class="mini-cart-dropdown__inner {{isempty}} dw-mod">
3772 <h4 class="u-ta-center u-no-margin u-margin-bottom u-margin-top">@Translate("Shopping cart")</h4>
3773 <div class="mini-cart-dropdown__body dw-mod">
3774 <table class="table mini-cart-table dw-mod">
3775 @RenderBlockList(subBlocks)
3776 </table>
3777 </div>
3778
3779 <table class="table mini-cart-table dw-mod">
3780 <tr class="mini-cart-orderlines__footer dw-mod">
3781 <td colspan="2"></td>
3782 <td colspan="2" class="u-ta-right"><a href="/Default.aspx?ID=@cartPageId" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a></td>
3783 </tr>
3784 </table>
3785 </div>
3786 {{/.}}
3787 </script>
3788
3789 <script id="MiniCartOrderline" type="text/x-template">
3790 <tr class="{{isempty}}">
3791 <td><a href="{{link}}" class="{{hideimage}}"><img src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}"></a></td>
3792 <td>
3793 <a href="{{link}}" class="mini-cart-orderlines__name" title="{{name}}">{{name}}</a>
3794 {{#if variantname}}
3795 <a href="{{link}}" class="mini-cart-orderlines__name mini-cart-orderlines__name--small">{{variantname}}</a>
3796 {{/if}}
3797 {{#if unitname}}
3798 <div class="mini-cart-orderlines__name mini-cart-orderlines__name--small">{{unitname}}</div>
3799 {{/if}}
3800 </td>
3801 <td class="u-ta-right">{{quantity}}</td>
3802 <td class="u-ta-right">
3803 {{#if pointsTotal}}
3804 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
3805 {{else}}
3806 {{totalprice}}
3807 {{/if}}
3808 </td>
3809 </tr>
3810 {{#Discounts}}
3811 {{>MiniCartOrderlineDiscount}}
3812 {{/Discounts}}
3813 </script>
3814
3815 <script id="MiniCartOrderlineDiscount" type="text/x-template">
3816 <tr class="table__row--no-border {{isempty}}">
3817 <td> </td>
3818 <td><div class="mini-cart-orderlines__name dw-mod">{{name}}</div></td>
3819 <td class="u-ta-right"> </td>
3820 <td class="u-ta-right">{{totalprice}}</td>
3821 </tr>
3822 </script>
3823
3824 if (!onlyPreview && addingToCartNotification == "modal")
3825 {
3826 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
3827
3828 <script id="LastAddedProductTemplate" type="text/x-template">
3829 <!-- Trigger for the login modal -->
3830 <input type="checkbox" id="LastAddedProductModalTrigger" class="modal-trigger" />
3831
3832 <!-- Login modal -->
3833 <div class="modal-container">
3834 <label for="LastAddedProductModalTrigger" class="modal-overlay"></label>
3835 <div class="modal modal--md">
3836 <div class="modal__header">
3837 <h2>@Translate("Product is added to the cart")</h2>
3838 </div>
3839 <div class="modal__body">
3840 <div class="grid">
3841 <div class="grid__col-2">
3842 <a href="{{productInfo.link}}">
3843 <img src="{{productInfo.image}}" alt="{{productInfo.name}}" class="dw-mod" />
3844 </a>
3845 </div>
3846 <div class="u-padding grid--align-self-center">
3847 <span>{{quantity}}</span> x
3848 </div>
3849 <div class="grid__col-auto grid--align-self-center">
3850 <div>{{productInfo.name}}</div>
3851 {{#if productInfo.variantName}}
3852 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
3853 {{/if}}
3854 {{#if productInfo.unitName}}
3855 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
3856 {{/if}}
3857 </div>
3858 </div>
3859 <div class="modal__footer u-margin-top--lg">
3860 <label class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" for="LastAddedProductModalTrigger">@Translate("Continue shopping")</label>
3861 <a href="/cart" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a>
3862 </div>
3863 </div>
3864 <label class="modal__close-btn" for="LastAddedProductModalTrigger"></label>
3865 </div>
3866 </div>
3867 </script>
3868 <script>
3869 document.addEventListener('addToCart', function (event) {
3870 Cart.ShowLastAddedProductModal(event.detail);
3871 });
3872 </script>
3873 }
3874 else if (!onlyPreview && addingToCartNotification == "toggle")
3875 {
3876 <script>
3877 document.addEventListener('cartUpdated', function () {
3878 var wrapperId = "miniCartWrapper",
3879 containerId = "miniCart",
3880 counterId = "cartCounter",
3881 miniCartFeedPageId = "@miniCartFeedPageId";
3882
3883 Cart.UpdateMiniCart(wrapperId, containerId, counterId, '/Default.aspx?ID=' + miniCartFeedPageId + '&feedType=MiniCart')
3884
3885 document.addEventListener('contentLoaded', function () {
3886 Cart.HideMiniCart(containerId, 2800);
3887 });
3888 });
3889 </script>
3890 }
3891 }
3892
3893 @helper RenderMiniCartSubTotalCustom()
3894 {
3895 <tr>
3896 <td colspan="2">@Translate("Subtotal")</td>
3897 <td colspan="2" class="u-ta-right" width="130">{{subtotalprice}}</td>
3898 </tr>
3899 }
3900
3901 @helper RenderMiniCartFeesCustom()
3902 {
3903 <tr class="{{hidePaymentfee}}">
3904 <td><i class="fas fa-credit-card"></i></td>
3905 <td>{{paymentmethod}}</td>
3906 <td colspan="2" class="u-ta-right" width="130">{{paymentfee}}</td>
3907 </tr>
3908 <tr class="{{hideShippingfee}}">
3909 <td><i class="fas fa-truck"></i></td>
3910 <td>{{shippingmethod}}</td>
3911 <td colspan="2" class="u-ta-right" width="130">{{shippingfee}}</td>
3912 </tr>
3913 }
3914
3915 @helper RenderMiniCartVATCustom()
3916 {
3917 <tr>
3918 <td colspan="2">@Translate("VAT")</td>
3919 <td colspan="2" class="u-ta-right" width="130">{{totalvat}}</td>
3920 </tr>
3921 }
3922
3923 @helper RenderDesktopNavigationCustom()
3924 {
3925 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
3926
3927 <nav class="main-navigation dw-mod u-position-relative" onmouseleave="closeMegaMenu()">
3928 <div class="center-container top-container__center-container grid grid--align-center dw-mod u-reset-position">
3929 @RenderBlockList(subBlocks)
3930 </div>
3931 <div class="menu mega-menu dw-mod js-custom-mega-nav-wrap custom-mega-nav-wrap">
3932
3933 </div>
3934 </nav>
3935 }
3936
3937 @helper RenderDesktopMenuCustom()
3938 {
3939 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
3940 string menuAlignment = topLayout == "two-lines-centered" || topLayout == "minimal-right" ? "u-pull--right" : "";
3941
3942 bool megaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue.ToLower() == "true" ? true : false;
3943 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
3944 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
3945 int startLevel = renderPagesInToolBar ? 1 : 0;
3946
3947 <div class="grid__cell u-reset-position">
3948 <div class="@menuAlignment">
3949 @if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue.ToLower() == "custom")
3950 {
3951 @RenderNavigation(new
3952 {
3953 id = "topnavigation",
3954 cssclass = "menu dw-mod dwnavigation u-full-max-width",
3955 startLevel = @startLevel,
3956 ecomStartLevel = @startLevel + 1,
3957 endlevel = 5,
3958 promotionImage = megamenuPromotionImage,
3959 promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"),
3960 breakepoint = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SpNavigationMegamenuBreakepoint"),
3961 expandmode = "all",
3962 template = "SpBaseMegaMenuCustom.xslt"
3963 });
3964 }
3965 else if (!megaMenu)
3966 {
3967 @RenderNavigation(new
3968 {
3969 id = "topnavigation",
3970 cssclass = "menu dw-mod dwnavigation u-full-max-width",
3971 startLevel = @startLevel,
3972 ecomStartLevel = @startLevel + 1,
3973 endlevel = 5,
3974 expandmode = "all",
3975 template = "BaseMenuWithDropdown.xslt"
3976 });
3977 }
3978 else
3979 {
3980 @RenderNavigation(new
3981 {
3982 id = "topnavigation",
3983 cssclass = "menu dw-mod dwnavigation u-full-max-width",
3984 startLevel = @startLevel,
3985 ecomStartLevel = @startLevel + 1,
3986 endlevel = 5,
3987 promotionImage = megamenuPromotionImage,
3988 promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"),
3989 expandmode = "all",
3990 template = "BaseMegaMenu.xslt"
3991 });
3992 }
3993 </div>
3994 </div>
3995 }
3996
3997 @helper LoginModalCustom()
3998 {
3999 int pageId = Model.TopPage.ID;
4000 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
4001 string userSignedInErrorText = "";
4002 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4003 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
4004 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4005
4006 if (Model.LogOnFailed)
4007 {
4008 switch (Model.LogOnFailedReason)
4009 {
4010 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordLengthInvalid:
4011 userSignedInErrorText = Translate("Password length is invalid");
4012 break;
4013 case Dynamicweb.Security.UserManagement.LogOnFailedReason.IncorrectLogin:
4014 userSignedInErrorText = Translate("Invalid email or password");
4015 break;
4016 case Dynamicweb.Security.UserManagement.LogOnFailedReason.ExceededFailedLogOnLimit:
4017 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
4018 break;
4019 case Dynamicweb.Security.UserManagement.LogOnFailedReason.LoginLocked:
4020 userSignedInErrorText = Translate("The user account is temporarily locked");
4021 break;
4022 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordExpired:
4023 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
4024 break;
4025 default:
4026 userSignedInErrorText = Translate("An unknown error occured");
4027 break;
4028 }
4029 }
4030
4031 <!-- Trigger for the login modal -->
4032 <input type="checkbox" id="SignInModalTrigger" class="modal-trigger" @userSignedInError />
4033
4034 <!-- Login modal -->
4035 <div class="modal-container">
4036 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
4037 <div class="modal modal--xs" id="SignInModal">
4038 <div class="modal__header">
4039 <h2>@Translate("Sign in")</h2>
4040 </div>
4041 <div class="modal__body">
4042 <form method="post" id="LoginForm" class="u-no-margin">
4043 <input type="hidden" name="ID" value="@pageId" />
4044 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
4045 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
4046 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate("Customer Number")" />
4047 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate("Password")" />
4048 <div class="field-error dw-mod">@userSignedInErrorText</div>
4049
4050 <div class="form__field-group dw-mod">
4051 <input type="checkbox" id="LoginRememberMe" name="Autologin" checked="checked" value="True" class="form__control">
4052 <label for="LoginRememberMe">
4053 @Translate("Remember me", "Remember me")
4054 </label>
4055 </div>
4056
4057 <button type="submit" class="btn btn--primary btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
4058
4059 <a class="btn btn--link-clean dw-mod" href="@forgotPasswordPageLink">@Translate("Forgot your password?", "Forgot your password?")</a>
4060
4061 <a class="btn btn--link-clean dw-mod" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
4062 </form>
4063 </div>
4064 </div>
4065 </div>
4066 }
4067
4068 @helper RenderFooterNewsletterSignUpCustom()
4069 {
4070 string newsletterLink = Dynamicweb.Core.Converter.ToString(Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("ACNewsletterPage")) != string.Empty ? $"/Default.aspx?ID={Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("ACNewsletterPage")}" : string.Empty;
4071 if (newsletterLink != string.Empty)
4072 {
4073 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
4074 <div class="footer__content dw-mod">
4075 <p>@Translate("Sign up if you would like to receive occasional treats from us", "Sign up if you would like to receive occasional treats from us").</p>
4076 <a class="btn btn--primary btn--condensed dw-mod" href="@newsletterLink">@Translate("Sign up", "Sign up")</a>
4077 </div>
4078 }
4079 }
4080
4081 @helper RenderColliModalWithMultiplum()
4082 {
4083 <input type="checkbox" id="PackagesMessageModalWithMultiplumTrigger" class="modal-trigger" />
4084
4085 <div class="modal-container">
4086 <label for="PackagesMessageModalWithMultiplumTrigger" id="PackagesMessageModalWithMultiplumOverlay" class="modal-overlay"></label>
4087 <div class="modal modal--md" id="PackagesMessageModal">
4088 <div class="modal__header">
4089 <h2>@Translate("ANTALLET ER BLEVET OPSKREVET")</h2>
4090 </div>
4091 <div class="modal__body">
4092 <label>
4093 @Translate("Det ønskede antal stemmer ikke overens med kollisstørrelsen Antallet er derfor opskrevet til")
4094 <span class="js-closest-colli"></span>
4095 </label>
4096 <hr />
4097 <div class="grid">
4098 <div class="grid__col-xs-6">
4099 <button class="btn btn--full js-cancel-add-to-cart-from-modal" onclick="document.getElementById('PackagesMessageModalWithMultiplumTrigger').click()">@Translate("Annuller")</button>
4100 </div>
4101 <div class="grid__col-xs-6">
4102 <button class="btn btn--full btn--secondary dw-mod js-add-to-cart-from-modal">@Translate("Forsæt")</button>
4103 </div>
4104 </div>
4105 </div>
4106 </div>
4107 </div>
4108 }
4109
4110 @helper RenderColliModalWithoutMultiplum()
4111 {
4112 <input type="checkbox" id="PackagesMessageModalWithoutMultiplumTrigger" class="modal-trigger" />
4113
4114 <div class="modal-container">
4115 <label for="PackagesMessageModalWithoutMultiplumTrigger" id="PackagesMessageModalWithoutMultiplumOverlay" class="modal-overlay"></label>
4116 <div class="modal modal--md" id="PackagesMessageModal">
4117 <div class="modal__header">
4118 <h2>@Translate("INFORMATION OM PAKKESTØRRELSE")</h2>
4119 </div>
4120 <div class="modal__body">
4121 <label>
4122 @Translate("Du kan sagtens bestille det ønskede antal. Ønsker du et helt kolli skal du bestille")
4123 <span class="js-colli">count</span>
4124 </label>
4125 <hr />
4126 <div class="grid">
4127 <div class="grid__col-6">
4128 <button class="btn btn--full js-add-current-quantity">@Translate("Fortsæt")</button>
4129 </div>
4130 <div class="grid__col-6">
4131 <button class="btn btn--full btn--secondary dw-mod js-add-colli-to-cart">@Translate("Opskriv til kolli")</button>
4132 </div>
4133 </div>
4134 </div>
4135 </div>
4136 </div>
4137 }
4138
4139 @helper RenderAlertBoxModal()
4140 {
4141 <input type="checkbox" id="AlertBoxModalTrigger" class="modal-trigger" />
4142
4143 <div class="modal-container">
4144 <label for="AlertBoxModalTrigger" id="AlertBoxModalOverlay" class="modal-overlay"></label>
4145 <div class="modal modal--md" id="AlertBoxModal">
4146 <div class="modal__header">
4147 <h2>-</h2>
4148 </div>
4149 <div class="modal__body">
4150 <label>
4151 -
4152 </label><br />
4153 <button class="btn btn--secondary u-no-margin btn--full dw-mod" onclick="document.getElementById('AlertBoxModalTrigger').click();">@Translate("Close")</button>
4154 </div>
4155 </div>
4156 </div>
4157 }
4158
4159 @helper RenderNewsletterPopup()
4160 {
4161 @RenderParagraphContent(Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItem("SpNewsletterPopup").ParagraphID)
4162 }
4163
4164 @helper RenderPrimaryBottomSnippetsCustom()
4165 {
4166 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
4167 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")) && cookieBot.Statistics;
4168
4169 if (isWireframeMode)
4170 {
4171 <script>
4172 Wireframe.Init(true);
4173 </script>
4174 }
4175
4176 if (useGoogleTagManager)
4177 {
4178 <script>
4179 document.addEventListener('addToCart', function(event) {
4180 var googleImpression = event.detail.productInfo.googleImpression;
4181 dataLayer.push({
4182 'event': 'addToCart',
4183 'ecommerce': {
4184 'currencyCode': '@Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency().Code',
4185 'add': {
4186 'products': [{
4187 'name': googleImpression.name,
4188 'id': googleImpression.id,
4189 'price': googleImpression.price,
4190 'brand': googleImpression.brand,
4191 'category': googleImpression.category,
4192 'variant': googleImpression.variant,
4193 'quantity': event.detail.quantity
4194 }]
4195 }
4196 }
4197 });
4198 });
4199 </script>
4200
4201 }
4202
4203 <!--$$Javascripts-->
4204 }
4205
4206 @helper RenderGoogleTagManagerCustom()
4207 {
4208 string googleTagManagerId = Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID");
4209 bool useGoogleTagManager = !string.IsNullOrEmpty(googleTagManagerId) && cookieBot.Statistics;
4210
4211 if (useGoogleTagManager)
4212 {
4213 <script>
4214 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4215 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
4216 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
4217 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
4218 })(window,document,'script','dataLayer','@googleTagManagerId');
4219 </script>
4220 <!-- Google Tag Manager (noscript) -->
4221 <noscript>
4222 <iframe src="https://www.googletagmanager.com/ns.html?id=@googleTagManagerId"
4223 height="0" width="0" style="display:none;visibility:hidden"></iframe>
4224 </noscript>
4225 <!-- End Google Tag Manager (noscript) -->
4226 }
4227 }
4228
4229 @helper RenderFacebookPixelCustom()
4230 {
4231 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID") != null ? Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID") : "";
4232
4233 if (!string.IsNullOrWhiteSpace(FacebookPixelID) && cookieBot.Marketing)
4234 {
4235 <!-- Facebook Pixel Code -->
4236 <script>
4237 !function(f,b,e,v,n,t,s)
4238 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
4239 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
4240 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
4241 n.queue=[];t=b.createElement(e);t.async=!0;
4242 t.src=v;s=b.getElementsByTagName(e)[0];
4243 s.parentNode.insertBefore(t,s)}(window, document,'script',
4244 'https://connect.facebook.net/en_US/fbevents.js');
4245 fbq('init', '@FacebookPixelID');
4246 fbq('track', 'PageView');
4247 </script>
4248 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
4249 }
4250 }
4251
4252 @{
4253 // todo: move this to back-end.
4254 var requestUsername = Dynamicweb.Context.Current.Request["Username"];
4255 var requestUserToken = Dynamicweb.Context.Current.Request["PwTokenRecovery"];
4256 if (!string.IsNullOrEmpty(requestUsername) && !string.IsNullOrEmpty(requestUserToken))
4257 {
4258 var user = Dynamicweb.Security.UserManagement.User.GetUserByUserName(requestUsername);
4259 if (user != null)
4260 {
4261 var userToken = Dynamicweb.Frontend.LogOnHandler.GetLoginToken(user.UserName, user.Password);
4262 if (userToken == requestUserToken)
4263 {
4264 user.PasswordRecoveryToken = Guid.NewGuid().ToString();
4265 user.PasswordRecoveryTokenExpirationTime = DateTime.Now.AddHours(24);
4266 user.Save();
4267
4268 HttpContext.Current.Response.Redirect("/Default.aspx?ID=" + GetPageIdByNavigationTag("SignInPage") + "&RecoveryToken=" + user.PasswordRecoveryToken);
4269 }
4270 }
4271 }
4272 }
4273
4274
4275 @helper RenderDesktopLogoCustom()
4276 {
4277 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
4278 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4279 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
4280 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
4281 string alt = Model.Area.Item.GetItem("Settings").GetString("BusinessName") != null ? Model.Area.Item.GetItem("Settings").GetString("BusinessName") : "";
4282 string logoHeight = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetString("LogoHeight")) ? Model.Area.Item.GetItem("Layout").GetString("LogoHeight") : "40";
4283 logoHeight = logoHeight != "0" ? logoHeight : "40";
4284 if (Path.GetExtension(logo).ToLower() != ".svg")
4285 {
4286 logo = "/Admin/Public/GetImage.ashx?height=" + logoHeight + "&crop=5&Compression=75&image=" + logo;
4287
4288 if (Pageview.Device.ToString() == "Mobile")
4289 {
4290 logoHeight = "40";
4291 }
4292 }
4293 else
4294 {
4295 logo = HttpUtility.UrlDecode(logo);
4296 }
4297
4298 <div class="logo @alignClass dw-mod">
4299 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
4300 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@alt" />
4301 </a>
4302 </div>
4303 }
4304
4305
4306 @helper RenderAxExceptions()
4307 {
4308 <script type="text/javascript">
4309
4310 @{
4311 List<Exception> axExceptions = System.Web.HttpContext.Current.Items["Smartpage:AxExceptions"] as List<Exception>;
4312 }
4313
4314 var axExceptions = @Newtonsoft.Json.JsonConvert.SerializeObject(axExceptions);
4315
4316 if (axExceptions != null && axExceptions.length > 0) {
4317 //for (var i = 0; i < axExceptions.length; i++) {
4318 // alert(axExceptions[i].Message);
4319 //}
4320
4321 var headerAx = "@Translate("Smartpage:Ax.CalculateOrder.ErrorMessageHeader", "Error")";
4322 var messageAx = "@Translate("Smartpage:Ax.CalculateOrder.ErrorMessage", "An error occurred while processing your order")";
4323
4324 alertBoxModal(headerAx, messageAx);
4325 }
4326 </script>
4327 }
4328
4329 <!DOCTYPE html>
4330
4331 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
4332 <head>
4333 <meta charset="utf-8" />
4334 <title>@Model.Title</title>
4335 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
4336 <meta name="robots" content="index, follow">
4337
4338 @Model.MetaTags
4339
4340 <!-- Favicon -->
4341 <link href="@favicon" rel="icon" type="image/png">
4342
4343 <!-- Font awesome -->
4344 @if (useFontAwesomePro)
4345 {
4346 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css" type="text/css">
4347 }
4348 else
4349 {
4350 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css" type="text/css">
4351 }
4352 <!-- Flag icon -->
4353 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.1.0/css/flag-icon.min.css" type="text/css">
4354
4355 <!-- Base (Default, wireframe) styles -->
4356 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
4357
4358 <!-- Rapido Css from Website Settings -->
4359 <link id="rapidoCss" rel="stylesheet" href="@autoCssLink" type="text/css">
4360
4361 <!-- Ignite Css (Custom site specific styles) -->
4362 <link id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css" rel="stylesheet">
4363
4364 <!-- Google fonts -->
4365 @{
4366 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x)));
4367 }
4368 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
4369
4370 @Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SpScriptHeadAfter")
4371
4372 </head>
4373
4374 <body>
4375
4376 @Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SpScriptBodyBefore")
4377
4378 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
4379 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
4380
4381
4382 @helper RenderMasterHeader()
4383 {
4384 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
4385 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
4386 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
4387
4388 <header class="top-container @stickyTop dw-mod" id="Top">
4389 @RenderBlockList(subBlocks)
4390 </header>
4391 }
4392
4393 @helper RenderMain()
4394 {
4395 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
4396
4397 <main class="site dw-mod">
4398 @RenderBlockList(subBlocks)
4399 </main>
4400 }
4401
4402 @helper RenderPageContent()
4403 {
4404 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
4405 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
4406
4407 <div id="Page" class="page @pagePos">
4408 <section class="center-container content-container dw-mod" id="content">
4409 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4410
4411
4412 @{
4413 string columnClass = "12";
4414 bool isProductPage = HttpContext.Current.Request.QueryString.Get("ProductID") != null ? true : false;
4415 string backgroundColorClass = Model.PropertyItem.GetString("BackgroundColor") != null && !isProductPage ? "u-" + Model.PropertyItem.GetList("BackgroundColor").SelectedValue + "--bg" : "";
4416 }
4417
4418 @if (Model.PropertyItem.GetList("ShowBreadcrumb").SelectedValue == "True")
4419 {
4420 <div class="grid__col-12 grid__col--bleed-y">
4421 @RenderNavigation(new
4422 {
4423 id = "breadcrumb",
4424 template = "Breadcrumb.xslt"
4425 })
4426 </div>
4427 }
4428
4429 <div class="grid">
4430 @if (Model.PropertyItem.GetList("LeftMenu") != null && Model.PropertyItem.GetList("LeftMenu").SelectedValue == "True" && (Pageview.Page.NavigationSettings == null || !Pageview.Page.NavigationSettings.UseEcomGroups))
4431 {
4432 var navigationMarkup = RenderNavigation(new
4433 {
4434 id = "leftnav",
4435 cssclass = "dwnavigation",
4436 startLevel = 2,
4437 expandmode = "all",
4438 endlevel = 5,
4439 template = "LeftNavigation.xslt"
4440 });
4441
4442 if (!string.IsNullOrEmpty(navigationMarkup))
4443 {
4444 <nav class="grid__col-md-3">
4445 <div class="grid__cell">
4446 @navigationMarkup
4447 </div>
4448 </nav>
4449 columnClass = "9";
4450 }
4451 }
4452 <div class="grid__col-md-@columnClass grid__col--bleed">
4453 <div class="grid">
4454 @Model.Placeholder("dwcontent", "content", "default:true;sort:1")
4455 </div>
4456 </div>
4457 </div>
4458
4459
4460 @* Very small hack to make it cleanly, and easily possible to change the background color on a single page *@
4461 @if (backgroundColorClass != "")
4462 {
4463 <script>
4464 document.getElementById("Page").classList.add("@backgroundColorClass");
4465 </script>
4466 }
4467 </section>
4468 </div>
4469 }
4470 <input class="js-buy-all-multiplum-error-headertext" type="hidden" value="@Translate("Enkelte produkter er blevet opskrevet")" />
4471 <input class="js-buy-all-multiplum-error-bodytext" type="hidden" value="@Translate("Vi har opskrevet alle produkter markeret med rødt til nærmeste antal der kan købes.")" />
4472 <input class="js-blockui-calculation-message" type="hidden" value="@Translate(string.Format("OBS: Opdatér venligst ikke siden, imens ordren behandles {0}(kan tage op til 1 min.)", "<br>"))" />
4473 </body>
4474 </html>
4475
4476