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