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