Error executing template "Designs/Rapido/_parsed/Page.parsed.cshtml"
System.ArgumentException: An item with the same key has already been added.
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at Dynamicweb.Ecommerce.Products.GroupRelation.GetGroupRelationsByChildId(String childId)
at Dynamicweb.Ecommerce.Products.Group.get_IsTopGroup()
at Dynamicweb.Ecommerce.Shops.Shop.GetTopLevelGroups(String languageId)
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_eed5797f8c524d408ab417c6d1a79115.Execute() in e:\Dynamicweb.net\Solutions\Dev\translation.core.dynamicweb.dk\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 184
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2
3 @using Dynamicweb.Frontend.Devices
4 @using Dynamicweb.Extensibility
5 @using Dynamicweb.Content
6 @using Dynamicweb.Security
7 @using System
8 @using System.Linq
9 @using System.Web
10 @using System.IO
11
12 @{
13 //General settings
14 string favicon = Model.Area.Item.GetFile("LogoFavicon") != null ? Model.Area.Item.GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
15 string logo = Model.Area.Item.GetFile("LogoImage") != null ? Model.Area.Item.GetFile("LogoImage").Path : "/Files/Images/logo-dynamicweb.png";
16 if (Path.GetExtension(logo).ToLower() != ".svg")
17 {
18 logo = "/Admin/Public/GetImage.ashx?height=40&crop=5&Compression=75&image=" + @logo;
19 }
20 string searchPlaceholder = Translate("Search products", "Search products");
21 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
22 string wireframeMode = Model.Area.Item.GetBoolean("WireframeMode").ToString();
23
24 //Font settings
25 string navigationFont = Model.Area.Item.GetItem("NavigationFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
26 string mobileNavigationFont = Model.Area.Item.GetItem("MobileNavigationFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
27 string headerFont = Model.Area.Item.GetItem("ContentLayoutHeaderFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
28 string subHeaderFont = Model.Area.Item.GetItem("ContentLayoutSubheaderFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
29 string contentFont = Model.Area.Item.GetItem("ContentLayoutBodyText").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
30 string newStickersFont = Model.Area.Item.GetItem("NewStickersFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
31 string customStickersFont = Model.Area.Item.GetItem("CustomStickersFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
32 string toolsMenuFont = Model.Area.Item.GetItem("ToolsMenuFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
33
34 //Page IDs for use in the template
35 int pageId = Model.TopPage.ID;
36 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
37 int cartPageId = GetPageIdByNavigationTag("CartPage");
38 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
39 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
40 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
41 int productsSearchFeedId = productsPageId;
42 int productGroupsPageId = GetPageIdByNavigationTag("ProductGroupsFeed");
43 int impersonationPageId = GetPageIdByNavigationTag("Impersonation");
44
45 bool stickyMenu = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? false : Model.Area.Item.GetBoolean("NavigationStickyMenu");
46 string stickyTop = stickyMenu ? "top-container--sticky" : "";
47 string pagePos = stickyMenu ? "js-page-pos" : "";
48 string topLayout = Model.Area.Item.GetList("LayoutTop").SelectedValue;
49 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
50 string toolbarText = Model.Area.Item.GetString("ToolbarText");
51 bool onlyPreview = Model.Area.Item.GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
52
53 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
54
55 string userInitials = "";
56 if (Model.CurrentUser.ID != 0)
57 {
58 if (!String.IsNullOrEmpty(Model.CurrentUser.Name))
59 {
60 string[] names = Model.CurrentUser.Name.Split(' ');
61 userInitials += Model.CurrentUser.Name.Substring(0, 1);
62
63 if (names.Length > 1)
64 {
65 userInitials += names[names.Length - 1].Substring(0, 1);
66 }
67 }
68 else
69 {
70 userInitials += Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName != "" ? Model.CurrentUser.FirstName.Substring(0, 1) : "";
71 userInitials += Model.CurrentUser.LastName != null && Model.CurrentUser.LastName != "" ? Model.CurrentUser.LastName.Substring(0, 1) : "";
72 userInitials += userInitials.Length == 1 && Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName.Length > 1 ? Model.CurrentUser.FirstName.Substring(1, 2) : "";
73 userInitials += userInitials == "" && Model.CurrentUser.Email != null && Model.CurrentUser.Email.Length > 1 ? Model.CurrentUser.Email.Substring(0, 2) : "";
74 userInitials += userInitials == "" ? Model.CurrentUser.UserName.Substring(0, 2) : "";
75 }
76 }
77
78 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
79 string businessPhotoPath = Model.Area.Item.GetFile("BusinessPhoto") != null ? Model.Area.Item.GetFile("BusinessPhoto").Path : "";
80 string businessName = Model.Area.Item.GetString("BusinessName");
81 var address = Model.Area.Item.GetItem("Address");
82 string streetAddress = "";
83 string addressLocality = "";
84 string addressRegion = "";
85 string postalCode = "";
86 string addressCountry = "";
87 if (address != null)
88 {
89 streetAddress = address.GetString("StreetAddress");
90 addressLocality = address.GetString("City");
91 addressRegion = address.GetString("Region");
92 postalCode = address.GetString("PostalCode");
93 addressCountry = address.GetString("Country");
94 }
95 string contactEmail = Model.Area.Item.GetString("ContactEmail");
96 string contactNumber = Model.Area.Item.GetString("ContactNumber");
97 }
98 <!DOCTYPE html>
99
100 <html lang="@Pageview.Area.CultureInfo">
101 <head>
102 <meta charset="utf-8" />
103 <title>@Model.Title</title>
104 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
105 <meta name="robots" content="index, follow">
106
107 <!-- Favicon -->
108 <link href="@favicon" rel="icon" type="image/png">
109
110 <!-- Font awesome -->
111 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/rapido/font-awesome.min.css" type="text/css">
112
113 <!-- Base (Default, wireframe) styles -->
114 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
115
116 <!-- Rapido Css from Website Settings -->
117 <link id="rapidoCss" rel="stylesheet" href="@autoCssLink" type="text/css">
118
119 <!-- Ignite Css (Custom site specific styles) -->
120 <link id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css" rel="stylesheet">
121
122 <!-- Google fonts -->
123 @{
124 var fonts = new string[8] { navigationFont, mobileNavigationFont, headerFont, subHeaderFont, contentFont, newStickersFont, customStickersFont, toolsMenuFont };
125 var family = string.Join("%7C", fonts.Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x)));
126 }
127 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
128
129 @if (!string.IsNullOrEmpty(businessPhotoPath) &&
130 !string.IsNullOrEmpty(businessName) &&
131 !string.IsNullOrEmpty(streetAddress) &&
132 !string.IsNullOrEmpty(addressLocality) &&
133 !string.IsNullOrEmpty(addressRegion) &&
134 !string.IsNullOrEmpty(postalCode) &&
135 !string.IsNullOrEmpty(addressCountry))
136 {
137 <script type="application/ld+json">
138 {
139 "@@context": "http://schema.org",
140 "@@type": "Store",
141 "image": [
142 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
143 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
144 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath"
145 ],
146 "@@id": "@siteURL",
147 "name": "@businessName",
148 "address": {
149 "@@type": "PostalAddress",
150 "streetAddress": "@streetAddress",
151 "addressLocality": "@addressLocality",
152 "addressRegion": "@addressRegion",
153 "postalCode": "@postalCode",
154 "addressCountry": "@addressCountry"
155 }
156 @if (!string.IsNullOrEmpty(contactEmail))
157 {
158 <text>,"email": "@Model.Area.Item.GetString("ContactEmail")"</text>
159 }
160 @if (!string.IsNullOrEmpty(contactNumber))
161 {
162 <text>,"telephone": "@Model.Area.Item.GetString("ContactNumber")"</text>
163 }
164 }
165 </script>
166 }
167 </head>
168
169 <body>
170
171 @MobileNavigation(userInitials)
172
173 @LoginModal()
174
175 <main class="site dw-mod">
176 <header class="top-container @stickyTop dw-mod" id="Top">
177 @if (renderPagesInToolBar && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
178 {
179 <div class="tools-navigation dw-mod">
180 <div class="center-container grid top-container__center-container dw-mod">
181 <div class="grid__cell">
182 <div class="u-pull--left u-margin-top">@toolbarText</div>
183 <div class="u-pull--right">
184 @RenderNavigation(new
185 {
186 id = "topToolsNavigation",
187 cssclass = "menu menu-tools dw-mod dwnavigation",
188 template = "TopMenu.xslt"
189 })
190 </div>
191 </div>
192 </div>
193 </div>
194 }
195
196 @if (topLayout == "normal")
197 {
198 <!-- Header -->
199 <div class="header header-top dw-mod">
200 <div class="center-container top-container__center-container dw-mod">
201 <div class="grid">
202
203 @* Logo *@
204 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
205 {
206 <div class="grid__col-md-3 grid__col-sm-3 grid--align-self-center grid__col--bleed-y">
207 <div class="logo dw-mod">
208 <a href="/Default.aspx?ID=@firstPageId">
209 <img class="grid__cell-img" src="@logo" alt="Logo" />
210 </a>
211 </div>
212 </div>
213 }
214 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
215 {
216 <div class="grid__col-12">
217 <div class="grid__cell">
218 <div class="logo u-max-w220px u-middle u-margin-bottom dw-mod">
219 <a href="/Default.aspx?ID=@firstPageId">
220 <img class="grid__cell-img" src="@logo" alt="Logo" />
221 </a>
222 </div>
223 </div>
224 </div>
225 }
226
227 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
228 {
229 @* Search *@
230 <div class="grid__col-6 grid__col--bleed-y grid--align-self-center">
231 <div class="typeahead u-margin u-color-inherit js-typeahead" data-page-size="10" id="TopProductSearch" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
232 <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>
233 <ul class="dropdown dropdown--absolute-position js-handlebars-root js-typeahead-groups-content u-min-w220px dw-mod" id="TopProductSearchGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
234 <input type="text" class="typeahead-search-field u-no-margin js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
235 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content u-full-width dw-mod" id="TopProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
236 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
237 </div>
238 </div>
239
240 <div class="grid__cell grid__cell--align-middle-right">
241 <ul class="menu dw-mod u-pull--right">
242 @RenderSignIn("outsideNavigation", userInitials)
243 @RenderLanguageSelector("outsideNavigation")
244 @RenderFavorites("outsideNavigation")
245 @if (!onlyPreview)
246 {
247 @RenderMiniCart("outsideNavigation")
248 }
249 </ul>
250 </div>
251 }
252
253 @* Mobile search *@
254 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
255 {
256 <div class="grid__col-12 grid__col--bleed-y grid--align-self-center">
257 <div class="grid__cell">
258 <div class="js-typeahead" data-page-size="10" id="MobileProductSearch" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
259 <input type="text" class="u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
260 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
261 </div>
262 </div>
263 </div>
264 }
265 </div>
266 </div>
267 </div>
268
269 <!-- Main navigation -->
270 <nav class="main-navigation dw-mod">
271 <div class="center-container top-container__center-container dw-mod">
272 <div class="grid">
273 <div class="grid__col-12 grid--align-self-center grid__col--bleed">
274 <div class="grid__cell">
275 @MobileNavigationTrigger()
276 @RenderHeaderNavigation()
277
278 @if ((Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") && !onlyPreview)
279 {
280 <ul class="menu dw-mod u-pull--right">
281 @RenderMiniCart()
282 </ul>
283 }
284 </div>
285 </div>
286 </div>
287 </div>
288 </nav>
289 }
290
291 @if (topLayout == "splitted")
292 {
293 <!-- Header -->
294 <div class="header header-top dw-mod">
295 <div class="center-container top-container__center-container dw-mod">
296 <div class="grid">
297
298 @* Logo *@
299 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
300 {
301 <div class="grid__col-md-3 grid__col-sm-3 grid--align-self-center grid__col--bleed-y">
302 <div class="logo dw-mod">
303 <a href="/Default.aspx?ID=@firstPageId">
304 <img class="grid__cell-img" src="@logo" alt="Logo" />
305 </a>
306 </div>
307 </div>
308 }
309 else
310 {
311 <div class="grid__col-xs-6">
312 <div class="grid__cell">
313 <div class="logo u-max-w220px dw-mod">
314 <a href="/Default.aspx?ID=@firstPageId">
315 <img class="grid__cell-img" src="@logo" alt="Logo" />
316 </a>
317 </div>
318 </div>
319 </div>
320 }
321
322 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
323 {
324 @* Search *@
325 <div class="grid__cell grid__cell--align-middle-right">
326 <div class="grid__col-sm-8 grid__col--bleed">
327 <div class="typeahead u-margin u-color-inherit js-typeahead" data-page-size="10" id="TopProductSearch" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
328 <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>
329 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="TopProductSearchGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
330 <input type="text" class="typeahead-search-field u-no-margin js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
331 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content u-full-width dw-mod" id="TopProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
332 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
333 </div>
334 </div>
335 </div>
336 }
337 else
338 {
339 @* Mobile search *@
340 <div class="grid__col-xs-6">
341 <div class="grid__cell">
342 <div class="js-typeahead" data-page-size="10" id="MobileProductSearch" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
343 <input type="text" class="u-full-width js-typeahead-search-field u-no-margin" placeholder="@searchPlaceholder" value="@searchValue">
344 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
345 </div>
346 </div>
347 </div>
348 }
349 </div>
350 </div>
351 </div>
352
353 <!-- Main navigation -->
354 <nav class="main-navigation dw-mod">
355 <div class="center-container top-container__center-container dw-mod">
356 <div class="grid">
357 <div class="u-pull--left">
358 @MobileNavigationTrigger()
359 @RenderHeaderNavigation()
360 </div>
361 <div class="grid__cell grid__cell--align-middle-right">
362 <ul class="menu dw-mod u-pull--right">
363 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
364 {
365 @RenderSignIn("inNavigation", userInitials)
366 @RenderLanguageSelector()
367 @RenderFavorites()
368 }
369 @if (!onlyPreview)
370 {
371 @RenderMiniCart()
372 }
373 </ul>
374 </div>
375 </div>
376 </div>
377 </nav>
378 }
379
380 @if (topLayout == "condensed")
381 {
382 <!-- Main navigation -->
383 <nav class="main-navigation dw-mod">
384 <div class="center-container top-container__center-container dw-mod">
385 <div class="grid">
386
387 <div class="grid__col-md-3 grid--align-self-center grid__col--bleed-y">
388 <div class="logo u-padding--xs dw-mod">
389 <a href="/Default.aspx?ID=@firstPageId">
390 <img class="grid__cell-img" src="@logo" alt="Logo" />
391 </a>
392 </div>
393 </div>
394
395 @* Navigation *@
396 <div class="u-pull--left">
397 @MobileNavigationTrigger()
398 @RenderHeaderNavigation()
399 </div>
400
401 <div class="grid__cell grid__cell--align-middle-right">
402 <ul class="menu dw-mod u-pull--right">
403 @RenderSignIn("inNavigation", userInitials)
404 @RenderLanguageSelector()
405 @RenderFavorites()
406 @if (!onlyPreview)
407 {
408 @RenderMiniCart()
409 }
410 </ul>
411 </div>
412 </div>
413 </div>
414 </nav>
415
416 <!-- Searchbar -->
417 <div class="u-box-shadow u-color-light-gray--bg u-inline-block u-full-width">
418 <div class="center-container top-container__center-container dw-mod">
419 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" data-page-size="10" id="ProductSearchBar" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
420 <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>
421 <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=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
422 <div class="typeahead-search-field">
423 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
424 <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="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
425 </div>
426 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
427 </div>
428 </div>
429 </div>
430 }
431 @if (topLayout == "minimal")
432 {
433 <!-- Main navigation -->
434 <nav class="main-navigation dw-mod">
435 <div class="center-container top-container__center-container dw-mod">
436 <div class="grid">
437
438 <div class="grid__col-md-3 grid--align-self-center grid__col--bleed-y">
439 <div class="logo u-padding--xs dw-mod">
440 <a href="/Default.aspx?ID=@firstPageId">
441 <img class="grid__cell-img" src="@logo" alt="Logo" />
442 </a>
443 </div>
444 </div>
445
446 @* Navigation *@
447 <div class="u-pull--left">
448 @MobileNavigationTrigger()
449 @RenderHeaderNavigation()
450 </div>
451
452 <div class="grid__cell grid__cell--align-middle-right">
453 <ul class="menu dw-mod u-pull--right">
454 @* Search *@
455 <li class="menu__item menu__item--horizontal menu__item--top-level u-hidden-xxs dw-mod">
456 <div class="menu__link u-w50px is-dropdown is-dropdown--no-icon dw-mod">
457 <i class="fa fa-search fa-1_5x"></i>
458 <div class="menu menu--dropdown u-w340px top-micro-search dw-mod">
459 <div class="typeahead js-typeahead" data-page-size="10" id="ProductSearchBar" data-search-page-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
460 <div class="typeahead-search-field">
461 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
462 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content" id="ProductSearchBarContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
463 </div>
464 </div>
465 </div>
466 </div>
467 </li>
468 @RenderSignIn("inNavigation", userInitials)
469 @RenderLanguageSelector()
470 @RenderFavorites()
471 @if (!onlyPreview)
472 {
473 @RenderMiniCart()
474 }
475 </ul>
476 </div>
477 </div>
478 </div>
479 </nav>
480 }
481
482 @* Impersonation bar *@
483 @if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
484 {
485 <div class="u-color-warning--bg">
486 <div class="center-container top-container__center-container dw-mod">
487 @*Impersonation*@
488 <div class="grid">
489 <div class="grid--align-self-center grid__col-x">
490 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
491 {
492 string stopImpersonateTranslation = Translate("Stop impersonation");
493 string username = "";
494 if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.FirstName) && !string.IsNullOrEmpty(Model.CurrentSecondaryUser.LastName))
495 {
496 username = Model.CurrentSecondaryUser.FirstName + " " + Model.CurrentSecondaryUser.LastName;
497 }
498 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Name))
499 {
500 username = Model.CurrentSecondaryUser.Name;
501 }
502 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Email))
503 {
504 username = Model.CurrentSecondaryUser.Email;
505 }
506 else
507 {
508 username = Model.CurrentSecondaryUser.UserName;
509 }
510 <div class="grid-cell">
511 <div class="u-pull--left u-bold u-margin-top">
512 <i class="fa fa-user-secret"></i>
513 @username<text> </text>@Translate("is impersonated by")<text> </text>@Pageview.User.UserName
514 </div>
515 <form method="post" class="u-pull--right u-no-margin">
516 <input type="submit" class="btn btn--secondary dw-mod u-no-margin" name="DwExtranetRemoveSecondaryUser" value="@stopImpersonateTranslation">
517 </form>
518 </div>
519 }
520 else
521 {
522 string viewListTranslation = Translate("View the list of users you can impersonate");
523 <div class="grid-cell u-bold">
524 <i class="fa fa-user-secret"></i>
525 <a href="/Default.aspx?ID=@impersonationPageId" title="@viewListTranslation" class="u-color-font-black">@viewListTranslation</a>
526 </div>
527 }
528 </div>
529 </div>
530 </div>
531 </div>
532 }
533 </header>
534
535 <!-- Floating mini cart -->
536 @if (!onlyPreview && !stickyMenu && pageId == productsPageId && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
537 {
538 <div class="floating-mini-cart u-hidden dw-mod" id="FloatingMiniCart">
539 <div class="mini-cart dw-mod">
540 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="menu-tools__link menu__link--condensed dw-mod js-mini-cart-button" onmouseover="Cart.UpdateMiniCart(event, 'SecondaryMiniCart', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
541 <i class="fa fa-shopping-cart fa-4x"></i>
542 <div class="mini-cart__counter mini-cart__counter--lg dw-mod">
543 <div class="js-handlebars-root js-mini-cart-counter" id="FloatingCartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-preloader="false" data-init-onload="false">
544 <div class="js-mini-cart-counter-content">
545 @Model.Cart.TotalProductsCount
546 </div>
547 </div>
548 </div>
549 </a>
550
551 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="SecondaryMiniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
552 </div>
553 </div>
554 }
555
556 <!-- Render the content -->
557 <div id="Page" class="page @pagePos">
558 <section class="center-container content-container dw-mod" id="content">
559 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
560
561
562 @if (Model.PropertyItem.GetList("ShowBreadcrumb").SelectedValue == "True")
563 {
564 <div class="grid__col-12 grid__col--bleed-y">
565 @RenderNavigation(new
566 {
567 id = "breadcrumb",
568 template = "Breadcrumb.xslt"
569 })
570 </div>
571 }
572
573 <div class="grid">
574 @if (Model.PropertyItem.GetList("LeftMenu").SelectedValue == "True")
575 {
576 var navigationMarkup = RenderNavigation(new
577 {
578 id = "leftnav",
579 cssclass = "menu dwnavigation",
580 startLevel = 2,
581 endlevel = 5,
582 template = "LeftNavigation.xslt"
583 });
584 if (!string.IsNullOrEmpty(navigationMarkup))
585 {
586 <nav class="grid__col-md-3 grid__col-sm-12 grid__col-xs-12">
587 <div class="grid">
588 <div class="grid__col-12">
589 <div class="grid__cell">
590 @navigationMarkup
591 </div>
592 </div>
593 </div>
594 </nav>
595 }
596 }
597 <div class="grid__col-auto grid__col--bleed">
598 <div class="grid">
599 @* Divs count is equal divs in ParagraphContainer.cshtml *@
600 @Model.Placeholder("dwcontent", "content", "default:true;sort:1")
601 </div>
602 </div>
603 </div>
604 </section>
605 </div>
606 </main>
607
608 @RenderFooter()
609
610
611 <!-- Content rendering helpers -->
612
613 @helper MobileNavigation(string userInitials) {
614 int pageId = Model.TopPage.ID;
615 string mobileNavigationLevels = Model.Area.Item.GetBoolean("MobileNavigationLevels") ? Model.Area.Item.GetString("MobileNavigationLevels") : "3";
616
617 bool showCreateAccountLink = Model.Area.Item.GetBoolean("ShowCreateAccountLink");
618
619 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
620 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
621 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
622
623 string myProfilePageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerProfile").ToString() : GetPageIdByNavigationTag("CustomerProfile").ToString();
624 string myOrdersPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerOrders").ToString() : GetPageIdByNavigationTag("CustomerOrders").ToString();
625 string myFavoritesPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerFavorites").ToString() : GetPageIdByNavigationTag("CustomerFavorites").ToString();
626 bool showMyProfileLink = Model.Area.Item.GetBoolean("ShowMyProfileLink");
627 bool showMyOrdersLink = Model.Area.Item.GetBoolean("ShowMyOrdersLink");
628 bool showMyFavoritesLink = Model.Area.Item.GetBoolean("ShowMyFavoritesLink");
629
630 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
631 int startLevel = renderPagesInToolBar ? 1 : 0;
632
633 bool onlyPreview = Model.Area.Item.GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
634
635 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
636 {
637 <!-- Trigger for mobile navigation -->
638 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger" />
639
640 <!-- Mobile navigation -->
641 <nav class="mobile-navigation dw-mod">
642 @if (Model.CurrentUser.ID > 0)
643 {
644 string userName = Model.CurrentUser.FirstName != null ? Model.CurrentUser.FirstName : "";
645 userName += " " + Model.CurrentUser.LastName != null ? Model.CurrentUser.LastName : "";
646 userName += userName == "" && Model.CurrentUser.UserName != null ? Model.CurrentUser.UserName : "";
647
648 <ul class="menu menu-mobile">
649 <li class="menu-mobile__item">
650 <a href="/default.aspx?ID=@myProfilePageId" class="menu-mobile__link dw-mod"><i class="fa fa-user menu-mobile__link-icon"></i> @userName</a>
651 </li>
652 </ul>
653 }
654
655 @RenderNavigation(new
656 {
657 id = "mobilenavigation",
658 cssclass = "menu menu-mobile dwnavigation",
659 startLevel = @startLevel,
660 ecomStartLevel = @startLevel+1,
661 endlevel = @mobileNavigationLevels,
662 expandmode = "all",
663 template = "BaseMenuForMobile.xslt"
664 })
665
666 @if (Model.Area.Item.GetBoolean("RenderPagesInToolBar"))
667 {
668 @RenderNavigation(new
669 {
670 id = "topToolsMobileNavigation",
671 cssclass = "menu menu-mobile dwnavigation",
672 template = "ToolsMenuForMobile.xslt"
673 })
674 }
675
676 <ul class="menu menu-mobile">
677 @if (Model.CurrentUser.ID <= 0)
678 {
679 <li class="menu-mobile__item">
680 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="fa fa-user menu-mobile__link-icon"></i> @Translate("Sign in")</label>
681 </li>
682 if (showCreateAccountLink)
683 {
684 <li class="menu-mobile__item">
685 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="fa fa-user menu-mobile__link-icon"></i> @Translate("Create account")</a>
686 </li>
687 }
688 }
689 else
690 {
691 if (showMyProfileLink)
692 {
693 <li class="menu-mobile__item">
694 <a href="/default.aspx?ID=@myProfilePageId" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="fa fa-user menu-mobile__link-icon"></i> @Translate("My Profile")</a>
695 </li>
696 }
697 if (showMyOrdersLink)
698 {
699 <li class="menu-mobile__item">
700 <a href="/default.aspx?ID=@myOrdersPageId" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="fa fa-list menu-mobile__link-icon"></i> @Translate("My Orders")</a>
701 </li>
702 }
703 if (showMyFavoritesLink)
704 {
705 <li class="menu-mobile__item">
706 <a href="/default.aspx?ID=@myFavoritesPageId" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="fa fa-star menu-mobile__link-icon"></i> @Translate("My Favorites")</a>
707 </li>
708 }
709 <li class="menu-mobile__item">
710 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId"><i class="fa fa-user menu-mobile__link-icon"></i> @Translate("Sign out")</a>
711 </li>
712 }
713 @if (Model.Languages.Count > 0)
714 {
715 string selectedLanguage = "";
716 foreach (var lang in Model.Languages)
717 {
718 if (lang.IsCurrent)
719 {
720 selectedLanguage = lang.Name;
721 }
722 }
723
724 <li class="menu-mobile__item dw-mod">
725 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="fa fa-globe menu-mobile__link-icon"></i> @selectedLanguage</label>
726 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
727 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
728 <ul class="menu-mobile menu-mobile__submenu expand-menu">
729 @foreach (var lang in Model.Languages)
730 {
731 <li class="menu-mobile__item dw-mod">
732 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID&CurrencyCode=@Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCurrencyId">@lang.Name</a>
733 </li>
734 }
735 </ul>
736 </li>
737 }
738 </ul>
739 </nav>
740 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
741
742 if (!onlyPreview)
743 {
744 <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>
745 }
746 }
747 }
748
749 @helper LoginModal() {
750 int pageId = Model.TopPage.ID;
751 string topLayout = Model.Area.Item.GetList("LayoutTop").SelectedValue;
752 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
753 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
754 string forgotPasswordPageId = signInProfilePageId.ToString() + "&LoginAction=Recovery";
755 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
756 string userSignedInErrorText = "";
757
758 if (Model.LogOnFailed) {
759 switch (Model.LogOnFailedReason)
760 {
761 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordLengthInvalid:
762 userSignedInErrorText = Translate("Password length is invalid");
763 break;
764 case Dynamicweb.Security.UserManagement.LogOnFailedReason.IncorrectLogin:
765 userSignedInErrorText = Translate("Invalid email or password");
766 break;
767 case Dynamicweb.Security.UserManagement.LogOnFailedReason.ExceededFailedLogOnLimit:
768 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
769 break;
770 case Dynamicweb.Security.UserManagement.LogOnFailedReason.LoginLocked:
771 userSignedInErrorText = Translate("The user account is temporarily locked");
772 break;
773 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordExpired:
774 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
775 break;
776 default:
777 userSignedInErrorText = Translate("An unknown error occured");
778 break;
779 }
780 }
781
782 <!-- Trigger for the login modal -->
783 <input type="checkbox" id="SignInModalTrigger" class="modal-trigger @topLayout" @userSignedInError />
784
785 <!-- Login modal -->
786 <div class="modal-container">
787 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
788 <div class="modal modal--xs" id="SignInModal">
789 <div class="modal__header">
790 <h2>@Translate("Sign in")</h2>
791 </div>
792 <div class="modal__body">
793 <form method="post" id="LoginForm" class="u-no-margin">
794 <input type="hidden" name="ID" value="@pageId" />
795 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
796 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
797 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate("Email")" />
798 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate("Password")" />
799 <div class="field-error dw-mod">@userSignedInErrorText</div>
800
801 <label>
802 <input type="checkbox" id="RememberMe" name="Autologin" checked="checked" value="True">
803 <span>@Translate("Remember me", "Remember me")</span>
804 </label>
805
806 <button type="submit" class="btn btn--primary btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
807
808 <a class="btn btn--link-clean dw-mod" href="/Default.aspx?id=@forgotPasswordPageId">@Translate("Forgot your password?", "Forgot your password?")</a>
809
810 <a class="btn btn--link-clean dw-mod" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
811 </form>
812 </div>
813 </div>
814 </div>
815 }
816
817 @helper RenderHeaderNavigation() {
818 bool megaMenu = Model.Area.Item.GetList("NavigationMegaMenu").SelectedValue.ToLower() == "true" ? true : false;
819 string megamenuPromotionImage = Model.Area.Item.GetFile("NavigationMegamenuPromotionImage") != null ? Model.Area.Item.GetFile("NavigationMegamenuPromotionImage").Path : "";
820 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
821 int startLevel = renderPagesInToolBar ? 1 : 0;
822
823 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
824 {
825 if (!megaMenu)
826 {
827 @RenderNavigation(new
828 {
829 id = "topnavigation",
830 cssclass = "menu dw-mod dwnavigation",
831 startLevel = @startLevel,
832 ecomStartLevel = @startLevel+1,
833 endlevel = 5,
834 expandmode="all",
835 template = "BaseMenuWithDropdown.xslt"
836 });
837 }
838 else
839 {
840 @RenderNavigation(new
841 {
842 id = "topnavigation",
843 cssclass = "menu dw-mod dwnavigation",
844 startLevel = @startLevel,
845 ecomStartLevel = @startLevel+1,
846 endlevel = 5,
847 promotionImage = megamenuPromotionImage,
848 promotionLink = Model.Area.Item.GetString("NavigationMegamenuPromotionLink"),
849 expandmode = "all",
850 template = "BaseMegaMenu.xslt"
851 });
852 }
853 }
854 }
855
856 @helper MobileNavigationTrigger() {
857 @* Mobile navigation trigger *@
858
859 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
860 {
861 <div class="menu dw-mod u-pull--left">
862 <div class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
863 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link dw-mod"></label>
864 </div>
865 </div>
866 }
867 }
868
869 @helper RenderLanguageSelector(string type = "inNavigation") {
870 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean u-w40px dw-mod";
871 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
872
873 @* Language selector *@
874 if (Model.Languages.Count > 1)
875 {
876 <li class="@liClasses">
877 <div class="@menuLinkClass u-w40px is-dropdown is-dropdown--no-icon dw-mod">
878 <i class="fa fa-globe fa-1_5x"></i>
879 <div class="menu menu--dropdown u-w100px dw-mod">
880 @foreach (var lang in Model.Languages)
881 {
882 <a href="/Default.aspx?ID=@lang.Page.ID&CurrencyCode=@Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCurrencyId" class="menu-dropdown__item menu-dropdown__item--link dw-mod">@lang.Name</a>
883 }
884 </div>
885 </div>
886 </li>
887 }
888 }
889
890 @helper RenderMiniCart(string type = "inNavigation") {
891 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod" : "menu__item menu__item--horizontal menu--clean dw-mod";
892 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
893
894 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
895 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
896 int cartPageId = GetPageIdByNavigationTag("CartPage");
897 double cartProductsCount = Model.Cart.TotalProductsCount;
898
899 @* Mini cart *@
900 <li class="@liClasses">
901 <div class="mini-cart dw-mod">
902 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="@menuLinkClass dw-mod js-mini-cart-button" onmouseenter="Cart.UpdateMiniCart(event, 'miniCart', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
903 <i class="fa fa-shopping-cart fa-1_5x"></i>
904 <div class="mini-cart__counter mini-cart__counter--inline dw-mod">
905 <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">
906 <div class="js-mini-cart-counter-content">
907 @cartProductsCount
908 </div>
909 </div>
910 </div>
911 </a>
912 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
913 {
914 <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>
915 }
916 </div>
917 </li>
918 }
919
920 @helper RenderSignIn (string type = "inNavigation", string userInitials = "") {
921 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu__item--clean u-w40px dw-mod";
922 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
923
924 int pageId = Model.TopPage.ID;
925 string myProfilePageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerProfile").ToString() : GetPageIdByNavigationTag("CustomerProfile").ToString();
926 string myOrdersPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerOrders").ToString() : GetPageIdByNavigationTag("CustomerOrders").ToString();
927 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
928 string myFavoritesPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerFavorites").ToString() : GetPageIdByNavigationTag("CustomerFavorites").ToString();
929 string mySavedCardsPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("SavedCards").ToString() : GetPageIdByNavigationTag("SavedCards").ToString();
930 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
931 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
932 string forgotPasswordPageId = signInProfilePageId.ToString() + "&LoginAction=Recovery";
933
934 bool showCreateAccountLink = Model.Area.Item.GetBoolean("ShowCreateAccountLink");
935 bool showMyProfileLink = Model.Area.Item.GetBoolean("ShowMyProfileLink");
936 bool showMyOrdersLink = Model.Area.Item.GetBoolean("ShowMyOrdersLink");
937 bool showMyFavoritesLink = Model.Area.Item.GetBoolean("ShowMyFavoritesLink");
938 bool showMySavedCardsLink = Model.Area.Item.GetBoolean("ShowMySavedCardsLink");
939
940 @* Sign in + Customer center links *@
941 <li class="@liClasses">
942 <div class="@menuLinkClass is-dropdown is-dropdown--no-icon u-w40px dw-mod">
943 @if (Model.CurrentUser.ID <= 0)
944 {
945 <i class="fa fa-user fa-1_5x"></i>
946 }
947 else
948 {
949 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>
950 }
951
952 <div class="menu menu--dropdown sign-in-dropdown dw-mod">
953 <ul class="list list--clean dw-mod">
954 @if (Model.CurrentUser.ID <= 0)
955 {
956 <li>
957 <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>
958 </li>
959 if (showCreateAccountLink)
960 {
961 <li>
962 <a href="/default.aspx?ID=@createAccountPageId" class="list__link dw-mod">@Translate("Create account")</a>
963 </li>
964 }
965 <li>
966 <a href="/default.aspx?ID=@forgotPasswordPageId" class="list__link dw-mod">@Translate("Forgot your password?")</a>
967 </li>
968 if (showMyProfileLink || showMyOrdersLink || showMyFavoritesLink || showMySavedCardsLink)
969 {
970 <li class="list__seperator dw-mod"></li>
971 }
972 }
973 @if (showMyProfileLink)
974 {
975 <li>
976 <a href="/default.aspx?ID=@myProfilePageId" class="list__link dw-mod"><i class="fa fa-user"></i> @Translate("My Profile")</a>
977 </li>
978 }
979 @if (showMyOrdersLink)
980 {
981 <li>
982 <a href="/default.aspx?ID=@myOrdersPageId" class="list__link dw-mod"><i class="fa fa-list"></i> @Translate("My Orders")</a>
983 </li>
984 }
985 @if (showMyFavoritesLink)
986 {
987 <li>
988 <a href="/default.aspx?ID=@myFavoritesPageId" class="list__link dw-mod"><i class="fa fa-star"></i> @Translate("My Favorites")</a>
989 </li>
990 }
991 @if (showMySavedCardsLink)
992 {
993 <li>
994 <a href="/default.aspx?ID=@mySavedCardsPageId" class="list__link dw-mod"><i class="fa fa-credit-card"></i> @Translate("My Saved cards")</a>
995 </li>
996 }
997 @if (Model.CurrentUser.ID > 0)
998 {
999 if (showMyProfileLink || showMyOrdersLink || showMyFavoritesLink || showMySavedCardsLink)
1000 {
1001 <li class="list__seperator dw-mod"></li>
1002 }
1003 <li>
1004 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" class="list__link dw-mod">@Translate("Sign out")</a>
1005 </li>
1006 }
1007 </ul>
1008 </div>
1009 </div>
1010 </li>
1011 }
1012
1013 @helper RenderFavorites(string type = "inNavigation") {
1014 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean u-w40px dw-mod";
1015 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
1016
1017 string myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites").ToString();
1018
1019 @* Favorites *@
1020 if (Model.CurrentUser.ID > 0)
1021 {
1022 <li class="@liClasses">
1023 <a href="/Default.aspx?ID=@myFavoritesPageId" class="@menuLinkClass dw-mod">
1024 <i class="fa fa-star fa-1_5x"></i>
1025 </a>
1026 </li>
1027 }
1028 }
1029
1030
1031 @helper RenderFooter() {
1032 string footerColumnOneContent = !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterColumnOne")) ? Model.Area.Item.GetString("FooterColumnOne") : "";
1033 string footerColumnTwoContent = !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterColumnTwo")) ? Model.Area.Item.GetString("FooterColumnTwo") : "";
1034 string footerColumnThreeContent = !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterColumnThree")) ? Model.Area.Item.GetString("FooterColumnThree") : "";
1035 string footerColumnOneHeader = Model.Area.Item.GetString("FooterColumnOneHeader");
1036 string footerColumnTwoHeader = Model.Area.Item.GetString("FooterColumnTwoHeader");
1037 string footerColumnThreeHeader = Model.Area.Item.GetString("FooterColumnThreeHeader");
1038 int newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp");
1039
1040 <!-- Footer section -->
1041 <footer class="footer dw-mod">
1042 <div class="center-container top-container__center-container dw-mod">
1043 <div class="grid">
1044 @if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
1045 {
1046 <div class="grid__col-md-auto">
1047 <h4 class="footer__heading dw-mod">@footerColumnOneHeader</h4>
1048 <div class="footer__content dw-mod">
1049 @footerColumnOneContent
1050 </div>
1051 </div>
1052 }
1053 @if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
1054 {
1055 <div class="grid__col-md-auto">
1056 <h4 class="footer__heading dw-mod">@footerColumnTwoHeader</h4>
1057 <div class="footer__content dw-mod">
1058 @footerColumnTwoContent
1059 </div>
1060 </div>
1061 }
1062 @if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
1063 {
1064 <div class="grid__col-md-auto">
1065 <h4 class="footer__heading dw-mod">@footerColumnThreeHeader</h4>
1066 <div class="footer__content dw-mod">
1067 @footerColumnThreeContent
1068 </div>
1069 </div>
1070 }
1071 @if (Model.Area.Item.GetBoolean("FooterNewsletterSignUp"))
1072 {
1073 <div class="grid__col-md-auto">
1074 <h4 class="footer__heading dw-mod">@Translate("Mailing list", "Mailing list")</h4>
1075 <div class="footer__content dw-mod">
1076 <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>
1077 <form class="form dw-mod" name="NewsletterRedirect" action='/Default.aspx' method="get" enctype="multipart/form-data">
1078 <input name="ID" id="ID" value="@newsletterSignUpPageId" type="hidden" />
1079 <div class="form__field-combi">
1080 <input name="NewsletterEmail" id="NewsletterEmail" type="text" class="u-w160px" placeholder='@Translate("Your email address", "Your email address")' />
1081 <input class="btn btn--primary btn--condensed dw-mod" type="submit" id="Submitter" value='@Translate("Go", "Go")' />
1082 </div>
1083 </form>
1084 </div>
1085 </div>
1086 }
1087 @if (Model.Area.Item.GetItems("FooterSocialLinks").Count > 0)
1088 {
1089 <div class="grid__col-md-auto">
1090 <h4 class="footer__heading dw-mod">@Translate("Social links", "Social links")</h4>
1091 <div class="footer__content dw-mod">
1092 <div class="collection dw-mod">
1093 @foreach (var socialitem in Model.Area.Item.GetItems("FooterSocialLinks"))
1094 {
1095 //Fields.FirstOrDefault(x => x.SystemName == "Icon").GetString()
1096 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
1097 string socialIconClass = socialIcon.SelectedValue;
1098 string socialIconTitle = socialIcon.SelectedName;
1099 string socialLink = socialitem.GetString("Link");
1100
1101 <a href="@socialLink" target="_blank" title="@socialIconTitle"><i class="fa @socialIconClass fa-2x"></i></a>
1102 }
1103 </div>
1104 </div>
1105 </div>
1106 }
1107 <div class="grid__col-12 footer__copyright dw-mod">
1108 <p>@Model.Area.Item.GetString("FooterCopyrightText")</p>
1109 </div>
1110 </div>
1111 </div>
1112 </footer>
1113 }
1114
1115
1116 @* Templates for Typeahead *@
1117 <script id="SearchGroupsTemplate" type="text/x-template">
1118 {{#.}}
1119 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
1120 {{/.}}
1121 </script>
1122
1123 <script id="SearchContentTemplate" type="text/x-template">
1124 {{#each .}}
1125 {{#Product}}
1126 {{#ifCond template "!==" "SearchMore"}}
1127 <li class="dropdown__item dropdown__item--seperator dw-mod">
1128 <div>
1129 <a href="{{link}}" class="js-typeahead-link u-color-inherit u-pull--left">
1130 <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>
1131 <div class="u-pull--left">
1132 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}</div>
1133 @if (!onlyPreview)
1134 {
1135 <div class="{{onlyPreview}}">{{price}}</div>
1136 }
1137 </div>
1138 </a>
1139 <div class="u-margin-left u-pull--right u-w80px u-hidden-xs u-hidden-xxs">
1140 <button class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside" onclick="Cart.AddToCart(event, '{{id}}', '1')"><i class="fa fa-shopping-cart js-ignore-click-outside"></i></button>
1141 <a href="{{link}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod {{hideViewMore}} js-ignore-click-outside">@Translate("View")</a>
1142 </div>
1143 </div>
1144 </li>
1145 {{/ifCond}}
1146 {{#ifCond template "===" "SearchMore"}}
1147 {{>SearchMore}}
1148 {{/ifCond}}
1149 {{/Product}}
1150 {{else}}
1151 <li class="dropdown__item dropdown__item--seperator dw-mod">
1152 @Translate("No products found")
1153 </li>
1154 {{/each}}
1155 </script>
1156
1157 <script id="SearchMore" type="text/x-template">
1158 <li class="dropdown__item dropdown__item--not-selectable dw-mod">
1159 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
1160 @Translate("View all")
1161 </a>
1162 </li>
1163 </script>
1164
1165 @* Templates for the mini cart *@
1166 <script id="MiniCartCounterContent" type="text/x-template">
1167 {{#.}}
1168 <div class="js-mini-cart-counter-content dw-mod">
1169 {{numberofproducts}}
1170 </div>
1171 {{/.}}
1172 </script>
1173
1174 <script id="MiniCartContent" type="text/x-template">
1175 {{#.}}
1176 <div class="mini-cart-dropdown__inner {{isempty}} dw-mod">
1177 <h4 class="u-ta-center u-no-margin u-margin-bottom u-margin-top">@Translate("Shopping cart")</h4>
1178 <div class="mini-cart-dropdown__body dw-mod">
1179 <table class="table mini-cart-table dw-mod">
1180 <thead>
1181 <tr>
1182 <td> </td>
1183 <td>@Translate("Product")</td>
1184 <td class="u-ta-right">@Translate("Qty")</td>
1185 <td class="u-ta-right" width="120">@Translate("Price")</td>
1186 </tr>
1187 </thead>
1188
1189 {{#OrderLines}}
1190 {{#ifCond template "===" "CartOrderline"}}
1191 {{>MiniCartOrderline}}
1192 {{/ifCond}}
1193 {{#ifCond template "===" "CartOrderlineMobile"}}
1194 {{>MiniCartOrderlineMobile}}
1195 {{/ifCond}}
1196 {{#ifCond template "===" "CartOrderlineDiscount"}}
1197 {{>MiniCartOrderlineDiscount}}
1198 {{/ifCond}}
1199 {{/OrderLines}}
1200
1201 <tr>
1202 <td><i class="fa fa-credit-card"></i></td>
1203 <td>{{paymentmethod}}</td>
1204 <td colspan="2" class="u-ta-right" width="130">{{paymentfee}}</td>
1205 </tr>
1206 <tr>
1207 <td><i class="fa fa-truck"></i></td>
1208 <td>{{shippingmethod}}</td>
1209 <td colspan="2" class="u-ta-right" width="130">{{shippingfee}}</td>
1210 </tr>
1211 <tr class="mini-cart-totals dw-mod">
1212 <td colspan="2">@Translate("Total")</td>
1213 <td class="u-ta-right">{{numberofproducts}}</td>
1214 <td class="u-ta-right" width="130">{{totalprice}}</td>
1215 </tr>
1216 </table>
1217 </div>
1218
1219 <table class="table mini-cart-table dw-mod">
1220 <tr class="mini-cart-orderlines__footer dw-mod">
1221 <td colspan="2"><button type="button" class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" onclick="Cart.EmptyCart(event)">@Translate("Empty cart")</button></td>
1222 <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>
1223 </tr>
1224 </table>
1225 </div>
1226 {{/.}}
1227 </script>
1228
1229 <script id="MiniCartOrderline" type="text/x-template">
1230 <tr class="{{isempty}}">
1231 <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>
1232 <td>
1233 <a href="{{link}}" class="mini-cart-orderlines__name" title="{{name}}">{{name}}</a>
1234 <a href="{{link}}" class="mini-cart-orderlines__name item-number">{{variantname}}</a>
1235 <div class="item-number">{{unitname}}</div>
1236 </td>
1237 <td class="u-ta-right">{{quantity}}</td>
1238 <td class="u-ta-right">{{totalprice}}</td>
1239 </tr>
1240 </script>
1241
1242 <script id="MiniCartOrderlineMobile" type="text/x-template">
1243 <tr class="{{isempty}}">
1244 <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>
1245 <td>
1246 <a href="{{link}}" class="mini-cart-orderlines__name">{{name}}</a>
1247 <a href="{{link}}" class="mini-cart-orderlines__name item-number">{{variantname}}</a>
1248 <div class="item-number">{{unitname}}</div>
1249 </td>
1250 <td class="u-ta-right">{{quantity}}</td>
1251 <td class="u-ta-right">{{totalprice}}</td>
1252 </tr>
1253 </script>
1254
1255 <script id="MiniCartOrderlineDiscount" type="text/x-template">
1256 <tr class="table__row--no-border {{isempty}}">
1257 <td> </td>
1258 <td><div class="mini-cart-orderlines__name dw-mod">{{name}}</div></td>
1259 <td class="u-ta-right"> </td>
1260 <td class="u-ta-right">{{totalprice}}</td>
1261 </tr>
1262 </script>
1263
1264 <!-- Javascript -->
1265 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.11.js"></script>
1266 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script>
1267
1268 @if (Model.Area.Item.GetBoolean("UseCustomJavascript"))
1269 {
1270 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script>
1271 }
1272
1273 <script>
1274 Wireframe.Init(@wireframeMode.ToLower());
1275 </script>
1276 </body>
1277 </html>
1278
1279