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&amp;crop=5&amp;Compression=75&amp;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>&nbsp;</text>@Translate("is impersonated by")<text>&nbsp;</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>&nbsp;</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>&nbsp;</td> 1258 <td><div class="mini-cart-orderlines__name dw-mod">{{name}}</div></td> 1259 <td class="u-ta-right">&nbsp;</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