Error executing template "Designs/Rapido/_parsed/ContentPage.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_6ed30aed3a7d4e62b5069dc5c20817b8.<RenderDesktopMenu>b__114_0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 4674
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 192
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<RenderDesktopNavigation>b__143_0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 5968
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<RenderMasterHeader>b__208_0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8534
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<RenderMain>b__209_0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8543
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 292
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<RenderMasterBody>b__207_0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8397
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 292
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_6ed30aed3a7d4e62b5069dc5c20817b8.Execute() in C:\inetpub\wwwroot\eCommerce\DK-FUNKI\Solutions\Rapido3.0\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8203
   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 System.Web; 4 @using Dynamicweb 5 @using Dynamicweb.Frontend 6 @using Dynamicweb.Frontend.Devices 7 @using Dynamicweb.Extensibility 8 @using Dynamicweb.Content 9 @using Dynamicweb.Security 10 @using Dynamicweb.Core 11 @using System 12 @using System.Web 13 @using System.IO 14 @using Dynamicweb.Rapido.Blocks 15 @using System.Net 16 17 18 @functions { 19 BlocksPage masterPage = BlocksPage.GetBlockPage("Master"); 20 21 string getFontFamily(params string[] items) 22 { 23 var itemParent = Pageview.AreaSettings; 24 foreach (var item in items) 25 { 26 itemParent = itemParent.GetItem(item); 27 if (itemParent == null) 28 { 29 return null; 30 } 31 } 32 33 var googleFont = itemParent.GetGoogleFont("FontFamily"); 34 if (googleFont == null) 35 { 36 return null; 37 } 38 return googleFont.Family.Replace(" ", "+"); 39 } 40 } 41 42 @{ 43 Block root = new Block 44 { 45 Id = "Root", 46 SortId = 10, 47 BlocksList = new List<Block> 48 { 49 new Block { 50 Id = "Head", 51 SortId = 10, 52 SkipRenderBlocksList = true, 53 Template = RenderMasterHead(), 54 BlocksList = new List<Block> 55 { 56 new Block { 57 Id = "HeadMetadata", 58 SortId = 10, 59 Template = RenderMasterMetadata(), 60 }, 61 new Block { 62 Id = "HeadCss", 63 SortId = 20, 64 Template = RenderMasterCss(), 65 }, 66 new Block { 67 Id = "HeadManifest", 68 SortId = 30, 69 Template = RenderMasterManifest(), 70 } 71 } 72 }, 73 new Block { 74 Id = "Body", 75 SortId = 20, 76 SkipRenderBlocksList = true, 77 Template = RenderMasterBody(), 78 BlocksList = new List<Block> 79 { 80 new Block() 81 { 82 Id = "Master", 83 SortId = 10, 84 BlocksList = new List<Block> { 85 new Block { 86 Id = "MasterTopSnippets", 87 SortId = 10 88 }, 89 new Block { 90 Id = "MasterMain", 91 SortId = 20, 92 Template = RenderMain(), 93 SkipRenderBlocksList = true, 94 BlocksList = new List<Block> { 95 new Block { 96 Id = "MasterHeader", 97 SortId = 10, 98 Template = RenderMasterHeader(), 99 SkipRenderBlocksList = true 100 }, 101 new Block { 102 Id = "MasterPageContent", 103 SortId = 20, 104 Template = RenderPageContent() 105 } 106 } 107 }, 108 new Block { 109 Id = "MasterFooter", 110 SortId = 30 111 }, 112 new Block { 113 Id = "MasterReferences", 114 SortId = 40 115 }, 116 new Block { 117 Id = "MasterBottomSnippets", 118 SortId = 50, 119 BlocksList = new List<Block> { 120 new Block { 121 Id = "iOsTabletFix", 122 SortId = 10, 123 Template = RenderIosTabletFix() 124 } 125 } 126 } 127 } 128 } 129 } 130 } 131 } 132 }; 133 134 masterPage.Add(root); 135 } 136 137 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 138 @using System.Text.RegularExpressions 139 @using System.Collections.Generic 140 @using System.Reflection 141 @using System.Web 142 @using System.Web.UI.HtmlControls 143 @using Dynamicweb.Rapido.Blocks.Components 144 @using Dynamicweb.Rapido.Blocks.Components.Articles 145 @using Dynamicweb.Rapido.Blocks.Components.Documentation 146 @using Dynamicweb.Rapido.Blocks 147 148 149 @*--- START: Base block renderers ---*@ 150 151 @helper RenderBlockList(List<Block> blocks) 152 { 153 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 154 blocks = blocks.OrderBy(item => item.SortId).ToList(); 155 156 foreach (Block item in blocks) 157 { 158 if (debug) { 159 <!-- Block START: @item.Id --> 160 } 161 162 if (item.Design == null) 163 { 164 @RenderBlock(item) 165 } 166 else if (item.Design.RenderType == RenderType.None) { 167 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 168 169 <div class="@cssClass dw-mod"> 170 @RenderBlock(item) 171 </div> 172 } 173 else if (item.Design.RenderType != RenderType.Hide) 174 { 175 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 176 177 if (!item.SkipRenderBlocksList) { 178 if (item.Design.RenderType == RenderType.Row) 179 { 180 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 181 @RenderBlock(item) 182 </div> 183 } 184 185 if (item.Design.RenderType == RenderType.Column) 186 { 187 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 188 string size = item.Design.Size ?? "12"; 189 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 190 191 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id"> 192 @RenderBlock(item) 193 </div> 194 } 195 196 if (item.Design.RenderType == RenderType.Table) 197 { 198 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 199 @RenderBlock(item) 200 </table> 201 } 202 203 if (item.Design.RenderType == RenderType.TableRow) 204 { 205 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 206 @RenderBlock(item) 207 </tr> 208 } 209 210 if (item.Design.RenderType == RenderType.TableColumn) 211 { 212 <td class="@cssClass dw-mod" id="Block__@item.Id"> 213 @RenderBlock(item) 214 </td> 215 } 216 217 if (item.Design.RenderType == RenderType.CardHeader) 218 { 219 <div class="card-header @cssClass dw-mod"> 220 @RenderBlock(item) 221 </div> 222 } 223 224 if (item.Design.RenderType == RenderType.CardBody) 225 { 226 <div class="card @cssClass dw-mod"> 227 @RenderBlock(item) 228 </div> 229 } 230 231 if (item.Design.RenderType == RenderType.CardFooter) 232 { 233 <div class="card-footer @cssClass dw-mod"> 234 @RenderBlock(item) 235 </div> 236 } 237 } 238 else 239 { 240 @RenderBlock(item) 241 } 242 } 243 244 if (debug) { 245 <!-- Block END: @item.Id --> 246 } 247 } 248 } 249 250 @helper RenderBlock(Block item) 251 { 252 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 253 254 if (item.Template != null) 255 { 256 @BlocksPage.RenderTemplate(item.Template) 257 } 258 259 if (item.Component != null) 260 { 261 string customSufix = "Custom"; 262 string methodName = item.Component.HelperName; 263 264 ComponentBase[] methodParameters = new ComponentBase[1]; 265 methodParameters[0] = item.Component; 266 Type methodType = this.GetType(); 267 268 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 269 270 try { 271 if (debug) { 272 <!-- Component: @methodName.Replace("Render", "") --> 273 } 274 if(customMethod != null) { 275 @customMethod.Invoke(this, methodParameters).ToString(); 276 } else { 277 MethodInfo generalMethod = methodType.GetMethod(methodName); 278 @generalMethod.Invoke(this, methodParameters).ToString(); 279 } 280 } catch { 281 try { 282 MethodInfo generalMethod = methodType.GetMethod(methodName); 283 @generalMethod.Invoke(this, methodParameters).ToString(); 284 } catch(Exception ex) { 285 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 286 } 287 } 288 } 289 290 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 291 { 292 @RenderBlockList(item.BlocksList) 293 } 294 } 295 296 @*--- END: Base block renderers ---*@ 297 298 299 @* Include the components *@ 300 @using Dynamicweb.Rapido.Blocks.Components 301 @using Dynamicweb.Rapido.Blocks.Components.General 302 @using Dynamicweb.Rapido.Blocks 303 @using System.IO 304 305 @* Required *@ 306 @using Dynamicweb.Rapido.Blocks.Components 307 @using Dynamicweb.Rapido.Blocks.Components.General 308 @using Dynamicweb.Rapido.Blocks 309 310 311 @helper Render(ComponentBase component) 312 { 313 if (component != null) 314 { 315 @component.Render(this) 316 } 317 } 318 319 @* Components *@ 320 @using System.Reflection 321 @using Dynamicweb.Rapido.Blocks.Components.General 322 323 324 @* Component *@ 325 326 @helper RenderIcon(Icon settings) 327 { 328 if (settings != null) 329 { 330 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 331 332 if (settings.Name != null) 333 { 334 if (string.IsNullOrEmpty(settings.Label)) 335 { 336 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 337 } 338 else 339 { 340 if (settings.LabelPosition == IconLabelPosition.Before) 341 { 342 <div class="u-flex u-flex--align-items-center @settings.CssClass">@settings.Label <i class="@settings.Prefix @settings.Name u-margin-left" @color></i></div> 343 } 344 else 345 { 346 <div class="u-flex u-flex--align-items-center @settings.CssClass"><i class="@settings.Prefix @settings.Name u-margin-right--lg u-w20px" @color></i>@settings.Label</div> 347 } 348 } 349 } 350 else if (!string.IsNullOrEmpty(settings.Label)) 351 { 352 @settings.Label 353 } 354 } 355 } 356 @using System.Reflection 357 @using Dynamicweb.Rapido.Blocks.Components.General 358 @using Dynamicweb.Rapido.Blocks.Components 359 @using Dynamicweb.Core 360 361 @* Component *@ 362 363 @helper RenderButton(Button settings) 364 { 365 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 366 { 367 Dictionary<string, string> attributes = new Dictionary<string, string>(); 368 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 369 if (settings.Disabled) { 370 attributes.Add("disabled", "true"); 371 classList.Add("disabled"); 372 } 373 374 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 375 { 376 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 377 @RenderConfirmDialog(settings); 378 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 379 } 380 381 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 382 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 383 if (!string.IsNullOrEmpty(settings.AltText)) 384 { 385 attributes.Add("title", settings.AltText); 386 } 387 else if (!string.IsNullOrEmpty(settings.Title)) 388 { 389 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty); 390 cleanTitle = cleanTitle.Replace("&nbsp;", " "); 391 attributes.Add("title", cleanTitle); 392 } 393 394 var onClickEvents = new List<string>(); 395 if (!string.IsNullOrEmpty(settings.OnClick)) 396 { 397 onClickEvents.Add(settings.OnClick); 398 } 399 if (!string.IsNullOrEmpty(settings.Href)) 400 { 401 onClickEvents.Add("location.href='" + settings.Href + "'"); 402 } 403 if (onClickEvents.Count > 0) 404 { 405 attributes.Add("onClick", string.Join(";", onClickEvents)); 406 } 407 408 if (settings.ButtonLayout != ButtonLayout.None) 409 { 410 classList.Add("btn"); 411 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 412 if (btnLayout == "linkclean") 413 { 414 btnLayout = "link-clean"; //fix 415 } 416 classList.Add("btn--" + btnLayout); 417 } 418 419 if (settings.Icon == null) 420 { 421 settings.Icon = new Icon(); 422 } 423 424 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : ""; 425 settings.Icon.Label = settings.Title; 426 427 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 428 429 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 430 } 431 } 432 433 @helper RenderConfirmDialog(Button settings) 434 { 435 Modal confirmDialog = new Modal { 436 Id = settings.Id, 437 Width = ModalWidth.Sm, 438 Heading = new Heading 439 { 440 Level = 2, 441 Title = settings.ConfirmTitle 442 }, 443 BodyText = settings.ConfirmText 444 }; 445 446 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 447 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 448 449 @Render(confirmDialog) 450 } 451 @using Dynamicweb.Rapido.Blocks.Components.General 452 @using Dynamicweb.Rapido.Blocks.Components 453 @using Dynamicweb.Core 454 455 @helper RenderDashboard(Dashboard settings) 456 { 457 var widgets = settings.GetWidgets(); 458 459 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 460 { 461 //set bg color for them 462 463 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 464 int r = Convert.ToInt16(color.R); 465 int g = Convert.ToInt16(color.G); 466 int b = Convert.ToInt16(color.B); 467 468 var count = widgets.Length; 469 var max = Math.Max(r, Math.Max(g, b)); 470 double step = 255.0 / (max * count); 471 var i = 0; 472 foreach (var widget in widgets) 473 { 474 i++; 475 476 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 477 widget.BackgroundColor = shade; 478 } 479 } 480 481 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 482 @foreach (var widget in widgets) 483 { 484 <div class="dashboard__widget"> 485 @Render(widget) 486 </div> 487 } 488 </div> 489 } 490 @using Dynamicweb.Rapido.Blocks.Components.General 491 @using Dynamicweb.Rapido.Blocks.Components 492 493 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 494 { 495 if (!string.IsNullOrEmpty(settings.Link)) 496 { 497 var backgroundStyles = ""; 498 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 499 { 500 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 501 } 502 503 <a href="@settings.Link" style="background-color:#c00" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 504 <div class="u-center-middle u-color-light"> 505 @if (settings.Icon != null) 506 { 507 settings.Icon.CssClass += "widget__icon"; 508 @Render(settings.Icon) 509 } 510 <div class="widget__title">@settings.Title</div> 511 </div> 512 </a> 513 } 514 } 515 @using Dynamicweb.Rapido.Blocks.Components.General 516 @using Dynamicweb.Rapido.Blocks.Components 517 518 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 519 { 520 var backgroundStyles = ""; 521 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 522 { 523 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 524 } 525 526 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 527 <div class="u-center-middle u-color-light"> 528 @if (settings.Icon != null) 529 { 530 settings.Icon.CssClass += "widget__icon"; 531 @Render(settings.Icon) 532 } 533 <div class="widget__counter">@settings.Count</div> 534 <div class="widget__title">@settings.Title</div> 535 </div> 536 </div> 537 } 538 @using System.Reflection 539 @using Dynamicweb.Rapido.Blocks.Components.General 540 @using Dynamicweb.Rapido.Blocks.Components 541 @using Dynamicweb.Core 542 543 @* Component *@ 544 545 @helper RenderLink(Link settings) 546 { 547 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 548 { 549 Dictionary<string, string> attributes = new Dictionary<string, string>(); 550 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 551 if (settings.Disabled) 552 { 553 attributes.Add("disabled", "true"); 554 classList.Add("disabled"); 555 } 556 557 if (!string.IsNullOrEmpty(settings.AltText)) 558 { 559 attributes.Add("title", settings.AltText); 560 } 561 else if (!string.IsNullOrEmpty(settings.Title)) 562 { 563 attributes.Add("title", settings.Title); 564 } 565 566 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 567 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 568 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 569 attributes.Add("href", settings.Href); 570 571 if (settings.ButtonLayout != ButtonLayout.None) 572 { 573 classList.Add("btn"); 574 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 575 if (btnLayout == "linkclean") 576 { 577 btnLayout = "link-clean"; //fix 578 } 579 classList.Add("btn--" + btnLayout); 580 } 581 582 if (settings.Icon == null) 583 { 584 settings.Icon = new Icon(); 585 } 586 settings.Icon.Label = settings.Title; 587 588 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 589 { 590 settings.Rel = LinkRelType.Noopener; 591 } 592 if (settings.Target != LinkTargetType.None) 593 { 594 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 595 } 596 if (settings.Download) 597 { 598 attributes.Add("download", "true"); 599 } 600 if (settings.Rel != LinkRelType.None) 601 { 602 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 603 } 604 605 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 606 } 607 } 608 @using System.Reflection 609 @using Dynamicweb.Rapido.Blocks.Components 610 @using Dynamicweb.Rapido.Blocks.Components.General 611 @using Dynamicweb.Rapido.Blocks 612 613 614 @* Component *@ 615 616 @helper RenderRating(Rating settings) 617 { 618 if (settings.Score > 0) 619 { 620 int rating = settings.Score; 621 string iconType = "fa-star"; 622 623 switch (settings.Type.ToString()) { 624 case "Stars": 625 iconType = "fa-star"; 626 break; 627 case "Hearts": 628 iconType = "fa-heart"; 629 break; 630 case "Lemons": 631 iconType = "fa-lemon"; 632 break; 633 case "Bombs": 634 iconType = "fa-bomb"; 635 break; 636 } 637 638 <div class="u-ta-right"> 639 @for (int i = 0; i < settings.OutOf; i++) 640 { 641 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 642 } 643 </div> 644 } 645 } 646 @using System.Reflection 647 @using Dynamicweb.Rapido.Blocks.Components.General 648 @using Dynamicweb.Rapido.Blocks.Components 649 650 651 @* Component *@ 652 653 @helper RenderSelectFieldOption(SelectFieldOption settings) 654 { 655 Dictionary<string, string> attributes = new Dictionary<string, string>(); 656 if (settings.Checked) { attributes.Add("selected", "true"); } 657 if (settings.Disabled) { attributes.Add("disabled", "true"); } 658 if (settings.Value != null) { attributes.Add("value", settings.Value); } 659 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 660 661 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 662 } 663 @using System.Reflection 664 @using Dynamicweb.Rapido.Blocks.Components.General 665 @using Dynamicweb.Rapido.Blocks.Components 666 667 668 @* Component *@ 669 670 @helper RenderNavigation(Navigation settings) { 671 @RenderNavigation(new 672 { 673 id = settings.Id, 674 cssclass = settings.CssClass, 675 startLevel = settings.StartLevel, 676 endlevel = settings.EndLevel, 677 expandmode = settings.Expandmode, 678 sitemapmode = settings.SitemapMode, 679 template = settings.Template 680 }) 681 } 682 @using Dynamicweb.Rapido.Blocks.Components.General 683 @using Dynamicweb.Rapido.Blocks.Components 684 685 686 @* Component *@ 687 688 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 689 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 690 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 691 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 692 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 693 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 694 settings.SitemapMode = false; 695 696 @RenderNavigation(settings) 697 } 698 @using Dynamicweb.Rapido.Blocks.Components.General 699 @using Dynamicweb.Rapido.Blocks.Components 700 701 702 @* Component *@ 703 704 @helper RenderLeftNavigation(LeftNavigation settings) { 705 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 706 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 707 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 708 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 709 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 710 711 <div class="grid__cell"> 712 @RenderNavigation(settings) 713 </div> 714 } 715 @using System.Reflection 716 @using Dynamicweb.Rapido.Blocks.Components.General 717 @using Dynamicweb.Core 718 719 @* Component *@ 720 721 @helper RenderHeading(Heading settings) 722 { 723 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 724 { 725 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 726 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 727 728 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 729 if (!string.IsNullOrEmpty(settings.Link)) 730 { 731 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 732 } 733 else 734 { 735 if (settings.Icon == null) 736 { 737 settings.Icon = new Icon(); 738 } 739 settings.Icon.Label = settings.Title; 740 @Render(settings.Icon) 741 } 742 @("</" + tagName + ">"); 743 } 744 } 745 @using Dynamicweb.Rapido.Blocks.Components 746 @using Dynamicweb.Rapido.Blocks.Components.General 747 @using Dynamicweb.Rapido.Blocks 748 749 750 @* Component *@ 751 752 @helper RenderImage(Image settings) 753 { 754 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 755 { 756 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 757 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 758 759 if (settings.Caption != null) 760 { 761 @:<div> 762 } 763 764 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 765 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 766 767 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 768 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 769 @if (settings.Link != null) 770 { 771 <a href="@settings.Link"> 772 @RenderTheImage(settings) 773 </a> 774 } 775 else 776 { 777 @RenderTheImage(settings) 778 } 779 </div> 780 </div> 781 782 if (settings.Caption != null) 783 { 784 <span class="image-caption dw-mod">@settings.Caption</span> 785 @:</div> 786 } 787 } 788 else 789 { 790 if (settings.Caption != null) 791 { 792 @:<div> 793 } 794 if (!string.IsNullOrEmpty(settings.Link)) 795 { 796 <a href="@settings.Link"> 797 @RenderTheImage(settings) 798 </a> 799 } 800 else 801 { 802 @RenderTheImage(settings) 803 } 804 805 if (settings.Caption != null) 806 { 807 <span class="image-caption dw-mod">@settings.Caption</span> 808 @:</div> 809 } 810 } 811 } 812 813 @helper RenderTheImage(Image settings) 814 { 815 if (settings != null) 816 { 817 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg"; 818 string placeholderImage = "/Files/Images/placeholder.gif"; 819 string imageEngine = "/Admin/Public/GetImage.ashx?"; 820 821 string imageStyle = ""; 822 823 switch (settings.Style) 824 { 825 case ImageStyle.Ball: 826 imageStyle = "grid__cell-img--ball"; 827 break; 828 829 case ImageStyle.Triangle: 830 imageStyle = "grid__cell-img--triangle"; 831 break; 832 } 833 834 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 835 { 836 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 837 838 if (settings.ImageDefault != null) 839 { 840 settings.ImageDefault.Height = settings.ImageDefault.Width; 841 } 842 if (settings.ImageMedium != null) 843 { 844 settings.ImageMedium.Height = settings.ImageMedium.Width; 845 } 846 if (settings.ImageSmall != null) 847 { 848 settings.ImageSmall.Height = settings.ImageSmall.Width; 849 } 850 } 851 852 string defaultImage = imageEngine; 853 string imageSmall = ""; 854 string imageMedium = ""; 855 856 if (settings.DisableImageEngine) 857 { 858 defaultImage = settings.Path; 859 } 860 else 861 { 862 if (settings.ImageDefault != null) 863 { 864 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 865 866 if (settings.Path.GetType() != typeof(string)) 867 { 868 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 869 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 870 } 871 else 872 { 873 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 874 } 875 876 defaultImage += "&AlternativeImage=" + alternativeImage; 877 } 878 879 if (settings.ImageSmall != null) 880 { 881 imageSmall = "data-src-small=\"" + imageEngine; 882 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 883 884 if (settings.Path.GetType() != typeof(string)) 885 { 886 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 887 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 888 } 889 else 890 { 891 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 892 } 893 894 imageSmall += "&alternativeImage=" + alternativeImage; 895 896 imageSmall += "\""; 897 } 898 899 if (settings.ImageMedium != null) 900 { 901 imageMedium = "data-src-medium=\"" + imageEngine; 902 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 903 904 if (settings.Path.GetType() != typeof(string)) 905 { 906 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 907 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 908 } 909 else 910 { 911 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 912 } 913 914 imageMedium += "&alternativeImage=" + alternativeImage; 915 916 imageMedium += "\""; 917 } 918 } 919 920 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 921 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 922 if (!string.IsNullOrEmpty(settings.Title)) 923 { 924 optionalAttributes.Add("alt", settings.Title); 925 optionalAttributes.Add("title", settings.Title); 926 } 927 928 if (settings.DisableLazyLoad) 929 { 930 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 931 } 932 else 933 { 934 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 935 } 936 } 937 } 938 @using System.Reflection 939 @using Dynamicweb.Rapido.Blocks.Components.General 940 @using Dynamicweb.Rapido.Blocks.Components 941 942 @* Component *@ 943 944 @helper RenderFileField(FileField settings) 945 { 946 var attributes = new Dictionary<string, string>(); 947 if (string.IsNullOrEmpty(settings.Id)) 948 { 949 settings.Id = Guid.NewGuid().ToString("N"); 950 } 951 952 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 953 if (settings.Disabled) { attributes.Add("disabled", "true"); } 954 if (settings.Required) { attributes.Add("required", "true"); } 955 if (settings.Multiple) { attributes.Add("multiple", "true"); } 956 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 957 if (string.IsNullOrEmpty(settings.ChooseFileText)) 958 { 959 settings.ChooseFileText = Translate("Choose file"); 960 } 961 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 962 { 963 settings.NoFilesChosenText = Translate("No files chosen..."); 964 } 965 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 966 967 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 968 969 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 970 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 971 972 attributes.Add("type", "file"); 973 if (settings.Value != null) { attributes.Add("value", settings.Value); } 974 settings.CssClass = "u-full-width " + settings.CssClass; 975 976 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 977 978 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 979 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 980 { 981 <div class="u-full-width"> 982 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 983 @if (settings.Link != null) { 984 <div class="u-pull--right"> 985 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 986 @Render(settings.Link) 987 </div> 988 } 989 </div> 990 991 } 992 993 @if (!string.IsNullOrEmpty(settings.HelpText)) 994 { 995 <small class="form__help-text">@settings.HelpText</small> 996 } 997 998 <div class="form__field-combi file-input u-no-margin dw-mod"> 999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 1002 @if (settings.UploadButton != null) 1003 { 1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 1005 @Render(settings.UploadButton) 1006 } 1007 </div> 1008 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1009 </div> 1010 } 1011 @using System.Reflection 1012 @using Dynamicweb.Rapido.Blocks.Components.General 1013 @using Dynamicweb.Rapido.Blocks.Components 1014 @using Dynamicweb.Core 1015 @using System.Linq 1016 1017 @* Component *@ 1018 1019 @helper RenderDateTimeField(DateTimeField settings) 1020 { 1021 if (string.IsNullOrEmpty(settings.Id)) 1022 { 1023 settings.Id = Guid.NewGuid().ToString("N"); 1024 } 1025 1026 var textField = new TextField { 1027 Name = settings.Name, 1028 Id = settings.Id, 1029 Label = settings.Label, 1030 HelpText = settings.HelpText, 1031 Value = settings.Value, 1032 Disabled = settings.Disabled, 1033 Required = settings.Required, 1034 ErrorMessage = settings.ErrorMessage, 1035 CssClass = settings.CssClass, 1036 WrapperCssClass = settings.WrapperCssClass, 1037 OnChange = settings.OnChange, 1038 OnClick = settings.OnClick, 1039 Link = settings.Link, 1040 ExtraAttributes = settings.ExtraAttributes, 1041 // 1042 Placeholder = settings.Placeholder 1043 }; 1044 1045 @Render(textField) 1046 1047 List<string> jsAttributes = new List<string>(); 1048 1049 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1050 1051 if (!string.IsNullOrEmpty(settings.DateFormat)) 1052 { 1053 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1054 } 1055 if (!string.IsNullOrEmpty(settings.MinDate)) 1056 { 1057 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1058 } 1059 if (!string.IsNullOrEmpty(settings.MaxDate)) 1060 { 1061 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1062 } 1063 if (settings.IsInline) 1064 { 1065 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1066 } 1067 if (settings.EnableTime) 1068 { 1069 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1070 } 1071 if (settings.EnableWeekNumbers) 1072 { 1073 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1074 } 1075 1076 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1077 1078 <script> 1079 document.addEventListener("DOMContentLoaded", function () { 1080 flatpickr("#@textField.Id", { 1081 @string.Join(",", jsAttributes) 1082 }); 1083 }); 1084 </script> 1085 } 1086 @using System.Reflection 1087 @using Dynamicweb.Rapido.Blocks.Components.General 1088 @using Dynamicweb.Rapido.Blocks.Components 1089 1090 @* Component *@ 1091 1092 @helper RenderTextField(TextField settings) 1093 { 1094 var attributes = new Dictionary<string, string>(); 1095 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1096 { 1097 settings.Id = Guid.NewGuid().ToString("N"); 1098 } 1099 1100 /*base settings*/ 1101 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1102 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1103 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1104 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1105 if (settings.Required) { attributes.Add("required", "true"); } 1106 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1107 /*end*/ 1108 1109 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1110 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1111 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1112 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1113 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1114 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1115 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1116 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1117 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1118 1119 settings.CssClass = "u-full-width " + settings.CssClass; 1120 1121 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1122 1123 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1124 1125 string noMargin = "u-no-margin"; 1126 if (!settings.ReadOnly) { 1127 noMargin = ""; 1128 } 1129 1130 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1131 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1132 { 1133 <div class="u-full-width"> 1134 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1135 @if (settings.Link != null) { 1136 settings.Link.ButtonLayout = ButtonLayout.LinkClean; 1137 1138 <div class="u-pull--right"> 1139 @Render(settings.Link) 1140 </div> 1141 } 1142 </div> 1143 1144 } 1145 1146 @if (!string.IsNullOrEmpty(settings.HelpText)) 1147 { 1148 <small class="form__help-text">@settings.HelpText</small> 1149 } 1150 1151 @if (settings.ActionButton != null) 1152 { 1153 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1154 <div class="form__field-combi u-no-margin dw-mod"> 1155 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1156 @Render(settings.ActionButton) 1157 </div> 1158 } 1159 else 1160 { 1161 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1162 } 1163 1164 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1165 </div> 1166 } 1167 @using System.Reflection 1168 @using Dynamicweb.Rapido.Blocks.Components.General 1169 @using Dynamicweb.Rapido.Blocks.Components 1170 1171 @* Component *@ 1172 1173 @helper RenderNumberField(NumberField settings) 1174 { 1175 var attributes = new Dictionary<string, string>(); 1176 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1177 { 1178 settings.Id = Guid.NewGuid().ToString("N"); 1179 } 1180 1181 /*base settings*/ 1182 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1183 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1184 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1185 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1186 if (settings.Required) { attributes.Add("required", "true"); } 1187 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1188 /*end*/ 1189 1190 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1191 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1192 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1193 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1194 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1195 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1196 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1197 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1198 attributes.Add("type", "number"); 1199 1200 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1201 1202 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1203 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1204 { 1205 <div class="u-full-width"> 1206 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1207 @if (settings.Link != null) { 1208 <div class="u-pull--right"> 1209 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1210 @Render(settings.Link) 1211 </div> 1212 } 1213 </div> 1214 1215 } 1216 1217 @if (!string.IsNullOrEmpty(settings.HelpText)) 1218 { 1219 <small class="form__help-text">@settings.HelpText</small> 1220 } 1221 1222 @if (settings.ActionButton != null) 1223 { 1224 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1225 <div class="form__field-combi u-no-margin dw-mod"> 1226 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1227 @Render(settings.ActionButton) 1228 </div> 1229 } 1230 else 1231 { 1232 <div class="form__field-combi u-no-margin dw-mod"> 1233 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1234 </div> 1235 } 1236 1237 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1238 </div> 1239 } 1240 @using System.Reflection 1241 @using Dynamicweb.Rapido.Blocks.Components.General 1242 @using Dynamicweb.Rapido.Blocks.Components 1243 1244 1245 @* Component *@ 1246 1247 @helper RenderTextareaField(TextareaField settings) 1248 { 1249 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1250 string id = settings.Id; 1251 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1252 { 1253 id = Guid.NewGuid().ToString("N"); 1254 } 1255 1256 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1257 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1258 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1259 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1260 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1261 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1262 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1263 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1264 if (settings.Required) { attributes.Add("required", "true"); } 1265 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1266 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1267 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1268 attributes.Add("name", settings.Name); 1269 1270 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1271 1272 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1273 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1274 { 1275 <div class="u-full-width"> 1276 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1277 @if (settings.Link != null) { 1278 <div class="u-pull--right"> 1279 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1280 @Render(settings.Link) 1281 </div> 1282 } 1283 </div> 1284 } 1285 1286 @if (!string.IsNullOrEmpty(settings.HelpText)) 1287 { 1288 <small class="form__help-text">@settings.HelpText</small> 1289 } 1290 1291 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1292 1293 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1294 </div> 1295 } 1296 @using System.Reflection 1297 @using Dynamicweb.Rapido.Blocks.Components.General 1298 @using Dynamicweb.Rapido.Blocks.Components 1299 1300 1301 @* Component *@ 1302 1303 @helper RenderHiddenField(HiddenField settings) { 1304 var attributes = new Dictionary<string, string>(); 1305 attributes.Add("type", "hidden"); 1306 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1307 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1308 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1309 1310 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1311 } 1312 @using System.Reflection 1313 @using Dynamicweb.Rapido.Blocks.Components.General 1314 @using Dynamicweb.Rapido.Blocks.Components 1315 1316 @* Component *@ 1317 1318 @helper RenderCheckboxField(CheckboxField settings) 1319 { 1320 var attributes = new Dictionary<string, string>(); 1321 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1322 { 1323 settings.Id = Guid.NewGuid().ToString("N"); 1324 } 1325 1326 /*base settings*/ 1327 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1328 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1329 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1330 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1331 if (settings.Required) { attributes.Add("required", "true"); } 1332 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1333 /*end*/ 1334 1335 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1336 1337 attributes.Add("type", "checkbox"); 1338 if (settings.Checked) { attributes.Add("checked", "true"); } 1339 settings.CssClass = "form__control " + settings.CssClass; 1340 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1341 1342 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1343 1344 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1345 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1346 @if (!string.IsNullOrEmpty(settings.Label)) 1347 { 1348 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1349 } 1350 1351 @if (settings.Link != null) { 1352 <span> 1353 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1354 @Render(settings.Link) 1355 </span> 1356 } 1357 1358 @if (!string.IsNullOrEmpty(settings.HelpText)) 1359 { 1360 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small> 1361 } 1362 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1363 </div> 1364 } 1365 @using System.Reflection 1366 @using Dynamicweb.Rapido.Blocks.Components.General 1367 @using Dynamicweb.Rapido.Blocks.Components 1368 1369 1370 @* Component *@ 1371 1372 @helper RenderCheckboxListField(CheckboxListField settings) 1373 { 1374 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1375 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1376 { 1377 <div class="u-full-width"> 1378 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1379 @if (settings.Link != null) { 1380 <div class="u-pull--right"> 1381 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1382 @Render(settings.Link) 1383 </div> 1384 } 1385 </div> 1386 1387 } 1388 1389 <div class="u-pull--left"> 1390 @if (!string.IsNullOrEmpty(settings.HelpText)) 1391 { 1392 <small class="form__help-text">@settings.HelpText</small> 1393 } 1394 1395 @foreach (var item in settings.Options) 1396 { 1397 if (settings.Required) 1398 { 1399 item.Required = true; 1400 } 1401 if (settings.Disabled) 1402 { 1403 item.Disabled = true; 1404 } 1405 if (!string.IsNullOrEmpty(settings.Name)) 1406 { 1407 item.Name = settings.Name; 1408 } 1409 if (!string.IsNullOrEmpty(settings.CssClass)) 1410 { 1411 item.CssClass += settings.CssClass; 1412 } 1413 1414 /* value is not supported */ 1415 1416 if (!string.IsNullOrEmpty(settings.OnClick)) 1417 { 1418 item.OnClick += settings.OnClick; 1419 } 1420 if (!string.IsNullOrEmpty(settings.OnChange)) 1421 { 1422 item.OnChange += settings.OnChange; 1423 } 1424 @Render(item) 1425 } 1426 1427 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1428 </div> 1429 1430 </div> 1431 } 1432 @using Dynamicweb.Rapido.Blocks.Components.General 1433 1434 @* Component *@ 1435 1436 @helper RenderSearch(Search settings) 1437 { 1438 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1439 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1440 1441 if (string.IsNullOrEmpty(settings.Id)) 1442 { 1443 settings.Id = Guid.NewGuid().ToString("N"); 1444 } 1445 1446 var resultAttributes = new Dictionary<string, string>(); 1447 1448 if (settings.PageSize != 0) 1449 { 1450 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1451 } 1452 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1453 { 1454 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1455 if (!string.IsNullOrEmpty(groupValue)) 1456 { 1457 resultAttributes.Add("data-selected-group", groupValue); 1458 } 1459 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1460 { 1461 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1462 } 1463 } 1464 resultAttributes.Add("data-force-init", "true"); 1465 if (settings.GoToFirstSearchResultOnEnter) 1466 { 1467 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1468 } 1469 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1470 { 1471 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1472 } 1473 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1474 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1475 1476 if (settings.SecondSearchData != null) 1477 { 1478 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1479 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1480 } 1481 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1482 { 1483 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1484 } 1485 1486 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1487 1488 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1489 1490 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1491 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1492 { 1493 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1494 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1495 } 1496 1497 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1498 1499 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1500 @if (settings.SecondSearchData != null) 1501 { 1502 <div class="search__column search__column--products dw-mod"> 1503 <div class="search__column-header dw-mod">@Translate("Products")</div> 1504 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1505 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1506 { 1507 @Render(new Link { 1508 Title = Translate("View all"), 1509 CssClass = "js-view-all-button u-margin", 1510 Href = settings.SearchData.ResultsPageUrl 1511 }); 1512 } 1513 </div> 1514 <div class="search__column search__column--pages dw-mod"> 1515 <div class="search__column-header">@Translate("Pages")</div> 1516 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1517 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1518 { 1519 @Render(new Link 1520 { 1521 Title = Translate("View all"), 1522 CssClass = "js-view-all-button u-margin", 1523 Href = settings.SecondSearchData.ResultsPageUrl 1524 }); 1525 } 1526 </div> 1527 } 1528 else 1529 { 1530 <div class="search__column search__column--only dw-mod"> 1531 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1532 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1533 { 1534 @Render(new Link { 1535 Title = Translate("View all"), 1536 CssClass = "js-view-all-button u-margin", 1537 Href = settings.SearchData.ResultsPageUrl 1538 }); 1539 } 1540 </div> 1541 } 1542 </div> 1543 1544 @if (settings.SearchButton != null) 1545 { 1546 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1547 if (settings.RenderDefaultSearchIcon) 1548 { 1549 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1550 } 1551 @Render(settings.SearchButton); 1552 } 1553 </div> 1554 } 1555 @using System.Reflection 1556 @using Dynamicweb.Rapido.Blocks.Components.General 1557 @using Dynamicweb.Rapido.Blocks.Components 1558 1559 1560 @* Component *@ 1561 1562 @helper RenderSelectField(SelectField settings) 1563 { 1564 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1565 { 1566 settings.Id = Guid.NewGuid().ToString("N"); 1567 } 1568 1569 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1570 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1571 { 1572 <div class="u-full-width"> 1573 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1574 @if (settings.Link != null) { 1575 <div class="u-pull--right"> 1576 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1577 @Render(settings.Link) 1578 </div> 1579 } 1580 </div> 1581 } 1582 1583 @if (!string.IsNullOrEmpty(settings.HelpText)) 1584 { 1585 <small class="form__help-text">@settings.HelpText</small> 1586 } 1587 1588 @if (settings.ActionButton != null) 1589 { 1590 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1591 <div class="form__field-combi u-no-margin dw-mod"> 1592 @RenderSelectBase(settings) 1593 @Render(settings.ActionButton) 1594 </div> 1595 } 1596 else 1597 { 1598 @RenderSelectBase(settings) 1599 } 1600 1601 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1602 </div> 1603 } 1604 1605 @helper RenderSelectBase(SelectField settings) 1606 { 1607 var attributes = new Dictionary<string, string>(); 1608 1609 /*base settings*/ 1610 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1611 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1612 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1613 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1614 if (settings.Required) { attributes.Add("required", "true"); } 1615 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1616 /*end*/ 1617 1618 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1619 1620 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1621 @if (settings.Default != null) 1622 { 1623 @Render(settings.Default) 1624 } 1625 1626 @foreach (var item in settings.Options) 1627 { 1628 if (settings.Value != null) { 1629 item.Checked = item.Value == settings.Value; 1630 } 1631 @Render(item) 1632 } 1633 </select> 1634 } 1635 @using System.Reflection 1636 @using Dynamicweb.Rapido.Blocks.Components.General 1637 @using Dynamicweb.Rapido.Blocks.Components 1638 1639 @* Component *@ 1640 1641 @helper RenderRadioButtonField(RadioButtonField settings) 1642 { 1643 var attributes = new Dictionary<string, string>(); 1644 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1645 { 1646 settings.Id = Guid.NewGuid().ToString("N"); 1647 } 1648 1649 /*base settings*/ 1650 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1651 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1652 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1653 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1654 if (settings.Required) { attributes.Add("required", "true"); } 1655 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1656 /*end*/ 1657 1658 attributes.Add("type", "radio"); 1659 if (settings.Checked) { attributes.Add("checked", "true"); } 1660 settings.CssClass = "form__control " + settings.CssClass; 1661 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1662 1663 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1664 1665 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1666 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1667 @if (!string.IsNullOrEmpty(settings.Label)) 1668 { 1669 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1670 } 1671 @if (!string.IsNullOrEmpty(settings.HelpText)) 1672 { 1673 <small class="form__help-text">@settings.HelpText</small> 1674 } 1675 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1676 </div> 1677 } 1678 @using System.Reflection 1679 @using Dynamicweb.Rapido.Blocks.Components.General 1680 @using Dynamicweb.Rapido.Blocks.Components 1681 1682 1683 @* Component *@ 1684 1685 @helper RenderRadioButtonListField(RadioButtonListField settings) 1686 { 1687 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1688 1689 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1690 @if (!string.IsNullOrEmpty(settings.Label)) 1691 { 1692 <label>@settings.Label</label> 1693 } 1694 @if (!string.IsNullOrEmpty(settings.HelpText)) 1695 { 1696 <small class="form__help-text">@settings.HelpText</small> 1697 } 1698 1699 @foreach (var item in settings.Options) 1700 { 1701 if (settings.Required) 1702 { 1703 item.Required = true; 1704 } 1705 if (settings.Disabled) 1706 { 1707 item.Disabled = true; 1708 } 1709 if (!string.IsNullOrEmpty(settings.Name)) 1710 { 1711 item.Name = settings.Name; 1712 } 1713 if (settings.Value != null && settings.Value == item.Value) 1714 { 1715 item.Checked = true; 1716 } 1717 if (!string.IsNullOrEmpty(settings.OnClick)) 1718 { 1719 item.OnClick += settings.OnClick; 1720 } 1721 if (!string.IsNullOrEmpty(settings.OnChange)) 1722 { 1723 item.OnChange += settings.OnChange; 1724 } 1725 if (!string.IsNullOrEmpty(settings.CssClass)) 1726 { 1727 item.CssClass += settings.CssClass; 1728 } 1729 @Render(item) 1730 } 1731 1732 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1733 </div> 1734 } 1735 @using System.Reflection 1736 @using Dynamicweb.Rapido.Blocks.Components.General 1737 @using Dynamicweb.Rapido.Blocks.Components 1738 1739 1740 @* Component *@ 1741 1742 @helper RenderNotificationMessage(NotificationMessage settings) 1743 { 1744 if (!string.IsNullOrEmpty(settings.Message)) 1745 { 1746 var attributes = new Dictionary<string, string>(); 1747 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1748 1749 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1750 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower(); 1751 string minHeightClass = settings.Icon != null ? "u-min-h70px" : ""; 1752 1753 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)> 1754 @if (settings.Icon != null) { 1755 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message; 1756 @Render(settings.Icon) 1757 } else { 1758 @settings.Message 1759 } 1760 </div> 1761 } 1762 } 1763 @using Dynamicweb.Rapido.Blocks.Components.General 1764 1765 1766 @* Component *@ 1767 1768 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1769 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1770 1771 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender> 1772 @if (settings.SubBlocks != null) { 1773 @RenderBlockList(settings.SubBlocks) 1774 } 1775 </div> 1776 } 1777 @using System.Reflection 1778 @using Dynamicweb.Rapido.Blocks.Components.General 1779 @using Dynamicweb.Rapido.Blocks.Components 1780 @using System.Text.RegularExpressions 1781 1782 1783 @* Component *@ 1784 1785 @helper RenderSticker(Sticker settings) { 1786 if (!String.IsNullOrEmpty(settings.Title)) { 1787 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1788 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1789 1790 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1791 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1792 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1793 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1794 optionalAttributes.Add("style", styleTag); 1795 } 1796 1797 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1798 } 1799 } 1800 1801 @using System.Reflection 1802 @using Dynamicweb.Rapido.Blocks.Components.General 1803 @using Dynamicweb.Rapido.Blocks.Components 1804 1805 1806 @* Component *@ 1807 1808 @helper RenderStickersCollection(StickersCollection settings) 1809 { 1810 if (settings.Stickers.Count > 0) 1811 { 1812 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1813 1814 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1815 @foreach (Sticker sticker in settings.Stickers) 1816 { 1817 @Render(sticker) 1818 } 1819 </div> 1820 } 1821 } 1822 1823 @using Dynamicweb.Rapido.Blocks.Components.General 1824 1825 1826 @* Component *@ 1827 1828 @helper RenderForm(Form settings) { 1829 if (settings != null) 1830 { 1831 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1832 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1833 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1834 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1835 var enctypes = new Dictionary<string, string> 1836 { 1837 { "multipart", "multipart/form-data" }, 1838 { "text", "text/plain" }, 1839 { "application", "application/x-www-form-urlencoded" } 1840 }; 1841 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1842 optionalAttributes.Add("method", settings.Method.ToString()); 1843 1844 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1845 { 1846 @settings.FormStartMarkup 1847 } 1848 else 1849 { 1850 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1851 } 1852 1853 foreach (var field in settings.GetFields()) 1854 { 1855 @Render(field) 1856 } 1857 1858 @:</form> 1859 } 1860 } 1861 @using System.Reflection 1862 @using Dynamicweb.Rapido.Blocks.Components.General 1863 @using Dynamicweb.Rapido.Blocks.Components 1864 1865 1866 @* Component *@ 1867 1868 @helper RenderText(Text settings) 1869 { 1870 @settings.Content 1871 } 1872 @using System.Reflection 1873 @using Dynamicweb.Rapido.Blocks.Components.General 1874 @using Dynamicweb.Rapido.Blocks.Components 1875 1876 1877 @* Component *@ 1878 1879 @helper RenderContentModule(ContentModule settings) { 1880 if (!string.IsNullOrEmpty(settings.Content)) 1881 { 1882 @settings.Content 1883 } 1884 } 1885 @using System.Reflection 1886 @using Dynamicweb.Rapido.Blocks.Components.General 1887 @using Dynamicweb.Rapido.Blocks.Components 1888 1889 1890 @* Component *@ 1891 1892 @helper RenderModal(Modal settings) { 1893 if (settings != null) 1894 { 1895 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1896 1897 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1898 1899 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1900 1901 <div class="modal-container"> 1902 @if (!settings.DisableDarkOverlay) 1903 { 1904 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1905 } 1906 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1907 @if (settings.Heading != null) 1908 { 1909 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1910 { 1911 <div class="modal__header"> 1912 @Render(settings.Heading) 1913 </div> 1914 } 1915 } 1916 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1917 @if (!string.IsNullOrEmpty(settings.BodyText)) 1918 { 1919 @settings.BodyText 1920 } 1921 @if (settings.BodyTemplate != null) 1922 { 1923 @settings.BodyTemplate 1924 } 1925 @{ 1926 var actions = settings.GetActions(); 1927 } 1928 </div> 1929 @if (actions.Length > 0) 1930 { 1931 <div class="modal__footer"> 1932 @foreach (var action in actions) 1933 { 1934 if (Pageview.Device.ToString() != "Mobile") { 1935 action.CssClass += " u-no-margin"; 1936 } else { 1937 action.CssClass += " u-full-width u-margin-bottom"; 1938 } 1939 1940 @Render(action) 1941 } 1942 </div> 1943 } 1944 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 1945 </div> 1946 </div> 1947 } 1948 } 1949 @using Dynamicweb.Rapido.Blocks.Components.General 1950 1951 @* Component *@ 1952 1953 @helper RenderMediaListItem(MediaListItem settings) 1954 { 1955 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1956 @if (!string.IsNullOrEmpty(settings.Label)) 1957 { 1958 if (!string.IsNullOrEmpty(settings.Link)) 1959 { 1960 @Render(new Link 1961 { 1962 Href = settings.Link, 1963 CssClass = "media-list-item__sticker dw-mod", 1964 ButtonLayout = ButtonLayout.None, 1965 Title = settings.Label, 1966 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1967 }) 1968 } 1969 else if (!string.IsNullOrEmpty(settings.OnClick)) 1970 { 1971 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1972 <span class="u-uppercase">@settings.Label</span> 1973 </span> 1974 } 1975 else 1976 { 1977 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1978 <span class="u-uppercase">@settings.Label</span> 1979 </span> 1980 } 1981 } 1982 <div class="media-list-item__wrap"> 1983 <div class="media-list-item__info dw-mod"> 1984 <div class="media-list-item__header dw-mod"> 1985 @if (!string.IsNullOrEmpty(settings.Title)) 1986 { 1987 if (!string.IsNullOrEmpty(settings.Link)) 1988 { 1989 @Render(new Link 1990 { 1991 Href = settings.Link, 1992 CssClass = "media-list-item__name dw-mod", 1993 ButtonLayout = ButtonLayout.None, 1994 Title = settings.Title, 1995 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1996 }) 1997 } 1998 else if (!string.IsNullOrEmpty(settings.OnClick)) 1999 { 2000 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 2001 } 2002 else 2003 { 2004 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 2005 } 2006 } 2007 2008 @if (!string.IsNullOrEmpty(settings.Status)) 2009 { 2010 <div class="media-list-item__state dw-mod">@settings.Status</div> 2011 } 2012 </div> 2013 @{ 2014 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 2015 } 2016 2017 @Render(settings.InfoTable) 2018 </div> 2019 <div class="media-list-item__actions dw-mod"> 2020 <div class="media-list-item__actions-list dw-mod"> 2021 @{ 2022 var actions = settings.GetActions(); 2023 2024 foreach (ButtonBase action in actions) 2025 { 2026 action.ButtonLayout = ButtonLayout.None; 2027 action.CssClass += " media-list-item__action link"; 2028 2029 @Render(action) 2030 } 2031 } 2032 </div> 2033 2034 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 2035 { 2036 settings.SelectButton.CssClass += " u-no-margin"; 2037 2038 <div class="media-list-item__action-button"> 2039 @Render(settings.SelectButton) 2040 </div> 2041 } 2042 </div> 2043 </div> 2044 </div> 2045 } 2046 @using Dynamicweb.Rapido.Blocks.Components.General 2047 @using Dynamicweb.Rapido.Blocks.Components 2048 2049 @helper RenderTable(Table settings) 2050 { 2051 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2052 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2053 2054 var enumToClasses = new Dictionary<TableDesign, string> 2055 { 2056 { TableDesign.Clean, "table--clean" }, 2057 { TableDesign.Bordered, "table--bordered" }, 2058 { TableDesign.Striped, "table--striped" }, 2059 { TableDesign.Hover, "table--hover" }, 2060 { TableDesign.Compact, "table--compact" }, 2061 { TableDesign.Condensed, "table--condensed" }, 2062 { TableDesign.NoTopBorder, "table--no-top-border" } 2063 }; 2064 string tableDesignClass = ""; 2065 if (settings.Design != TableDesign.None) 2066 { 2067 tableDesignClass = enumToClasses[settings.Design]; 2068 } 2069 2070 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 2071 2072 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2073 2074 <table @ComponentMethods.AddAttributes(resultAttributes)> 2075 @if (settings.Header != null) 2076 { 2077 <thead> 2078 @Render(settings.Header) 2079 </thead> 2080 } 2081 <tbody> 2082 @foreach (var row in settings.Rows) 2083 { 2084 @Render(row) 2085 } 2086 </tbody> 2087 @if (settings.Footer != null) 2088 { 2089 <tfoot> 2090 @Render(settings.Footer) 2091 </tfoot> 2092 } 2093 </table> 2094 } 2095 @using Dynamicweb.Rapido.Blocks.Components.General 2096 @using Dynamicweb.Rapido.Blocks.Components 2097 2098 @helper RenderTableRow(TableRow settings) 2099 { 2100 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2101 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2102 2103 var enumToClasses = new Dictionary<TableRowDesign, string> 2104 { 2105 { TableRowDesign.NoBorder, "table__row--no-border" }, 2106 { TableRowDesign.Border, "table__row--border" }, 2107 { TableRowDesign.TopBorder, "table__row--top-line" }, 2108 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2109 { TableRowDesign.Solid, "table__row--solid" } 2110 }; 2111 2112 string tableRowDesignClass = ""; 2113 if (settings.Design != TableRowDesign.None) 2114 { 2115 tableRowDesignClass = enumToClasses[settings.Design]; 2116 } 2117 2118 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2119 2120 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2121 2122 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2123 @foreach (var cell in settings.Cells) 2124 { 2125 if (settings.IsHeaderRow) 2126 { 2127 cell.IsHeader = true; 2128 } 2129 @Render(cell) 2130 } 2131 </tr> 2132 } 2133 @using Dynamicweb.Rapido.Blocks.Components.General 2134 @using Dynamicweb.Rapido.Blocks.Components 2135 @using Dynamicweb.Core 2136 2137 @helper RenderTableCell(TableCell settings) 2138 { 2139 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2140 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2141 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2142 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2143 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2144 2145 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2146 2147 string tagName = settings.IsHeader ? "th" : "td"; 2148 2149 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2150 @settings.Content 2151 @("</" + tagName + ">"); 2152 } 2153 @using System.Linq 2154 @using Dynamicweb.Rapido.Blocks.Components.General 2155 2156 @* Component *@ 2157 2158 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2159 { 2160 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2161 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2162 2163 if (settings.NumberOfPages > 1) 2164 { 2165 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2166 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2167 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2168 2169 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2170 @if (settings.ShowPagingInfo) 2171 { 2172 <div class="pager__info dw-mod"> 2173 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2174 </div> 2175 } 2176 <ul class="pager__list dw-mod"> 2177 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2178 { 2179 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2180 } 2181 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2182 { 2183 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2184 } 2185 @if (settings.GetPages().Any()) 2186 { 2187 foreach (var page in settings.GetPages()) 2188 { 2189 @Render(page) 2190 } 2191 } 2192 else 2193 { 2194 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2195 { 2196 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2197 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2198 } 2199 } 2200 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2201 { 2202 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2203 } 2204 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2205 { 2206 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2207 } 2208 </ul> 2209 </div> 2210 } 2211 } 2212 2213 @helper RenderPaginationItem(PaginationItem settings) 2214 { 2215 if (settings.Icon == null) 2216 { 2217 settings.Icon = new Icon(); 2218 } 2219 2220 settings.Icon.Label = settings.Label; 2221 <li class="pager__btn dw-mod"> 2222 @if (settings.IsActive) 2223 { 2224 <span class="pager__num pager__num--current dw-mod"> 2225 @Render(settings.Icon) 2226 </span> 2227 } 2228 else 2229 { 2230 <a href="@settings.Link" class="pager__num dw-mod"> 2231 @Render(settings.Icon) 2232 </a> 2233 } 2234 </li> 2235 } 2236 2237 2238 @using Dynamicweb.Rapido.Blocks.Components.General 2239 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2240 2241 2242 @using Dynamicweb.Frontend 2243 @using System.Reflection 2244 @using Dynamicweb.Content.Items 2245 @using System.Web.UI.HtmlControls 2246 @using Dynamicweb.Rapido.Blocks.Components 2247 @using Dynamicweb.Rapido.Blocks 2248 @using Dynamicweb.Rapido.Blocks.Components.Articles 2249 2250 @* Components for the articles *@ 2251 @using System.Reflection 2252 @using Dynamicweb.Rapido.Blocks.Components.Articles 2253 2254 2255 @* Component for the articles *@ 2256 2257 @helper RenderArticleBanner(dynamic settings) { 2258 string filterClasses = "image-filter image-filter--darken"; 2259 settings.Layout = ArticleHeaderLayout.Banner; 2260 2261 if (settings.Image != null) 2262 { 2263 if (settings.Image.Path != null) 2264 { 2265 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2266 <div class="background-image @filterClasses dw-mod"> 2267 <div class="background-image__wrapper @filterClasses dw-mod"> 2268 @{ 2269 settings.Image.CssClass += "background-image__cover dw-mod"; 2270 } 2271 @Render(settings.Image) 2272 </div> 2273 </div> 2274 <div class="center-container dw-mod"> 2275 <div class="grid"> 2276 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg"> 2277 <div class="u-left-middle"> 2278 <div> 2279 @if (!String.IsNullOrEmpty(settings.Heading)) 2280 { 2281 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2282 } 2283 @if (!String.IsNullOrEmpty(settings.Subheading)) 2284 { 2285 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2286 } 2287 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2288 { 2289 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2290 } 2291 @if (!String.IsNullOrEmpty(settings.Link)) { 2292 <div class="grid__cell"> 2293 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2294 </div> 2295 } 2296 </div> 2297 </div> 2298 </div> 2299 @if (settings.ExternalParagraphId != 0) 2300 { 2301 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod"> 2302 <div class="u-color-light-gray--bg u-color-dark dw-mod"> 2303 @RenderParagraphContent(settings.ExternalParagraphId) 2304 </div> 2305 </div> 2306 } 2307 2308 </div> 2309 </div> 2310 </section> 2311 if (!String.IsNullOrEmpty(settings.Image.Caption)) { 2312 <div class="image-caption dw-mod">@settings.Image.Caption</div> 2313 } 2314 } 2315 else 2316 { 2317 settings.Layout = ArticleHeaderLayout.Clean; 2318 @RenderArticleCleanHeader(settings); 2319 } 2320 } 2321 else 2322 { 2323 settings.Layout = ArticleHeaderLayout.Clean; 2324 @RenderArticleCleanHeader(settings); 2325 } 2326 } 2327 @using System.Reflection 2328 @using Dynamicweb.Rapido.Blocks.Components 2329 @using Dynamicweb.Rapido.Blocks.Components.General 2330 @using Dynamicweb.Rapido.Blocks.Components.Articles 2331 @using Dynamicweb.Rapido.Blocks 2332 2333 2334 @* Component for the articles *@ 2335 2336 @helper RenderArticleHeader(ArticleHeader settings) { 2337 dynamic[] methodParameters = new dynamic[1]; 2338 methodParameters[0] = settings; 2339 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom"); 2340 2341 if (customMethod != null) 2342 { 2343 @customMethod.Invoke(this, methodParameters).ToString(); 2344 } else { 2345 switch (settings.Layout) 2346 { 2347 case ArticleHeaderLayout.Clean: 2348 @RenderArticleCleanHeader(settings); 2349 break; 2350 case ArticleHeaderLayout.Split: 2351 @RenderArticleSplitHeader(settings); 2352 break; 2353 case ArticleHeaderLayout.Banner: 2354 @RenderArticleBannerHeader(settings); 2355 break; 2356 case ArticleHeaderLayout.Overlay: 2357 @RenderArticleOverlayHeader(settings); 2358 break; 2359 default: 2360 @RenderArticleCleanHeader(settings); 2361 break; 2362 } 2363 } 2364 } 2365 2366 @helper RenderArticleCleanHeader(ArticleHeader settings) { 2367 dynamic[] methodParameters = new dynamic[1]; 2368 methodParameters[0] = settings; 2369 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom"); 2370 2371 if (customMethod != null) 2372 { 2373 @customMethod.Invoke(this, methodParameters).ToString(); 2374 } 2375 else 2376 { 2377 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2378 2379 <div class="grid grid--align-content-start grid--justify-start"> 2380 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod"> 2381 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0) 2382 { 2383 <div class="u-border-bottom u-padding-bottom"> 2384 @if (!String.IsNullOrEmpty(settings.Category)) 2385 { 2386 <div class="u-pull--left"> 2387 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2388 </div> 2389 } 2390 <div class="u-pull--right"> 2391 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2392 { 2393 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small> 2394 } 2395 @if (settings.RatingOutOf != 0) 2396 { 2397 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2398 } 2399 </div> 2400 </div> 2401 } 2402 2403 <div class="grid__cell"> 2404 @if (!String.IsNullOrEmpty(settings.Heading)) 2405 { 2406 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2407 } 2408 @if (settings.Image != null) 2409 { 2410 if (settings.Image.Path != null) 2411 { 2412 <div class="u-padding-bottom--lg"> 2413 @Render(settings.Image) 2414 </div> 2415 } 2416 } 2417 @if (!String.IsNullOrEmpty(settings.Subheading)) 2418 { 2419 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2420 } 2421 @if (!String.IsNullOrEmpty(settings.Link)) 2422 { 2423 <div class="grid__cell"> 2424 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2425 </div> 2426 } 2427 </div> 2428 </div> 2429 @if (settings.ExternalParagraphId != 0) 2430 { 2431 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod"> 2432 @RenderParagraphContent(settings.ExternalParagraphId) 2433 </div> 2434 } 2435 </div> 2436 } 2437 } 2438 2439 @helper RenderArticleSplitHeader(ArticleHeader settings) { 2440 dynamic[] methodParameters = new dynamic[1]; 2441 methodParameters[0] = settings; 2442 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom"); 2443 2444 if (customMethod != null) 2445 { 2446 @customMethod.Invoke(this, methodParameters).ToString(); 2447 } 2448 else 2449 { 2450 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6"; 2451 2452 if (settings.Image != null) 2453 { 2454 if (settings.Image.Path != null) 2455 { 2456 <section class="multiple-paragraphs-container paragraph-container--full-width"> 2457 <div class="grid"> 2458 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2459 <div class="u-left-middle u-padding--lg"> 2460 <div> 2461 @if (!String.IsNullOrEmpty(settings.Category)) 2462 { 2463 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2464 } 2465 @if (!String.IsNullOrEmpty(settings.Heading)) 2466 { 2467 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2468 } 2469 @if (!String.IsNullOrEmpty(settings.Subheading)) 2470 { 2471 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2472 } 2473 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2474 { 2475 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small> 2476 } 2477 @if (settings.RatingOutOf != 0) 2478 { 2479 <div class="u-pull--right"> 2480 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2481 </div> 2482 } 2483 @if (!String.IsNullOrEmpty(settings.Link)) { 2484 <div class="u-full-width u-pull--left u-margin-top"> 2485 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2486 </div> 2487 } 2488 </div> 2489 </div> 2490 </div> 2491 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&amp;height=1100&amp;crop=0&amp;Compression=85&amp;DoNotUpscale=true&amp;image=@settings.Image.Path); background-position: center center; background-size: cover;"></div> 2492 @if (settings.ExternalParagraphId != 0) 2493 { 2494 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto u-color-light-gray--bg dw-mod"> 2495 @RenderParagraphContent(settings.ExternalParagraphId) 2496 </div> 2497 } 2498 </div> 2499 </section> 2500 } 2501 } 2502 else 2503 { 2504 @RenderArticleCleanHeader(settings); 2505 } 2506 } 2507 } 2508 2509 @helper RenderArticleOverlayHeader(ArticleHeader settings) { 2510 dynamic[] methodParameters = new dynamic[1]; 2511 methodParameters[0] = settings; 2512 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom"); 2513 2514 if (customMethod != null) 2515 { 2516 @customMethod.Invoke(this, methodParameters).ToString(); 2517 } 2518 else 2519 { 2520 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2521 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : ""; 2522 2523 if (settings.Image != null) 2524 { 2525 if (settings.Image.Path != null) 2526 { 2527 if (settings.ExternalParagraphId == 0) 2528 { 2529 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2530 <div class="background-image image-filter image-filter--darken dw-mod"> 2531 <div class="background-image__wrapper image-filter image-filter--darken dw-mod"> 2532 @{ 2533 settings.Image.CssClass += "background-image__cover dw-mod"; 2534 } 2535 @Render(settings.Image) 2536 </div> 2537 </div> 2538 <div class="center-container dw-mod"> 2539 <div class="grid @contentAlignment"> 2540 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2541 @if (!string.IsNullOrEmpty(settings.Heading)) 2542 { 2543 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2544 } 2545 @if (!String.IsNullOrEmpty(settings.Subheading)) 2546 { 2547 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2548 } 2549 <div class="u-margin-top"> 2550 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2551 { 2552 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2553 } 2554 @if (settings.RatingOutOf != 0) 2555 { 2556 <div class="u-pull--right"> 2557 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2558 </div> 2559 } 2560 </div> 2561 @if (!String.IsNullOrEmpty(settings.Link)) 2562 { 2563 <div class="grid__cell"> 2564 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2565 </div> 2566 } 2567 </div> 2568 </div> 2569 </div> 2570 </section> 2571 } 2572 else 2573 { 2574 @RenderArticleBanner(settings); 2575 } 2576 } 2577 } 2578 else 2579 { 2580 @RenderArticleCleanHeader(settings); 2581 } 2582 } 2583 } 2584 2585 @helper RenderArticleBannerHeader(dynamic settings) { 2586 dynamic[] methodParameters = new dynamic[1]; 2587 methodParameters[0] = settings; 2588 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom"); 2589 2590 if (customMethod != null) 2591 { 2592 @customMethod.Invoke(this, methodParameters).ToString(); 2593 } 2594 else 2595 { 2596 @RenderArticleBanner(settings); 2597 } 2598 } 2599 @using System.Reflection 2600 @using System.Text.RegularExpressions; 2601 @using Dynamicweb.Frontend 2602 @using Dynamicweb.Content.Items 2603 @using Dynamicweb.Rapido.Blocks.Components 2604 @using Dynamicweb.Rapido.Blocks.Components.Articles 2605 @using Dynamicweb.Rapido.Blocks 2606 2607 @* Component for the articles *@ 2608 2609 @helper RenderArticleBodyRow(ArticleBodyRow settings) 2610 { 2611 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : ""; 2612 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : ""; 2613 2614 <div class="grid grid--align-content-start @contentAlignment @position dw-mod"> 2615 @RenderBlockList(settings.SubBlocks) 2616 </div> 2617 } 2618 @using System.Reflection 2619 @using Dynamicweb.Rapido.Blocks.Components 2620 @using Dynamicweb.Rapido.Blocks.Components.General 2621 @using Dynamicweb.Rapido.Blocks.Components.Articles 2622 @using Dynamicweb.Rapido.Blocks 2623 2624 @* Component for the articles *@ 2625 2626 @helper RenderArticleImage(ArticleImage settings) 2627 { 2628 if (settings.Image != null) 2629 { 2630 if (settings.Image.Path != null) 2631 { 2632 <div class="u-margin-bottom--lg"> 2633 @Render(settings.Image) 2634 </div> 2635 } 2636 } 2637 } 2638 @using System.Reflection 2639 @using Dynamicweb.Rapido.Blocks.Components 2640 @using Dynamicweb.Rapido.Blocks.Components.Articles 2641 2642 2643 @* Component for the articles *@ 2644 2645 @helper RenderArticleSubHeader(ArticleSubHeader settings) 2646 { 2647 if (!String.IsNullOrEmpty(settings.Title)) 2648 { 2649 <h2 class="article__header">@settings.Title</h2> 2650 } 2651 } 2652 @using System.Reflection 2653 @using Dynamicweb.Rapido.Blocks.Components 2654 @using Dynamicweb.Rapido.Blocks.Components.Articles 2655 @using Dynamicweb.Rapido.Blocks 2656 2657 2658 @* Component for the articles *@ 2659 2660 @helper RenderArticleText(ArticleText settings) 2661 { 2662 if (!String.IsNullOrEmpty(settings.Text)) 2663 { 2664 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : ""; 2665 2666 <div class="article__paragraph @greatTextClass dw-mod"> 2667 @settings.Text 2668 </div> 2669 } 2670 } 2671 @using System.Reflection 2672 @using Dynamicweb.Rapido.Blocks.Components 2673 @using Dynamicweb.Rapido.Blocks.Components.Articles 2674 @using Dynamicweb.Rapido.Blocks 2675 2676 2677 @* Component for the articles *@ 2678 2679 @helper RenderArticleQuote(ArticleQuote settings) 2680 { 2681 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty); 2682 2683 <div class="grid u-padding-bottom--lg"> 2684 @if (settings.Image != null) 2685 { 2686 if (settings.Image.Path != null) { 2687 <div class="grid__col-3"> 2688 <div class="grid__cell-img"> 2689 @{ 2690 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author; 2691 settings.Image.CssClass += " article__image article__image--ball"; 2692 settings.Image.ImageDefault.Width = 200; 2693 settings.Image.ImageDefault.Height = 200; 2694 } 2695 @Render(settings.Image) 2696 </div> 2697 </div> 2698 } 2699 } 2700 <div class="grid__col-auto"> 2701 @if (!String.IsNullOrEmpty(settings.Text)) 2702 { 2703 <div class="article__quote dw-mod"> 2704 <i class="fas fa-quote-right u-margin-bottom--lg"></i> 2705 @settings.Text 2706 <i class="fas fa-quote-right"></i> 2707 </div> 2708 } 2709 @if (!String.IsNullOrEmpty(settings.Author)) 2710 { 2711 <div class="article__quote-author dw-mod"> 2712 - @settings.Author 2713 </div> 2714 } 2715 </div> 2716 </div> 2717 } 2718 @using System.Reflection 2719 @using Dynamicweb.Rapido.Blocks.Components 2720 @using Dynamicweb.Rapido.Blocks.Components.Articles 2721 @using Dynamicweb.Rapido.Blocks 2722 2723 @* Component for the articles *@ 2724 2725 @helper RenderArticleInfoTable(ArticleInfoTable settings) 2726 { 2727 <table class="table table--clean"> 2728 @foreach (var row in settings.Rows) 2729 { 2730 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two"; 2731 2732 <tr> 2733 @if (!String.IsNullOrEmpty(row.Icon)) 2734 { 2735 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td> 2736 } 2737 <td class="u-no-margin-on-p-elements"> 2738 <div class="u-bold">@row.Title</div> 2739 @if (!String.IsNullOrEmpty(row.SubTitle)) 2740 { 2741 if (row.Link == null) 2742 { 2743 <div>@row.SubTitle</div> 2744 } 2745 else 2746 { 2747 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a> 2748 } 2749 } 2750 </td> 2751 </tr> 2752 } 2753 </table> 2754 } 2755 @using System.Reflection 2756 @using Dynamicweb.Rapido.Blocks.Components 2757 @using Dynamicweb.Rapido.Blocks.Components.General 2758 @using Dynamicweb.Rapido.Blocks.Components.Articles 2759 @using Dynamicweb.Rapido.Blocks 2760 2761 @* Component for the articles *@ 2762 2763 @helper RenderArticleGalleryModal(ArticleGalleryModal settings) 2764 { 2765 Modal galleryModal = new Modal 2766 { 2767 Id = "ParagraphGallery", 2768 Width = ModalWidth.Full, 2769 BodyTemplate = RenderArticleGalleryModalContent() 2770 }; 2771 2772 @Render(galleryModal) 2773 } 2774 2775 @helper RenderArticleGalleryModalContent() { 2776 <div class="modal__image-min-size-wrapper"> 2777 @Render(new Image { 2778 Id = "ParagraphGallery", 2779 Path = "#", 2780 CssClass = "modal--full__img", 2781 DisableLazyLoad = true, 2782 DisableImageEngine = true 2783 }) 2784 </div> 2785 2786 <div class="modal__images-counter" id="ParagraphGallery_counter"></div> 2787 2788 @Render(new Button { 2789 Id = "ParagraphGallery_prev", 2790 ButtonType = ButtonType.Button, 2791 ButtonLayout = ButtonLayout.None, 2792 CssClass = "modal__prev-btn", 2793 Icon = new Icon { Prefix = "far", Name = "fa-angle-left", LabelPosition = IconLabelPosition.After }, 2794 OnClick = "Gallery.prevImage('ParagraphGallery')" 2795 }) 2796 2797 @Render(new Button { 2798 Id = "ParagraphGallery_next", 2799 ButtonType = ButtonType.Button, 2800 ButtonLayout = ButtonLayout.None, 2801 CssClass = "modal__next-btn", 2802 Icon = new Icon { Prefix = "far", Name = "fa-angle-right", LabelPosition = IconLabelPosition.After }, 2803 OnClick = "Gallery.nextImage('ParagraphGallery')" 2804 }) 2805 } 2806 @using System.Reflection 2807 @using Dynamicweb.Rapido.Blocks.Components 2808 @using Dynamicweb.Rapido.Blocks.Components.Articles 2809 @using Dynamicweb.Rapido.Blocks 2810 2811 2812 @* Component for the articles *@ 2813 2814 @helper RenderArticleRelated(ArticleRelated settings) 2815 { 2816 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : ""; 2817 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : ""; 2818 2819 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width"> 2820 <div class="center-container dw-mod"> 2821 <div class="grid u-padding"> 2822 <div class="grid__col-md-12 grid__col-xs-12"> 2823 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2> 2824 </div> 2825 </div> 2826 2827 <div class="js-handlebars-root u-padding" id="@settings.Title.Replace(" ", String.Empty)" data-template="RelatedSimpleTemplate" data-json-feed="/Default.aspx?ID=@settings.FeedPageId&@settings.Query&ExcludeItemID=@settings.CurrentPageId&PageSize=@settings.PageSize"></div> 2828 2829 <script id="RelatedSimpleTemplate" type="text/x-template"> 2830 {{#.}} 2831 <div class="grid u-padding-bottom--lg"> 2832 {{#Cases}} 2833 <div class="grid__col-lg-3 grid__col-sm-6 image-hover--zoom dw-mod"> 2834 <a href="{{link}}" class="u-full-height u-color-light--bg u-flex u-flex--column"> 2835 {{#if image}} 2836 <div class="u-color-light--bg u-no-padding dw-mod"> 2837 <div class="flex-img image-hover__wrapper"> 2838 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=680&height=314&amp;crop=1&amp;DoNotUpscale=True&amp;Compression=75&amp;image={{image}}" alt="{{title}}" /> 2839 </div> 2840 </div> 2841 {{/if}} 2842 2843 <div class="card u-color-light--bg u-full-height dw-mod"> 2844 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3> 2845 <p class="article__short-summary dw-mod">{{summary}}</p> 2846 </div> 2847 </a> 2848 </div> 2849 {{/Cases}} 2850 </div> 2851 {{/.}} 2852 </script> 2853 </div> 2854 </section> 2855 } 2856 @using System.Reflection 2857 @using Dynamicweb.Rapido.Blocks.Components 2858 @using Dynamicweb.Rapido.Blocks.Components.Articles 2859 @using Dynamicweb.Rapido.Blocks 2860 2861 2862 @* Component for the articles *@ 2863 2864 @helper RenderArticleMenu(ArticleMenu settings) 2865 { 2866 if (!String.IsNullOrEmpty(settings.Title)) { 2867 <div class="u-margin u-border-bottom"> 2868 <h3 class="u-no-margin">@settings.Title</h3> 2869 </div> 2870 } 2871 2872 <ul class="menu-left u-margin-bottom dw-mod"> 2873 @foreach (var item in settings.Items) 2874 { 2875 @Render(item) 2876 } 2877 </ul> 2878 } 2879 2880 @helper RenderArticleMenuItem(ArticleMenuItem settings) 2881 { 2882 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#"; 2883 2884 if (!String.IsNullOrEmpty(settings.Title)) { 2885 <li class="menu-left__item dw-mod"> 2886 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a> 2887 </li> 2888 } 2889 } 2890 @using System.Reflection 2891 @using Dynamicweb.Rapido.Blocks.Components 2892 @using Dynamicweb.Rapido.Blocks.Components.Articles 2893 @using Dynamicweb.Rapido.Blocks 2894 2895 @* Component for the articles *@ 2896 2897 @helper RenderArticleList(ArticleList settings) 2898 { 2899 if (Pageview != null) 2900 { 2901 bool isParagraph = Pageview.CurrentParagraph != null ? true : false; 2902 string[] sortArticlesListBy = new string[2]; 2903 2904 if (isParagraph) { 2905 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2906 } 2907 else { 2908 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2909 } 2910 2911 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString(); 2912 2913 if (!settings.DisablePagination) { 2914 @RenderItemList(new 2915 { 2916 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2917 ListSourceType = settings.SourceType, 2918 ListSourcePage = sourcePage, 2919 ItemFieldsList = "*", 2920 Filter = settings.Filter, 2921 ListOrderBy = sortArticlesListBy[0], 2922 ListOrderByDirection = sortArticlesListBy[1], 2923 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2924 ListSecondOrderByDirection = "ASC", 2925 IncludeAllChildItems = true, 2926 ListTemplate = settings.Template, 2927 ListPageSize = settings.PageSize.ToString() 2928 }); 2929 } else { 2930 @RenderItemList(new 2931 { 2932 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2933 ListSourceType = settings.SourceType, 2934 ListSourcePage = sourcePage, 2935 ItemFieldsList = "*", 2936 Filter = settings.Filter, 2937 ListOrderBy = sortArticlesListBy[0], 2938 ListOrderByDirection = sortArticlesListBy[1], 2939 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2940 ListSecondOrderByDirection = "ASC", 2941 IncludeAllChildItems = true, 2942 ListTemplate = settings.Template, 2943 ListPageSize = settings.PageSize.ToString(), 2944 ListViewMode = "Partial", 2945 ListShowTo = settings.PageSize + 1 2946 }); 2947 } 2948 } 2949 } 2950 @using System.Reflection 2951 @using Dynamicweb.Rapido.Blocks.Components.Articles 2952 2953 2954 @* Component for the articles *@ 2955 2956 @helper RenderArticleSummary(ArticleSummary settings) 2957 { 2958 if (!String.IsNullOrEmpty(settings.Text)) 2959 { 2960 <div class="article__summary dw-mod">@settings.Text</div> 2961 } 2962 } 2963 @using System.Reflection 2964 @using Dynamicweb.Rapido.Blocks.Components 2965 @using Dynamicweb.Rapido.Blocks.Components.Articles 2966 @using Dynamicweb.Rapido.Blocks 2967 2968 @* Component for the articles *@ 2969 2970 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings) 2971 { 2972 string pageId = Pageview.ID.ToString(); 2973 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All"); 2974 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 2975 2976 foreach (var option in settings.Categories) 2977 { 2978 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter; 2979 } 2980 2981 if (selectedFilter == pageId) 2982 { 2983 selectedFilter = Translate("All"); 2984 } 2985 2986 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 2987 { 2988 <div class="u-pull--right u-margin-left"> 2989 <div class="collection u-no-margin"> 2990 <h5>@Translate("Category")</h5> 2991 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 2992 <div class="dropdown u-w180px dw-mod"> 2993 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 2994 <div class="dropdown__content dw-mod"> 2995 @foreach (var option in settings.Categories) 2996 { 2997 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 2998 } 2999 </div> 3000 <label class="dropdown-trigger-off" for="CategorySelector"></label> 3001 </div> 3002 </div> 3003 </div> 3004 } 3005 else 3006 { 3007 <div class="u-full-width u-margin-bottom"> 3008 <h5 class="u-no-margin">@Translate("Category")</h5> 3009 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 3010 <div class="dropdown u-full-width dw-mod"> 3011 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 3012 <div class="dropdown__content dw-mod"> 3013 @foreach (var option in settings.Categories) 3014 { 3015 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 3016 } 3017 </div> 3018 <label class="dropdown-trigger-off" for="CategorySelector"></label> 3019 </div> 3020 </div> 3021 } 3022 } 3023 @using System.Reflection 3024 @using Dynamicweb.Rapido.Blocks.Components 3025 @using Dynamicweb.Rapido.Blocks.Components.Articles 3026 @using Dynamicweb.Rapido.Blocks 3027 @using System.Collections.Generic 3028 3029 @* Component for the articles *@ 3030 3031 @helper RenderArticleListFilter(ArticleListFilter settings) 3032 { 3033 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All"); 3034 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 3035 3036 if (settings.Options != null) 3037 { 3038 if (settings.Options is IEnumerable<dynamic>) 3039 { 3040 var options = (IEnumerable<dynamic>) settings.Options; 3041 settings.Options = options.OrderBy(item => item.Name); 3042 } 3043 3044 foreach (var option in settings.Options) 3045 { 3046 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter; 3047 } 3048 3049 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 3050 { 3051 <div class="u-pull--right u-margin-left"> 3052 <div class="collection u-no-margin"> 3053 <h5>@settings.Label</h5> 3054 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 3055 <div class="dropdown u-w180px dw-mod"> 3056 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 3057 <div class="dropdown__content dw-mod"> 3058 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 3059 @foreach (var option in settings.Options) 3060 { 3061 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 3062 } 3063 </div> 3064 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 3065 </div> 3066 </div> 3067 </div> 3068 } 3069 else 3070 { 3071 <div class="u-full-width u-margin-bottom"> 3072 <h5 class="u-no-margin">@settings.Label</h5> 3073 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 3074 <div class="dropdown u-full-width w-mod"> 3075 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 3076 <div class="dropdown__content dw-mod"> 3077 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 3078 @foreach (var option in settings.Options) 3079 { 3080 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 3081 } 3082 </div> 3083 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 3084 </div> 3085 </div> 3086 } 3087 } 3088 } 3089 @using System.Reflection 3090 @using Dynamicweb.Rapido.Blocks.Components 3091 @using Dynamicweb.Rapido.Blocks.Components.Articles 3092 @using Dynamicweb.Rapido.Blocks 3093 3094 @* Component for the articles *@ 3095 3096 @helper RenderArticleListSearch(ArticleListSearch settings) 3097 { 3098 string searchParameter = !string.IsNullOrEmpty(settings.SearchParameter) ? settings.SearchParameter : "Title"; 3099 string searchWord = HttpContext.Current.Request.QueryString.Get(searchParameter); 3100 string searchString = !string.IsNullOrEmpty(searchWord) ? searchWord.Trim('*') : ""; 3101 string className = "u-w340px u-pull--right u-margin-left"; 3102 3103 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3104 { 3105 className = "u-full-width"; 3106 } 3107 3108 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className"> 3109 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('@searchParameter', '*' + document.getElementById('ArticleListSearchInput').value + '*')"> 3110 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button> 3111 </div> 3112 } 3113 @using System.Reflection 3114 @using Dynamicweb.Rapido.Blocks.Components 3115 @using Dynamicweb.Rapido.Blocks.Components.Articles 3116 @using Dynamicweb.Rapido.Blocks 3117 3118 @* Component for the articles *@ 3119 3120 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings) 3121 { 3122 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div> 3123 } 3124 @using System.Reflection 3125 @using Dynamicweb.Rapido.Blocks.Components 3126 @using Dynamicweb.Rapido.Blocks.Components.General 3127 @using Dynamicweb.Rapido.Blocks.Components.Articles 3128 @using Dynamicweb.Rapido.Blocks 3129 @using System.Text.RegularExpressions 3130 3131 @* Component for the articles *@ 3132 3133 @helper RenderArticleListItem(ArticleListItem settings) 3134 { 3135 switch (settings.Type) { 3136 case ArticleListItemType.Card: 3137 @RenderArticleListItemCard(settings); 3138 break; 3139 case ArticleListItemType.List: 3140 @RenderArticleListItemList(settings); 3141 break; 3142 case ArticleListItemType.Simple: 3143 @RenderArticleListItemSimple(settings); 3144 break; 3145 default: 3146 @RenderArticleListItemCard(settings); 3147 break; 3148 } 3149 } 3150 3151 @helper RenderArticleListItemCard(ArticleListItem settings) { 3152 <a href="@settings.Link" class="u-full-height u-color-light--bg u-flex u-flex--column"> 3153 <div class="u-color-light--bg u-no-padding dw-mod"> 3154 @if (settings.Logo != null) 3155 { 3156 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3157 settings.Logo.ImageDefault.Crop = 5; 3158 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3159 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3160 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3161 @if (settings.Stickers != null) 3162 { 3163 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None) 3164 { 3165 @Render(settings.Stickers); 3166 } 3167 } 3168 @RenderImage(settings.Logo) 3169 </div> 3170 } else if (settings.Image != null) 3171 { 3172 <div class="flex-img image-hover__wrapper u-position-relative dw-mod"> 3173 @if (settings.Stickers != null) 3174 { 3175 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None) 3176 { 3177 @Render(settings.Stickers); 3178 } 3179 } 3180 @Render(settings.Image) 3181 </div> 3182 } 3183 </div> 3184 3185 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3186 { 3187 <div class="card u-color-light--bg u-full-height dw-mod"> 3188 @if (settings.Stickers != null) 3189 { 3190 if (settings.Stickers.Position == StickersListPosition.Custom) 3191 { 3192 @Render(settings.Stickers); 3193 } 3194 } 3195 @if (!String.IsNullOrEmpty(settings.Title)) 3196 { 3197 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3198 } 3199 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3200 { 3201 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3202 } 3203 @if (!String.IsNullOrEmpty(settings.Summary)) 3204 { 3205 <p class="article__short-summary dw-mod">@settings.Summary</p> 3206 } 3207 </div> 3208 } 3209 </a> 3210 } 3211 3212 @helper RenderArticleListItemList(ArticleListItem settings) { 3213 <a href="@settings.Link"> 3214 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3215 <div class="grid__col-md-3"> 3216 <div class="u-color-light--bg u-no-padding dw-mod"> 3217 @if (settings.Logo != null) 3218 { 3219 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3220 settings.Logo.ImageDefault.Crop = 5; 3221 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3222 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3223 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3224 @if (settings.Stickers != null) 3225 { 3226 if (settings.Stickers.Position != StickersListPosition.Custom) 3227 { 3228 @Render(settings.Stickers); 3229 } 3230 } 3231 @RenderImage(settings.Logo) 3232 </div> 3233 } else if (settings.Image != null) 3234 { 3235 <div class="flex-img image-hover__wrapper dw-mod"> 3236 @if (settings.Stickers != null) 3237 { 3238 if (settings.Stickers.Position != StickersListPosition.Custom) 3239 { 3240 @Render(settings.Stickers); 3241 } 3242 } 3243 @Render(settings.Image) 3244 </div> 3245 } 3246 </div> 3247 </div> 3248 3249 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3250 { 3251 <div class="grid__col-md-9"> 3252 @if (!String.IsNullOrEmpty(settings.Title)) 3253 { 3254 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3255 } 3256 @if (settings.Stickers != null) 3257 { 3258 if (settings.Stickers.Position == StickersListPosition.Custom) 3259 { 3260 @Render(settings.Stickers); 3261 } 3262 } 3263 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3264 { 3265 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3266 } 3267 @if (!String.IsNullOrEmpty(settings.Summary)) 3268 { 3269 <p class="article__short-summary dw-mod">@settings.Summary</p> 3270 } 3271 </div> 3272 } 3273 </div> 3274 </a> 3275 } 3276 3277 @helper RenderArticleListItemSimple(ArticleListItem settings) { 3278 <a href="@settings.Link" class="u-color-inherit"> 3279 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3280 <div class="grid__col-md-12"> 3281 @if (!String.IsNullOrEmpty(settings.Title)) 3282 { 3283 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div> 3284 } 3285 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3286 { 3287 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3288 } 3289 </div> 3290 </div> 3291 </a> 3292 } 3293 @using System.Reflection 3294 @using Dynamicweb.Rapido.Blocks.Components.Articles 3295 3296 3297 @* Component for the articles *@ 3298 3299 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings) 3300 { 3301 <small class="article__subscription"> 3302 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3303 { 3304 <text>@Translate("Written")</text> 3305 } 3306 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3307 { 3308 <text>@Translate("by") @settings.Author</text> 3309 } 3310 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3311 { 3312 <text>@Translate("on") @settings.Date</text> 3313 } 3314 </small> 3315 } 3316 @using System.Reflection 3317 @using Dynamicweb.Rapido.Blocks.Components.Articles 3318 @using Dynamicweb.Rapido.Blocks.Components.General 3319 3320 3321 @* Component for the articles *@ 3322 3323 @helper RenderArticleLink(ArticleLink settings) 3324 { 3325 if (!string.IsNullOrEmpty(settings.Title)) 3326 { 3327 Button link = new Button { 3328 ConfirmText = settings.ConfirmText, 3329 ConfirmTitle = settings.ConfirmTitle, 3330 ButtonType = settings.ButtonType, 3331 Id = settings.Id, 3332 Title = settings.Title, 3333 AltText = settings.AltText, 3334 OnClick = settings.OnClick, 3335 CssClass = settings.CssClass, 3336 Disabled = settings.Disabled, 3337 Icon = settings.Icon, 3338 Name = settings.Name, 3339 Href = settings.Href, 3340 ButtonLayout = settings.ButtonLayout, 3341 ExtraAttributes = settings.ExtraAttributes 3342 }; 3343 <div class="grid__cell"> 3344 @Render(link) 3345 </div> 3346 } 3347 } 3348 @using System.Reflection 3349 @using Dynamicweb.Rapido.Blocks 3350 @using Dynamicweb.Rapido.Blocks.Components.Articles 3351 @using Dynamicweb.Rapido.Blocks.Components.General 3352 3353 3354 @* Component for the articles *@ 3355 3356 @helper RenderArticleCarousel(ArticleCarousel settings) 3357 { 3358 <div class="grid"> 3359 <div class="grid__col-12 u-no-padding u-margin-bottom"> 3360 <div class="carousel" id="carousel_@settings.Id"> 3361 <div class="carousel__container js-carousel-slides dw-mod"> 3362 @RenderBlockList(settings.SubBlocks) 3363 </div> 3364 </div> 3365 </div> 3366 </div> 3367 3368 <script> 3369 document.addEventListener("DOMContentLoaded", function () { 3370 new CarouselModule("#carousel_@settings.Id", { 3371 slideTime: 0, 3372 dots: true 3373 }); 3374 }); 3375 </script> 3376 } 3377 3378 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings) 3379 { 3380 string imageEngine = "/Admin/Public/GetImage.ashx?"; 3381 3382 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image; 3383 if (settings.ImageSettings != null) 3384 { 3385 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : ""; 3386 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : ""; 3387 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&"; 3388 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&"; 3389 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&"; 3390 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&"; 3391 } 3392 defaultImage += "&Image=" + settings.Image; 3393 3394 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')"> 3395 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title"> 3396 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2> 3397 <div class="article-list__item-info"> 3398 @if (settings.Stickers != null) 3399 { 3400 settings.Stickers.Position = StickersListPosition.Custom; 3401 @Render(settings.Stickers); 3402 } 3403 3404 <small class="u-margin-top--lg u-color-light"> 3405 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3406 { 3407 <text>@Translate("Written")</text> 3408 } 3409 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3410 { 3411 <text>@Translate("by") @settings.Author</text> 3412 } 3413 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3414 { 3415 <text>@Translate("on") @settings.Date</text> 3416 } 3417 </small> 3418 </div> 3419 3420 <h3 class="article__short-summary u-color-light">@settings.Summary</h3> 3421 </a> 3422 @if (settings.UseFilters == true) 3423 { 3424 <div class="background-image image-filter image-filter--darken dw-mod"></div> 3425 } 3426 </div> 3427 } 3428 @using System.Text.RegularExpressions 3429 @using Dynamicweb.Rapido.Blocks.Components 3430 @using Dynamicweb.Rapido.Blocks.Components.General 3431 @using Dynamicweb.Rapido.Blocks.Components.Articles 3432 @using Dynamicweb.Rapido.Blocks 3433 3434 @* Component for the articles *@ 3435 3436 @helper RenderArticleVideo(ArticleVideo settings) 3437 { 3438 if (settings.Url != null) 3439 { 3440 //getting video ID from youtube URL 3441 string videoCode = settings.Url; 3442 Regex regex = new Regex(@".be\/(.[^?]*)"); 3443 Match match = regex.Match(videoCode); 3444 string videoId = ""; 3445 if (match.Success) 3446 { 3447 videoId = match.Groups[1].Value; 3448 } 3449 else 3450 { 3451 regex = new Regex(@"v=([^&]+)"); 3452 match = regex.Match(videoCode); 3453 if (match.Success) 3454 { 3455 videoId = match.Groups[1].Value; 3456 } 3457 } 3458 3459 int autoPlay = settings.AutoPlay == "true" ? 1 : 0; 3460 3461 <div class="video-wrapper"> 3462 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div> 3463 </div> 3464 } 3465 } 3466 3467 3468 3469 @* Simple helpers *@ 3470 3471 @*Requires the Gallery ItemType that comes with Rapido*@ 3472 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) { 3473 if (gallery != null && gallery.Count > 0) 3474 { 3475 int count = 1; 3476 3477 foreach (var item in gallery) 3478 { 3479 if (item.GetFile("ImagePath") != null) 3480 { 3481 string image = item.GetFile("ImagePath").PathUrlEncoded; 3482 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&amp;height=820&amp;crop=5&amp;Compression=75&amp;DoNotUpscale=1&amp;image="; 3483 int imagesCount = gallery.Count; 3484 3485 if (count == 1) 3486 { 3487 <label class="gallery" for="ParagraphGalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))"> 3488 <span class="gallery__main-image"> 3489 <img src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=1&amp;image=@image" class="b-lazy flex-img js-gallery" alt="" data-for="ParagraphGallery" data-image="@imagePrefix@image" /> 3490 </span> 3491 <span class="gallery__image-counter"> 3492 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span> 3493 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span> 3494 </span> 3495 </label> 3496 } 3497 else 3498 { 3499 <div class="u-hidden js-gallery" data-for="ParagraphGallery" data-image="@imagePrefix@image"></div> 3500 } 3501 3502 count++; 3503 } 3504 } 3505 3506 @Render(new ArticleGalleryModal()) 3507 } 3508 } 3509 3510 @helper RenderMobileFilters(List<Block> subBlocks) 3511 { 3512 if (subBlocks.Count > 0) 3513 { 3514 <div class="grid__col-12"> 3515 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" /> 3516 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters"> 3517 @RenderBlockList(subBlocks) 3518 </div> 3519 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label> 3520 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label> 3521 </div> 3522 } 3523 } 3524 3525 3526 @* Include the Blocks for the page *@ 3527 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3528 3529 @using System 3530 @using System.Web 3531 @using System.Collections.Generic 3532 @using Dynamicweb.Rapido.Blocks.Extensibility 3533 @using Dynamicweb.Rapido.Blocks 3534 3535 @functions { 3536 string GoogleTagManagerID = ""; 3537 string GoogleAnalyticsID = ""; 3538 } 3539 3540 @{ 3541 GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"); 3542 GoogleAnalyticsID = Model.Area.Item.GetItem("Settings").GetString("GoogleAnalyticsTrackingID"); 3543 3544 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 3545 3546 /* if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID)) 3547 { 3548 Block tagManager = new Block() 3549 { 3550 Id = "GoogleAnalytics", 3551 SortId = 0, 3552 Template = RenderGoogleAnalyticsSnippet() 3553 }; 3554 topSnippetsBlocksPage.Add("Head", tagManager); 3555 } 3556 3557 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID)) 3558 { 3559 Block tagManager = new Block() 3560 { 3561 Id = "TagManager", 3562 SortId = 1, 3563 Template = RenderGoogleTagManager() 3564 }; 3565 topSnippetsBlocksPage.Add("Head", tagManager); 3566 3567 Block tagManagerBodySnippet = new Block() 3568 { 3569 Id = "TagManagerBodySnippet", 3570 SortId = 1, 3571 Template = RenderGoogleTagManagerBodySnippet() 3572 }; 3573 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet); 3574 } 3575 3576 Block facebookPixel = new Block() 3577 { 3578 Id = "FacebookPixel", 3579 SortId = 2, 3580 Template = RenderFacebookPixel() 3581 }; 3582 3583 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel); 3584 */ 3585 } 3586 3587 @helper RenderGoogleAnalyticsSnippet() 3588 { 3589 <!-- Global site tag (gtag.js) - Google Analytics --> 3590 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script> 3591 <script> 3592 window.dataLayer = window.dataLayer || []; 3593 function gtag(){dataLayer.push(arguments);} 3594 gtag('js', new Date()); 3595 3596 gtag('config', '@GoogleAnalyticsID'); 3597 </script> 3598 3599 } 3600 3601 @helper RenderGoogleTagManager() 3602 { 3603 <script> 3604 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 3605 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 3606 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 3607 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 3608 })(window,document,'script','dataLayer','@GoogleTagManagerID'); 3609 </script> 3610 } 3611 3612 @helper RenderGoogleTagManagerBodySnippet() 3613 { 3614 <!-- Google Tag Manager (noscript) --> 3615 <noscript> 3616 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID" 3617 height="0" width="0" style="display:none;visibility:hidden"></iframe> 3618 </noscript> 3619 <!-- End Google Tag Manager (noscript) --> 3620 } 3621 3622 @helper RenderFacebookPixel() 3623 { 3624 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 3625 3626 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 3627 { 3628 <!-- Facebook Pixel Code --> 3629 <script> 3630 !function(f,b,e,v,n,t,s) 3631 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 3632 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 3633 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 3634 n.queue=[];t=b.createElement(e);t.async=!0; 3635 t.src=v;s=b.getElementsByTagName(e)[0]; 3636 s.parentNode.insertBefore(t,s)}(window, document,'script', 3637 'https://connect.facebook.net/en_US/fbevents.js'); 3638 fbq('init', '@FacebookPixelID'); 3639 fbq('track', 'PageView'); 3640 </script> 3641 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript> 3642 } 3643 } 3644 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3645 3646 @using System 3647 @using System.Web 3648 @using System.Collections.Generic 3649 @using Dynamicweb.Rapido.Blocks 3650 @using Dynamicweb.Rapido.Blocks.Extensibility 3651 @using Dynamicweb.Security.UserManagement 3652 @using Dynamicweb.Security.UserManagement.ExternalAuthentication 3653 @using Dynamicweb.Rapido.Blocks.Components.General 3654 3655 @{ 3656 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master"); 3657 3658 Block loginModal = new Block() 3659 { 3660 Id = "LoginModal", 3661 SortId = 10, 3662 Component = new Modal 3663 { 3664 Id = "SignIn", 3665 Heading = new Heading 3666 { 3667 Level = 0, 3668 Title = Translate("Sign in") 3669 }, 3670 Width = ModalWidth.Sm, 3671 BodyTemplate = RenderLoginForm() 3672 } 3673 }; 3674 3675 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal); 3676 } 3677 3678 @helper RenderLoginForm() 3679 { 3680 int pageId = Model.TopPage.ID; 3681 string userSignedInErrorText = ""; 3682 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 3683 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 3684 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 3685 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Pageview.Page.ID != GetPageIdByNavigationTag("SignInPage") && Model.LogOnFailed; 3686 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 3687 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 3688 3689 ProviderCollection providers = Provider.GetActiveProviders(); 3690 3691 if (Model.LogOnFailed) 3692 { 3693 switch (Model.LogOnFailedReason) 3694 { 3695 case LogOnFailedReason.PasswordLengthInvalid: 3696 userSignedInErrorText = Translate("Password length is invalid"); 3697 break; 3698 case LogOnFailedReason.IncorrectLogin: 3699 userSignedInErrorText = Translate("Invalid email or password"); 3700 break; 3701 case LogOnFailedReason.ExceededFailedLogOnLimit: 3702 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked"); 3703 break; 3704 case LogOnFailedReason.LoginLocked: 3705 userSignedInErrorText = Translate("The user account is temporarily locked"); 3706 break; 3707 case LogOnFailedReason.PasswordExpired: 3708 userSignedInErrorText = Translate("The password has expired and needs to be renewed"); 3709 break; 3710 default: 3711 userSignedInErrorText = Translate("An unknown error occured"); 3712 break; 3713 } 3714 } 3715 3716 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm" }; 3717 3718 TextField passwordField = new TextField { Id = "login-password", Type = TextFieldType.Password, Name = "password", Label = Translate("Password"), Required = true }; 3719 3720 if (!hideForgotPasswordLink) { 3721 passwordField.Link = new Link { Title = Translate("Forgot password?"), Href = "/Default.aspx?id=" + signInProfilePageId + "&LoginAction=Recovery" }; 3722 } 3723 3724 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) }); 3725 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" }); 3726 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" }); 3727 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" }); 3728 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true }); 3729 form.Add(passwordField); 3730 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error }); 3731 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") }); 3732 form.Add(new Button { ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event)" }); 3733 3734 foreach (Provider LoginProvider in providers) 3735 { 3736 var ProviderName = LoginProvider.Name.ToLower(); 3737 form.Add(new Link { 3738 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID, 3739 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After }, 3740 ButtonLayout = ButtonLayout.LinkClean, 3741 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName, 3742 AltText = ProviderName 3743 }); 3744 } 3745 3746 if (!hideCreateAccountLink) { 3747 form.Add(new Text { Content = "<div class=\"u-border-top Hidden_DS u-full-width u-margin-bottom--lg\"></div>" }); 3748 form.Add(new Link 3749 { 3750 Href = "/Default.aspx?id=" + createAccountPageId, 3751 ButtonLayout = ButtonLayout.LinkClean, 3752 Title = Translate("Create account"), 3753 CssClass = "u-full-width u-ta-center Hidden_DS" 3754 }); 3755 } 3756 3757 @Render(form) 3758 3759 if (showModalOnStart) 3760 { 3761 <script> 3762 document.getElementById("SignInModalTrigger").checked = true; 3763 </script> 3764 } 3765 } 3766 3767 3768 3769 3770 3771 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3772 { 3773 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3774 3775 @using System 3776 @using System.Web 3777 @using System.Collections.Generic 3778 @using Dynamicweb.Rapido.Blocks.Extensibility 3779 @using Dynamicweb.Rapido.Blocks 3780 @using Dynamicweb.Rapido.Services 3781 3782 3783 @functions { 3784 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3785 } 3786 3787 @{ 3788 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 3789 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 3790 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed(); 3791 3792 Block mobileHeader = new Block() 3793 { 3794 Id = "MobileTop", 3795 SortId = 10, 3796 Template = RenderMobileTop(), 3797 SkipRenderBlocksList = true 3798 }; 3799 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader); 3800 3801 Block mobileHeaderNavigation = new Block() 3802 { 3803 Id = "MobileHeaderNavigation", 3804 SortId = 10, 3805 Template = RenderMobileHeaderNavigation(), 3806 SkipRenderBlocksList = true, 3807 BlocksList = new List<Block> { 3808 new Block { 3809 Id = "MobileHeaderNavigationTrigger", 3810 SortId = 10, 3811 Template = RenderMobileHeaderNavigationTrigger() 3812 } 3813 } 3814 }; 3815 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation); 3816 3817 Block mobileHeaderLogo = new Block() 3818 { 3819 Id = "MobileHeaderLogo", 3820 SortId = 20, 3821 Template = RenderMobileHeaderLogo(), 3822 SkipRenderBlocksList = true 3823 }; 3824 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo); 3825 3826 Block mobileHeaderActions = new Block() 3827 { 3828 Id = "MobileHeaderActions", 3829 SortId = 30, 3830 Template = RenderMobileTopActions(), 3831 SkipRenderBlocksList = true 3832 }; 3833 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions); 3834 3835 if (!mobileHideSearch) 3836 { 3837 Block mobileHeaderSearch = new Block 3838 { 3839 Id = "MobileHeaderSearch", 3840 SortId = 10, 3841 Template = RenderMobileTopSearch() 3842 }; 3843 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch); 3844 } 3845 3846 Block mobileHeaderMiniCart; 3847 3848 if (!mobileHideCart) 3849 { 3850 mobileHeaderMiniCart = new Block 3851 { 3852 Id = "MobileHeaderMiniCart", 3853 SortId = 20, 3854 Template = RenderMobileTopMiniCart() 3855 }; 3856 3857 Block miniCartCounterScriptTemplate = new Block 3858 { 3859 Id = "MiniCartCounterScriptTemplate", 3860 Template = RenderMobileMiniCartCounterContent() 3861 }; 3862 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 3863 } 3864 else 3865 { 3866 mobileHeaderMiniCart = new Block 3867 { 3868 Id = "MobileHeaderMiniCart", 3869 SortId = 20 3870 }; 3871 } 3872 3873 if (!mobileHideSearch) 3874 { 3875 Block mobileHeaderSearchBar = new Block() 3876 { 3877 Id = "MobileHeaderSearchBar", 3878 SortId = 30, 3879 Template = RenderMobileTopSearchBar() 3880 }; 3881 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar); 3882 } 3883 3884 switch (mobileTopLayout) 3885 { 3886 case "nav-left": 3887 mobileHeaderNavigation.SortId = 10; 3888 mobileHeaderLogo.SortId = 20; 3889 mobileHeaderActions.SortId = 30; 3890 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3891 break; 3892 case "nav-right": 3893 mobileHeaderLogo.SortId = 10; 3894 mobileHeaderActions.SortId = 20; 3895 mobileHeaderNavigation.SortId = 30; 3896 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3897 break; 3898 case "nav-search-left": 3899 mobileHeaderNavigation.SortId = 10; 3900 mobileHeaderLogo.SortId = 20; 3901 mobileHeaderActions.SortId = 30; 3902 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3903 break; 3904 case "search-left": 3905 mobileHeaderActions.SortId = 10; 3906 mobileHeaderLogo.SortId = 20; 3907 mobileHeaderNavigation.SortId = 30; 3908 mobileHeaderMiniCart.SortId = 0; 3909 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3910 break; 3911 } 3912 } 3913 3914 3915 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3916 3917 @using System 3918 @using System.Web 3919 @using Dynamicweb.Rapido.Blocks.Extensibility 3920 @using Dynamicweb.Rapido.Blocks 3921 3922 @{ 3923 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3924 } 3925 3926 3927 3928 3929 @helper RenderMobileTop() { 3930 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList(); 3931 3932 <nav class="main-navigation-mobile dw-mod"> 3933 <div class="center-container top-container__center-container dw-mod"> 3934 <div class="grid grid--align-center"> 3935 @RenderBlockList(subBlocks) 3936 </div> 3937 </div> 3938 </nav> 3939 } 3940 3941 @helper RenderMobileHeaderNavigation() { 3942 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList(); 3943 3944 <div class="grid__col-auto-width"> 3945 <ul class="menu dw-mod"> 3946 @RenderBlockList(subBlocks) 3947 </ul> 3948 </div> 3949 } 3950 3951 @helper RenderMobileHeaderNavigationTrigger() { 3952 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 3953 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label> 3954 </li> 3955 } 3956 3957 @helper RenderMobileHeaderLogo() { 3958 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList(); 3959 3960 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 3961 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : ""; 3962 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 3963 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName"); 3964 3965 string mobileLogo = "/Files/Images/logo-dynamicweb.png"; 3966 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null) 3967 { 3968 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded; 3969 } 3970 3971 if (Path.GetExtension(mobileLogo).ToLower() != ".svg") 3972 { 3973 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&amp;width=100&amp;crop=5&amp;Compression=75&amp;image=" + mobileLogo; 3974 } 3975 else 3976 { 3977 mobileLogo = HttpUtility.UrlDecode(mobileLogo); 3978 } 3979 3980 <div class="grid__col-auto grid__col--bleed"> 3981 <div class="grid__cell @centeredLogo"> 3982 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod"> 3983 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" /> 3984 </a> 3985 </div> 3986 3987 @RenderBlockList(subBlocks) 3988 </div> 3989 } 3990 3991 @helper RenderMobileTopActions() { 3992 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList(); 3993 3994 <div class="grid__col-auto-width"> 3995 <ul class="menu dw-mod"> 3996 @RenderBlockList(subBlocks) 3997 </ul> 3998 </div> 3999 } 4000 4001 @helper RenderMobileTopSearch() { 4002 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4003 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4004 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 4005 </label> 4006 </li> 4007 } 4008 4009 @helper RenderMobileTopMiniCart() { 4010 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 4011 int cartPageId = GetPageIdByNavigationTag("CartPage"); 4012 double cartProductsCount = Model.Cart.TotalProductsCount; 4013 4014 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper"> 4015 <div class="mini-cart dw-mod"> 4016 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button"> 4017 <div class="u-inline u-position-relative"> 4018 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i> 4019 <div class="mini-cart__counter dw-mod"> 4020 <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"> 4021 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount"> 4022 @cartProductsCount 4023 </div> 4024 </div> 4025 </div> 4026 </div> 4027 </a> 4028 </div> 4029 </li> 4030 } 4031 4032 @helper RenderMobileTopSearchBar() 4033 { 4034 string searchFeedId = ""; 4035 string searchSecondFeedId = ""; 4036 int groupsFeedId; 4037 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4038 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4039 string resultPageLink; 4040 string searchPlaceholder; 4041 string searchType = "product-search"; 4042 string searchTemplate; 4043 string searchContentTemplate = ""; 4044 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4045 bool showGroups = true; 4046 4047 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4048 { 4049 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4050 resultPageLink = contentSearchPageLink; 4051 searchPlaceholder = Translate("Search page"); 4052 groupsFeedId = 0; 4053 searchType = "content-search"; 4054 searchTemplate = "SearchPagesTemplate"; 4055 showGroups = false; 4056 } 4057 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4058 { 4059 searchFeedId = productsPageId + "&feed=true"; 4060 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4061 resultPageLink = Converter.ToString(productsPageId); 4062 searchPlaceholder = Translate("Search products or pages"); 4063 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4064 searchType = "combined-search"; 4065 searchTemplate = "SearchProductsTemplateWrap"; 4066 searchContentTemplate = "SearchPagesTemplateWrap"; 4067 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4068 } 4069 else 4070 { 4071 resultPageLink = Converter.ToString(productsPageId); 4072 searchFeedId = productsPageId + "&feed=true"; 4073 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4074 searchPlaceholder = Translate("Search products"); 4075 searchTemplate = "SearchProductsTemplate"; 4076 searchType = "product-search"; 4077 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4078 } 4079 4080 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" /> 4081 4082 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4083 <div class="center-container top-container__center-container dw-mod"> 4084 <div class="grid"> 4085 <div class="grid__col-auto"> 4086 <div class="typeahead-mobile__search-field dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4087 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4088 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4089 { 4090 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4091 } 4092 else 4093 { 4094 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4095 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4096 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4097 </div> 4098 } 4099 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 4100 </div> 4101 </div> 4102 <div class="grid__col-auto-width"> 4103 <ul class="menu dw-mod"> 4104 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4105 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4106 <i class="fas fa-times fa-1_5x"></i> 4107 </label> 4108 </li> 4109 </ul> 4110 </div> 4111 </div> 4112 </div> 4113 </div> 4114 } 4115 4116 @helper RenderMobileMiniCartCounterContent() 4117 { 4118 <script id="MiniCartCounterContent" type="text/x-template"> 4119 {{#.}} 4120 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 4121 {{numberofproducts}} 4122 </div> 4123 {{/.}} 4124 </script> 4125 } 4126 </text> 4127 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4128 4129 @using System 4130 @using System.Web 4131 @using System.Collections.Generic 4132 @using Dynamicweb.Rapido.Blocks.Extensibility 4133 @using Dynamicweb.Rapido.Blocks 4134 4135 @functions { 4136 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4137 } 4138 4139 @{ 4140 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4141 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4142 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4143 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4144 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4145 bool mobileHideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4146 4147 Block mobileNavigation = new Block() 4148 { 4149 Id = "MobileNavigation", 4150 SortId = 10, 4151 Template = MobileNavigation(), 4152 SkipRenderBlocksList = true 4153 }; 4154 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4155 4156 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4157 { 4158 Block mobileNavigationSignIn = new Block 4159 { 4160 Id = "MobileNavigationSignIn", 4161 SortId = 10, 4162 Template = RenderMobileNavigationSignIn() 4163 }; 4164 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4165 } 4166 4167 Block mobileNavigationMenu = new Block 4168 { 4169 Id = "MobileNavigationMenu", 4170 SortId = 20, 4171 Template = RenderMobileNavigationMenu() 4172 }; 4173 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4174 4175 Block mobileNavigationActions = new Block 4176 { 4177 Id = "MobileNavigationActions", 4178 SortId = 30, 4179 Template = RenderMobileNavigationActions(), 4180 SkipRenderBlocksList = true 4181 }; 4182 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4183 4184 if (!mobileNavigationItemsHideSignIn) 4185 { 4186 if (Model.CurrentUser.ID <= 0) 4187 { 4188 Block mobileNavigationSignInAction = new Block 4189 { 4190 Id = "MobileNavigationSignInAction", 4191 SortId = 10, 4192 Template = RenderMobileNavigationSignInAction() 4193 }; 4194 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4195 4196 if (!mobileHideCreateAccountLink) 4197 { 4198 Block mobileNavigationCreateAccountAction = new Block 4199 { 4200 Id = "MobileNavigationCreateAccountAction", 4201 SortId = 20, 4202 Template = RenderMobileNavigationCreateAccountAction() 4203 }; 4204 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4205 } 4206 } 4207 else 4208 { 4209 if (!mobileHideMyOrdersLink) 4210 { 4211 Block mobileNavigationOrdersAction = new Block 4212 { 4213 Id = "MobileNavigationOrdersAction", 4214 SortId = 20, 4215 Template = RenderMobileNavigationOrdersAction() 4216 }; 4217 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4218 } 4219 if (!mobileHideMyFavoritesLink) 4220 { 4221 Block mobileNavigationFavoritesAction = new Block 4222 { 4223 Id = "MobileNavigationFavoritesAction", 4224 SortId = 30, 4225 Template = RenderMobileNavigationFavoritesAction() 4226 }; 4227 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction); 4228 } 4229 if (!mobileHideMySavedCardsLink) 4230 { 4231 Block mobileNavigationSavedCardsAction = new Block 4232 { 4233 Id = "MobileNavigationFavoritesAction", 4234 SortId = 30, 4235 Template = RenderMobileNavigationSavedCardsAction() 4236 }; 4237 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4238 } 4239 4240 Block mobileNavigationSignOutAction = new Block 4241 { 4242 Id = "MobileNavigationSignOutAction", 4243 SortId = 40, 4244 Template = RenderMobileNavigationSignOutAction() 4245 }; 4246 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4247 } 4248 } 4249 4250 if (Model.Languages.Count > 1) 4251 { 4252 Block mobileNavigationLanguagesAction = new Block 4253 { 4254 Id = "MobileNavigationLanguagesAction", 4255 SortId = 50, 4256 Template = RenderMobileNavigationLanguagesAction() 4257 }; 4258 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4259 } 4260 } 4261 4262 4263 @helper MobileNavigation() 4264 { 4265 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4266 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4267 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4268 4269 <!-- Trigger for mobile navigation --> 4270 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4271 4272 <!-- Mobile navigation --> 4273 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4274 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper"> 4275 @RenderBlockList(subBlocks) 4276 </div> 4277 </nav> 4278 4279 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4280 } 4281 4282 @helper RenderMobileNavigationSignIn() 4283 { 4284 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4285 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4286 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4287 string myProfilePageLink = linkStart + myProfilePageId; 4288 string userName = Model.CurrentUser.FirstName; 4289 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4290 { 4291 userName += " " + Model.CurrentUser.LastName; 4292 } 4293 if (string.IsNullOrEmpty(userName)) 4294 { 4295 userName = Model.CurrentUser.Name; 4296 } 4297 if (string.IsNullOrEmpty(userName)) 4298 { 4299 userName = Model.CurrentUser.UserName; 4300 } 4301 if (string.IsNullOrEmpty(userName)) 4302 { 4303 userName = Model.CurrentUser.Email; 4304 } 4305 4306 <ul class="menu menu-mobile"> 4307 <li class="menu-mobile__item"> 4308 <a href="@myProfilePageLink" class="menu-mobile__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @userName</a> 4309 </li> 4310 </ul> 4311 } 4312 4313 @helper RenderMobileNavigationMenu() 4314 { 4315 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4316 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4317 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4318 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4319 int startLevel = 0; 4320 4321 @RenderNavigation(new 4322 { 4323 id = "mobilenavigation", 4324 cssclass = "menu menu-mobile dwnavigation", 4325 startLevel = @startLevel, 4326 ecomStartLevel = @startLevel + 1, 4327 endlevel = @levels, 4328 expandmode = "all", 4329 template = @menuTemplate 4330 }) 4331 4332 if (isSlidesDesign) 4333 { 4334 <script> 4335 function goToLevel(level) { 4336 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4337 } 4338 4339 document.addEventListener('DOMContentLoaded', function () { 4340 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4341 }); 4342 </script> 4343 } 4344 4345 if (renderPagesInToolBar) 4346 { 4347 @RenderNavigation(new 4348 { 4349 id = "topToolsMobileNavigation", 4350 cssclass = "menu menu-mobile dwnavigation", 4351 template = "ToolsMenuForMobile.xslt" 4352 }) 4353 } 4354 } 4355 4356 @helper RenderMobileNavigationActions() 4357 { 4358 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4359 4360 <ul class="menu menu-mobile"> 4361 @RenderBlockList(subBlocks) 4362 </ul> 4363 } 4364 4365 @helper RenderMobileNavigationSignInAction() 4366 { 4367 <li class="menu-mobile__item"> 4368 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label> 4369 </li> 4370 } 4371 4372 @helper RenderMobileNavigationCreateAccountAction() 4373 { 4374 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4375 4376 <li class="menu-mobile__item"> 4377 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a> 4378 </li> 4379 } 4380 4381 @helper RenderMobileNavigationProfileAction() 4382 { 4383 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4384 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4385 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4386 string myProfilePageLink = linkStart + myProfilePageId; 4387 4388 <li class="menu-mobile__item"> 4389 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("My Profile")</a> 4390 </li> 4391 } 4392 4393 @helper RenderMobileNavigationOrdersAction() 4394 { 4395 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4396 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4397 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4398 string myOrdersPageLink = linkStart + myOrdersPageId; 4399 string ordersIcon = "fas fa-list"; 4400 4401 <li class="menu-mobile__item"> 4402 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@ordersIcon menu-mobile__link-icon"></i> @Translate("My Orders")</a> 4403 </li> 4404 } 4405 4406 @helper RenderMobileNavigationFavoritesAction() 4407 { 4408 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4409 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4410 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4411 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4412 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 4413 4414 4415 <li class="menu-mobile__item"> 4416 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@favoritesIcon menu-mobile__link-icon"></i> @Translate("My Favorites")</a> 4417 </li> 4418 } 4419 4420 @helper RenderMobileNavigationSavedCardsAction() 4421 { 4422 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4423 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4424 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4425 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4426 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card"; 4427 4428 <li class="menu-mobile__item"> 4429 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a> 4430 </li> 4431 } 4432 4433 @helper RenderMobileNavigationSignOutAction() 4434 { 4435 int pageId = Model.TopPage.ID; 4436 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt"; 4437 4438 <li class="menu-mobile__item"> 4439 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a> 4440 </li> 4441 } 4442 4443 @helper RenderMobileNavigationLanguagesAction() 4444 { 4445 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4446 4447 string selectedLanguage = ""; 4448 foreach (var lang in Model.Languages) 4449 { 4450 if (lang.IsCurrent) 4451 { 4452 selectedLanguage = lang.Name; 4453 } 4454 } 4455 4456 <li class="menu-mobile__item dw-mod"> 4457 @if (isSlidesDesign) 4458 { 4459 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4460 } 4461 else 4462 { 4463 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4464 } 4465 <div class="menu-mobile__link__wrap"> 4466 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue menu-mobile__link-icon"></i> @selectedLanguage</label> 4467 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4468 </div> 4469 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4470 @if (isSlidesDesign) 4471 { 4472 <style> 4473 .German {display:none!important;} 4474 </style> 4475 <li class="menu-mobile__item dw-mod"> 4476 <div class="menu-mobile__link__wrap"> 4477 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4478 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4479 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4480 </div> 4481 </li> 4482 } 4483 @foreach (var lang in Model.Languages) 4484 { 4485 <li class="menu-mobile__item dw-mod"> 4486 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1 @lang.Name" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4487 </li> 4488 } 4489 </ul> 4490 </li> 4491 }</text> 4492 } 4493 else 4494 { 4495 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4496 4497 @using System 4498 @using System.Web 4499 @using System.Collections.Generic 4500 @using Dynamicweb.Rapido.Blocks.Extensibility 4501 @using Dynamicweb.Rapido.Blocks 4502 4503 @functions { 4504 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4505 } 4506 4507 @{ 4508 Block masterTools = new Block() 4509 { 4510 Id = "MasterDesktopTools", 4511 SortId = 10, 4512 Template = RenderDesktopTools(), 4513 SkipRenderBlocksList = true, 4514 BlocksList = new List<Block> 4515 { 4516 new Block { 4517 Id = "MasterDesktopToolsText", 4518 SortId = 10, 4519 Template = RenderDesktopToolsText(), 4520 Design = new Design 4521 { 4522 Size = "auto", 4523 HidePadding = true, 4524 RenderType = RenderType.Column 4525 } 4526 }, 4527 new Block { 4528 Id = "MasterDesktopToolsNavigation", 4529 SortId = 20, 4530 Template = RenderDesktopToolsNavigation(), 4531 Design = new Design 4532 { 4533 Size = "auto-width", 4534 HidePadding = true, 4535 RenderType = RenderType.Column 4536 } 4537 } 4538 } 4539 }; 4540 headerBlocksPage.Add("MasterHeader", masterTools); 4541 4542 Block masterDesktopExtra = new Block() 4543 { 4544 Id = "MasterDesktopExtra", 4545 SortId = 10, 4546 Template = RenderDesktopExtra(), 4547 SkipRenderBlocksList = true 4548 }; 4549 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4550 4551 Block masterDesktopNavigation = new Block() 4552 { 4553 Id = "MasterDesktopNavigation", 4554 SortId = 20, 4555 Template = RenderDesktopNavigation(), 4556 SkipRenderBlocksList = true 4557 }; 4558 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4559 } 4560 4561 @* Include the Blocks for the page *@ 4562 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4563 4564 @using System 4565 @using System.Web 4566 @using Dynamicweb.Rapido.Blocks.Extensibility 4567 @using Dynamicweb.Rapido.Blocks 4568 4569 @{ 4570 Block masterDesktopLogo = new Block 4571 { 4572 Id = "MasterDesktopLogo", 4573 SortId = 10, 4574 Template = RenderDesktopLogo(), 4575 Design = new Design 4576 { 4577 Size = "auto-width", 4578 HidePadding = true, 4579 RenderType = RenderType.Column, 4580 CssClass = "grid--align-self-center" 4581 } 4582 }; 4583 4584 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4585 } 4586 4587 4588 @helper RenderDesktopLogo() 4589 { 4590 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4591 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4592 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4593 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4594 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 4595 if (Path.GetExtension(logo).ToLower() != ".svg") 4596 { 4597 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 4598 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 4599 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 4600 } 4601 else 4602 { 4603 logo = HttpUtility.UrlDecode(logo); 4604 } 4605 4606 <div class="logo @alignClass dw-mod"> 4607 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 4608 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 4609 </a> 4610 </div> 4611 } 4612 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4613 4614 @using System 4615 @using System.Web 4616 @using Dynamicweb.Rapido.Blocks.Extensibility 4617 @using Dynamicweb.Rapido.Blocks 4618 4619 @functions { 4620 bool isMegaMenu; 4621 } 4622 4623 @{ 4624 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 4625 Block masterDesktopMenu = new Block 4626 { 4627 Id = "MasterDesktopMenu", 4628 SortId = 10, 4629 Template = RenderDesktopMenu(), 4630 Design = new Design 4631 { 4632 Size = "auto", 4633 HidePadding = true, 4634 RenderType = RenderType.Column 4635 } 4636 }; 4637 4638 if (isMegaMenu) 4639 { 4640 masterDesktopMenu.Design.CssClass = "u-reset-position"; 4641 } 4642 4643 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 4644 } 4645 4646 @helper RenderDesktopMenu() 4647 { 4648 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4649 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 4650 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 4651 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 4652 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4653 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 4654 int startLevel = renderPagesInToolBar ? 1 : 0; 4655 4656 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 4657 4658 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 4659 @if (!isMegaMenu) 4660 { 4661 @RenderNavigation(new 4662 { 4663 id = "topnavigation", 4664 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4665 startLevel = startLevel, 4666 ecomStartLevel = startLevel + 1, 4667 endlevel = 5, 4668 expandmode = "all", 4669 template = "BaseMenuWithDropdown.xslt" 4670 }); 4671 } 4672 else 4673 { 4674 @RenderNavigation(new 4675 { 4676 id = "topnavigation", 4677 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4678 startLevel = startLevel, 4679 ecomStartLevel = startLevel + 1, 4680 endlevel = 5, 4681 promotionImage = megamenuPromotionImage, 4682 promotionLink = promotionLink, 4683 expandmode = "all", 4684 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 4685 template = "BaseMegaMenu.xslt" 4686 }); 4687 } 4688 </div> 4689 } 4690 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4691 4692 @using System 4693 @using System.Web 4694 @using Dynamicweb.Rapido.Blocks.Extensibility 4695 @using Dynamicweb.Rapido.Blocks 4696 4697 @{ 4698 Block masterDesktopActionsMenu = new Block 4699 { 4700 Id = "MasterDesktopActionsMenu", 4701 SortId = 10, 4702 Template = RenderDesktopActionsMenu(), 4703 Design = new Design 4704 { 4705 CssClass = "u-flex" 4706 }, 4707 SkipRenderBlocksList = true 4708 4709 }; 4710 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 4711 4712 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 4713 { 4714 Block masterDesktopActionsHeaderButton = new Block 4715 { 4716 Id = "MasterDesktopActionsHeaderButton", 4717 SortId = 60, 4718 Template = RenderHeaderButton() 4719 }; 4720 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 4721 } 4722 } 4723 4724 @helper RenderDesktopActionsMenu() 4725 { 4726 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 4727 4728 <ul class="menu u-flex dw-mod"> 4729 @RenderBlockList(subBlocks) 4730 </ul> 4731 } 4732 4733 @helper RenderHeaderButton() 4734 { 4735 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 4736 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 4737 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 4738 4739 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 4740 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-left" href="@headerButtonLink">@headerButtonText</a> 4741 </li> 4742 } 4743 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4744 4745 @using System 4746 @using System.Web 4747 @using Dynamicweb.Core; 4748 @using System.Text.RegularExpressions 4749 @using Dynamicweb.Rapido.Blocks.Extensibility 4750 @using Dynamicweb.Rapido.Blocks 4751 4752 @{ 4753 Block masterDesktopActionsMenuLanguageSelector = new Block 4754 { 4755 Id = "MasterDesktopActionsMenuLanguageSelector", 4756 SortId = 40, 4757 Template = RenderLanguageSelector() 4758 }; 4759 4760 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 4761 } 4762 4763 @helper RenderLanguageSelector() 4764 { 4765 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4766 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 4767 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4768 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 4769 string curLang =""; 4770 var masterAreaId = Pageview.Area.ID; 4771 if ((int)masterAreaId > 0) 4772 { 4773 curLang = Dynamicweb.Services.Areas.GetArea(masterAreaId).EcomCountryCode.ToLower(); 4774 } 4775 if (Model.Languages.Count > 1) 4776 { 4777 @* <style> 4778 .German {display:none!important;} 4779 </style>*@<li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 4780 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 4781 <i class="flag-icon flag-icon-@curLang fa-1_5x"></i> 4782 </div> 4783 <div class="menu menu--dropdown menu--dropdown-right dw-mod grid__cell"> 4784 @foreach (var lang in Model.Languages) 4785 { 4786 string widthClass = "menu__item--fixed-width"; 4787 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name; 4788 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4789 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4790 4791 if (languageViewType == "flag-culture") 4792 { 4793 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName; 4794 } 4795 4796 if (languageViewType == "flag") 4797 { 4798 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>"; 4799 widthClass = ""; 4800 } 4801 4802 if (languageViewType == "name") 4803 { 4804 langInfo = lang.Name; 4805 } 4806 4807 if (languageViewType == "culture") 4808 { 4809 langInfo = cultureName; 4810 widthClass = ""; 4811 } 4812 4813 4814 <a onclick="openChangeLanguageForm('/Default.aspx?ID=@lang.Page.ID&LanguageID=@Dynamicweb.Services.Areas.GetArea(lang.ID).EcomLanguageId&currencycode=@Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCurrencyId');" class="menu-dropdown__item menu-dropdown__item--link dw-mod @lang.Name">@langInfo</a> 4815 4816 } 4817 </div> 4818 </li> 4819 } 4820 } 4821 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4822 4823 @using System 4824 @using System.Web 4825 @using Dynamicweb.Rapido.Blocks.Extensibility 4826 @using Dynamicweb.Rapido.Blocks 4827 4828 @{ 4829 Block masterDesktopActionsMenuSignIn = new Block 4830 { 4831 Id = "MasterDesktopActionsMenuSignIn", 4832 SortId = 20, 4833 Template = RenderSignIn() 4834 }; 4835 4836 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 4837 } 4838 4839 @helper RenderSignIn() 4840 { 4841 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4842 string userInitials = ""; 4843 int pageId = Model.TopPage.ID; 4844 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4845 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 4846 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4847 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4848 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4849 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4850 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 4851 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4852 int CreateB2BAccountPageId = GetPageIdByNavigationTag("Createb2b"); 4853 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4854 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4855 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4856 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4857 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 4858 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4859 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 4860 4861 string linkStart = "/Default.aspx?ID="; 4862 if (Model.CurrentUser.ID <= 0) 4863 { 4864 linkStart += signInProfilePageId + "&RedirectPageId="; 4865 } 4866 4867 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 4868 string myProfilePageLink = linkStart + myProfilePageId; 4869 string myOrdersPageLink = linkStart + myOrdersPageId; 4870 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4871 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4872 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 4873 4874 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 4875 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 4876 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 4877 4878 if (Model.CurrentUser.ID != 0) 4879 { 4880 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 4881 } 4882 4883 if (!navigationItemsHideSignIn) 4884 { 4885 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4886 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 4887 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4888 4889 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod"> 4890 <div class="@menuLinkClass dw-mod"> 4891 @if (Model.CurrentUser.ID <= 0) 4892 { 4893 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x" title="@Translate("Sign in")"></i> 4894 } 4895 else 4896 { 4897 //<a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a> 4898 <a href="/default.aspx?ID=@myDashboardPageId" class="btn--condensed btn--primary u-no-margin dw-mod" title="@Translate("Customer center")" style="margin: inherit;">@Translate("My Profile")</a> 4899 } 4900 4901 </div> 4902 4903 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 4904 <ul class="list list--clean dw-mod"> 4905 @if (Model.CurrentUser.ID <= 0) 4906 { 4907 <li> 4908 <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> 4909 </li> 4910 4911 4912 4913 @* IvanB 12.12.22 START "Link to ak for B2B Account" *@ 4914 <li> 4915 @{ 4916 4917 @RenderListItem("/default.aspx?ID=" + CreateB2BAccountPageId, Translate("Open B2B Account")); 4918 4919 } 4920 4921 </li> 4922 @* IvanB 12.12.22 END "Link to ak for B2B Account"*@ 4923 4924 4925 4926 if (!hideCreateAccountLink) 4927 { 4928 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 4929 } 4930 if (!hideForgotPasswordLink) 4931 { 4932 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 4933 } 4934 if(Model.CurrentUser.ID > 0) { 4935 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4936 { 4937 @RenderSeparator() 4938 } 4939 } 4940 } 4941 @if(Model.CurrentUser.ID > 0) { 4942 if (!hideMyProfileLink) 4943 { 4944 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 4945 } 4946 if (!hideMyOrdersLink) 4947 { 4948 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 4949 } 4950 if (!hideMyFavoritesLink) 4951 { 4952 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 4953 } 4954 if (!hideMySavedCardsLink) 4955 { 4956 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 4957 } 4958 if (!hideMyOrderDraftsLink) 4959 { 4960 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 4961 } 4962 if (Model.CurrentUser.ID > 0) 4963 { 4964 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4965 { 4966 @RenderSeparator() 4967 } 4968 4969 string UserAccessToken = ""; 4970 Dynamicweb.Security.UserManagement.User usr = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID); 4971 4972 foreach (var customField in usr.CustomFieldValues){ 4973 if (customField.CustomField.SystemName =="AccessUser_QQToken"){ 4974 UserAccessToken = customField.Value.ToString(); 4975 } 4976 4977 } 4978 4979 if(!string.IsNullOrWhiteSpace(UserAccessToken)){ 4980 string QQLink = "https://webqq-acofunki.aco.com/Account/Login?QQ_access_token="+UserAccessToken; 4981 <li> 4982 <a href="@QQLink" class="list__link dw-mod"><i class="fas fa-box-open u-margin-right"></i>@Translate("Login to QQ")</a> 4983 </li> 4984 } 4985 //Check if impersonation is on 4986 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4987 { 4988 <li> 4989 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 4990 @Translate("Sign out") 4991 </div> 4992 </li> 4993 } else { 4994 4995 @* DS - Instead of having the default sign-out to stay on same page, this redirects to the homepage *@ 4996 int frontPageId = GetPageIdByNavigationTag("homePage"); 4997 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + frontPageId, Translate("Sign out")) 4998 } 4999 } 5000 } 5001 </ul> 5002 </div> 5003 </li> 5004 if (Model.CurrentUser.ID <= 0) 5005 { 5006 } 5007 else 5008 { 5009 <div style="position: fixed; 5010 right: 0; 5011 bottom: 0; 5012 background: #b80000; 5013 padding: 10px 30px; 5014 display: flex; 5015 gap: 20px; 5016 align-items: center; 5017 width: 100%; 5018 flex-direction: row-reverse;"> 5019 <div style="font-size: 15px;color:white;"><a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"> @Translate("logged in as") @Pageview.User.UserName </a></div> 5020 </div> 5021 } 5022 } 5023 } 5024 5025 @helper RenderListItem(string link, string text, string icon = null) { 5026 <li> 5027 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)"> 5028 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5029 </a> 5030 </li> 5031 } 5032 5033 @helper RenderSeparator() 5034 { 5035 <li class="list__seperator dw-mod"></li> 5036 } 5037 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5038 5039 @using System 5040 @using System.Web 5041 @using Dynamicweb.Rapido.Blocks.Extensibility 5042 @using Dynamicweb.Rapido.Blocks 5043 5044 @{ 5045 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5046 5047 Block masterDesktopActionsMenuFavorites = new Block 5048 { 5049 Id = "MasterDesktopActionsMenuFavorites", 5050 SortId = 30, 5051 Template = RenderFavorites() 5052 }; 5053 5054 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5055 { 5056 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5057 } 5058 } 5059 5060 @helper RenderFavorites() 5061 { 5062 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5063 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5064 5065 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5066 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5067 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5068 5069 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5070 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5071 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5072 </a> 5073 </li> 5074 } 5075 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5076 5077 @using System 5078 @using System.Web 5079 @using Dynamicweb.Rapido.Blocks.Extensibility 5080 @using Dynamicweb.Rapido.Blocks 5081 @using Dynamicweb.Rapido.Services 5082 @using Dynamicweb.Management.Users 5083 @using Dynamicweb.Security 5084 @using Dynamicweb.Security.UserManagement 5085 @using Dynamicweb.Core 5086 @using System.Linq 5087 @using System.Collections.Generic 5088 @using Dynamicweb.Rapido.Blocks 5089 @using Dynamicweb.Rapido.Blocks.Components 5090 @using Dynamicweb.Rapido.Blocks.Components.General 5091 5092 5093 @functions { 5094 bool MyCustomCheckbox = false; 5095 } 5096 @{ 5097 int cartUser =Model.CurrentUser.ID; 5098 var user=Dynamicweb.Security.UserManagement.User.GetUserByID(cartUser); 5099 if(user != null) 5100 { 5101 foreach (var customFieldValue in user.CustomFieldValues) 5102 { 5103 if(customFieldValue.CustomField.SystemName == "AccessUser_UseWeeklyCart") 5104 { 5105 bool SilentUpdate = Boolean.TryParse(customFieldValue.Value.ToString(), out MyCustomCheckbox) ? MyCustomCheckbox : false; 5106 //MyCustomCheckbox = Convert.ToBoolean(customFieldValue.Value.ToString()); 5107 5108 } 5109 5110 } 5111 } 5112 } 5113 5114 5115 @{ 5116 5117 string MiniB2BWeeklyCartLayout = "dropdown"; 5118 5119 Dynamicweb.Ecommerce.Orders.OrderContext oContext = Dynamicweb.Ecommerce.Orders.OrderContext.GetOrderContextById("ORDERCONTEXT2"); 5120 int prodCount = 0; 5121 bool hideB2BWeeklyCart = true; 5122 if(Model.CurrentUser.ID>0 && oContext!=null && (MyCustomCheckbox.ToString()!="False")) {hideB2BWeeklyCart = false;} 5123 5124 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideB2BWeeklyCart) 5125 { 5126 //Dynamicweb.Ecommerce.Orders.OrderContext curContext = Dynamicweb.Ecommerce.Common.Context.CartContext; 5127 //Dynamicweb.Ecommerce.Common.Context.CartContext = oContext; 5128 //prodCount = Dynamicweb.Ecommerce.Common.Context.Cart.Products.Count; 5129 //var oCart = oContext.GetCart(); 5130 //if(oCart!=null){ 5131 // prodCount =oContext.Cart.Products.Count; 5132 //} 5133 //Dynamicweb.Ecommerce.Common.Context.CartContext = curContext; *@ 5134 5135 Block masterDesktopActionsMenuMiniB2BWeeklyCart = new Block 5136 { 5137 Id = "MasterDesktopActionsMenuMiniB2BWeeklyCart", 5138 SortId = 60, 5139 Template = RenderMiniB2BWeeklyCart(false), 5140 SkipRenderBlocksList = true, 5141 BlocksList = new List<Block>() 5142 }; 5143 5144 Block MiniB2BWeeklyCartCounterScriptTemplate = new Block 5145 { 5146 Id = "MiniB2BWeeklyCartCounterScriptTemplate", 5147 Template = RenderMiniB2BWeeklyCartCounter() 5148 }; 5149 5150 //dropdown layout is default 5151 //RazorEngine.Templating.TemplateWriter B2BWeeklyLayoutTemplate = RenderMiniB2BWeeklyCartDropdownLayout(); 5152 RazorEngine.Templating.TemplateWriter MiniB2BWeeklyCartTriggerTemplate = RenderMiniB2BWeeklyCartTriggerLink(); 5153 5154 masterDesktopActionsMenuMiniB2BWeeklyCart.BlocksList.Add(new Block 5155 { 5156 Id = "MiniB2BWeeklyCartTrigger", 5157 Template = MiniB2BWeeklyCartTriggerTemplate 5158 }); 5159 5160 @* if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5161 { 5162 masterDesktopActionsMenuMiniB2BWeeklyCart.BlocksList.Add(new Block 5163 { 5164 Id = "MiniB2BWeeklyCartLayout", 5165 Template = B2BWeeklyLayoutTemplate 5166 }); 5167 } *@ 5168 5169 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniB2BWeeklyCart); 5170 5171 } 5172 5173 } 5174 5175 @helper RenderMiniB2BWeeklyCart(bool hasMouseEnterEvent) 5176 { 5177 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniB2BWeeklyCart").OrderBy(item => item.SortId).ToList(); 5178 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5179 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5180 int MiniB2BWeeklyCartFeedPageId = GetPageIdByNavigationTag("MiniB2BWeeklyCartFeed"); 5181 string mouseEvent = ""; 5182 string id = "MiniB2BWeeklyCart"; 5183 if (hasMouseEnterEvent) 5184 { 5185 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('MiniB2BWeeklyCartTrigger', 'MiniB2BWeeklyCart', 'b2BWeeklycartCounter', '/Default.aspx?ID=" + MiniB2BWeeklyCartFeedPageId + "&feedType=MiniCart')\""; 5186 id = "MiniB2BWeeklyCartTrigger"; 5187 } 5188 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5189 @RenderBlockList(subBlocks) 5190 </li> 5191 } 5192 5193 @helper RenderMiniB2BWeeklyCartTriggerLink() 5194 { 5195 int cartPageId = GetPageIdByNavigationTag("B2BWeeklyCartPage"); 5196 string cartIcon = "fal fa-shopping-cart"; 5197 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5198 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5199 5200 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button-test" title="@Translate("B2BWeeklyCart")"> 5201 <span class="u-inline u-position-relative"> 5202 <i class="@cartIcon fa-1_5x"></i> 5203 @RenderMiniB2BWeeklyCartCounter() 5204 </span> 5205 </a> 5206 } 5207 5208 @helper RenderMiniB2BWeeklyCartCounter() 5209 { 5210 int MiniB2BWeeklyCartFeedPageId = GetPageIdByNavigationTag("MiniB2BWeeklyCartFeed"); 5211 string cartProductsCount = Model.Cart.TotalProductsCount.ToString(); 5212 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5213 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5214 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5215 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5216 5217 if (showPrice && counterPosition == "right") 5218 { 5219 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5220 cartProductsCount = Translate("Weekly Cart"); 5221 } 5222 5223 5224 <span class="js-handlebars-root" id="b2BWeeklycartCounter" data-template="MiniB2BWeeklyCartCounterContent" data-json-feed="/Default.aspx?ID=@MiniB2BWeeklyCartFeedPageId" data-preloader="false"> 5225 5226 </span> 5227 5228 <script id="MiniB2BWeeklyCartCounterContent" type="text/x-template"> 5229 {{#.}} 5230 <span class="@(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5231 <span class="" data-count="@Model.Cart.TotalProductsCount.ToString()" style="margin-left:-100%; font-size:0.7rem;opacity: 1;transition: all .3s ease-in; font-weight: bold; position: absolute;min-width: 22px;height: 22px; line-height: 16px;padding: 4px;left: 100%; border-radius: 100px;top: -17px;color: #333;background: transparent;"> 5232 Weekly Cart 5233 </span> 5234 </span> 5235 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 5236 5237 <text>{{numberofproducts}}</text> 5238 5239 </span> 5240 {{/.}} 5241 </script> 5242 5243 5244 } 5245 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5246 5247 @using System 5248 @using System.Web 5249 @using Dynamicweb.Rapido.Blocks.Extensibility 5250 @using Dynamicweb.Rapido.Blocks 5251 @using Dynamicweb.Rapido.Services 5252 5253 @{ 5254 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5255 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5256 5257 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5258 { 5259 Block masterDesktopActionsMenuMiniCart = new Block 5260 { 5261 Id = "MasterDesktopActionsMenuMiniCart", 5262 SortId = 60, 5263 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5264 SkipRenderBlocksList = true, 5265 BlocksList = new List<Block>() 5266 }; 5267 5268 Block miniCartCounterScriptTemplate = new Block 5269 { 5270 Id = "MiniCartCounterScriptTemplate", 5271 Template = RenderMiniCartCounterContent() 5272 }; 5273 5274 //dropdown layout is default 5275 RazorEngine.Templating.TemplateWriter layoutTemplate; 5276 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5277 5278 switch (miniCartLayout) 5279 { 5280 case "dropdown": 5281 layoutTemplate = RenderMiniCartDropdownLayout(); 5282 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5283 break; 5284 case "panel": 5285 layoutTemplate = RenderMiniCartPanelLayout(); 5286 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5287 break; 5288 case "modal": 5289 layoutTemplate = RenderMiniCartModalLayout(); 5290 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5291 break; 5292 case "none": 5293 default: 5294 layoutTemplate = RenderMiniCartDropdownLayout(); 5295 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5296 break; 5297 } 5298 5299 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5300 { 5301 Id = "MiniCartTrigger", 5302 Template = miniCartTriggerTemplate 5303 }); 5304 5305 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5306 { 5307 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5308 { 5309 Id = "MiniCartLayout", 5310 Template = layoutTemplate 5311 }); 5312 } 5313 5314 5315 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5316 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5317 } 5318 5319 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5320 { 5321 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block { 5322 Id = "CartInitialization" 5323 }); 5324 } 5325 } 5326 5327 @helper RenderMiniCart(bool hasMouseEnterEvent) 5328 { 5329 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5330 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5331 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5332 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5333 string mouseEvent = ""; 5334 string id = "MiniCart"; 5335 if (hasMouseEnterEvent) 5336 { 5337 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5338 id = "miniCartTrigger"; 5339 } 5340 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5341 @RenderBlockList(subBlocks) 5342 </li> 5343 } 5344 5345 @helper RenderMiniCartTriggerLabel() 5346 { 5347 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5348 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5349 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5350 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5351 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5352 5353 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')" title="@Translate("Cart")"> 5354 <div class="u-inline u-position-relative"> 5355 <i class="@cartIcon fa-1_5x"></i> 5356 @RenderMiniCartCounter() 5357 </div> 5358 </div> 5359 } 5360 5361 @helper RenderMiniCartTriggerLink() 5362 { 5363 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5364 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5365 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5366 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5367 5368 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5369 <span class="u-inline u-position-relative"> 5370 <i class="@cartIcon fa-1_5x"></i> 5371 @RenderMiniCartCounter() 5372 </span> 5373 </a> 5374 } 5375 5376 @helper RenderMiniCartCounter() 5377 { 5378 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5379 string cartProductsCount = Model.Cart.TotalProductsCount.ToString(); 5380 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5381 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5382 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5383 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5384 5385 if (showPrice && counterPosition == "right") 5386 { 5387 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5388 } 5389 5390 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5391 <span 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"> 5392 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()"> 5393 @cartProductsCount @cartProductsTotalPrice 5394 </span> 5395 </span> 5396 </span> 5397 } 5398 5399 @helper RenderMiniCartCounterContent() 5400 { 5401 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5402 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5403 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5404 5405 <script id="MiniCartCounterContent" type="text/x-template"> 5406 {{#.}} 5407 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 5408 @if (showPriceInMiniCartCounter) 5409 { 5410 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5411 } 5412 else 5413 { 5414 <text>{{numberofproducts}}</text> 5415 } 5416 </span> 5417 {{/.}} 5418 </script> 5419 } 5420 5421 @helper RenderMiniCartDropdownLayout() 5422 { 5423 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5424 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5425 5426 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink"> 5427 <div class="mini-cart-dropdown__inner dw-mod"> 5428 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5429 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5430 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5431 </div> 5432 </div> 5433 </div> 5434 } 5435 5436 @helper RenderMiniCartPanelLayout() 5437 { 5438 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5439 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5440 5441 <div class="mini-cart grid__cell dw-mod"> 5442 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5443 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5444 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5445 <div class="panel__content u-full-width dw-mod"> 5446 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3> 5447 <div class="panel__content-body panel__content-body--cart dw-mod"> 5448 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5449 </div> 5450 </div> 5451 </div> 5452 </div> 5453 } 5454 5455 @helper RenderMiniCartModalLayout() 5456 { 5457 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5458 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5459 5460 <div class="mini-cart grid__cell dw-mod"> 5461 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5462 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5463 <label for="miniCartTrigger" class="modal-overlay"></label> 5464 <div class="modal modal--md modal--top-right dw-mod"> 5465 <div class="modal__body u-flex grid--direction-column dw-mod"> 5466 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5467 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5468 </div> 5469 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5470 </div> 5471 </div> 5472 </div> 5473 } 5474 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5475 5476 @using System 5477 @using System.Web 5478 @using Dynamicweb.Rapido.Blocks.Extensibility 5479 @using Dynamicweb.Rapido.Blocks 5480 5481 @{ 5482 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5483 5484 Block masterDesktopActionsMenuOrderDraft = new Block 5485 { 5486 Id = "MasterDesktopActionsMenuOrderDraft", 5487 SortId = 40, 5488 Template = RenderOrderDraft() 5489 }; 5490 5491 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5492 { 5493 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5494 } 5495 } 5496 5497 @helper RenderOrderDraft() 5498 { 5499 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5500 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5501 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5502 5503 5504 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5505 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5506 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5507 5508 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5509 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5510 <span class="u-inline u-position-relative"> 5511 <i class="@draftIcon fa-1_5x"></i> 5512 </span> 5513 </a> 5514 </li> 5515 } 5516 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5517 5518 @using System 5519 @using System.Web 5520 @using Dynamicweb.Rapido.Blocks.Extensibility 5521 @using Dynamicweb.Rapido.Blocks 5522 5523 @{ 5524 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5525 5526 Block masterDesktopActionsMenuDownloadCart = new Block 5527 { 5528 Id = "MasterDesktopActionsMenuDownloadCart", 5529 SortId = 50, 5530 Template = RenderDownloadCart() 5531 }; 5532 5533 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5534 { 5535 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5536 } 5537 } 5538 5539 @helper RenderDownloadCart() 5540 { 5541 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5542 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5543 5544 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5545 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5546 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5547 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5548 5549 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5550 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5551 <span class="u-inline u-position-relative"> 5552 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5553 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5554 </span> 5555 </a> 5556 </li> 5557 } 5558 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5559 5560 @using System 5561 @using System.Web 5562 @using Dynamicweb.Rapido.Blocks.Extensibility 5563 @using Dynamicweb.Rapido.Blocks 5564 5565 @functions { 5566 public class SearchConfiguration 5567 { 5568 public string searchFeedId { get; set; } 5569 public string searchSecondFeedId { get; set; } 5570 public int groupsFeedId { get; set; } 5571 public string resultPageLink { get; set; } 5572 public string searchPlaceholder { get; set; } 5573 public string searchType { get; set; } 5574 public string searchTemplate { get; set; } 5575 public string searchContentTemplate { get; set; } 5576 public string searchValue { get; set; } 5577 public bool showGroups { get; set; } 5578 5579 public SearchConfiguration() 5580 { 5581 searchFeedId = ""; 5582 searchSecondFeedId = ""; 5583 searchType = "product-search"; 5584 searchContentTemplate = ""; 5585 showGroups = true; 5586 } 5587 } 5588 } 5589 @{ 5590 Block masterSearchBar = new Block 5591 { 5592 Id = "MasterSearchBar", 5593 SortId = 40, 5594 Template = RenderSearch("bar"), 5595 Design = new Design 5596 { 5597 Size = "auto", 5598 HidePadding = true, 5599 RenderType = RenderType.Column 5600 } 5601 }; 5602 5603 Block masterSearchAction = new Block 5604 { 5605 Id = "MasterDesktopActionsMenuSearch", 5606 SortId = 10, 5607 Template = RenderSearch() 5608 }; 5609 5610 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5611 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5612 } 5613 5614 @helper RenderSearch(string type = "mini-search") 5615 { 5616 //string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5617 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("SearchListPage")); 5618 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5619 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5620 5621 SearchConfiguration searchConfiguration = null; 5622 5623 switch (searchType) { 5624 case "contentSearch": 5625 searchConfiguration = new SearchConfiguration() { 5626 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5627 resultPageLink = contentSearchPageLink, 5628 searchPlaceholder = Translate("Search page"), 5629 groupsFeedId = 0, 5630 searchType = "content-search", 5631 searchTemplate = "SearchPagesTemplate", 5632 showGroups = false 5633 }; 5634 break; 5635 case "combinedSearch": 5636 searchConfiguration = new SearchConfiguration() { 5637 searchFeedId = productsPageId + "&feed=true", 5638 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5639 resultPageLink = Converter.ToString(productsPageId), 5640 searchPlaceholder = Translate("Search products or pages"), 5641 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5642 searchType = "combined-search", 5643 searchTemplate = "SearchProductsTemplateWrap", 5644 searchContentTemplate = "SearchPagesTemplateWrap", 5645 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5646 }; 5647 break; 5648 default: //productSearch 5649 searchConfiguration = new SearchConfiguration() { 5650 resultPageLink = Converter.ToString(productsPageId), 5651 searchFeedId = productsPageId + "&feed=true", 5652 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5653 searchPlaceholder = Translate("Search products"), 5654 searchTemplate = "SearchProductsTemplate", 5655 searchType = "product-search", 5656 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5657 }; 5658 break; 5659 } 5660 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5661 5662 if (type == "mini-search") { 5663 @RenderMiniSearch(searchConfiguration) 5664 } else { 5665 @RenderSearchBar(searchConfiguration) 5666 } 5667 } 5668 5669 @helper RenderSearchBar(SearchConfiguration options) 5670 { 5671 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5672 data-page-size="7" 5673 data-search-feed-id="@options.searchFeedId" 5674 data-search-second-feed-id="@options.searchSecondFeedId" 5675 data-result-page-id="@options.resultPageLink" 5676 data-groups-page-id="@options.groupsFeedId" 5677 data-search-type="@options.searchType"> 5678 @if (options.showGroups) 5679 { 5680 <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> 5681 <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=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul> 5682 } 5683 <div class="typeahead-search-field"> 5684 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5685 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5686 { 5687 <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="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 5688 } 5689 else 5690 { 5691 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 5692 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div> 5693 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div> 5694 </div> 5695 } 5696 </div> 5697 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 5698 </div> 5699 } 5700 5701 @helper RenderMiniSearch(SearchConfiguration options) 5702 { 5703 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5704 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5705 5706 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon"> 5707 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 5708 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 5709 </div> 5710 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 5711 <div class="typeahead js-typeahead" id="ProductSearchBar" 5712 data-page-size="7" 5713 data-search-feed-id="@options.searchFeedId" 5714 data-search-second-feed-id="@options.searchSecondFeedId" 5715 data-result-page-id="@options.resultPageLink" 5716 data-search-type="@options.searchType"> 5717 <div class="typeahead-search-field"> 5718 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5719 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5720 { 5721 <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="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 5722 } 5723 else 5724 { 5725 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 5726 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 5727 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div> 5728 </div> 5729 } 5730 </div> 5731 </div> 5732 </div> 5733 </li> 5734 } 5735 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5736 5737 @using System 5738 @using System.Web 5739 @using Dynamicweb.Rapido.Blocks.Extensibility 5740 @using Dynamicweb.Rapido.Blocks 5741 5742 @{ 5743 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5744 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 5745 5746 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 5747 5748 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 5749 headerConfigurationPage.RemoveBlock(configDesktopLogo); 5750 5751 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 5752 headerConfigurationPage.RemoveBlock(configDesktopMenu); 5753 5754 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 5755 headerConfigurationPage.RemoveBlock(configSearchBar); 5756 5757 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 5758 headerConfigurationPage.RemoveBlock(configSearchAction); 5759 5760 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 5761 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 5762 5763 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 5764 5765 switch (headerConfigurationTopLayout) 5766 { 5767 case "condensed": //2 5768 configDesktopLogo.Design.Size = "auto-width"; 5769 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5770 5771 configDesktopMenu.SortId = 20; 5772 configDesktopMenu.Design.Size = "auto"; 5773 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5774 5775 configDesktopActionsMenu.SortId = 30; 5776 configDesktopActionsMenu.Design.Size = "auto-width"; 5777 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5778 5779 if (!headerConfigurationHideSearch) 5780 { 5781 configSearchBar.SortId = 40; 5782 configSearchBar.Design.Size = "12"; 5783 configDesktopExtra.SortId = 50; 5784 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5785 } 5786 break; 5787 case "splitted": //3 5788 configDesktopLogo.Design.Size = "auto"; 5789 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5790 5791 if (!headerConfigurationHideSearch) 5792 { 5793 configSearchBar.SortId = 20; 5794 configSearchBar.Design.Size = "auto"; 5795 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5796 } 5797 5798 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5799 5800 configDesktopActionsMenu.SortId = 20; 5801 configDesktopActionsMenu.Design.Size = "auto-width"; 5802 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5803 break; 5804 case "splitted-center": //4 5805 configDesktopLogo.Design.Size = "auto"; 5806 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5807 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5808 5809 configDesktopActionsMenu.SortId = 30; 5810 configDesktopActionsMenu.Design.Size = "auto-width"; 5811 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5812 5813 if (!headerConfigurationHideSearch) 5814 { 5815 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5816 } 5817 break; 5818 case "minimal": //5 5819 configDesktopLogo.Design.Size = "auto-width"; 5820 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5821 5822 configDesktopMenu.Design.Size = "auto"; 5823 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5824 5825 configDesktopActionsMenu.SortId = 20; 5826 configDesktopActionsMenu.Design.Size = "auto-width"; 5827 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5828 5829 if (!headerConfigurationHideSearch) 5830 { 5831 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5832 } 5833 break; 5834 case "minimal-center": //6 5835 configDesktopLogo.Design.Size = "auto-width"; 5836 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5837 5838 configDesktopMenu.Design.Size = "auto"; 5839 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5840 5841 configDesktopActionsMenu.SortId = 20; 5842 configDesktopActionsMenu.Design.Size = "auto-width"; 5843 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5844 5845 if (!headerConfigurationHideSearch) 5846 { 5847 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5848 } 5849 break; 5850 case "minimal-right": //7 5851 configDesktopLogo.Design.Size = "auto-width"; 5852 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5853 5854 configDesktopMenu.Design.Size = "auto"; 5855 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5856 5857 configDesktopActionsMenu.SortId = 20; 5858 configDesktopActionsMenu.Design.Size = "auto-width"; 5859 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5860 5861 if (!headerConfigurationHideSearch) 5862 { 5863 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5864 } 5865 break; 5866 case "two-lines": //8 5867 configDesktopLogo.Design.Size = "auto"; 5868 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5869 5870 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5871 5872 configDesktopActionsMenu.SortId = 20; 5873 configDesktopActionsMenu.Design.Size = "auto-width"; 5874 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5875 5876 if (!headerConfigurationHideSearch) 5877 { 5878 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5879 } 5880 break; 5881 case "two-lines-centered": //9 5882 configDesktopLogo.Design.Size = "auto"; 5883 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5884 5885 configDesktopMenu.Design.Size = "auto-width"; 5886 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5887 5888 configDesktopActionsMenu.SortId = 20; 5889 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5890 5891 if (!headerConfigurationHideSearch) 5892 { 5893 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5894 } 5895 break; 5896 case "normal": //1 5897 default: 5898 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5899 5900 if (!headerConfigurationHideSearch) 5901 { 5902 configSearchBar.SortId = 20; 5903 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5904 } 5905 5906 configDesktopActionsMenu.SortId = 30; 5907 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5908 5909 configDesktopActionsMenu.Design.Size = "auto-width"; 5910 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5911 break; 5912 } 5913 } 5914 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5915 5916 @using System 5917 @using System.Web 5918 @using Dynamicweb.Rapido.Blocks.Extensibility 5919 @using Dynamicweb.Rapido.Blocks 5920 5921 @{ 5922 5923 } 5924 5925 5926 @helper RenderDesktopTools() 5927 { 5928 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 5929 5930 <div class="tools-navigation dw-mod @Model.CurrentUser.ID>"> 5931 <div class="center-container grid top-container__center-container dw-mod"> 5932 @RenderBlockList(subBlocks) 5933 </div> 5934 </div> 5935 } 5936 5937 @helper RenderDesktopToolsText() 5938 { 5939 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 5940 if (!string.IsNullOrEmpty(toolsText)) 5941 { 5942 <div class="u-margin-top u-margin-bottom">@toolsText</div> 5943 } 5944 } 5945 5946 @helper RenderDesktopToolsNavigation() 5947 { 5948 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5949 5950 if (renderPagesInToolBar) 5951 { 5952 @RenderNavigation(new 5953 { 5954 id = "topToolsNavigation", 5955 cssclass = "menu menu-tools dw-mod dwnavigation", 5956 template = "TopMenu.xslt" 5957 }) 5958 } 5959 } 5960 5961 @helper RenderDesktopNavigation() 5962 { 5963 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 5964 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5965 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 5966 <nav class="main-navigation dw-mod"> 5967 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 5968 @RenderBlockList(subBlocks) 5969 </div> 5970 </nav> 5971 } 5972 5973 @helper RenderDesktopExtra() 5974 { 5975 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 5976 5977 if (subBlocks.Count > 0) 5978 { 5979 <div class="header header-top dw-mod"> 5980 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 5981 @RenderBlockList(subBlocks) 5982 </div> 5983 </div> 5984 } 5985 } 5986 </text> 5987 } 5988 5989 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5990 5991 @using System 5992 @using System.Web 5993 @using Dynamicweb.Rapido.Blocks.Extensibility 5994 @using Dynamicweb.Rapido.Blocks 5995 @using Dynamicweb.Rapido.Blocks.Components.General 5996 @using Dynamicweb.Frontend 5997 5998 @functions { 5999 int impersonationPageId; 6000 string impersonationLayout; 6001 int impersonationFeed; 6002 Block impersonationBar; 6003 6004 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 6005 { 6006 string username = ""; 6007 6008 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 6009 { 6010 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 6011 } 6012 else if (!string.IsNullOrEmpty(name)) 6013 { 6014 username = name; 6015 } 6016 else if (!string.IsNullOrEmpty(email)) 6017 { 6018 username = email; 6019 } 6020 else 6021 { 6022 username = userName; 6023 } 6024 return username; 6025 } 6026 6027 string getUserName(UserViewModel user) 6028 { 6029 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6030 } 6031 6032 string getUserName(Dynamicweb.Security.UserManagement.User user) 6033 { 6034 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6035 } 6036 } 6037 6038 @{ 6039 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 6040 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 6041 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 6042 6043 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0) 6044 { 6045 impersonationBar = new Block 6046 { 6047 Id = "ImpersonationBar", 6048 SortId = 50, 6049 Template = RenderImpersonation(), 6050 SkipRenderBlocksList = true, 6051 Design = new Design 6052 { 6053 Size = "auto-width", 6054 HidePadding = true, 6055 RenderType = RenderType.Column 6056 } 6057 }; 6058 6059 if (impersonationLayout == "top-bar") { 6060 impersonationBar.SortId = 9; 6061 } 6062 6063 Block impersonationContent = new Block 6064 { 6065 Id = "ImpersonationContent", 6066 SortId = 20 6067 }; 6068 6069 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6070 { 6071 //Render stop impersonation view 6072 impersonationContent.Template = RenderStopImpersonationView(); 6073 6074 6075 Modal stopImpersonation = new Modal 6076 { 6077 Id = "StopImpersonation", 6078 Heading = new Heading { 6079 Level = 2, 6080 Title = Translate("Sign out"), 6081 Icon = new Icon { 6082 Name = "fa-sign-out", 6083 Prefix = "fas", 6084 LabelPosition = IconLabelPosition.After 6085 } 6086 }, 6087 Width = ModalWidth.Sm, 6088 BodyTemplate = RenderStopImpersonationForm() 6089 }; 6090 6091 Block stopImpersonationBlock = new Block 6092 { 6093 Id = "StopImpersonationBlock", 6094 SortId = 10, 6095 Component = stopImpersonation 6096 }; 6097 impersonationBar.BlocksList.Add(stopImpersonationBlock); 6098 } 6099 else 6100 { 6101 //Render main view 6102 switch (impersonationLayout) 6103 { 6104 case "right-lower-box": 6105 impersonationContent.BlocksList.Add( 6106 new Block { 6107 Id = "RightLowerBoxHeader", 6108 SortId = 10, 6109 Component = new Heading { 6110 Level = 5, 6111 Title = Translate("View the list of users you can sign in as"), 6112 CssClass = "impersonation-text" 6113 } 6114 } 6115 ); 6116 impersonationContent.BlocksList.Add( 6117 new Block { 6118 Id = "RightLowerBoxContent", 6119 SortId = 20, 6120 Template = RenderImpersonationControls() 6121 } 6122 ); 6123 break; 6124 case "right-lower-bar": 6125 impersonationContent.BlocksList.Add( 6126 new Block { 6127 Id = "RightLowerBarContent", 6128 SortId = 10, 6129 Template = RenderImpersonationControls() 6130 } 6131 ); 6132 break; 6133 case "bar": 6134 default: 6135 impersonationContent.BlocksList.Add( 6136 new Block { 6137 Id = "ViewListLink", 6138 SortId = 20, 6139 Template = RenderViewListLink() 6140 } 6141 ); 6142 impersonationContent.BlocksList.Add( 6143 new Block { 6144 Id = "BarTypeaheadSearch", 6145 SortId = 30, 6146 Template = RenderTypeaheadSearch() 6147 } 6148 ); 6149 break; 6150 } 6151 } 6152 impersonationBar.BlocksList.Add(impersonationContent); 6153 6154 impersonationBar.BlocksList.Add( 6155 new Block 6156 { 6157 Id = "ImpersonationSearchTemplates", 6158 SortId = 30, 6159 Template = RenderSearchResultTemplate() 6160 } 6161 ); 6162 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 6163 { 6164 impersonationBar.BlocksList.Add( 6165 new Block 6166 { 6167 Id = "ImpersonationSearchScripts", 6168 SortId = 40, 6169 Template = RenderSearchScripts() 6170 } 6171 ); 6172 } 6173 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6174 } 6175 } 6176 6177 @helper RenderImpersonation() 6178 { 6179 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6180 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6181 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6182 @if (impersonationLayout == "right-lower-box") 6183 { 6184 @RenderRightLowerBoxHeader() 6185 } 6186 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6187 @*Impersonation*@ 6188 @RenderBlockList(subBlocks) 6189 </div> 6190 </div> 6191 } 6192 6193 @helper RenderRightLowerBoxHeader() 6194 { 6195 <div class="impersonation__header dw-mod"> 6196 <div class="impersonation__title">@Translate("Impersonation")</div> 6197 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6198 @Render(new Icon 6199 { 6200 Prefix = "fas", 6201 Name = "fa-window-minimize" 6202 }) 6203 </label> 6204 </div> 6205 } 6206 6207 @helper RenderStopImpersonationView() 6208 { 6209 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6210 string userName = getUserName(Pageview.User); 6211 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> "; 6212 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText; 6213 6214 if (impersonationLayout == "right-lower-box") 6215 { 6216 <div class="u-margin-bottom--lg u-ta-center"> 6217 @impersonationText 6218 </div> 6219 <div class="u-margin-bottom--lg u-ta-center"> 6220 @RenderSwitchAccountButton() 6221 </div> 6222 @RenderStopImpersonationButton() 6223 } 6224 else 6225 { 6226 <div class="grid grid--align-center impersonation__stop-wrap"> 6227 <div class="impersonation-bar-item dw-mod"> 6228 @impersonationText 6229 </div> 6230 <div class="impersonation-bar-item dw-mod"> 6231 @RenderSwitchAccountButton() 6232 </div> 6233 <div class="impersonation-bar-item dw-mod"> 6234 @RenderStopImpersonationButton() 6235 </div> 6236 </div> 6237 } 6238 } 6239 6240 @helper RenderSwitchAccountButton() { 6241 @Render(new Button 6242 { 6243 Href = "/Default.aspx?ID=" + impersonationPageId, 6244 ButtonType = ButtonType.Button, 6245 ButtonLayout = ButtonLayout.Clean, 6246 Title = Translate("Switch account"), 6247 Icon = new Icon { 6248 Name = "fa-users", 6249 Prefix = "fal", 6250 LabelPosition = IconLabelPosition.After 6251 }, 6252 CssClass = "u-no-margin u-color-inherit" 6253 }) 6254 } 6255 6256 @helper RenderStopImpersonationForm() 6257 { 6258 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6259 string userName = getUserName(Pageview.User); 6260 int pageId = Model.TopPage.ID; 6261 6262 <form method="post" class="u-no-margin"> 6263 @Render(new Button 6264 { 6265 ButtonType = ButtonType.Submit, 6266 ButtonLayout = ButtonLayout.Secondary, 6267 Title = Translate("Sign out as") + " " + userName, 6268 Href = "/Default.aspx?ID=" + impersonationPageId, 6269 CssClass = "btn--full", 6270 Name = "DwExtranetRemoveSecondaryUser" 6271 }) 6272 6273 @Render(new Button 6274 { 6275 ButtonType = ButtonType.Submit, 6276 ButtonLayout = ButtonLayout.Secondary, 6277 Title = Translate("Sign out as") + " " + secondaryUserName, 6278 Href = "/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, 6279 CssClass = "btn--full", 6280 Name = "DwExtranetRemoveSecondaryUser" 6281 }) 6282 </form> 6283 } 6284 6285 @helper RenderStopImpersonationButton() { 6286 @Render(new Button 6287 { 6288 ButtonType = ButtonType.Button, 6289 ButtonLayout = ButtonLayout.Clean, 6290 Title = Translate("Sign out"), 6291 Icon = new Icon { 6292 Name = "fa-sign-out", 6293 Prefix = "fal", 6294 LabelPosition = IconLabelPosition.After 6295 }, 6296 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6297 CssClass = "u-no-margin" 6298 }) 6299 } 6300 6301 @helper RenderImpersonationControls() 6302 { 6303 <div class="impersonation__controls"> 6304 @RenderViewListLink() 6305 @RenderSearchBox() 6306 </div> 6307 @RenderResultsList() 6308 } 6309 6310 @helper RenderViewListLink() 6311 { 6312 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6313 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6314 6315 @Render(new Link { 6316 ButtonLayout = ButtonLayout.None, 6317 Title = title, 6318 Href = "/Default.aspx?ID=" + impersonationPageId, 6319 CssClass = buttonClasses 6320 }) 6321 } 6322 6323 @helper RenderSearchBox() 6324 { 6325 <div class="impersonation__search-wrap"> 6326 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6327 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6328 <i class="fal fa-search"></i> 6329 </div> 6330 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6331 <i class="fal fa-times"></i> 6332 </div> 6333 </div> 6334 } 6335 6336 @helper RenderTypeaheadSearch() 6337 { 6338 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6339 data-page-size="5" 6340 data-search-feed-id="@impersonationFeed" 6341 data-result-page-id="@impersonationPageId" 6342 data-search-type="user-search" 6343 data-search-parameter-name="q"> 6344 6345 <div class="typeahead-search-field"> 6346 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 6347 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul> 6348 </div> 6349 </div> 6350 } 6351 6352 @helper RenderResultsList() 6353 { 6354 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul> 6355 } 6356 6357 @helper RenderSearchResultTemplate() 6358 { 6359 <script id="ImpersonationSearchResult" type="text/x-template"> 6360 {{#.}} 6361 {{#Users}} 6362 <li class="impersonation__search-results-item impersonation-user"> 6363 <form method="post" class="impersonation-user__form" name="account{{id}}"> 6364 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 6365 <div class="impersonation-user__info"> 6366 <div class="impersonation-user__name">{{userName}}</div> 6367 <div class="impersonation-user__number">{{customerNumber}}</div> 6368 </div> 6369 @Render(new Button 6370 { 6371 ButtonType = ButtonType.Submit, 6372 ButtonLayout = ButtonLayout.Secondary, 6373 Title = Translate("Sign in as"), 6374 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 6375 }) 6376 </form> 6377 </li> 6378 {{/Users}} 6379 {{#unless Users}} 6380 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 6381 @Translate("Your search gave 0 results") 6382 </li> 6383 {{/unless}} 6384 {{/.}} 6385 </script> 6386 } 6387 6388 @helper RenderSearchScripts() 6389 { 6390 <script> 6391 let inputDelayTimer; 6392 function searchKeyUpHandler(e) { 6393 clearTimeout(inputDelayTimer); 6394 let value = e.target.value; 6395 if (value != "") { 6396 inputDelayTimer = setTimeout(function () { 6397 updateResults(value); 6398 }, 500); 6399 } else { 6400 clearResults(); 6401 } 6402 }; 6403 6404 function updateResults(value) { 6405 if (value == "") { 6406 return null; 6407 } 6408 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 6409 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 6410 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 6411 } 6412 6413 function clearResults() { 6414 document.getElementById("ImpersonationBoxSearchField").value = ""; 6415 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 6416 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 6417 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 6418 } 6419 </script> 6420 } 6421 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6422 6423 @using System 6424 @using System.Web 6425 @using System.Collections.Generic 6426 @using Dynamicweb.Rapido.Blocks.Extensibility 6427 @using Dynamicweb.Rapido.Blocks 6428 6429 @{ 6430 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 6431 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 6432 6433 Block orderLines = new Block 6434 { 6435 Id = "MiniCartOrderLines", 6436 SkipRenderBlocksList = true, 6437 BlocksList = new List<Block> 6438 { 6439 new Block { 6440 Id = "MiniCartOrderLinesList", 6441 SortId = 20, 6442 Template = RenderMiniCartOrderLinesList() 6443 } 6444 } 6445 }; 6446 6447 Block orderlinesScriptTemplates = new Block 6448 { 6449 Id = "OrderlinesScriptTemplates" 6450 }; 6451 6452 if (orderlinesView == "table") 6453 { 6454 orderLines.Template = RenderMiniCartOrderLinesTable(); 6455 orderLines.BlocksList.Add( 6456 new Block 6457 { 6458 Id = "MiniCartOrderlinesTableHeader", 6459 SortId = 10, 6460 Template = RenderMiniCartOrderLinesHeader() 6461 } 6462 ); 6463 6464 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 6465 } 6466 else 6467 { 6468 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 6469 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 6470 } 6471 6472 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 6473 6474 Block miniCartScriptTemplates = new Block() 6475 { 6476 Id = "MasterMiniCartTemplates", 6477 SortId = 1, 6478 Template = RenderMiniCartScriptTemplates(), 6479 SkipRenderBlocksList = true, 6480 BlocksList = new List<Block> 6481 { 6482 orderLines, 6483 new Block { 6484 Id = "MiniCartFooter", 6485 Template = RenderMiniCartFooter(), 6486 SortId = 50, 6487 SkipRenderBlocksList = true, 6488 BlocksList = new List<Block> 6489 { 6490 new Block { 6491 Id = "MiniCartSubTotal", 6492 Template = RenderMiniCartSubTotal(), 6493 SortId = 30 6494 }, 6495 new Block { 6496 Id = "MiniCartFees", 6497 Template = RenderMiniCartFees(), 6498 SortId = 40 6499 }, 6500 new Block { 6501 Id = "MiniCartPoints", 6502 Template = RenderMiniCartPoints(), 6503 SortId = 50 6504 }, 6505 new Block { 6506 Id = "MiniCartTotal", 6507 Template = RenderMiniCartTotal(), 6508 SortId = 60 6509 }, 6510 new Block { 6511 Id = "MiniCartDisclaimer", 6512 Template = RenderMiniCartDisclaimer(), 6513 SortId = 70 6514 }, 6515 new Block { 6516 Id = "MiniCartActions", 6517 Template = RenderMiniCartActions(), 6518 SortId = 80 6519 } 6520 } 6521 } 6522 } 6523 }; 6524 6525 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 6526 } 6527 6528 @helper RenderMiniCartScriptsTableTemplates() 6529 { 6530 <script id="MiniCartOrderline" type="text/x-template"> 6531 {{#unless isEmpty}} 6532 <tr> 6533 <td class="u-w60px"><a href="{{link}}" class="{{hideimage}}"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"></a></td> 6534 <td class="u-va-middle"> 6535 6536 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a> 6537 <a href="{{link}}" class="mini-cart-orderline__name" title="{{productnumber}}">@Translate("Art.br."): {{productnumber}}</a> 6538 {{#if variantname}} 6539 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm HiddenInCart">{{variantname}}</a> 6540 {{/if}} 6541 {{#if unitname}} 6542 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm HiddenInCart">{{unitname}}</div> 6543 {{/if}} 6544 </td> 6545 <td class="u-ta-right u-va-middle">{{quantity}}</td> 6546 <td class="u-ta-right u-va-middle"> 6547 {{#if pointsTotal}} 6548 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6549 {{else}} 6550 {{totalprice}} 6551 {{/if}} 6552 </td> 6553 </tr> 6554 {{/unless}} 6555 </script> 6556 6557 6558 @* DIGNET IvanB 6559 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6560 {{#unless isEmpty}} 6561 <tr class="table__row--no-border"> 6562 <td class="u-w60px">&nbsp;</td> 6563 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 6564 <td class="u-ta-right">&nbsp;</td> 6565 <td class="u-ta-right">{{totalprice}}</td> 6566 </tr> 6567 {{/unless}} 6568 </script> 6569 DIGNET IvanB *@ 6570 6571 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6572 {{#ifEquals discountpercent "0.00%"}} 6573 {{else}} 6574 <tr class="table__row--no-border {{isempty}}"> 6575 <td>&nbsp;</td> 6576 {{#ifEquals name "Additional Discount"}} 6577 <td><div class="mini-cart-orderlines__name dw-mod">@Translate("Additional discount")</div></td> 6578 <td><div class="mini-cart-orderlines__name dw-mod u-ta-right aa">{{discountpercent}}</div></td> 6579 <td class="u-ta-right">{{totalprice}}</td> 6580 {{else}} 6581 <td><div class="mini-cart-orderlines__name dw-mod">@Translate("Discount")</div></td> 6582 <td><div class="mini-cart-orderlines__name dw-mod u-ta-right aa">{{discountpercent}}</div></td> 6583 <td class="u-ta-right">{{totalprice}}</td> 6584 {{/ifEquals}} 6585 </tr> 6586 {{/ifEquals}} 6587 </script> 6588 6589 6590 6591 } 6592 6593 @helper RenderMiniCartScriptsListTemplates() 6594 { 6595 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6596 6597 <script id="MiniCartOrderline" type="text/x-template"> 6598 {{#unless isEmpty}} 6599 <div class="mini-cart-orderline grid dw-mod"> 6600 <div class="grid__col-4"> 6601 <a href="{{link}}" class="{{hideimage}}"> 6602 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"> 6603 </a> 6604 </div> 6605 <div class="grid__col-8"> 6606 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a> 6607 {{#if variantname}} 6608 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 6609 {{/if}} 6610 {{#if unitname}} 6611 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 6612 {{/if}} 6613 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 6614 6615 <div class="grid__cell-footer"> 6616 <div class="grid__cell"> 6617 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 6618 {{#if pointsTotal}} 6619 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6620 {{else}} 6621 {{totalprice}} 6622 {{/if}} 6623 </div> 6624 <button type="button" 6625 title="@Translate("Remove orderline")" 6626 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 6627 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 6628 </div> 6629 </div> 6630 </div> 6631 </div> 6632 {{/unless}} 6633 </script> 6634 6635 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6636 {{#unless isEmpty}} 6637 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 6638 <div class="grid__col-4"> 6639 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 6640 </div> 6641 <div class="grid__col-8">{{totalprice}}</div> 6642 </div> 6643 {{/unless}} 6644 </script> 6645 } 6646 6647 @helper RenderMiniCartScriptTemplates() 6648 { 6649 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 6650 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6651 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 6652 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6653 6654 <script id="MiniCartContent" type="text/x-template"> 6655 {{#.}} 6656 {{#unless isEmpty}} 6657 @if (miniCartUseGoogleTagManager) 6658 { 6659 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 6660 } 6661 @RenderBlockList(subBlocks) 6662 {{/unless}} 6663 {{/.}} 6664 </script> 6665 } 6666 6667 @helper RenderMiniCartOrderLinesTable() 6668 { 6669 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6670 6671 <div class="u-overflow-auto"> 6672 <table class="table mini-cart-table dw-mod"> 6673 @RenderBlockList(subBlocks) 6674 </table> 6675 </div> 6676 } 6677 6678 @helper RenderMiniCartOrderLinesBlocks() 6679 { 6680 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6681 6682 <div class="u-overflow-auto"> 6683 @RenderBlockList(subBlocks) 6684 </div> 6685 } 6686 6687 @helper RenderMiniCartOrderLinesHeader() 6688 { 6689 <thead> 6690 <tr> 6691 <td>&nbsp;</td> 6692 <td>@Translate("Product")</td> 6693 <td class="u-ta-right">@Translate("Qty")</td> 6694 <td class="u-ta-right" width="120">@Translate("Price")</td> 6695 </tr> 6696 </thead> 6697 } 6698 6699 @helper RenderMiniCartOrderLinesList() 6700 { 6701 <text> 6702 {{#OrderLines}} 6703 {{#ifCond template "===" "CartOrderline"}} 6704 {{>MiniCartOrderline}} 6705 {{/ifCond}} 6706 {{#ifCond template "===" "CartOrderlineMobile"}} 6707 {{>MiniCartOrderline}} 6708 {{/ifCond}} 6709 {{#ifCond template "===" "CartOrderlineDiscount"}} 6710 {{>MiniCartOrderlineDiscount}} 6711 {{/ifCond}} 6712 {{/OrderLines}} 6713 </text> 6714 } 6715 6716 @helper RenderMiniCartFees() 6717 { 6718 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6719 if (!pointShop) 6720 { 6721 <text> 6722 {{#unless hidePaymentfee}} 6723 <div class="grid "> 6724 <div class="grid__col-6 grid__col--bleed-y"> 6725 {{paymentmethod}} 6726 </div> 6727 @*<div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div>*@ 6728 </div> 6729 {{/unless}} 6730 </text> 6731 } 6732 <text> 6733 {{#unless hideShippingfee}} 6734 <div class="grid"> 6735 <div class="grid__col-6 grid__col--bleed-y"> 6736 {{shippingmethod}} 6737 6738 </div> 6739 6740 {{#switch shippingfee}} 6741 {{#case "Beregnes"}} <div class="grid__col-6 grid__col--bleed-y grid--align-end">@Translate("Calculated")</div>{{/case}} 6742 {{#case "Free"}} <div class="grid__col-6 grid__col--bleed-y grid--align-end">@Translate("Calculated")</div> {{/case}} 6743 {{#default shippingfee}}<div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div>{{/default}} 6744 {{/switch}} 6745 6746 6747 6748 6749 </div> 6750 {{/unless}} 6751 6752 </text> 6753 <text> 6754 {{#if hasTaxSettings}} 6755 <div class="grid"> 6756 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 6757 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 6758 </div> 6759 {{/if}} 6760 </text> 6761 } 6762 6763 @helper RenderMiniCartFooter() 6764 { 6765 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 6766 6767 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 6768 @RenderBlockList(subBlocks) 6769 </div> 6770 } 6771 6772 @helper RenderMiniCartActions() 6773 { 6774 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6775 <div class="CartButtons"> 6776 <button style="width: fit-content!important;padding: 8px 10px;" type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);">@Translate("Empty cart")</button> 6777 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Go to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod" style="width: fit-content!important;">@Translate("Go to cart")</a> 6778 </div> 6779 } 6780 6781 @helper RenderMiniCartPoints() 6782 { 6783 <text> 6784 {{#if earnings}} 6785 <div class="grid"> 6786 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 6787 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6788 <div> 6789 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 6790 </div> 6791 </div> 6792 </div> 6793 {{/if}} 6794 </text> 6795 } 6796 6797 @helper RenderMiniCartSubTotal() 6798 { 6799 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 6800 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6801 if (!pointShop) 6802 { 6803 <text> 6804 {{#unless hideSubTotal}} 6805 <div class="grid dw-mod u-bold HiddenInCart"> 6806 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 6807 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6808 @if (hasTaxSettings) 6809 { 6810 <text>{{subtotalpricewithouttaxes}}</text> 6811 } 6812 else 6813 { 6814 <text>{{subtotalprice}}</text> 6815 } 6816 </div> 6817 </div> 6818 {{/unless}} 6819 </text> 6820 } 6821 } 6822 6823 @helper RenderMiniCartTotal() 6824 { 6825 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6826 6827 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod" > 6828 <table style="font-size:14px;"> <tr class="mini-cart-totals dw-mod" style="border-bottom: 0.1rem solid #d3d3d3;"> 6829 <td colspan="2">@Translate("Total")</td> 6830 <td class="u-ta-right HiddenInCart">{{numberofproducts}}</td> 6831 6832 @* DS - Price fix to match the total from cart(revieworder), before it used the totalprice property *@ 6833 <td class="u-ta-right" width="130">{{totalPriceWithVat}}</td> 6834 </tr> 6835 </table> 6836 @if (pointShop) 6837 { 6838 <div class="grid__col-6 grid--align-end"> 6839 <div> 6840 6841 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 6842 6843 </div> 6844 </div> 6845 } 6846 </div> 6847 } 6848 6849 @helper RenderMiniCartDisclaimer() 6850 { 6851 <text> 6852 {{#if showCheckoutDisclaimer}} 6853 <div class="grid u-margin-bottom u-ta-right"> 6854 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 6855 </div> 6856 {{/if}} 6857 </text> 6858 } 6859 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6860 6861 @using Dynamicweb.Rapido.Blocks.Extensibility 6862 @using Dynamicweb.Rapido.Blocks 6863 @using Dynamicweb.Rapido.Blocks.Components.General 6864 @using Dynamicweb.Rapido.Blocks.Components 6865 @using Dynamicweb.Rapido.Services 6866 6867 @{ 6868 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 6869 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 6870 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 6871 6872 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 6873 { 6874 if (addToCartNotificationType == "modal") 6875 { 6876 Block addToCartNotificationModal = new Block 6877 { 6878 Id = "AddToCartNotificationModal", 6879 Template = RenderAddToCartNotificationModal() 6880 }; 6881 6882 Block addToCartNotificationScript = new Block 6883 { 6884 Id = "AddToCartNotificationScript", 6885 Template = RenderAddToCartNotificationModalScript() 6886 }; 6887 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 6888 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6889 } 6890 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 6891 { 6892 Block addToCartNotificationScript = new Block 6893 { 6894 Id = "AddToCartNotificationScript", 6895 Template = RenderAddToCartNotificationToggleScript() 6896 }; 6897 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6898 } 6899 } 6900 } 6901 6902 @helper RenderAddToCartNotificationModal() 6903 { 6904 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 6905 } 6906 6907 @helper RenderAddToCartNotificationModalScript() 6908 { 6909 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6910 6911 <script id="LastAddedProductTemplate" type="text/x-template"> 6912 @{ 6913 6914 Modal lastAddedProduct = new Modal 6915 { 6916 Id = "LastAddedProduct", 6917 Heading = new Heading 6918 { 6919 Level = 2, 6920 Title = Translate("Product is added to the cart") 6921 }, 6922 Width = ModalWidth.Md, 6923 BodyTemplate = RenderModalContent() 6924 }; 6925 6926 lastAddedProduct.AddActions( 6927 new Button 6928 { 6929 ButtonType = ButtonType.Button, 6930 ButtonLayout = ButtonLayout.Secondary, 6931 Title = Translate("Continue shopping"), 6932 CssClass = "u-pull--left u-no-margin btn--sm", 6933 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6934 }, 6935 new Link 6936 { 6937 Href = "/Default.aspx?ID=" + cartPageId, 6938 ButtonLayout = ButtonLayout.Secondary, 6939 CssClass = "u-pull--right u-no-margin btn--sm", 6940 Title = Translate("Proceed to checkout"), 6941 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6942 } 6943 ); 6944 6945 @Render(lastAddedProduct) 6946 } 6947 </script> 6948 <script> 6949 document.addEventListener('addToCart', function (event) { 6950 Cart.ShowLastAddedProductModal(event.detail); 6951 }); 6952 </script> 6953 } 6954 6955 @helper RenderModalContent() 6956 { 6957 <div class="grid"> 6958 <div class="grid__col-2"> 6959 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 6960 </div> 6961 <div class="u-padding grid--align-self-center"> 6962 <span>{{quantity}}</span> x 6963 </div> 6964 <div class="grid__col-auto grid--align-self-center"> 6965 <div>{{productInfo.name}}</div> 6966 {{#if productInfo.variantName}} 6967 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 6968 {{/if}} 6969 {{#if productInfo.unitName}} 6970 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 6971 {{/if}} 6972 </div> 6973 </div> 6974 } 6975 6976 @helper RenderAddToCartNotificationToggleScript() 6977 { 6978 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6979 6980 <script> 6981 document.addEventListener('addToCart', function () { 6982 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 6983 }); 6984 </script> 6985 } 6986 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6987 6988 @using System 6989 @using System.Web 6990 @using System.Collections.Generic 6991 @using Dynamicweb.Rapido.Blocks.Extensibility 6992 @using Dynamicweb.Rapido.Blocks 6993 @using Dynamicweb.Rapido.Blocks.Components.General 6994 6995 @functions { 6996 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 6997 } 6998 6999 @{ 7000 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 7001 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 7002 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 7003 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 7004 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 7005 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 7006 7007 Block masterFooterContent = new Block() 7008 { 7009 Id = "MasterFooterContent", 7010 SortId = 10, 7011 Template = RenderFooter(), 7012 SkipRenderBlocksList = true 7013 }; 7014 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 7015 7016 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 7017 { 7018 Block masterFooterColumnOne = new Block 7019 { 7020 Id = "MasterFooterColumnOne", 7021 SortId = 10, 7022 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 7023 Design = new Design 7024 { 7025 Size = "auto", 7026 RenderType = RenderType.Column 7027 } 7028 }; 7029 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 7030 } 7031 7032 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 7033 { 7034 Block masterFooterColumnTwo = new Block 7035 { 7036 Id = "MasterFooterColumnTwo", 7037 SortId = 20, 7038 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 7039 Design = new Design 7040 { 7041 Size = "auto", 7042 RenderType = RenderType.Column 7043 } 7044 }; 7045 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 7046 } 7047 7048 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 7049 { 7050 Block masterFooterColumnThree = new Block 7051 { 7052 Id = "MasterFooterColumnThree", 7053 SortId = 30, 7054 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 7055 Design = new Design 7056 { 7057 Size = "auto", 7058 RenderType = RenderType.Column 7059 } 7060 }; 7061 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 7062 } 7063 7064 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 7065 { 7066 Block masterFooterNewsletterSignUp = new Block 7067 { 7068 Id = "MasterFooterNewsletterSignUp", 7069 SortId = 40, 7070 Template = RenderFooterNewsletterSignUp(), 7071 Design = new Design 7072 { 7073 Size = "auto", 7074 RenderType = RenderType.Column 7075 } 7076 }; 7077 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 7078 } 7079 7080 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 7081 { 7082 Block masterFooterSocialLinks = new Block 7083 { 7084 Id = "MasterFooterSocialLinks", 7085 SortId = 50, 7086 Template = RenderFooterSocialLinks(), 7087 Design = new Design 7088 { 7089 Size = "auto", 7090 RenderType = RenderType.Column 7091 } 7092 }; 7093 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 7094 } 7095 7096 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 7097 { 7098 Block masterFooterPayments = new Block 7099 { 7100 Id = "MasterFooterPayments", 7101 SortId = 60, 7102 Template = RenderFooterPayments(), 7103 Design = new Design 7104 { 7105 Size = "12", 7106 RenderType = RenderType.Column 7107 } 7108 }; 7109 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 7110 } 7111 7112 Block masterFooterCopyright = new Block 7113 { 7114 Id = "MasterFooterCopyright", 7115 SortId = 70, 7116 Template = RenderFooterCopyright(), 7117 Design = new Design 7118 { 7119 Size = "12", 7120 RenderType = RenderType.Column 7121 } 7122 }; 7123 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 7124 } 7125 7126 @helper RenderFooter() 7127 { 7128 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 7129 7130 <footer class="footer no-print dw-mod"> 7131 <div class="center-container top-container__center-container dw-mod"> 7132 <div class="grid grid--external-bleed-x"> 7133 @RenderBlockList(subBlocks) 7134 </div> 7135 </div> 7136 </footer> 7137 } 7138 7139 @helper RenderFooterColumn(string header, string content) 7140 { 7141 <h3 class="footer__heading dw-mod">@header</h3> 7142 <div class="footer__content dw-mod"> 7143 @content 7144 </div> 7145 } 7146 7147 @helper RenderFooterNewsletterSignUp() 7148 { 7149 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 7150 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 7151 7152 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 7153 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 7154 form.Add(new TextField { 7155 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 7156 Type = TextFieldType.Email, 7157 ActionButton = new Button { 7158 ButtonType = ButtonType.Submit, Id="Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 7159 } 7160 }); 7161 7162 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 7163 <div class="footer__content dw-mod"> 7164 @Render(form) 7165 </div> 7166 } 7167 7168 @helper RenderFooterSocialLinks() 7169 { 7170 //<h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 7171 <h3 class="footer__heading dw-mod">&nbsp</h3> 7172 7173 <div class="footer__content dw-mod"> 7174 <div class="collection dw-mod"> 7175 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 7176 { 7177 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 7178 string socialIconClass = socialIcon.SelectedValue; 7179 string socialIconTitle = socialIcon.SelectedName; 7180 string socialLink = socialitem.GetString("Link"); 7181 7182 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a> 7183 } 7184 </div> 7185 </div> 7186 } 7187 7188 @helper RenderFooterPayments() 7189 { 7190 <div class="footer__content dw-mod"> 7191 <div class="collection dw-mod"> 7192 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 7193 { 7194 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 7195 string paymentImage = null; 7196 string paymentTitle = paymentItem.SelectedName; 7197 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 7198 if (selected != null) 7199 { 7200 paymentImage = selected.Icon; 7201 } 7202 7203 <div class="footer__card-type"> 7204 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle" /> 7205 </div> 7206 } 7207 </div> 7208 </div> 7209 } 7210 7211 @helper RenderFooterCopyright() 7212 { 7213 <div class="grid__col-12 footer__copyright dw-mod"> 7214 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 7215 </div> 7216 } 7217 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7218 7219 @using System 7220 @using System.Web 7221 @using System.Collections.Generic 7222 @using Dynamicweb.Rapido.Blocks.Extensibility 7223 @using Dynamicweb.Rapido.Blocks 7224 @using Dynamicweb.Ecommerce.Common 7225 7226 @{ 7227 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 7228 7229 Block masterScriptReferences = new Block() 7230 { 7231 Id = "MasterScriptReferences", 7232 SortId = 1, 7233 Template = RenderMasterScriptReferences() 7234 }; 7235 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 7236 } 7237 7238 @helper RenderMasterScriptReferences() { 7239 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"></script> 7240 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script> 7241 @*<script src="/Files/Templates/Designs/Rapido/js/master.js"></script>*@ 7242 7243 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 7244 { 7245 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script> 7246 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js"); 7247 } 7248 7249 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 7250 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js"); 7251 //PushPromise("/Files/Templates/Designs/Rapido/js/master.js"); 7252 } 7253 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7254 7255 @using System 7256 @using System.Web 7257 @using System.Collections.Generic 7258 @using Dynamicweb.Rapido.Blocks.Extensibility 7259 @using Dynamicweb.Rapido.Blocks 7260 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7261 @using Dynamicweb.Rapido.Services 7262 7263 @{ 7264 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 7265 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 7266 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 7267 7268 if (!navigationItemsHideSearch || isFavoriteList) 7269 { 7270 Block masterSearchScriptTemplates = new Block() 7271 { 7272 Id = "MasterSearchScriptTemplates", 7273 SortId = 1, 7274 Template = RenderSearchScriptTemplates() 7275 }; 7276 7277 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 7278 } 7279 } 7280 7281 @helper RenderSearchScriptTemplates() 7282 { 7283 int productsPageId = GetPageIdByNavigationTag("SearchListPage"); 7284 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 7285 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 7286 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 7287 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 7288 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 7289 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 7290 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 7291 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7292 7293 <script id="SearchGroupsTemplate" type="text/x-template"> 7294 {{#.}} 7295 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 7296 {{/.}} 7297 </script> 7298 7299 <script id="SearchProductsTemplate" type="text/x-template"> 7300 {{#each .}} 7301 {{#Product}} 7302 {{#ifCond template "!==" "SearchMore"}} 7303 <li class="dropdown__item dropdown__item--seperator dw-mod"> 7304 @if (useFacebookPixel) 7305 { 7306 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 7307 } 7308 @if (useGoogleTagManager) 7309 { 7310 <text>{{{googleEnchantImpression googleImpression}}}</text> 7311 } 7312 <div> 7313 <a href="{{link}}" 7314 class="js-typeahead-link u-color-inherit u-pull--left" 7315 onclick="{{#if googleImpression}}({{googleImpression}}, event){{/if}}" 7316 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 7317 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"></div> 7318 <div class="u-pull--left"> 7319 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}{{#if variantName}}, {{variantName}}{{/if}}</div> 7320 @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 7321 { 7322 if (pointShopOnly) 7323 { 7324 <text> 7325 {{#unless HidePriceDS}} 7326 {{#if havePointPrice}} 7327 <div> 7328 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 7329 </div> 7330 {{else}} 7331 <small class="help-text u-no-margin">@Translate("Not available")</small> 7332 {{/if}} 7333 {{#unless canBePurchasedWithPoints}} 7334 {{#if havePointPrice}} 7335 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 7336 {{/if}} 7337 {{/unless}} 7338 {{//unless}} 7339 </text> 7340 } 7341 else 7342 { 7343 <text> 7344 {{#unless HidePriceDS}} 7345 <div>{{price}}</div> 7346 {{/unless}} 7347 </text> 7348 } 7349 } 7350 </div> 7351 </a> 7352 <div class="u-margin-left u-pull--right"> 7353 @{ 7354 var viewBtn = new Link 7355 { 7356 Href = "{{link}}", 7357 OnClick = "{{#if googleImpression}}({{googleImpression}}, event){{/if}}", 7358 ButtonLayout = ButtonLayout.Secondary, 7359 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside", 7360 Title = Translate("View") 7361 }; 7362 } 7363 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7364 {<text> 7365 {{#unless HidePriceDS}} 7366 <text>{{#if hideAddToCartButton}}</text> 7367 @Render(viewBtn) 7368 <text>{{else}}</text> 7369 {{#if ProductPriceIsMinimum}} 7370 <a href="{{link}}" class="js-cart-btn btn btn--secondary btn--condensed u-no-margin u-pull--right dw-mod" onclick="Scroll.SavePosition(event); {{googleImpressionClick}}" title="{{name}}"> 7371 @Translate("Select length") 7372 </a> 7373 {{else}} 7374 @Render(new AddToCartButton 7375 { 7376 HideTitle = true, 7377 ProductInfo = "{{productInfo}}", 7378 BuyForPoints = pointShopOnly, 7379 OnClick = "{{facebookPixelAction}}", 7380 CssClass = "u-w80px u-no-margin js-ignore-click-outside", 7381 Icon = new Icon { 7382 CssClass = "js-ignore-click-outside" 7383 }, 7384 ExtraAttributes = new Dictionary<string, string> 7385 { 7386 { "{{disabledBuyButton}}", "" } 7387 } 7388 }) 7389 {{/if}} 7390 <text>{{/if}}</text> 7391 {{/unless}} 7392 </text> 7393 } 7394 else if (showViewButton) 7395 { 7396 @Render(viewBtn) 7397 } 7398 @if (showAddToDownloadButton) 7399 { 7400 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 7401 <i class="fas fa-plus js-button-icon"></i> 7402 </button> 7403 } 7404 </div> 7405 </div> 7406 </li> 7407 {{/ifCond}} 7408 {{#ifCond template "===" "SearchMore"}} 7409 {{>SearchMoreProducts}} 7410 {{/ifCond}} 7411 {{/Product}} 7412 {{else}} 7413 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7414 @Translate("Your search gave 0 results") 7415 </li> 7416 {{/each}} 7417 </script> 7418 7419 <script id="SearchMoreProducts" type="text/x-template"> 7420 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7421 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7422 @Translate("View all") 7423 </a> 7424 </li> 7425 </script> 7426 7427 <script id="SearchMorePages" type="text/x-template"> 7428 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7429 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7430 @Translate("View all") 7431 </a> 7432 </li> 7433 </script> 7434 7435 <script id="SearchPagesTemplate" type="text/x-template"> 7436 {{#each .}} 7437 {{#ifCond template "!==" "SearchMore"}} 7438 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 7439 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 7440 <div class="u-margin-right u-inline"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 7441 <div class="u-inline u-va-middle"><div class="u-bold u-truncate-text u-max-w210px u-inline-block js-typeahead-name">{{name}}</div></div> 7442 </a> 7443 </li> 7444 {{/ifCond}} 7445 {{#ifCond template "===" "SearchMore"}} 7446 {{>SearchMorePages}} 7447 {{/ifCond}} 7448 {{else}} 7449 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7450 @Translate("Your search gave 0 results") 7451 </li> 7452 {{/each}} 7453 </script> 7454 7455 <script id="SearchPagesTemplateWrap" type="text/x-template"> 7456 <div class="dropdown__column-header">@Translate("Pages")</div> 7457 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7458 {{>SearchPagesTemplate}} 7459 </ul> 7460 </script> 7461 7462 <script id="SearchProductsTemplateWrap" type="text/x-template"> 7463 <div class="dropdown__column-header">@Translate("Products")</div> 7464 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7465 {{>SearchProductsTemplate}} 7466 </ul> 7467 </script> 7468 } 7469 7470 @using Dynamicweb.Rapido.Blocks.Components 7471 @using Dynamicweb.Rapido.Blocks.Components.General 7472 @using Dynamicweb.Rapido.Blocks 7473 @using System.IO 7474 7475 7476 @using Dynamicweb.Rapido.Blocks.Components.General 7477 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7478 7479 7480 @* Component *@ 7481 7482 @helper RenderVariantMatrix(VariantMatrix settings) { 7483 if (settings != null) 7484 { 7485 int productLoopCounter = 0; 7486 int groupCount = 0; 7487 List<VariantOption> firstDimension = new List<VariantOption>(); 7488 List<VariantOption> secondDimension = new List<VariantOption>(); 7489 List<VariantOption> thirdDimension = new List<VariantOption>(); 7490 7491 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 7492 { 7493 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 7494 { 7495 if (groupCount == 0) { 7496 firstDimension.Add(variantOptions); 7497 } 7498 if (groupCount == 1) 7499 { 7500 secondDimension.Add(variantOptions); 7501 } 7502 if (groupCount == 2) 7503 { 7504 thirdDimension.Add(variantOptions); 7505 } 7506 } 7507 groupCount++; 7508 } 7509 7510 int rowCount = 0; 7511 int columnCount = 0; 7512 7513 <script> 7514 var variantsCollection = []; 7515 </script> 7516 7517 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 7518 @if (groupCount == 1) 7519 { 7520 <tbody> 7521 @foreach (VariantOption firstVariantOption in firstDimension) 7522 { 7523 var variantId = firstVariantOption.Id; 7524 <tr> 7525 <td class="u-bold"> 7526 @firstVariantOption.Name 7527 </td> 7528 <td> 7529 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7530 </td> 7531 </tr> 7532 productLoopCounter++; 7533 } 7534 7535 <tr> 7536 <td>&nbsp;</td> 7537 <td> 7538 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7539 </td> 7540 </tr> 7541 </tbody> 7542 } 7543 @if (groupCount == 2) 7544 { 7545 <thead> 7546 <tr> 7547 <td>&nbsp;</td> 7548 @foreach (VariantOption variant in secondDimension) 7549 { 7550 <td>@variant.Name</td> 7551 } 7552 </tr> 7553 </thead> 7554 <tbody> 7555 @foreach (VariantOption firstVariantOption in firstDimension) 7556 { 7557 string variantId = ""; 7558 columnCount = 0; 7559 7560 <tr> 7561 <td class="u-min-w120px">@firstVariantOption.Name</td> 7562 7563 @foreach (VariantOption secondVariantOption in secondDimension) 7564 { 7565 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 7566 <td> 7567 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7568 </td> 7569 7570 columnCount++; 7571 7572 productLoopCounter++; 7573 } 7574 7575 <td> 7576 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7577 </td> 7578 </tr> 7579 7580 rowCount++; 7581 } 7582 7583 @{ 7584 columnCount = 0; 7585 } 7586 7587 <tr> 7588 <td>&nbsp;</td> 7589 @foreach (VariantOption secondVariantOption in secondDimension) 7590 { 7591 <td> 7592 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7593 </td> 7594 7595 columnCount++; 7596 } 7597 <td>&nbsp;</td> 7598 </tr> 7599 </tbody> 7600 } 7601 @if (groupCount == 3) 7602 { 7603 <thead> 7604 <tr> 7605 <td>&nbsp;</td> 7606 @foreach (VariantOption thirdVariantOption in thirdDimension) 7607 { 7608 <td>@thirdVariantOption.Name</td> 7609 } 7610 </tr> 7611 </thead> 7612 <tbody> 7613 @foreach (VariantOption firstVariantOption in firstDimension) 7614 { 7615 int colspan = (thirdDimension.Count + 1); 7616 7617 <tr> 7618 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 7619 </tr> 7620 7621 foreach (VariantOption secondVariantOption in secondDimension) 7622 { 7623 string variantId = ""; 7624 columnCount = 0; 7625 7626 <tr> 7627 <td class="u-min-w120px">@secondVariantOption.Name</td> 7628 7629 @foreach (VariantOption thirdVariantOption in thirdDimension) 7630 { 7631 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 7632 7633 <td> 7634 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7635 </td> 7636 7637 columnCount++; 7638 productLoopCounter++; 7639 } 7640 7641 <td> 7642 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7643 </td> 7644 </tr> 7645 rowCount++; 7646 } 7647 } 7648 7649 @{ 7650 columnCount = 0; 7651 } 7652 7653 <tr> 7654 <td>&nbsp;</td> 7655 @foreach (VariantOption thirdVariantOption in thirdDimension) 7656 { 7657 <td> 7658 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7659 </td> 7660 7661 columnCount++; 7662 } 7663 <td>&nbsp;</td> 7664 </tr> 7665 </tbody> 7666 } 7667 </table> 7668 7669 <script> 7670 document.addEventListener("DOMContentLoaded", function (event) { 7671 MatrixUpdateQuantity("@settings.ProductId"); 7672 }); 7673 7674 MatrixUpdateQuantity = function (productId) { 7675 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 7676 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 7677 7678 var qtyRowArr = []; 7679 var qtyColumnArr = []; 7680 7681 var totalQty = 0; 7682 7683 for (var i = 0; i < allQtyFields.length; i++) { 7684 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 7685 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 7686 } 7687 7688 for (var i = 0; i < allQtyFields.length; i++) { 7689 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 7690 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 7691 totalQty += parseFloat(allQtyFields[i].value); 7692 } 7693 7694 //Update row counters 7695 for (var i = 0; i < qtyRowArr.length; i++) { 7696 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7697 7698 if (qtyRowArr[i] != undefined && qtyCounter != null) { 7699 var currentCount = qtyCounter.innerHTML; 7700 qtyCounter.innerHTML = qtyRowArr[i]; 7701 7702 if (currentCount != qtyCounter.innerHTML) { 7703 qtyCounter.classList.add("qty-field--active"); 7704 } 7705 } 7706 7707 } 7708 7709 //Update column counters 7710 for (var i = 0; i < qtyColumnArr.length; i++) { 7711 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7712 7713 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 7714 var currentCount = qtyCounter.innerHTML; 7715 qtyCounter.innerHTML = qtyColumnArr[i]; 7716 7717 if (currentCount != qtyCounter.innerHTML) { 7718 qtyCounter.classList.add("qty-field--active"); 7719 } 7720 } 7721 } 7722 7723 if (document.getElementById("TotalQtyCount_" + productId)) { 7724 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 7725 } 7726 7727 //Clean up animations 7728 setTimeout(function () { 7729 for (var i = 0; i < qtyRowArr.length; i++) { 7730 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7731 if (qtyCounter != null) { 7732 qtyCounter.classList.remove("qty-field--active"); 7733 } 7734 } 7735 for (var i = 0; i < qtyColumnArr.length; i++) { 7736 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7737 if (qtyCounter != null) { 7738 qtyCounter.classList.remove("qty-field--active"); 7739 } 7740 } 7741 }, 1000); 7742 } 7743 </script> 7744 } 7745 } 7746 7747 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 7748 { 7749 string loopCount = productLoopCounter.ToString(); 7750 7751 bool combinationFound = false; 7752 double stock = 0; 7753 double quantityValue = 0; 7754 string note = ""; 7755 7756 VariantProduct variantProduct = null; 7757 7758 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 7759 { 7760 stock = variantProduct.Stock; 7761 quantityValue = variantProduct.Quantity; 7762 combinationFound = true; 7763 } 7764 7765 if (combinationFound) 7766 { 7767 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 7768 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 7769 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 7770 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 7771 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 7772 7773 if (stock != 0) 7774 { 7775 <small>@Translate("Stock") @stock</small> 7776 } 7777 7778 <script> 7779 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 7780 variantsCollection.push(variants); 7781 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 7782 </script> 7783 } 7784 else 7785 { 7786 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 7787 } 7788 } 7789 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7790 7791 @* Component *@ 7792 7793 @helper RenderAddToCart(AddToCart settings) 7794 { 7795 //set Id for quantity selector to get it's value from button 7796 if (settings.QuantitySelector != null) 7797 { 7798 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 7799 { 7800 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 7801 } 7802 7803 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 7804 7805 if (settings.Disabled) 7806 { 7807 settings.QuantitySelector.Disabled = true; 7808 } 7809 7810 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 7811 { 7812 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 7813 } 7814 } 7815 7816 if (settings.Disabled) 7817 { 7818 settings.AddButton.Disabled = true; 7819 } 7820 7821 settings.AddButton.CssClass += " btn--condensed"; 7822 7823 //unitsSelector 7824 if (settings.UnitSelector != null) 7825 { 7826 if (settings.Disabled) 7827 { 7828 settings.QuantitySelector.Disabled = true; 7829 } 7830 } 7831 7832 if (Pageview.Device.ToString() == "Mobile") { 7833 if (settings.UnitSelector != null) 7834 { 7835 <div class="margin-sm margin-position-bottom"> 7836 @Render(settings.UnitSelector) 7837 </div> 7838 } 7839 } 7840 7841 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7842 @if (Pageview.Device.ToString() != "Mobile") { 7843 if (settings.UnitSelector != null) 7844 { 7845 @Render(settings.UnitSelector) 7846 } 7847 } 7848 @if (settings.QuantitySelector != null) 7849 { 7850 @Render(settings.QuantitySelector) 7851 } 7852 @Render(settings.AddButton) 7853 </div> 7854 } 7855 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7856 7857 @* Component *@ 7858 7859 @helper RenderAddToCartButton(AddToCartButton settings) 7860 { 7861 if (!settings.HideTitle) 7862 { 7863 if (string.IsNullOrEmpty(settings.Title)) 7864 { 7865 if (settings.BuyForPoints) 7866 { 7867 settings.Title = Translate("Buy with points"); 7868 } 7869 else 7870 { 7871 settings.Title = Translate("Add to cart"); 7872 } 7873 } 7874 } 7875 else 7876 { 7877 settings.Title = ""; 7878 } 7879 7880 if (settings.Icon == null) 7881 { 7882 settings.Icon = new Icon(); 7883 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 7884 } 7885 7886 if (string.IsNullOrEmpty(settings.Icon.Name)) 7887 { 7888 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 7889 } 7890 7891 settings.OnClick = "Cart.AddToCart(event, { " + 7892 "id: '" + settings.ProductId + "'," + 7893 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 7894 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 7895 (settings.BuyForPoints ? "buyForPoints: true," : "") + 7896 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 7897 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 7898 "});" + settings.OnClick; 7899 7900 @RenderButton(settings) 7901 } 7902 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7903 7904 @* Component *@ 7905 7906 @helper RenderUnitSelector(UnitSelector settings) 7907 { 7908 if (string.IsNullOrEmpty(settings.Id)) 7909 { 7910 settings.Id = Guid.NewGuid().ToString("N"); 7911 } 7912 var disabledClass = settings.Disabled ? "disabled" : ""; 7913 7914 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 7915 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7916 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 7917 <div class="dropdown__content dw-mod"> 7918 @settings.OptionsContent 7919 </div> 7920 <label class="dropdown-trigger-off" for="@settings.Id"></label> 7921 </div> 7922 } 7923 @using System.Reflection 7924 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7925 7926 @* Component *@ 7927 7928 @helper RenderQuantitySelector(QuantitySelector settings) 7929 { 7930 var attributes = new Dictionary<string, string>(); 7931 7932 /*base settings*/ 7933 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 7934 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 7935 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 7936 if (settings.Disabled) { attributes.Add("disabled", "true"); } 7937 if (settings.Required) { attributes.Add("required", "true"); } 7938 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 7939 /*end*/ 7940 7941 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 7942 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 7943 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 7944 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 7945 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 7946 if (settings.Min == null) { settings.Min = 1; } 7947 attributes.Add("min", settings.Min.ToString()); 7948 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 7949 if (settings.Value == null) { settings.Value = 1; } 7950 attributes.Add("value", settings.Value.ToString()); 7951 attributes.Add("type", "number"); 7952 7953 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7954 7955 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 7956 } 7957 @using Dynamicweb.Rapido.Blocks.Components 7958 7959 @using Dynamicweb.Frontend 7960 @using Dynamicweb.Frontend.Devices 7961 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7962 @using Dynamicweb.Rapido.Blocks.Components.General 7963 @using System.Collections.Generic; 7964 7965 @* Component *@ 7966 7967 @helper RenderCustomerCenterList(CustomerCenterList settings) 7968 { 7969 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 7970 string hideActions = isTouchDevice ? "u-block" : ""; 7971 7972 <table class="table data-list dw-mod"> 7973 @if (settings.GetHeaders().Length > 0) { 7974 <thead> 7975 <tr class="u-bold"> 7976 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 7977 { 7978 var attributes = new Dictionary<string, string>(); 7979 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 7980 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 7981 attributes.Add("align", header.Align.ToString()); 7982 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7983 7984 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 7985 } 7986 </tr> 7987 </thead> 7988 } 7989 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 7990 { 7991 int columnCount = 0; 7992 int totalColumns = listItem.GetInfoItems().Length; 7993 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 7994 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 7995 7996 var attributes = new Dictionary<string, string>(); 7997 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 7998 7999 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8000 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 8001 <tr> 8002 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 8003 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 8004 8005 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 8006 @if (!string.IsNullOrEmpty(listItem.Title)) { 8007 <div class="u-bold">@listItem.Title</div> 8008 } 8009 @if (!string.IsNullOrEmpty(listItem.Description)) { 8010 <div>@listItem.Description</div> 8011 } 8012 </td> 8013 } 8014 8015 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 8016 { 8017 var infoAttributes = new Dictionary<string, string>(); 8018 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 8019 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 8020 infoAttributes.Add("align", infoItem.Align.ToString()); 8021 8022 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8023 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 8024 8025 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 8026 @if (!string.IsNullOrEmpty(infoItem.Title)) { 8027 <div>@infoItem.Title</div> 8028 } 8029 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 8030 <div><small>@infoItem.Subtitle</small></div> 8031 } 8032 </td> 8033 8034 columnCount++; 8035 } 8036 </tr> 8037 <tr> 8038 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 8039 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 8040 @foreach (ButtonBase action in listItem.GetActions()) 8041 { 8042 action.ButtonLayout = ButtonLayout.LinkClean; 8043 action.Icon.CssClass += " u-full-height"; 8044 action.CssClass += " data-list__action-button link"; 8045 8046 @Render(action) 8047 } 8048 </div> 8049 </td> 8050 </tr> 8051 </tbody> 8052 } 8053 </table> 8054 } 8055 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 8056 8057 @using System 8058 @using System.Web 8059 @using System.Collections.Generic 8060 @using Dynamicweb.Rapido.Blocks.Extensibility 8061 @using Dynamicweb.Rapido.Blocks 8062 8063 @{ 8064 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 8065 8066 Block primaryBottomSnippets = new Block() 8067 { 8068 Id = "MasterJavascriptInitializers", 8069 SortId = 100, 8070 Template = RenderPrimaryBottomSnippets() 8071 }; 8072 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 8073 8074 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 8075 { 8076 Block miniCartPageId = new Block 8077 { 8078 Id = "MiniCartPageId", 8079 Template = RenderMiniCartPageId() 8080 }; 8081 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, miniCartPageId); 8082 } 8083 } 8084 8085 @helper RenderPrimaryBottomSnippets() 8086 { 8087 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 8088 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 8089 8090 if (isWireframeMode) 8091 { 8092 <script> 8093 Wireframe.Init(true); 8094 </script> 8095 } 8096 8097 8098 if (useGoogleTagManager) 8099 { 8100 string userName = Pageview.User == null?"Anonymous":Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUserId().ToString(); 8101 <script> 8102 document.addEventListener('addToCart', function(event) { 8103 var productInfoDetails = JSON.parse(event.detail.productInfo); 8104 var googleImpression = JSON.parse(productInfoDetails.googleImpression); 8105 if (typeof googleImpression == "string") { 8106 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 8107 } 8108 dataLayer.push({ 8109 'event': 'add_to_cart', 8110 8111 'ecommerce': { 8112 'currency': googleImpression.currency, 8113 'add': { 8114 'products': [{ 8115 'name': googleImpression.name, 8116 'id': googleImpression.id, 8117 'price': googleImpression.price, 8118 'brand': googleImpression.brand, 8119 'category': googleImpression.category, 8120 'variant': googleImpression.variant, 8121 'quantity': event.detail.quantity 8122 }] 8123 } 8124 } 8125 }); 8126 }); 8127 </script> 8128 } 8129 8130 //if digitalwarehouse 8131 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 8132 { 8133 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 8134 8135 if (string.IsNullOrEmpty(cartContextId)) 8136 { 8137 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 8138 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 8139 cartContextId = cartSettings.OrderContextID; 8140 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 8141 } 8142 8143 <script> 8144 let downloadCart = new DownloadCart({ 8145 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 8146 contextId: "@cartContextId", 8147 addButtonText: "@Translate("Add")", 8148 removeButtonText: "@Translate("Remove")" 8149 }); 8150 </script> 8151 } 8152 8153 <!--$$Javascripts--> 8154 } 8155 8156 @helper RenderMiniCartPageId() 8157 { 8158 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 8159 <script> 8160 window.cartId = "@miniCartFeedPageId"; 8161 </script> 8162 } 8163 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 8164 8165 @using System 8166 @using System.Web 8167 @using System.Collections.Generic 8168 @using Dynamicweb.Rapido.Blocks 8169 8170 @{ 8171 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 8172 8173 } 8174 8175 8176 @functions { 8177 public class ManifestIcon 8178 { 8179 public string src { get; set; } 8180 public string type { get; set; } 8181 public string sizes { get; set; } 8182 } 8183 8184 public class Manifest 8185 { 8186 public string name { get; set; } 8187 public string short_name { get; set; } 8188 public string start_url { get; set; } 8189 public string display { get; set; } 8190 public string background_color { get; set; } 8191 public string theme_color { get; set; } 8192 public List<ManifestIcon> icons { get; set; } 8193 } 8194 } 8195 8196 <!DOCTYPE html> 8197 8198 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 8199 8200 8201 8202 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 8203 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 8204 8205 8206 8207 @helper RenderMasterHead() { 8208 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 8209 8210 <head> 8211 <!-- Google Tag Manager --> 8212 <script> 8213 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 8214 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 8215 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 8216 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 8217 })(window,document,'script','dataLayer','GTM-NWZ944M');</script> 8218 <!-- End Google Tag Manager --> 8219 <!-- Google tag (gtag.js) --> 8220 <script async src="https://www.googletagmanager.com/gtag/js?id=G-8V6G21YQQG"> 8221 </script> 8222 <script> 8223 window.dataLayer = window.dataLayer || []; 8224 function gtag(){dataLayer.push(arguments);} 8225 gtag('js', new Date()); 8226 8227 gtag('config', 'G-8V6G21YQQG'); 8228 </script> 8229 <!-- Matomo Tag Manager --> 8230 <script> 8231 var _mtm = window._mtm = window._mtm || []; 8232 _mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'}); 8233 var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 8234 g.async=true; g.src='https://matomo.connexion.io/js/container_riZlOm1G.js'; 8235 s.parentNode.insertBefore(g,s); 8236 </script> 8237 <!-- End Matomo Tag Manager --> 8238 <!-- Rapido version 3.4.3 --> 8239 8240 @RenderBlockList(subBlocks) 8241 </head> 8242 } 8243 8244 @helper RenderMasterMetadata() { 8245 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 8246 var brandColors = swatches.GetColorSwatch(1); 8247 string brandColorOne = brandColors.Palette["BrandColor1"]; 8248 8249 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 8250 Manifest manifest = new Manifest 8251 { 8252 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 8253 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"), 8254 start_url = "/", 8255 display = "standalone", 8256 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 8257 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 8258 }; 8259 8260 manifest.icons = new List<ManifestIcon> { 8261 new ManifestIcon { 8262 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8263 sizes = "192x192", 8264 type = "image/png" 8265 }, 8266 new ManifestIcon { 8267 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8268 sizes = "512x512", 8269 type = "image/png" 8270 }, 8271 new ManifestIcon { 8272 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8273 sizes = "1024x1024", 8274 type = "image/png" 8275 } 8276 }; 8277 8278 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 8279 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 8280 string currentManifest = File.ReadAllText(manifestFilePath); 8281 8282 if (manifestJSON != currentManifest) 8283 { 8284 File.WriteAllText(manifestFilePath, manifestJSON); 8285 } 8286 } 8287 8288 <meta charset="utf-8" /> 8289 <title>@Model.Title</title> 8290 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8291 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 8292 <meta name="robots" content="index, follow"> 8293 <meta name="theme-color" content="@brandColorOne" /> 8294 <meta name="facebook-domain-verification" content="uoqnyhce263fqlq2hr53nf06ovn6zg" /> 8295 8296 if (Model.MetaTags != null && !Model.MetaTags.Contains("og:image") && Model.PropertyItem != null && Model.PropertyItem.GetFile("OpenGraphImage") != null) 8297 { 8298 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage"))); 8299 } 8300 8301 if (!Model.MetaTags.Contains("og:description") && !string.IsNullOrEmpty(Model.Description)) 8302 { 8303 Pageview.Meta.AddTag("og:description", Model.Description); 8304 } 8305 8306 Pageview.Meta.AddTag("og:title", Model.Title); 8307 Pageview.Meta.AddTag("og:site_name", Model.Name); 8308 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 8309 Pageview.Meta.AddTag("og:type", "Website"); 8310 8311 if (!string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"))) { 8312 Pageview.Meta.AddTag("fb:app_id", Model.Area.Item.GetItem("Settings").GetString("FacebookAppID")); 8313 } 8314 8315 @Model.MetaTags 8316 } 8317 8318 @helper RenderMasterCss() { 8319 var fonts = new string[] { 8320 getFontFamily("Layout", "HeaderFont"), 8321 getFontFamily("Layout", "SubheaderFont"), 8322 getFontFamily("Layout", "TertiaryHeaderFont"), 8323 getFontFamily("Layout", "BodyText"), 8324 getFontFamily("Layout", "Header", "ToolsFont"), 8325 getFontFamily("Layout", "Header", "NavigationFont"), 8326 getFontFamily("Layout", "MobileNavigation", "Font"), 8327 getFontFamily("ProductList", "Facets", "HeaderFont"), 8328 getFontFamily("ProductPage", "PriceFontDesign"), 8329 getFontFamily("Ecommerce", "SaleSticker", "Font"), 8330 getFontFamily("Ecommerce", "NewSticker", "Font"), 8331 getFontFamily("Ecommerce", "CustomSticker", "Font") 8332 }; 8333 8334 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 8335 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 8336 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 8337 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 8338 if (useFontAwesomePro) 8339 { 8340 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 8341 } 8342 8343 //Favicon 8344 <link href="@favicon" rel="icon" type="image/png"> 8345 8346 //Base (Default, wireframe) styles 8347 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 8348 8349 //Rapido Css from Website Settings 8350 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 8351 8352 //Ignite Css (Custom site specific styles) 8353 <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"> 8354 8355 //Font awesome 8356 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 8357 8358 //Flag icon 8359 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 8360 8361 //Google fonts 8362 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x))); 8363 8364 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 8365 8366 PushPromise(favicon); 8367 PushPromise(fontAwesomeCssLink); 8368 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 8369 PushPromise(autoCssLink); 8370 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 8371 PushPromise("/Files/Images/placeholder.gif"); 8372 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 8373 } 8374 8375 @helper RenderMasterManifest() { 8376 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 8377 { 8378 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 8379 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 8380 } 8381 } 8382 8383 @helper RenderMasterBody() { 8384 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 8385 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 8386 if (!String.IsNullOrEmpty(designLayout)) { 8387 designLayout = "class=\"" + designLayout + "\""; 8388 } 8389 8390 <body @designLayout onload="checkCookie()"> 8391 <!-- Google Tag Manager (noscript) --> 8392 <noscript> 8393 <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NWZ944M" 8394 height="0" width="0" style="display:none;visibility:hidden"></iframe> 8395 </noscript> 8396 <!-- End Google Tag Manager (noscript) --> 8397 @RenderBlockList(subBlocks) 8398 </body> 8399 <style type="text/css"> 8400 .FormButton { 8401 position: absolute; 8402 top: 2%; 8403 right: 20px; 8404 border-radius: 48%; 8405 color: red; 8406 background-color: white; 8407 width: 30px; 8408 height: 30px; 8409 } 8410 8411 .FormMain { 8412 height: auto; 8413 display: flex; 8414 align-items: flex-start; 8415 justify-content: center; 8416 flex-direction: column; 8417 font-family: "Montserrat"; 8418 font-size: 1.2em; 8419 color: black; 8420 font-weight: 500; 8421 } 8422 .FormCookie { 8423 position: fixed; 8424 left: 0; 8425 top: 10%; 8426 right: 0; 8427 margin: auto; 8428 display: flex; 8429 background: white; 8430 width: 100vw; 8431 height: auto; 8432 justify-content: center; 8433 align-items: center; 8434 z-index: 90;max-width: 500px;border: 1px solid #e6e6e6; 8435 padding: 20px; 8436 } 8437 .FormShow {display:flex!important} 8438 </style> 8439 8440 <div class="FormCookie" id="FormCookie" style="display:none"><button class="FormButton" id="crtcookie" onclick="createCookie2()">X</button> 8441 8442 <div class="FormMain"> 8443 <form method="post" action="/Admin/Public/404.aspx" enctype="multipart/form-data" class="" id="dw-form-9" onsubmit="s=function(e){e.elements['FormCH1_h'].value='91a936232679e9ca930d5e31270ae574';e.elements['_sys_to_email'].value='';e.setAttribute('action', '/Default.aspx?ID=1784&amp;PID=3164');return true};return s(this);"> 8444 <input type="hidden" name="FormPID" value="3164"> 8445 <input type="hidden" name="FormID" value="9"> 8446 <input type="hidden" name="cmd" value="save"> 8447 <input type="hidden" name="referer" value="https://webshop-acofunki.aco.com/english"> 8448 <input type="hidden" name="_sys_to_email" value="mrsmith@dynamicweb.com" autocomplete="off"> 8449 <input type="hidden" name="FormCH1_h" value="" autocomplete="off"> 8450 <input type="hidden" name="FormCH1_f" value="c4b6d3b0f9da1e27fed6e1ac60c62292" autocomplete="off"> 8451 <input type="hidden" name="FormCH1_s" value="99a1c9c7a6d79c1a5af22afd88f47ab0" autocomplete="off"> 8452 <input type="hidden" name="FormCH1_i" value="831171282812f1a2ccab42a0c31e1b56" autocomplete="off"> 8453 <input type="hidden" name="91a936232679e9ca930d5e31270ae574ts" value="ljjrVt8ukQJAXXAP3Aeq14LHf3sehimk" style="display:none!important" autocomplete="off"> 8454 <input type="text" name="91a936232679e9ca930d5e31270ae574description" value="" style="display:none!important" autocomplete="off"> 8455 <input type="text" name="91a936232679e9ca930d5e31270ae574email" value="mrssmith@dynamicweb.com" style="display:none!important" autocomplete="off"> 8456 8457 8458 <div style="margin-top: 15px;"><p style="font-size: 18px;">@Translate("CookieForm-1")</p> 8459 </div> 8460 8461 <div class="form__field-group dw-mod"> 8462 <label for="AccessUserEmail">@Translate("Email")</label> 8463 <input type="email" id="AccessUserEmail" name="AccessUserEmail" placeholder="@Translate("Email")" required=""> 8464 8465 </div> 8466 <div class="form__field-group dw-mod"> 8467 <label for="Phone">@Translate("Phone")</label> 8468 <input type="text" name="Phone" id="Phone" value="" placeholder="@Translate("Phone")"> 8469 8470 </div> 8471 <div class="form__field-group dw-mod"> 8472 <label for="VATNumber">@Translate("VAT number")</label> 8473 <input type="text" name="VATNumber" id="VATNumber" value="" placeholder="@Translate("VAT number")" required=""> 8474 8475 </div> 8476 <div class="u-inline-block u-full-width"> 8477 <div class="u-block"> 8478 <input type="submit" class="btn btn--primary dw-mod u-pull--right" onclick="Buttons.LockButton(event);createCookie2()" id="SendB2Brequest" name="SendB2Brequest" value="Send"> 8479 </div> 8480 </div> 8481 8482 </form> 8483 </div> 8484 </div> 8485 <script> 8486 8487 function setCookie(cname,cvalue,exdays) { 8488 const d = new Date(); 8489 d.setTime(d.getTime() + (exdays*24*60*60*1000)); 8490 let expires = "expires=" + d.toUTCString(); 8491 document.cookie = cname + "=" + cvalue + ";" + expires; 8492 } 8493 8494 function getCookie(cname) { 8495 let name = cname + "="; 8496 let decodedCookie = decodeURIComponent(document.cookie); 8497 let ca = decodedCookie.split(';'); 8498 for(let i = 0; i < ca.length; i++) { 8499 let c = ca[i]; 8500 while (c.charAt(0) == ' ') { 8501 c = c.substring(1); 8502 } 8503 if (c.indexOf(name) == 0) { 8504 return c.substring(name.length, c.length); 8505 } 8506 } 8507 return ""; 8508 } 8509 function createCookie2() { 8510 let usernameCookie = getCookie("usernameCookie"); 8511 usernameCookie = "Visited"; 8512 setCookie("usernameCookie", usernameCookie, 30); 8513 document.querySelector("#FormCookie").classList.remove("FormShow"); 8514 } 8515 8516 function checkCookie() { 8517 let user = getCookie("usernameCookie"); 8518 if (user != "Visited") { 8519 document.querySelector("#FormCookie").classList.add("FormShow"); 8520 } else { 8521 document.querySelector("#FormCookie").classList.remove("FormShow"); 8522 } 8523 } 8524 </script> 8525 } 8526 8527 @helper RenderMasterHeader() 8528 { 8529 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 8530 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8531 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 8532 8533 <header class="top-container @stickyTop no-print dw-mod" id="Top"> 8534 @RenderBlockList(subBlocks) 8535 </header> 8536 } 8537 8538 @helper RenderMain() 8539 { 8540 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 8541 8542 <main class="site dw-mod"> 8543 @RenderBlockList(subBlocks) 8544 </main> 8545 } 8546 8547 @helper RenderPageContent() 8548 { 8549 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8550 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 8551 8552 <div id="Page" class="page @pagePos"> 8553 <div id="content"> 8554 @RenderSnippet("Content") 8555 </div> 8556 </div> 8557 } 8558 8559 @* Hack to support nested helpers *@ 8560 @SnippetStart("Content") 8561 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8562 8563 8564 8565 @* Render the grid *@ 8566 @Model.Grid("Grid", "Grid", "default:true;sort:1", "Pages") 8567 8568 @SnippetEnd("Content") 8569 8570 @helper RenderIosTabletFix() { 8571 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 8572 { 8573 <script> 8574 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 8575 if (isIpadIOS) { 8576 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 8577 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 8578 } 8579 </script> 8580 } 8581 } 8582 8583 <input type="checkbox" id="SelectToChangeLanguageTrigger" class="modal-trigger"> 8584 <div class="modal-container"> 8585 <label for="SelectToChangeLanguageTrigger" id="SelectToChangeLanguageModalOverlay" class="modal-overlay"></label> 8586 <div class="modal modal--md" id="SelectToChangeLanguageModal"> 8587 <div class="modal__header"> 8588 <h2>@Translate("Changing language")<label for="SelectToChangeLanguageTrigger" class="u-pull--right">X</label></h2> 8589 </div> 8590 <div class="modal__body"> 8591 <p class="u-no-margin" id="SelectToChangeLanguageText2">@Translate("You are changing language. If you continue, basket will be cleared. Do you wish to continue?")</p> 8592 <div class="product-list__grid-item__footer dw-mod" style="border:0;"> 8593 <label for="SelectToChangeLanguageTrigger" class="btn u-margin-left--lg btn--secondary btn--condensed u-no-margin u-pull--right dw-mod">@Translate("No")</label> 8594 <button class="btn btn--primary btn--condensed u-no-margin u-pull--right dw-mod" onclick="" id="ChangeLanguageButton">@Translate("Yes")</button> 8595 8596 </div> 8597 </div> 8598 </div> 8599 </div> 8600 8601 </body> 8602 </html> 8603 8604 </html> 8605 8606