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