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_cee6248b457048d88d3eafcf680ecca0.<RenderDesktopMenu>b__114_0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 4657
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 192
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<RenderDesktopNavigation>b__139_0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 5730
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<RenderMasterHeader>b__204_0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8165
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<RenderMain>b__205_0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8174
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 292
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<RenderMasterBody>b__203_0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 8154
   at RazorEngine.Templating.TemplateWriter.ToString()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 254
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass3_0.<RenderBlock>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 292
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.<>c__DisplayClass2_0.<RenderBlockList>b__0(TextWriter __razor_helper_writer) in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 164
   at CompiledRazorTemplates.Dynamic.RazorEngine_cee6248b457048d88d3eafcf680ecca0.Execute() in F:\Web\Custom\Files\Templates\Designs\Rapido\_parsed\ContentPage.parsed.cshtml:line 7995
   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" 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 @helper RenderGoogleAnalyticsSnippet() 3587 { 3588 <!-- Global site tag (gtag.js) - Google Analytics --> 3589 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script> 3590 <script> 3591 window.dataLayer = window.dataLayer || []; 3592 function gtag(){dataLayer.push(arguments);} 3593 gtag('js', new Date()); 3594 3595 gtag('config', '@GoogleAnalyticsID'); 3596 </script> 3597 3598 } 3599 3600 @helper RenderGoogleTagManager() 3601 { 3602 <script> 3603 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 3604 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 3605 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 3606 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 3607 })(window,document,'script','dataLayer','@GoogleTagManagerID'); 3608 </script> 3609 } 3610 3611 @helper RenderGoogleTagManagerBodySnippet() 3612 { 3613 <!-- Google Tag Manager (noscript) --> 3614 <noscript> 3615 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID" 3616 height="0" width="0" style="display:none;visibility:hidden"></iframe> 3617 </noscript> 3618 <!-- End Google Tag Manager (noscript) --> 3619 } 3620 3621 @helper RenderFacebookPixel() 3622 { 3623 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 3624 3625 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 3626 { 3627 <!-- Facebook Pixel Code --> 3628 <script> 3629 !function(f,b,e,v,n,t,s) 3630 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 3631 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 3632 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 3633 n.queue=[];t=b.createElement(e);t.async=!0; 3634 t.src=v;s=b.getElementsByTagName(e)[0]; 3635 s.parentNode.insertBefore(t,s)}(window, document,'script', 3636 'https://connect.facebook.net/en_US/fbevents.js'); 3637 fbq('init', '@FacebookPixelID'); 3638 fbq('track', 'PageView'); 3639 </script> 3640 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript> 3641 } 3642 } 3643 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3644 3645 @using System 3646 @using System.Web 3647 @using System.Collections.Generic 3648 @using Dynamicweb.Rapido.Blocks 3649 @using Dynamicweb.Rapido.Blocks.Extensibility 3650 @using Dynamicweb.Security.UserManagement 3651 @using Dynamicweb.Security.UserManagement.ExternalAuthentication 3652 @using Dynamicweb.Rapido.Blocks.Components.General 3653 3654 @{ 3655 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master"); 3656 3657 Block loginModal = new Block() 3658 { 3659 Id = "LoginModal", 3660 SortId = 10, 3661 Component = new Modal 3662 { 3663 Id = "SignIn", 3664 Heading = new Heading 3665 { 3666 Level = 0, 3667 Title = Translate("Sign in") 3668 }, 3669 Width = ModalWidth.Sm, 3670 BodyTemplate = RenderLoginForm() 3671 } 3672 }; 3673 3674 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal); 3675 } 3676 3677 @helper RenderLoginForm() 3678 { 3679 int pageId = Model.TopPage.ID; 3680 string userSignedInErrorText = ""; 3681 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 3682 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 3683 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 3684 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Pageview.Page.ID != GetPageIdByNavigationTag("SignInPage") && Model.LogOnFailed; 3685 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 3686 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 3687 3688 ProviderCollection providers = Provider.GetActiveProviders(); 3689 3690 if (Model.LogOnFailed) 3691 { 3692 switch (Model.LogOnFailedReason) 3693 { 3694 case LogOnFailedReason.PasswordLengthInvalid: 3695 userSignedInErrorText = Translate("Password length is invalid"); 3696 break; 3697 case LogOnFailedReason.IncorrectLogin: 3698 userSignedInErrorText = Translate("Invalid email or password"); 3699 break; 3700 case LogOnFailedReason.ExceededFailedLogOnLimit: 3701 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked"); 3702 break; 3703 case LogOnFailedReason.LoginLocked: 3704 userSignedInErrorText = Translate("The user account is temporarily locked"); 3705 break; 3706 case LogOnFailedReason.PasswordExpired: 3707 userSignedInErrorText = Translate("The password has expired and needs to be renewed"); 3708 break; 3709 default: 3710 userSignedInErrorText = Translate("An unknown error occured"); 3711 break; 3712 } 3713 } 3714 3715 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm" }; 3716 3717 TextField passwordField = new TextField { Id = "login-password", Type = TextFieldType.Password, Name = "password", Label = Translate("Password"), Required = true }; 3718 3719 if (!hideForgotPasswordLink) { 3720 passwordField.Link = new Link { Title = Translate("Forgot password?"), Href = "/Default.aspx?id=" + signInProfilePageId + "&LoginAction=Recovery" }; 3721 } 3722 3723 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) }); 3724 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" }); 3725 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" }); 3726 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" }); 3727 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true }); 3728 form.Add(passwordField); 3729 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error }); 3730 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") }); 3731 form.Add(new Button { ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event)" }); 3732 3733 foreach (Provider LoginProvider in providers) 3734 { 3735 var ProviderName = LoginProvider.Name.ToLower(); 3736 form.Add(new Link { 3737 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID, 3738 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After }, 3739 ButtonLayout = ButtonLayout.LinkClean, 3740 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName, 3741 AltText = ProviderName 3742 }); 3743 } 3744 3745 if (!hideCreateAccountLink) { 3746 form.Add(new Text { Content = "<div class=\"u-border-top u-full-width u-margin-bottom--lg\"></div>" }); 3747 form.Add(new Link 3748 { 3749 Href = "/Default.aspx?id=" + createAccountPageId, 3750 ButtonLayout = ButtonLayout.LinkClean, 3751 Title = Translate("Create account"), 3752 CssClass = "u-full-width u-ta-center" 3753 }); 3754 } 3755 3756 @Render(form) 3757 3758 if (showModalOnStart) 3759 { 3760 <script> 3761 document.getElementById("SignInModalTrigger").checked = true; 3762 </script> 3763 } 3764 } 3765 3766 3767 3768 3769 3770 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3771 { 3772 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3773 3774 @using System 3775 @using System.Web 3776 @using System.Collections.Generic 3777 @using Dynamicweb.Rapido.Blocks.Extensibility 3778 @using Dynamicweb.Rapido.Blocks 3779 @using Dynamicweb.Rapido.Services 3780 3781 3782 @functions { 3783 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3784 } 3785 3786 @{ 3787 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"; 3788 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 3789 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed(); 3790 3791 Block mobileHeader = new Block() 3792 { 3793 Id = "MobileTop", 3794 SortId = 10, 3795 Template = RenderMobileTop(), 3796 SkipRenderBlocksList = true 3797 }; 3798 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader); 3799 3800 Block mobileHeaderNavigation = new Block() 3801 { 3802 Id = "MobileHeaderNavigation", 3803 SortId = 10, 3804 Template = RenderMobileHeaderNavigation(), 3805 SkipRenderBlocksList = true, 3806 BlocksList = new List<Block> { 3807 new Block { 3808 Id = "MobileHeaderNavigationTrigger", 3809 SortId = 10, 3810 Template = RenderMobileHeaderNavigationTrigger() 3811 } 3812 } 3813 }; 3814 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation); 3815 3816 Block mobileHeaderLogo = new Block() 3817 { 3818 Id = "MobileHeaderLogo", 3819 SortId = 20, 3820 Template = RenderMobileHeaderLogo(), 3821 SkipRenderBlocksList = true 3822 }; 3823 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo); 3824 3825 Block mobileHeaderActions = new Block() 3826 { 3827 Id = "MobileHeaderActions", 3828 SortId = 30, 3829 Template = RenderMobileTopActions(), 3830 SkipRenderBlocksList = true 3831 }; 3832 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions); 3833 3834 if (!mobileHideSearch) 3835 { 3836 Block mobileHeaderSearch = new Block 3837 { 3838 Id = "MobileHeaderSearch", 3839 SortId = 10, 3840 Template = RenderMobileTopSearch() 3841 }; 3842 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch); 3843 } 3844 3845 Block mobileHeaderMiniCart; 3846 3847 if (!mobileHideCart) 3848 { 3849 mobileHeaderMiniCart = new Block 3850 { 3851 Id = "MobileHeaderMiniCart", 3852 SortId = 20, 3853 Template = RenderMobileTopMiniCart() 3854 }; 3855 3856 Block miniCartCounterScriptTemplate = new Block 3857 { 3858 Id = "MiniCartCounterScriptTemplate", 3859 Template = RenderMobileMiniCartCounterContent() 3860 }; 3861 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 3862 } 3863 else 3864 { 3865 mobileHeaderMiniCart = new Block 3866 { 3867 Id = "MobileHeaderMiniCart", 3868 SortId = 20 3869 }; 3870 } 3871 3872 if (!mobileHideSearch) 3873 { 3874 Block mobileHeaderSearchBar = new Block() 3875 { 3876 Id = "MobileHeaderSearchBar", 3877 SortId = 30, 3878 Template = RenderMobileTopSearchBar() 3879 }; 3880 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar); 3881 } 3882 3883 switch (mobileTopLayout) 3884 { 3885 case "nav-left": 3886 mobileHeaderNavigation.SortId = 10; 3887 mobileHeaderLogo.SortId = 20; 3888 mobileHeaderActions.SortId = 30; 3889 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3890 break; 3891 case "nav-right": 3892 mobileHeaderLogo.SortId = 10; 3893 mobileHeaderActions.SortId = 20; 3894 mobileHeaderNavigation.SortId = 30; 3895 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3896 break; 3897 case "nav-search-left": 3898 mobileHeaderNavigation.SortId = 10; 3899 mobileHeaderLogo.SortId = 20; 3900 mobileHeaderActions.SortId = 30; 3901 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3902 break; 3903 case "search-left": 3904 mobileHeaderActions.SortId = 10; 3905 mobileHeaderLogo.SortId = 20; 3906 mobileHeaderNavigation.SortId = 30; 3907 mobileHeaderMiniCart.SortId = 0; 3908 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3909 break; 3910 } 3911 } 3912 3913 3914 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3915 3916 @using System 3917 @using System.Web 3918 @using Dynamicweb.Rapido.Blocks.Extensibility 3919 @using Dynamicweb.Rapido.Blocks 3920 3921 @{ 3922 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3923 } 3924 3925 3926 3927 3928 @helper RenderMobileTop() { 3929 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList(); 3930 3931 <nav class="main-navigation-mobile dw-mod"> 3932 <div class="center-container top-container__center-container dw-mod"> 3933 <div class="grid grid--align-center"> 3934 @RenderBlockList(subBlocks) 3935 </div> 3936 </div> 3937 </nav> 3938 } 3939 3940 @helper RenderMobileHeaderNavigation() { 3941 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList(); 3942 3943 <div class="grid__col-auto-width"> 3944 <ul class="menu dw-mod"> 3945 @RenderBlockList(subBlocks) 3946 </ul> 3947 </div> 3948 } 3949 3950 @helper RenderMobileHeaderNavigationTrigger() { 3951 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 3952 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label> 3953 </li> 3954 } 3955 3956 @helper RenderMobileHeaderLogo() { 3957 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList(); 3958 3959 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"; 3960 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : ""; 3961 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 3962 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName"); 3963 3964 string mobileLogo = "/Files/Images/logo-dynamicweb.png"; 3965 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null) 3966 { 3967 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded; 3968 } 3969 3970 if (Path.GetExtension(mobileLogo).ToLower() != ".svg") 3971 { 3972 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&amp;width=100&amp;crop=5&amp;Compression=75&amp;image=" + mobileLogo; 3973 } 3974 else 3975 { 3976 mobileLogo = HttpUtility.UrlDecode(mobileLogo); 3977 } 3978 3979 <div class="grid__col-auto grid__col--bleed"> 3980 <div class="grid__cell @centeredLogo"> 3981 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod"> 3982 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" /> 3983 </a> 3984 </div> 3985 3986 @RenderBlockList(subBlocks) 3987 </div> 3988 } 3989 3990 @helper RenderMobileTopActions() { 3991 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList(); 3992 3993 <div class="grid__col-auto-width"> 3994 <ul class="menu dw-mod"> 3995 @RenderBlockList(subBlocks) 3996 </ul> 3997 </div> 3998 } 3999 4000 @helper RenderMobileTopSearch() { 4001 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4002 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4003 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 4004 </label> 4005 </li> 4006 } 4007 4008 @helper RenderMobileTopMiniCart() { 4009 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 4010 int cartPageId = GetPageIdByNavigationTag("CartPage"); 4011 double cartProductsCount = Model.Cart.TotalProductsCount; 4012 4013 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper"> 4014 <div class="mini-cart dw-mod"> 4015 <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"> 4016 <div class="u-inline u-position-relative"> 4017 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i> 4018 <div class="mini-cart__counter dw-mod"> 4019 <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"> 4020 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount"> 4021 @cartProductsCount 4022 </div> 4023 </div> 4024 </div> 4025 </div> 4026 </a> 4027 </div> 4028 </li> 4029 } 4030 4031 @helper RenderMobileTopSearchBar() 4032 { 4033 string searchFeedId = ""; 4034 string searchSecondFeedId = ""; 4035 int groupsFeedId; 4036 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4037 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4038 string resultPageLink; 4039 string searchPlaceholder; 4040 string searchType = "product-search"; 4041 string searchTemplate; 4042 string searchContentTemplate = ""; 4043 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4044 bool showGroups = true; 4045 4046 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4047 { 4048 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4049 resultPageLink = contentSearchPageLink; 4050 searchPlaceholder = Translate("Search page"); 4051 groupsFeedId = 0; 4052 searchType = "content-search"; 4053 searchTemplate = "SearchPagesTemplate"; 4054 showGroups = false; 4055 } 4056 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4057 { 4058 searchFeedId = productsPageId + "&feed=true"; 4059 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4060 resultPageLink = Converter.ToString(productsPageId); 4061 searchPlaceholder = Translate("Search products or pages"); 4062 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4063 searchType = "combined-search"; 4064 searchTemplate = "SearchProductsTemplateWrap"; 4065 searchContentTemplate = "SearchPagesTemplateWrap"; 4066 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4067 } 4068 else 4069 { 4070 resultPageLink = Converter.ToString(productsPageId); 4071 searchFeedId = productsPageId + "&feed=true"; 4072 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4073 searchPlaceholder = Translate("Search products"); 4074 searchTemplate = "SearchProductsTemplate"; 4075 searchType = "product-search"; 4076 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4077 } 4078 4079 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" /> 4080 4081 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4082 <div class="center-container top-container__center-container dw-mod"> 4083 <div class="grid"> 4084 <div class="grid__col-auto"> 4085 <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"> 4086 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4087 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4088 { 4089 <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> 4090 } 4091 else 4092 { 4093 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4094 <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> 4095 <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> 4096 </div> 4097 } 4098 <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> 4099 </div> 4100 </div> 4101 <div class="grid__col-auto-width"> 4102 <ul class="menu dw-mod"> 4103 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4104 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4105 <i class="fas fa-times fa-1_5x"></i> 4106 </label> 4107 </li> 4108 </ul> 4109 </div> 4110 </div> 4111 </div> 4112 </div> 4113 } 4114 4115 @helper RenderMobileMiniCartCounterContent() 4116 { 4117 <script id="MiniCartCounterContent" type="text/x-template"> 4118 {{#.}} 4119 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 4120 {{numberofproducts}} 4121 </div> 4122 {{/.}} 4123 </script> 4124 } 4125 </text> 4126 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4127 4128 @using System 4129 @using System.Web 4130 @using System.Collections.Generic 4131 @using Dynamicweb.Rapido.Blocks.Extensibility 4132 @using Dynamicweb.Rapido.Blocks 4133 4134 @functions { 4135 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4136 } 4137 4138 @{ 4139 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4140 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4141 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4142 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4143 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4144 bool mobileHideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4145 4146 Block mobileNavigation = new Block() 4147 { 4148 Id = "MobileNavigation", 4149 SortId = 10, 4150 Template = MobileNavigation(), 4151 SkipRenderBlocksList = true 4152 }; 4153 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4154 4155 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4156 { 4157 Block mobileNavigationSignIn = new Block 4158 { 4159 Id = "MobileNavigationSignIn", 4160 SortId = 10, 4161 Template = RenderMobileNavigationSignIn() 4162 }; 4163 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4164 } 4165 4166 Block mobileNavigationMenu = new Block 4167 { 4168 Id = "MobileNavigationMenu", 4169 SortId = 20, 4170 Template = RenderMobileNavigationMenu() 4171 }; 4172 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4173 4174 Block mobileNavigationActions = new Block 4175 { 4176 Id = "MobileNavigationActions", 4177 SortId = 30, 4178 Template = RenderMobileNavigationActions(), 4179 SkipRenderBlocksList = true 4180 }; 4181 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4182 4183 if (!mobileNavigationItemsHideSignIn) 4184 { 4185 if (Model.CurrentUser.ID <= 0) 4186 { 4187 Block mobileNavigationSignInAction = new Block 4188 { 4189 Id = "MobileNavigationSignInAction", 4190 SortId = 10, 4191 Template = RenderMobileNavigationSignInAction() 4192 }; 4193 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4194 4195 if (!mobileHideCreateAccountLink) 4196 { 4197 Block mobileNavigationCreateAccountAction = new Block 4198 { 4199 Id = "MobileNavigationCreateAccountAction", 4200 SortId = 20, 4201 Template = RenderMobileNavigationCreateAccountAction() 4202 }; 4203 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4204 } 4205 } 4206 else 4207 { 4208 if (!mobileHideMyOrdersLink) 4209 { 4210 Block mobileNavigationOrdersAction = new Block 4211 { 4212 Id = "MobileNavigationOrdersAction", 4213 SortId = 20, 4214 Template = RenderMobileNavigationOrdersAction() 4215 }; 4216 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4217 } 4218 if (!mobileHideMyFavoritesLink) 4219 { 4220 Block mobileNavigationFavoritesAction = new Block 4221 { 4222 Id = "MobileNavigationFavoritesAction", 4223 SortId = 30, 4224 Template = RenderMobileNavigationFavoritesAction() 4225 }; 4226 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction); 4227 } 4228 if (!mobileHideMySavedCardsLink) 4229 { 4230 Block mobileNavigationSavedCardsAction = new Block 4231 { 4232 Id = "MobileNavigationFavoritesAction", 4233 SortId = 30, 4234 Template = RenderMobileNavigationSavedCardsAction() 4235 }; 4236 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4237 } 4238 4239 Block mobileNavigationSignOutAction = new Block 4240 { 4241 Id = "MobileNavigationSignOutAction", 4242 SortId = 40, 4243 Template = RenderMobileNavigationSignOutAction() 4244 }; 4245 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4246 } 4247 } 4248 4249 if (Model.Languages.Count > 1) 4250 { 4251 Block mobileNavigationLanguagesAction = new Block 4252 { 4253 Id = "MobileNavigationLanguagesAction", 4254 SortId = 50, 4255 Template = RenderMobileNavigationLanguagesAction() 4256 }; 4257 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4258 } 4259 } 4260 4261 4262 @helper MobileNavigation() 4263 { 4264 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4265 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4266 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4267 4268 <!-- Trigger for mobile navigation --> 4269 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4270 4271 <!-- Mobile navigation --> 4272 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4273 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper"> 4274 @RenderBlockList(subBlocks) 4275 </div> 4276 </nav> 4277 4278 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4279 } 4280 4281 @helper RenderMobileNavigationSignIn() 4282 { 4283 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4284 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4285 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4286 string myProfilePageLink = linkStart + myProfilePageId; 4287 string userName = Model.CurrentUser.FirstName; 4288 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4289 { 4290 userName += " " + Model.CurrentUser.LastName; 4291 } 4292 if (string.IsNullOrEmpty(userName)) 4293 { 4294 userName = Model.CurrentUser.Name; 4295 } 4296 if (string.IsNullOrEmpty(userName)) 4297 { 4298 userName = Model.CurrentUser.UserName; 4299 } 4300 if (string.IsNullOrEmpty(userName)) 4301 { 4302 userName = Model.CurrentUser.Email; 4303 } 4304 4305 <ul class="menu menu-mobile"> 4306 <li class="menu-mobile__item"> 4307 <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> 4308 </li> 4309 </ul> 4310 } 4311 4312 @helper RenderMobileNavigationMenu() 4313 { 4314 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4315 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4316 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4317 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4318 int startLevel = 0; 4319 4320 @RenderNavigation(new 4321 { 4322 id = "mobilenavigation", 4323 cssclass = "menu menu-mobile dwnavigation", 4324 startLevel = @startLevel, 4325 ecomStartLevel = @startLevel + 1, 4326 endlevel = @levels, 4327 expandmode = "all", 4328 template = @menuTemplate 4329 }) 4330 4331 if (isSlidesDesign) 4332 { 4333 <script> 4334 function goToLevel(level) { 4335 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4336 } 4337 4338 document.addEventListener('DOMContentLoaded', function () { 4339 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4340 }); 4341 </script> 4342 } 4343 4344 if (renderPagesInToolBar) 4345 { 4346 @RenderNavigation(new 4347 { 4348 id = "topToolsMobileNavigation", 4349 cssclass = "menu menu-mobile dwnavigation", 4350 template = "ToolsMenuForMobile.xslt" 4351 }) 4352 } 4353 } 4354 4355 @helper RenderMobileNavigationActions() 4356 { 4357 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4358 4359 <ul class="menu menu-mobile"> 4360 @RenderBlockList(subBlocks) 4361 </ul> 4362 } 4363 4364 @helper RenderMobileNavigationSignInAction() 4365 { 4366 <li class="menu-mobile__item"> 4367 <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> 4368 </li> 4369 } 4370 4371 @helper RenderMobileNavigationCreateAccountAction() 4372 { 4373 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4374 4375 <li class="menu-mobile__item"> 4376 <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> 4377 </li> 4378 } 4379 4380 @helper RenderMobileNavigationProfileAction() 4381 { 4382 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4383 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4384 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4385 string myProfilePageLink = linkStart + myProfilePageId; 4386 4387 <li class="menu-mobile__item"> 4388 <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> 4389 </li> 4390 } 4391 4392 @helper RenderMobileNavigationOrdersAction() 4393 { 4394 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4395 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4396 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4397 string myOrdersPageLink = linkStart + myOrdersPageId; 4398 string ordersIcon = "fas fa-list"; 4399 4400 <li class="menu-mobile__item"> 4401 <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> 4402 </li> 4403 } 4404 4405 @helper RenderMobileNavigationFavoritesAction() 4406 { 4407 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4408 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4409 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4410 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4411 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"; 4412 4413 4414 <li class="menu-mobile__item"> 4415 <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> 4416 </li> 4417 } 4418 4419 @helper RenderMobileNavigationSavedCardsAction() 4420 { 4421 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4422 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4423 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4424 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4425 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"; 4426 4427 <li class="menu-mobile__item"> 4428 <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> 4429 </li> 4430 } 4431 4432 @helper RenderMobileNavigationSignOutAction() 4433 { 4434 int pageId = Model.TopPage.ID; 4435 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"; 4436 4437 <li class="menu-mobile__item"> 4438 <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> 4439 </li> 4440 } 4441 4442 @helper RenderMobileNavigationLanguagesAction() 4443 { 4444 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4445 4446 string selectedLanguage = ""; 4447 foreach (var lang in Model.Languages) 4448 { 4449 if (lang.IsCurrent) 4450 { 4451 selectedLanguage = lang.Name; 4452 } 4453 } 4454 4455 <li class="menu-mobile__item dw-mod"> 4456 @if (isSlidesDesign) 4457 { 4458 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4459 } 4460 else 4461 { 4462 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4463 } 4464 <div class="menu-mobile__link__wrap"> 4465 <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> 4466 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4467 </div> 4468 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4469 @if (isSlidesDesign) 4470 { 4471 <li class="menu-mobile__item dw-mod"> 4472 <div class="menu-mobile__link__wrap"> 4473 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4474 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4475 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4476 </div> 4477 </li> 4478 } 4479 @foreach (var lang in Model.Languages) 4480 { 4481 <li class="menu-mobile__item dw-mod"> 4482 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4483 </li> 4484 } 4485 </ul> 4486 </li> 4487 }</text> 4488 } 4489 else 4490 { 4491 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4492 4493 @using System 4494 @using System.Web 4495 @using System.Collections.Generic 4496 @using Dynamicweb.Rapido.Blocks.Extensibility 4497 @using Dynamicweb.Rapido.Blocks 4498 4499 @functions { 4500 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4501 } 4502 4503 @{ 4504 Block masterTools = new Block() 4505 { 4506 Id = "MasterDesktopTools", 4507 SortId = 10, 4508 Template = RenderDesktopTools(), 4509 SkipRenderBlocksList = true, 4510 BlocksList = new List<Block> 4511 { 4512 new Block { 4513 Id = "MasterDesktopToolsText", 4514 SortId = 10, 4515 Template = RenderDesktopToolsText(), 4516 Design = new Design 4517 { 4518 Size = "auto", 4519 HidePadding = true, 4520 RenderType = RenderType.Column 4521 } 4522 }, 4523 new Block { 4524 Id = "MasterDesktopToolsNavigation", 4525 SortId = 20, 4526 Template = RenderDesktopToolsNavigation(), 4527 Design = new Design 4528 { 4529 Size = "auto-width", 4530 HidePadding = true, 4531 RenderType = RenderType.Column 4532 } 4533 } 4534 } 4535 }; 4536 headerBlocksPage.Add("MasterHeader", masterTools); 4537 4538 Block masterDesktopExtra = new Block() 4539 { 4540 Id = "MasterDesktopExtra", 4541 SortId = 10, 4542 Template = RenderDesktopExtra(), 4543 SkipRenderBlocksList = true 4544 }; 4545 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4546 4547 Block masterDesktopNavigation = new Block() 4548 { 4549 Id = "MasterDesktopNavigation", 4550 SortId = 20, 4551 Template = RenderDesktopNavigation(), 4552 SkipRenderBlocksList = true 4553 }; 4554 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4555 } 4556 4557 @* Include the Blocks for the page *@ 4558 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4559 4560 @using System 4561 @using System.Web 4562 @using Dynamicweb.Rapido.Blocks.Extensibility 4563 @using Dynamicweb.Rapido.Blocks 4564 4565 @{ 4566 Block masterDesktopLogo = new Block 4567 { 4568 Id = "MasterDesktopLogo", 4569 SortId = 10, 4570 Template = RenderDesktopLogo(), 4571 Design = new Design 4572 { 4573 Size = "auto-width", 4574 HidePadding = true, 4575 RenderType = RenderType.Column, 4576 CssClass = "grid--align-self-center" 4577 } 4578 }; 4579 4580 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4581 } 4582 4583 4584 @helper RenderDesktopLogo() 4585 { 4586 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4587 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4588 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4589 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4590 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 4591 if (Path.GetExtension(logo).ToLower() != ".svg") 4592 { 4593 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 4594 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 4595 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 4596 } 4597 else 4598 { 4599 logo = HttpUtility.UrlDecode(logo); 4600 } 4601 4602 <div class="logo @alignClass dw-mod"> 4603 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 4604 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 4605 </a> 4606 </div> 4607 } 4608 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4609 4610 @using System 4611 @using System.Web 4612 @using Dynamicweb.Rapido.Blocks.Extensibility 4613 @using Dynamicweb.Rapido.Blocks 4614 4615 @functions { 4616 bool isMegaMenu; 4617 } 4618 4619 @{ 4620 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 4621 Block masterDesktopMenu = new Block 4622 { 4623 Id = "MasterDesktopMenu", 4624 SortId = 10, 4625 Template = RenderDesktopMenu(), 4626 Design = new Design 4627 { 4628 Size = "auto", 4629 HidePadding = true, 4630 RenderType = RenderType.Column 4631 } 4632 }; 4633 4634 if (isMegaMenu) 4635 { 4636 masterDesktopMenu.Design.CssClass = "u-reset-position"; 4637 } 4638 4639 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 4640 } 4641 4642 @helper RenderDesktopMenu() 4643 { 4644 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4645 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 4646 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 4647 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 4648 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4649 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 4650 int startLevel = renderPagesInToolBar ? 1 : 0; 4651 4652 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 4653 4654 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 4655 @if (!isMegaMenu) 4656 { 4657 @RenderNavigation(new 4658 { 4659 id = "topnavigation", 4660 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4661 startLevel = startLevel, 4662 ecomStartLevel = startLevel + 1, 4663 endlevel = 5, 4664 expandmode = "all", 4665 template = "BaseMenuWithDropdown.xslt" 4666 }); 4667 } 4668 else 4669 { 4670 @RenderNavigation(new 4671 { 4672 id = "topnavigation", 4673 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 4674 startLevel = startLevel, 4675 ecomStartLevel = startLevel + 1, 4676 endlevel = 5, 4677 promotionImage = megamenuPromotionImage, 4678 promotionLink = promotionLink, 4679 expandmode = "all", 4680 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 4681 template = "BaseMegaMenu.xslt" 4682 }); 4683 } 4684 </div> 4685 } 4686 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4687 4688 @using System 4689 @using System.Web 4690 @using Dynamicweb.Rapido.Blocks.Extensibility 4691 @using Dynamicweb.Rapido.Blocks 4692 4693 @{ 4694 Block masterDesktopActionsMenu = new Block 4695 { 4696 Id = "MasterDesktopActionsMenu", 4697 SortId = 10, 4698 Template = RenderDesktopActionsMenu(), 4699 Design = new Design 4700 { 4701 CssClass = "u-flex" 4702 }, 4703 SkipRenderBlocksList = true 4704 4705 }; 4706 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 4707 4708 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 4709 { 4710 Block masterDesktopActionsHeaderButton = new Block 4711 { 4712 Id = "MasterDesktopActionsHeaderButton", 4713 SortId = 60, 4714 Template = RenderHeaderButton() 4715 }; 4716 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 4717 } 4718 } 4719 4720 @helper RenderDesktopActionsMenu() 4721 { 4722 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 4723 4724 <ul class="menu u-flex dw-mod"> 4725 @RenderBlockList(subBlocks) 4726 </ul> 4727 } 4728 4729 @helper RenderHeaderButton() 4730 { 4731 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 4732 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 4733 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 4734 4735 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 4736 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-left" href="@headerButtonLink">@headerButtonText</a> 4737 </li> 4738 } 4739 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4740 4741 @using System 4742 @using System.Web 4743 @using Dynamicweb.Core; 4744 @using System.Text.RegularExpressions 4745 @using Dynamicweb.Rapido.Blocks.Extensibility 4746 @using Dynamicweb.Rapido.Blocks 4747 4748 @{ 4749 Block masterDesktopActionsMenuLanguageSelector = new Block 4750 { 4751 Id = "MasterDesktopActionsMenuLanguageSelector", 4752 SortId = 40, 4753 Template = RenderLanguageSelector() 4754 }; 4755 4756 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 4757 } 4758 4759 @helper RenderLanguageSelector() 4760 { 4761 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4762 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 4763 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4764 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() : ""; 4765 4766 if (Model.Languages.Count > 1) 4767 { 4768 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 4769 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 4770 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i> 4771 </div> 4772 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 4773 @foreach (var lang in Model.Languages) 4774 { 4775 string widthClass = "menu__item--fixed-width"; 4776 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name; 4777 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4778 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4779 4780 if (languageViewType == "flag-culture") 4781 { 4782 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName; 4783 } 4784 4785 if (languageViewType == "flag") 4786 { 4787 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>"; 4788 widthClass = ""; 4789 } 4790 4791 if (languageViewType == "name") 4792 { 4793 langInfo = lang.Name; 4794 } 4795 4796 if (languageViewType == "culture") 4797 { 4798 langInfo = cultureName; 4799 widthClass = ""; 4800 } 4801 4802 <div class="menu__item dw-mod @widthClass"> 4803 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a> 4804 </div> 4805 } 4806 </div> 4807 </li> 4808 } 4809 } 4810 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4811 4812 @using System 4813 @using System.Web 4814 @using Dynamicweb.Rapido.Blocks.Extensibility 4815 @using Dynamicweb.Rapido.Blocks 4816 4817 @{ 4818 Block masterDesktopActionsMenuSignIn = new Block 4819 { 4820 Id = "MasterDesktopActionsMenuSignIn", 4821 SortId = 20, 4822 Template = RenderSignIn() 4823 }; 4824 4825 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 4826 } 4827 4828 @helper RenderSignIn() 4829 { 4830 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4831 string userInitials = ""; 4832 int pageId = Model.TopPage.ID; 4833 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4834 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 4835 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4836 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4837 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4838 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4839 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 4840 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4841 int applyTradeAccountPageId = GetPageIdByNavigationTag("ApplyForTradeAccount"); 4842 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4843 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4844 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4845 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4846 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 4847 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 4848 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 4849 4850 string linkStart = "/Default.aspx?ID="; 4851 if (Model.CurrentUser.ID <= 0) 4852 { 4853 linkStart += signInProfilePageId + "&RedirectPageId="; 4854 } 4855 4856 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 4857 string myProfilePageLink = linkStart + myProfilePageId; 4858 string myOrdersPageLink = linkStart + myOrdersPageId; 4859 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4860 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4861 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 4862 string applyTradeAccountLink = "/Default.aspx?ID=" + applyTradeAccountPageId; 4863 4864 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 4865 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"; 4866 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 4867 4868 if (Model.CurrentUser.ID != 0) 4869 { 4870 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 4871 } 4872 4873 if (!navigationItemsHideSignIn) 4874 { 4875 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4876 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 4877 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 4878 4879 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod"> 4880 <div class="@menuLinkClass dw-mod"> 4881 @if (Model.CurrentUser.ID <= 0) 4882 { 4883 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x" title="@Translate("Sign in")"></i> 4884 } 4885 else 4886 { 4887 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a> 4888 } 4889 </div> 4890 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 4891 <ul class="list list--clean dw-mod"> 4892 @if (Model.CurrentUser.ID <= 0) 4893 { 4894 <li> 4895 <a href="/default.aspx?ID=@signInProfilePageId" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" title="@Translate("Sign in")">@Translate("Sign in")</a> 4896 </li> 4897 4898 if (!hideCreateAccountLink) 4899 { 4900 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 4901 } 4902 4903 @RenderListItem(applyTradeAccountLink, Translate("Apply For Trade Account")); 4904 4905 if (!hideForgotPasswordLink) 4906 { 4907 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 4908 } 4909 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4910 { 4911 @RenderSeparator() 4912 } 4913 } 4914 @if (!hideMyProfileLink && Model.CurrentUser.ID != 0) 4915 { 4916 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 4917 } 4918 @if (!hideMyOrdersLink && Model.CurrentUser.ID != 0) 4919 { 4920 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 4921 } 4922 @if (!hideMyFavoritesLink) 4923 { 4924 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 4925 } 4926 @if (!hideMySavedCardsLink) 4927 { 4928 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 4929 } 4930 @if (!hideMyOrderDraftsLink) 4931 { 4932 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 4933 } 4934 @if (Model.CurrentUser.ID > 0) 4935 { 4936 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 4937 { 4938 @RenderSeparator() 4939 } 4940 4941 //Check if impersonation is on 4942 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4943 { 4944 <li> 4945 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 4946 @Translate("Sign out") 4947 </div> 4948 </li> 4949 } else { 4950 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 4951 } 4952 } 4953 </ul> 4954 </div> 4955 </li> 4956 } 4957 } 4958 4959 @helper RenderListItem(string link, string text, string icon = null) { 4960 <li> 4961 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)"> 4962 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 4963 </a> 4964 </li> 4965 } 4966 4967 @helper RenderSeparator() 4968 { 4969 <li class="list__seperator dw-mod"></li> 4970 } 4971 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4972 4973 @using System 4974 @using System.Web 4975 @using Dynamicweb.Rapido.Blocks.Extensibility 4976 @using Dynamicweb.Rapido.Blocks 4977 4978 @{ 4979 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 4980 4981 Block masterDesktopActionsMenuFavorites = new Block 4982 { 4983 Id = "MasterDesktopActionsMenuFavorites", 4984 SortId = 30, 4985 Template = RenderFavorites() 4986 }; 4987 4988 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 4989 { 4990 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 4991 } 4992 } 4993 4994 @helper RenderFavorites() 4995 { 4996 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 4997 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 4998 4999 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5000 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5001 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5002 5003 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5004 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5005 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5006 </a> 5007 </li> 5008 } 5009 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5010 5011 @using System 5012 @using System.Web 5013 @using Dynamicweb.Rapido.Blocks.Extensibility 5014 @using Dynamicweb.Rapido.Blocks 5015 @using Dynamicweb.Rapido.Services 5016 5017 @{ 5018 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5019 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5020 5021 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5022 { 5023 Block masterDesktopActionsMenuMiniCart = new Block 5024 { 5025 Id = "MasterDesktopActionsMenuMiniCart", 5026 SortId = 60, 5027 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5028 SkipRenderBlocksList = true, 5029 BlocksList = new List<Block>() 5030 }; 5031 5032 Block miniCartCounterScriptTemplate = new Block 5033 { 5034 Id = "MiniCartCounterScriptTemplate", 5035 Template = RenderMiniCartCounterContent() 5036 }; 5037 5038 //dropdown layout is default 5039 RazorEngine.Templating.TemplateWriter layoutTemplate; 5040 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5041 5042 switch (miniCartLayout) 5043 { 5044 case "dropdown": 5045 layoutTemplate = RenderMiniCartDropdownLayout(); 5046 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5047 break; 5048 case "panel": 5049 layoutTemplate = RenderMiniCartPanelLayout(); 5050 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5051 break; 5052 case "modal": 5053 layoutTemplate = RenderMiniCartModalLayout(); 5054 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5055 break; 5056 case "none": 5057 default: 5058 layoutTemplate = RenderMiniCartDropdownLayout(); 5059 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5060 break; 5061 } 5062 5063 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5064 { 5065 Id = "MiniCartTrigger", 5066 Template = miniCartTriggerTemplate 5067 }); 5068 5069 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5070 { 5071 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5072 { 5073 Id = "MiniCartLayout", 5074 Template = layoutTemplate 5075 }); 5076 } 5077 5078 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5079 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5080 } 5081 5082 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5083 { 5084 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block { 5085 Id = "CartInitialization" 5086 }); 5087 } 5088 } 5089 5090 @helper RenderMiniCart(bool hasMouseEnterEvent) 5091 { 5092 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5093 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5094 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5095 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5096 string mouseEvent = ""; 5097 string id = "MiniCart"; 5098 if (hasMouseEnterEvent) 5099 { 5100 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5101 id = "miniCartTrigger"; 5102 } 5103 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5104 @RenderBlockList(subBlocks) 5105 </li> 5106 } 5107 5108 @helper RenderMiniCartTriggerLabel() 5109 { 5110 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5111 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5112 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5113 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5114 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5115 5116 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')" title="@Translate("Cart")"> 5117 <div class="u-inline u-position-relative"> 5118 <i class="@cartIcon fa-1_5x"></i> 5119 @RenderMiniCartCounter() 5120 </div> 5121 </div> 5122 } 5123 5124 @helper RenderMiniCartTriggerLink() 5125 { 5126 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5127 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5128 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5129 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5130 5131 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5132 <span class="u-inline u-position-relative"> 5133 <i class="@cartIcon fa-1_5x"></i> 5134 @RenderMiniCartCounter() 5135 </span> 5136 </a> 5137 } 5138 5139 @helper RenderMiniCartCounter() 5140 { 5141 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5142 string cartProductsCount = Model.Cart.TotalProductsCount.ToString(); 5143 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5144 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5145 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5146 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5147 5148 if (showPrice && counterPosition == "right") 5149 { 5150 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5151 } 5152 5153 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod" style="display:none;"> 5154 <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"> 5155 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()"> 5156 @cartProductsCount @cartProductsTotalPrice 5157 </span> 5158 </span> 5159 </span> 5160 } 5161 5162 @helper RenderMiniCartCounterContent() 5163 { 5164 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5165 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5166 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5167 5168 <script id="MiniCartCounterContent" type="text/x-template"> 5169 {{#.}} 5170 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}"> 5171 @if (showPriceInMiniCartCounter) 5172 { 5173 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5174 } 5175 else 5176 { 5177 <text>{{numberofproducts}}</text> 5178 } 5179 </span> 5180 {{/.}} 5181 </script> 5182 } 5183 5184 @helper RenderMiniCartDropdownLayout() 5185 { 5186 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5187 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5188 5189 <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"> 5190 <div class="mini-cart-dropdown__inner dw-mod"> 5191 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5192 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5193 <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> 5194 </div> 5195 </div> 5196 </div> 5197 } 5198 5199 @helper RenderMiniCartPanelLayout() 5200 { 5201 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5202 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5203 5204 <div class="mini-cart grid__cell dw-mod"> 5205 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5206 <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"> 5207 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5208 <div class="panel__content u-full-width dw-mod"> 5209 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3> 5210 <div class="panel__content-body panel__content-body--cart dw-mod"> 5211 <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> 5212 </div> 5213 </div> 5214 </div> 5215 </div> 5216 } 5217 5218 @helper RenderMiniCartModalLayout() 5219 { 5220 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5221 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5222 5223 <div class="mini-cart grid__cell dw-mod"> 5224 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5225 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5226 <label for="miniCartTrigger" class="modal-overlay"></label> 5227 <div class="modal modal--md modal--top-right dw-mod"> 5228 <div class="modal__body u-flex grid--direction-column dw-mod"> 5229 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5230 <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> 5231 </div> 5232 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5233 </div> 5234 </div> 5235 </div> 5236 } 5237 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5238 5239 @using System 5240 @using System.Web 5241 @using Dynamicweb.Rapido.Blocks.Extensibility 5242 @using Dynamicweb.Rapido.Blocks 5243 5244 @{ 5245 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5246 5247 Block masterDesktopActionsMenuOrderDraft = new Block 5248 { 5249 Id = "MasterDesktopActionsMenuOrderDraft", 5250 SortId = 40, 5251 Template = RenderOrderDraft() 5252 }; 5253 5254 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5255 { 5256 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5257 } 5258 } 5259 5260 @helper RenderOrderDraft() 5261 { 5262 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5263 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5264 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5265 5266 5267 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5268 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5269 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5270 5271 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5272 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5273 <span class="u-inline u-position-relative"> 5274 <i class="@draftIcon fa-1_5x"></i> 5275 </span> 5276 </a> 5277 </li> 5278 } 5279 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5280 5281 @using System 5282 @using System.Web 5283 @using Dynamicweb.Rapido.Blocks.Extensibility 5284 @using Dynamicweb.Rapido.Blocks 5285 5286 @{ 5287 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5288 5289 Block masterDesktopActionsMenuDownloadCart = new Block 5290 { 5291 Id = "MasterDesktopActionsMenuDownloadCart", 5292 SortId = 50, 5293 Template = RenderDownloadCart() 5294 }; 5295 5296 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5297 { 5298 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5299 } 5300 } 5301 5302 @helper RenderDownloadCart() 5303 { 5304 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5305 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5306 5307 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5308 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5309 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5310 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5311 5312 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5313 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5314 <span class="u-inline u-position-relative"> 5315 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5316 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5317 </span> 5318 </a> 5319 </li> 5320 } 5321 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5322 5323 @using System 5324 @using System.Web 5325 @using Dynamicweb.Rapido.Blocks.Extensibility 5326 @using Dynamicweb.Rapido.Blocks 5327 5328 @functions { 5329 public class SearchConfiguration 5330 { 5331 public string searchFeedId { get; set; } 5332 public string searchSecondFeedId { get; set; } 5333 public int groupsFeedId { get; set; } 5334 public string resultPageLink { get; set; } 5335 public string searchPlaceholder { get; set; } 5336 public string searchType { get; set; } 5337 public string searchTemplate { get; set; } 5338 public string searchContentTemplate { get; set; } 5339 public string searchValue { get; set; } 5340 public bool showGroups { get; set; } 5341 5342 public SearchConfiguration() 5343 { 5344 searchFeedId = ""; 5345 searchSecondFeedId = ""; 5346 searchType = "product-search"; 5347 searchContentTemplate = ""; 5348 showGroups = true; 5349 } 5350 } 5351 } 5352 @{ 5353 Block masterSearchBar = new Block 5354 { 5355 Id = "MasterSearchBar", 5356 SortId = 40, 5357 Template = RenderSearch("bar"), 5358 Design = new Design 5359 { 5360 Size = "auto", 5361 HidePadding = true, 5362 RenderType = RenderType.Column 5363 } 5364 }; 5365 5366 Block masterSearchAction = new Block 5367 { 5368 Id = "MasterDesktopActionsMenuSearch", 5369 SortId = 10, 5370 Template = RenderSearch() 5371 }; 5372 5373 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5374 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5375 } 5376 5377 @helper RenderSearch(string type = "mini-search") 5378 { 5379 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5380 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5381 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5382 5383 SearchConfiguration searchConfiguration = null; 5384 5385 switch (searchType) { 5386 case "contentSearch": 5387 searchConfiguration = new SearchConfiguration() { 5388 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5389 resultPageLink = contentSearchPageLink, 5390 searchPlaceholder = Translate("Search page"), 5391 groupsFeedId = 0, 5392 searchType = "content-search", 5393 searchTemplate = "SearchPagesTemplate", 5394 showGroups = false 5395 }; 5396 break; 5397 case "combinedSearch": 5398 searchConfiguration = new SearchConfiguration() { 5399 searchFeedId = productsPageId + "&feed=true", 5400 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5401 resultPageLink = Converter.ToString(productsPageId), 5402 searchPlaceholder = Translate("Search products or pages"), 5403 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5404 searchType = "combined-search", 5405 searchTemplate = "SearchProductsTemplateWrap", 5406 searchContentTemplate = "SearchPagesTemplateWrap", 5407 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5408 }; 5409 break; 5410 default: //productSearch 5411 searchConfiguration = new SearchConfiguration() { 5412 resultPageLink = Converter.ToString(productsPageId), 5413 searchFeedId = productsPageId + "&feed=true", 5414 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5415 searchPlaceholder = Translate("Search products"), 5416 searchTemplate = "SearchProductsTemplate", 5417 searchType = "product-search", 5418 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5419 }; 5420 break; 5421 } 5422 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5423 5424 if (type == "mini-search") { 5425 @RenderMiniSearch(searchConfiguration) 5426 } else { 5427 @RenderSearchBar(searchConfiguration) 5428 } 5429 } 5430 5431 @helper RenderSearchBar(SearchConfiguration options) 5432 { 5433 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5434 data-page-size="7" 5435 data-search-feed-id="@options.searchFeedId" 5436 data-search-second-feed-id="@options.searchSecondFeedId" 5437 data-result-page-id="@options.resultPageLink" 5438 data-groups-page-id="@options.groupsFeedId" 5439 data-search-type="@options.searchType"> 5440 @if (options.showGroups) 5441 { 5442 <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> 5443 <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> 5444 } 5445 <div class="typeahead-search-field"> 5446 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5447 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5448 { 5449 <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> 5450 } 5451 else 5452 { 5453 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 5454 <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> 5455 <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> 5456 </div> 5457 } 5458 </div> 5459 <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> 5460 </div> 5461 } 5462 5463 @helper RenderMiniSearch(SearchConfiguration options) 5464 { 5465 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5466 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5467 5468 <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"> 5469 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 5470 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 5471 </div> 5472 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 5473 <div class="typeahead js-typeahead" id="ProductSearchBar" 5474 data-page-size="7" 5475 data-search-feed-id="@options.searchFeedId" 5476 data-search-second-feed-id="@options.searchSecondFeedId" 5477 data-result-page-id="@options.resultPageLink" 5478 data-search-type="@options.searchType"> 5479 <div class="typeahead-search-field"> 5480 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5481 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5482 { 5483 <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> 5484 } 5485 else 5486 { 5487 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 5488 <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> 5489 <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> 5490 </div> 5491 } 5492 </div> 5493 </div> 5494 </div> 5495 </li> 5496 } 5497 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5498 5499 @using System 5500 @using System.Web 5501 @using Dynamicweb.Rapido.Blocks.Extensibility 5502 @using Dynamicweb.Rapido.Blocks 5503 5504 @{ 5505 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5506 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 5507 5508 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 5509 5510 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 5511 headerConfigurationPage.RemoveBlock(configDesktopLogo); 5512 5513 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 5514 headerConfigurationPage.RemoveBlock(configDesktopMenu); 5515 5516 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 5517 headerConfigurationPage.RemoveBlock(configSearchBar); 5518 5519 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 5520 headerConfigurationPage.RemoveBlock(configSearchAction); 5521 5522 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 5523 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 5524 5525 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 5526 5527 switch (headerConfigurationTopLayout) 5528 { 5529 case "condensed": //2 5530 configDesktopLogo.Design.Size = "auto-width"; 5531 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5532 5533 configDesktopMenu.SortId = 20; 5534 configDesktopMenu.Design.Size = "auto"; 5535 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5536 5537 configDesktopActionsMenu.SortId = 30; 5538 configDesktopActionsMenu.Design.Size = "auto-width"; 5539 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5540 5541 if (!headerConfigurationHideSearch) 5542 { 5543 configSearchBar.SortId = 40; 5544 configSearchBar.Design.Size = "12"; 5545 configDesktopExtra.SortId = 50; 5546 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5547 } 5548 break; 5549 case "splitted": //3 5550 configDesktopLogo.Design.Size = "auto"; 5551 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5552 5553 if (!headerConfigurationHideSearch) 5554 { 5555 configSearchBar.SortId = 20; 5556 configSearchBar.Design.Size = "auto"; 5557 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5558 } 5559 5560 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5561 5562 configDesktopActionsMenu.SortId = 20; 5563 configDesktopActionsMenu.Design.Size = "auto-width"; 5564 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5565 break; 5566 case "splitted-center": //4 5567 configDesktopLogo.Design.Size = "auto"; 5568 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5569 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5570 5571 configDesktopActionsMenu.SortId = 30; 5572 configDesktopActionsMenu.Design.Size = "auto-width"; 5573 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5574 5575 if (!headerConfigurationHideSearch) 5576 { 5577 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5578 } 5579 break; 5580 case "minimal": //5 5581 configDesktopLogo.Design.Size = "auto-width"; 5582 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5583 5584 configDesktopMenu.Design.Size = "auto"; 5585 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5586 5587 configDesktopActionsMenu.SortId = 20; 5588 configDesktopActionsMenu.Design.Size = "auto-width"; 5589 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5590 5591 if (!headerConfigurationHideSearch) 5592 { 5593 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5594 } 5595 break; 5596 case "minimal-center": //6 5597 configDesktopLogo.Design.Size = "auto-width"; 5598 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5599 5600 configDesktopMenu.Design.Size = "auto"; 5601 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5602 5603 configDesktopActionsMenu.SortId = 20; 5604 configDesktopActionsMenu.Design.Size = "auto-width"; 5605 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5606 5607 if (!headerConfigurationHideSearch) 5608 { 5609 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5610 } 5611 break; 5612 case "minimal-right": //7 5613 configDesktopLogo.Design.Size = "auto-width"; 5614 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 5615 5616 configDesktopMenu.Design.Size = "auto"; 5617 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5618 5619 configDesktopActionsMenu.SortId = 20; 5620 configDesktopActionsMenu.Design.Size = "auto-width"; 5621 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5622 5623 if (!headerConfigurationHideSearch) 5624 { 5625 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5626 } 5627 break; 5628 case "two-lines": //8 5629 configDesktopLogo.Design.Size = "auto"; 5630 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5631 5632 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5633 5634 configDesktopActionsMenu.SortId = 20; 5635 configDesktopActionsMenu.Design.Size = "auto-width"; 5636 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5637 5638 if (!headerConfigurationHideSearch) 5639 { 5640 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5641 } 5642 break; 5643 case "two-lines-centered": //9 5644 configDesktopLogo.Design.Size = "auto"; 5645 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5646 5647 configDesktopMenu.Design.Size = "auto-width"; 5648 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5649 5650 configDesktopActionsMenu.SortId = 20; 5651 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 5652 5653 if (!headerConfigurationHideSearch) 5654 { 5655 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 5656 } 5657 break; 5658 case "normal": //1 5659 default: 5660 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 5661 5662 if (!headerConfigurationHideSearch) 5663 { 5664 configSearchBar.SortId = 20; 5665 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 5666 } 5667 5668 configDesktopActionsMenu.SortId = 30; 5669 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 5670 5671 configDesktopActionsMenu.Design.Size = "auto-width"; 5672 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 5673 break; 5674 } 5675 } 5676 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5677 5678 @using System 5679 @using System.Web 5680 @using Dynamicweb.Rapido.Blocks.Extensibility 5681 @using Dynamicweb.Rapido.Blocks 5682 5683 @{ 5684 5685 } 5686 5687 5688 @helper RenderDesktopTools() 5689 { 5690 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 5691 5692 <div class="tools-navigation dw-mod"> 5693 <div class="center-container grid top-container__center-container dw-mod"> 5694 @RenderBlockList(subBlocks) 5695 </div> 5696 </div> 5697 } 5698 5699 @helper RenderDesktopToolsText() 5700 { 5701 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 5702 if (!string.IsNullOrEmpty(toolsText)) 5703 { 5704 <div class="u-margin-top u-margin-bottom">@toolsText</div> 5705 } 5706 } 5707 5708 @helper RenderDesktopToolsNavigation() 5709 { 5710 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5711 5712 if (renderPagesInToolBar) 5713 { 5714 @RenderNavigation(new 5715 { 5716 id = "topToolsNavigation", 5717 cssclass = "menu menu-tools dw-mod dwnavigation", 5718 template = "TopMenu.xslt" 5719 }) 5720 } 5721 } 5722 5723 @helper RenderDesktopNavigation() 5724 { 5725 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 5726 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5727 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 5728 <nav class="main-navigation dw-mod"> 5729 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 5730 @RenderBlockList(subBlocks) 5731 </div> 5732 </nav> 5733 } 5734 5735 @helper RenderDesktopExtra() 5736 { 5737 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 5738 5739 if (subBlocks.Count > 0) 5740 { 5741 <div class="header header-top dw-mod"> 5742 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 5743 @RenderBlockList(subBlocks) 5744 </div> 5745 </div> 5746 } 5747 }</text> 5748 } 5749 5750 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5751 5752 @using System 5753 @using System.Web 5754 @using Dynamicweb.Rapido.Blocks.Extensibility 5755 @using Dynamicweb.Rapido.Blocks 5756 @using Dynamicweb.Rapido.Blocks.Components.General 5757 @using Dynamicweb.Frontend 5758 5759 @functions { 5760 int impersonationPageId; 5761 string impersonationLayout; 5762 int impersonationFeed; 5763 Block impersonationBar; 5764 5765 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 5766 { 5767 string username = ""; 5768 5769 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 5770 { 5771 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 5772 } 5773 else if (!string.IsNullOrEmpty(name)) 5774 { 5775 username = name; 5776 } 5777 else if (!string.IsNullOrEmpty(email)) 5778 { 5779 username = email; 5780 } 5781 else 5782 { 5783 username = userName; 5784 } 5785 return username; 5786 } 5787 5788 string getUserName(UserViewModel user) 5789 { 5790 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 5791 } 5792 5793 string getUserName(Dynamicweb.Security.UserManagement.User user) 5794 { 5795 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 5796 } 5797 } 5798 5799 @{ 5800 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 5801 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 5802 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 5803 5804 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0) 5805 { 5806 impersonationBar = new Block 5807 { 5808 Id = "ImpersonationBar", 5809 SortId = 50, 5810 Template = RenderImpersonation(), 5811 SkipRenderBlocksList = true, 5812 Design = new Design 5813 { 5814 Size = "auto-width", 5815 HidePadding = true, 5816 RenderType = RenderType.Column 5817 } 5818 }; 5819 5820 if (impersonationLayout == "top-bar") { 5821 impersonationBar.SortId = 9; 5822 } 5823 5824 Block impersonationContent = new Block 5825 { 5826 Id = "ImpersonationContent", 5827 SortId = 20 5828 }; 5829 5830 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 5831 { 5832 //Render stop impersonation view 5833 impersonationContent.Template = RenderStopImpersonationView(); 5834 5835 5836 Modal stopImpersonation = new Modal 5837 { 5838 Id = "StopImpersonation", 5839 Heading = new Heading { 5840 Level = 2, 5841 Title = Translate("Sign out"), 5842 Icon = new Icon { 5843 Name = "fa-sign-out", 5844 Prefix = "fas", 5845 LabelPosition = IconLabelPosition.After 5846 } 5847 }, 5848 Width = ModalWidth.Sm, 5849 BodyTemplate = RenderStopImpersonationForm() 5850 }; 5851 5852 Block stopImpersonationBlock = new Block 5853 { 5854 Id = "StopImpersonationBlock", 5855 SortId = 10, 5856 Component = stopImpersonation 5857 }; 5858 impersonationBar.BlocksList.Add(stopImpersonationBlock); 5859 } 5860 else 5861 { 5862 //Render main view 5863 switch (impersonationLayout) 5864 { 5865 case "right-lower-box": 5866 impersonationContent.BlocksList.Add( 5867 new Block { 5868 Id = "RightLowerBoxHeader", 5869 SortId = 10, 5870 Component = new Heading { 5871 Level = 5, 5872 Title = Translate("View the list of users you can sign in as"), 5873 CssClass = "impersonation-text" 5874 } 5875 } 5876 ); 5877 impersonationContent.BlocksList.Add( 5878 new Block { 5879 Id = "RightLowerBoxContent", 5880 SortId = 20, 5881 Template = RenderImpersonationControls() 5882 } 5883 ); 5884 break; 5885 case "right-lower-bar": 5886 impersonationContent.BlocksList.Add( 5887 new Block { 5888 Id = "RightLowerBarContent", 5889 SortId = 10, 5890 Template = RenderImpersonationControls() 5891 } 5892 ); 5893 break; 5894 case "bar": 5895 default: 5896 impersonationContent.BlocksList.Add( 5897 new Block { 5898 Id = "ViewListLink", 5899 SortId = 20, 5900 Template = RenderViewListLink() 5901 } 5902 ); 5903 impersonationContent.BlocksList.Add( 5904 new Block { 5905 Id = "BarTypeaheadSearch", 5906 SortId = 30, 5907 Template = RenderTypeaheadSearch() 5908 } 5909 ); 5910 break; 5911 } 5912 } 5913 impersonationBar.BlocksList.Add(impersonationContent); 5914 5915 impersonationBar.BlocksList.Add( 5916 new Block 5917 { 5918 Id = "ImpersonationSearchTemplates", 5919 SortId = 30, 5920 Template = RenderSearchResultTemplate() 5921 } 5922 ); 5923 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 5924 { 5925 impersonationBar.BlocksList.Add( 5926 new Block 5927 { 5928 Id = "ImpersonationSearchScripts", 5929 SortId = 40, 5930 Template = RenderSearchScripts() 5931 } 5932 ); 5933 } 5934 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 5935 } 5936 } 5937 5938 @helper RenderImpersonation() 5939 { 5940 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 5941 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 5942 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 5943 @if (impersonationLayout == "right-lower-box") 5944 { 5945 @RenderRightLowerBoxHeader() 5946 } 5947 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 5948 @*Impersonation*@ 5949 @RenderBlockList(subBlocks) 5950 </div> 5951 </div> 5952 } 5953 5954 @helper RenderRightLowerBoxHeader() 5955 { 5956 <div class="impersonation__header dw-mod"> 5957 <div class="impersonation__title">@Translate("Impersonation")</div> 5958 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 5959 @Render(new Icon 5960 { 5961 Prefix = "fas", 5962 Name = "fa-window-minimize" 5963 }) 5964 </label> 5965 </div> 5966 } 5967 5968 @helper RenderStopImpersonationView() 5969 { 5970 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 5971 string userName = getUserName(Pageview.User); 5972 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> "; 5973 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; 5974 5975 if (impersonationLayout == "right-lower-box") 5976 { 5977 <div class="u-margin-bottom--lg u-ta-center"> 5978 @impersonationText 5979 </div> 5980 <div class="u-margin-bottom--lg u-ta-center"> 5981 @RenderSwitchAccountButton() 5982 </div> 5983 @RenderStopImpersonationButton() 5984 } 5985 else 5986 { 5987 <div class="grid grid--align-center impersonation__stop-wrap"> 5988 <div class="impersonation-bar-item dw-mod"> 5989 @impersonationText 5990 </div> 5991 <div class="impersonation-bar-item dw-mod"> 5992 @RenderSwitchAccountButton() 5993 </div> 5994 <div class="impersonation-bar-item dw-mod"> 5995 @RenderStopImpersonationButton() 5996 </div> 5997 </div> 5998 } 5999 } 6000 6001 @helper RenderSwitchAccountButton() { 6002 @Render(new Button 6003 { 6004 Href = "/Default.aspx?ID=" + impersonationPageId, 6005 ButtonType = ButtonType.Button, 6006 ButtonLayout = ButtonLayout.Clean, 6007 Title = Translate("Switch account"), 6008 Icon = new Icon { 6009 Name = "fa-users", 6010 Prefix = "fal", 6011 LabelPosition = IconLabelPosition.After 6012 }, 6013 CssClass = "u-no-margin u-color-inherit" 6014 }) 6015 } 6016 6017 @helper RenderStopImpersonationForm() 6018 { 6019 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6020 string userName = getUserName(Pageview.User); 6021 int pageId = Model.TopPage.ID; 6022 6023 <form method="post" class="u-no-margin"> 6024 @Render(new Button 6025 { 6026 ButtonType = ButtonType.Submit, 6027 ButtonLayout = ButtonLayout.Secondary, 6028 Title = Translate("Sign out as") + " " + userName, 6029 Href = "/Default.aspx?ID=" + impersonationPageId, 6030 CssClass = "btn--full", 6031 Name = "DwExtranetRemoveSecondaryUser" 6032 }) 6033 6034 @Render(new Button 6035 { 6036 ButtonType = ButtonType.Submit, 6037 ButtonLayout = ButtonLayout.Secondary, 6038 Title = Translate("Sign out as") + " " + secondaryUserName, 6039 Href = "/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, 6040 CssClass = "btn--full", 6041 Name = "DwExtranetRemoveSecondaryUser" 6042 }) 6043 </form> 6044 } 6045 6046 @helper RenderStopImpersonationButton() { 6047 @Render(new Button 6048 { 6049 ButtonType = ButtonType.Button, 6050 ButtonLayout = ButtonLayout.Clean, 6051 Title = Translate("Sign out"), 6052 Icon = new Icon { 6053 Name = "fa-sign-out", 6054 Prefix = "fal", 6055 LabelPosition = IconLabelPosition.After 6056 }, 6057 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6058 CssClass = "u-no-margin" 6059 }) 6060 } 6061 6062 @helper RenderImpersonationControls() 6063 { 6064 <div class="impersonation__controls"> 6065 @RenderViewListLink() 6066 @RenderSearchBox() 6067 </div> 6068 @RenderResultsList() 6069 } 6070 6071 @helper RenderViewListLink() 6072 { 6073 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6074 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6075 6076 @Render(new Link { 6077 ButtonLayout = ButtonLayout.None, 6078 Title = title, 6079 Href = "/Default.aspx?ID=" + impersonationPageId, 6080 CssClass = buttonClasses 6081 }) 6082 } 6083 6084 @helper RenderSearchBox() 6085 { 6086 <div class="impersonation__search-wrap"> 6087 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6088 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6089 <i class="fal fa-search"></i> 6090 </div> 6091 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6092 <i class="fal fa-times"></i> 6093 </div> 6094 </div> 6095 } 6096 6097 @helper RenderTypeaheadSearch() 6098 { 6099 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6100 data-page-size="5" 6101 data-search-feed-id="@impersonationFeed" 6102 data-result-page-id="@impersonationPageId" 6103 data-search-type="user-search" 6104 data-search-parameter-name="q"> 6105 6106 <div class="typeahead-search-field"> 6107 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 6108 <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> 6109 </div> 6110 </div> 6111 } 6112 6113 @helper RenderResultsList() 6114 { 6115 <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> 6116 } 6117 6118 @helper RenderSearchResultTemplate() 6119 { 6120 <script id="ImpersonationSearchResult" type="text/x-template"> 6121 {{#.}} 6122 {{#Users}} 6123 <li class="impersonation__search-results-item impersonation-user"> 6124 <form method="post" class="impersonation-user__form" name="account{{id}}"> 6125 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 6126 <div class="impersonation-user__info"> 6127 <div class="impersonation-user__name">{{userName}}</div> 6128 <div class="impersonation-user__number">{{customerNumber}}</div> 6129 </div> 6130 @Render(new Button 6131 { 6132 ButtonType = ButtonType.Submit, 6133 ButtonLayout = ButtonLayout.Secondary, 6134 Title = Translate("Sign in as"), 6135 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 6136 }) 6137 </form> 6138 </li> 6139 {{/Users}} 6140 {{#unless Users}} 6141 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 6142 @Translate("Your search gave 0 results") 6143 </li> 6144 {{/unless}} 6145 {{/.}} 6146 </script> 6147 } 6148 6149 @helper RenderSearchScripts() 6150 { 6151 <script> 6152 let inputDelayTimer; 6153 function searchKeyUpHandler(e) { 6154 clearTimeout(inputDelayTimer); 6155 let value = e.target.value; 6156 if (value != "") { 6157 inputDelayTimer = setTimeout(function () { 6158 updateResults(value); 6159 }, 500); 6160 } else { 6161 clearResults(); 6162 } 6163 }; 6164 6165 function updateResults(value) { 6166 if (value == "") { 6167 return null; 6168 } 6169 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 6170 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 6171 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 6172 } 6173 6174 function clearResults() { 6175 document.getElementById("ImpersonationBoxSearchField").value = ""; 6176 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 6177 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 6178 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 6179 } 6180 </script> 6181 } 6182 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6183 6184 @using System 6185 @using System.Web 6186 @using System.Collections.Generic 6187 @using Dynamicweb.Rapido.Blocks.Extensibility 6188 @using Dynamicweb.Rapido.Blocks 6189 6190 @{ 6191 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 6192 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 6193 6194 Block orderLines = new Block 6195 { 6196 Id = "MiniCartOrderLines", 6197 SkipRenderBlocksList = true, 6198 BlocksList = new List<Block> 6199 { 6200 new Block { 6201 Id = "MiniCartOrderLinesList", 6202 SortId = 20, 6203 Template = RenderMiniCartOrderLinesList() 6204 } 6205 } 6206 }; 6207 6208 Block orderlinesScriptTemplates = new Block 6209 { 6210 Id = "OrderlinesScriptTemplates" 6211 }; 6212 6213 if (orderlinesView == "table") 6214 { 6215 orderLines.Template = RenderMiniCartOrderLinesTable(); 6216 orderLines.BlocksList.Add( 6217 new Block 6218 { 6219 Id = "MiniCartOrderlinesTableHeader", 6220 SortId = 10, 6221 Template = RenderMiniCartOrderLinesHeader() 6222 } 6223 ); 6224 6225 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 6226 } 6227 else 6228 { 6229 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 6230 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 6231 } 6232 6233 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 6234 6235 Block miniCartScriptTemplates = new Block() 6236 { 6237 Id = "MasterMiniCartTemplates", 6238 SortId = 1, 6239 Template = RenderMiniCartScriptTemplates(), 6240 SkipRenderBlocksList = true, 6241 BlocksList = new List<Block> 6242 { 6243 orderLines, 6244 new Block { 6245 Id = "MiniCartFooter", 6246 Template = RenderMiniCartFooter(), 6247 SortId = 50, 6248 SkipRenderBlocksList = true, 6249 BlocksList = new List<Block> 6250 { 6251 new Block { 6252 Id = "MiniCartSubTotal", 6253 Template = RenderMiniCartSubTotal(), 6254 SortId = 30 6255 }, 6256 new Block { 6257 Id = "MiniCartFees", 6258 Template = RenderMiniCartFees(), 6259 SortId = 40 6260 }, 6261 new Block { 6262 Id = "MiniCartPoints", 6263 Template = RenderMiniCartPoints(), 6264 SortId = 50 6265 }, 6266 new Block { 6267 Id = "MiniCartTotal", 6268 Template = RenderMiniCartTotal(), 6269 SortId = 60 6270 }, 6271 new Block { 6272 Id = "MiniCartDisclaimer", 6273 Template = RenderMiniCartDisclaimer(), 6274 SortId = 70 6275 }, 6276 new Block { 6277 Id = "MiniCartActions", 6278 Template = RenderMiniCartActions(), 6279 SortId = 80 6280 } 6281 } 6282 } 6283 } 6284 }; 6285 6286 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 6287 } 6288 6289 @helper RenderMiniCartScriptsTableTemplates() 6290 { 6291 <script id="MiniCartOrderline" type="text/x-template"> 6292 {{#unless isEmpty}} 6293 <tr> 6294 <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> 6295 <td class="u-va-middle"> 6296 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a> 6297 {{#if variantname}} 6298 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 6299 {{/if}} 6300 {{#if unitname}} 6301 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 6302 {{/if}} 6303 </td> 6304 <td class="u-ta-right u-va-middle cartqty">{{quantity}}</td> 6305 <td class="u-hidden parentproductId">{{parentproductId}}</td> 6306 <td class="u-hidden productId">{{productnumber}}</td> 6307 <td class="u-ta-right u-va-middle"> 6308 {{#if pointsTotal}} 6309 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6310 {{else}} 6311 {{totalprice}} 6312 {{/if}} 6313 </td> 6314 </tr> 6315 {{/unless}} 6316 </script> 6317 6318 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6319 {{#unless isEmpty}} 6320 <tr class="table__row--no-border discounttr"> 6321 <td class="u-w60px">&nbsp;</td> 6322 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 6323 <td class="u-ta-right">&nbsp;</td> 6324 <td class="u-ta-right">{{totalprice}}</td> 6325 </tr> 6326 {{/unless}} 6327 </script> 6328 } 6329 6330 @helper RenderMiniCartScriptsListTemplates() 6331 { 6332 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6333 6334 <script id="MiniCartOrderline" type="text/x-template"> 6335 {{#unless isEmpty}} 6336 <div class="mini-cart-orderline grid dw-mod"> 6337 <div class="grid__col-4"> 6338 <a href="{{link}}" class="{{hideimage}}"> 6339 <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}}"> 6340 </a> 6341 </div> 6342 <div class="grid__col-8"> 6343 <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> 6344 {{#if variantname}} 6345 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 6346 {{/if}} 6347 {{#if unitname}} 6348 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 6349 {{/if}} 6350 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 6351 6352 <div class="grid__cell-footer"> 6353 <div class="grid__cell"> 6354 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 6355 {{#if pointsTotal}} 6356 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 6357 {{else}} 6358 {{totalprice}} 6359 {{/if}} 6360 </div> 6361 <button type="button" 6362 title="@Translate("Remove orderline")" 6363 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 6364 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 6365 </div> 6366 </div> 6367 </div> 6368 </div> 6369 {{/unless}} 6370 </script> 6371 6372 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 6373 {{#unless isEmpty}} 6374 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 6375 <div class="grid__col-4"> 6376 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 6377 </div> 6378 <div class="grid__col-8">{{totalprice}}</div> 6379 </div> 6380 {{/unless}} 6381 </script> 6382 } 6383 6384 @helper RenderMiniCartScriptTemplates() 6385 { 6386 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 6387 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6388 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 6389 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 6390 6391 <script id="MiniCartContent" type="text/x-template"> 6392 {{#.}} 6393 {{#unless isEmpty}} 6394 @if (miniCartUseGoogleTagManager) 6395 { 6396 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 6397 } 6398 @RenderBlockList(subBlocks) 6399 {{/unless}} 6400 {{/.}} 6401 </script> 6402 } 6403 6404 @helper RenderMiniCartOrderLinesTable() 6405 { 6406 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6407 6408 <div class="u-overflow-auto"> 6409 <table class="table mini-cart-table dw-mod"> 6410 @RenderBlockList(subBlocks) 6411 </table> 6412 </div> 6413 } 6414 6415 @helper RenderMiniCartOrderLinesBlocks() 6416 { 6417 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 6418 6419 <div class="u-overflow-auto"> 6420 @RenderBlockList(subBlocks) 6421 </div> 6422 } 6423 6424 @helper RenderMiniCartOrderLinesHeader() 6425 { 6426 <thead> 6427 <tr> 6428 <td>&nbsp;</td> 6429 <td>@Translate("Product")</td> 6430 <td class="u-ta-right">@Translate("Qty")</td> 6431 <td class="u-ta-right" width="120">@Translate("Price")</td> 6432 </tr> 6433 </thead> 6434 } 6435 6436 @helper RenderMiniCartOrderLinesList() 6437 { 6438 <text> 6439 {{#OrderLines}} 6440 {{#ifCond template "===" "CartOrderline"}} 6441 {{>MiniCartOrderline}} 6442 {{/ifCond}} 6443 {{#ifCond template "===" "CartOrderlineMobile"}} 6444 {{>MiniCartOrderline}} 6445 {{/ifCond}} 6446 {{#ifCond template "===" "CartOrderlineDiscount"}} 6447 {{>MiniCartOrderlineDiscount}} 6448 {{/ifCond}} 6449 {{/OrderLines}} 6450 </text> 6451 } 6452 6453 @helper RenderMiniCartFees() 6454 { 6455 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6456 if (!pointShop) 6457 { 6458 <text> 6459 {{#unless hidePaymentfee}} 6460 <div class="grid"> 6461 <div class="grid__col-6 grid__col--bleed-y"> 6462 {{paymentmethod}} 6463 </div> 6464 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 6465 </div> 6466 {{/unless}} 6467 </text> 6468 } 6469 <text> 6470 {{#unless hideShippingfee}} 6471 <div class="grid"> 6472 <div class="grid__col-6 grid__col--bleed-y"> 6473 {{shippingmethod}} 6474 </div> 6475 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 6476 </div> 6477 {{/unless}} 6478 </text> 6479 <text> 6480 {{#if hasTaxSettings}} 6481 <div class="grid"> 6482 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 6483 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 6484 </div> 6485 {{/if}} 6486 </text> 6487 } 6488 6489 @helper RenderMiniCartFooter() 6490 { 6491 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 6492 6493 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 6494 @RenderBlockList(subBlocks) 6495 </div> 6496 } 6497 6498 @helper RenderMiniCartActions() 6499 { 6500 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6501 6502 <button 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> 6503 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Go to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Go to cart")</a> 6504 } 6505 6506 @helper RenderMiniCartPoints() 6507 { 6508 <text> 6509 {{#if earnings}} 6510 <div class="grid"> 6511 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 6512 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6513 <div> 6514 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 6515 </div> 6516 </div> 6517 </div> 6518 {{/if}} 6519 </text> 6520 } 6521 6522 @helper RenderMiniCartSubTotal() 6523 { 6524 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 6525 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6526 if (!pointShop) 6527 { 6528 <text> 6529 {{#unless hideSubTotal}} 6530 <div class="grid dw-mod u-bold"> 6531 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 6532 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 6533 @if (hasTaxSettings) 6534 { 6535 <text>{{subtotalpricewithouttaxes}}</text> 6536 } 6537 else 6538 { 6539 <text>{{subtotalprice}}</text> 6540 } 6541 </div> 6542 </div> 6543 {{/unless}} 6544 </text> 6545 } 6546 } 6547 6548 @helper RenderMiniCartTotal() 6549 { 6550 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 6551 6552 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 6553 <div class="grid__col-6">@Translate("Total")</div> 6554 <div class="grid__col-6 grid--align-end"> 6555 <div> 6556 @if (pointShop) 6557 { 6558 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 6559 } 6560 else 6561 { 6562 <text>{{totalprice}}</text> 6563 } 6564 </div> 6565 </div> 6566 </div> 6567 } 6568 6569 @helper RenderMiniCartDisclaimer() 6570 { 6571 <text> 6572 {{#if showCheckoutDisclaimer}} 6573 <div class="grid u-margin-bottom u-ta-right"> 6574 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 6575 </div> 6576 {{/if}} 6577 </text> 6578 } 6579 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6580 6581 @using Dynamicweb.Rapido.Blocks.Extensibility 6582 @using Dynamicweb.Rapido.Blocks 6583 @using Dynamicweb.Rapido.Blocks.Components.General 6584 @using Dynamicweb.Rapido.Blocks.Components 6585 @using Dynamicweb.Rapido.Services 6586 6587 @{ 6588 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 6589 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 6590 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 6591 6592 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 6593 { 6594 if (addToCartNotificationType == "modal") 6595 { 6596 Block addToCartNotificationModal = new Block 6597 { 6598 Id = "AddToCartNotificationModal", 6599 Template = RenderAddToCartNotificationModal() 6600 }; 6601 6602 Block addToCartNotificationScript = new Block 6603 { 6604 Id = "AddToCartNotificationScript", 6605 Template = RenderAddToCartNotificationModalScript() 6606 }; 6607 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 6608 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6609 } 6610 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 6611 { 6612 Block addToCartNotificationScript = new Block 6613 { 6614 Id = "AddToCartNotificationScript", 6615 Template = RenderAddToCartNotificationToggleScript() 6616 }; 6617 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 6618 } 6619 } 6620 } 6621 6622 @helper RenderAddToCartNotificationModal() 6623 { 6624 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 6625 } 6626 6627 @helper RenderAddToCartNotificationModalScript() 6628 { 6629 int cartPageId = GetPageIdByNavigationTag("CartPage"); 6630 6631 <script id="LastAddedProductTemplate" type="text/x-template"> 6632 @{ 6633 6634 Modal lastAddedProduct = new Modal 6635 { 6636 Id = "LastAddedProduct", 6637 Heading = new Heading 6638 { 6639 Level = 2, 6640 Title = Translate("Product is added to the cart") 6641 }, 6642 Width = ModalWidth.Md, 6643 BodyTemplate = RenderModalContent() 6644 }; 6645 6646 lastAddedProduct.AddActions( 6647 new Button 6648 { 6649 ButtonType = ButtonType.Button, 6650 ButtonLayout = ButtonLayout.Secondary, 6651 Title = Translate("Continue shopping"), 6652 CssClass = "u-pull--left u-no-margin btn--sm", 6653 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6654 }, 6655 new Link 6656 { 6657 Href = "/Default.aspx?ID=" + cartPageId, 6658 ButtonLayout = ButtonLayout.Secondary, 6659 CssClass = "u-pull--right u-no-margin btn--sm", 6660 Title = Translate("Proceed to checkout"), 6661 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 6662 } 6663 ); 6664 6665 @Render(lastAddedProduct) 6666 } 6667 </script> 6668 <script> 6669 document.addEventListener('addToCart', function (event) { 6670 Cart.ShowLastAddedProductModal(event.detail); 6671 }); 6672 </script> 6673 } 6674 6675 @helper RenderModalContent() 6676 { 6677 <div class="grid"> 6678 <div class="grid__col-2"> 6679 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 6680 </div> 6681 <div class="u-padding grid--align-self-center"> 6682 <span>{{quantity}}</span> x 6683 </div> 6684 <div class="grid__col-auto grid--align-self-center"> 6685 <div>{{productInfo.name}}</div> 6686 {{#if productInfo.variantName}} 6687 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 6688 {{/if}} 6689 {{#if productInfo.unitName}} 6690 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 6691 {{/if}} 6692 </div> 6693 </div> 6694 } 6695 6696 @helper RenderAddToCartNotificationToggleScript() 6697 { 6698 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 6699 6700 <script> 6701 document.addEventListener('addToCart', function () { 6702 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 6703 }); 6704 </script> 6705 } 6706 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6707 6708 @using System 6709 @using System.Web 6710 @using System.Collections.Generic 6711 @using Dynamicweb.Rapido.Blocks.Extensibility 6712 @using Dynamicweb.Rapido.Blocks 6713 @using Dynamicweb.Rapido.Blocks.Components.General 6714 6715 @functions { 6716 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 6717 } 6718 6719 @{ 6720 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 6721 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 6722 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 6723 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 6724 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 6725 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 6726 6727 Block masterFooterContent = new Block() 6728 { 6729 Id = "MasterFooterContent", 6730 SortId = 10, 6731 Template = RenderFooter(), 6732 SkipRenderBlocksList = true 6733 }; 6734 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 6735 6736 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 6737 { 6738 Block masterFooterColumnOne = new Block 6739 { 6740 Id = "MasterFooterColumnOne", 6741 SortId = 10, 6742 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 6743 Design = new Design 6744 { 6745 Size = "auto", 6746 RenderType = RenderType.Column 6747 } 6748 }; 6749 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 6750 } 6751 6752 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 6753 { 6754 Block masterFooterColumnTwo = new Block 6755 { 6756 Id = "MasterFooterColumnTwo", 6757 SortId = 20, 6758 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 6759 Design = new Design 6760 { 6761 Size = "auto", 6762 RenderType = RenderType.Column 6763 } 6764 }; 6765 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 6766 } 6767 6768 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 6769 { 6770 Block masterFooterColumnThree = new Block 6771 { 6772 Id = "MasterFooterColumnThree", 6773 SortId = 30, 6774 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 6775 Design = new Design 6776 { 6777 Size = "auto", 6778 RenderType = RenderType.Column 6779 } 6780 }; 6781 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 6782 } 6783 6784 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 6785 { 6786 Block masterFooterNewsletterSignUp = new Block 6787 { 6788 Id = "MasterFooterNewsletterSignUp", 6789 SortId = 40, 6790 Template = RenderFooterNewsletterSignUp(), 6791 Design = new Design 6792 { 6793 Size = "auto", 6794 RenderType = RenderType.Column 6795 } 6796 }; 6797 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 6798 } 6799 6800 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 6801 { 6802 Block masterFooterSocialLinks = new Block 6803 { 6804 Id = "MasterFooterSocialLinks", 6805 SortId = 50, 6806 Template = RenderFooterSocialLinks(), 6807 Design = new Design 6808 { 6809 Size = "auto", 6810 RenderType = RenderType.Column 6811 } 6812 }; 6813 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 6814 } 6815 6816 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 6817 { 6818 Block masterFooterPayments = new Block 6819 { 6820 Id = "MasterFooterPayments", 6821 SortId = 60, 6822 Template = RenderFooterPayments(), 6823 Design = new Design 6824 { 6825 Size = "12", 6826 RenderType = RenderType.Column 6827 } 6828 }; 6829 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 6830 } 6831 6832 Block masterFooterCopyright = new Block 6833 { 6834 Id = "MasterFooterCopyright", 6835 SortId = 70, 6836 Template = RenderFooterCopyright(), 6837 Design = new Design 6838 { 6839 Size = "12", 6840 RenderType = RenderType.Column 6841 } 6842 }; 6843 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 6844 } 6845 6846 @helper RenderFooter() 6847 { 6848 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 6849 6850 <footer class="footer no-print dw-mod"> 6851 <div class="center-container top-container__center-container dw-mod"> 6852 <div class="grid grid--external-bleed-x"> 6853 @RenderBlockList(subBlocks) 6854 </div> 6855 </div> 6856 </footer> 6857 } 6858 6859 @helper RenderFooterColumn(string header, string content) 6860 { 6861 <h3 class="footer__heading dw-mod">@header</h3> 6862 <div class="footer__content dw-mod"> 6863 @content 6864 </div> 6865 } 6866 6867 @helper RenderFooterNewsletterSignUp() 6868 { 6869 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 6870 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 6871 6872 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 6873 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 6874 form.Add(new TextField { 6875 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 6876 Type = TextFieldType.Email, 6877 ActionButton = new Button { 6878 ButtonType = ButtonType.Submit, Id="Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 6879 } 6880 }); 6881 6882 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 6883 <div class="footer__content dw-mod"> 6884 @Render(form) 6885 </div> 6886 } 6887 6888 @helper RenderFooterSocialLinks() 6889 { 6890 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 6891 <div class="footer__content dw-mod"> 6892 <div class="collection dw-mod"> 6893 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 6894 { 6895 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 6896 string socialIconClass = socialIcon.SelectedValue; 6897 string socialIconTitle = socialIcon.SelectedName; 6898 string socialLink = socialitem.GetString("Link"); 6899 6900 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a> 6901 } 6902 </div> 6903 </div> 6904 } 6905 6906 @helper RenderFooterPayments() 6907 { 6908 <div class="footer__content dw-mod"> 6909 <div class="collection dw-mod"> 6910 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 6911 { 6912 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 6913 string paymentImage = null; 6914 string paymentTitle = paymentItem.SelectedName; 6915 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 6916 if (selected != null) 6917 { 6918 paymentImage = selected.Icon; 6919 } 6920 6921 <div class="footer__card-type"> 6922 <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" /> 6923 </div> 6924 } 6925 </div> 6926 </div> 6927 } 6928 6929 @helper RenderFooterCopyright() 6930 { 6931 <div class="grid__col-12 footer__copyright dw-mod"> 6932 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 6933 </div> 6934 } 6935 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 6936 6937 @using System 6938 @using System.Web 6939 @using System.Collections.Generic 6940 @using Dynamicweb.Rapido.Blocks.Extensibility 6941 @using Dynamicweb.Rapido.Blocks 6942 @using Dynamicweb.Ecommerce.Common 6943 6944 @{ 6945 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 6946 6947 Block masterScriptReferences = new Block() 6948 { 6949 Id = "MasterScriptReferences", 6950 SortId = 1, 6951 Template = RenderMasterScriptReferences() 6952 }; 6953 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 6954 } 6955 6956 @helper RenderMasterScriptReferences() { 6957 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"></script> 6958 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script> 6959 6960 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 6961 { 6962 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script> 6963 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js"); 6964 } 6965 6966 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 6967 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js"); 6968 } 6969 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6970 6971 @using System 6972 @using System.Web 6973 @using System.Collections.Generic 6974 @using Dynamicweb.Rapido.Blocks.Extensibility 6975 @using Dynamicweb.Rapido.Blocks 6976 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 6977 @using Dynamicweb.Rapido.Services 6978 6979 @{ 6980 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 6981 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 6982 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 6983 6984 if (!navigationItemsHideSearch || isFavoriteList) 6985 { 6986 Block masterSearchScriptTemplates = new Block() 6987 { 6988 Id = "MasterSearchScriptTemplates", 6989 SortId = 1, 6990 Template = RenderSearchScriptTemplates() 6991 }; 6992 6993 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 6994 } 6995 } 6996 6997 @helper RenderSearchScriptTemplates() 6998 { 6999 string stockcheckpageId = Convert.ToString(GetPageIdByNavigationTag("StockCheck")); 7000 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 7001 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 7002 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 7003 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 7004 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 7005 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 7006 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 7007 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 7008 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7009 7010 <script id="SearchGroupsTemplate" type="text/x-template"> 7011 {{#.}} 7012 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 7013 {{/.}} 7014 </script> 7015 7016 <script id="SearchProductsTemplate" type="text/x-template"> 7017 {{#each .}} 7018 {{#Product}} 7019 {{#ifCond template "!==" "SearchMore"}} 7020 <li class="dropdown__item dropdown__item--seperator dw-mod"> 7021 @if (useFacebookPixel) 7022 { 7023 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 7024 } 7025 @if (useGoogleTagManager) 7026 { 7027 <text>{{{googleEnchantImpression googleImpression}}}</text> 7028 } 7029 <div> 7030 <a href="{{link}}" 7031 class="js-typeahead-link u-color-inherit u-pull--left" 7032 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 7033 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 7034 <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> 7035 <div class="u-pull--left"> 7036 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}{{#if variantName}}, {{variantName}}{{/if}}</div> 7037 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-number">{{number}}</div> 7038 @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 7039 { 7040 if (pointShopOnly) 7041 { 7042 <text> 7043 {{#if havePointPrice}} 7044 <div> 7045 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 7046 </div> 7047 {{else}} 7048 <small class="help-text u-no-margin">@Translate("Not available")</small> 7049 {{/if}} 7050 {{#unless canBePurchasedWithPoints}} 7051 {{#if havePointPrice}} 7052 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 7053 {{/if}} 7054 {{/unless}} 7055 </text> 7056 } 7057 else 7058 { 7059 <div>{{price}}</div> 7060 } 7061 } 7062 </div> 7063 </a> 7064 <div class="u-margin-left u-pull--right"> 7065 @{ 7066 var viewBtn = new Link 7067 { 7068 Href = "{{link}}", 7069 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 7070 ButtonLayout = ButtonLayout.Secondary, 7071 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside", 7072 Title = Translate("View") 7073 }; 7074 } 7075 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7076 { 7077 <text>{{#if hideAddToCartButton}}</text> 7078 @Render(viewBtn) 7079 <text>{{else}}</text> 7080 7081 <button class="addToCartBeforeCheck {{outOfStock}} u-w80px u-no-margin js-ignore-click-outside btn btn--primary dw-mod btn btn--primary dw-mod" onclick="CheckQuantitySearch('{{productId}}', '{{parentproductID}}', this)" type="button"> 7082 <i class="customicon fal fa-shopping-bag fal fa-shopping-bag u-flex--align-center u-flex--align-center"></i> 7083 </button> 7084 @Render(new AddToCartButton 7085 { 7086 HideTitle = true, 7087 ProductId = "{{productId}}", 7088 VariantId = "{{variantid}}", 7089 ProductInfo = "{{productInfo}}", 7090 UnitId = "{{unitId}}", 7091 BuyForPoints = pointShopOnly, 7092 OnClick = "{{facebookPixelAction}}", 7093 CssClass = "addToCartAfterCheck u-hidden u-w80px u-no-margin js-ignore-click-outside {{outOfStock}}", 7094 Icon = new Icon 7095 { 7096 CssClass = "u-hidden js-ignore-click-outside" 7097 }, 7098 ExtraAttributes = new Dictionary<string, string> 7099 { 7100 { "id", "searchId_{{productId}}" }, // Dynamically set the id attribute 7101 { "{{disabledBuyButton}}", "" } 7102 } 7103 }) 7104 7105 <text>{{/if}}</text> 7106 } 7107 else if (showViewButton) 7108 { 7109 @Render(viewBtn) 7110 } 7111 @if (showAddToDownloadButton) 7112 { 7113 <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}}"> 7114 <i class="fas fa-plus js-button-icon"></i> 7115 </button> 7116 } 7117 </div> 7118 </div> 7119 </li> 7120 {{/ifCond}} 7121 {{#ifCond template "===" "SearchMore"}} 7122 {{>SearchMoreProducts}} 7123 {{/ifCond}} 7124 {{/Product}} 7125 {{else}} 7126 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7127 @Translate("Your search gave 0 results") 7128 </li> 7129 {{/each}} 7130 </script> 7131 7132 <script id="SearchMoreProducts" type="text/x-template"> 7133 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7134 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7135 @Translate("View all") 7136 </a> 7137 </li> 7138 </script> 7139 7140 <script id="SearchMorePages" type="text/x-template"> 7141 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 7142 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 7143 @Translate("View all") 7144 </a> 7145 </li> 7146 </script> 7147 7148 <script id="SearchPagesTemplate" type="text/x-template"> 7149 {{#each .}} 7150 {{#ifCond template "!==" "SearchMore"}} 7151 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 7152 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 7153 <div class="u-margin-right u-inline"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 7154 <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> 7155 </a> 7156 </li> 7157 {{/ifCond}} 7158 {{#ifCond template "===" "SearchMore"}} 7159 {{>SearchMorePages}} 7160 {{/ifCond}} 7161 {{else}} 7162 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 7163 @Translate("Your search gave 0 results") 7164 </li> 7165 {{/each}} 7166 </script> 7167 7168 <script id="SearchPagesTemplateWrap" type="text/x-template"> 7169 <div class="dropdown__column-header">@Translate("Pages")</div> 7170 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7171 {{>SearchPagesTemplate}} 7172 </ul> 7173 </script> 7174 7175 <script id="SearchProductsTemplateWrap" type="text/x-template"> 7176 <div class="dropdown__column-header">@Translate("Products")</div> 7177 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 7178 {{>SearchProductsTemplate}} 7179 </ul> 7180 </script> 7181 <input type="checkbox" id="StockErrorTrigger" class="modal-trigger"> 7182 <div class="modal-container"> 7183 <label for="StockErrorTrigger" id="StockErrorOverlay" class="modal-overlay"></label> 7184 <div class="modal modal--sm modal-height--auto" id="StockError" style="max-height: unset !important; width: 330px; position: relative; border-radius: 10px; border: 1px solid; background-color: #FFFFFF; padding: 20px 5px 20px 5px;"> 7185 7186 <!-- Close Button --> 7187 <!-- Icon at the top --> 7188 <div style="text-align: center; margin-top: 20px;"> 7189 <div style="width: 45px; height: 45px; background-color: #BF0000; border-radius: 50%; display: flex; justify-content: center; align-items: center; margin: 0 auto;"> 7190 <span style="font-size: 31px; color: white; font-weight: bold;">!</span> 7191 </div> 7192 </div> 7193 7194 <!-- Error message --> 7195 <div class="modal__body" style="text-align: center;"> 7196 <span style="font-size: 16px;">Oops! We don’t have enough in stock for that quantity.</span> 7197 </div> 7198 7199 <!-- OK Button --> 7200 <div style="display: flex; justify-content: center; align-items: center; margin-top: 20px;"> 7201 <label for="StockErrorTrigger" style="width: 120px; background-color: #000; color: white; border: none; border-radius: 5px; padding: 7px 20px; font-family: Arial, sans-serif; cursor: pointer; text-align: center;">OK</label> 7202 </div> 7203 7204 </div> 7205 </div> 7206 <script src="/Files/Templates/Designs/Rapido/js/jquery-3.6.1.min.js"></script> 7207 <script> 7208 function CheckQuantitySearch(productId, parentproductId, searchbutton) { 7209 7210 if (!productId) { 7211 console.error("Invalid productId:", productId); 7212 return; 7213 } 7214 7215 const buttonId = `searchId_${productId}`; 7216 const button = document.getElementById(buttonId); 7217 7218 if (!button) { 7219 console.error("Button with ID " + buttonId + " not found."); 7220 return; 7221 } 7222 7223 const icon = searchbutton.querySelector("i"); 7224 if (icon) { 7225 icon.classList.remove("fa-shopping-bag"); 7226 icon.classList.add("fa-circle-notch", "fa-spin"); 7227 } 7228 7229 var url = "/Default.aspx?ID=7487&searchproductId=" + encodeURIComponent(productId) + 7230 "&searchparentproductId=" + encodeURIComponent(parentproductId); 7231 7232 $.ajax({ 7233 url: url, 7234 method: 'GET', 7235 dataType: 'json', 7236 success: function(response) { 7237 if (response.success) { 7238 const addToCartButton = document.getElementById(buttonId); 7239 if (addToCartButton) { 7240 addToCartButton.click(); 7241 } 7242 } else { 7243 document.getElementById("StockErrorTrigger").checked = true; 7244 document.getElementById("closeModal").style.display = "flex"; 7245 } 7246 }, 7247 error: function(xhr, status, error) { 7248 console.error("Error fetching data:", error); 7249 } 7250 }); 7251 7252 setTimeout(() => { 7253 if (icon) { 7254 icon.classList.remove("fa-circle-notch", "fa-spin"); 7255 icon.classList.add("fa-shopping-bag"); 7256 } 7257 }, 1000); 7258 } 7259 7260 </script> 7261 7262 } 7263 7264 @using Dynamicweb.Rapido.Blocks.Components 7265 @using Dynamicweb.Rapido.Blocks.Components.General 7266 @using Dynamicweb.Rapido.Blocks 7267 @using System.IO 7268 7269 7270 @using Dynamicweb.Rapido.Blocks.Components.General 7271 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7272 7273 7274 @* Component *@ 7275 7276 @helper RenderVariantMatrix(VariantMatrix settings) { 7277 if (settings != null) 7278 { 7279 int productLoopCounter = 0; 7280 int groupCount = 0; 7281 List<VariantOption> firstDimension = new List<VariantOption>(); 7282 List<VariantOption> secondDimension = new List<VariantOption>(); 7283 List<VariantOption> thirdDimension = new List<VariantOption>(); 7284 7285 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 7286 { 7287 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 7288 { 7289 if (groupCount == 0) { 7290 firstDimension.Add(variantOptions); 7291 } 7292 if (groupCount == 1) 7293 { 7294 secondDimension.Add(variantOptions); 7295 } 7296 if (groupCount == 2) 7297 { 7298 thirdDimension.Add(variantOptions); 7299 } 7300 } 7301 groupCount++; 7302 } 7303 7304 int rowCount = 0; 7305 int columnCount = 0; 7306 7307 <script> 7308 var variantsCollection = []; 7309 </script> 7310 7311 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 7312 @if (groupCount == 1) 7313 { 7314 <tbody> 7315 @foreach (VariantOption firstVariantOption in firstDimension) 7316 { 7317 var variantId = firstVariantOption.Id; 7318 <tr> 7319 <td class="u-bold"> 7320 @firstVariantOption.Name 7321 </td> 7322 <td> 7323 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7324 </td> 7325 </tr> 7326 productLoopCounter++; 7327 } 7328 7329 <tr> 7330 <td>&nbsp;</td> 7331 <td> 7332 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7333 </td> 7334 </tr> 7335 </tbody> 7336 } 7337 @if (groupCount == 2) 7338 { 7339 <thead> 7340 <tr> 7341 <td>&nbsp;</td> 7342 @foreach (VariantOption variant in secondDimension) 7343 { 7344 <td>@variant.Name</td> 7345 } 7346 </tr> 7347 </thead> 7348 <tbody> 7349 @foreach (VariantOption firstVariantOption in firstDimension) 7350 { 7351 string variantId = ""; 7352 columnCount = 0; 7353 7354 <tr> 7355 <td class="u-min-w120px">@firstVariantOption.Name</td> 7356 7357 @foreach (VariantOption secondVariantOption in secondDimension) 7358 { 7359 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 7360 <td> 7361 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7362 </td> 7363 7364 columnCount++; 7365 7366 productLoopCounter++; 7367 } 7368 7369 <td> 7370 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7371 </td> 7372 </tr> 7373 7374 rowCount++; 7375 } 7376 7377 @{ 7378 columnCount = 0; 7379 } 7380 7381 <tr> 7382 <td>&nbsp;</td> 7383 @foreach (VariantOption secondVariantOption in secondDimension) 7384 { 7385 <td> 7386 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7387 </td> 7388 7389 columnCount++; 7390 } 7391 <td>&nbsp;</td> 7392 </tr> 7393 </tbody> 7394 } 7395 @if (groupCount == 3) 7396 { 7397 <thead> 7398 <tr> 7399 <td>&nbsp;</td> 7400 @foreach (VariantOption thirdVariantOption in thirdDimension) 7401 { 7402 <td>@thirdVariantOption.Name</td> 7403 } 7404 </tr> 7405 </thead> 7406 <tbody> 7407 @foreach (VariantOption firstVariantOption in firstDimension) 7408 { 7409 int colspan = (thirdDimension.Count + 1); 7410 7411 <tr> 7412 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 7413 </tr> 7414 7415 foreach (VariantOption secondVariantOption in secondDimension) 7416 { 7417 string variantId = ""; 7418 columnCount = 0; 7419 7420 <tr> 7421 <td class="u-min-w120px">@secondVariantOption.Name</td> 7422 7423 @foreach (VariantOption thirdVariantOption in thirdDimension) 7424 { 7425 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 7426 7427 <td> 7428 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 7429 </td> 7430 7431 columnCount++; 7432 productLoopCounter++; 7433 } 7434 7435 <td> 7436 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 7437 </td> 7438 </tr> 7439 rowCount++; 7440 } 7441 } 7442 7443 @{ 7444 columnCount = 0; 7445 } 7446 7447 <tr> 7448 <td>&nbsp;</td> 7449 @foreach (VariantOption thirdVariantOption in thirdDimension) 7450 { 7451 <td> 7452 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 7453 </td> 7454 7455 columnCount++; 7456 } 7457 <td>&nbsp;</td> 7458 </tr> 7459 </tbody> 7460 } 7461 </table> 7462 7463 <script> 7464 document.addEventListener("DOMContentLoaded", function (event) { 7465 MatrixUpdateQuantity("@settings.ProductId"); 7466 }); 7467 7468 MatrixUpdateQuantity = function (productId) { 7469 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 7470 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 7471 7472 var qtyRowArr = []; 7473 var qtyColumnArr = []; 7474 7475 var totalQty = 0; 7476 7477 for (var i = 0; i < allQtyFields.length; i++) { 7478 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 7479 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 7480 } 7481 7482 for (var i = 0; i < allQtyFields.length; i++) { 7483 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 7484 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 7485 totalQty += parseFloat(allQtyFields[i].value); 7486 } 7487 7488 //Update row counters 7489 for (var i = 0; i < qtyRowArr.length; i++) { 7490 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7491 7492 if (qtyRowArr[i] != undefined && qtyCounter != null) { 7493 var currentCount = qtyCounter.innerHTML; 7494 qtyCounter.innerHTML = qtyRowArr[i]; 7495 7496 if (currentCount != qtyCounter.innerHTML) { 7497 qtyCounter.classList.add("qty-field--active"); 7498 } 7499 } 7500 7501 } 7502 7503 //Update column counters 7504 for (var i = 0; i < qtyColumnArr.length; i++) { 7505 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7506 7507 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 7508 var currentCount = qtyCounter.innerHTML; 7509 qtyCounter.innerHTML = qtyColumnArr[i]; 7510 7511 if (currentCount != qtyCounter.innerHTML) { 7512 qtyCounter.classList.add("qty-field--active"); 7513 } 7514 } 7515 } 7516 7517 if (document.getElementById("TotalQtyCount_" + productId)) { 7518 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 7519 } 7520 7521 //Clean up animations 7522 setTimeout(function () { 7523 for (var i = 0; i < qtyRowArr.length; i++) { 7524 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 7525 if (qtyCounter != null) { 7526 qtyCounter.classList.remove("qty-field--active"); 7527 } 7528 } 7529 for (var i = 0; i < qtyColumnArr.length; i++) { 7530 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 7531 if (qtyCounter != null) { 7532 qtyCounter.classList.remove("qty-field--active"); 7533 } 7534 } 7535 }, 1000); 7536 } 7537 </script> 7538 } 7539 } 7540 7541 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 7542 { 7543 string loopCount = productLoopCounter.ToString(); 7544 7545 bool combinationFound = false; 7546 double stock = 0; 7547 double quantityValue = 0; 7548 string note = ""; 7549 7550 VariantProduct variantProduct = null; 7551 7552 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 7553 { 7554 stock = variantProduct.Stock; 7555 quantityValue = variantProduct.Quantity; 7556 combinationFound = true; 7557 } 7558 7559 if (combinationFound) 7560 { 7561 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 7562 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 7563 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 7564 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 7565 <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"> 7566 7567 if (stock != 0) 7568 { 7569 <small>@Translate("Stock") @stock</small> 7570 } 7571 7572 <script> 7573 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 7574 variantsCollection.push(variants); 7575 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 7576 </script> 7577 } 7578 else 7579 { 7580 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 7581 } 7582 } 7583 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7584 7585 @* Component *@ 7586 7587 @helper RenderAddToCart(AddToCart settings) 7588 { 7589 //set Id for quantity selector to get it's value from button 7590 if (settings.QuantitySelector != null) 7591 { 7592 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 7593 { 7594 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 7595 } 7596 7597 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 7598 7599 if (settings.Disabled) 7600 { 7601 settings.QuantitySelector.Disabled = true; 7602 } 7603 7604 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 7605 { 7606 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 7607 } 7608 } 7609 7610 if (settings.Disabled) 7611 { 7612 settings.AddButton.Disabled = true; 7613 } 7614 7615 settings.AddButton.CssClass += " btn--condensed"; 7616 7617 //unitsSelector 7618 if (settings.UnitSelector != null) 7619 { 7620 if (settings.Disabled) 7621 { 7622 settings.QuantitySelector.Disabled = true; 7623 } 7624 } 7625 7626 if (Pageview.Device.ToString() == "Mobile") { 7627 if (settings.UnitSelector != null) 7628 { 7629 <div class="margin-sm margin-position-bottom"> 7630 @Render(settings.UnitSelector) 7631 </div> 7632 } 7633 } 7634 7635 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7636 @if (Pageview.Device.ToString() != "Mobile") { 7637 if (settings.UnitSelector != null) 7638 { 7639 @Render(settings.UnitSelector) 7640 } 7641 } 7642 @if (settings.QuantitySelector != null) 7643 { 7644 @Render(settings.QuantitySelector) 7645 } 7646 @Render(settings.AddButton) 7647 </div> 7648 } 7649 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7650 7651 @* Component *@ 7652 7653 @helper RenderAddToCartButton(AddToCartButton settings) 7654 { 7655 if (!settings.HideTitle) 7656 { 7657 if (string.IsNullOrEmpty(settings.Title)) 7658 { 7659 if (settings.BuyForPoints) 7660 { 7661 settings.Title = Translate("Buy with points"); 7662 } 7663 else 7664 { 7665 settings.Title = Translate("Add to cart"); 7666 } 7667 } 7668 } 7669 else 7670 { 7671 settings.Title = ""; 7672 } 7673 7674 if (settings.Icon == null) 7675 { 7676 settings.Icon = new Icon(); 7677 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 7678 } 7679 7680 if (string.IsNullOrEmpty(settings.Icon.Name)) 7681 { 7682 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 7683 } 7684 7685 settings.OnClick = "Cart.AddToCart(event, { " + 7686 "id: '" + settings.ProductId + "'," + 7687 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 7688 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 7689 (settings.BuyForPoints ? "buyForPoints: true," : "") + 7690 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 7691 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 7692 "});" + settings.OnClick; 7693 7694 @RenderButton(settings) 7695 } 7696 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7697 7698 @* Component *@ 7699 7700 @helper RenderUnitSelector(UnitSelector settings) 7701 { 7702 if (string.IsNullOrEmpty(settings.Id)) 7703 { 7704 settings.Id = Guid.NewGuid().ToString("N"); 7705 } 7706 var disabledClass = settings.Disabled ? "disabled" : ""; 7707 7708 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 7709 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 7710 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 7711 <div class="dropdown__content dw-mod"> 7712 @settings.OptionsContent 7713 </div> 7714 <label class="dropdown-trigger-off" for="@settings.Id"></label> 7715 </div> 7716 } 7717 @using System.Reflection 7718 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7719 7720 @* Component *@ 7721 7722 @helper RenderQuantitySelector(QuantitySelector settings) 7723 { 7724 var attributes = new Dictionary<string, string>(); 7725 7726 /*base settings*/ 7727 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 7728 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 7729 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 7730 if (settings.Disabled) { attributes.Add("disabled", "true"); } 7731 if (settings.Required) { attributes.Add("required", "true"); } 7732 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 7733 /*end*/ 7734 7735 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 7736 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 7737 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 7738 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 7739 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 7740 if (settings.Min == null) { settings.Min = 1; } 7741 attributes.Add("min", settings.Min.ToString()); 7742 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 7743 if (settings.Value == null) { settings.Value = 1; } 7744 attributes.Add("value", settings.Value.ToString()); 7745 attributes.Add("type", "number"); 7746 7747 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7748 7749 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 7750 } 7751 @using Dynamicweb.Rapido.Blocks.Components 7752 7753 @using Dynamicweb.Frontend 7754 @using Dynamicweb.Frontend.Devices 7755 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7756 @using Dynamicweb.Rapido.Blocks.Components.General 7757 @using System.Collections.Generic; 7758 7759 @* Component *@ 7760 7761 @helper RenderCustomerCenterList(CustomerCenterList settings) 7762 { 7763 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 7764 string hideActions = isTouchDevice ? "u-block" : ""; 7765 7766 <table class="table data-list dw-mod"> 7767 @if (settings.GetHeaders().Length > 0) { 7768 <thead> 7769 <tr class="u-bold"> 7770 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 7771 { 7772 var attributes = new Dictionary<string, string>(); 7773 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 7774 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 7775 attributes.Add("align", header.Align.ToString()); 7776 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7777 7778 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 7779 } 7780 </tr> 7781 </thead> 7782 } 7783 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 7784 { 7785 int columnCount = 0; 7786 int totalColumns = listItem.GetInfoItems().Length; 7787 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 7788 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 7789 7790 var attributes = new Dictionary<string, string>(); 7791 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 7792 7793 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7794 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 7795 <tr> 7796 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 7797 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 7798 7799 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 7800 @if (!string.IsNullOrEmpty(listItem.Title)) { 7801 <div class="u-bold">@listItem.Title</div> 7802 } 7803 @if (!string.IsNullOrEmpty(listItem.Description)) { 7804 <div>@listItem.Description</div> 7805 } 7806 </td> 7807 } 7808 7809 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 7810 { 7811 var infoAttributes = new Dictionary<string, string>(); 7812 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 7813 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 7814 infoAttributes.Add("align", infoItem.Align.ToString()); 7815 7816 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 7817 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 7818 7819 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 7820 @if (!string.IsNullOrEmpty(infoItem.Title)) { 7821 <div>@infoItem.Title</div> 7822 } 7823 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 7824 <div><small>@infoItem.Subtitle</small></div> 7825 } 7826 </td> 7827 7828 columnCount++; 7829 } 7830 </tr> 7831 <tr> 7832 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 7833 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 7834 @foreach (ButtonBase action in listItem.GetActions()) 7835 { 7836 action.ButtonLayout = ButtonLayout.LinkClean; 7837 action.Icon.CssClass += " u-full-height"; 7838 action.CssClass += " data-list__action-button link"; 7839 7840 @Render(action) 7841 } 7842 </div> 7843 </td> 7844 </tr> 7845 </tbody> 7846 } 7847 </table> 7848 } 7849 7850 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7851 7852 @using System 7853 @using System.Web 7854 @using System.Collections.Generic 7855 @using Dynamicweb.Rapido.Blocks.Extensibility 7856 @using Dynamicweb.Rapido.Blocks 7857 7858 @{ 7859 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 7860 7861 Block primaryBottomSnippets = new Block() 7862 { 7863 Id = "MasterJavascriptInitializers", 7864 SortId = 100, 7865 Template = RenderPrimaryBottomSnippets() 7866 }; 7867 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 7868 7869 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 7870 { 7871 Block miniCartPageId = new Block 7872 { 7873 Id = "MiniCartPageId", 7874 Template = RenderMiniCartPageId() 7875 }; 7876 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, miniCartPageId); 7877 } 7878 } 7879 7880 @helper RenderPrimaryBottomSnippets() 7881 { 7882 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 7883 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7884 7885 if (isWireframeMode) 7886 { 7887 <script> 7888 Wireframe.Init(true); 7889 </script> 7890 } 7891 7892 7893 if (useGoogleTagManager) 7894 { 7895 <script> 7896 document.addEventListener('addToCart', function(event) { 7897 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 7898 if (typeof googleImpression == "string") { 7899 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 7900 } 7901 dataLayer.push({ 7902 'event': 'addToCart', 7903 'ecommerce': { 7904 'currencyCode': googleImpression.currency, 7905 'add': { 7906 'products': [{ 7907 'name': googleImpression.name, 7908 'id': googleImpression.id, 7909 'price': googleImpression.price, 7910 'brand': googleImpression.brand, 7911 'category': googleImpression.category, 7912 'variant': googleImpression.variant, 7913 'quantity': event.detail.quantity 7914 }] 7915 } 7916 } 7917 }); 7918 }); 7919 </script> 7920 } 7921 7922 //if digitalwarehouse 7923 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 7924 { 7925 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 7926 7927 if (string.IsNullOrEmpty(cartContextId)) 7928 { 7929 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 7930 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 7931 cartContextId = cartSettings.OrderContextID; 7932 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 7933 } 7934 7935 <script> 7936 let downloadCart = new DownloadCart({ 7937 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 7938 contextId: "@cartContextId", 7939 addButtonText: "@Translate("Add")", 7940 removeButtonText: "@Translate("Remove")" 7941 }); 7942 </script> 7943 } 7944 7945 <!--$$Javascripts--> 7946 } 7947 7948 @helper RenderMiniCartPageId() 7949 { 7950 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7951 <script> 7952 window.cartId = "@miniCartFeedPageId"; 7953 </script> 7954 } 7955 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7956 7957 @using System 7958 @using System.Web 7959 @using System.Collections.Generic 7960 @using Dynamicweb.Rapido.Blocks 7961 7962 @{ 7963 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 7964 7965 } 7966 7967 7968 @functions { 7969 public class ManifestIcon 7970 { 7971 public string src { get; set; } 7972 public string type { get; set; } 7973 public string sizes { get; set; } 7974 } 7975 7976 public class Manifest 7977 { 7978 public string name { get; set; } 7979 public string short_name { get; set; } 7980 public string start_url { get; set; } 7981 public string display { get; set; } 7982 public string background_color { get; set; } 7983 public string theme_color { get; set; } 7984 public List<ManifestIcon> icons { get; set; } 7985 } 7986 } 7987 7988 <!DOCTYPE html> 7989 7990 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 7991 7992 7993 7994 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 7995 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 7996 7997 7998 7999 @helper RenderMasterHead() { 8000 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 8001 8002 <head> 8003 <!-- Rapido version 3.4.3 --> 8004 8005 @RenderBlockList(subBlocks) 8006 </head> 8007 } 8008 8009 @helper RenderMasterMetadata() { 8010 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 8011 var brandColors = swatches.GetColorSwatch(1); 8012 string brandColorOne = brandColors.Palette["BrandColor1"]; 8013 8014 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 8015 Manifest manifest = new Manifest 8016 { 8017 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 8018 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"), 8019 start_url = "/", 8020 display = "standalone", 8021 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 8022 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 8023 }; 8024 8025 manifest.icons = new List<ManifestIcon> { 8026 new ManifestIcon { 8027 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8028 sizes = "192x192", 8029 type = "image/png" 8030 }, 8031 new ManifestIcon { 8032 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8033 sizes = "512x512", 8034 type = "image/png" 8035 }, 8036 new ManifestIcon { 8037 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 8038 sizes = "1024x1024", 8039 type = "image/png" 8040 } 8041 }; 8042 8043 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 8044 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 8045 string currentManifest = File.ReadAllText(manifestFilePath); 8046 8047 if (manifestJSON != currentManifest) 8048 { 8049 File.WriteAllText(manifestFilePath, manifestJSON); 8050 } 8051 } 8052 8053 <meta charset="utf-8" /> 8054 <title>@Model.Title</title> 8055 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8056 <meta name="robots" content="index, follow"> 8057 <meta name="theme-color" content="@brandColorOne" /> 8058 8059 if (Model.MetaTags != null && !Model.MetaTags.Contains("og:image") && Model.PropertyItem != null && Model.PropertyItem.GetFile("OpenGraphImage") != null) 8060 { 8061 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"))); 8062 } 8063 8064 if (!Model.MetaTags.Contains("og:description") && !string.IsNullOrEmpty(Model.Description)) 8065 { 8066 Pageview.Meta.AddTag("og:description", Model.Description); 8067 } 8068 8069 Pageview.Meta.AddTag("og:title", Model.Title); 8070 Pageview.Meta.AddTag("og:site_name", Model.Name); 8071 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 8072 Pageview.Meta.AddTag("og:type", "Website"); 8073 8074 if (!string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"))) { 8075 Pageview.Meta.AddTag("fb:app_id", Model.Area.Item.GetItem("Settings").GetString("FacebookAppID")); 8076 } 8077 8078 @Model.MetaTags 8079 } 8080 8081 @helper RenderMasterCss() { 8082 var fonts = new string[] { 8083 getFontFamily("Layout", "HeaderFont"), 8084 getFontFamily("Layout", "SubheaderFont"), 8085 getFontFamily("Layout", "TertiaryHeaderFont"), 8086 getFontFamily("Layout", "BodyText"), 8087 getFontFamily("Layout", "Header", "ToolsFont"), 8088 getFontFamily("Layout", "Header", "NavigationFont"), 8089 getFontFamily("Layout", "MobileNavigation", "Font"), 8090 getFontFamily("ProductList", "Facets", "HeaderFont"), 8091 getFontFamily("ProductPage", "PriceFontDesign"), 8092 getFontFamily("Ecommerce", "SaleSticker", "Font"), 8093 getFontFamily("Ecommerce", "NewSticker", "Font"), 8094 getFontFamily("Ecommerce", "CustomSticker", "Font") 8095 }; 8096 8097 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 8098 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 8099 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 8100 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 8101 if (useFontAwesomePro) 8102 { 8103 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 8104 } 8105 8106 //Favicon 8107 <link href="@favicon" rel="icon" type="image/png"> 8108 8109 //Base (Default, wireframe) styles 8110 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 8111 8112 //Rapido Css from Website Settings 8113 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 8114 8115 //Ignite Css (Custom site specific styles) 8116 <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=1.1"> 8117 8118 //Font awesome 8119 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 8120 8121 //Flag icon 8122 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 8123 8124 //Google fonts 8125 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))); 8126 8127 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 8128 8129 PushPromise(favicon); 8130 PushPromise(fontAwesomeCssLink); 8131 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 8132 PushPromise(autoCssLink); 8133 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 8134 PushPromise("/Files/Images/placeholder.gif"); 8135 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 8136 } 8137 8138 @helper RenderMasterManifest() { 8139 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 8140 { 8141 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 8142 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 8143 } 8144 } 8145 8146 @helper RenderMasterBody() { 8147 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 8148 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 8149 if (!String.IsNullOrEmpty(designLayout)) { 8150 designLayout = "class=\"" + designLayout + "\""; 8151 } 8152 8153 <body @designLayout> 8154 @RenderBlockList(subBlocks) 8155 </body> 8156 } 8157 8158 @helper RenderMasterHeader() 8159 { 8160 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 8161 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8162 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 8163 8164 <header class="top-container @stickyTop no-print dw-mod" id="Top"> 8165 @RenderBlockList(subBlocks) 8166 </header> 8167 } 8168 8169 @helper RenderMain() 8170 { 8171 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 8172 8173 <main class="site dw-mod"> 8174 @RenderBlockList(subBlocks) 8175 </main> 8176 } 8177 8178 @helper RenderPageContent() 8179 { 8180 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 8181 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 8182 8183 <div id="Page" class="page @pagePos"> 8184 <div id="content"> 8185 @RenderSnippet("Content") 8186 </div> 8187 </div> 8188 <div id="UserDeactivateMsg" class="userdeactivate-alert" style="display:none;"> 8189 <div class="userdeactivate-alert__content"> 8190 <div class="userdeactivate-alert__body"> 8191 <div class="userdeactivate-alert__text"> 8192 <div>@Model.Area.Item.GetItem("Custom").GetString("Amardeep_Signout_Message")</div> 8193 </div> 8194 <button class="userdeactivate-alert__btn" onclick="CloseUserDeactivateAlert();">OK</button> 8195 </div> 8196 </div> 8197 </div> 8198 } 8199 8200 @* Hack to support nested helpers *@ 8201 @SnippetStart("Content") 8202 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8203 8204 8205 8206 @* Render the grid *@ 8207 @Model.Grid("Grid", "Grid", "default:true;sort:1", "Pages") 8208 8209 8210 8211 @SnippetEnd("Content") 8212 8213 @helper RenderIosTabletFix() { 8214 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 8215 { 8216 <script> 8217 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 8218 if (isIpadIOS) { 8219 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 8220 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 8221 } 8222 </script> 8223 } 8224 } 8225 @{ 8226 Dynamicweb.Security.UserManagement.User dwuser=Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID); 8227 int frontPageId=GetPageIdByNavigationTag("Frontpage"); 8228 if (dwuser != null) 8229 { 8230 <script> 8231 var useractive="@dwuser.Active"; 8232 if(useractive=="False"){ 8233 document.getElementById("UserDeactivateMsg").style.display = "block"; 8234 } 8235 function CloseUserDeactivateAlert(){ 8236 document.getElementById("UserDeactivateMsg").style.display = "none"; 8237 window.location.href="/Admin/Public/ExtranetLogoff.aspx?ID=@frontPageId"; 8238 } 8239 </script> 8240 } 8241 8242 } 8243 </html> 8244 8245