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