Error executing template "Designs/Rapido/_parsed/NewsArticle.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_5eb287b247b9462b988a2d56f914b63e.Execute() in E:\Dynamicweb.net\Solutions\Dynamicweb\dw2019.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\NewsArticle.parsed.cshtml:line 5943
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
18 @functions {
19 BlocksPage masterPage = BlocksPage.GetBlockPage("Master");
20
21 string getFontFamily(params string[] items)
22 {
23 var itemParent = Pageview.AreaSettings;
24 foreach (var item in items)
25 {
26 itemParent = itemParent.GetItem(item);
27 if (itemParent == null)
28 {
29 return null;
30 }
31 }
32
33 var googleFont = itemParent.GetGoogleFont("FontFamily");
34 if (googleFont == null)
35 {
36 return null;
37 }
38 return googleFont.Family.Replace(" ", "+");
39 }
40 }
41
42 @{
43 //Font settings
44 var fonts = new string[] {
45 getFontFamily("Layout", "HeaderFont"),
46 getFontFamily("Layout", "SubheaderFont"),
47 getFontFamily("Layout", "TertiaryHeaderFont"),
48 getFontFamily("Layout", "Header", "ToolsFont"),
49 getFontFamily("Layout", "Header", "NavigationFont"),
50 getFontFamily("Layout", "MobileNavigation", "Font"),
51 getFontFamily("ProductList", "Facets", "HeaderFont"),
52 getFontFamily("ProductPage", "PriceFontDesign"),
53 getFontFamily("Ecommerce", "SaleSticker", "Font"),
54 getFontFamily("Ecommerce", "NewSticker", "Font"),
55 getFontFamily("Ecommerce", "CustomSticker", "Font")
56 };
57
58 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
59 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
60 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
61 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css";
62 if (useFontAwesomePro)
63 {
64 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css";
65 }
66 }
67
68 @{
69 Block master = new Block()
70 {
71 Id = "Master",
72 BlocksList = new List<Block> {
73 new Block {
74 Id = "MasterTopSnippets",
75 SortId = 10
76 },
77 new Block {
78 Id = "MasterMain",
79 SortId = 20,
80 Template = RenderMain(),
81 SkipRenderBlocksList = true,
82 BlocksList = new List<Block> {
83 new Block {
84 Id = "MasterHeader",
85 SortId = 10,
86 Template = RenderMasterHeader(),
87 SkipRenderBlocksList = true
88 },
89 new Block {
90 Id = "MasterPageContent",
91 SortId = 20,
92 Template = RenderPageContent()
93 }
94 }
95 },
96 new Block {
97 Id = "MasterFooter",
98 SortId = 30
99 },
100 new Block {
101 Id = "MasterReferences",
102 SortId = 40
103 },
104 new Block {
105 Id = "MasterBottomSnippets",
106 SortId = 50
107 }
108 }
109 };
110
111 masterPage.Add(master);
112 }
113
114 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@
115 @using System.Text.RegularExpressions
116 @using System.Collections.Generic
117 @using System.Reflection
118 @using System.Web.UI.HtmlControls
119 @using Dynamicweb.Rapido.Blocks.Components
120 @using Dynamicweb.Rapido.Blocks.Components.Articles
121 @using Dynamicweb.Rapido.Blocks.Components.Documentation
122 @using Dynamicweb.Rapido.Blocks
123
124
125 @*--- START: Base block renderers ---*@
126
127 @helper RenderBlockList(List<Block> blocks)
128 {
129 blocks = blocks.OrderBy(item => item.SortId).ToList();
130
131 foreach (Block item in blocks)
132 {
133 <!-- START: @item.Id -->
134
135 if (item.Design == null)
136 {
137 @RenderBlock(item)
138 }
139 else if (item.Design.RenderType == RenderType.None) {
140 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
141
142 <div class="@cssClass dw-mod">
143 @RenderBlock(item)
144 </div>
145 }
146 else if (item.Design.RenderType != RenderType.Hide)
147 {
148 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
149
150 if (!item.SkipRenderBlocksList) {
151 if (item.Design.RenderType == RenderType.Row)
152 {
153 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id">
154 @RenderBlock(item)
155 </div>
156 }
157
158 if (item.Design.RenderType == RenderType.Column)
159 {
160 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";
161 string size = item.Design.Size ?? "12";
162 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;
163
164 <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">
165 @RenderBlock(item)
166 </div>
167 }
168
169 if (item.Design.RenderType == RenderType.Table)
170 {
171 <table class="table @cssClass dw-mod" id="Block__@item.Id">
172 @RenderBlock(item)
173 </table>
174 }
175
176 if (item.Design.RenderType == RenderType.TableRow)
177 {
178 <tr class="@cssClass dw-mod" id="Block__@item.Id">
179 @RenderBlock(item)
180 </tr>
181 }
182
183 if (item.Design.RenderType == RenderType.TableColumn)
184 {
185 <td class="@cssClass dw-mod" id="Block__@item.Id">
186 @RenderBlock(item)
187 </td>
188 }
189
190 if (item.Design.RenderType == RenderType.CardHeader)
191 {
192 <div class="card-header @cssClass dw-mod">
193 @RenderBlock(item)
194 </div>
195 }
196
197 if (item.Design.RenderType == RenderType.CardBody)
198 {
199 <div class="card @cssClass dw-mod">
200 @RenderBlock(item)
201 </div>
202 }
203
204 if (item.Design.RenderType == RenderType.CardFooter)
205 {
206 <div class="card-footer @cssClass dw-mod">
207 @RenderBlock(item)
208 </div>
209 }
210 }
211 else
212 {
213 @RenderBlock(item)
214 }
215 }
216
217 <!-- END: @item.Id -->
218 }
219 }
220
221 @helper RenderBlock(Block item)
222 {
223 if (item.Template != null)
224 {
225 @BlocksPage.RenderTemplate(item.Template)
226 }
227
228 if (item.Component != null)
229 {
230 string methodName = item.Component.HelperName;
231 dynamic[] methodParameters = new dynamic[1];
232 methodParameters[0] = item.Component;
233 Type methodType = this.GetType();
234 MethodInfo generalMethod = methodType.GetMethod(methodName);
235
236 if (generalMethod != null) {
237 @generalMethod.Invoke(this, methodParameters).ToString();
238 } else {
239 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked");
240 }
241 }
242
243 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList)
244 {
245 @RenderBlockList(item.BlocksList)
246 }
247 }
248
249 @*--- END: Base block renderers ---*@
250
251
252 @* Include the components *@
253 @using Dynamicweb.Rapido.Blocks.Components
254 @using Dynamicweb.Rapido.Blocks.Components.General
255 @using Dynamicweb.Rapido.Blocks
256
257
258 @* Components *@
259 @using System.Reflection
260 @using Dynamicweb.Rapido.Blocks.Components.General
261
262
263 @* Component *@
264
265 @helper RenderIcon(Icon settings) {
266 if (settings != null)
267 {
268 dynamic[] methodParameters = new dynamic[1];
269 methodParameters[0] = settings;
270 MethodInfo customMethod = this.GetType().GetMethod("RenderIconCustom");
271
272 if (customMethod != null)
273 {
274 @customMethod.Invoke(this, methodParameters).ToString();
275 } else {
276 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
277
278 if (settings.Name != null)
279 {
280 if (String.IsNullOrEmpty(settings.Label)) {
281 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i>
282 } else {
283 if (settings.LabelPosition == IconLabelPosition.Before) {
284 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span>
285 } else {
286 <span><i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> @settings.Label</span>
287 }
288 }
289 }
290 }
291 }
292 }
293 @using System.Reflection
294 @using Dynamicweb.Rapido.Blocks.Components.General
295 @using Dynamicweb.Rapido.Blocks.Components
296
297
298 @* Component *@
299
300 @helper RenderButton(Button settings) {
301 dynamic[] methodParameters = new dynamic[1];
302 methodParameters[0] = settings;
303 MethodInfo customMethod = this.GetType().GetMethod("RenderButtonCustom");
304
305 if (customMethod != null)
306 {
307 @customMethod.Invoke(this, methodParameters).ToString();
308 }
309 else
310 {
311 string target;
312 string disabled = settings.Disabled ? "disabled" : "";
313 string buttonType = settings.ButtonType == ButtonType.Submit ? "submit" : "button";
314 buttonType = settings.ButtonType == ButtonType.Reset ? "reset" : buttonType;
315 string buttonLayout = settings.ButtonLayout.ToString().ToLower();
316
317 switch (settings.Target)
318 {
319 case LinkTargetType.Blank:
320 target = "_blank";
321 break;
322 case LinkTargetType.Parent:
323 target = "_parent";
324 break;
325 case LinkTargetType.Self:
326 target = "_self";
327 break;
328 case LinkTargetType.Top:
329 target = "_top";
330 break;
331 default:
332 target = "_self";
333 break;
334 }
335
336 string onClickAction = settings.OnClick != null ? settings.OnClick : "";
337 string noOpener = target == "_blank" ? "rel=\"noopener\"" : "";
338
339 if (!String.IsNullOrEmpty(settings.ConfirmText))
340 {
341 string modalId = settings.Id;
342 @RenderConfirmDialog(settings);
343 onClickAction = "document.getElementById('" + modalId + "ModalTrigger').checked = true";
344 }
345
346 if (settings.Icon != null)
347 {
348 if (settings.IconPosition == null) {
349 settings.Icon.LabelPosition = IconLabelPosition.After;
350 } else {
351 settings.Icon.LabelPosition = settings.IconPosition == IconPosition.Before ? IconLabelPosition.After : IconLabelPosition.Before;
352 }
353 if (settings.Icon.Label == null) {
354 settings.Icon.Label = settings.Title;
355 }
356 }
357 string content = settings.Icon == null ? settings.Title : Convert.ToString(RenderIcon(settings.Icon));
358
359 if (!String.IsNullOrEmpty(settings.Link) && String.IsNullOrEmpty(settings.ConfirmText))
360 {
361 <a href="@settings.Link" target="@target" @noOpener class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</a>
362 }
363 else
364 {
365 <button type="@buttonType" class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</button>
366 }
367 }
368 }
369
370
371 @helper RenderConfirmDialog(Button settings) {
372 dynamic[] methodParameters = new dynamic[1];
373 methodParameters[0] = settings;
374 MethodInfo customMethod = this.GetType().GetMethod("RenderConfirmDialogCustom");
375
376 if (customMethod != null)
377 {
378 @customMethod.Invoke(this, methodParameters).ToString();
379 } else {
380 string modalTriggerId = settings.Id + "ModalTrigger";
381
382 <!-- Trigger for the confirm modal -->
383 <input type="checkbox" id="@modalTriggerId" class="modal-trigger" />
384
385 <!-- Login modal -->
386 <div class="modal-container">
387 <label for="@modalTriggerId" class="modal-overlay"></label>
388 <div class="modal modal--xs">
389 <div class="modal__header">
390 <h2>@settings.ConfirmText</h2>
391 </div>
392 <div class="modal__body">
393 @RenderButton(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = settings.OnClick, CssClass = "u-full-width", Link = settings.Link })
394 </div>
395 </div>
396 </div>
397 }
398 }
399 @using System.Reflection
400 @using Dynamicweb.Rapido.Blocks.Components
401 @using Dynamicweb.Rapido.Blocks.Components.General
402 @using Dynamicweb.Rapido.Blocks
403
404
405 @* Component *@
406
407 @helper RenderRating(Rating settings)
408 {
409 dynamic[] methodParameters = new dynamic[1];
410 methodParameters[0] = settings;
411 MethodInfo customMethod = this.GetType().GetMethod("RenderRatingCustom");
412
413 if (customMethod != null)
414 {
415 @customMethod.Invoke(this, methodParameters).ToString();
416 } else {
417 if (settings.Score > 0)
418 {
419 int rating = settings.Score;
420 string iconType = "fa-star";
421
422 switch (settings.Type.ToString()) {
423 case "Stars":
424 iconType = "fa-star";
425 break;
426 case "Hearts":
427 iconType = "fa-heart";
428 break;
429 case "Lemons":
430 iconType = "fa-lemon";
431 break;
432 case "Bombs":
433 iconType = "fa-bomb";
434 break;
435 }
436
437 <div class="u-ta-right">
438 @for (int i = 0; i < settings.OutOf; i++)
439 {
440 <i class="@(rating > i ? "fas" : "far") @iconType"></i>
441 }
442 </div>
443 }
444 }
445 }
446 @using System.Reflection
447 @using Dynamicweb.Rapido.Blocks.Components.General
448 @using Dynamicweb.Rapido.Blocks.Components
449
450
451 @* Component *@
452
453 @helper RenderFieldListOption(FieldListOption settings) {
454 dynamic[] methodParameters = new dynamic[1];
455 methodParameters[0] = settings;
456 MethodInfo customMethod = this.GetType().GetMethod("RenderFieldListOptionCustom");
457
458 if (customMethod != null)
459 {
460 @customMethod.Invoke(this, methodParameters).ToString();
461 } else {
462 string disabled = settings.Disabled ? "disabled" : "";
463 string selected = settings.Checked ? "checked" : "";
464
465 if (settings.Type.ToString() == "RadioButton")
466 {
467 <input class="form__control @disabled dw-mod" onchange="@settings.OnChange" onclick="@settings.OnClick" type="radio" name="@settings.Name" id="@settings.Id" value="@settings.Value" @selected @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
468 <label for="@settings.Id" class="u-inline @disabled dw-mod">@settings.Label</label>
469 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
470 }
471
472 if (settings.Type.ToString() == "Checkbox")
473 {
474 @RenderCheckboxField(settings)
475 }
476
477 if (settings.Type.ToString() == "SelectOption")
478 {
479 <option value="@settings.Value" id="@settings.Id" onclick="@settings.OnClick" class="@disabled" @disabled @selected @ComponentMethods.AddAttributes(settings.ExtraAttributes) >@settings.Name</option>
480 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
481 }
482 }
483 }
484
485 @using System.Reflection
486 @using Dynamicweb.Rapido.Blocks.Components.General
487 @using Dynamicweb.Rapido.Blocks.Components
488
489
490 @* Component *@
491
492 @helper RenderNavigation(Navigation settings) {
493 dynamic[] methodParameters = new dynamic[1];
494 methodParameters[0] = settings;
495 MethodInfo customMethod = this.GetType().GetMethod("RenderNavigationCustom");
496
497 if (customMethod != null)
498 {
499 @customMethod.Invoke(this, methodParameters).ToString();
500 } else {
501 @RenderNavigation(new
502 {
503 id = settings.Id,
504 cssclass = settings.CssClass,
505 startLevel = settings.StartLevel,
506 endlevel = settings.EndLevel,
507 expandmode = settings.Expandmode,
508 template = settings.Template
509 })
510 }
511 }
512 @using System.Reflection
513 @using Dynamicweb.Rapido.Blocks.Components.General
514 @using Dynamicweb.Rapido.Blocks.Components
515
516
517 @* Component *@
518
519 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) {
520 dynamic[] methodParameters = new dynamic[1];
521 methodParameters[0] = settings;
522 MethodInfo customMethod = this.GetType().GetMethod("RenderBreadcrumbNavigationCustom");
523
524 if (customMethod != null)
525 {
526 @customMethod.Invoke(this, methodParameters).ToString();
527 } else {
528 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
529 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
530 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
531 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
532 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
533
534 @RenderNavigation(settings)
535 }
536 }
537 @using System.Reflection
538 @using Dynamicweb.Rapido.Blocks.Components.General
539
540
541 @* Component *@
542
543 @helper RenderHeading(Heading settings) {
544 dynamic[] methodParameters = new dynamic[1];
545 methodParameters[0] = settings;
546 MethodInfo customMethod = this.GetType().GetMethod("RenderHeadingCustom");
547
548 if (customMethod != null)
549 {
550 @customMethod.Invoke(this, methodParameters).ToString();
551 } else {
552 string startTag = "<h" + settings.Level.ToString() + " class=\"" + settings.CssClass + "\">";
553 string endTag = "</h" + settings.Level.ToString() + "\">";
554
555 if (settings.Icon != null)
556 {
557 if (settings.IconPosition == null) {
558 settings.Icon.LabelPosition = IconLabelPosition.After;
559 } else {
560 settings.Icon.LabelPosition = settings.IconPosition == IconPosition.Before ? IconLabelPosition.After : IconLabelPosition.Before;
561 }
562 if (settings.Icon.Label == null) {
563 settings.Icon.Label = settings.Title;
564 }
565
566 @startTag@RenderIcon(settings.Icon)@endTag
567 } else {
568 @startTag@settings.Title@endTag
569 }
570 }
571 }
572 @using System.Reflection
573 @using Dynamicweb.Rapido.Blocks.Components
574 @using Dynamicweb.Rapido.Blocks.Components.General
575 @using Dynamicweb.Rapido.Blocks
576
577
578 @* Component *@
579
580 @helper RenderImage(Image settings)
581 {
582 if (settings.Path != null)
583 {
584 dynamic[] methodParameters = new dynamic[1];
585 methodParameters[0] = settings;
586 MethodInfo customMethod = this.GetType().GetMethod("RenderImageCustom");
587
588 if (customMethod != null)
589 {
590 @customMethod.Invoke(this, methodParameters).ToString();
591 } else {
592 <div>
593 @if (settings.Link != null)
594 {
595 <a href="@settings.Link">
596 @RenderTheImage(settings);
597 </a>
598 }
599 else
600 {
601 @RenderTheImage(settings);
602 }
603 </div>
604 }
605 }
606 }
607
608 @functions {
609 string getImagePathFromSettings(ImageSettings settings)
610 {
611 string result = "";
612
613 if (settings != null)
614 {
615 result += settings.Width != 0 ? "Width=" + settings.Width + "&" : "";
616 result += settings.Height != 0 ? "Height=" + settings.Height + "&" : "";
617 result += "Crop=" + settings.Crop + "&";
618 result += "Compression=" + settings.Compression + "&";
619 result += "DoNotUpscale=" + settings.DoNotUpscale.ToString() + "&";
620 result += "FillCanvas=" + settings.FillCanvas.ToString() + "&";
621 }
622
623 return result;
624 }
625 }
626
627 @helper RenderTheImage(Image settings)
628 {
629 if (settings != null)
630 {
631 dynamic[] methodParameters = new dynamic[1];
632 methodParameters[0] = settings;
633 MethodInfo customMethod = this.GetType().GetMethod("RenderTheImageCustom");
634
635 if (customMethod != null)
636 {
637 @customMethod.Invoke(this, methodParameters).ToString();
638 } else {
639 string placeholderImage = "/Files/Images/placeholder.gif";
640 string imageEngine = "/Admin/Public/GetImage.ashx?";
641
642 string imageStyle = "";
643
644 switch (settings.Style)
645 {
646 case ImageStyle.Ball:
647 imageStyle = "grid__cell-img--ball";
648 break;
649 }
650
651 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle)
652 {
653 if (settings.ImageDefault != null)
654 {
655 settings.ImageDefault.Height = settings.ImageDefault.Width;
656 }
657 if (settings.ImageMedium != null)
658 {
659 settings.ImageMedium.Height = settings.ImageMedium.Width;
660 }
661 if (settings.ImageSmall != null)
662 {
663 settings.ImageSmall.Height = settings.ImageSmall.Width;
664 }
665 }
666
667 string defaultImage = imageEngine;
668 string imageSmall = "";
669 string imageMedium = "";
670
671 if (settings.DisableImageEngine) {
672 defaultImage = settings.Path;
673 } else {
674 if (settings.ImageDefault != null)
675 {
676 defaultImage += getImagePathFromSettings(settings.ImageDefault);
677
678 if (settings.Path.GetType() != typeof(string))
679 {
680 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
681 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
682 }
683 else
684 {
685 defaultImage += settings.Path != null ? "Image=" + settings.Path : "";
686 }
687 }
688
689 if (settings.ImageSmall != null)
690 {
691 imageSmall = "data-src-small=\"" + imageEngine;
692 imageSmall += getImagePathFromSettings(settings.ImageSmall);
693
694 if (settings.Path.GetType() != typeof(string))
695 {
696 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
697 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
698 }
699 else
700 {
701 imageSmall += settings.Path != null ? "Image=" + settings.Path : "";
702 }
703
704 imageSmall += "\"";
705 }
706
707 if (settings.ImageMedium != null)
708 {
709 imageMedium = "data-src-medium=\"" + imageEngine;
710 imageMedium += getImagePathFromSettings(settings.ImageMedium);
711
712 if (settings.Path.GetType() != typeof(string))
713 {
714 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
715 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
716 }
717 else
718 {
719 imageMedium += settings.Path != null ? "Image=" + settings.Path : "";
720 }
721
722 imageMedium += "\"";
723 }
724 }
725
726 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
727 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); }
728 if (!String.IsNullOrEmpty(settings.Title)) { optionalAttributes.Add("alt", settings.Title); }
729
730 if (settings.DisableLazyLoad) {
731 <img class="grid__cell-img @imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
732 } else {
733 <img class="grid__cell-img @imageStyle @settings.CssClass dw-mod" loading="lazy" src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
734 }
735
736 if (settings.Caption != null)
737 {
738 <span class="image-caption dw-mod">@settings.Caption</span>
739 }
740 }
741 }
742 }
743 @using System.Reflection
744 @using Dynamicweb.Rapido.Blocks.Components.General
745 @using Dynamicweb.Rapido.Blocks.Components
746
747
748 @* Component *@
749
750 @helper RenderTextField(TextField settings) {
751 dynamic[] methodParameters = new dynamic[1];
752 methodParameters[0] = settings;
753 MethodInfo customMethod = this.GetType().GetMethod("RenderTextFieldCustom");
754
755 if (customMethod != null)
756 {
757 @customMethod.Invoke(this, methodParameters).ToString();
758 } else {
759 int maxLength = settings.MaxLength != 0 ? settings.MaxLength : 524288;
760 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
761 if (settings.Type == TextFieldType.Password) { optionalAttributes.Add("autocomplete", "off"); };
762 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
763 if (!String.IsNullOrEmpty(settings.Placeholder)) { optionalAttributes.Add("placeholder", settings.Placeholder); }
764 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
765 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
766 if (settings.MaxLength != 0) { optionalAttributes.Add("maxlength", settings.MaxLength.ToString()); }
767
768 <div class="form__field-group dw-mod">
769 @if (!String.IsNullOrEmpty(settings.Label))
770 {
771 <label for="@settings.Id">@settings.Label</label>
772 }
773
774 <input type="@settings.Type" class="u-full-width @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
775
776 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
777 </div>
778 }
779 }
780 @using System.Reflection
781 @using Dynamicweb.Rapido.Blocks.Components.General
782 @using Dynamicweb.Rapido.Blocks.Components
783
784
785 @* Component *@
786
787 @helper RenderNumberField(NumberField settings) {
788 dynamic[] methodParameters = new dynamic[1];
789 methodParameters[0] = settings;
790 MethodInfo customMethod = this.GetType().GetMethod("RenderNumberFieldCustom");
791
792 if (customMethod != null)
793 {
794 @customMethod.Invoke(this, methodParameters).ToString();
795 } else {
796 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
797 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
798 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
799 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
800 if (settings.Max != 0) { optionalAttributes.Add("max", settings.Max.ToString()); }
801 if (settings.Min != 0) { optionalAttributes.Add("min", settings.Min.ToString()); }
802 if (settings.Step != 0) { optionalAttributes.Add("step", settings.Step.ToString()); }
803
804 <div class="form__field-group dw-mod">
805 @if (!String.IsNullOrEmpty(settings.Label))
806 {
807 <div>
808 <label for="@settings.Id">@settings.Label</label>
809 </div>
810 }
811
812 <input type="Number" class="u-w70px @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
813
814 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
815 </div>
816 }
817 }
818 @using System.Reflection
819 @using Dynamicweb.Rapido.Blocks.Components.General
820 @using Dynamicweb.Rapido.Blocks.Components
821
822
823 @* Component *@
824
825 @helper RenderTextareaField(TextareaField settings) {
826 dynamic[] methodParameters = new dynamic[1];
827 methodParameters[0] = settings;
828 MethodInfo customMethod = this.GetType().GetMethod("RenderTextareaFieldCustom");
829
830 if (customMethod != null)
831 {
832 @customMethod.Invoke(this, methodParameters).ToString();
833 } else {
834 int maxLength = settings.MaxLength != 0 ? settings.MaxLength : 524288;
835 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
836 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
837 if (!String.IsNullOrEmpty(settings.Placeholder)) { optionalAttributes.Add("placeholder", settings.Placeholder); }
838 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
839 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
840 if (settings.MaxLength != 0) { optionalAttributes.Add("maxlength", settings.MaxLength.ToString()); }
841 if (settings.Rows != 0) { optionalAttributes.Add("rows", settings.Rows.ToString()); }
842
843 <div class="form__field-group dw-mod">
844 @if (!String.IsNullOrEmpty(@settings.Label))
845 {
846 <label for="@settings.Id">@settings.Label</label>
847 }
848
849 <textarea class="u-full-width @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)></textarea>
850
851 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
852 </div>
853 }
854 }
855 @using System.Reflection
856 @using Dynamicweb.Rapido.Blocks.Components.General
857 @using Dynamicweb.Rapido.Blocks.Components
858
859
860 @* Component *@
861
862 @helper RenderHiddenField(HiddenField settings) {
863 dynamic[] methodParameters = new dynamic[1];
864 methodParameters[0] = settings;
865 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
866
867 if (customMethod != null)
868 {
869 @customMethod.Invoke(this, methodParameters).ToString();
870 } else {
871 <input type="hidden" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(settings.ExtraAttributes)/>
872 }
873 }
874 @using System.Reflection
875 @using Dynamicweb.Rapido.Blocks.Components.General
876 @using Dynamicweb.Rapido.Blocks.Components
877
878
879 @* Component *@
880
881 @helper RenderCheckboxField(dynamic settings) {
882 dynamic[] methodParameters = new dynamic[1];
883 methodParameters[0] = settings;
884 MethodInfo customMethod = this.GetType().GetMethod("RenderCheckboxFieldCustom");
885
886 if (customMethod != null)
887 {
888 @customMethod.Invoke(this, methodParameters).ToString();
889 } else {
890 settings.Type = FieldListOptionType.Checkbox;
891 string disabled = settings.Disabled ? "disabled" : "";
892 string required = settings.Required ? "required" : "";
893 string checkedString = settings.Checked == true ? "checked" : "";
894 string id = settings.Id != null ? settings.Id : settings.Label.Replace(" ", "");
895
896 <div class="form__field-group dw-mod">
897 <input type="checkbox" class="form__control @settings.CssClass @disabled dw-mod" name="@settings.Name" id="@id" value="@settings.Value" onclick="@settings.OnClick" @disabled @required @checkedString @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
898
899 @if (!String.IsNullOrEmpty(settings.Label))
900 {
901 <label for="@id" class="@disabled dw-mod">@settings.Label</label>
902 }
903
904 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
905 </div>
906 }
907 }
908 @using System.Reflection
909 @using Dynamicweb.Rapido.Blocks.Components.General
910 @using Dynamicweb.Rapido.Blocks.Components
911
912
913 @* Component *@
914
915 @helper RenderCheckboxListField(CheckboxListField settings) {
916 dynamic[] methodParameters = new dynamic[1];
917 methodParameters[0] = settings;
918 MethodInfo customMethod = this.GetType().GetMethod("RenderCheckboxListFieldCustom");
919
920 if (customMethod != null)
921 {
922 @customMethod.Invoke(this, methodParameters).ToString();
923 } else {
924 string disabled = settings.Disabled ? "disabled" : "";
925
926 <div class="form__field-group @settings.CssClass u-margin-bottom @disabled dw-mod" @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
927 @if (!String.IsNullOrEmpty(settings.Label))
928 {
929 <div class="u-bold u-margin-bottom">@settings.Label</div>
930 }
931
932 @foreach (var item in settings.Options)
933 {
934 item.Type = FieldListOptionType.Checkbox;
935 @RenderFieldListOption(item)
936 }
937
938 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
939 </div>
940 }
941 }
942
943 @using System.Reflection
944 @using Dynamicweb.Rapido.Blocks.Components.General
945 @using Dynamicweb.Rapido.Blocks.Components
946
947
948 @* Component *@
949
950 @helper RenderSelectField(SelectField settings) {
951 dynamic[] methodParameters = new dynamic[1];
952 methodParameters[0] = settings;
953 MethodInfo customMethod = this.GetType().GetMethod("RenderSelectFieldCustom");
954
955 if (customMethod != null)
956 {
957 @customMethod.Invoke(this, methodParameters).ToString();
958 } else {
959 string disabled = settings.Disabled ? "disabled" : "";
960 string required = settings.Required ? "required" : "";
961
962 if (settings.Default != null)
963 {
964 settings.Default.Type = FieldListOptionType.SelectOption;
965 }
966
967 <div class="form__field-group u-full-width dw-mod">
968 @if (!String.IsNullOrEmpty(settings.Label))
969 {
970 <label for="@settings.Id">@settings.Label</label>
971 }
972
973 <div class="form__field-combi u-no-margin dw-mod">
974 <select id="@settings.Id" class="u-full-width @settings.CssClass dw-mod" onchange="@settings.OnChange" @ComponentMethods.AddAttributes(settings.ExtraAttributes) >
975 @if (settings.Default.Value != null)
976 {
977 @RenderFieldListOption(settings.Default)
978 }
979
980 @foreach (var item in settings.Options)
981 {
982 item.Type = FieldListOptionType.SelectOption;
983 @RenderFieldListOption(item)
984 }
985 </select>
986 @if (settings.ActionButton.Link != null || settings.ActionButton.OnClick != null) {
987 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
988 @RenderButton(settings.ActionButton);
989 }
990 </div>
991
992 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
993 </div>
994 }
995 }
996 @using System.Reflection
997 @using Dynamicweb.Rapido.Blocks.Components.General
998 @using Dynamicweb.Rapido.Blocks.Components
999
1000
1001 @* Component *@
1002
1003 @helper RenderRadioButtonField(RadioButtonField settings) {
1004 dynamic[] methodParameters = new dynamic[1];
1005 methodParameters[0] = settings;
1006 MethodInfo customMethod = this.GetType().GetMethod("RenderRadioButtonFieldCustom");
1007
1008 if (customMethod != null)
1009 {
1010 @customMethod.Invoke(this, methodParameters).ToString();
1011 } else {
1012 string disabled = settings.Disabled ? "disabled" : "";
1013
1014 <div class="form__field-group @settings.CssClass u-margin-bottom @disabled" @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1015 @if (!String.IsNullOrEmpty(settings.Label))
1016 {
1017 <div class="u-bold u-margin-bottom">@settings.Label</div>
1018 }
1019
1020 @foreach (var item in settings.Options)
1021 {
1022 item.Type = FieldListOptionType.RadioButton;
1023
1024 if (settings.Name != null)
1025 {
1026 item.Name = settings.Name;
1027 }
1028
1029 if (settings.RenderOptionsInline)
1030 {
1031 @RenderFieldListOption(item)
1032 }
1033 else
1034 {
1035 <div>
1036 @RenderFieldListOption(item)
1037 </div>
1038 }
1039 }
1040
1041 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1042 </div>
1043 }
1044 }
1045 @using System.Reflection
1046 @using Dynamicweb.Rapido.Blocks.Components.General
1047 @using Dynamicweb.Rapido.Blocks.Components
1048
1049
1050 @* Component *@
1051
1052 @helper RenderNotificationMessage(NotificationMessage settings) {
1053 dynamic[] methodParameters = new dynamic[1];
1054 methodParameters[0] = settings;
1055 MethodInfo customMethod = this.GetType().GetMethod("RenderNotificationMessageCustom");
1056
1057 if (customMethod != null)
1058 {
1059 @customMethod.Invoke(this, methodParameters).ToString();
1060 } else {
1061 if (!String.IsNullOrEmpty(settings.Message))
1062 {
1063 string messageTypeClass = settings.MessageType.ToString().ToLower();
1064 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod">@settings.Message</div>
1065 }
1066 }
1067 }
1068 @using System.Reflection
1069 @using Dynamicweb.Rapido.Blocks.Components.General
1070
1071
1072 @* Component *@
1073
1074 @helper RenderHandlebarsRoot(HandlebarsRoot settings) {
1075 dynamic[] methodParameters = new dynamic[1];
1076 methodParameters[0] = settings;
1077 MethodInfo customMethod = this.GetType().GetMethod("RenderHandlebarsRootCustom");
1078
1079 if (customMethod != null)
1080 {
1081 @customMethod.Invoke(this, methodParameters).ToString();
1082 } else {
1083 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : "";
1084
1085 <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>
1086 @if (settings.SubBlocks != null) {
1087 @RenderBlockList(settings.SubBlocks)
1088 }
1089 </div>
1090 }
1091 }
1092 @using System.Reflection
1093 @using Dynamicweb.Rapido.Blocks.Components.General
1094 @using Dynamicweb.Rapido.Blocks.Components
1095 @using System.Text.RegularExpressions
1096
1097
1098 @* Component *@
1099
1100 @helper RenderSticker(Sticker settings) {
1101 dynamic[] methodParameters = new dynamic[1];
1102 methodParameters[0] = settings;
1103 MethodInfo customMethod = this.GetType().GetMethod("RenderStickerCustom");
1104
1105 if (customMethod != null)
1106 {
1107 @customMethod.Invoke(this, methodParameters).ToString();
1108 }
1109 else
1110 {
1111 if (!String.IsNullOrEmpty(settings.Title)) {
1112 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : "";
1113 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : "";
1114
1115 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1116 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) {
1117 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : "";
1118 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : "";
1119 optionalAttributes.Add("style", styleTag);
1120 }
1121
1122 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div>
1123 }
1124 }
1125 }
1126
1127 @using System.Reflection
1128 @using Dynamicweb.Rapido.Blocks.Components.General
1129 @using Dynamicweb.Rapido.Blocks.Components
1130
1131
1132 @* Component *@
1133
1134 @helper RenderStickersCollection(StickersCollection settings) {
1135 dynamic[] methodParameters = new dynamic[1];
1136 methodParameters[0] = settings;
1137 MethodInfo customMethod = this.GetType().GetMethod("RenderStickersCollectionCustom");
1138
1139 if (customMethod != null)
1140 {
1141 @customMethod.Invoke(this, methodParameters).ToString();
1142 }
1143 else
1144 {
1145 if (settings.Stickers.Count > 0) {
1146 string position = settings.Position != null ? "" + "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower() : "";
1147
1148 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1149 @foreach (Sticker sticker in settings.Stickers)
1150 {
1151 @RenderSticker(sticker)
1152 }
1153 </div>
1154 }
1155 }
1156 }
1157
1158 @using System.Reflection
1159 @using Dynamicweb.Rapido.Blocks.Components.General
1160 @using Dynamicweb.Rapido.Blocks.Components
1161
1162
1163
1164 @* Component *@
1165
1166 @helper RenderField(Field settings) {
1167 dynamic[] methodParameters = new dynamic[1];
1168 methodParameters[0] = settings;
1169 MethodInfo customMethod = this.GetType().GetMethod("RenderFieldCustom");
1170
1171 if (customMethod != null)
1172 {
1173 @customMethod.Invoke(this, methodParameters).ToString();
1174 } else {
1175 switch (settings.FieldType)
1176 {
1177 case FieldType.Checkbox:
1178 CheckboxField checkbox = new CheckboxField
1179 {
1180 Label = settings.Label,
1181 Id = settings.Id,
1182 Name = settings.Label.Replace(" ", ""),
1183 Value = settings.Value,
1184 Checked = Convert.ToBoolean(settings.Placeholder),
1185 OnClick = settings.OnClick,
1186 Disabled = settings.Disabled,
1187 Required = settings.Required,
1188 CssClass = settings.CssClass,
1189 ExtraAttributes = settings.ExtraAttributes,
1190 ErrorMessage = settings.ErrorMessage
1191 };
1192
1193 @RenderCheckboxField(checkbox)
1194 break;
1195 case FieldType.Email:
1196 TextField emailField = new TextField
1197 {
1198 Label = settings.Label != null ? settings.Label : Translate("Email"),
1199 Id = settings.Id,
1200 Value = settings.Value,
1201 OnClick = settings.OnClick,
1202 Disabled = settings.Disabled,
1203 Required = settings.Required,
1204 CssClass = settings.CssClass,
1205 ExtraAttributes = settings.ExtraAttributes,
1206 ErrorMessage = settings.ErrorMessage,
1207 Placeholder = settings.Placeholder,
1208 Type = TextFieldType.Email
1209 };
1210
1211 @RenderTextField(emailField)
1212 break;
1213 case FieldType.Hidden:
1214 HiddenField hiddenField = new HiddenField
1215 {
1216 Label = settings.Label,
1217 Id = settings.Id,
1218 Value = settings.Value,
1219 Disabled = settings.Disabled,
1220 Required = settings.Required,
1221 CssClass = settings.CssClass,
1222 ExtraAttributes = settings.ExtraAttributes,
1223 ErrorMessage = settings.ErrorMessage
1224 };
1225
1226 @RenderHiddenField(hiddenField)
1227 break;
1228 case FieldType.Integer:
1229 NumberField numberField = new NumberField
1230 {
1231 Label = settings.Label,
1232 Id = settings.Id,
1233 Value = settings.Value.GetType() == typeof(int) ? Convert.ToInt32(settings.Value) : 1,
1234 OnClick = settings.OnClick,
1235 Disabled = settings.Disabled,
1236 Required = settings.Required,
1237 CssClass = settings.CssClass,
1238 ExtraAttributes = settings.ExtraAttributes,
1239 ErrorMessage = settings.ErrorMessage,
1240 Step = 1
1241 };
1242
1243 @RenderNumberField(numberField)
1244 break;
1245 case FieldType.Password:
1246 TextField passwordField = new TextField
1247 {
1248 Label = settings.Label != null ? settings.Label : Translate("Password"),
1249 Id = settings.Id,
1250 Value = settings.Value,
1251 OnClick = settings.OnClick,
1252 Disabled = settings.Disabled,
1253 Required = settings.Required,
1254 CssClass = settings.CssClass,
1255 ExtraAttributes = settings.ExtraAttributes,
1256 ErrorMessage = settings.ErrorMessage,
1257 Placeholder = settings.Placeholder,
1258 Type = TextFieldType.Password
1259 };
1260
1261 @RenderTextField(passwordField)
1262 break;
1263 case FieldType.Reset:
1264 Button resetField = new Button
1265 {
1266 Title = settings.Label != null ? settings.Label : Translate("Reset"),
1267 Id = settings.Id,
1268 OnClick = settings.OnClick,
1269 Disabled = settings.Disabled,
1270 CssClass = settings.CssClass,
1271 ExtraAttributes = settings.ExtraAttributes,
1272 ButtonLayout = ButtonLayout.Secondary,
1273 ButtonType = ButtonType.Reset
1274 };
1275
1276 @RenderButton(resetField)
1277 break;
1278 case FieldType.Submit:
1279 Button submitField = new Button
1280 {
1281 Title = settings.Label != null ? settings.Label : Translate("Submit"),
1282 Id = settings.Id,
1283 OnClick = settings.OnClick,
1284 Disabled = settings.Disabled,
1285 CssClass = settings.CssClass,
1286 ExtraAttributes = settings.ExtraAttributes,
1287 ButtonLayout = ButtonLayout.Primary,
1288 ButtonType = ButtonType.Submit
1289 };
1290
1291 @RenderButton(submitField)
1292 break;
1293 case FieldType.Tel:
1294 TextField telField = new TextField
1295 {
1296 Label = settings.Label != null ? settings.Label : Translate("Phone"),
1297 Id = settings.Id,
1298 Value = settings.Value,
1299 OnClick = settings.OnClick,
1300 Disabled = settings.Disabled,
1301 Required = settings.Required,
1302 CssClass = settings.CssClass,
1303 ExtraAttributes = settings.ExtraAttributes,
1304 ErrorMessage = settings.ErrorMessage,
1305 Placeholder = settings.Placeholder,
1306 Type = TextFieldType.Tel
1307 };
1308
1309 @RenderTextField(telField)
1310 break;
1311 case FieldType.Text:
1312 TextField textField = new TextField
1313 {
1314 Label = settings.Label,
1315 Id = settings.Id,
1316 Value = settings.Value,
1317 OnClick = settings.OnClick,
1318 Disabled = settings.Disabled,
1319 Required = settings.Required,
1320 CssClass = settings.CssClass,
1321 ExtraAttributes = settings.ExtraAttributes,
1322 ErrorMessage = settings.ErrorMessage,
1323 Placeholder = settings.Placeholder,
1324 Type = TextFieldType.Text
1325 };
1326
1327 @RenderTextField(textField)
1328 break;
1329 case FieldType.Textarea:
1330 TextareaField textareaField = new TextareaField
1331 {
1332 Label = settings.Label,
1333 Id = settings.Id,
1334 Value = settings.Value,
1335 OnClick = settings.OnClick,
1336 Disabled = settings.Disabled,
1337 Required = settings.Required,
1338 CssClass = settings.CssClass,
1339 ExtraAttributes = settings.ExtraAttributes,
1340 ErrorMessage = settings.ErrorMessage,
1341 Placeholder = settings.Placeholder
1342 };
1343
1344 @RenderTextareaField(textareaField)
1345 break;
1346 default:
1347 TextField defaultField = new TextField
1348 {
1349 Label = settings.Label,
1350 Id = settings.Id,
1351 Value = settings.Value,
1352 OnClick = settings.OnClick,
1353 Disabled = settings.Disabled,
1354 Required = settings.Required,
1355 CssClass = settings.CssClass,
1356 ExtraAttributes = settings.ExtraAttributes,
1357 ErrorMessage = settings.ErrorMessage,
1358 Placeholder = settings.Placeholder,
1359 Type = TextFieldType.Text
1360 };
1361
1362 @RenderTextField(defaultField)
1363 break;
1364 }
1365 }
1366 }
1367
1368
1369 @using Dynamicweb.Frontend
1370 @using System.Reflection
1371 @using Dynamicweb.Content.Items
1372 @using System.Web.UI.HtmlControls
1373 @using Dynamicweb.Rapido.Blocks.Components
1374 @using Dynamicweb.Rapido.Blocks
1375
1376
1377 @* Components for the articles *@
1378 @using System.Reflection
1379 @using Dynamicweb.Rapido.Blocks.Components.Articles
1380
1381
1382 @* Component for the articles *@
1383
1384 @helper RenderArticleBanner(dynamic settings) {
1385 dynamic[] methodParameters = new dynamic[1];
1386 methodParameters[0] = settings;
1387 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerCustom");
1388
1389 if (customMethod != null)
1390 {
1391 @customMethod.Invoke(this, methodParameters).ToString();
1392 } else {
1393 string filterClasses = "image-filter image-filter--darken";
1394 settings.Layout = ArticleHeaderLayout.Banner;
1395
1396 if (settings.Image != null)
1397 {
1398 if (settings.Image.Path != null)
1399 {
1400 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
1401 <div class="background-image @filterClasses dw-mod">
1402 <div class="background-image__wrapper @filterClasses dw-mod">
1403 @{
1404 settings.Image.CssClass += "background-image__cover dw-mod";
1405 }
1406 @RenderImage(settings.Image)
1407 </div>
1408 </div>
1409 <div class="center-container dw-mod">
1410 <div class="grid">
1411 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg">
1412 <div class="u-left-middle">
1413 <div>
1414 @if (!String.IsNullOrEmpty(settings.Heading))
1415 {
1416 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
1417 }
1418 @if (!String.IsNullOrEmpty(settings.Subheading))
1419 {
1420 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
1421 }
1422 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1423 {
1424 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
1425 }
1426 @if (!String.IsNullOrEmpty(settings.Link)) {
1427 <div class="grid__cell">
1428 @RenderButton(new Button { Link= settings.Link, Title= settings.LinkText, ButtonLayout= settings.ButtonLayout })
1429 </div>
1430 }
1431 </div>
1432 </div>
1433 </div>
1434 @if (settings.ExternalParagraphId != 0)
1435 {
1436 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod">
1437 <div class="u-color-light-gray--bg u-color-dark dw-mod">
1438 @RenderParagraphContent(settings.ExternalParagraphId)
1439 </div>
1440 </div>
1441 }
1442 </div>
1443 </div>
1444 </section>
1445 }
1446 else
1447 {
1448 settings.Layout = ArticleHeaderLayout.Clean;
1449 @RenderArticleCleanHeader(settings);
1450 }
1451 }
1452 else
1453 {
1454 settings.Layout = ArticleHeaderLayout.Clean;
1455 @RenderArticleCleanHeader(settings);
1456 }
1457 }
1458 }
1459 @using System.Reflection
1460 @using Dynamicweb.Rapido.Blocks.Components
1461 @using Dynamicweb.Rapido.Blocks.Components.General
1462 @using Dynamicweb.Rapido.Blocks.Components.Articles
1463 @using Dynamicweb.Rapido.Blocks
1464
1465
1466 @* Component for the articles *@
1467
1468 @helper RenderArticleHeader(ArticleHeader settings) {
1469 dynamic[] methodParameters = new dynamic[1];
1470 methodParameters[0] = settings;
1471 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom");
1472
1473 if (customMethod != null)
1474 {
1475 @customMethod.Invoke(this, methodParameters).ToString();
1476 } else {
1477 switch (settings.Layout)
1478 {
1479 case ArticleHeaderLayout.Clean:
1480 @RenderArticleCleanHeader(settings);
1481 break;
1482 case ArticleHeaderLayout.Split:
1483 @RenderArticleSplitHeader(settings);
1484 break;
1485 case ArticleHeaderLayout.Banner:
1486 @RenderArticleBannerHeader(settings);
1487 break;
1488 case ArticleHeaderLayout.Overlay:
1489 @RenderArticleOverlayHeader(settings);
1490 break;
1491 default:
1492 @RenderArticleCleanHeader(settings);
1493 break;
1494 }
1495 }
1496 }
1497
1498 @helper RenderArticleCleanHeader(ArticleHeader settings) {
1499 dynamic[] methodParameters = new dynamic[1];
1500 methodParameters[0] = settings;
1501 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom");
1502
1503 if (customMethod != null)
1504 {
1505 @customMethod.Invoke(this, methodParameters).ToString();
1506 }
1507 else
1508 {
1509 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
1510
1511 <div class="grid grid--align-content-start grid--justify-start">
1512 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod">
1513 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0)
1514 {
1515 <div class="u-border-bottom u-padding-bottom">
1516 @if (!String.IsNullOrEmpty(settings.Category))
1517 {
1518 <div class="u-pull--left">
1519 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
1520 </div>
1521 }
1522 <div class="u-pull--right">
1523 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1524 {
1525 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small>
1526 }
1527 @if (settings.RatingOutOf != 0)
1528 {
1529 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1530 }
1531 </div>
1532 </div>
1533 }
1534
1535 <div class="grid__cell">
1536 @if (!String.IsNullOrEmpty(settings.Heading))
1537 {
1538 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
1539 }
1540 @if (settings.Image != null)
1541 {
1542 if (settings.Image.Path != null)
1543 {
1544 <div class="u-padding-bottom--lg">
1545 @RenderImage(settings.Image)
1546 </div>
1547 }
1548 }
1549 @if (!String.IsNullOrEmpty(settings.Subheading))
1550 {
1551 <div class="article__leadtext dw-mod">@settings.Subheading</div>
1552 }
1553 @if (!String.IsNullOrEmpty(settings.Link))
1554 {
1555 <div class="grid__cell">
1556 @RenderButton(new Button { Link = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
1557 </div>
1558 }
1559 </div>
1560 </div>
1561 @if (settings.ExternalParagraphId != 0)
1562 {
1563 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod">
1564 @RenderParagraphContent(settings.ExternalParagraphId)
1565 </div>
1566 }
1567 </div>
1568 }
1569 }
1570
1571 @helper RenderArticleSplitHeader(ArticleHeader settings) {
1572 dynamic[] methodParameters = new dynamic[1];
1573 methodParameters[0] = settings;
1574 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom");
1575
1576 if (customMethod != null)
1577 {
1578 @customMethod.Invoke(this, methodParameters).ToString();
1579 }
1580 else
1581 {
1582 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6";
1583
1584 if (settings.Image != null)
1585 {
1586 if (settings.Image.Path != null)
1587 {
1588 <section class="multiple-paragraphs-container paragraph-container--full-width">
1589 <div class="grid">
1590 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod">
1591 <div class="u-left-middle u-padding--lg">
1592 <div>
1593 @if (!String.IsNullOrEmpty(settings.Category))
1594 {
1595 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
1596 }
1597 @if (!String.IsNullOrEmpty(settings.Heading))
1598 {
1599 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
1600 }
1601 @if (!String.IsNullOrEmpty(settings.Subheading))
1602 {
1603 <div class="article__leadtext dw-mod">@settings.Subheading</div>
1604 }
1605 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1606 {
1607 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small>
1608 }
1609 @if (settings.RatingOutOf != 0)
1610 {
1611 <div class="u-pull--right">
1612 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1613 </div>
1614 }
1615 @if (!String.IsNullOrEmpty(settings.Link)) {
1616 @RenderButton(new Button { Link = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
1617 }
1618 </div>
1619 </div>
1620 </div>
1621 <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>
1622 @if (settings.ExternalParagraphId != 0)
1623 {
1624 <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">
1625 @RenderParagraphContent(settings.ExternalParagraphId)
1626 </div>
1627 }
1628 </div>
1629 </section>
1630 }
1631 }
1632 else
1633 {
1634 @RenderArticleCleanHeader(settings);
1635 }
1636 }
1637 }
1638
1639 @helper RenderArticleOverlayHeader(ArticleHeader settings) {
1640 dynamic[] methodParameters = new dynamic[1];
1641 methodParameters[0] = settings;
1642 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom");
1643
1644 if (customMethod != null)
1645 {
1646 @customMethod.Invoke(this, methodParameters).ToString();
1647 }
1648 else
1649 {
1650 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
1651 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : "";
1652
1653 if (settings.Image != null)
1654 {
1655 if (settings.Image.Path != null)
1656 {
1657 if (settings.ExternalParagraphId == 0)
1658 {
1659 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
1660 <div class="background-image image-filter image-filter--darken dw-mod">
1661 <div class="background-image__wrapper image-filter image-filter--darken dw-mod">
1662 @{
1663 settings.Image.CssClass += "background-image__cover dw-mod";
1664 }
1665 @RenderImage(settings.Image)
1666 </div>
1667 </div>
1668 <div class="center-container dw-mod">
1669 <div class="grid @contentAlignment">
1670 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl u-no-padding dw-mod">
1671 @if (!String.IsNullOrEmpty(settings.Heading))
1672 {
1673 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
1674 }
1675 @if (!String.IsNullOrEmpty(settings.Subheading))
1676 {
1677 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
1678 }
1679 <div class="u-margin-top">
1680 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1681 {
1682 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
1683 }
1684 @if (settings.RatingOutOf != 0)
1685 {
1686 <div class="u-pull--right">
1687 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1688 </div>
1689 }
1690 </div>
1691 @if (!String.IsNullOrEmpty(settings.Link))
1692 {
1693 <div class="grid__cell">
1694 @RenderButton(new Button { Link= settings.Link, Title= settings.LinkText, ButtonLayout= settings.ButtonLayout })
1695 </div>
1696 }
1697 </div>
1698 </div>
1699 </div>
1700 </section>
1701 }
1702 else
1703 {
1704 @RenderArticleBanner(settings);
1705 }
1706 }
1707 }
1708 else
1709 {
1710 @RenderArticleCleanHeader(settings);
1711 }
1712 }
1713 }
1714
1715 @helper RenderArticleBannerHeader(dynamic settings) {
1716 dynamic[] methodParameters = new dynamic[1];
1717 methodParameters[0] = settings;
1718 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom");
1719
1720 if (customMethod != null)
1721 {
1722 @customMethod.Invoke(this, methodParameters).ToString();
1723 }
1724 else
1725 {
1726 @RenderArticleBanner(settings);
1727 }
1728 }
1729 @using System.Reflection
1730 @using System.Text.RegularExpressions;
1731 @using Dynamicweb.Frontend
1732 @using Dynamicweb.Content.Items
1733 @using Dynamicweb.Rapido.Blocks.Components
1734 @using Dynamicweb.Rapido.Blocks.Components.Articles
1735 @using Dynamicweb.Rapido.Blocks
1736
1737 @* Component for the articles *@
1738
1739 @helper RenderArticleBodyRow(ArticleBodyRow settings)
1740 {
1741 dynamic[] methodParameters = new dynamic[1];
1742 methodParameters[0] = settings;
1743 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBodyRowCustom");
1744
1745 if (customMethod != null)
1746 {
1747 @customMethod.Invoke(this, methodParameters).ToString();
1748 } else {
1749 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : "";
1750 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : "";
1751
1752 <div class="grid grid--align-content-start @contentAlignment @position dw-mod">
1753 @RenderBlockList(settings.SubBlocks)
1754 </div>
1755 }
1756 }
1757 @using System.Reflection
1758 @using Dynamicweb.Rapido.Blocks.Components
1759 @using Dynamicweb.Rapido.Blocks.Components.General
1760 @using Dynamicweb.Rapido.Blocks.Components.Articles
1761 @using Dynamicweb.Rapido.Blocks
1762
1763 @* Component for the articles *@
1764
1765 @helper RenderArticleImage(ArticleImage settings)
1766 {
1767 dynamic[] methodParameters = new dynamic[1];
1768 methodParameters[0] = settings;
1769 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleImageCustom");
1770
1771 if (customMethod != null)
1772 {
1773 @customMethod.Invoke(this, methodParameters).ToString();
1774 }
1775 else
1776 {
1777 if (settings.Image != null)
1778 {
1779 if (settings.Image.Path != null)
1780 {
1781 <div class="u-margin-bottom--lg">
1782 @RenderImage(settings.Image)
1783 </div>
1784 }
1785 }
1786 }
1787 }
1788 @using System.Reflection
1789 @using Dynamicweb.Rapido.Blocks.Components
1790 @using Dynamicweb.Rapido.Blocks.Components.Articles
1791
1792
1793 @* Component for the articles *@
1794
1795 @helper RenderArticleSubHeader(ArticleSubHeader settings)
1796 {
1797 dynamic[] methodParameters = new dynamic[1];
1798 methodParameters[0] = settings;
1799 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSubHeaderCustom");
1800
1801 if (customMethod != null)
1802 {
1803 @customMethod.Invoke(this, methodParameters).ToString();
1804 } else {
1805 if (!String.IsNullOrEmpty(settings.Title))
1806 {
1807 <h2 class="article__header">@settings.Title</h2>
1808 }
1809 }
1810 }
1811 @using System.Reflection
1812 @using Dynamicweb.Rapido.Blocks.Components
1813 @using Dynamicweb.Rapido.Blocks.Components.Articles
1814 @using Dynamicweb.Rapido.Blocks
1815
1816
1817 @* Component for the articles *@
1818
1819 @helper RenderArticleText(ArticleText settings)
1820 {
1821 dynamic[] methodParameters = new dynamic[1];
1822 methodParameters[0] = settings;
1823 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleTextCustom");
1824
1825 if (customMethod != null)
1826 {
1827 @customMethod.Invoke(this, methodParameters).ToString();
1828 } else {
1829 if (!String.IsNullOrEmpty(settings.Text))
1830 {
1831 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : "";
1832
1833 <div class="article__paragraph @greatTextClass">
1834 @settings.Text
1835 </div>
1836 }
1837 }
1838 }
1839 @using System.Reflection
1840 @using Dynamicweb.Rapido.Blocks.Components
1841 @using Dynamicweb.Rapido.Blocks.Components.Articles
1842 @using Dynamicweb.Rapido.Blocks
1843
1844
1845 @* Component for the articles *@
1846
1847 @helper RenderArticleQuote(ArticleQuote settings)
1848 {
1849 dynamic[] methodParameters = new dynamic[1];
1850 methodParameters[0] = settings;
1851 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleQuoteCustom");
1852
1853 if (customMethod != null)
1854 {
1855 @customMethod.Invoke(this, methodParameters).ToString();
1856 } else {
1857 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty);
1858
1859 <div class="grid u-padding-bottom--lg">
1860 @if (settings.Image != null)
1861 {
1862 if (settings.Image.Path != null) {
1863 <div class="grid__col-3">
1864 <div class="grid__cell-img">
1865 @{
1866 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author;
1867 settings.Image.CssClass += " article__image article__image--ball";
1868 settings.Image.ImageDefault.Width = 200;
1869 settings.Image.ImageDefault.Height = 200;
1870 }
1871 @RenderImage(settings.Image)
1872 </div>
1873 </div>
1874 }
1875 }
1876 <div class="grid__col-auto">
1877 @if (!String.IsNullOrEmpty(settings.Text))
1878 {
1879 <div class="article__quote dw-mod">
1880 <i class="fas fa-quote-right u-margin-bottom--lg"></i>
1881 @settings.Text
1882 <i class="fas fa-quote-right"></i>
1883 </div>
1884 }
1885 @if (!String.IsNullOrEmpty(settings.Author))
1886 {
1887 <div class="article__quote-author dw-mod">
1888 - @settings.Author
1889 </div>
1890 }
1891 </div>
1892 </div>
1893 }
1894 }
1895 @using System.Reflection
1896 @using Dynamicweb.Rapido.Blocks.Components
1897 @using Dynamicweb.Rapido.Blocks.Components.Articles
1898 @using Dynamicweb.Rapido.Blocks
1899
1900 @* Component for the articles *@
1901
1902 @helper RenderArticleInfoTable(ArticleInfoTable settings)
1903 {
1904 dynamic[] methodParameters = new dynamic[1];
1905 methodParameters[0] = settings;
1906 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleInfoTableCustom");
1907
1908 if (customMethod != null)
1909 {
1910 @customMethod.Invoke(this, methodParameters).ToString();
1911 } else {
1912 <table class="table table--clean">
1913 @foreach (var row in settings.Rows)
1914 {
1915 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two";
1916
1917 <tr>
1918 @if (!String.IsNullOrEmpty(row.Icon))
1919 {
1920 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td>
1921 }
1922 <td class="u-no-margin-on-p-elements">
1923 <div class="u-bold">@row.Title</div>
1924 @if (!String.IsNullOrEmpty(row.SubTitle))
1925 {
1926 if (row.Link == null)
1927 {
1928 <div>@row.SubTitle</div>
1929 }
1930 else
1931 {
1932 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a>
1933 }
1934 }
1935 </td>
1936 </tr>
1937 }
1938 </table>
1939 }
1940 }
1941 @using System.Reflection
1942 @using Dynamicweb.Rapido.Blocks.Components
1943 @using Dynamicweb.Rapido.Blocks.Components.Articles
1944 @using Dynamicweb.Rapido.Blocks
1945
1946 @* Component for the articles *@
1947
1948 @helper RenderArticleGalleryModal(ArticleGalleryModal settings)
1949 {
1950 dynamic[] methodParameters = new dynamic[1];
1951 methodParameters[0] = settings;
1952 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
1953
1954 if (customMethod != null)
1955 {
1956 @customMethod.Invoke(this, methodParameters).ToString();
1957 }
1958 else
1959 {
1960 <input type="checkbox" id="ParagraphGalleryTrigger" class="modal-trigger" />
1961 <div class="modal-container">
1962 <label for="ParagraphGalleryTrigger" id="ParagraphGalleryOverlay" class="modal-overlay"></label>
1963 <div class="modal modal--full" id="ParagraphGallery">
1964 <div class="modal__body modal__body--full">
1965 <img src="/Files/Images/placeholder.gif" alt="" id="ParagraphGalleryModalImage" style="margin: 0 auto;" />
1966 <div class="u-padding u-ta-center" id="ParagraphGalleryModalCaption"></div>
1967 <label class="modal__close-btn dw-mod" for="ParagraphGalleryTrigger"></label>
1968 </div>
1969 </div>
1970 </div>
1971 <script>
1972 function showImageInModal(image) {
1973 let imageNode = document.getElementById('ParagraphGalleryModalImage');
1974 let captionNode = document.getElementById('ParagraphGalleryModalCaption');
1975 let trigger = document.getElementById('ParagraphGalleryTrigger');
1976 imageNode.src = image.src;
1977 if (image.alt != "") {
1978 captionNode.innerText = image.alt;
1979 imageNode.alt = image.alt;
1980 captionNode.style.display = "block";
1981 } else {
1982 captionNode.style.display = "none";
1983 }
1984 trigger.checked = true;
1985 }
1986 </script>
1987 }
1988 }
1989 @using System.Reflection
1990 @using Dynamicweb.Rapido.Blocks.Components
1991 @using Dynamicweb.Rapido.Blocks.Components.Articles
1992 @using Dynamicweb.Rapido.Blocks
1993
1994
1995 @* Component for the articles *@
1996
1997 @helper RenderArticleRelated(ArticleRelated settings)
1998 {
1999 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : "";
2000 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : "";
2001
2002 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width">
2003 <div class="center-container dw-mod">
2004 <div class="grid u-padding">
2005 <div class="grid__col-md-12 grid__col-xs-12">
2006 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2>
2007 </div>
2008 </div>
2009
2010 <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>
2011
2012 <script id="RelatedSimpleTemplate" type="text/x-template">
2013 {{#.}}
2014 <div class="grid u-padding-bottom--lg">
2015 {{#Cases}}
2016 <div class="grid__col-3 image-hover--zoom dw-mod">
2017 <a href="{{link}}" class="u-full-height u-color-light--bg">
2018 {{#if image}}
2019 <div class="u-color-light--bg u-no-padding dw-mod">
2020 <div class="flex-img image-hover__wrapper">
2021 <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}}" />
2022 </div>
2023 </div>
2024 {{/if}}
2025
2026 <div class="card u-color-light--bg dw-mod">
2027 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3>
2028 <p class="article__short-summary dw-mod">{{summary}}</p>
2029 </div>
2030 </a>
2031 </div>
2032 {{/Cases}}
2033 </div>
2034 {{/.}}
2035 </script>
2036 </div>
2037 </section>
2038 }
2039 @using System.Reflection
2040 @using Dynamicweb.Rapido.Blocks.Components
2041 @using Dynamicweb.Rapido.Blocks.Components.Articles
2042 @using Dynamicweb.Rapido.Blocks
2043
2044
2045 @* Component for the articles *@
2046
2047 @helper RenderArticleMenu(ArticleMenu settings)
2048 {
2049 dynamic[] methodParameters = new dynamic[1];
2050 methodParameters[0] = settings;
2051 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleMenuCustom");
2052
2053 if (customMethod != null)
2054 {
2055 @customMethod.Invoke(this, methodParameters).ToString();
2056 } else {
2057 if (!String.IsNullOrEmpty(settings.Title)) {
2058 <div class="u-margin u-border-bottom">
2059 <h3 class="u-no-margin">@settings.Title</h3>
2060 </div>
2061 }
2062
2063 <ul class="menu-left u-margin-bottom dw-mod">
2064 @foreach (var item in settings.Items)
2065 {
2066 @RenderArticleMenuItem(item)
2067 }
2068 </ul>
2069 }
2070 }
2071
2072 @helper RenderArticleMenuItem(ArticleMenuItem settings)
2073 {
2074 dynamic[] methodParameters = new dynamic[1];
2075 methodParameters[0] = settings;
2076 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleMenuItemCustom");
2077
2078 if (customMethod != null)
2079 {
2080 @customMethod.Invoke(this, methodParameters).ToString();
2081 } else {
2082 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#";
2083
2084 if (!String.IsNullOrEmpty(settings.Title)) {
2085 <li class="menu-left__item dw-mod">
2086 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a>
2087 </li>
2088 }
2089 }
2090 }
2091 @using System.Reflection
2092 @using Dynamicweb.Rapido.Blocks.Components
2093 @using Dynamicweb.Rapido.Blocks.Components.Articles
2094 @using Dynamicweb.Rapido.Blocks
2095
2096 @* Component for the articles *@
2097
2098 @helper RenderArticleList(ArticleList settings)
2099 {
2100 dynamic[] methodParameters = new dynamic[1];
2101 methodParameters[0] = settings;
2102 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListCustom");
2103
2104 if (customMethod != null)
2105 {
2106 @customMethod.Invoke(this, methodParameters).ToString();
2107 } else {
2108 if (Pageview != null)
2109 {
2110 bool isParagraph = Pageview.CurrentParagraph != null ? true : false;
2111 string[] sortArticlesListBy = new string[2];
2112
2113 if (isParagraph) {
2114 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2115 }
2116 else {
2117 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2118 }
2119
2120 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString();
2121
2122 @RenderItemList(new
2123 {
2124 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2125 ListSourceType = settings.SourceType,
2126 ListSourcePage = sourcePage,
2127 ItemFieldsList = "*",
2128 Filter = settings.Filter,
2129 ListOrderBy = sortArticlesListBy[0],
2130 ListOrderByDirection = sortArticlesListBy[1],
2131 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2132 ListSecondOrderByDirection = "ASC",
2133 IncludeAllChildItems = true,
2134 ListTemplate = settings.Template,
2135 ListPageSize = settings.PageSize.ToString()
2136 });
2137 }
2138 }
2139 }
2140 @using System.Reflection
2141 @using Dynamicweb.Rapido.Blocks.Components.Articles
2142
2143
2144 @* Component for the articles *@
2145
2146 @helper RenderArticleSummary(ArticleSummary settings)
2147 {
2148 dynamic[] methodParameters = new dynamic[1];
2149 methodParameters[0] = settings;
2150 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSummaryCustom");
2151
2152 if (customMethod != null)
2153 {
2154 @customMethod.Invoke(this, methodParameters).ToString();
2155 } else {
2156 if (!String.IsNullOrEmpty(settings.Text))
2157 {
2158 <div class="article__summary dw-mod">@settings.Text</div>
2159 }
2160 }
2161 }
2162 @using System.Reflection
2163 @using Dynamicweb.Rapido.Blocks.Components
2164 @using Dynamicweb.Rapido.Blocks.Components.Articles
2165 @using Dynamicweb.Rapido.Blocks
2166
2167 @* Component for the articles *@
2168
2169 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings)
2170 {
2171 dynamic[] methodParameters = new dynamic[1];
2172 methodParameters[0] = settings;
2173 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListCategoryFilterCustom");
2174
2175 if (customMethod != null)
2176 {
2177 @customMethod.Invoke(this, methodParameters).ToString();
2178 } else {
2179 string pageId = Pageview.ID.ToString();
2180 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All");
2181 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2182
2183 foreach (var option in settings.Categories)
2184 {
2185 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter;
2186 }
2187
2188 if (selectedFilter == pageId)
2189 {
2190 selectedFilter = Translate("All");
2191 }
2192
2193 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2194 {
2195 <div class="u-pull--right u-margin-left">
2196 <div class="collection u-no-margin">
2197 <h5>@Translate("Category")</h5>
2198 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2199 <div class="dropdown u-w180px dw-mod">
2200 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2201 <div class="dropdown__content dw-mod">
2202 @foreach (var option in settings.Categories)
2203 {
2204 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2205 }
2206 </div>
2207 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2208 </div>
2209 </div>
2210 </div>
2211 }
2212 else
2213 {
2214 <div class="u-full-width u-margin-bottom">
2215 <h5 class="u-no-margin">@Translate("Category")</h5>
2216 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2217 <div class="dropdown u-full-width dw-mod">
2218 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2219 <div class="dropdown__content dw-mod">
2220 @foreach (var option in settings.Categories)
2221 {
2222 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2223 }
2224 </div>
2225 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2226 </div>
2227 </div>
2228 }
2229 }
2230 }
2231 @using System.Reflection
2232 @using Dynamicweb.Rapido.Blocks.Components
2233 @using Dynamicweb.Rapido.Blocks.Components.Articles
2234 @using Dynamicweb.Rapido.Blocks
2235
2236 @* Component for the articles *@
2237
2238 @helper RenderArticleListFilter(ArticleListFilter settings)
2239 {
2240 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All");
2241 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2242
2243 if (settings.Options != null)
2244 {
2245 foreach (var option in settings.Options)
2246 {
2247 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter;
2248 }
2249
2250 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2251 {
2252 <div class="u-pull--right u-margin-left">
2253 <div class="collection u-no-margin">
2254 <h5>@settings.Label</h5>
2255 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
2256 <div class="dropdown u-w180px dw-mod">
2257 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
2258 <div class="dropdown__content dw-mod">
2259 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
2260 @foreach (var option in settings.Options)
2261 {
2262 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
2263 }
2264 </div>
2265 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
2266 </div>
2267 </div>
2268 </div>
2269 }
2270 else
2271 {
2272 <div class="u-full-width u-margin-bottom">
2273 <h5 class="u-no-margin">@settings.Label</h5>
2274 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
2275 <div class="dropdown u-full-width w-mod">
2276 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
2277 <div class="dropdown__content dw-mod">
2278 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
2279 @foreach (var option in settings.Options)
2280 {
2281 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
2282 }
2283 </div>
2284 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
2285 </div>
2286 </div>
2287 }
2288 }
2289 }
2290 @using System.Reflection
2291 @using Dynamicweb.Rapido.Blocks.Components
2292 @using Dynamicweb.Rapido.Blocks.Components.Articles
2293 @using Dynamicweb.Rapido.Blocks
2294
2295 @* Component for the articles *@
2296
2297 @helper RenderArticleListSearch(ArticleListSearch settings)
2298 {
2299 dynamic[] methodParameters = new dynamic[1];
2300 methodParameters[0] = settings;
2301 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListSearchCustom");
2302
2303 if (customMethod != null)
2304 {
2305 @customMethod.Invoke(this, methodParameters).ToString();
2306 } else {
2307 string searchString = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("Title")) ? HttpContext.Current.Request.QueryString.Get("Title").Trim('*') : "";
2308 string className = "u-w340px u-pull--right u-margin-left";
2309
2310 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
2311 {
2312 className = "u-full-width";
2313 }
2314
2315 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className">
2316 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('Title', '*' + document.getElementById('ArticleListSearchInput').value + '*')">
2317 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button>
2318 </div>
2319 }
2320 }
2321 @using System.Reflection
2322 @using Dynamicweb.Rapido.Blocks.Components
2323 @using Dynamicweb.Rapido.Blocks.Components.Articles
2324 @using Dynamicweb.Rapido.Blocks
2325
2326 @* Component for the articles *@
2327
2328 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings)
2329 {
2330 dynamic[] methodParameters = new dynamic[1];
2331 methodParameters[0] = settings;
2332 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListNoResultsInfoCustom");
2333
2334 if (customMethod != null)
2335 {
2336 @customMethod.Invoke(this, methodParameters).ToString();
2337 } else {
2338 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div>
2339 }
2340 }
2341 @using System.Reflection
2342 @using Dynamicweb.Rapido.Blocks.Components
2343 @using Dynamicweb.Rapido.Blocks.Components.General
2344 @using Dynamicweb.Rapido.Blocks.Components.Articles
2345 @using Dynamicweb.Rapido.Blocks
2346 @using System.Text.RegularExpressions
2347
2348 @* Component for the articles *@
2349
2350 @helper RenderArticleListItem(ArticleListItem settings)
2351 {
2352 switch (settings.Type) {
2353 case ArticleListItemType.Card:
2354 @RenderArticleListItemCard(settings);
2355 break;
2356 case ArticleListItemType.List:
2357 @RenderArticleListItemList(settings);
2358 break;
2359 case ArticleListItemType.Simple:
2360 @RenderArticleListItemSimple(settings);
2361 break;
2362 default:
2363 @RenderArticleListItemCard(settings);
2364 break;
2365 }
2366 }
2367
2368 @helper RenderArticleListItemCard(ArticleListItem settings) {
2369 <a href="@settings.Link" class="u-full-height u-color-light--bg">
2370 <div class="u-color-light--bg u-no-padding dw-mod">
2371 @if (settings.Logo != null)
2372 {
2373 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;" : "";
2374 settings.Logo.ImageDefault.Crop = 5;
2375 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
2376 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
2377 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
2378 @if (settings.Stickers != null)
2379 {
2380 if (settings.Stickers.Position != StickersListPosition.Custom)
2381 {
2382 @RenderStickersCollection(settings.Stickers);
2383 }
2384 }
2385 @RenderImage(settings.Logo)
2386 </div>
2387 } else if (settings.Image != null)
2388 {
2389 <div class="flex-img image-hover__wrapper u-position-relative dw-mod">
2390 @if (settings.Stickers != null)
2391 {
2392 if (settings.Stickers.Position != StickersListPosition.Custom)
2393 {
2394 @RenderStickersCollection(settings.Stickers);
2395 }
2396 }
2397 @RenderImage(settings.Image)
2398 </div>
2399 }
2400 </div>
2401
2402 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
2403 {
2404 <div class="card u-color-light--bg dw-mod">
2405 @if (settings.Stickers != null)
2406 {
2407 if (settings.Stickers.Position == StickersListPosition.Custom)
2408 {
2409 @RenderStickersCollection(settings.Stickers);
2410 }
2411 }
2412 @if (!String.IsNullOrEmpty(settings.Title))
2413 {
2414 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
2415 }
2416 @if (!String.IsNullOrEmpty(settings.SubTitle))
2417 {
2418 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2419 }
2420 @if (!String.IsNullOrEmpty(settings.Summary))
2421 {
2422 <p class="article__short-summary dw-mod">@settings.Summary</p>
2423 }
2424 </div>
2425 }
2426 </a>
2427 }
2428
2429 @helper RenderArticleListItemList(ArticleListItem settings) {
2430 <a href="@settings.Link">
2431 <div class="grid u-color-light--bg u-no-padding dw-mod">
2432 <div class="grid__col-md-3">
2433 <div class="u-color-light--bg u-no-padding dw-mod">
2434 @if (settings.Logo != null)
2435 {
2436 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;" : "";
2437 settings.Logo.ImageDefault.Crop = 5;
2438 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
2439 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
2440 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
2441 @if (settings.Stickers != null)
2442 {
2443 if (settings.Stickers.Position != StickersListPosition.Custom)
2444 {
2445 @RenderStickersCollection(settings.Stickers);
2446 }
2447 }
2448 @RenderImage(settings.Logo)
2449 </div>
2450 } else if (settings.Image != null)
2451 {
2452 <div class="flex-img image-hover__wrapper dw-mod">
2453 @if (settings.Stickers != null)
2454 {
2455 if (settings.Stickers.Position != StickersListPosition.Custom)
2456 {
2457 @RenderStickersCollection(settings.Stickers);
2458 }
2459 }
2460 @RenderImage(settings.Image)
2461 </div>
2462 }
2463 </div>
2464 </div>
2465
2466 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
2467 {
2468 <div class="grid__col-md-9">
2469 @if (!String.IsNullOrEmpty(settings.Title))
2470 {
2471 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
2472 }
2473 @if (settings.Stickers != null)
2474 {
2475 if (settings.Stickers.Position == StickersListPosition.Custom)
2476 {
2477 @RenderStickersCollection(settings.Stickers);
2478 }
2479 }
2480 @if (!String.IsNullOrEmpty(settings.SubTitle))
2481 {
2482 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2483 }
2484 @if (!String.IsNullOrEmpty(settings.Summary))
2485 {
2486 <p class="article__short-summary dw-mod">@settings.Summary</p>
2487 }
2488 </div>
2489 }
2490 </div>
2491 </a>
2492 }
2493
2494 @helper RenderArticleListItemSimple(ArticleListItem settings) {
2495 <a href="@settings.Link" class="u-color-inherit">
2496 <div class="grid u-color-light--bg u-no-padding dw-mod">
2497 <div class="grid__col-md-12">
2498 @if (!String.IsNullOrEmpty(settings.Title))
2499 {
2500 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div>
2501 }
2502 @if (!String.IsNullOrEmpty(settings.SubTitle))
2503 {
2504 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2505 }
2506 </div>
2507 </div>
2508 </a>
2509 }
2510 @using System.Reflection
2511 @using Dynamicweb.Rapido.Blocks.Components.Articles
2512
2513
2514 @* Component for the articles *@
2515
2516 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings)
2517 {
2518 dynamic[] methodParameters = new dynamic[1];
2519 methodParameters[0] = settings;
2520 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleAuthorAndDateCustom");
2521
2522 if (customMethod != null)
2523 {
2524 @customMethod.Invoke(this, methodParameters).ToString();
2525 } else {
2526 <small class="article__subscription">
2527 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
2528 {
2529 <text>@Translate("Written")</text>
2530 }
2531 @if (!string.IsNullOrWhiteSpace(settings.Author))
2532 {
2533 <text>@Translate("by") @settings.Author</text>
2534 }
2535 @if (!string.IsNullOrWhiteSpace(settings.Date))
2536 {
2537 <text>@Translate("on") @settings.Date</text>
2538 }
2539 </small>
2540 }
2541 }
2542 @using System.Reflection
2543 @using Dynamicweb.Rapido.Blocks.Components.Articles
2544
2545
2546 @* Component for the articles *@
2547
2548 @helper RenderArticleLink(ArticleLink settings)
2549 {
2550 dynamic[] methodParameters = new dynamic[1];
2551 methodParameters[0] = settings;
2552 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleLinkCustom");
2553
2554 if (customMethod != null)
2555 {
2556 @customMethod.Invoke(this, methodParameters).ToString();
2557 } else {
2558 if (!String.IsNullOrEmpty(settings.Title))
2559 {
2560 <div class="grid__cell">
2561 @RenderButton(settings)
2562 </div>
2563 }
2564 }
2565 }
2566 @using System.Reflection
2567 @using Dynamicweb.Rapido.Blocks
2568 @using Dynamicweb.Rapido.Blocks.Components.Articles
2569 @using Dynamicweb.Rapido.Blocks.Components.General
2570
2571
2572 @* Component for the articles *@
2573
2574 @helper RenderArticleCarousel(ArticleCarousel settings)
2575 {
2576 dynamic[] methodParameters = new dynamic[1];
2577 methodParameters[0] = settings;
2578 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
2579
2580 if (customMethod != null)
2581 {
2582 @customMethod.Invoke(this, methodParameters).ToString();
2583 } else {
2584 <div class="grid">
2585 <div class="grid__col-12">
2586 <div class="carousel" id="carousel_@settings.Id">
2587 <div class="carousel__container js-carousel-slides dw-mod">
2588 @RenderBlockList(settings.SubBlocks)
2589 </div>
2590 </div>
2591 </div>
2592 </div>
2593
2594 <script>
2595 document.addEventListener("DOMContentLoaded", function () {
2596 new CarouselModule("#carousel_@settings.Id", {
2597 slideTime: 0,
2598 dots: true
2599 });
2600 });
2601 </script>
2602 }
2603 }
2604
2605 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings)
2606 {
2607 dynamic[] methodParameters = new dynamic[1];
2608 methodParameters[0] = settings;
2609 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
2610
2611 if (customMethod != null)
2612 {
2613 @customMethod.Invoke(this, methodParameters).ToString();
2614 }
2615 else
2616 {
2617 string imageEngine = "/Admin/Public/GetImage.ashx?";
2618
2619 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image;
2620 if (settings.ImageSettings != null)
2621 {
2622 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : "";
2623 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : "";
2624 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&";
2625 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&";
2626 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&";
2627 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&";
2628 }
2629 defaultImage += "&Image=" + settings.Image;
2630
2631 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')">
2632 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title">
2633 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2>
2634 <div class="article-list__item-info">
2635 @if (settings.Stickers != null)
2636 {
2637 settings.Stickers.Position = StickersListPosition.Custom;
2638 @RenderStickersCollection(settings.Stickers);
2639 }
2640
2641 <small class="u-margin-top--lg u-color-light">
2642 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
2643 {
2644 <text>@Translate("Written")</text>
2645 }
2646 @if (!string.IsNullOrWhiteSpace(settings.Author))
2647 {
2648 <text>@Translate("by") @settings.Author</text>
2649 }
2650 @if (!string.IsNullOrWhiteSpace(settings.Date))
2651 {
2652 <text>@Translate("on") @settings.Date</text>
2653 }
2654 </small>
2655 </div>
2656
2657 <h3 class="article__short-summary u-color-light">@settings.Summary</h3>
2658 </a>
2659 @if (settings.UseFilters == true)
2660 {
2661 <div class="background-image image-filter image-filter--darken dw-mod"></div>
2662 }
2663 </div>
2664 }
2665 }
2666 @using System.Text.RegularExpressions
2667 @using Dynamicweb.Rapido.Blocks.Components
2668 @using Dynamicweb.Rapido.Blocks.Components.General
2669 @using Dynamicweb.Rapido.Blocks.Components.Articles
2670 @using Dynamicweb.Rapido.Blocks
2671
2672 @* Component for the articles *@
2673
2674 @helper RenderArticleVideo(ArticleVideo settings)
2675 {
2676 dynamic[] methodParameters = new dynamic[1];
2677 methodParameters[0] = settings;
2678 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleTextCustom");
2679
2680 if (customMethod != null)
2681 {
2682 @customMethod.Invoke(this, methodParameters).ToString();
2683 } else {
2684 if (settings.Url != null)
2685 {
2686 //getting video ID from youtube URL
2687 string videoCode = settings.Url;
2688 Regex regex = new Regex(@".be\/(.[^?]*)");
2689 Match match = regex.Match(videoCode);
2690 string videoId = "";
2691 if (match.Success)
2692 {
2693 videoId = match.Groups[1].Value;
2694 }
2695 else
2696 {
2697 regex = new Regex(@"v=([^&]+)");
2698 match = regex.Match(videoCode);
2699 if (match.Success)
2700 {
2701 videoId = match.Groups[1].Value;
2702 }
2703 }
2704
2705 int autoPlay = settings.AutoPlay == "true" ? 1 : 0;
2706
2707 <div class="video-wrapper">
2708 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div>
2709 </div>
2710 }
2711 }
2712 }
2713
2714
2715
2716 @* Simple helpers *@
2717
2718 @*Requires the Gallery ItemType that comes with Rapido*@
2719 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) {
2720 if (gallery != null && gallery.Count > 0)
2721 {
2722 int count = 1;
2723
2724 foreach (var item in gallery)
2725 {
2726 if (item.GetFile("ImagePath") != null)
2727 {
2728 string image = item.GetFile("ImagePath").PathUrlEncoded;
2729 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&height=820&crop=5&Compression=75&DoNotUpscale=1&image=";
2730 int imagesCount = gallery.Count;
2731
2732 if (count == 1)
2733 {
2734 <label class="gallery" for="GalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))">
2735 <span class="gallery__main-image">
2736 <img src="/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=1&image=@image" class="flex-img js-gallery" loading="lazy" alt="" data-for="FullImage" data-image="@imagePrefix@image" />
2737 </span>
2738 <span class="gallery__image-counter">
2739 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span>
2740 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span>
2741 </span>
2742 </label>
2743 }
2744 else
2745 {
2746 <div class="u-hidden js-gallery" data-for="FullImage" data-image="@imagePrefix@image"></div>
2747 }
2748
2749 count++;
2750 }
2751 }
2752 }
2753 }
2754
2755 @helper RenderArticleItemGalleryModal() {
2756 <!-- Trigger for the gallery modal -->
2757 <input type="checkbox" id="GalleryModalTrigger" class="modal-trigger" />
2758
2759 <!-- Gallery modal -->
2760 <div class="modal-container">
2761 <label for="GalleryModalTrigger" id="GalleryModalOverlay" class="modal-overlay"></label>
2762 <div class="modal modal--full" id="GalleryModal">
2763 <div class="modal__body modal__body--full">
2764 <div class="gallery-slider">
2765 <div class="gallery-slider__image">
2766 <img src="#" alt="" class="modal--full__img" id="FullImage" />
2767 </div>
2768 <div class="gallery-slider__image-counter" id="FullImage_counter"></div>
2769 <label class="gallery-slider__close-btn" for="GalleryModalTrigger"></label>
2770 <button class="gallery-slider__previous-btn" id="FullImage_prev" onclick="Gallery.prevImage('FullImage')"></button>
2771 <button class="gallery-slider__next-btn" id="FullImage_next" onclick="Gallery.nextImage('FullImage')"></button>
2772 </div>
2773 </div>
2774 </div>
2775 </div>
2776 }
2777
2778
2779 @helper RenderMobileFilters(List<Block> subBlocks)
2780 {
2781 if (subBlocks.Count > 0)
2782 {
2783 <div class="grid__col-12">
2784 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" />
2785 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters">
2786 @RenderBlockList(subBlocks)
2787 </div>
2788 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label>
2789 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label>
2790 </div>
2791 }
2792 }
2793
2794 @if (File.Exists(HttpContext.Current.Server.MapPath("/Components/Custom/Custom__Components.cshtml")))
2795 {
2796 <text>[Include file 'Components/Custom/Custom__Components.cshtml' not found in 'Templates/Designs/Rapido/Master.cshtml']</text>
2797 }
2798
2799
2800 @* Include the Blocks for the page *@
2801 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2802
2803 @using System
2804 @using System.Web
2805 @using System.Collections.Generic
2806 @using Dynamicweb.Rapido.Blocks.Extensibility
2807 @using Dynamicweb.Rapido.Blocks
2808
2809 @{
2810 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
2811
2812 Block tagManager = new Block()
2813 {
2814 Id = "TagManager",
2815 SortId = 1,
2816 Template = RenderGoogleTagManager()
2817 };
2818
2819 Block facebookPixel = new Block()
2820 {
2821 Id = "FacebookPixel",
2822 SortId = 2,
2823 Template = RenderFacebookPixel()
2824 };
2825
2826 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManager);
2827 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel);
2828 }
2829
2830 @helper RenderGoogleTagManager() {
2831 string GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID");
2832
2833 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
2834 {
2835 <script>
2836 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
2837 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
2838 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
2839 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
2840 })(window,document,'script','dataLayer','@GoogleTagManagerID');
2841 </script>
2842 <!-- Google Tag Manager (noscript) -->
2843 <noscript>
2844 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
2845 height="0" width="0" style="display:none;visibility:hidden"></iframe>
2846 </noscript>
2847 <!-- End Google Tag Manager (noscript) -->
2848 }
2849 }
2850
2851 @helper RenderFacebookPixel() {
2852 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID");
2853
2854 if (!string.IsNullOrWhiteSpace(FacebookPixelID))
2855 {
2856 <!-- Facebook Pixel Code -->
2857 <script>
2858 !function(f,b,e,v,n,t,s)
2859 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
2860 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
2861 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
2862 n.queue=[];t=b.createElement(e);t.async=!0;
2863 t.src=v;s=b.getElementsByTagName(e)[0];
2864 s.parentNode.insertBefore(t,s)}(window, document,'script',
2865 'https://connect.facebook.net/en_US/fbevents.js');
2866 fbq('init', '@FacebookPixelID');
2867 fbq('track', 'PageView');
2868 </script>
2869 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
2870 }
2871 }
2872 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2873
2874 @using System
2875 @using System.Web
2876 @using System.Collections.Generic
2877 @using Dynamicweb.Rapido.Blocks
2878 @using Dynamicweb.Rapido.Blocks.Extensibility
2879 @using Dynamicweb.Security.UserManagement
2880 @using Dynamicweb.Security.UserManagement.ExternalAuthentication
2881 @{
2882 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master");
2883
2884 Block loginModal = new Block()
2885 {
2886 Id = "LoginModal",
2887 SortId = 10,
2888 Template = LoginModal()
2889 };
2890
2891 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal);
2892 }
2893
2894 @helper LoginModal() {
2895 int pageId = Model.TopPage.ID;
2896 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
2897 string userSignedInErrorText = "";
2898 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
2899 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
2900 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
2901
2902 if (Model.LogOnFailed) {
2903 switch (Model.LogOnFailedReason)
2904 {
2905 case LogOnFailedReason.PasswordLengthInvalid:
2906 userSignedInErrorText = Translate("Password length is invalid");
2907 break;
2908 case LogOnFailedReason.IncorrectLogin:
2909 userSignedInErrorText = Translate("Invalid email or password");
2910 break;
2911 case LogOnFailedReason.ExceededFailedLogOnLimit:
2912 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
2913 break;
2914 case LogOnFailedReason.LoginLocked:
2915 userSignedInErrorText = Translate("The user account is temporarily locked");
2916 break;
2917 case LogOnFailedReason.PasswordExpired:
2918 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
2919 break;
2920 default:
2921 userSignedInErrorText = Translate("An unknown error occured");
2922 break;
2923 }
2924 }
2925
2926 <!-- Trigger for the login modal 19/06/2020: Commented out because it kept triggering for CBO even though no login is possible -->
2927 @* <input type="checkbox" id="SignInModalTrigger" class="modal-trigger" @userSignedInError /> *@
2928
2929 <!-- Login modal -->
2930 <div class="modal-container">
2931 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
2932 <div class="modal modal--xs" id="SignInModal">
2933 <div class="modal__header">
2934 <h2>@Translate("Sign in")</h2>
2935 </div>
2936 <div class="modal__body">
2937 <form method="post" id="LoginForm" class="u-no-margin">
2938 <input type="hidden" name="ID" value="@pageId" />
2939 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
2940 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
2941 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate("Email")" />
2942 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate("Password")" />
2943 <div class="field-error dw-mod">@userSignedInErrorText</div>
2944
2945 <div class="form__field-group dw-mod">
2946 <input type="checkbox" id="LoginRememberMe" name="Autologin" checked="checked" value="True" class="form__control">
2947 <label for="LoginRememberMe">
2948 @Translate("Remember me", "Remember me")
2949 </label>
2950 </div>
2951
2952 <button type="submit" class="btn btn--primary btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
2953 @{
2954 ProviderCollection providers = Provider.GetActiveProviders();
2955 }
2956
2957 @foreach(Provider LoginProvider in providers)
2958 {
2959 var ProviderName = LoginProvider.Name.ToLower();
2960 <a href="/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=@LoginProvider.ID" title="@LoginProvider.Name" class="btn btn--clean btn--condensed u-color-@ProviderName dw-mod"><i class="fab fa-@ProviderName fa-1_5x"></i></a>
2961 }
2962
2963 <a class="btn btn--link-clean dw-mod" href="@forgotPasswordPageLink">@Translate("Forgot your password?", "Forgot your password?")</a>
2964
2965 <a class="btn btn--link-clean dw-mod" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
2966 </form>
2967 </div>
2968 </div>
2969 </div>
2970 }
2971
2972 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
2973 {
2974 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2975
2976 @using System
2977 @using System.Web
2978 @using System.Collections.Generic
2979 @using Dynamicweb.Rapido.Blocks.Extensibility
2980 @using Dynamicweb.Rapido.Blocks
2981
2982
2983 @functions {
2984 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
2985 }
2986
2987 @{
2988 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";
2989 bool hideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
2990 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
2991 bool hideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
2992
2993
2994 Block mobileHeader = new Block()
2995 {
2996 Id = "MobileTop",
2997 SortId = 10,
2998 Template = RenderMobileTop(),
2999 SkipRenderBlocksList = true
3000 };
3001 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader);
3002
3003 Block mobileHeaderNavigation = new Block()
3004 {
3005 Id = "MobileHeaderNavigation",
3006 SortId = 10,
3007 Template = RenderMobileHeaderNavigation(),
3008 SkipRenderBlocksList = true,
3009 BlocksList = new List<Block> {
3010 new Block {
3011 Id = "MobileHeaderNavigationTrigger",
3012 SortId = 10,
3013 Template = RenderMobileHeaderNavigationTrigger()
3014 }
3015 }
3016 };
3017 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation);
3018
3019
3020 Block mobileHeaderLogo = new Block()
3021 {
3022 Id = "MobileHeaderLogo",
3023 SortId = 20,
3024 Template = RenderMobileHeaderLogo(),
3025 SkipRenderBlocksList = true
3026 };
3027 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo);
3028
3029 Block mobileHeaderActions = new Block()
3030 {
3031 Id = "MobileHeaderActions",
3032 SortId = 30,
3033 Template = RenderMobileTopActions(),
3034 SkipRenderBlocksList = true
3035 };
3036 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions);
3037
3038 if (hideSearch == false)
3039 {
3040 Block mobileHeaderSearch = new Block
3041 {
3042 Id = "MobileHeaderSearch",
3043 SortId = 10,
3044 Template = RenderMobileTopSearch()
3045 };
3046 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch);
3047 }
3048
3049 Block mobileHeaderMiniCart;
3050
3051 if (!hideCart)
3052 {
3053 mobileHeaderMiniCart = new Block
3054 {
3055 Id = "MobileHeaderMiniCart",
3056 SortId = 20,
3057 Template = RenderMobileTopMiniCart()
3058 };
3059
3060 Block miniCartCounterScriptTemplate = new Block
3061 {
3062 Id = "MiniCartCounterScriptTemplate",
3063 Template = RenderMobileMiniCartCounterContent()
3064 };
3065 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
3066 } else {
3067 mobileHeaderMiniCart = new Block
3068 {
3069 Id = "MobileHeaderMiniCart",
3070 SortId = 20
3071 };
3072 }
3073
3074 if (!hideSearch) {
3075 Block mobileHeaderSearchBar = new Block()
3076 {
3077 Id = "MobileHeaderSearchBar",
3078 SortId = 30,
3079 Template = RenderMobileTopSearchBar()
3080 };
3081 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar);
3082 }
3083
3084 switch (mobileTopLayout)
3085 {
3086 case "nav-left":
3087 mobileHeaderNavigation.SortId = 10;
3088 mobileHeaderLogo.SortId = 20;
3089 mobileHeaderActions.SortId = 30;
3090 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3091 break;
3092 case "nav-right":
3093 mobileHeaderLogo.SortId = 10;
3094 mobileHeaderActions.SortId = 20;
3095 mobileHeaderNavigation.SortId = 30;
3096 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3097 break;
3098 case "nav-search-left":
3099 mobileHeaderNavigation.SortId = 10;
3100 mobileHeaderLogo.SortId = 20;
3101 mobileHeaderActions.SortId = 30;
3102 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3103 break;
3104 case "search-left":
3105 mobileHeaderActions.SortId = 10;
3106 mobileHeaderLogo.SortId = 20;
3107 mobileHeaderNavigation.SortId = 30;
3108 mobileHeaderMiniCart.SortId = 0;
3109 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3110 break;
3111 }
3112 }
3113
3114
3115 @helper RenderMobileTop() {
3116 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList();
3117
3118 <nav class="main-navigation-mobile dw-mod">
3119 <div class="center-container top-container__center-container dw-mod">
3120 <div class="grid grid--align-center">
3121 @RenderBlockList(subBlocks)
3122 </div>
3123 </div>
3124 </nav>
3125 }
3126
3127 @helper RenderMobileHeaderNavigation() {
3128 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList();
3129
3130 <div class="grid__col-auto-width">
3131 <ul class="menu dw-mod">
3132 @RenderBlockList(subBlocks)
3133 </ul>
3134 </div>
3135 }
3136
3137 @helper RenderMobileHeaderNavigationTrigger() {
3138 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3139 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label>
3140 </li>
3141 }
3142
3143 @helper RenderMobileHeaderLogo() {
3144 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList();
3145
3146 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";
3147 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : "";
3148 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
3149 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
3150
3151 string mobileLogo = "/Files/Images/logo-dynamicweb.png";
3152 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null)
3153 {
3154 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded;
3155 }
3156
3157 if (Path.GetExtension(mobileLogo).ToLower() != ".svg")
3158 {
3159 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&crop=5&Compression=75&image=" + mobileLogo;
3160 }
3161 else
3162 {
3163 mobileLogo = HttpUtility.UrlDecode(mobileLogo);
3164 }
3165
3166 <div class="grid__col-auto grid__col--bleed">
3167 <div class="grid__cell @centeredLogo">
3168 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod">
3169 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />
3170 </a>
3171 </div>
3172
3173 @RenderBlockList(subBlocks)
3174 </div>
3175 }
3176
3177 @helper RenderMobileTopActions() {
3178 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList();
3179
3180 <div class="grid__col-auto-width">
3181 <ul class="menu dw-mod">
3182 @RenderBlockList(subBlocks)
3183 </ul>
3184 </div>
3185 }
3186
3187 @helper RenderMobileTopSearch() {
3188 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3189 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
3190 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
3191 </label>
3192 </li>
3193 }
3194
3195 @helper RenderMobileTopMiniCart() {
3196 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3197 int cartPageId = GetPageIdByNavigationTag("CartPage");
3198 double cartProductsCount = Model.Cart.TotalProductsCount;
3199
3200 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper" onmouseenter="Cart.UpdateMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
3201 <div class="mini-cart dw-mod">
3202 <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">
3203 <div class="u-inline u-position-relative">
3204 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i>
3205 <div class="mini-cart__counter dw-mod">
3206 <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">
3207 <div class="js-mini-cart-counter-content">
3208 @cartProductsCount
3209 </div>
3210 </div>
3211 </div>
3212 </div>
3213 </a>
3214 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
3215 {
3216 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="miniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
3217 }
3218 </div>
3219 </li>
3220 }
3221
3222 @helper RenderMobileTopSearchBar()
3223 {
3224 string searchFeedId = "";
3225 string searchSecondFeedId = "";
3226 int groupsFeedId;
3227 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
3228 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
3229 string resultPageLink;
3230 string searchPlaceholder;
3231 string searchType = "product-search";
3232 string searchTemplate;
3233 string searchContentTemplate = "";
3234 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
3235 bool showGroups = true;
3236
3237 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
3238 {
3239 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3240 resultPageLink = contentSearchPageLink;
3241 searchPlaceholder = Translate("Search page");
3242 groupsFeedId = 0;
3243 searchType = "content-search";
3244 searchTemplate = "SearchPagesTemplate";
3245 showGroups = false;
3246 }
3247 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
3248 {
3249 searchFeedId = productsPageId + "&feed=true";
3250 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3251 resultPageLink = Converter.ToString(productsPageId);
3252 searchPlaceholder = Translate("Search products or pages");
3253 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3254 searchType = "combined-search";
3255 searchTemplate = "SearchProductsTemplateWrap";
3256 searchContentTemplate = "SearchPagesTemplateWrap";
3257 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3258 }
3259 else
3260 {
3261 resultPageLink = Converter.ToString(productsPageId);
3262 searchFeedId = productsPageId + "&feed=true";
3263 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3264 searchPlaceholder = Translate("Search products");
3265 searchTemplate = "SearchProductsTemplate";
3266 searchType = "product-search";
3267 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3268 }
3269
3270
3271 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" />
3272
3273 <div class="main-navigation-mobile typeahead-mobile dw-mod">
3274 <div class="center-container top-container__center-container dw-mod">
3275 <div class="grid">
3276 <div class="grid__col-auto">
3277 <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">
3278 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue">
3279 @if (string.IsNullOrEmpty(searchSecondFeedId))
3280 {
3281 <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>
3282 }
3283 else
3284 {
3285 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid">
3286 <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>
3287 <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>
3288 </div>
3289 }
3290 <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>
3291 </div>
3292 </div>
3293 <div class="grid__col-auto-width">
3294 <ul class="menu dw-mod">
3295 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3296 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
3297 <i class="fas fa-times fa-1_5x"></i>
3298 </label>
3299 </li>
3300 </ul>
3301 </div>
3302 </div>
3303 </div>
3304 </div>
3305 }
3306
3307 @helper RenderMobileMiniCartCounterContent()
3308 {
3309 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
3310 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
3311 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
3312
3313 <script id="MiniCartCounterContent" type="text/x-template">
3314 {{#.}}
3315 <div class="js-mini-cart-counter-content dw-mod">
3316 @if (showPriceInMiniCartCounter)
3317 {
3318 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
3319 }
3320 else
3321 {
3322 <text>{{numberofproducts}}</text>
3323 }
3324 </div>
3325 {{/.}}
3326 </script>
3327 }
3328 </text>
3329 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3330
3331 @using System
3332 @using System.Web
3333 @using System.Collections.Generic
3334 @using Dynamicweb.Rapido.Blocks.Extensibility
3335 @using Dynamicweb.Rapido.Blocks
3336
3337 @functions {
3338 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master");
3339 }
3340
3341 @{
3342 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
3343 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
3344 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
3345 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
3346 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
3347 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
3348
3349 Block mobileNavigation = new Block()
3350 {
3351 Id = "MobileNavigation",
3352 SortId = 10,
3353 Template = MobileNavigation(),
3354 SkipRenderBlocksList = true
3355 };
3356 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation);
3357
3358 if (Model.CurrentUser.ID > 0 && !hideMyProfileLink)
3359 {
3360 Block mobileNavigationSignIn = new Block
3361 {
3362 Id = "MobileNavigationSignIn",
3363 SortId = 10,
3364 Template = RenderMobileNavigationSignIn()
3365 };
3366 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn);
3367 }
3368
3369 Block mobileNavigationMenu = new Block
3370 {
3371 Id = "MobileNavigationMenu",
3372 SortId = 20,
3373 Template = RenderMobileNavigationMenu()
3374 };
3375 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu);
3376
3377 Block mobileNavigationActions = new Block
3378 {
3379 Id = "MobileNavigationActions",
3380 SortId = 30,
3381 Template = RenderMobileNavigationActions(),
3382 SkipRenderBlocksList = true
3383 };
3384 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions);
3385
3386 if (!navigationItemsHideSignIn)
3387 {
3388 if (Model.CurrentUser.ID <= 0)
3389 {
3390 Block mobileNavigationSignInAction = new Block
3391 {
3392 Id = "MobileNavigationSignInAction",
3393 SortId = 10,
3394 Template = RenderMobileNavigationSignInAction()
3395 };
3396 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction);
3397
3398 if (!hideCreateAccountLink)
3399 {
3400 Block mobileNavigationCreateAccountAction = new Block
3401 {
3402 Id = "MobileNavigationCreateAccountAction",
3403 SortId = 20,
3404 Template = RenderMobileNavigationCreateAccountAction()
3405 };
3406 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction);
3407 }
3408 }
3409 else
3410 {
3411 if (!hideMyOrdersLink)
3412 {
3413 Block mobileNavigationOrdersAction = new Block
3414 {
3415 Id = "MobileNavigationOrdersAction",
3416 SortId = 20,
3417 Template = RenderMobileNavigationOrdersAction()
3418 };
3419 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction);
3420 }
3421 if (!hideMyFavoritesLink)
3422 {
3423 Block mobileNavigationFavoritesAction = new Block
3424 {
3425 Id = "MobileNavigationFavoritesAction",
3426 SortId = 30,
3427 Template = RenderMobileNavigationFavoritesAction()
3428 };
3429 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction);
3430 }
3431 if (!hideMySavedCardsLink)
3432 {
3433 Block mobileNavigationSavedCardsAction = new Block
3434 {
3435 Id = "MobileNavigationFavoritesAction",
3436 SortId = 30,
3437 Template = RenderMobileNavigationSavedCardsAction()
3438 };
3439 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction);
3440 }
3441
3442 Block mobileNavigationSignOutAction = new Block
3443 {
3444 Id = "MobileNavigationSignOutAction",
3445 SortId = 40,
3446 Template = RenderMobileNavigationSignOutAction()
3447 };
3448 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction);
3449 }
3450 }
3451
3452 if (Model.Languages.Count > 1)
3453 {
3454 Block mobileNavigationLanguagesAction = new Block
3455 {
3456 Id = "MobileNavigationLanguagesAction",
3457 SortId = 50,
3458 Template = RenderMobileNavigationLanguagesAction()
3459 };
3460 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction);
3461 }
3462 }
3463
3464
3465 @helper MobileNavigation()
3466 {
3467 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList();
3468
3469 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
3470 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3471 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
3472 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
3473 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right";
3474
3475 <!-- Trigger for mobile navigation -->
3476 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" />
3477
3478 <!-- Mobile navigation -->
3479 <nav class="mobile-navigation mobile-navigation--@position dw-mod">
3480 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper">
3481 @RenderBlockList(subBlocks)
3482 </div>
3483 </nav>
3484
3485 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
3486
3487 if (!onlyPreview)
3488 {
3489 <div class="u-visually-hidden js-handlebars-root js-mini-cart" id="miniCart" data-template="MiniCartContent" data-cart-id="@cartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
3490 }
3491 }
3492
3493 @helper RenderMobileNavigationSignIn()
3494 {
3495 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3496 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
3497 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
3498 string myProfilePageLink = linkStart + myProfilePageId;
3499 string userName = Model.CurrentUser.FirstName ?? "";
3500 userName += " " + (Model.CurrentUser.LastName ?? "");
3501 userName += userName == "" && Model.CurrentUser.UserName != null ? Model.CurrentUser.UserName : "";
3502
3503 <ul class="menu menu-mobile">
3504 <li class="menu-mobile__item">
3505 <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>
3506 </li>
3507 </ul>
3508 }
3509
3510 @helper RenderMobileNavigationMenu()
3511 {
3512 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
3513 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt";
3514 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3";
3515 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
3516 int startLevel = renderPagesInToolBar ? 1 : 0;
3517
3518 @RenderNavigation(new
3519 {
3520 id = "mobilenavigation",
3521 cssclass = "menu menu-mobile dwnavigation",
3522 startLevel = @startLevel,
3523 ecomStartLevel = @startLevel + 1,
3524 endlevel = @levels,
3525 expandmode = "all",
3526 template = @menuTemplate
3527 })
3528
3529 if (isSlidesDesign)
3530 {
3531 <script>
3532 function goToLevel(level) {
document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%";
}
3533
3534 document.addEventListener('DOMContentLoaded', function () {
3535 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length);
3536 });
3537 </script>
3538 }
3539
3540 if (renderPagesInToolBar)
3541 {
3542 @RenderNavigation(new
3543 {
3544 id = "topToolsMobileNavigation",
3545 cssclass = "menu menu-mobile dwnavigation",
3546 template = "ToolsMenuForMobile.xslt"
3547 })
3548 }
3549 }
3550
3551 @helper RenderMobileNavigationActions()
3552 {
3553 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ;
3554
3555 <ul class="menu menu-mobile">
3556 @RenderBlockList(subBlocks)
3557 </ul>
3558 }
3559
3560 @helper RenderMobileNavigationSignInAction()
3561 {
3562 <li class="menu-mobile__item">
3563 <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>
3564 </li>
3565 }
3566
3567 @helper RenderMobileNavigationCreateAccountAction()
3568 {
3569 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
3570
3571 <li class="menu-mobile__item">
3572 <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>
3573 </li>
3574 }
3575
3576 @helper RenderMobileNavigationProfileAction()
3577 {
3578 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3579 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
3580 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
3581 string myProfilePageLink = linkStart + myProfilePageId;
3582
3583 <li class="menu-mobile__item">
3584 <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>
3585 </li>
3586 }
3587
3588 @helper RenderMobileNavigationOrdersAction()
3589 {
3590 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3591 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
3592 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
3593 string myOrdersPageLink = linkStart + myOrdersPageId;
3594 string ordersIcon = "fas fa-list";
3595
3596 <li class="menu-mobile__item">
3597 <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>
3598 </li>
3599 }
3600
3601 @helper RenderMobileNavigationFavoritesAction()
3602 {
3603 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3604 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
3605 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
3606 string myFavoritesPageLink = linkStart + myFavoritesPageId;
3607 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";
3608
3609
3610 <li class="menu-mobile__item">
3611 <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>
3612 </li>
3613 }
3614
3615 @helper RenderMobileNavigationSavedCardsAction()
3616 {
3617 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3618 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
3619 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
3620 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
3621 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";
3622
3623 <li class="menu-mobile__item">
3624 <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>
3625 </li>
3626 }
3627
3628 @helper RenderMobileNavigationSignOutAction()
3629 {
3630 int pageId = Model.TopPage.ID;
3631 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";
3632
3633 <li class="menu-mobile__item">
3634 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a>
3635 </li>
3636 }
3637
3638 @helper RenderMobileNavigationLanguagesAction()
3639 {
3640 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
3641
3642 string selectedLanguage = "";
3643 foreach (var lang in Model.Languages)
3644 {
3645 if (lang.IsCurrent)
3646 {
3647 selectedLanguage = lang.Name;
3648 }
3649 }
3650
3651 <li class="menu-mobile__item dw-mod">
3652 @if (isSlidesDesign)
3653 {
3654 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);">
3655 }
3656 else
3657 {
3658 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
3659 }
3660 <div class="menu-mobile__link__wrap">
3661 <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>
3662 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
3663 </div>
3664 <ul class="menu-mobile menu-mobile__submenu expand-menu">
3665 @if (isSlidesDesign)
3666 {
3667 <li class="menu-mobile__item dw-mod">
3668 <div class="menu-mobile__link__wrap">
3669 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" />
3670 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
3671 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
3672 </div>
3673 </li>
3674 }
3675 @foreach (var lang in Model.Languages)
3676 {
3677 <li class="menu-mobile__item dw-mod">
3678 <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>
3679 </li>
3680 }
3681 </ul>
3682 </li>
3683 }</text>
3684 }
3685 else
3686 {
3687 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3688
3689 @using System
3690 @using System.Web
3691 @using System.Collections.Generic
3692 @using Dynamicweb.Rapido.Blocks.Extensibility
3693 @using Dynamicweb.Rapido.Blocks
3694
3695 @functions {
3696 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master");
3697 }
3698
3699 @{
3700 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
3701 {
3702 Block masterTools = new Block()
3703 {
3704 Id = "MasterDesktopTools",
3705 SortId = 10,
3706 Template = RenderDesktopTools(),
3707 SkipRenderBlocksList = true,
3708 BlocksList = new List<Block>
3709 {
3710 new Block {
3711 Id = "MasterDesktopToolsText",
3712 SortId = 10,
3713 Template = RenderDesktopToolsText(),
3714 Design = new Design
3715 {
3716 Size = "auto",
3717 HidePadding = true,
3718 RenderType = RenderType.Column
3719 }
3720 },
3721 new Block {
3722 Id = "MasterDesktopToolsNavigation",
3723 SortId = 20,
3724 Template = RenderDesktopToolsNavigation(),
3725 Design = new Design
3726 {
3727 Size = "auto-width",
3728 HidePadding = true,
3729 RenderType = RenderType.Column
3730 }
3731 }
3732 }
3733 };
3734 headerBlocksPage.Add("MasterHeader", masterTools);
3735 }
3736
3737 Block masterDesktopExtra = new Block()
3738 {
3739 Id = "MasterDesktopExtra",
3740 SortId = 10,
3741 Template = RenderDesktopExtra(),
3742 SkipRenderBlocksList = true
3743 };
3744 headerBlocksPage.Add("MasterHeader", masterDesktopExtra);
3745
3746 Block masterDesktopNavigation = new Block()
3747 {
3748 Id = "MasterDesktopNavigation",
3749 SortId = 20,
3750 Template = RenderDesktopNavigation(),
3751 SkipRenderBlocksList = true
3752 };
3753 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation);
3754 }
3755
3756 @* Include the Blocks for the page *@
3757 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3758
3759 @using System
3760 @using System.Web
3761 @using Dynamicweb.Rapido.Blocks.Extensibility
3762 @using Dynamicweb.Rapido.Blocks
3763
3764 @{
3765 Block masterDesktopLogo = new Block
3766 {
3767 Id = "MasterDesktopLogo",
3768 SortId = 10,
3769 Template = RenderDesktopLogo(),
3770 Design = new Design
3771 {
3772 Size = "auto-width",
3773 HidePadding = true,
3774 RenderType = RenderType.Column,
3775 CssClass = "grid--align-self-center"
3776 }
3777 };
3778
3779 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo);
3780 }
3781
3782
3783 @helper RenderDesktopLogo()
3784 {
3785 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
3786 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
3787 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
3788 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
3789 if (Path.GetExtension(logo).ToLower() != ".svg")
3790 {
3791 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight");
3792 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40;
3793 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&crop=5&Compression=75&image=" + logo;
3794 }
3795 else
3796 {
3797 logo = HttpUtility.UrlDecode(logo);
3798 }
3799
3800 <div class="logo @alignClass dw-mod">
3801 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
3802 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" />
3803 </a>
3804 </div>
3805 }
3806 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3807
3808 @using System
3809 @using System.Web
3810 @using Dynamicweb.Rapido.Blocks.Extensibility
3811 @using Dynamicweb.Rapido.Blocks
3812
3813 @functions {
3814 bool isMegaMenu;
3815 }
3816
3817 @{
3818 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false;
3819 Block masterDesktopMenu = new Block
3820 {
3821 Id = "MasterDesktopMenu",
3822 SortId = 10,
3823 Template = RenderDesktopMenu(),
3824 Design = new Design
3825 {
3826 Size = "auto",
3827 HidePadding = true,
3828 RenderType = RenderType.Column
3829 }
3830 };
3831
3832 if (isMegaMenu)
3833 {
3834 masterDesktopMenu.Design.CssClass = "u-reset-position";
3835 }
3836
3837 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu);
3838 }
3839
3840 @helper RenderDesktopMenu()
3841 {
3842 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
3843 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : "";
3844 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
3845 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
3846 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders");
3847 int startLevel = renderPagesInToolBar ? 1 : 0;
3848
3849 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink");
3850
3851 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment">
3852 @if (!isMegaMenu)
3853 {
3854 @RenderNavigation(new
3855 {
3856 id = "topnavigation",
3857 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
3858 startLevel = startLevel,
3859 ecomStartLevel = startLevel + 1,
3860 endlevel = 5,
3861 expandmode = "all",
3862 template = "BaseMenuWithDropdown.xslt"
3863 });
3864 }
3865 else
3866 {
3867 @RenderNavigation(new
3868 {
3869 id = "topnavigation",
3870 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
3871 startLevel = startLevel,
3872 ecomStartLevel = startLevel + 1,
3873 endlevel = 5,
3874 promotionImage = megamenuPromotionImage,
3875 promotionLink = promotionLink,
3876 expandmode = "all",
3877 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(),
3878 template = "BaseMegaMenu.xslt"
3879 });
3880 }
3881 </div>
3882 }
3883 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3884
3885 @using System
3886 @using System.Web
3887 @using Dynamicweb.Rapido.Blocks.Extensibility
3888 @using Dynamicweb.Rapido.Blocks
3889
3890 @{
3891 Block masterDesktopActionsMenu = new Block
3892 {
3893 Id = "MasterDesktopActionsMenu",
3894 SortId = 10,
3895 Template = RenderDesktopActionsMenu(),
3896 Design = new Design
3897 {
3898 CssClass = "u-flex"
3899 },
3900 SkipRenderBlocksList = true
3901
3902 };
3903 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu);
3904
3905 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink")))
3906 {
3907 Block masterDesktopActionsHeaderButton = new Block
3908 {
3909 Id = "MasterDesktopActionsHeaderButton",
3910 SortId = 60,
3911 Template = RenderHeaderButton()
3912 };
3913 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton);
3914 }
3915 }
3916
3917 @helper RenderDesktopActionsMenu()
3918 {
3919 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList();
3920
3921 <ul class="menu dw-mod">
3922 @RenderBlockList(subBlocks)
3923 </ul>
3924 }
3925
3926 @helper RenderHeaderButton()
3927 {
3928 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText");
3929 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink");
3930 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : "";
3931
3932 <li class="menu__item menu__item--horizontal menu--clean dw-mod">
3933 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a>
3934 </li>
3935 }
3936 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3937
3938 @using System
3939 @using System.Web
3940 @using Dynamicweb.Core;
3941 @using System.Text.RegularExpressions
3942 @using Dynamicweb.Rapido.Blocks.Extensibility
3943 @using Dynamicweb.Rapido.Blocks
3944
3945 @{
3946 Block masterDesktopActionsMenuLanguageSelector = new Block
3947 {
3948 Id = "MasterDesktopActionsMenuLanguageSelector",
3949 SortId = 40,
3950 Template = RenderLanguageSelector()
3951 };
3952
3953 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector);
3954 }
3955
3956 @helper RenderLanguageSelector()
3957 {
3958 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
3959 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
3960 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
3961 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() : "";
3962
3963 if (Model.Languages.Count > 1)
3964 {
3965 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod">
3966 <div class="@menuLinkClass dw-mod">
3967 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i>
3968 </div>
3969 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell">
3970 @foreach (var lang in Model.Languages)
3971 {
3972 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name;
3973 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
3974 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
3975
3976 if (languageViewType == "flag-culture")
3977 {
3978 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName;
3979 }
3980
3981 if (languageViewType == "flag")
3982 {
3983 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>";
3984 }
3985
3986 if (languageViewType == "name")
3987 {
3988 langInfo = lang.Name;
3989 }
3990
3991 if (languageViewType == "culture")
3992 {
3993 langInfo = cultureName;
3994 }
3995
3996 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__item menu-dropdown__item--link dw-mod">@langInfo</a>
3997 }
3998 </div>
3999 </li>
4000 }
4001 }
4002 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4003
4004 @using System
4005 @using System.Web
4006 @using Dynamicweb.Rapido.Blocks.Extensibility
4007 @using Dynamicweb.Rapido.Blocks
4008
4009 @{
4010 Block masterDesktopActionsMenuSignIn = new Block
4011 {
4012 Id = "MasterDesktopActionsMenuSignIn",
4013 SortId = 20,
4014 Template = RenderSignIn()
4015 };
4016
4017 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn);
4018 }
4019
4020 @helper RenderSignIn()
4021 {
4022 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
4023 string userInitials = "";
4024 int pageId = Model.TopPage.ID;
4025 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4026 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
4027 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4028 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4029 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4030 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4031 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4032 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
4033 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
4034 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
4035 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
4036 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
4037 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
4038
4039 string linkStart = "/Default.aspx?ID=";
4040 if (Model.CurrentUser.ID <= 0)
4041 {
4042 linkStart += signInProfilePageId + "&RedirectPageId=";
4043 }
4044
4045 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
4046 string myProfilePageLink = linkStart + myProfilePageId;
4047 string myOrdersPageLink = linkStart + myOrdersPageId;
4048 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4049 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4050
4051 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
4052 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";
4053
4054 if (Model.CurrentUser.ID != 0)
4055 {
4056 if (!String.IsNullOrEmpty(Model.CurrentUser.Name))
4057 {
4058 string[] names = Model.CurrentUser.Name.Split(' ');
4059 userInitials += Model.CurrentUser.Name.Substring(0, 1);
4060
4061 if (names.Length > 1)
4062 {
4063 userInitials += names[names.Length - 1].Substring(0, 1);
4064 }
4065 }
4066 else
4067 {
4068 userInitials += Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName != "" ? Model.CurrentUser.FirstName.Substring(0, 1) : "";
4069 userInitials += Model.CurrentUser.LastName != null && Model.CurrentUser.LastName != "" ? Model.CurrentUser.LastName.Substring(0, 1) : "";
4070 userInitials += userInitials.Length == 1 && Model.CurrentUser.FirstName != null && Model.CurrentUser.FirstName.Length > 1 ? Model.CurrentUser.FirstName.Substring(1, 2) : "";
4071 userInitials += userInitials == "" && Model.CurrentUser.Email != null && Model.CurrentUser.Email.Length > 1 ? Model.CurrentUser.Email.Substring(0, 2) : "";
4072 userInitials += userInitials == "" ? Model.CurrentUser.UserName.Substring(0, 2) : "";
4073 }
4074 }
4075
4076 if (!navigationItemsHideSignIn)
4077 {
4078 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4079 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
4080 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4081
4082 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod">
4083 <div class="@menuLinkClass dw-mod">
4084 @if (Model.CurrentUser.ID <= 0)
4085 {
4086 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x"></i>
4087 }
4088 else
4089 {
4090 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>
4091 }
4092 </div>
4093 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod">
4094 <ul class="list list--clean dw-mod">
4095 @if (Model.CurrentUser.ID <= 0)
4096 {
4097 <li>
4098 <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>
4099 </li>
4100
4101 if (!hideCreateAccountLink)
4102 {
4103 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"));
4104 }
4105 if (!hideForgotPasswordLink)
4106 {
4107 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
4108 }
4109 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
4110 {
4111 @RenderSeparator()
4112 }
4113 }
4114 @if (!hideMyProfileLink)
4115 {
4116 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
4117 }
4118 @if (!hideMyOrdersLink)
4119 {
4120 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
4121 }
4122 @if (!hideMyFavoritesLink)
4123 {
4124 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
4125 }
4126 @if (!hideMySavedCardsLink)
4127 {
4128 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
4129 }
4130 @if (Model.CurrentUser.ID > 0)
4131 {
4132 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
4133 {
4134 @RenderSeparator()
4135 }
4136
4137 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
4138 }
4139 </ul>
4140 </div>
4141 </li>
4142 }
4143 }
4144
4145 @helper RenderListItem(string link, string text, string icon = null) {
4146 <li>
4147 <a href="@link" class="list__link dw-mod">
4148 @if (!string.IsNullOrEmpty(icon))
4149 {
4150 <i class="@icon u-margin-right"></i>
4151 }
4152 @text
4153 </a>
4154 </li>
4155 }
4156
4157 @helper RenderSeparator()
4158 {
4159 <li class="list__seperator dw-mod"></li>
4160 }
4161 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4162
4163 @using System
4164 @using System.Web
4165 @using Dynamicweb.Rapido.Blocks.Extensibility
4166 @using Dynamicweb.Rapido.Blocks
4167
4168 @{
4169 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
4170
4171 Block masterDesktopActionsMenuFavorites = new Block
4172 {
4173 Id = "MasterDesktopActionsMenuFavorites",
4174 SortId = 30,
4175 Template = RenderFavorites()
4176 };
4177
4178 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0)
4179 {
4180 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites);
4181 }
4182 }
4183
4184 @helper RenderFavorites()
4185 {
4186 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4187 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId;
4188
4189 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4190 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
4191 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4192
4193 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
4194 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod">
4195 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i>
4196 </a>
4197 </li>
4198 }
4199 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4200
4201 @using System
4202 @using System.Web
4203 @using Dynamicweb.Rapido.Blocks.Extensibility
4204 @using Dynamicweb.Rapido.Blocks
4205
4206 @{
4207 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
4208 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
4209 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
4210
4211 if (!onlyPreview && !hideCart)
4212 {
4213 Block masterDesktopActionsMenuMiniCart = new Block
4214 {
4215 Id = "MasterDesktopActionsMenuMiniCart",
4216 SortId = 50,
4217 Template = RenderMiniCart(miniCartLayout == "dropdown"),
4218 SkipRenderBlocksList = true,
4219 BlocksList = new List<Block>()
4220 };
4221
4222 Block miniCartCounterScriptTemplate = new Block
4223 {
4224 Id = "MiniCartCounterScriptTemplate",
4225 Template = RenderMiniCartCounterContent()
4226 };
4227
4228 //dropdown layout is default
4229 RazorEngine.Templating.TemplateWriter layoutTemplate = RenderMiniCartDropdownLayout();
4230 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate = RenderMiniCartTriggerLink();
4231
4232 switch (miniCartLayout)
4233 {
4234 case "panel":
4235 layoutTemplate = RenderMiniCartPanelLayout();
4236 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
4237 break;
4238 case "modal":
4239 layoutTemplate = RenderMiniCartModalLayout();
4240 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
4241 break;
4242 }
4243
4244 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
4245 {
4246 Id = "MiniCartTrigger",
4247 Template = miniCartTriggerTemplate
4248 });
4249
4250 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
4251 {
4252 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
4253 {
4254 Id = "MiniCartLayout",
4255 Template = layoutTemplate
4256 });
4257 }
4258
4259 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart);
4260 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
4261 }
4262 }
4263
4264 @helper RenderMiniCart(bool hasMouseEnterEvent)
4265 {
4266 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList();
4267 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4268 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean";
4269 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4270 string mouseEvent = "";
4271 string id = "MiniCart";
4272 if (hasMouseEnterEvent) {
4273 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\"";
4274 id = "miniCartTrigger";
4275 }
4276 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent>
4277 @RenderBlockList(subBlocks)
4278 </li>
4279 }
4280
4281 @helper RenderMiniCartTriggerLabel()
4282 {
4283 int cartPageId = GetPageIdByNavigationTag("CartPage");
4284 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
4285 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4286 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4287 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4288
4289 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
4290 <div class="u-inline u-position-relative">
4291 <i class="@cartIcon fa-1_5x"></i>
4292 @RenderMiniCartCounter()
4293 </div>
4294 </div>
4295 }
4296
4297 @helper RenderMiniCartTriggerLink()
4298 {
4299 int cartPageId = GetPageIdByNavigationTag("CartPage");
4300 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
4301 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4302 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4303
4304 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button">
4305 <div class="u-inline u-position-relative">
4306 <i class="@cartIcon fa-1_5x"></i>
4307 @RenderMiniCartCounter()
4308 </div>
4309 </a>
4310 }
4311
4312 @helper RenderMiniCartCounter()
4313 {
4314 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4315 string cartProductsCount = Model.Cart.TotalProductsCount.ToString();
4316 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
4317 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
4318 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : "";
4319 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : "";
4320
4321 if (showPrice && counterPosition == "right")
4322 {
4323 cartProductsCount = Translate("Cart") + "(" + cartProductsCount + ")";
4324 }
4325
4326 <div class="mini-cart__counter dw-mod">
4327 <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">
4328 <div class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()">
4329 @cartProductsCount
4330 @cartProductsTotalPrice
4331 </div>
4332 </div>
4333 </div>
4334 }
4335
4336 @helper RenderMiniCartCounterContent()
4337 {
4338 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
4339 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
4340 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
4341
4342 <script id="MiniCartCounterContent" type="text/x-template">
4343 {{#.}}
4344 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}">
4345 @if (showPriceInMiniCartCounter)
4346 {
4347 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
4348 }
4349 else
4350 {
4351 <text>{{numberofproducts}}</text>
4352 }
4353 </div>
4354 {{/.}}
4355 </script>
4356 }
4357
4358 @helper RenderMiniCartDropdownLayout()
4359 {
4360 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4361
4362 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown">
4363 <div class="mini-cart-dropdown__inner dw-mod">
4364 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3>
4365 <div class="mini-cart-dropdown__body u-flex dw-mod">
4366 <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>
4367 </div>
4368 </div>
4369 </div>
4370 }
4371
4372 @helper RenderMiniCartPanelLayout()
4373 {
4374 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4375
4376 <div class="mini-cart grid__cell dw-mod">
4377 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" />
4378 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block">
4379 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label>
4380 <div class="panel__content u-full-width dw-mod">
4381 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3>
4382 <div class="panel__content-body panel__content-body--cart dw-mod">
4383 <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>
4384 </div>
4385 </div>
4386 </div>
4387 </div>
4388 }
4389
4390 @helper RenderMiniCartModalLayout()
4391 {
4392 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4393 <div class="mini-cart grid__cell dw-mod">
4394 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" />
4395 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block">
4396 <label for="miniCartTrigger" class="modal-overlay"></label>
4397 <div class="modal modal--top-right dw-mod">
4398 <div class="modal__body u-flex grid--direction-column dw-mod">
4399 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3>
4400 <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>
4401 </div>
4402 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label>
4403 </div>
4404 </div>
4405 </div>
4406 }
4407 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4408
4409 @using System
4410 @using System.Web
4411 @using Dynamicweb.Rapido.Blocks.Extensibility
4412 @using Dynamicweb.Rapido.Blocks
4413
4414 @{
4415 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart");
4416
4417 Block masterDesktopActionsMenuDownloadCart = new Block
4418 {
4419 Id = "MasterDesktopActionsMenuDownloadCart",
4420 SortId = 35,
4421 Template = RenderDownloadCart()
4422 };
4423
4424 if (showDownloadCartLink && Model.CurrentUser.ID > 0)
4425 {
4426 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart);
4427 }
4428 }
4429
4430 @helper RenderDownloadCart()
4431 {
4432 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart");
4433 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId;
4434
4435 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4436 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
4437 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4438
4439 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
4440 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod">
4441 <i class="fas fa-cart-arrow-down fa-1_5x"></i>
4442 </a>
4443 </li>
4444 }
4445 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4446
4447 @using System
4448 @using System.Web
4449 @using Dynamicweb.Rapido.Blocks.Extensibility
4450 @using Dynamicweb.Rapido.Blocks
4451
4452 @functions {
4453 public class SearchConfiguration
4454 {
4455 public string searchFeedId { get; set; }
4456 public string searchSecondFeedId { get; set; }
4457 public int groupsFeedId { get; set; }
4458 public string resultPageLink { get; set; }
4459 public string searchPlaceholder { get; set; }
4460 public string searchType { get; set; }
4461 public string searchTemplate { get; set; }
4462 public string searchContentTemplate { get; set; }
4463 public string searchValue { get; set; }
4464 public bool showGroups { get; set; }
4465
4466 public SearchConfiguration()
4467 {
4468 searchFeedId = "";
4469 searchSecondFeedId = "";
4470 searchType = "product-search";
4471 searchContentTemplate = "";
4472 showGroups = true;
4473 }
4474 }
4475 }
4476 @{
4477 Block masterSearchBar = new Block
4478 {
4479 Id = "MasterSearchBar",
4480 SortId = 40,
4481 Template = RenderSearch("bar"),
4482 Design = new Design
4483 {
4484 Size = "auto",
4485 HidePadding = true,
4486 RenderType = RenderType.Column
4487 }
4488 };
4489
4490 Block masterSearchAction = new Block
4491 {
4492 Id = "MasterDesktopActionsMenuSearch",
4493 SortId = 10,
4494 Template = RenderSearch()
4495 };
4496
4497 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar);
4498 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction);
4499 }
4500
4501 @helper RenderSearch(string type = "mini-search")
4502 {
4503 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage"));
4504 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
4505 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch";
4506
4507 SearchConfiguration searchConfiguration = null;
4508
4509 switch (searchType) {
4510 case "contentSearch":
4511 searchConfiguration = new SearchConfiguration() {
4512 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
4513 resultPageLink = contentSearchPageLink,
4514 searchPlaceholder = Translate("Search page"),
4515 groupsFeedId = 0,
4516 searchType = "content-search",
4517 searchTemplate = "SearchPagesTemplate",
4518 showGroups = false
4519 };
4520 break;
4521 case "combinedSearch":
4522 searchConfiguration = new SearchConfiguration() {
4523 searchFeedId = productsPageId + "&feed=true",
4524 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
4525 resultPageLink = Converter.ToString(productsPageId),
4526 searchPlaceholder = Translate("Search products or pages"),
4527 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
4528 searchType = "combined-search",
4529 searchTemplate = "SearchProductsTemplateWrap",
4530 searchContentTemplate = "SearchPagesTemplateWrap",
4531 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
4532 };
4533 break;
4534 default: //productSearch
4535 searchConfiguration = new SearchConfiguration() {
4536 resultPageLink = Converter.ToString(productsPageId),
4537 searchFeedId = productsPageId + "&feed=true",
4538 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
4539 searchPlaceholder = Translate("Search products"),
4540 searchTemplate = "SearchProductsTemplate",
4541 searchType = "product-search",
4542 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
4543 };
4544 break;
4545 }
4546 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
4547
4548 if (type == "mini-search") {
4549 @RenderMiniSearch(searchConfiguration)
4550 } else {
4551 @RenderSearchBar(searchConfiguration)
4552 }
4553 }
4554
4555 @helper RenderSearchBar(SearchConfiguration options)
4556 {
4557 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar"
4558 data-page-size="7"
4559 data-search-feed-id="@options.searchFeedId"
4560 data-search-second-feed-id="@options.searchSecondFeedId"
4561 data-result-page-id="@options.resultPageLink"
4562 data-groups-page-id="@options.groupsFeedId"
4563 data-search-type="@options.searchType">
4564 @if (options.showGroups)
4565 {
4566 <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>
4567 <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>
4568 }
4569 <div class="typeahead-search-field">
4570 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue">
4571 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
4572 {
4573 <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>
4574 }
4575 else
4576 {
4577 <div class="dropdown dropdown--absolute-position dropdown--combined grid">
4578 <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>
4579 <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>
4580 </div>
4581 }
4582 </div>
4583 <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>
4584 </div>
4585 }
4586
4587 @helper RenderMiniSearch(SearchConfiguration options)
4588 {
4589 <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" onmouseover="document.getElementById('headerSearch').focus()">
4590 <div class="menu__link menu__link--icon dw-mod">
4591 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
4592 </div>
4593 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
4594 <div class="typeahead js-typeahead" id="ProductSearchBar"
4595 data-page-size="7"
4596 data-search-feed-id="@options.searchFeedId"
4597 data-search-second-feed-id="@options.searchSecondFeedId"
4598 data-result-page-id="@options.resultPageLink"
4599 data-search-type="@options.searchType">
4600 <div class="typeahead-search-field">
4601 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue">
4602 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
4603 {
4604 <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>
4605 }
4606 else
4607 {
4608 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
4609 <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>
4610 <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>
4611 </div>
4612 }
4613 </div>
4614 </div>
4615 </div>
4616 </li>
4617 }
4618 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4619
4620 @using System
4621 @using System.Web
4622 @using Dynamicweb.Rapido.Blocks.Extensibility
4623 @using Dynamicweb.Rapido.Blocks
4624
4625 @{
4626 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4627 bool hideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
4628
4629 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master");
4630
4631 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo");
4632 headerConfigurationPage.RemoveBlock(configDesktopLogo);
4633
4634 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu");
4635 headerConfigurationPage.RemoveBlock(configDesktopMenu);
4636
4637 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar");
4638 headerConfigurationPage.RemoveBlock(configSearchBar);
4639
4640 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch");
4641 headerConfigurationPage.RemoveBlock(configSearchAction);
4642
4643 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu");
4644 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu);
4645
4646 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra");
4647
4648 switch (topLayout)
4649 {
4650 case "condensed": //2
4651 configDesktopLogo.Design.Size = "auto-width";
4652 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
4653
4654 configDesktopMenu.SortId = 20;
4655 configDesktopMenu.Design.Size = "auto";
4656 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4657
4658 configDesktopActionsMenu.SortId = 30;
4659 configDesktopActionsMenu.Design.Size = "auto-width";
4660 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4661
4662 if (!hideSearch)
4663 {
4664 configSearchBar.SortId = 40;
4665 configSearchBar.Design.Size = "12";
4666 configDesktopExtra.SortId = 50;
4667 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
4668 }
4669 break;
4670 case "splitted": //3
4671 configDesktopLogo.Design.Size = "auto";
4672 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
4673
4674 if (!hideSearch)
4675 {
4676 configSearchBar.SortId = 20;
4677 configSearchBar.Design.Size = "auto";
4678 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
4679 }
4680
4681 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4682
4683 configDesktopActionsMenu.SortId = 20;
4684 configDesktopActionsMenu.Design.Size = "auto-width";
4685 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4686 break;
4687 case "minimal": //4
4688 configDesktopLogo.Design.Size = "auto-width";
4689 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
4690
4691 configDesktopMenu.Design.Size = "auto";
4692 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4693
4694 configDesktopActionsMenu.SortId = 20;
4695 configDesktopActionsMenu.Design.Size = "auto-width";
4696 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4697
4698 if (!hideSearch)
4699 {
4700 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
4701 }
4702 break;
4703 case "minimal-right": //5
4704 configDesktopLogo.Design.Size = "auto-width";
4705 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
4706
4707 configDesktopMenu.Design.Size = "auto";
4708 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4709
4710 configDesktopActionsMenu.SortId = 20;
4711 configDesktopActionsMenu.Design.Size = "auto-width";
4712 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4713
4714 if (!hideSearch)
4715 {
4716 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
4717 }
4718 break;
4719 case "two-lines": //6
4720 configDesktopLogo.Design.Size = "auto";
4721 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
4722
4723 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4724
4725 configDesktopActionsMenu.SortId = 20;
4726 configDesktopActionsMenu.Design.Size = "auto-width";
4727 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4728
4729 if (!hideSearch)
4730 {
4731 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
4732 }
4733 break;
4734 case "two-lines-centered": //7
4735 configDesktopLogo.Design.Size = "auto";
4736 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
4737
4738 configDesktopMenu.Design.Size = "auto-width";
4739 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4740
4741 configDesktopActionsMenu.SortId = 20;
4742 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
4743
4744 if (!hideSearch)
4745 {
4746 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
4747 }
4748 break;
4749 case "normal": //1
4750 default:
4751 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
4752
4753 if (!hideSearch)
4754 {
4755 configSearchBar.SortId = 20;
4756 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
4757 }
4758
4759 configDesktopActionsMenu.SortId = 30;
4760 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
4761
4762 configDesktopActionsMenu.Design.Size = "auto-width";
4763 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
4764 break;
4765 }
4766 }
4767 @if (File.Exists(HttpContext.Current.Server.MapPath("/Files/Templates/Designs/Rapido/MasterBlocks/HeaderBlocks/Custom__Blocks.cshtml")))
4768 {
4769 <text>[Include file 'HeaderBlocks/Custom__Blocks.cshtml' not found in 'Templates/Designs/Rapido/MasterBlocks/Header.cshtml']</text>
4770 }
4771
4772
4773 @helper RenderDesktopTools()
4774 {
4775 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList();
4776
4777 <div class="tools-navigation dw-mod">
4778 <div class="center-container grid top-container__center-container dw-mod">
4779 @RenderBlockList(subBlocks)
4780 </div>
4781 </div>
4782 }
4783
4784 @helper RenderDesktopToolsText()
4785 {
4786 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
4787 if (!string.IsNullOrEmpty(toolsText))
4788 {
4789 <div class="u-margin-top u-margin-bottom">@toolsText</div>
4790 }
4791 }
4792
4793 @helper RenderDesktopToolsNavigation()
4794 {
4795 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4796
4797 if (renderPagesInToolBar)
4798 {
4799 @RenderNavigation(new
4800 {
4801 id = "topToolsNavigation",
4802 cssclass = "menu menu-tools dw-mod dwnavigation",
4803 template = "TopMenu.xslt"
4804 })
4805 }
4806 }
4807
4808 @helper RenderDesktopNavigation()
4809 {
4810 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
4811 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4812 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : "";
4813 <nav class="main-navigation dw-mod">
4814 <div class="center-container top-container__center-container grid @alignClass dw-mod">
4815 @RenderBlockList(subBlocks)
4816 </div>
4817 </nav>
4818 }
4819
4820 @helper RenderDesktopExtra()
4821 {
4822 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList();
4823
4824 if (subBlocks.Count > 0)
4825 {
4826 <div class="header header-top dw-mod">
4827 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod">
4828 @RenderBlockList(subBlocks)
4829 </div>
4830 </div>
4831 }
4832 }</text>
4833 }
4834
4835 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4836
4837 @using System
4838 @using System.Web
4839 @using Dynamicweb.Rapido.Blocks.Extensibility
4840 @using Dynamicweb.Rapido.Blocks
4841
4842 @{
4843 Block impersonationBar = new Block
4844 {
4845 Id = "ImpersonationBar",
4846 SortId = 50,
4847 Template = RenderImpersonationBar(),
4848 Design = new Design
4849 {
4850 Size = "auto-width",
4851 HidePadding = true,
4852 RenderType = RenderType.Column
4853 }
4854 };
4855
4856 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
4857 {
4858 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar);
4859 }
4860 }
4861
4862 @helper RenderImpersonationBar()
4863 {
4864 int impersonationPageId = GetPageIdByNavigationTag("Impersonation");
4865
4866 <div class="u-color-warning--bg">
4867 <div class="center-container top-container__center-container dw-mod">
4868 @*Impersonation*@
4869 <div class="grid">
4870 <div class="grid--align-self-center grid__col-x">
4871 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
4872 {
4873 string stopImpersonateTranslation = Translate("Stop impersonation");
4874 string username = "";
4875 if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.FirstName) && !string.IsNullOrEmpty(Model.CurrentSecondaryUser.LastName))
4876 {
4877 username = Model.CurrentSecondaryUser.FirstName + " " + Model.CurrentSecondaryUser.LastName;
4878 }
4879 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Name))
4880 {
4881 username = Model.CurrentSecondaryUser.Name;
4882 }
4883 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Email))
4884 {
4885 username = Model.CurrentSecondaryUser.Email;
4886 }
4887 else
4888 {
4889 username = Model.CurrentSecondaryUser.UserName;
4890 }
4891 <div class="grid-cell">
4892 <div class="u-pull--left u-bold u-margin-top">
4893 <i class="fas fa-user-secret"></i>
4894 @Pageview.User.UserName<text> </text>@Translate("is impersonating")<text> </text>@username
4895 </div>
4896 <form method="post" class="u-pull--right u-no-margin">
4897 <input type="submit" class="btn btn--secondary dw-mod u-no-margin" name="DwExtranetRemoveSecondaryUser" value="@stopImpersonateTranslation">
4898 </form>
4899 </div>
4900 }
4901 else
4902 {
4903 string viewListTranslation = Translate("View the list of users you can impersonate");
4904 <div class="grid-cell u-bold">
4905 <i class="fas fa-user-secret"></i>
4906 <a href="/Default.aspx?ID=@impersonationPageId" title="@viewListTranslation" class="u-color-font-black">@viewListTranslation</a>
4907 </div>
4908 }
4909 </div>
4910 </div>
4911 </div>
4912 </div>
4913 }
4914 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4915
4916 @using System
4917 @using System.Web
4918 @using System.Collections.Generic
4919 @using Dynamicweb.Rapido.Blocks.Extensibility
4920 @using Dynamicweb.Rapido.Blocks
4921
4922 @{
4923 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
4924 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table";
4925
4926 Block orderLines = new Block
4927 {
4928 Id = "MiniCartOrderLines",
4929 SkipRenderBlocksList = true,
4930 BlocksList = new List<Block>
4931 {
4932 new Block {
4933 Id = "MiniCartOrderLinesList",
4934 SortId = 20,
4935 Template = RenderMiniCartOrderLinesList()
4936 }
4937 }
4938 };
4939
4940 Block orderlinesScriptTemplates = new Block
4941 {
4942 Id = "OrderlinesScriptTemplates"
4943 };
4944
4945 if (orderlinesView == "table")
4946 {
4947 orderLines.Template = RenderMiniCartOrderLinesTable();
4948 orderLines.BlocksList.Add(
4949 new Block {
4950 Id = "MiniCartOrderlinesTableHeader",
4951 SortId = 10,
4952 Template = RenderMiniCartOrderLinesHeader()
4953 }
4954 );
4955
4956 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates();
4957 }
4958 else
4959 {
4960 orderLines.Template = RenderMiniCartOrderLinesBlocks();
4961 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates();
4962 }
4963
4964 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates);
4965
4966 Block miniCartScriptTemplates = new Block()
4967 {
4968 Id = "MasterMiniCartTemplates",
4969 SortId = 1,
4970 Template = RenderMiniCartScriptTemplates(),
4971 SkipRenderBlocksList = true,
4972 BlocksList = new List<Block>
4973 {
4974 orderLines,
4975 new Block {
4976 Id = "MiniCartFooter",
4977 Template = RenderMiniCartFooter(),
4978 SortId = 50,
4979 SkipRenderBlocksList = true,
4980 BlocksList = new List<Block>
4981 {
4982 new Block {
4983 Id = "MiniCartFees",
4984 Template = RenderMiniCartFees(),
4985 SortId = 30
4986 },
4987 new Block {
4988 Id = "MiniCartPoints",
4989 Template = RenderMiniCartPoints(),
4990 SortId = 40
4991 },
4992 new Block {
4993 Id = "MiniCartTotal",
4994 Template = RenderMiniCartTotal(),
4995 SortId = 50
4996 },
4997 new Block {
4998 Id = "MiniCartActions",
4999 Template = RenderMiniCartActions(),
5000 SortId = 60
5001 }
5002 }
5003 }
5004 }
5005 };
5006
5007 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates);
5008 }
5009
5010 @helper RenderMiniCartScriptsTableTemplates()
5011 {
5012 <script id="MiniCartOrderline" type="text/x-template">
5013 {{#unless isEmpty}}
5014 <tr>
5015 <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}}"></a></td>
5016 <td class="u-va-middle">
5017 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a>
5018 {{#if variantname}}
5019 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a>
5020 {{/if}}
5021 {{#if unitname}}
5022 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div>
5023 {{/if}}
5024 </td>
5025 <td class="u-ta-right u-va-middle">{{quantity}}</td>
5026 <td class="u-ta-right u-va-middle">
5027 {{#if pointsTotal}}
5028 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
5029 {{else}}
5030 {{totalprice}}
5031 {{/if}}
5032 </td>
5033 </tr>
5034 {{/unless}}
5035 </script>
5036
5037 <script id="MiniCartOrderlineDiscount" type="text/x-template">
5038 {{#unless isEmpty}}
5039 <tr class="table__row--no-border">
5040 <td class="u-w60px"> </td>
5041 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td>
5042 <td class="u-ta-right"> </td>
5043 <td class="u-ta-right">{{totalprice}}</td>
5044 </tr>
5045 {{/unless}}
5046 </script>
5047 }
5048
5049 @helper RenderMiniCartScriptsListTemplates()
5050 {
5051 int cartOrderlinesFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
5052 <script id="MiniCartOrderline" type="text/x-template">
5053 {{#unless isEmpty}}
5054 <div class="mini-cart-orderline grid dw-mod">
5055 <div class="grid__col-4">
5056 <a href="{{link}}" class="{{hideimage}}">
5057 <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}}">
5058 </a>
5059 </div>
5060 <div class="grid__col-8">
5061 <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>
5062 {{#if variantname}}
5063 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div>
5064 {{/if}}
5065 {{#if unitname}}
5066 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div>
5067 {{/if}}
5068 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div>
5069
5070 <div class="grid__cell-footer">
5071 <div class="grid__cell">
5072 <div class="u-pull--left mini-cart-orderline__price dw-mod">
5073 {{#if pointsTotal}}
5074 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
5075 {{else}}
5076 {{totalprice}}
5077 {{/if}}
5078 </div>
5079 <button type="button" title="@Translate("Remove orderline")" class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" onclick="{{removeFromCartGoogleImpression}}; Cart.UpdateCart('Cart', '/Default.aspx?ID=@cartOrderlinesFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}', true);">@Translate("Remove")</button>
5080 </div>
5081 </div>
5082 </div>
5083 </div>
5084 {{/unless}}
5085 </script>
5086
5087 <script id="MiniCartOrderlineDiscount" type="text/x-template">
5088 {{#unless isEmpty}}
5089 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod">
5090 <div class="grid__col-4">
5091 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div>
5092 </div>
5093 <div class="grid__col-8">{{totalprice}}</div>
5094 </div>
5095 {{/unless}}
5096 </script>
5097 }
5098
5099 @helper RenderMiniCartScriptTemplates()
5100 {
5101 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
5102 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
5103 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage"));
5104
5105 <script id="MiniCartContent" type="text/x-template">
5106 {{#.}}
5107 {{#unless isEmpty}}
5108 @if (useGoogleTagManager)
5109 {
5110 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
5111 }
5112 @RenderBlockList(subBlocks)
5113 {{/unless}}
5114 {{#if isEmpty}}
5115 {{{locationReload '@cartPageLink'}}}
5116 {{/if}}
5117 {{/.}}
5118 </script>
5119 }
5120
5121 @helper RenderMiniCartOrderLinesTable()
5122 {
5123 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
5124
5125 <div class="u-overflow-auto">
5126 <table class="table mini-cart-table dw-mod">
5127 @RenderBlockList(subBlocks)
5128 </table>
5129 </div>
5130 }
5131
5132 @helper RenderMiniCartOrderLinesBlocks()
5133 {
5134 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
5135
5136 <div class="u-overflow-auto">
5137 @RenderBlockList(subBlocks)
5138 </div>
5139 }
5140
5141 @helper RenderMiniCartOrderLinesHeader()
5142 {
5143 <thead>
5144 <tr>
5145 <td> </td>
5146 <td>@Translate("Product")</td>
5147 <td class="u-ta-right">@Translate("Qty")</td>
5148 <td class="u-ta-right" width="120">@Translate("Price")</td>
5149 </tr>
5150 </thead>
5151 }
5152
5153 @helper RenderMiniCartOrderLinesList()
5154 {
5155 <text>
5156 {{#OrderLines}}
5157 {{#ifCond template "===" "CartOrderline"}}
5158 {{>MiniCartOrderline}}
5159 {{/ifCond}}
5160 {{#ifCond template "===" "CartOrderlineMobile"}}
5161 {{>MiniCartOrderline}}
5162 {{/ifCond}}
5163 {{#ifCond template "===" "CartOrderlineDiscount"}}
5164 {{>MiniCartOrderlineDiscount}}
5165 {{/ifCond}}
5166 {{/OrderLines}}
5167 </text>
5168 }
5169
5170 @helper RenderMiniCartFees()
5171 {
5172 <div class="grid u-border-top grid--external-bleed-bottom">
5173 <div class="grid__col-6">
5174 {{paymentmethod}}
5175 </div>
5176 <div class="grid__col-6 grid--align-end">{{paymentfee}}</div>
5177 </div>
5178 <div class="grid grid--external-bleed-bottom">
5179 <div class="grid__col-6">
5180 {{shippingmethod}}
5181 </div>
5182 <div class="grid__col-6 grid--align-end">{{shippingfee}}</div>
5183 </div>
5184 }
5185
5186 @helper RenderMiniCartFooter()
5187 {
5188 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList();
5189
5190 <div class="mini-cart__footer dw-mod">
5191 @RenderBlockList(subBlocks)
5192 </div>
5193 }
5194
5195 @helper RenderMiniCartActions()
5196 {
5197 int cartPageId = GetPageIdByNavigationTag("CartPage");
5198
5199 <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>
5200 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to checkout")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Proceed to checkout")</a>
5201 }
5202
5203 @helper RenderMiniCartPoints()
5204 {
5205 <text>
5206 {{#if earnings}}
5207 <div class="grid grid--external-bleed-bottom">
5208 <div class="grid__col-6">@Translate("Earnings")</div>
5209 <div class="grid__col-6 grid--align-end">
5210 <div>
5211 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")
5212 </div>
5213 </div>
5214 </div>
5215 {{/if}}
5216 </text>
5217 }
5218
5219 @helper RenderMiniCartTotal()
5220 {
5221 <div class="mini-cart-totals grid u-margin-bottom dw-mod">
5222 <div class="grid__col-6">@Translate("Total")</div>
5223 <div class="grid__col-6 grid--align-end">{{totalprice}}</div>
5224 </div>
5225 }
5226 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5227
5228 @using Dynamicweb.Rapido.Blocks.Extensibility
5229 @using Dynamicweb.Rapido.Blocks
5230
5231 @{
5232 bool addToCartNotificationOnlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
5233 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
5234
5235 if (!addToCartNotificationOnlyPreview && !string.IsNullOrEmpty(addToCartNotificationType)) {
5236 if (addToCartNotificationType == "modal")
5237 {
5238 Block addToCartNotificationModal = new Block
5239 {
5240 Id = "AddToCartNotificationModal",
5241 Template = RenderAddToCartNotificationModal()
5242 };
5243
5244 Block addToCartNotificationScript = new Block
5245 {
5246 Id = "AddToCartNotificationScript",
5247 Template = RenderAddToCartNotificationModalScript()
5248 };
5249 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal);
5250 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
5251 }
5252 else if (addToCartNotificationType == "toggle")
5253 {
5254 Block addToCartNotificationScript = new Block
5255 {
5256 Id = "AddToCartNotificationScript",
5257 Template = RenderAddToCartNotificationToggleScript()
5258 };
5259 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
5260 }
5261 }
5262 }
5263
5264 @helper RenderAddToCartNotificationModal()
5265 {
5266 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
5267 }
5268
5269 @helper RenderAddToCartNotificationModalScript()
5270 {
5271 int cartPageId = GetPageIdByNavigationTag("CartPage");
5272
5273 <script id="LastAddedProductTemplate" type="text/x-template">
5274 <!-- Trigger for the login modal -->
5275 <input type="checkbox" id="LastAddedProductModalTrigger" class="modal-trigger" />
5276
5277 <!-- Login modal -->
5278 <div class="modal-container">
5279 <label for="LastAddedProductModalTrigger" class="modal-overlay"></label>
5280 <div class="modal modal--md">
5281 <div class="modal__header">
5282 <h2>@Translate("Product is added to the cart")</h2>
5283 </div>
5284 <div class="modal__body">
5285 <div class="grid">
5286 <div class="grid__col-2">
5287 <a href="{{productInfo.link}}">
5288 <img src="{{productInfo.image}}" alt="{{productInfo.name}}" class="dw-mod" />
5289 </a>
5290 </div>
5291 <div class="u-padding grid--align-self-center">
5292 <span>{{quantity}}</span> x
5293 </div>
5294 <div class="grid__col-auto grid--align-self-center">
5295 <div>{{productInfo.name}}</div>
5296 {{#if productInfo.variantName}}
5297 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
5298 {{/if}}
5299 {{#if productInfo.unitName}}
5300 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
5301 {{/if}}
5302 </div>
5303 </div>
5304 <div class="modal__footer u-margin-top--lg">
5305 <label class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" for="LastAddedProductModalTrigger">@Translate("Continue shopping")</label>
5306 <a href="/Default.aspx?ID=@cartPageId" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a>
5307 </div>
5308 </div>
5309 <label class="modal__close-btn" for="LastAddedProductModalTrigger"></label>
5310 </div>
5311 </div>
5312 </script>
5313 <script>
5314 document.addEventListener('addToCart', function (event) {
5315 Cart.ShowLastAddedProductModal(event.detail);
5316 });
5317 </script>
5318 }
5319
5320 @helper RenderAddToCartNotificationToggleScript()
5321 {
5322 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5323
5324 <script>
5325 document.addEventListener('addToCart', function () {
5326 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
5327 });
5328 </script>
5329 }
5330 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5331
5332 @using System
5333 @using System.Web
5334 @using System.Collections.Generic
5335 @using Dynamicweb.Rapido.Blocks.Extensibility
5336 @using Dynamicweb.Rapido.Blocks
5337
5338 @functions {
5339 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
5340 }
5341
5342 @{
5343 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content");
5344 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content");
5345 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content");
5346 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header");
5347 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header");
5348 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header");
5349
5350 Block masterFooterContent = new Block()
5351 {
5352 Id = "MasterFooterContent",
5353 SortId = 10,
5354 Template = RenderFooter(),
5355 SkipRenderBlocksList = true
5356 };
5357 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
5358
5359 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
5360 {
5361 Block masterFooterColumnOne = new Block
5362 {
5363 Id = "MasterFooterColumnOne",
5364 SortId = 10,
5365 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
5366 Design = new Design {
5367 Size = "auto",
5368 RenderType = RenderType.Column
5369 }
5370 };
5371 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
5372 }
5373
5374 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
5375 {
5376 Block masterFooterColumnTwo = new Block
5377 {
5378 Id = "MasterFooterColumnTwo",
5379 SortId = 20,
5380 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent),
5381 Design = new Design
5382 {
5383 Size = "auto",
5384 RenderType = RenderType.Column
5385 }
5386 };
5387 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
5388 }
5389
5390 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
5391 {
5392 Block masterFooterColumnThree = new Block
5393 {
5394 Id = "MasterFooterColumnThree",
5395 SortId = 30,
5396 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent),
5397 Design = new Design
5398 {
5399 Size = "auto",
5400 RenderType = RenderType.Column
5401 }
5402 };
5403 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
5404 }
5405
5406 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
5407 {
5408 Block masterFooterNewsletterSignUp = new Block
5409 {
5410 Id = "MasterFooterNewsletterSignUp",
5411 SortId = 40,
5412 Template = RenderFooterNewsletterSignUp(),
5413 Design = new Design
5414 {
5415 Size = "auto",
5416 RenderType = RenderType.Column
5417 }
5418 };
5419 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp);
5420 }
5421
5422 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0)
5423 {
5424 Block masterFooterSocialLinks = new Block
5425 {
5426 Id = "MasterFooterSocialLinks",
5427 SortId = 50,
5428 Template = RenderFooterSocialLinks(),
5429 Design = new Design
5430 {
5431 Size = "auto",
5432 RenderType = RenderType.Column
5433 }
5434 };
5435 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
5436 }
5437
5438 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
5439 {
5440 Block masterFooterPayments = new Block
5441 {
5442 Id = "MasterFooterPayments",
5443 SortId = 60,
5444 Template = RenderFooterPayments(),
5445 Design = new Design
5446 {
5447 Size = "12",
5448 RenderType = RenderType.Column
5449 }
5450 };
5451 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
5452 }
5453
5454 Block masterFooterCopyright = new Block
5455 {
5456 Id = "MasterFooterCopyright",
5457 SortId = 70,
5458 Template = RenderFooterCopyright(),
5459 Design = new Design
5460 {
5461 Size = "12",
5462 RenderType = RenderType.Column
5463 }
5464 };
5465 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
5466 }
5467
5468 @helper RenderFooter() {
5469 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
5470
5471 <footer class="footer dw-mod">
5472 <div class="center-container top-container__center-container dw-mod">
5473 <div class="grid grid--external-bleed-x">
5474 @RenderBlockList(subBlocks)
5475 </div>
5476 </div>
5477 </footer>
5478 }
5479
5480 @helper RenderFooterColumn(string header, string content) {
5481 <h3 class="footer__heading dw-mod">@header</h3>
5482 <div class="footer__content dw-mod">
5483 @content
5484 </div>
5485 }
5486
5487 @helper RenderFooterNewsletterSignUp() {
5488 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString();
5489
5490 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
5491 <div class="footer__content dw-mod">
5492 <form class="form dw-mod" name="NewsletterRedirect" action='/Default.aspx' method="get" enctype="multipart/form-data">
5493 <input name="ID" value="@newsletterSignUpPageId" type="hidden" />
5494 <label for="NewsletterEmail" class="u-margin-bottom">@Translate("Sign up if you would like to receive occasional treats from us", "Sign up if you would like to receive occasional treats from us")</label>
5495 <div class="form__field-combi">
5496 <input name="NewsletterEmail" id="NewsletterEmail" type="text" placeholder='@Translate("Your email address", "Your email address")' class="u-full-width use-btn-primary-height" />
5497 <input class="btn btn--primary btn--condensed dw-mod" type="submit" id="Submitter" value='@Translate("Go", "Go")' />
5498 </div>
5499 </form>
5500 </div>
5501 }
5502
5503 @helper RenderFooterSocialLinks() {
5504 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3>
5505 <div class="footer__content dw-mod">
5506 <div class="collection dw-mod">
5507 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
5508 {
5509 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
5510 string socialIconClass = socialIcon.SelectedValue;
5511 string socialIconTitle = socialIcon.SelectedName;
5512 string socialLink = socialitem.GetString("Link");
5513
5514 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a>
5515 }
5516 </div>
5517 </div>
5518 }
5519
5520 @helper RenderFooterPayments() {
5521 <div class="footer__content dw-mod">
5522 <div class="collection dw-mod">
5523 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments"))
5524 {
5525 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel;
5526 string paymentImage = null;
5527 string paymentTitle = paymentItem.SelectedName;
5528 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault();
5529 if (selected != null)
5530 {
5531 paymentImage = selected.Icon;
5532 }
5533
5534 <div class="footer__card-type">
5535 <img src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" loading="lazy" alt="@paymentTitle" title="@paymentTitle" />
5536 </div>
5537 }
5538 </div>
5539 </div>
5540 }
5541
5542 @helper RenderFooterCopyright() {
5543 <div class="grid__col-12 footer__copyright dw-mod">
5544 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p>
5545 </div>
5546 }
5547 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
5548
5549 @using System
5550 @using System.Web
5551 @using System.Collections.Generic
5552 @using Dynamicweb.Rapido.Blocks.Extensibility
5553 @using Dynamicweb.Rapido.Blocks
5554 @using Dynamicweb.Ecommerce.Common
5555
5556 @{
5557 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
5558
5559 Block masterScriptReferences = new Block()
5560 {
5561 Id = "MasterScriptReferences",
5562 SortId = 1,
5563 Template = RenderMasterScriptReferences()
5564 };
5565 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
5566 }
5567
5568 @helper RenderMasterScriptReferences() {
5569 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"></script>
5570 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script>
5571
5572 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
5573 {
5574 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script>
5575 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js");
5576 }
5577
5578 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js");
5579 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js");
5580 }
5581 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5582
5583 @using System
5584 @using System.Web
5585 @using System.Collections.Generic
5586 @using Dynamicweb.Rapido.Blocks.Extensibility
5587 @using Dynamicweb.Rapido.Blocks
5588
5589 @{
5590 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
5591 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
5592
5593 if (!navigationItemsHideSearch)
5594 {
5595 Block masterSearchScriptTemplates = new Block()
5596 {
5597 Id = "MasterSearchScriptTemplates",
5598 SortId = 1,
5599 Template = RenderSearchScriptTemplates()
5600 };
5601
5602 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
5603 }
5604 }
5605
5606 @helper RenderSearchScriptTemplates()
5607 {
5608 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
5609 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
5610 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
5611 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
5612 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
5613 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults");
5614 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton");
5615 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton");
5616 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton");
5617 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
5618
5619 <script id="SearchGroupsTemplate" type="text/x-template">
5620 {{#.}}
5621 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
5622 {{/.}}
5623 </script>
5624
5625 <script id="SearchProductsTemplate" type="text/x-template">
5626 {{#each .}}
5627 {{#Product}}
5628 {{#ifCond template "!==" "SearchMore"}}
5629 <li class="dropdown__item dropdown__item--seperator dw-mod">
5630 @if (useFacebookPixel)
5631 {
5632 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
5633 }
5634 @if (useGoogleTagManager)
5635 {
5636 <text>{{{googleEnchantImpression 'Search results' currency googleImpression}}}</text>
5637 }
5638 <div>
5639 <a href="{{link}}" class="js-typeahead-link u-color-inherit u-pull--left" onclick="{{googleImpressionClick}}" title="{{name}}">
5640 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img loading="lazy" src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}"></div>
5641 <div class="u-pull--left">
5642 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}</div>
5643 @if (showPrice && !onlyPreview)
5644 {
5645 if (pointShopOnly)
5646 {
5647 <text>
5648 {{#if havePointPrice}}
5649 <div>
5650 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
5651 </div>
5652 {{else}}
5653 <small class="help-text u-no-margin">@Translate("Not available")</small>
5654 {{/if}}
5655 {{#unless canBePurchasedWithPoints}}
5656 {{#if havePointPrice}}
5657 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
5658 {{/if}}
5659 {{/unless}}
5660 </text>
5661 }
5662 else
5663 {
5664 <div>{{price}}</div>
5665 }
5666 }
5667 </div>
5668 </a>
5669 <div class="u-margin-left u-pull--right">
5670 @if (showAddToCartButton && !onlyPreview) {
5671 if (pointShopOnly)
5672 {
5673 <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"
5674 onclick="Cart.AddToCart(event, {
5675 id: '{{productId}}',
5676 quantity: 1,
5677 buyForPoints: true,
5678 productInfo: {{productInfo}}
5679 }); {{facebookPixelAction}}" {{disabledBuyButton}}>
5680 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
5681 </button>
5682 } else {
5683 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside"
5684 onclick="Cart.AddToCart(event, {
5685 id: '{{productId}}',
5686 quantity: 1,
5687 productInfo: {{productInfo}}
5688 }); {{facebookPixelAction}}">
5689 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
5690 </button>
5691 }
5692 <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>
5693 }
5694 else if (showViewButton)
5695 {
5696 <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>
5697 }
5698 @if (showAddToDownloadButton)
5699 {
5700 <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}}">
5701 <i class="fas fa-plus js-button-icon"></i>
5702 </button>
5703 }
5704 </div>
5705 </div>
5706 </li>
5707 {{/ifCond}}
5708 {{#ifCond template "===" "SearchMore"}}
5709 {{>SearchMoreProducts}}
5710 {{/ifCond}}
5711 {{/Product}}
5712 {{else}}
5713 <li class="dropdown__item dropdown__item--seperator dw-mod">
5714 @Translate("Your search gave 0 results")
5715 </li>
5716 {{/each}}
5717 </script>
5718
5719 <script id="SearchMoreProducts" type="text/x-template">
5720 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
5721 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
5722 @Translate("View all")
5723 </a>
5724 </li>
5725 </script>
5726
5727 <script id="SearchMorePages" type="text/x-template">
5728 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
5729 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
5730 @Translate("View all")
5731 </a>
5732 </li>
5733 </script>
5734
5735 <script id="SearchPagesTemplate" type="text/x-template">
5736 {{#each .}}
5737 {{#ifCond template "!==" "SearchMore"}}
5738 <li class="dropdown__item dropdown__item--seperator dw-mod">
5739 <div>
5740 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link u-pull--left u-color-inherit">
5741 <div class="u-margin-right u-pull--left"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
5742 <div class="u-pull--left">
5743 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
5744 </div>
5745 </a>
5746 </div>
5747 </li>
5748 {{/ifCond}}
5749 {{#ifCond template "===" "SearchMore"}}
5750 {{>SearchMorePages}}
5751 {{/ifCond}}
5752 {{else}}
5753 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
5754 @Translate("Your search gave 0 results")
5755 </li>
5756 {{/each}}
5757 </script>
5758
5759 <script id="SearchPagesTemplateWrap" type="text/x-template">
5760 <div class="dropdown__column-header">@Translate("Pages")</div>
5761 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
5762 {{>SearchPagesTemplate}}
5763 </ul>
5764 </script>
5765
5766 <script id="SearchProductsTemplateWrap" type="text/x-template">
5767 <div class="dropdown__column-header">@Translate("Products")</div>
5768 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
5769 {{>SearchProductsTemplate}}
5770 </ul>
5771 </script>
5772 }
5773
5774
5775 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
5776
5777 @using System
5778 @using System.Web
5779 @using System.Collections.Generic
5780 @using Dynamicweb.Rapido.Blocks.Extensibility
5781 @using Dynamicweb.Rapido.Blocks
5782
5783 @{
5784 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
5785
5786 Block primaryBottomSnippets = new Block()
5787 {
5788 Id = "MasterJavascriptInitializers",
5789 SortId = 100,
5790 Template = RenderPrimaryBottomSnippets()
5791 };
5792 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
5793 }
5794
5795 @helper RenderPrimaryBottomSnippets() {
5796 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
5797 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
5798
5799 if (isWireframeMode)
5800 {
5801 <script>
5802 Wireframe.Init(true);
5803 </script>
5804 }
5805
5806
5807 if (useGoogleTagManager)
5808 {
5809 <script>
5810 document.addEventListener('addToCart', function(event) {
5811 var googleImpression = event.detail.productInfo.googleImpression;
5812 dataLayer.push({
5813 'event': 'addToCart',
5814 'ecommerce': {
5815 'currencyCode': '@Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency().Code',
5816 'add': {
5817 'products': [{
5818 'name': googleImpression.name,
5819 'id': googleImpression.id,
5820 'price': googleImpression.price,
5821 'brand': googleImpression.brand,
5822 'category': googleImpression.category,
5823 'variant': googleImpression.variant,
5824 'quantity': event.detail.quantity
5825 }]
5826 }
5827 }
5828 });
5829 });
5830 </script>
5831 }
5832
5833 //if digitalwarehouse
5834 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"))
5835 {
5836 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]);
5837
5838 if (string.IsNullOrEmpty(cartContextId)) {
5839 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2");
5840 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps);
5841 cartContextId = cartSettings.OrderContextID;
5842 HttpContext.Current.Application["DownloadCartContext"] = cartContextId;
5843 }
5844
5845 <script>
5846 let downloadCart = new DownloadCart({
5847 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"),
5848 contextId: "@cartContextId",
5849 addButtonText: "@Translate("Add")",
5850 removeButtonText: "@Translate("Remove")"
5851 });
5852 </script>
5853 }
5854
5855 <!--$$Javascripts-->
5856 }
5857 @if (File.Exists(HttpContext.Current.Server.MapPath("/MasterBlocks/Custom__Blocks.cshtml")))
5858 {
5859 <text>@inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
5860
5861 @using System
5862 @using System.Web
5863 @using System.Collections.Generic
5864 @using Dynamicweb.Rapido.Blocks
5865
5866 @{
5867 BlocksPage masterBlocksBlocksPage = BlocksPage.GetBlockPage("Master");
5868
5869 }</text>
5870 }
5871
5872
5873 @functions {
5874 public class ManifestIcon
5875 {
5876 public string src { get; set; }
5877 public string type { get; set; }
5878 public string sizes { get; set; }
5879 }
5880
5881 public class Manifest
5882 {
5883 public string name { get; set; }
5884 public string short_name { get; set; }
5885 public string start_url { get; set; }
5886 public string display { get; set; }
5887 public string background_color { get; set; }
5888 public string theme_color { get; set; }
5889 public List<ManifestIcon> icons { get; set; }
5890 }
5891 }
5892 @{
5893 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) {
5894 Manifest manifest = new Manifest
5895 {
5896 name = Model.Area.Item.GetItem("Settings").GetString("AppName"),
5897 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"),
5898 start_url = "/",
5899 display = "standalone",
5900 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"),
5901 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor")
5902 };
5903
5904 manifest.icons = new List<ManifestIcon> {
5905 new ManifestIcon {
5906 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
5907 sizes = "192x192",
5908 type = "image/png"
5909 },
5910 new ManifestIcon {
5911 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
5912 sizes = "512x512",
5913 type = "image/png"
5914 },
5915 new ManifestIcon {
5916 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
5917 sizes = "1024x1024",
5918 type = "image/png"
5919 }
5920 };
5921
5922 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json");
5923 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest);
5924 string currentManifest = File.ReadAllText(manifestFilePath);
5925
5926 if (manifestJSON != currentManifest)
5927 {
5928 File.WriteAllText(manifestFilePath, manifestJSON);
5929 }
5930 }
5931 }
5932
5933 @{
5934 var swatches = new Dynamicweb.Content.Items.ColorSwatchService();
5935 var brandColors = swatches.GetColorSwatch(1);
5936 string brandColorOne = brandColors.Palette["BrandColor1"];
5937
5938 string host = Dynamicweb.Environment.Helpers.LinkHelper.GetHttpDomain();
5939 int pageId = Model.ID;
5940 string currentUrl = host + "/Default.aspx?ID=" + pageId;
5941 string openGraphFile = (!String.IsNullOrWhiteSpace(Model.PropertyItem.GetString("OpenGraphImage").ToString())) ? Model.PropertyItem.GetFile("OpenGraphImage").ToString() : "/Files/Images/DW-Logo_OG.png";
5942 string openGraphImage = host + openGraphFile;
5943 }
5944
5945 <!DOCTYPE html>
5946
5947 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
5948 <head>
5949 <!-- Rapido version 3.1 -->
5950 <meta charset="utf-8" />
5951 <title>@Model.Title</title>
5952 <meta name="viewport" content="width=device-width, initial-scale=1.0">
5953 <meta name="robots" content="index, follow">
5954 <meta name="theme-color" content="@brandColorOne" />
5955
5956 <meta property="og:title" content="@Model.Title" />
5957 <meta property="og:description" content="@Model.Description" />
5958 <meta property="og:url" content="@currentUrl" />
5959 <meta property="og:type" content="website" />
5960 <meta property="og:image" content="@openGraphImage">
5961
5962 @Model.MetaTags
5963
5964 <!-- Favicon -->
5965 <link href="@favicon" rel="icon" type="image/png">
5966
5967 <!-- Base (Default, wireframe) styles -->
5968 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
5969
5970 <!-- Rapido Css from Website Settings -->
5971 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css">
5972
5973 <!-- Ignite Css (Custom site specific styles) -->
5974 <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css">
5975
5976 <!-- Font awesome -->
5977 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css">
5978
5979 <!-- Flag icon -->
5980 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css">
5981
5982 <!-- Google fonts -->
5983 @{
5984 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)));
5985 }
5986 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
5987 @{
5988 PushPromise(favicon);
5989 PushPromise(fontAwesomeCssLink);
5990 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css");
5991 PushPromise(autoCssLink);
5992 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css");
5993 PushPromise("/Files/Images/placeholder.gif");
5994 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css");
5995 }
5996
5997 @if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")))
5998 {
5999 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json">
6000 PushPromise("/Files/Templates/Designs/Rapido/manifest.json");
6001 }
6002
6003 @* International specific code *@
6004 @if (Model.Area.ID.ToString() == "1")
6005 {
6006 <meta name="google-site-verification" content="Vta5RZKMgM23VCI3GX1Y-6FFQP4vJsXtx6oF1QLMNuk" />
6007
6008 @* Leadfeeder Tracker *@
6009 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6010
6011 <!-- Hotjar Tracking Code for www.dynamicweb.com -->
6012 <script>
6013 (function(h,o,t,j,a,r){
6014 h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
6015 h._hjSettings={hjid:1716644,hjsv:6};
6016 a=o.getElementsByTagName('head')[0];
6017 r=o.createElement('script');r.async=1;
6018 r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
6019 a.appendChild(r);
6020 })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
6021 </script>
6022 }
6023
6024 @* DK specific code *@
6025 @if (Model.Area.ID.ToString() == "6")
6026 {
6027 <meta name="google-site-verification" content="m6Ab8tsu4B8YuDvdNBpwWKRcK5ZnRONJ8ioxKdjsdXo" />
6028
6029 <!-- Hotjar Tracking Code for https://www.dynamicweb.dk -->
6030 <script>
6031 (function(h,o,t,j,a,r){
6032 h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
6033 h._hjSettings={hjid:1716950,hjsv:6};
6034 a=o.getElementsByTagName('head')[0];
6035 r=o.createElement('script');r.async=1;
6036 r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
6037 a.appendChild(r);
6038 })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
6039 </script>
6040
6041 @* Leadfeeder Tracker *@
6042 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6043 }
6044
6045 @* NL specific code *@
6046 @if (Model.Area.ID.ToString() == "7")
6047 {
6048 <meta name="google-site-verification" content="VKUCKwan44a64w-aohJ468VDpp-SuCUEy2VnPOkSvz8" />
6049
6050 @* Leadfeeder Tracker *@
6051 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6052
6053 <!-- Hotjar Tracking Code for https://www.dynamicweb.nl/ -->
6054 <script>
6055 (function(h,o,t,j,a,r){
6056 h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
6057 h._hjSettings={hjid:1716951,hjsv:6};
6058 a=o.getElementsByTagName('head')[0];
6059 r=o.createElement('script');r.async=1;
6060 r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
6061 a.appendChild(r);
6062 })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
6063 </script>
6064 }
6065
6066 @* NO specific code *@
6067 @if (Model.Area.ID.ToString() == "8")
6068 {
6069 <meta name="google-site-verification" content="SmPOZiFRqDuUZGKDGYHGzxAAgsg4uuWHEdD5SVbGgD4" />
6070
6071 @* Leadfeeder Tracker *@
6072 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6073 }
6074
6075 @* SE specific code *@
6076 @if (Model.Area.ID.ToString() == "16")
6077 {
6078 <script async src="https://www.googletagmanager.com/gtag/js?id=UA-45217838-1"></script>
6079 <script>
6080 window.dataLayer = window.dataLayer || [];
6081 function gtag(){dataLayer.push(arguments);}
6082 gtag('js', new Date());
6083
6084 gtag('config', 'UA-45217838-1');
6085 </script>
6086
6087 <!--<script>
6088 (function(){
6089
6090 window.ldfdr = window.ldfdr || {};
6091 (function(d, s, ss, fs){
6092 fs = d.getElementsByTagName(s)[0];
6093
6094 function ce(src){
6095 var cs = d.createElement(s);
6096 cs.src = src;
6097 setTimeout(function(){fs.parentNode.insertBefore(cs,fs)}, 1);
6098 }
6099
6100 ce(ss);
6101 })(document, 'script', 'https://sc.lfeeder.com/lftracker_v1_Yn8J1xYRe5YgW0Rk.js');
6102 })();
6103 </script>-->
6104 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6105 }
6106
6107 @* DE specific code *@
6108 @if (Model.Area.ID.ToString() == "19")
6109 {
6110 <!--<script>
6111 (function(){
6112
6113 window.ldfdr = window.ldfdr || {};
6114 (function(d, s, ss, fs){
6115 fs = d.getElementsByTagName(s)[0];
6116
6117 function ce(src){
6118 var cs = d.createElement(s);
6119 cs.src = src;
6120 setTimeout(function(){fs.parentNode.insertBefore(cs,fs)}, 1);
6121 }
6122
6123 ce(ss);
6124 })(document, 'script', 'https://sc.lfeeder.com/lftracker_v1_Yn8J1xYRe5YgW0Rk.js');
6125 })();
6126 </script>-->
6127 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6128 }
6129
6130 @* RO specific code *@
6131 @if (Model.Area.ID.ToString() == "17")
6132 {
6133 <!-- Google Tag Manager -->
6134 <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
6135 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
6136 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6137 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
6138 })(window,document,'script','dataLayer','GTM-NJG8K2Q');</script>
6139 <!-- End Google Tag Manager -->
6140
6141 <meta name="google-site-verification" content="QBHx2m3RhXgQG1Lb_28ifyF6zm2TryGZXY9GRmIz6b0" />
6142
6143 @* Leadfeeder Tracker *@
6144 <script> (function(ss,ex){ window.ldfdr=window.ldfdr||function(){(ldfdr._q=ldfdr._q||[]).push([].slice.call(arguments));}; (function(d,s){ fs=d.getElementsByTagName(s)[0]; function ce(src){ var cs=d.createElement(s); cs.src=src; cs.async=1; fs.parentNode.insertBefore(cs,fs); }; ce('https://sc.lfeeder.com/lftracker_v1_'+ss+(ex?'_'+ex:'')+'.js'); })(document,'script'); })('Yn8J1xYRe5YgW0Rk'); </script>
6145 }
6146
6147 @* Clarity Script *@
6148 <script type="text/javascript">
6149 (function(c,l,a,r,i,t,y){
6150 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
6151 t=l.createElement(r);
6152 t.async=1;
6153 t.src="https://www.clarity.ms/tag/"+i;
6154 y=l.getElementsByTagName(r)[0];
6155 y.parentNode.insertBefore(t,y);
6156 })
6157 (window, document, "clarity", "script", "9lf6zi2wh7");
6158 </script>
6159 </head>
6160
6161 <body>
6162 @* RO specific code *@
6163 @if (Model.Area.ID.ToString() == "17")
6164 {
6165 <!-- Google Tag Manager (noscript) -->
6166 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJG8K2Q"
6167 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
6168 <!-- End Google Tag Manager (noscript) -->
6169 }
6170
6171 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
6172 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
6173
6174
6175 @helper RenderMasterHeader()
6176 {
6177 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
6178 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
6179 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
6180
6181 <header class="top-container @stickyTop dw-mod" id="Top">
6182 @RenderBlockList(subBlocks)
6183 </header>
6184 }
6185
6186 @helper RenderMain()
6187 {
6188 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
6189
6190 <main class="site dw-mod">
6191 @RenderBlockList(subBlocks)
6192 </main>
6193 }
6194
6195 @helper RenderPageContent()
6196 {
6197 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
6198 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
6199
6200 <div id="Page" class="page @pagePos">
6201 <section class="center-container content-container dw-mod" id="content">
6202 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6203
6204
6205 <article class="grid__col-md-8">
6206 <h1 class="article__header">@Model.Item.GetString("Title")</h1>
6207 <div class="article__summary">@Model.Item.GetString("Summary")</div>
6208 <small class="article__subscription">
6209 @if (!(string.IsNullOrWhiteSpace(Model.Item.GetString("Author")) && string.IsNullOrWhiteSpace(Model.Item.GetString("Date"))))
6210 {
6211 <text>@Translate("Written")</text>
6212 }
6213 @if (!string.IsNullOrWhiteSpace(Model.Item.GetString("Author")))
6214 {
6215 <text>@Translate("by") @Model.Item.GetString("Author")</text>
6216 }
6217 @if (!string.IsNullOrWhiteSpace(Model.Item.GetString("Date")))
6218 {
6219 <text>@Translate("on") @Model.Item.GetDateTime("Date").ToString("dd.MM.yyyy, HH:mm")</text>
6220 }
6221 </small>
6222
6223 @if (Model.Item.GetFile("Image") != null)
6224 {
6225 <div class="u-margin-bottom--lg">
6226 <img src="/Admin/Public/GetImage.ashx?width=1600&crop=5&Compression=75&DoNotUpscale=true&image=@Model.Item.GetFile("Image").PathUrlEncoded" alt="@Model.Item.GetString("Title")" />
6227 </div>
6228 }
6229
6230 <div class="article__paragraph">
6231 @Model.Item.GetString("Text")
6232 </div>
6233
6234 @{
6235 string buttonClass = "";
6236 switch (Model.Item.GetList("ButtonDesign").SelectedName)
6237 {
6238 case "Link":
6239 buttonClass = "btn--link";
6240 break;
6241 case "Secondary":
6242 buttonClass = "btn--secondary";
6243 break;
6244 default:
6245 buttonClass = "btn--primary";
6246 break;
6247 }
6248 }
6249
6250 @if (!string.IsNullOrWhiteSpace(Model.Item.GetString("Link")))
6251 {
6252 <div class="grid__cell--footer">
6253 <a href="@Model.Item.GetString("Link")" class="btn @buttonClass dw-mod u-pull--left">@Model.Item.GetString("LinkText")</a>
6254 </div>
6255 }
6256 </article>
6257 </section>
6258 </div>
6259 }
6260
6261 @* International specific code *@
6262 @* USA ClickDimenstions script *@
6263 @if (Model.Area.ID.ToString() == "1")
6264 {
6265 <script type="text/javascript" src="https://analytics.clickdimensions.com/ts.js" > </script>
6266 <script type="text/javascript">
6267 var cdAnalytics = new clickdimensions.Analytics('analytics.clickdimensions.com');
6268 cdAnalytics.setAccountKey('aAZK8xldHK0CXkMIXmNzPt');
6269 cdAnalytics.setDomain('dynamicweb.com');
6270 cdAnalytics.setScore(typeof(cdScore) == "undefined" ? 0 : (cdScore == 0 ? null : cdScore));
6271 cdAnalytics.trackPage();
6272 </script>
6273 }
6274 </body>
6275 </html>
6276
6277