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