Error executing template "Designs/Rapido/_parsed/Kraemer_ProductList.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_0ee926897139478e97942bda6540ef40.Execute() in D:\dynamicweb.net\Solutions\Degree\kraemer.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Kraemer_ProductList.parsed.cshtml:line 11381
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 = 90,
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 {
159 <!-- Block START: @item.Id -->
160 }
161
162 if (item.Design == null)
163 {
164 @RenderBlock(item)
165 }
166 else if (item.Design.RenderType == RenderType.None)
167 {
168 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
169
170 <div class="@cssClass dw-mod">
171 @RenderBlock(item)
172 </div>
173 }
174 else if (item.Design.RenderType != RenderType.Hide)
175 {
176 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
177
178 if (!item.SkipRenderBlocksList)
179 {
180 if (item.Design.RenderType == RenderType.Row)
181 {
182 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id">
183 @RenderBlock(item)
184 </div>
185 }
186
187 if (item.Design.RenderType == RenderType.Column)
188 {
189 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";
190 string size = item.Design.Size ?? "12";
191 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;
192
193 <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">
194 @RenderBlock(item)
195 </div>
196 }
197
198 if (item.Design.RenderType == RenderType.Table)
199 {
200 <table class="table @cssClass dw-mod" id="Block__@item.Id">
201 @RenderBlock(item)
202 </table>
203 }
204
205 if (item.Design.RenderType == RenderType.TableRow)
206 {
207 <tr class="@cssClass dw-mod" id="Block__@item.Id">
208 @RenderBlock(item)
209 </tr>
210 }
211
212 if (item.Design.RenderType == RenderType.TableColumn)
213 {
214 <td class="@cssClass dw-mod" id="Block__@item.Id">
215 @RenderBlock(item)
216 </td>
217 }
218
219 if (item.Design.RenderType == RenderType.CardHeader)
220 {
221 <div class="card-header @cssClass dw-mod">
222 @RenderBlock(item)
223 </div>
224 }
225
226 if (item.Design.RenderType == RenderType.CardBody)
227 {
228 <div class="card @cssClass dw-mod">
229 @RenderBlock(item)
230 </div>
231 }
232
233 if (item.Design.RenderType == RenderType.CardFooter)
234 {
235 <div class="card-footer @cssClass dw-mod">
236 @RenderBlock(item)
237 </div>
238 }
239 }
240 else
241 {
242 @RenderBlock(item)
243 }
244 }
245
246 if (debug)
247 {
248 <!-- Block END: @item.Id -->
249 }
250 }
251 }
252
253 @helper RenderBlock(Block item)
254 {
255 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false;
256
257 if (item.Template != null)
258 {
259 @BlocksPage.RenderTemplate(item.Template)
260 }
261
262 if (item.Component != null)
263 {
264 string customSufix = "Custom";
265 string methodName = item.Component.HelperName;
266
267 ComponentBase[] methodParameters = new ComponentBase[1];
268 methodParameters[0] = item.Component;
269 Type methodType = this.GetType();
270
271 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix);
272 MethodInfo generalMethod = methodType.GetMethod(methodName);
273
274 try
275 {
276 if (debug)
277 {
278 <!-- Component: @methodName.Replace("Render", "") -->
279 }
280 if (customMethod != null)
281 {
282 @customMethod.Invoke(this, methodParameters).ToString();
283 }
284 else
285 {
286 @generalMethod.Invoke(this, methodParameters).ToString();
287 }
288 }
289 catch
290 {
291 try
292 {
293 @generalMethod.Invoke(this, methodParameters).ToString();
294 }
295 catch (Exception ex)
296 {
297 throw new Exception(item.Component.GetType().Name + " method '" + methodName + "' could not be invoked", ex);
298 }
299 }
300 }
301
302 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList)
303 {
304 @RenderBlockList(item.BlocksList)
305 }
306 }
307
308 @*--- END: Base block renderers ---*@
309
310
311 @* Include the components *@
312 @using Dynamicweb.Rapido.Blocks.Components
313 @using Dynamicweb.Rapido.Blocks.Components.General
314 @using Dynamicweb.Rapido.Blocks
315 @using System.IO
316
317 @* Required *@
318 @using Dynamicweb.Rapido.Blocks.Components
319 @using Dynamicweb.Rapido.Blocks.Components.General
320 @using Dynamicweb.Rapido.Blocks
321
322
323 @helper Render(ComponentBase component)
324 {
325 if (component != null)
326 {
327 @component.Render(this)
328 }
329 }
330
331 @* Components *@
332 @using System.Reflection
333 @using Dynamicweb.Rapido.Blocks.Components.General
334
335
336 @* Component *@
337
338 @helper RenderIcon(Icon settings)
339 {
340 if (settings != null)
341 {
342 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
343
344 if (settings.Name != null)
345 {
346 if (settings.Prefix == "svg" || settings.Name.Contains(".svg"))
347 {
348
349 <span class="u-flex u-flex--row " style="align-items: center;gap: 10px;justify-content: center"> <img width="18" height="18" src="@settings.Name"/> @settings.Label </span>
350 }else{
351 if (string.IsNullOrEmpty(settings.Label))
352 {
353 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i>
354 }
355 else
356 {
357 if (settings.LabelPosition == IconLabelPosition.Before)
358 {
359 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span>
360 }
361 else
362 {
363 <span><i class="@settings.Prefix @settings.Name u-margin-right--lg @settings.CssClass u-w20px" @color></i>@settings.Label</span>
364 }
365 }
366 }
367 }
368 else if (!string.IsNullOrEmpty(settings.Label))
369 {
370 @settings.Label
371 }
372 }
373 }
374 @using System.Reflection
375 @using Dynamicweb.Rapido.Blocks.Components.General
376 @using Dynamicweb.Rapido.Blocks.Components
377 @using Dynamicweb.Core
378
379 @* Component *@
380
381 @helper RenderButton(Button settings)
382 {
383 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null))
384 {
385 Dictionary<string, string> attributes = new Dictionary<string, string>();
386 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>();
387 if (settings.Disabled) {
388 attributes.Add("disabled", "true");
389 classList.Add("disabled");
390 }
391
392 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle))
393 {
394 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N");
395 @RenderConfirmDialog(settings);
396 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true";
397 }
398
399 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
400 /*if (!string.IsNullOrEmpty(settings.Image)) { attributes.Add("image", settings.Image); }*/
401 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
402 if (!string.IsNullOrEmpty(settings.AltText))
403 {
404 attributes.Add("title", settings.AltText);
405 }
406 else if (!string.IsNullOrEmpty(settings.Title))
407 {
408 attributes.Add("title", settings.Title);
409 }
410
411 var onClickEvents = new List<string>();
412 if (!string.IsNullOrEmpty(settings.OnClick))
413 {
414 onClickEvents.Add(settings.OnClick);
415 }
416 if (!string.IsNullOrEmpty(settings.Href))
417 {
418 onClickEvents.Add("location.href='" + settings.Href + "'");
419 }
420 if (onClickEvents.Count > 0)
421 {
422 attributes.Add("onClick", string.Join(";", onClickEvents));
423 }
424
425 if (settings.ButtonLayout != ButtonLayout.None)
426 {
427 classList.Add("btn");
428 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower();
429 if (btnLayout == "linkclean")
430 {
431 btnLayout = "link-clean"; //fix
432 }
433 classList.Add("btn--" + btnLayout);
434 }
435
436 if (settings.Icon == null)
437 {
438 settings.Icon = new Icon();
439 }
440 settings.Icon.Label = settings.Title;
441
442 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower());
443
444 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button>
445 }
446 }
447
448 @helper RenderConfirmDialog(Button settings)
449 {
450 Modal confirmDialog = new Modal {
451 Id = settings.Id,
452 Width = ModalWidth.Sm,
453 Heading = new Heading
454 {
455 Level = 2,
456 Title = settings.ConfirmTitle
457 },
458 BodyText = settings.ConfirmText
459 };
460
461 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"});
462 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick });
463
464 @Render(confirmDialog)
465 }
466 @using Dynamicweb.Rapido.Blocks.Components.General
467 @using Dynamicweb.Rapido.Blocks.Components
468 @using Dynamicweb.Core
469
470 @helper RenderDashboard(Dashboard settings)
471 {
472 var widgets = settings.GetWidgets();
473
474 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor))
475 {
476 //set bg color for them
477
478 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor);
479 int r = Convert.ToInt16(color.R);
480 int g = Convert.ToInt16(color.G);
481 int b = Convert.ToInt16(color.B);
482
483 var count = widgets.Length;
484 var max = Math.Max(r, Math.Max(g, b));
485 double step = 255.0 / (max * count);
486 var i = 0;
487 foreach (var widget in widgets)
488 {
489 i++;
490
491 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")";
492 widget.BackgroundColor = shade;
493 }
494 }
495
496 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
497 @foreach (var widget in widgets)
498 {
499 <div class="dashboard__widget">
500 @Render(widget)
501 </div>
502 }
503 </div>
504 }
505 @using Dynamicweb.Rapido.Blocks.Components.General
506 @using Dynamicweb.Rapido.Blocks.Components
507
508 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings)
509 {
510 if (!string.IsNullOrEmpty(settings.Link))
511 {
512 var backgroundStyles = "";
513 if (!string.IsNullOrEmpty(settings.BackgroundColor))
514 {
515 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\"";
516 }
517
518 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
519 <div class="u-center-middle u-color-light">
520 @if (settings.Icon != null)
521 {
522 settings.Icon.CssClass += "widget__icon";
523 @Render(settings.Icon)
524 }
525 <div class="widget__title">@settings.Title</div>
526 </div>
527 </a>
528 }
529 }
530 @using Dynamicweb.Rapido.Blocks.Components.General
531 @using Dynamicweb.Rapido.Blocks.Components
532
533 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings)
534 {
535 var backgroundStyles = "";
536 if (!string.IsNullOrEmpty(settings.BackgroundColor))
537 {
538 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'";
539 }
540
541 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
542 <div class="u-center-middle u-color-light">
543 @if (settings.Icon != null)
544 {
545 settings.Icon.CssClass += "widget__icon";
546 @Render(settings.Icon)
547 }
548 <div class="widget__counter">@settings.Count</div>
549 <div class="widget__title">@settings.Title</div>
550 </div>
551 </div>
552 }
553 @using System.Reflection
554 @using Dynamicweb.Rapido.Blocks.Components.General
555 @using Dynamicweb.Rapido.Blocks.Components
556 @using Dynamicweb.Core
557
558 @* Component *@
559
560 @helper RenderLink(Link settings)
561 {
562 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null))
563 {
564 Dictionary<string, string> attributes = new Dictionary<string, string>();
565 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>();
566 if (settings.Disabled)
567 {
568 attributes.Add("disabled", "true");
569 classList.Add("disabled");
570 }
571
572 if (!string.IsNullOrEmpty(settings.AltText))
573 {
574 attributes.Add("title", settings.AltText);
575 }
576 else if (!string.IsNullOrEmpty(settings.Title))
577 {
578 attributes.Add("title", settings.Title);
579 }
580
581 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
582 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
583 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); }
584 attributes.Add("href", settings.Href);
585
586 if (settings.ButtonLayout != ButtonLayout.None)
587 {
588 classList.Add("btn");
589 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower();
590 if (btnLayout == "linkclean")
591 {
592 btnLayout = "link-clean"; //fix
593 }
594 classList.Add("btn--" + btnLayout);
595 }
596
597 if (settings.Icon == null)
598 {
599 settings.Icon = new Icon();
600 }
601 settings.Icon.Label = settings.Title;
602
603 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None)
604 {
605 settings.Rel = LinkRelType.Noopener;
606 }
607 if (settings.Target != LinkTargetType.None)
608 {
609 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower());
610 }
611 if (settings.Download)
612 {
613 attributes.Add("download", "true");
614 }
615 if (settings.Rel != LinkRelType.None)
616 {
617 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower());
618 }
619
620 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a>
621 }
622 }
623 @using System.Reflection
624 @using Dynamicweb.Rapido.Blocks.Components
625 @using Dynamicweb.Rapido.Blocks.Components.General
626 @using Dynamicweb.Rapido.Blocks
627
628
629 @* Component *@
630
631 @helper RenderRating(Rating settings)
632 {
633 if (settings.Score > 0)
634 {
635 int rating = settings.Score;
636 string iconType = "fa-star";
637
638 switch (settings.Type.ToString()) {
639 case "Stars":
640 iconType = "fa-star";
641 break;
642 case "Hearts":
643 iconType = "fa-heart";
644 break;
645 case "Lemons":
646 iconType = "fa-lemon";
647 break;
648 case "Bombs":
649 iconType = "fa-bomb";
650 break;
651 }
652
653 <div class="u-ta-right">
654 @for (int i = 0; i < settings.OutOf; i++)
655 {
656 <i class="@(rating > i ? "fas" : "far") @iconType"></i>
657 }
658 </div>
659 }
660 }
661 @using System.Reflection
662 @using Dynamicweb.Rapido.Blocks.Components.General
663 @using Dynamicweb.Rapido.Blocks.Components
664
665
666 @* Component *@
667
668 @helper RenderSelectFieldOption(SelectFieldOption settings)
669 {
670 Dictionary<string, string> attributes = new Dictionary<string, string>();
671 if (settings.Checked) { attributes.Add("selected", "true"); }
672 if (settings.Disabled) { attributes.Add("disabled", "true"); }
673 if (settings.Value != null) { attributes.Add("value", settings.Value); }
674 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
675
676 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option>
677 }
678 @using System.Reflection
679 @using Dynamicweb.Rapido.Blocks.Components.General
680 @using Dynamicweb.Rapido.Blocks.Components
681
682
683 @* Component *@
684
685 @helper RenderNavigation(Navigation settings) {
686 @RenderNavigation(new
687 {
688 id = settings.Id,
689 cssclass = settings.CssClass,
690 startLevel = settings.StartLevel,
691 endlevel = settings.EndLevel,
692 expandmode = settings.Expandmode,
693 sitemapmode = settings.SitemapMode,
694 template = settings.Template
695 })
696 }
697 @using Dynamicweb.Rapido.Blocks.Components.General
698 @using Dynamicweb.Rapido.Blocks.Components
699
700
701 @* Component *@
702
703 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) {
704 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
705 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
706 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
707 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
708 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
709 settings.SitemapMode = false;
710
711 @RenderNavigation(settings)
712 }
713 @using Dynamicweb.Rapido.Blocks.Components.General
714 @using Dynamicweb.Rapido.Blocks.Components
715
716
717 @* Component *@
718
719 @helper RenderLeftNavigation(LeftNavigation settings) {
720 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
721 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
722 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
723 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
724 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
725
726 <div class="grid__cell">
727 @RenderNavigation(settings)
728 </div>
729 }
730 @using System.Reflection
731 @using Dynamicweb.Rapido.Blocks.Components.General
732 @using Dynamicweb.Core
733
734 @* Component *@
735
736 @helper RenderHeading(Heading settings)
737 {
738 if (settings != null && !string.IsNullOrEmpty(settings.Title))
739 {
740 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
741 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div";
742
743 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">")
744 if (!string.IsNullOrEmpty(settings.Link))
745 {
746 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None })
747 }
748 else
749 {
750 if (settings.Icon == null)
751 {
752 settings.Icon = new Icon();
753 }
754 settings.Icon.Label = settings.Title;
755 @Render(settings.Icon)
756 }
757 @("</" + tagName + ">");
758 }
759 }
760 @using Dynamicweb.Rapido.Blocks.Components
761 @using Dynamicweb.Rapido.Blocks.Components.General
762 @using Dynamicweb.Rapido.Blocks
763
764
765 @* Component *@
766
767 @helper RenderImage(Image settings)
768 {
769 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None)
770 {
771 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
772 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); }
773
774 if (settings.Caption != null)
775 {
776 @:<div>
777 }
778
779 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower();
780 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower();
781
782 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)>
783 <div class="image-filter image-filter--@secondaryFilterClass dw-mod">
784 @if (settings.Link != null)
785 {
786 <a href="@settings.Link">
787 @RenderTheImage(settings)
788 </a>
789 }
790 else
791 {
792 @RenderTheImage(settings)
793 }
794 </div>
795 </div>
796
797 if (settings.Caption != null)
798 {
799 <span class="image-caption dw-mod">@settings.Caption</span>
800 @:</div>
801 }
802 }
803 else
804 {
805 if (settings.Caption != null)
806 {
807 @:<div>
808 }
809 if (!string.IsNullOrEmpty(settings.Link))
810 {
811 <a href="@settings.Link">
812 @RenderTheImage(settings)
813 </a>
814 }
815 else
816 {
817 @RenderTheImage(settings)
818 }
819
820 if (settings.Caption != null)
821 {
822 <span class="image-caption dw-mod">@settings.Caption</span>
823 @:</div>
824 }
825 }
826 }
827
828 @helper RenderTheImage(Image settings)
829 {
830 if (settings != null)
831 {
832 string placeholderImage = "/Files/Images/placeholder.gif";
833 string imageEngine = "/Admin/Public/GetImage.ashx?";
834 string alternativeImage = "/Images/Kraemer/RapidoProducts/missing-image.jpg";
835
836 string imageStyle = "";
837
838 switch (settings.Style)
839 {
840 case ImageStyle.Ball:
841 imageStyle = "grid__cell-img--ball";
842 break;
843
844 case ImageStyle.Triangle:
845 imageStyle = "grid__cell-img--triangle";
846 break;
847 }
848
849 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle)
850 {
851 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop;
852
853 if (settings.ImageDefault != null)
854 {
855 settings.ImageDefault.Height = settings.ImageDefault.Width;
856 }
857 if (settings.ImageMedium != null)
858 {
859 settings.ImageMedium.Height = settings.ImageMedium.Width;
860 }
861 if (settings.ImageSmall != null)
862 {
863 settings.ImageSmall.Height = settings.ImageSmall.Width;
864 }
865 }
866
867 string defaultImage = imageEngine;
868 string imageSmall = "";
869 string imageMedium = "";
870
871 if (settings.DisableImageEngine)
872 {
873 defaultImage = settings.Path;
874 }
875 else
876 {
877 if (settings.ImageDefault != null)
878 {
879 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault);
880
881 if (settings.Path.GetType() != typeof(string))
882 {
883 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
884 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
885 }
886 else
887 {
888 defaultImage += settings.Path != null ? "Image=" + settings.Path : "";
889 }
890 defaultImage += "&altFmImage_path=" + alternativeImage;
891 }
892
893 if (settings.ImageSmall != null)
894 {
895 imageSmall = "data-src-small=\"" + imageEngine;
896 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall);
897
898 if (settings.Path.GetType() != typeof(string))
899 {
900 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
901 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
902 }
903 else
904 {
905 imageSmall += settings.Path != null ? "Image=" + settings.Path : "";
906 }
907
908 imageSmall += "\"";
909 }
910
911 if (settings.ImageMedium != null)
912 {
913 imageMedium = "data-src-medium=\"" + imageEngine;
914 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium);
915
916 if (settings.Path.GetType() != typeof(string))
917 {
918 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
919 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
920 }
921 else
922 {
923 imageMedium += settings.Path != null ? "Image=" + settings.Path : "";
924 }
925
926 imageMedium += "\"";
927 }
928 }
929
930 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
931 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); }
932 if (!string.IsNullOrEmpty(settings.Title))
933 {
934 optionalAttributes.Add("alt", settings.Title);
935 optionalAttributes.Add("title", settings.Title);
936 }
937
938 if (settings.DisableLazyLoad)
939 {
940 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
941 }
942 else
943 {
944 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
945 }
946 }
947 }
948 @using System.Reflection
949 @using Dynamicweb.Rapido.Blocks.Components.General
950 @using Dynamicweb.Rapido.Blocks.Components
951
952 @* Component *@
953
954 @helper RenderFileField(FileField settings)
955 {
956 var attributes = new Dictionary<string, string>();
957 if (string.IsNullOrEmpty(settings.Id))
958 {
959 settings.Id = Guid.NewGuid().ToString("N");
960 }
961
962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
963 if (settings.Disabled) { attributes.Add("disabled", "true"); }
964 if (settings.Required) { attributes.Add("required", "true"); }
965 if (settings.Multiple) { attributes.Add("multiple", "true"); }
966 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
967 if (string.IsNullOrEmpty(settings.ChooseFileText))
968 {
969 settings.ChooseFileText = Translate("Choose file");
970 }
971 if (string.IsNullOrEmpty(settings.NoFilesChosenText))
972 {
973 settings.NoFilesChosenText = Translate("No files chosen...");
974 }
975 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
976
977 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
978
979 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)";
980 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : ""));
981
982 attributes.Add("type", "file");
983 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); }
984 settings.CssClass = "u-full-width " + settings.CssClass;
985
986 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
987
988 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
989 @if (!string.IsNullOrEmpty(settings.Label))
990 {
991 <label for="@settings.Id">@settings.Label</label>
992 }
993 @if (!string.IsNullOrEmpty(settings.HelpText))
994 {
995 <small class="form__help-text">@settings.HelpText</small>
996 }
997
998 <div class="form__field-combi file-input u-no-margin dw-mod">
999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" />
1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label>
1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label>
1002 @if (settings.UploadButton != null)
1003 {
1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin";
1005 @Render(settings.UploadButton)
1006 }
1007 </div>
1008 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1009 </div>
1010 }
1011 @using System.Reflection
1012 @using Dynamicweb.Rapido.Blocks.Components.General
1013 @using Dynamicweb.Rapido.Blocks.Components
1014 @using Dynamicweb.Core
1015 @using System.Linq
1016
1017 @* Component *@
1018
1019 @helper RenderDateTimeField(DateTimeField settings)
1020 {
1021 if (string.IsNullOrEmpty(settings.Id))
1022 {
1023 settings.Id = Guid.NewGuid().ToString("N");
1024 }
1025
1026 var textField = new TextField {
1027 Name = settings.Name,
1028 Id = settings.Id,
1029 Label = settings.Label,
1030 HelpText = settings.HelpText,
1031 Value = settings.Value,
1032 Disabled = settings.Disabled,
1033 Required = settings.Required,
1034 ErrorMessage = settings.ErrorMessage,
1035 CssClass = settings.CssClass,
1036 WrapperCssClass = settings.WrapperCssClass,
1037 OnChange = settings.OnChange,
1038 OnClick = settings.OnClick,
1039 ExtraAttributes = settings.ExtraAttributes,
1040 //
1041 Placeholder = settings.Placeholder
1042 };
1043
1044 @Render(textField)
1045
1046 List<string> jsAttributes = new List<string>();
1047
1048 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'");
1049
1050 if (!string.IsNullOrEmpty(settings.DateFormat))
1051 {
1052 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'");
1053 }
1054 if (!string.IsNullOrEmpty(settings.MinDate))
1055 {
1056 jsAttributes.Add("minDate: '" + settings.MinDate + "'");
1057 }
1058 if (!string.IsNullOrEmpty(settings.MaxDate))
1059 {
1060 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'");
1061 }
1062 if (settings.IsInline)
1063 {
1064 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower());
1065 }
1066 if (settings.EnableTime)
1067 {
1068 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower());
1069 }
1070 if (settings.EnableWeekNumbers)
1071 {
1072 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower());
1073 }
1074
1075 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value));
1076
1077 <script>
1078 document.addEventListener("DOMContentLoaded", function () {
1079 flatpickr("#@textField.Id", {
1080 @string.Join(",", jsAttributes)
1081 });
1082 });
1083 </script>
1084 }
1085 @using System.Reflection
1086 @using Dynamicweb.Rapido.Blocks.Components.General
1087 @using Dynamicweb.Rapido.Blocks.Components
1088
1089 @* Component *@
1090
1091 @helper RenderTextField(TextField settings)
1092 {
1093 var attributes = new Dictionary<string, string>();
1094 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1095 {
1096 settings.Id = Guid.NewGuid().ToString("N");
1097 }
1098
1099 /*base settings*/
1100 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1101 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1102 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1103 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1104 if (settings.Required) { attributes.Add("required", "true"); }
1105 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1106 /*end*/
1107
1108 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1109 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1110 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1111 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1112 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); }
1113 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); }
1114 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower());
1115 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); };
1116 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); }
1117 settings.CssClass = "u-full-width " + settings.CssClass;
1118
1119 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1120
1121 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1122
1123 string noMargin = "u-no-margin";
1124 if (!settings.ReadOnly) {
1125 noMargin = "";
1126 }
1127
1128 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod">
1129 @if (!string.IsNullOrEmpty(settings.Label))
1130 {
1131 <label for="@settings.Id">@settings.Label</label>
1132 }
1133 @if (!string.IsNullOrEmpty(settings.HelpText))
1134 {
1135 <small class="form__help-text">@settings.HelpText</small>
1136 }
1137
1138 @if (settings.ActionButton != null)
1139 {
1140 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1141 <div class="form__field-combi u-no-margin dw-mod">
1142 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1143 @Render(settings.ActionButton)
1144 </div>
1145 }
1146 else
1147 {
1148 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1149 }
1150
1151 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1152 </div>
1153 }
1154 @using System.Reflection
1155 @using Dynamicweb.Rapido.Blocks.Components.General
1156 @using Dynamicweb.Rapido.Blocks.Components
1157
1158 @* Component *@
1159
1160 @helper RenderNumberField(NumberField settings)
1161 {
1162 var attributes = new Dictionary<string, string>();
1163 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1164 {
1165 settings.Id = Guid.NewGuid().ToString("N");
1166 }
1167
1168 /*base settings*/
1169 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1170 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1171 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1172 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1173 if (settings.Required) { attributes.Add("required", "true"); }
1174 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1175 /*end*/
1176
1177 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1178 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1179 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1180 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1181 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); }
1182 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); }
1183 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); }
1184 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); }
1185 attributes.Add("type", "number");
1186
1187 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1188
1189 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
1190 @if (!string.IsNullOrEmpty(settings.Label))
1191 {
1192 <label for="@settings.Id">@settings.Label</label>
1193 }
1194 @if (!string.IsNullOrEmpty(settings.HelpText))
1195 {
1196 <small class="form__help-text">@settings.HelpText</small>
1197 }
1198
1199 @if (settings.ActionButton != null)
1200 {
1201 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1202 <div class="form__field-combi u-no-margin dw-mod">
1203 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1204 @Render(settings.ActionButton)
1205 </div>
1206 }
1207 else
1208 {
1209 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1210 }
1211
1212 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1213 </div>
1214 }
1215 @using System.Reflection
1216 @using Dynamicweb.Rapido.Blocks.Components.General
1217 @using Dynamicweb.Rapido.Blocks.Components
1218
1219
1220 @* Component *@
1221
1222 @helper RenderTextareaField(TextareaField settings)
1223 {
1224 Dictionary<string, string> attributes = new Dictionary<string, string>();
1225 string id = settings.Id;
1226 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id))
1227 {
1228 id = Guid.NewGuid().ToString("N");
1229 }
1230
1231 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); }
1232 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1233 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1234 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1235 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1236 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1237 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); }
1238 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1239 if (settings.Required) { attributes.Add("required", "true"); }
1240 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1241 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); }
1242 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); }
1243 attributes.Add("name", settings.Name);
1244
1245 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1246
1247 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1248 @if (!string.IsNullOrEmpty(settings.Label))
1249 {
1250 <label for="@id">@settings.Label</label>
1251 }
1252 @if (!string.IsNullOrEmpty(settings.HelpText))
1253 {
1254 <small class="form__help-text">@settings.HelpText</small>
1255 }
1256
1257 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea>
1258
1259 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1260 </div>
1261 }
1262 @using System.Reflection
1263 @using Dynamicweb.Rapido.Blocks.Components.General
1264 @using Dynamicweb.Rapido.Blocks.Components
1265
1266
1267 @* Component *@
1268
1269 @helper RenderHiddenField(HiddenField settings) {
1270 var attributes = new Dictionary<string, string>();
1271 attributes.Add("type", "hidden");
1272 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1273 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); }
1274 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1275
1276 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/>
1277 }
1278 @using System.Reflection
1279 @using Dynamicweb.Rapido.Blocks.Components.General
1280 @using Dynamicweb.Rapido.Blocks.Components
1281
1282 @* Component *@
1283
1284 @helper RenderCheckboxField(CheckboxField settings)
1285 {
1286 var attributes = new Dictionary<string, string>();
1287 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1288 {
1289 settings.Id = Guid.NewGuid().ToString("N");
1290 }
1291
1292 /*base settings*/
1293 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1294 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1295 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1296 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1297 if (settings.Required) { attributes.Add("required", "true"); }
1298 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1299 /*end*/
1300
1301 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1302
1303 attributes.Add("type", "checkbox");
1304 if (settings.Checked) { attributes.Add("checked", "true"); }
1305 settings.CssClass = "form__control " + settings.CssClass;
1306 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); }
1307
1308 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1309
1310 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1311 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1312 @if (!string.IsNullOrEmpty(settings.Label))
1313 {
1314 <label for="@settings.Id" class="dw-mod">@settings.Label</label>
1315 }
1316 @if (!string.IsNullOrEmpty(settings.HelpText))
1317 {
1318 <small class="form__help-text">@settings.HelpText</small>
1319 }
1320 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1321 </div>
1322 }
1323 @using System.Reflection
1324 @using Dynamicweb.Rapido.Blocks.Components.General
1325 @using Dynamicweb.Rapido.Blocks.Components
1326
1327
1328 @* Component *@
1329
1330 @helper RenderCheckboxListField(CheckboxListField settings)
1331 {
1332 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1333 @if (!string.IsNullOrEmpty(settings.Label))
1334 {
1335 <label>@settings.Label</label>
1336 }
1337 @if (!string.IsNullOrEmpty(settings.HelpText))
1338 {
1339 <small class="form__help-text">@settings.HelpText</small>
1340 }
1341
1342 @foreach (var item in settings.Options)
1343 {
1344 if (settings.Required)
1345 {
1346 item.Required = true;
1347 }
1348 if (settings.Disabled)
1349 {
1350 item.Disabled = true;
1351 }
1352 if (!string.IsNullOrEmpty(settings.Name))
1353 {
1354 item.Name = settings.Name;
1355 }
1356 if (!string.IsNullOrEmpty(settings.CssClass))
1357 {
1358 item.CssClass += settings.CssClass;
1359 }
1360
1361 /* value is not supported */
1362
1363 if (!string.IsNullOrEmpty(settings.OnClick))
1364 {
1365 item.OnClick += settings.OnClick;
1366 }
1367 if (!string.IsNullOrEmpty(settings.OnChange))
1368 {
1369 item.OnChange += settings.OnChange;
1370 }
1371 @Render(item)
1372 }
1373
1374 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1375 </div>
1376 }
1377 @using Dynamicweb.Rapido.Blocks.Components.General
1378
1379 @* Component *@
1380
1381 @helper RenderSearch(Search settings)
1382 {
1383 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? "";
1384 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? "";
1385
1386 if (string.IsNullOrEmpty(settings.Id))
1387 {
1388 settings.Id = Guid.NewGuid().ToString("N");
1389 }
1390
1391 var resultAttributes = new Dictionary<string, string>();
1392
1393 if (settings.PageSize != 0)
1394 {
1395 resultAttributes.Add("data-page-size", settings.PageSize.ToString());
1396 }
1397 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl))
1398 {
1399 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl);
1400 if (!string.IsNullOrEmpty(groupValue))
1401 {
1402 resultAttributes.Add("data-selected-group", groupValue);
1403 }
1404 if (!string.IsNullOrEmpty(settings.GroupsParameter))
1405 {
1406 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter);
1407 }
1408 }
1409 resultAttributes.Add("data-force-init", "true");
1410 if (settings.GoToFirstSearchResultOnEnter)
1411 {
1412 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower());
1413 }
1414 if (!string.IsNullOrEmpty(settings.SearchParameter))
1415 {
1416 resultAttributes.Add("data-search-parameter", settings.SearchParameter);
1417 }
1418 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl);
1419 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId);
1420
1421 if (settings.SecondSearchData != null)
1422 {
1423 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl);
1424 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId);
1425 }
1426 if (!string.IsNullOrEmpty(settings.ResultsPageUrl))
1427 {
1428 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl);
1429 }
1430
1431 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1432
1433 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : "";
1434
1435 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)>
1436 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl))
1437 {
1438 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button>
1439 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul>
1440 }
1441
1442 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue">
1443
1444 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")">
1445 @if (settings.SecondSearchData != null)
1446 {
1447 <div class="search__column search__column--products dw-mod">
1448 <div class="search__column-header dw-mod">@Translate("Products")</div>
1449 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul>
1450 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl))
1451 {
1452 @Render(new Link {
1453 Title = Translate("View all"),
1454 CssClass = "js-view-all-button u-margin",
1455 Href = settings.SearchData.ResultsPageUrl
1456 });
1457 }
1458 </div>
1459 <div class="search__column search__column--pages dw-mod">
1460 <div class="search__column-header">@Translate("Pages")</div>
1461 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul>
1462 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl))
1463 {
1464 @Render(new Link
1465 {
1466 Title = Translate("View all"),
1467 CssClass = "js-view-all-button u-margin",
1468 Href = settings.SecondSearchData.ResultsPageUrl
1469 });
1470 }
1471 </div>
1472 }
1473 else
1474 {
1475 <div class="search__column search__column--only dw-mod">
1476 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul>
1477 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl))
1478 {
1479 @Render(new Link {
1480 Title = Translate("View all"),
1481 CssClass = "js-view-all-button u-margin",
1482 Href = settings.SearchData.ResultsPageUrl
1483 });
1484 }
1485 </div>
1486 }
1487 </div>
1488
1489 @if (settings.SearchButton != null)
1490 {
1491 settings.SearchButton.CssClass += " search__btn js-search-btn";
1492 if (settings.RenderDefaultSearchIcon)
1493 {
1494 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue };
1495 }
1496 @Render(settings.SearchButton);
1497 }
1498 </div>
1499 }
1500 @using System.Reflection
1501 @using Dynamicweb.Rapido.Blocks.Components.General
1502 @using Dynamicweb.Rapido.Blocks.Components
1503
1504
1505 @* Component *@
1506
1507 @helper RenderSelectField(SelectField settings)
1508 {
1509 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1510 {
1511 settings.Id = Guid.NewGuid().ToString("N");
1512 }
1513
1514 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
1515 @if (!string.IsNullOrEmpty(settings.Label))
1516 {
1517 <label for="@settings.Id">@settings.Label</label>
1518 }
1519 @if (!string.IsNullOrEmpty(settings.HelpText))
1520 {
1521 <small class="form__help-text">@settings.HelpText</small>
1522 }
1523
1524 @if (settings.ActionButton != null)
1525 {
1526 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1527 <div class="form__field-combi u-no-margin dw-mod">
1528 @RenderSelectBase(settings)
1529 @Render(settings.ActionButton)
1530 </div>
1531 }
1532 else
1533 {
1534 @RenderSelectBase(settings)
1535 }
1536
1537 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1538 </div>
1539 }
1540
1541 @helper RenderSelectBase(SelectField settings)
1542 {
1543 var attributes = new Dictionary<string, string>();
1544
1545 /*base settings*/
1546 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1547 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1548 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1549 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1550 if (settings.Required) { attributes.Add("required", "true"); }
1551 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1552 /*end*/
1553
1554 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1555
1556 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod">
1557 @if (settings.Default != null)
1558 {
1559 @Render(settings.Default)
1560 }
1561
1562 @foreach (var item in settings.Options)
1563 {
1564 if (!string.IsNullOrEmpty(settings.Value)) {
1565 item.Checked = item.Value == settings.Value;
1566 }
1567 @Render(item)
1568 }
1569 </select>
1570 }
1571 @using System.Reflection
1572 @using Dynamicweb.Rapido.Blocks.Components.General
1573 @using Dynamicweb.Rapido.Blocks.Components
1574
1575 @* Component *@
1576
1577 @helper RenderRadioButtonField(RadioButtonField settings)
1578 {
1579 var attributes = new Dictionary<string, string>();
1580 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1581 {
1582 settings.Id = Guid.NewGuid().ToString("N");
1583 }
1584
1585 /*base settings*/
1586 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1587 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1588 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1589 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1590 if (settings.Required) { attributes.Add("required", "true"); }
1591 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1592 /*end*/
1593
1594 attributes.Add("type", "radio");
1595 if (settings.Checked) { attributes.Add("checked", "true"); }
1596 settings.CssClass = "form__control " + settings.CssClass;
1597 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); }
1598
1599 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1600
1601 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1602 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1603 @if (!string.IsNullOrEmpty(settings.Label))
1604 {
1605 <label for="@settings.Id" class="dw-mod">@settings.Label</label>
1606 }
1607 @if (!string.IsNullOrEmpty(settings.HelpText))
1608 {
1609 <small class="form__help-text">@settings.HelpText</small>
1610 }
1611 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1612 </div>
1613 }
1614 @using System.Reflection
1615 @using Dynamicweb.Rapido.Blocks.Components.General
1616 @using Dynamicweb.Rapido.Blocks.Components
1617
1618
1619 @* Component *@
1620
1621 @helper RenderRadioButtonListField(RadioButtonListField settings)
1622 {
1623 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1624
1625 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1626 @if (!string.IsNullOrEmpty(settings.Label))
1627 {
1628 <label>@settings.Label</label>
1629 }
1630 @if (!string.IsNullOrEmpty(settings.HelpText))
1631 {
1632 <small class="form__help-text">@settings.HelpText</small>
1633 }
1634
1635 @foreach (var item in settings.Options)
1636 {
1637 if (settings.Required)
1638 {
1639 item.Required = true;
1640 }
1641 if (settings.Disabled)
1642 {
1643 item.Disabled = true;
1644 }
1645 if (!string.IsNullOrEmpty(settings.Name))
1646 {
1647 item.Name = settings.Name;
1648 }
1649 if (!string.IsNullOrEmpty(settings.Value) && settings.Value == item.Value)
1650 {
1651 item.Checked = true;
1652 }
1653 if (!string.IsNullOrEmpty(settings.OnClick))
1654 {
1655 item.OnClick += settings.OnClick;
1656 }
1657 if (!string.IsNullOrEmpty(settings.OnChange))
1658 {
1659 item.OnChange += settings.OnChange;
1660 }
1661 if (!string.IsNullOrEmpty(settings.CssClass))
1662 {
1663 item.CssClass += settings.CssClass;
1664 }
1665 @Render(item)
1666 }
1667
1668 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1669 </div>
1670 }
1671 @using System.Reflection
1672 @using Dynamicweb.Rapido.Blocks.Components.General
1673 @using Dynamicweb.Rapido.Blocks.Components
1674
1675
1676 @* Component *@
1677
1678 @helper RenderNotificationMessage(NotificationMessage settings)
1679 {
1680 if (!string.IsNullOrEmpty(settings.Message))
1681 {
1682 var attributes = new Dictionary<string, string>();
1683 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1684
1685 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower();
1686 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>@settings.Message</div>
1687 }
1688 }
1689 @using Dynamicweb.Rapido.Blocks.Components.General
1690
1691
1692 @* Component *@
1693
1694 @helper RenderHandlebarsRoot(HandlebarsRoot settings) {
1695 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : "";
1696
1697 <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>
1698 @if (settings.SubBlocks != null) {
1699 @RenderBlockList(settings.SubBlocks)
1700 }
1701 </div>
1702 }
1703 @using System.Reflection
1704 @using Dynamicweb.Rapido.Blocks.Components.General
1705 @using Dynamicweb.Rapido.Blocks.Components
1706 @using System.Text.RegularExpressions
1707
1708
1709 @* Component *@
1710
1711 @helper RenderSticker(Sticker settings) {
1712 if (!String.IsNullOrEmpty(settings.Title)) {
1713 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : "";
1714 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : "";
1715
1716 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1717 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) {
1718 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : "";
1719 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : "";
1720 optionalAttributes.Add("style", styleTag);
1721 }
1722
1723 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div>
1724 }
1725 }
1726
1727 @using System.Reflection
1728 @using Dynamicweb.Rapido.Blocks.Components.General
1729 @using Dynamicweb.Rapido.Blocks.Components
1730
1731
1732 @* Component *@
1733
1734 @helper RenderStickersCollection(StickersCollection settings)
1735 {
1736 if (settings.Stickers.Count > 0)
1737 {
1738 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
1739
1740 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1741 @foreach (Sticker sticker in settings.Stickers)
1742 {
1743 @Render(sticker)
1744 }
1745 </div>
1746 }
1747 }
1748
1749 @using Dynamicweb.Rapido.Blocks.Components.General
1750
1751
1752 @* Component *@
1753
1754 @helper RenderForm(Form settings) {
1755 if (settings != null)
1756 {
1757 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
1758 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); };
1759 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); };
1760 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); };
1761 var enctypes = new Dictionary<string, string>
1762 {
1763 { "multipart", "multipart/form-data" },
1764 { "text", "text/plain" },
1765 { "application", "application/x-www-form-urlencoded" }
1766 };
1767 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); };
1768 optionalAttributes.Add("method", settings.Method.ToString());
1769
1770 if (!string.IsNullOrEmpty(settings.FormStartMarkup))
1771 {
1772 @settings.FormStartMarkup
1773 }
1774 else
1775 {
1776 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1777 }
1778
1779 foreach (var field in settings.GetFields())
1780 {
1781 @Render(field)
1782 }
1783
1784 @:</form>
1785 }
1786 }
1787 @using System.Reflection
1788 @using Dynamicweb.Rapido.Blocks.Components.General
1789 @using Dynamicweb.Rapido.Blocks.Components
1790
1791
1792 @* Component *@
1793
1794 @helper RenderText(Text settings)
1795 {
1796 @settings.Content
1797 }
1798 @using System.Reflection
1799 @using Dynamicweb.Rapido.Blocks.Components.General
1800 @using Dynamicweb.Rapido.Blocks.Components
1801
1802
1803 @* Component *@
1804
1805 @helper RenderContentModule(ContentModule settings) {
1806 if (!string.IsNullOrEmpty(settings.Content))
1807 {
1808 @settings.Content
1809 }
1810 }
1811 @using System.Reflection
1812 @using Dynamicweb.Rapido.Blocks.Components.General
1813 @using Dynamicweb.Rapido.Blocks.Components
1814
1815
1816 @* Component *@
1817
1818 @helper RenderModal(Modal settings) {
1819 if (settings != null)
1820 {
1821 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N");
1822
1823 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : "";
1824
1825 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange />
1826
1827 <div class="modal-container u-no-print">
1828 @if (!settings.DisableDarkOverlay)
1829 {
1830 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label>
1831 }
1832 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal">
1833 @if (settings.Heading != null)
1834 {
1835 if (!string.IsNullOrEmpty(settings.Heading.Title))
1836 {
1837 <div class="modal__header modal-header bs-border-bottom">
1838 @Render(settings.Heading)
1839 <label for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label>
1840 </div>
1841 }else
1842 {
1843 <div class="modal__header modal-header bs-py-2">
1844 <div class="bs-visibility-hidden"></div>
1845 <label class="bs-m-0" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label>
1846 </div>
1847 }
1848 }
1849 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")">
1850 @if (!string.IsNullOrEmpty(settings.BodyText))
1851 {
1852 @settings.BodyText
1853 }
1854 @if (settings.BodyTemplate != null)
1855 {
1856 @settings.BodyTemplate
1857 }
1858 @{
1859 var actions = settings.GetActions();
1860 }
1861 </div>
1862 @if (actions.Length > 0)
1863 {
1864 <div class="modal__footer">
1865 @foreach (var action in actions)
1866 {
1867 action.CssClass += " u-no-margin";
1868 @Render(action)
1869 }
1870 </div>
1871 }
1872 @* <label class="new-modal__close-btn" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> *@
1873 </div>
1874 </div>
1875 }
1876 }
1877 @using Dynamicweb.Rapido.Blocks.Components.General
1878
1879 @* Component *@
1880
1881 @helper RenderMediaListItem(MediaListItem settings)
1882 {
1883 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")>
1884 @if (!string.IsNullOrEmpty(settings.Label))
1885 {
1886 if (!string.IsNullOrEmpty(settings.Link))
1887 {
1888 @Render(new Link
1889 {
1890 Href = settings.Link,
1891 CssClass = "media-list-item__sticker dw-mod",
1892 ButtonLayout = ButtonLayout.None,
1893 Title = settings.Label,
1894 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : ""
1895 })
1896 }
1897 else if (!string.IsNullOrEmpty(settings.OnClick))
1898 {
1899 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)">
1900 <span class="u-uppercase">@settings.Label</span>
1901 </span>
1902 }
1903 else
1904 {
1905 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod">
1906 <span class="u-uppercase">@settings.Label</span>
1907 </span>
1908 }
1909 }
1910 <div class="media-list-item__wrap">
1911 <div class="media-list-item__info dw-mod">
1912 <div class="media-list-item__header dw-mod">
1913 @if (!string.IsNullOrEmpty(settings.Title))
1914 {
1915 if (!string.IsNullOrEmpty(settings.Link))
1916 {
1917 @Render(new Link
1918 {
1919 Href = settings.Link,
1920 CssClass = "media-list-item__name dw-mod",
1921 ButtonLayout = ButtonLayout.None,
1922 Title = settings.Title,
1923 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : ""
1924 })
1925 }
1926 else if (!string.IsNullOrEmpty(settings.OnClick))
1927 {
1928 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span>
1929 }
1930 else
1931 {
1932 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span>
1933 }
1934 }
1935
1936 @if (!string.IsNullOrEmpty(settings.Status))
1937 {
1938 <div class="media-list-item__state dw-mod">@settings.Status</div>
1939 }
1940 </div>
1941 @{
1942 settings.InfoTable.CssClass += " media-list-item__parameters-table";
1943 }
1944
1945 @Render(settings.InfoTable)
1946 </div>
1947 <div class="media-list-item__actions dw-mod">
1948 <div class="media-list-item__actions-list dw-mod">
1949 @{
1950 var actions = settings.GetActions();
1951
1952 foreach (ButtonBase action in actions)
1953 {
1954 action.ButtonLayout = ButtonLayout.None;
1955 action.CssClass += " media-list-item__action link";
1956
1957 @Render(action)
1958 }
1959 }
1960 </div>
1961
1962 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title))
1963 {
1964 settings.SelectButton.CssClass += " u-no-margin";
1965
1966 <div class="media-list-item__action-button">
1967 @Render(settings.SelectButton)
1968 </div>
1969 }
1970 </div>
1971 </div>
1972 </div>
1973 }
1974 @using Dynamicweb.Rapido.Blocks.Components.General
1975 @using Dynamicweb.Rapido.Blocks.Components
1976
1977 @helper RenderTable(Table settings)
1978 {
1979 Dictionary<string, string> attributes = new Dictionary<string, string>();
1980 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1981
1982 var enumToClasses = new Dictionary<TableDesign, string>
1983 {
1984 { TableDesign.Clean, "table--clean" },
1985 { TableDesign.Bordered, "table--bordered" },
1986 { TableDesign.Striped, "table--striped" },
1987 { TableDesign.Hover, "table--hover" },
1988 { TableDesign.Compact, "table--compact" },
1989 { TableDesign.Condensed, "table--condensed" },
1990 { TableDesign.NoTopBorder, "table--no-top-border" }
1991 };
1992 string tableDesignClass = "";
1993 if (settings.Design != TableDesign.None)
1994 {
1995 tableDesignClass = enumToClasses[settings.Design];
1996 }
1997
1998 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); }
1999
2000 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2001
2002 <table @ComponentMethods.AddAttributes(resultAttributes)>
2003 @if (settings.Header != null)
2004 {
2005 <thead>
2006 @Render(settings.Header)
2007 </thead>
2008 }
2009 <tbody>
2010 @foreach (var row in settings.Rows)
2011 {
2012 @Render(row)
2013 }
2014 </tbody>
2015 @if (settings.Footer != null)
2016 {
2017 <tfoot>
2018 @Render(settings.Footer)
2019 </tfoot>
2020 }
2021 </table>
2022 }
2023 @using Dynamicweb.Rapido.Blocks.Components.General
2024 @using Dynamicweb.Rapido.Blocks.Components
2025
2026 @helper RenderTableRow(TableRow settings)
2027 {
2028 Dictionary<string, string> attributes = new Dictionary<string, string>();
2029 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
2030
2031 var enumToClasses = new Dictionary<TableRowDesign, string>
2032 {
2033 { TableRowDesign.NoBorder, "table__row--no-border" },
2034 { TableRowDesign.Border, "table__row--border" },
2035 { TableRowDesign.TopBorder, "table__row--top-line" },
2036 { TableRowDesign.BottomBorder, "table__row--bottom-line" },
2037 { TableRowDesign.Solid, "table__row--solid" }
2038 };
2039
2040 string tableRowDesignClass = "";
2041 if (settings.Design != TableRowDesign.None)
2042 {
2043 tableRowDesignClass = enumToClasses[settings.Design];
2044 }
2045
2046 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); }
2047
2048 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2049
2050 <tr @ComponentMethods.AddAttributes(resultAttributes)>
2051 @foreach (var cell in settings.Cells)
2052 {
2053 if (settings.IsHeaderRow)
2054 {
2055 cell.IsHeader = true;
2056 }
2057 @Render(cell)
2058 }
2059 </tr>
2060 }
2061 @using Dynamicweb.Rapido.Blocks.Components.General
2062 @using Dynamicweb.Rapido.Blocks.Components
2063 @using Dynamicweb.Core
2064
2065 @helper RenderTableCell(TableCell settings)
2066 {
2067 Dictionary<string, string> attributes = new Dictionary<string, string>();
2068 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
2069 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); }
2070 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); }
2071 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); }
2072
2073 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2074
2075 string tagName = settings.IsHeader ? "th" : "td";
2076
2077 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">")
2078 @settings.Content
2079 @("</" + tagName + ">");
2080 }
2081 @using System.Linq
2082 @using Dynamicweb.Rapido.Blocks.Components.General
2083
2084 @* Component *@
2085
2086 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings)
2087 {
2088 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter
2089 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring
2090
2091 if (settings.NumberOfPages > 1)
2092 {
2093 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx";
2094 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation");
2095 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings);
2096
2097 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel">
2098 @if (settings.ShowPagingInfo)
2099 {
2100 <div class="pager__info dw-mod">
2101 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages
2102 </div>
2103 }
2104 <ul class="pager__list dw-mod">
2105 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls)
2106 {
2107 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon })
2108 }
2109 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls)
2110 {
2111 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon })
2112 }
2113 @if (settings.GetPages().Any())
2114 {
2115 foreach (var page in settings.GetPages())
2116 {
2117 @Render(page)
2118 }
2119 }
2120 else
2121 {
2122 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++)
2123 {
2124 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString());
2125 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) });
2126 }
2127 }
2128 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls)
2129 {
2130 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon })
2131 }
2132 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls)
2133 {
2134 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon })
2135 }
2136 </ul>
2137 </div>
2138 }
2139 }
2140
2141 @helper RenderPaginationItem(PaginationItem settings)
2142 {
2143 if (settings.Icon == null)
2144 {
2145 settings.Icon = new Icon();
2146 }
2147
2148 settings.Icon.Label = settings.Label;
2149 <li class="pager__btn dw-mod">
2150 @if (settings.IsActive)
2151 {
2152 <span class="pager__num pager__num--current dw-mod">
2153 @Render(settings.Icon)
2154 </span>
2155 }
2156 else
2157 {
2158 <a href="@settings.Link" class="pager__num dw-mod">
2159 @Render(settings.Icon)
2160 </a>
2161 }
2162 </li>
2163 }
2164
2165
2166 @using Dynamicweb.Rapido.Blocks.Components.General
2167 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
2168
2169
2170 @using Dynamicweb.Frontend
2171 @using System.Reflection
2172 @using Dynamicweb.Content.Items
2173 @using System.Web.UI.HtmlControls
2174 @using Dynamicweb.Rapido.Blocks.Components
2175 @using Dynamicweb.Rapido.Blocks
2176 @using Dynamicweb.Rapido.Blocks.Components.Articles
2177
2178 @* Components for the articles *@
2179 @using System.Reflection
2180 @using Dynamicweb.Rapido.Blocks.Components.Articles
2181
2182
2183 @* Component for the articles *@
2184
2185 @helper RenderArticleBanner(dynamic settings) {
2186 string filterClasses = "image-filter image-filter--darken";
2187 settings.Layout = ArticleHeaderLayout.Banner;
2188
2189 if (settings.Image != null)
2190 {
2191 if (settings.Image.Path != null)
2192 {
2193 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
2194 <div class="background-image @filterClasses dw-mod">
2195 <div class="background-image__wrapper @filterClasses dw-mod">
2196 @{
2197 settings.Image.CssClass += "background-image__cover dw-mod";
2198 }
2199 @Render(settings.Image)
2200 </div>
2201 </div>
2202 <div class="center-container dw-mod">
2203 <div class="grid">
2204 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg">
2205 <div class="u-left-middle">
2206 <div>
2207 @if (!String.IsNullOrEmpty(settings.Heading))
2208 {
2209 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
2210 }
2211 @if (!String.IsNullOrEmpty(settings.Subheading))
2212 {
2213 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
2214 }
2215 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2216 {
2217 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
2218 }
2219 @if (!String.IsNullOrEmpty(settings.Link)) {
2220 <div class="grid__cell">
2221 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2222 </div>
2223 }
2224 </div>
2225 </div>
2226 </div>
2227 @if (settings.ExternalParagraphId != 0)
2228 {
2229 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod">
2230 <div class="u-color-light-gray--bg u-color-dark dw-mod">
2231 @RenderParagraphContent(settings.ExternalParagraphId)
2232 </div>
2233 </div>
2234 }
2235
2236 </div>
2237 </div>
2238 </section>
2239 if (!String.IsNullOrEmpty(settings.Image.Caption)) {
2240 <div class="image-caption dw-mod">@settings.Image.Caption</div>
2241 }
2242 }
2243 else
2244 {
2245 settings.Layout = ArticleHeaderLayout.Clean;
2246 @RenderArticleCleanHeader(settings);
2247 }
2248 }
2249 else
2250 {
2251 settings.Layout = ArticleHeaderLayout.Clean;
2252 @RenderArticleCleanHeader(settings);
2253 }
2254 }
2255 @using System.Reflection
2256 @using Dynamicweb.Rapido.Blocks.Components
2257 @using Dynamicweb.Rapido.Blocks.Components.General
2258 @using Dynamicweb.Rapido.Blocks.Components.Articles
2259 @using Dynamicweb.Rapido.Blocks
2260
2261
2262 @* Component for the articles *@
2263
2264 @helper RenderArticleHeader(ArticleHeader settings) {
2265 dynamic[] methodParameters = new dynamic[1];
2266 methodParameters[0] = settings;
2267 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom");
2268
2269 if (customMethod != null)
2270 {
2271 @customMethod.Invoke(this, methodParameters).ToString();
2272 } else {
2273 switch (settings.Layout)
2274 {
2275 case ArticleHeaderLayout.Clean:
2276 @RenderArticleCleanHeader(settings);
2277 break;
2278 case ArticleHeaderLayout.Split:
2279 @RenderArticleSplitHeader(settings);
2280 break;
2281 case ArticleHeaderLayout.Banner:
2282 @RenderArticleBannerHeader(settings);
2283 break;
2284 case ArticleHeaderLayout.Overlay:
2285 @RenderArticleOverlayHeader(settings);
2286 break;
2287 default:
2288 @RenderArticleCleanHeader(settings);
2289 break;
2290 }
2291 }
2292 }
2293
2294 @helper RenderArticleCleanHeader(ArticleHeader settings) {
2295 dynamic[] methodParameters = new dynamic[1];
2296 methodParameters[0] = settings;
2297 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom");
2298
2299 if (customMethod != null)
2300 {
2301 @customMethod.Invoke(this, methodParameters).ToString();
2302 }
2303 else
2304 {
2305 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
2306
2307 <div class="grid grid--align-content-start grid--justify-start">
2308 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod">
2309 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0)
2310 {
2311 <div class="u-border-bottom u-padding-bottom">
2312 @if (!String.IsNullOrEmpty(settings.Category))
2313 {
2314 <div class="u-pull--left">
2315 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
2316 </div>
2317 }
2318 <div class="u-pull--right">
2319 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2320 {
2321 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small>
2322 }
2323 @if (settings.RatingOutOf != 0)
2324 {
2325 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2326 }
2327 </div>
2328 </div>
2329 }
2330
2331 <div class="grid__cell">
2332 @if (!String.IsNullOrEmpty(settings.Heading))
2333 {
2334 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
2335 }
2336 @if (settings.Image != null)
2337 {
2338 if (settings.Image.Path != null)
2339 {
2340 <div class="u-padding-bottom--lg">
2341 @Render(settings.Image)
2342 </div>
2343 }
2344 }
2345 @if (!String.IsNullOrEmpty(settings.Subheading))
2346 {
2347 <div class="article__leadtext dw-mod">@settings.Subheading</div>
2348 }
2349 @if (!String.IsNullOrEmpty(settings.Link))
2350 {
2351 <div class="grid__cell">
2352 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2353 </div>
2354 }
2355 </div>
2356 </div>
2357 @if (settings.ExternalParagraphId != 0)
2358 {
2359 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod">
2360 @RenderParagraphContent(settings.ExternalParagraphId)
2361 </div>
2362 }
2363 </div>
2364 }
2365 }
2366
2367 @helper RenderArticleSplitHeader(ArticleHeader settings) {
2368 dynamic[] methodParameters = new dynamic[1];
2369 methodParameters[0] = settings;
2370 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom");
2371
2372 if (customMethod != null)
2373 {
2374 @customMethod.Invoke(this, methodParameters).ToString();
2375 }
2376 else
2377 {
2378 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6";
2379
2380 if (settings.Image != null)
2381 {
2382 if (settings.Image.Path != null)
2383 {
2384 <section class="multiple-paragraphs-container paragraph-container--full-width">
2385 <div class="grid">
2386 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod">
2387 <div class="u-left-middle u-padding--lg">
2388 <div>
2389 @if (!String.IsNullOrEmpty(settings.Category))
2390 {
2391 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
2392 }
2393 @if (!String.IsNullOrEmpty(settings.Heading))
2394 {
2395 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
2396 }
2397 @if (!String.IsNullOrEmpty(settings.Subheading))
2398 {
2399 <div class="article__leadtext dw-mod">@settings.Subheading</div>
2400 }
2401 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2402 {
2403 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small>
2404 }
2405 @if (settings.RatingOutOf != 0)
2406 {
2407 <div class="u-pull--right">
2408 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2409 </div>
2410 }
2411 @if (!String.IsNullOrEmpty(settings.Link)) {
2412 <div class="u-full-width u-pull--left u-margin-top">
2413 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2414 </div>
2415 }
2416 </div>
2417 </div>
2418 </div>
2419 <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>
2420 @if (settings.ExternalParagraphId != 0)
2421 {
2422 <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">
2423 @RenderParagraphContent(settings.ExternalParagraphId)
2424 </div>
2425 }
2426 </div>
2427 </section>
2428 }
2429 }
2430 else
2431 {
2432 @RenderArticleCleanHeader(settings);
2433 }
2434 }
2435 }
2436
2437 @helper RenderArticleOverlayHeader(ArticleHeader settings) {
2438 dynamic[] methodParameters = new dynamic[1];
2439 methodParameters[0] = settings;
2440 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom");
2441
2442 if (customMethod != null)
2443 {
2444 @customMethod.Invoke(this, methodParameters).ToString();
2445 }
2446 else
2447 {
2448 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
2449 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : "";
2450
2451 if (settings.Image != null)
2452 {
2453 if (settings.Image.Path != null)
2454 {
2455 if (settings.ExternalParagraphId == 0)
2456 {
2457 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
2458 <div class="background-image image-filter image-filter--darken dw-mod">
2459 <div class="background-image__wrapper image-filter image-filter--darken dw-mod">
2460 @{
2461 settings.Image.CssClass += "background-image__cover dw-mod";
2462 }
2463 @Render(settings.Image)
2464 </div>
2465 </div>
2466 <div class="center-container dw-mod">
2467 <div class="grid @contentAlignment">
2468 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl u-no-padding dw-mod">
2469 @if (!String.IsNullOrEmpty(settings.Heading))
2470 {
2471 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
2472 }
2473 @if (!String.IsNullOrEmpty(settings.Subheading))
2474 {
2475 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
2476 }
2477 <div class="u-margin-top">
2478 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2479 {
2480 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
2481 }
2482 @if (settings.RatingOutOf != 0)
2483 {
2484 <div class="u-pull--right">
2485 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2486 </div>
2487 }
2488 </div>
2489 @if (!String.IsNullOrEmpty(settings.Link))
2490 {
2491 <div class="grid__cell">
2492 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2493 </div>
2494 }
2495 </div>
2496 </div>
2497 </div>
2498 </section>
2499 }
2500 else
2501 {
2502 @RenderArticleBanner(settings);
2503 }
2504 }
2505 }
2506 else
2507 {
2508 @RenderArticleCleanHeader(settings);
2509 }
2510 }
2511 }
2512
2513 @helper RenderArticleBannerHeader(dynamic settings) {
2514 dynamic[] methodParameters = new dynamic[1];
2515 methodParameters[0] = settings;
2516 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom");
2517
2518 if (customMethod != null)
2519 {
2520 @customMethod.Invoke(this, methodParameters).ToString();
2521 }
2522 else
2523 {
2524 @RenderArticleBanner(settings);
2525 }
2526 }
2527 @using System.Reflection
2528 @using System.Text.RegularExpressions;
2529 @using Dynamicweb.Frontend
2530 @using Dynamicweb.Content.Items
2531 @using Dynamicweb.Rapido.Blocks.Components
2532 @using Dynamicweb.Rapido.Blocks.Components.Articles
2533 @using Dynamicweb.Rapido.Blocks
2534
2535 @* Component for the articles *@
2536
2537 @helper RenderArticleBodyRow(ArticleBodyRow settings)
2538 {
2539 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : "";
2540 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : "";
2541
2542 <div class="grid grid--align-content-start @contentAlignment @position dw-mod">
2543 @RenderBlockList(settings.SubBlocks)
2544 </div>
2545 }
2546 @using System.Reflection
2547 @using Dynamicweb.Rapido.Blocks.Components
2548 @using Dynamicweb.Rapido.Blocks.Components.General
2549 @using Dynamicweb.Rapido.Blocks.Components.Articles
2550 @using Dynamicweb.Rapido.Blocks
2551
2552 @* Component for the articles *@
2553
2554 @helper RenderArticleImage(ArticleImage settings)
2555 {
2556 if (settings.Image != null)
2557 {
2558 if (settings.Image.Path != null)
2559 {
2560 <div class="u-margin-bottom--lg">
2561 @Render(settings.Image)
2562 </div>
2563 }
2564 }
2565 }
2566 @using System.Reflection
2567 @using Dynamicweb.Rapido.Blocks.Components
2568 @using Dynamicweb.Rapido.Blocks.Components.Articles
2569
2570
2571 @* Component for the articles *@
2572
2573 @helper RenderArticleSubHeader(ArticleSubHeader settings)
2574 {
2575 if (!String.IsNullOrEmpty(settings.Title))
2576 {
2577 <h2 class="article__header">@settings.Title</h2>
2578 }
2579 }
2580 @using System.Reflection
2581 @using Dynamicweb.Rapido.Blocks.Components
2582 @using Dynamicweb.Rapido.Blocks.Components.Articles
2583 @using Dynamicweb.Rapido.Blocks
2584
2585
2586 @* Component for the articles *@
2587
2588 @helper RenderArticleText(ArticleText settings)
2589 {
2590 if (!String.IsNullOrEmpty(settings.Text))
2591 {
2592 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : "";
2593
2594 <div class="article__paragraph @greatTextClass">
2595 @settings.Text
2596 </div>
2597 }
2598 }
2599 @using System.Reflection
2600 @using Dynamicweb.Rapido.Blocks.Components
2601 @using Dynamicweb.Rapido.Blocks.Components.Articles
2602 @using Dynamicweb.Rapido.Blocks
2603
2604
2605 @* Component for the articles *@
2606
2607 @helper RenderArticleQuote(ArticleQuote settings)
2608 {
2609 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty);
2610
2611 <div class="grid u-padding-bottom--lg">
2612 @if (settings.Image != null)
2613 {
2614 if (settings.Image.Path != null) {
2615 <div class="grid__col-3">
2616 <div class="grid__cell-img">
2617 @{
2618 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author;
2619 settings.Image.CssClass += " article__image article__image--ball";
2620 settings.Image.ImageDefault.Width = 200;
2621 settings.Image.ImageDefault.Height = 200;
2622 }
2623 @Render(settings.Image)
2624 </div>
2625 </div>
2626 }
2627 }
2628 <div class="grid__col-auto">
2629 @if (!String.IsNullOrEmpty(settings.Text))
2630 {
2631 <div class="article__quote dw-mod">
2632 <i class="fas fa-quote-right u-margin-bottom--lg"></i>
2633 @settings.Text
2634 <i class="fas fa-quote-right"></i>
2635 </div>
2636 }
2637 @if (!String.IsNullOrEmpty(settings.Author))
2638 {
2639 <div class="article__quote-author dw-mod">
2640 - @settings.Author
2641 </div>
2642 }
2643 </div>
2644 </div>
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 @* Component for the articles *@
2652
2653 @helper RenderArticleInfoTable(ArticleInfoTable settings)
2654 {
2655 <table class="table table--clean">
2656 @foreach (var row in settings.Rows)
2657 {
2658 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two";
2659
2660 <tr>
2661 @if (!String.IsNullOrEmpty(row.Icon))
2662 {
2663 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td>
2664 }
2665 <td class="u-no-margin-on-p-elements">
2666 <div class="u-bold">@row.Title</div>
2667 @if (!String.IsNullOrEmpty(row.SubTitle))
2668 {
2669 if (row.Link == null)
2670 {
2671 <div>@row.SubTitle</div>
2672 }
2673 else
2674 {
2675 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a>
2676 }
2677 }
2678 </td>
2679 </tr>
2680 }
2681 </table>
2682 }
2683 @using System.Reflection
2684 @using Dynamicweb.Rapido.Blocks.Components
2685 @using Dynamicweb.Rapido.Blocks.Components.General
2686 @using Dynamicweb.Rapido.Blocks.Components.Articles
2687 @using Dynamicweb.Rapido.Blocks
2688
2689 @* Component for the articles *@
2690
2691 @helper RenderArticleGalleryModal(ArticleGalleryModal settings)
2692 {
2693 Modal galleryModal = new Modal
2694 {
2695 Id = "ParagraphGallery",
2696 Width = ModalWidth.Full,
2697 BodyTemplate = RenderArticleGalleryModalContent()
2698 };
2699
2700 @Render(galleryModal)
2701 }
2702
2703 @helper RenderArticleGalleryModalContent() {
2704 <div class="modal__image-min-size-wrapper">
2705 @Render(new Image {
2706 Id = "ParagraphGallery",
2707 Path = "#",
2708 CssClass = "modal--full__img",
2709 DisableLazyLoad = true,
2710 DisableImageEngine = true
2711 })
2712 </div>
2713
2714 <div class="modal__images-counter" id="ParagraphGallery_counter"></div>
2715
2716 @Render(new Button {
2717 Id = "ParagraphGallery_prev",
2718 ButtonType = ButtonType.Button,
2719 ButtonLayout = ButtonLayout.None,
2720 CssClass = "modal__prev-btn",
2721 Icon = new Icon { Prefix = "far", Name = "fa-angle-left", LabelPosition = IconLabelPosition.After },
2722 OnClick = "Gallery.prevImage('ParagraphGallery')"
2723 })
2724
2725 @Render(new Button {
2726 Id = "ParagraphGallery_next",
2727 ButtonType = ButtonType.Button,
2728 ButtonLayout = ButtonLayout.None,
2729 CssClass = "modal__next-btn",
2730 Icon = new Icon { Prefix = "far", Name = "fa-angle-right", LabelPosition = IconLabelPosition.After },
2731 OnClick = "Gallery.nextImage('ParagraphGallery')"
2732 })
2733 }
2734 @using System.Reflection
2735 @using Dynamicweb.Rapido.Blocks.Components
2736 @using Dynamicweb.Rapido.Blocks.Components.Articles
2737 @using Dynamicweb.Rapido.Blocks
2738
2739
2740 @* Component for the articles *@
2741
2742 @helper RenderArticleRelated(ArticleRelated settings)
2743 {
2744 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : "";
2745 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : "";
2746
2747 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width">
2748 <div class="center-container dw-mod">
2749 <div class="grid u-padding">
2750 <div class="grid__col-md-12 grid__col-xs-12">
2751 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2>
2752 </div>
2753 </div>
2754
2755 <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>
2756
2757 <script id="RelatedSimpleTemplate" type="text/x-template">
2758 {{#.}}
2759 <div class="grid u-padding-bottom--lg">
2760 {{#Cases}}
2761 <div class="grid__col-lg-3 grid__col-sm-6 image-hover--zoom dw-mod">
2762 <a href="{{link}}" class="u-full-height u-color-light--bg">
2763 {{#if image}}
2764 <div class="u-color-light--bg u-no-padding dw-mod">
2765 <div class="flex-img image-hover__wrapper">
2766 <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}}" />
2767 </div>
2768 </div>
2769 {{/if}}
2770
2771 <div class="card u-color-light--bg dw-mod">
2772 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3>
2773 <p class="article__short-summary dw-mod">{{summary}}</p>
2774 </div>
2775 </a>
2776 </div>
2777 {{/Cases}}
2778 </div>
2779 {{/.}}
2780 </script>
2781 </div>
2782 </section>
2783 }
2784 @using System.Reflection
2785 @using Dynamicweb.Rapido.Blocks.Components
2786 @using Dynamicweb.Rapido.Blocks.Components.Articles
2787 @using Dynamicweb.Rapido.Blocks
2788
2789
2790 @* Component for the articles *@
2791
2792 @helper RenderArticleMenu(ArticleMenu settings)
2793 {
2794 if (!String.IsNullOrEmpty(settings.Title)) {
2795 <div class="u-margin u-border-bottom">
2796 <h3 class="u-no-margin">@settings.Title</h3>
2797 </div>
2798 }
2799
2800 <ul class="menu-left u-margin-bottom dw-mod">
2801 @foreach (var item in settings.Items)
2802 {
2803 @Render(item)
2804 }
2805 </ul>
2806 }
2807
2808 @helper RenderArticleMenuItem(ArticleMenuItem settings)
2809 {
2810 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#";
2811
2812 if (!String.IsNullOrEmpty(settings.Title)) {
2813 <li class="menu-left__item dw-mod">
2814 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a>
2815 </li>
2816 }
2817 }
2818 @using System.Reflection
2819 @using Dynamicweb.Rapido.Blocks.Components
2820 @using Dynamicweb.Rapido.Blocks.Components.Articles
2821 @using Dynamicweb.Rapido.Blocks
2822
2823 @* Component for the articles *@
2824
2825 @helper RenderArticleList(ArticleList settings)
2826 {
2827 if (Pageview != null)
2828 {
2829 bool isParagraph = Pageview.CurrentParagraph != null ? true : false;
2830 string[] sortArticlesListBy = new string[2];
2831
2832 if (isParagraph) {
2833 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2834 }
2835 else {
2836 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2837 }
2838
2839 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString();
2840
2841 if (!settings.DisablePagination) {
2842 @RenderItemList(new
2843 {
2844 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2845 ListSourceType = settings.SourceType,
2846 ListSourcePage = sourcePage,
2847 ItemFieldsList = "*",
2848 Filter = settings.Filter,
2849 ListOrderBy = sortArticlesListBy[0],
2850 ListOrderByDirection = sortArticlesListBy[1],
2851 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2852 ListSecondOrderByDirection = "ASC",
2853 IncludeAllChildItems = true,
2854 ListTemplate = settings.Template,
2855 ListPageSize = settings.PageSize.ToString()
2856 });
2857 } else {
2858 @RenderItemList(new
2859 {
2860 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2861 ListSourceType = settings.SourceType,
2862 ListSourcePage = sourcePage,
2863 ItemFieldsList = "*",
2864 Filter = settings.Filter,
2865 ListOrderBy = sortArticlesListBy[0],
2866 ListOrderByDirection = sortArticlesListBy[1],
2867 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2868 ListSecondOrderByDirection = "ASC",
2869 IncludeAllChildItems = true,
2870 ListTemplate = settings.Template,
2871 ListPageSize = settings.PageSize.ToString(),
2872 ListViewMode = "Partial",
2873 ListShowTo = settings.PageSize + 1
2874 });
2875 }
2876 }
2877 }
2878 @using System.Reflection
2879 @using Dynamicweb.Rapido.Blocks.Components.Articles
2880
2881
2882 @* Component for the articles *@
2883
2884 @helper RenderArticleSummary(ArticleSummary settings)
2885 {
2886 if (!String.IsNullOrEmpty(settings.Text))
2887 {
2888 <div class="article__summary dw-mod">@settings.Text</div>
2889 }
2890 }
2891 @using System.Reflection
2892 @using Dynamicweb.Rapido.Blocks.Components
2893 @using Dynamicweb.Rapido.Blocks.Components.Articles
2894 @using Dynamicweb.Rapido.Blocks
2895
2896 @* Component for the articles *@
2897
2898 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings)
2899 {
2900 string pageId = Pageview.ID.ToString();
2901 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All");
2902 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2903
2904 foreach (var option in settings.Categories)
2905 {
2906 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter;
2907 }
2908
2909 if (selectedFilter == pageId)
2910 {
2911 selectedFilter = Translate("All");
2912 }
2913
2914 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2915 {
2916 <div class="u-pull--right u-margin-left">
2917 <div class="collection u-no-margin">
2918 <h5>@Translate("Category")</h5>
2919 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2920 <div class="dropdown u-w180px dw-mod">
2921 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2922 <div class="dropdown__content dw-mod">
2923 @foreach (var option in settings.Categories)
2924 {
2925 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2926 }
2927 </div>
2928 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2929 </div>
2930 </div>
2931 </div>
2932 }
2933 else
2934 {
2935 <div class="u-full-width u-margin-bottom">
2936 <h5 class="u-no-margin">@Translate("Category")</h5>
2937 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2938 <div class="dropdown u-full-width dw-mod">
2939 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2940 <div class="dropdown__content dw-mod">
2941 @foreach (var option in settings.Categories)
2942 {
2943 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2944 }
2945 </div>
2946 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2947 </div>
2948 </div>
2949 }
2950 }
2951 @using System.Reflection
2952 @using Dynamicweb.Rapido.Blocks.Components
2953 @using Dynamicweb.Rapido.Blocks.Components.Articles
2954 @using Dynamicweb.Rapido.Blocks
2955 @using System.Collections.Generic
2956
2957 @* Component for the articles *@
2958
2959 @helper RenderArticleListFilter(ArticleListFilter settings)
2960 {
2961 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All");
2962 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2963
2964 if (settings.Options != null)
2965 {
2966 if (settings.Options is IEnumerable<dynamic>)
2967 {
2968 var options = (IEnumerable<dynamic>) settings.Options;
2969 settings.Options = options.OrderBy(item => item.Name);
2970 }
2971
2972 foreach (var option in settings.Options)
2973 {
2974 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter;
2975 }
2976
2977 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2978 {
2979 <div class="u-pull--right u-margin-left">
2980 <div class="collection u-no-margin">
2981 <h5>@settings.Label</h5>
2982 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
2983 <div class="dropdown u-w180px dw-mod">
2984 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
2985 <div class="dropdown__content dw-mod">
2986 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
2987 @foreach (var option in settings.Options)
2988 {
2989 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
2990 }
2991 </div>
2992 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
2993 </div>
2994 </div>
2995 </div>
2996 }
2997 else
2998 {
2999 <div class="u-full-width u-margin-bottom">
3000 <h5 class="u-no-margin">@settings.Label</h5>
3001 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
3002 <div class="dropdown u-full-width w-mod">
3003 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
3004 <div class="dropdown__content dw-mod">
3005 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
3006 @foreach (var option in settings.Options)
3007 {
3008 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
3009 }
3010 </div>
3011 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
3012 </div>
3013 </div>
3014 }
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
3022 @* Component for the articles *@
3023
3024 @helper RenderArticleListSearch(ArticleListSearch settings)
3025 {
3026 string searchParameter = !string.IsNullOrEmpty(settings.SearchParameter) ? settings.SearchParameter : "Title";
3027 string searchWord = HttpContext.Current.Request.QueryString.Get(searchParameter);
3028 string searchString = !string.IsNullOrEmpty(searchWord) ? searchWord.Trim('*') : "";
3029 string className = "u-w340px u-pull--right u-margin-left";
3030
3031 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
3032 {
3033 className = "u-full-width";
3034 }
3035
3036 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className">
3037 <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 + '*')">
3038 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button>
3039 </div>
3040 }
3041 @using System.Reflection
3042 @using Dynamicweb.Rapido.Blocks.Components
3043 @using Dynamicweb.Rapido.Blocks.Components.Articles
3044 @using Dynamicweb.Rapido.Blocks
3045
3046 @* Component for the articles *@
3047
3048 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings)
3049 {
3050 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div>
3051 }
3052 @using System.Reflection
3053 @using Dynamicweb.Rapido.Blocks.Components
3054 @using Dynamicweb.Rapido.Blocks.Components.General
3055 @using Dynamicweb.Rapido.Blocks.Components.Articles
3056 @using Dynamicweb.Rapido.Blocks
3057 @using System.Text.RegularExpressions
3058
3059 @* Component for the articles *@
3060
3061 @helper RenderArticleListItem(ArticleListItem settings)
3062 {
3063 switch (settings.Type) {
3064 case ArticleListItemType.Card:
3065 @RenderArticleListItemCard(settings);
3066 break;
3067 case ArticleListItemType.List:
3068 @RenderArticleListItemList(settings);
3069 break;
3070 case ArticleListItemType.Simple:
3071 @RenderArticleListItemSimple(settings);
3072 break;
3073 default:
3074 @RenderArticleListItemCard(settings);
3075 break;
3076 }
3077 }
3078
3079 @helper RenderArticleListItemCard(ArticleListItem settings) {
3080 <a href="@settings.Link" class="u-full-height u-color-light--bg">
3081 <div class="u-color-light--bg u-no-padding dw-mod">
3082 @if (settings.Logo != null)
3083 {
3084 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;" : "";
3085 settings.Logo.ImageDefault.Crop = 5;
3086 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
3087 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
3088 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
3089 @if (settings.Stickers != null)
3090 {
3091 if (settings.Stickers.Position != StickersListPosition.Custom)
3092 {
3093 @Render(settings.Stickers);
3094 }
3095 }
3096 @RenderImage(settings.Logo)
3097 </div>
3098 } else if (settings.Image != null)
3099 {
3100 <div class="flex-img image-hover__wrapper u-position-relative dw-mod">
3101 @if (settings.Stickers != null)
3102 {
3103 if (settings.Stickers.Position != StickersListPosition.Custom)
3104 {
3105 @Render(settings.Stickers);
3106 }
3107 }
3108 @Render(settings.Image)
3109 </div>
3110 }
3111 </div>
3112
3113 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
3114 {
3115 <div class="card u-color-light--bg dw-mod">
3116 @if (settings.Stickers != null)
3117 {
3118 if (settings.Stickers.Position == StickersListPosition.Custom)
3119 {
3120 @Render(settings.Stickers);
3121 }
3122 }
3123 @if (!String.IsNullOrEmpty(settings.Title))
3124 {
3125 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
3126 }
3127 @if (!String.IsNullOrEmpty(settings.SubTitle))
3128 {
3129 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3130 }
3131 @if (!String.IsNullOrEmpty(settings.Summary))
3132 {
3133 <p class="article__short-summary dw-mod">@settings.Summary</p>
3134 }
3135 </div>
3136 }
3137 </a>
3138 }
3139
3140 @helper RenderArticleListItemList(ArticleListItem settings) {
3141 <a href="@settings.Link">
3142 <div class="grid u-color-light--bg u-no-padding dw-mod">
3143 <div class="grid__col-md-3">
3144 <div class="u-color-light--bg u-no-padding dw-mod">
3145 @if (settings.Logo != null)
3146 {
3147 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;" : "";
3148 settings.Logo.ImageDefault.Crop = 5;
3149 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
3150 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
3151 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
3152 @if (settings.Stickers != null)
3153 {
3154 if (settings.Stickers.Position != StickersListPosition.Custom)
3155 {
3156 @Render(settings.Stickers);
3157 }
3158 }
3159 @RenderImage(settings.Logo)
3160 </div>
3161 } else if (settings.Image != null)
3162 {
3163 <div class="flex-img image-hover__wrapper dw-mod">
3164 @if (settings.Stickers != null)
3165 {
3166 if (settings.Stickers.Position != StickersListPosition.Custom)
3167 {
3168 @Render(settings.Stickers);
3169 }
3170 }
3171 @Render(settings.Image)
3172 </div>
3173 }
3174 </div>
3175 </div>
3176
3177 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
3178 {
3179 <div class="grid__col-md-9">
3180 @if (!String.IsNullOrEmpty(settings.Title))
3181 {
3182 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
3183 }
3184 @if (settings.Stickers != null)
3185 {
3186 if (settings.Stickers.Position == StickersListPosition.Custom)
3187 {
3188 @Render(settings.Stickers);
3189 }
3190 }
3191 @if (!String.IsNullOrEmpty(settings.SubTitle))
3192 {
3193 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3194 }
3195 @if (!String.IsNullOrEmpty(settings.Summary))
3196 {
3197 <p class="article__short-summary dw-mod">@settings.Summary</p>
3198 }
3199 </div>
3200 }
3201 </div>
3202 </a>
3203 }
3204
3205 @helper RenderArticleListItemSimple(ArticleListItem settings) {
3206 <a href="@settings.Link" class="u-color-inherit">
3207 <div class="grid u-color-light--bg u-no-padding dw-mod">
3208 <div class="grid__col-md-12">
3209 @if (!String.IsNullOrEmpty(settings.Title))
3210 {
3211 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div>
3212 }
3213 @if (!String.IsNullOrEmpty(settings.SubTitle))
3214 {
3215 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3216 }
3217 </div>
3218 </div>
3219 </a>
3220 }
3221 @using System.Reflection
3222 @using Dynamicweb.Rapido.Blocks.Components.Articles
3223
3224
3225 @* Component for the articles *@
3226
3227 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings)
3228 {
3229 <small class="article__subscription">
3230 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
3231 {
3232 <text>@Translate("Written")</text>
3233 }
3234 @if (!string.IsNullOrWhiteSpace(settings.Author))
3235 {
3236 <text>@Translate("by") @settings.Author</text>
3237 }
3238 @if (!string.IsNullOrWhiteSpace(settings.Date))
3239 {
3240 <text>@Translate("on") @settings.Date</text>
3241 }
3242 </small>
3243 }
3244 @using System.Reflection
3245 @using Dynamicweb.Rapido.Blocks.Components.Articles
3246 @using Dynamicweb.Rapido.Blocks.Components.General
3247
3248
3249 @* Component for the articles *@
3250
3251 @helper RenderArticleLink(ArticleLink settings)
3252 {
3253 if (!string.IsNullOrEmpty(settings.Title))
3254 {
3255 Button link = new Button {
3256 ConfirmText = settings.ConfirmText,
3257 ConfirmTitle = settings.ConfirmTitle,
3258 ButtonType = settings.ButtonType,
3259 Id = settings.Id,
3260 Title = settings.Title,
3261 AltText = settings.AltText,
3262 OnClick = settings.OnClick,
3263 CssClass = settings.CssClass,
3264 Disabled = settings.Disabled,
3265 Icon = settings.Icon,
3266 Name = settings.Name,
3267 Href = settings.Href,
3268 ButtonLayout = settings.ButtonLayout,
3269 ExtraAttributes = settings.ExtraAttributes
3270 };
3271 <div class="grid__cell">
3272 @Render(link)
3273 </div>
3274 }
3275 }
3276 @using System.Reflection
3277 @using Dynamicweb.Rapido.Blocks
3278 @using Dynamicweb.Rapido.Blocks.Components.Articles
3279 @using Dynamicweb.Rapido.Blocks.Components.General
3280
3281
3282 @* Component for the articles *@
3283
3284 @helper RenderArticleCarousel(ArticleCarousel settings)
3285 {
3286 <div class="grid">
3287 <div class="grid__col-12">
3288 <div class="carousel" id="carousel_@settings.Id">
3289 <div class="carousel__container js-carousel-slides dw-mod">
3290 @RenderBlockList(settings.SubBlocks)
3291 </div>
3292 </div>
3293 </div>
3294 </div>
3295
3296 <script>
3297 document.addEventListener("DOMContentLoaded", function () {
3298 new CarouselModule("#carousel_@settings.Id", {
3299 slideTime: 0,
3300 dots: true
3301 });
3302 });
3303 </script>
3304 }
3305
3306 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings)
3307 {
3308 string imageEngine = "/Admin/Public/GetImage.ashx?";
3309
3310 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image;
3311 if (settings.ImageSettings != null)
3312 {
3313 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : "";
3314 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : "";
3315 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&";
3316 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&";
3317 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&";
3318 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&";
3319 }
3320 defaultImage += "&Image=" + settings.Image;
3321
3322 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')">
3323 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title">
3324 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2>
3325 <div class="article-list__item-info">
3326 @if (settings.Stickers != null)
3327 {
3328 settings.Stickers.Position = StickersListPosition.Custom;
3329 @Render(settings.Stickers);
3330 }
3331
3332 <small class="u-margin-top--lg u-color-light">
3333 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
3334 {
3335 <text>@Translate("Written")</text>
3336 }
3337 @if (!string.IsNullOrWhiteSpace(settings.Author))
3338 {
3339 <text>@Translate("by") @settings.Author</text>
3340 }
3341 @if (!string.IsNullOrWhiteSpace(settings.Date))
3342 {
3343 <text>@Translate("on") @settings.Date</text>
3344 }
3345 </small>
3346 </div>
3347
3348 <h3 class="article__short-summary u-color-light">@settings.Summary</h3>
3349 </a>
3350 @if (settings.UseFilters == true)
3351 {
3352 <div class="background-image image-filter image-filter--darken dw-mod"></div>
3353 }
3354 </div>
3355 }
3356 @using System.Text.RegularExpressions
3357 @using Dynamicweb.Rapido.Blocks.Components
3358 @using Dynamicweb.Rapido.Blocks.Components.General
3359 @using Dynamicweb.Rapido.Blocks.Components.Articles
3360 @using Dynamicweb.Rapido.Blocks
3361
3362 @* Component for the articles *@
3363
3364 @helper RenderArticleVideo(ArticleVideo settings)
3365 {
3366 if (settings.Url != null)
3367 {
3368 //getting video ID from youtube URL
3369 string videoCode = settings.Url;
3370 Regex regex = new Regex(@".be\/(.[^?]*)");
3371 Match match = regex.Match(videoCode);
3372 string videoId = "";
3373 if (match.Success)
3374 {
3375 videoId = match.Groups[1].Value;
3376 }
3377 else
3378 {
3379 regex = new Regex(@"v=([^&]+)");
3380 match = regex.Match(videoCode);
3381 if (match.Success)
3382 {
3383 videoId = match.Groups[1].Value;
3384 }
3385 }
3386
3387 int autoPlay = settings.AutoPlay == "true" ? 1 : 0;
3388
3389 <div class="video-wrapper">
3390 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div>
3391 </div>
3392 }
3393 }
3394
3395
3396
3397 @* Simple helpers *@
3398
3399 @*Requires the Gallery ItemType that comes with Rapido*@
3400 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) {
3401 if (gallery != null && gallery.Count > 0)
3402 {
3403 int count = 1;
3404
3405 foreach (var item in gallery)
3406 {
3407 if (item.GetFile("ImagePath") != null)
3408 {
3409 string image = item.GetFile("ImagePath").PathUrlEncoded;
3410 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&height=820&crop=5&Compression=75&DoNotUpscale=1&image=";
3411 int imagesCount = gallery.Count;
3412
3413 if (count == 1)
3414 {
3415 <label class="gallery" for="ParagraphGalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))">
3416 <span class="gallery__main-image">
3417 <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" />
3418 </span>
3419 <span class="gallery__image-counter">
3420 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span>
3421 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span>
3422 </span>
3423 </label>
3424 }
3425 else
3426 {
3427 <div class="u-hidden js-gallery" data-for="ParagraphGallery" data-image="@imagePrefix@image"></div>
3428 }
3429
3430 count++;
3431 }
3432 }
3433
3434 @Render(new ArticleGalleryModal())
3435 }
3436 }
3437
3438 @helper RenderMobileFilters(List<Block> subBlocks)
3439 {
3440 if (subBlocks.Count > 0)
3441 {
3442 <div class="grid__col-12">
3443 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" />
3444 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters">
3445 @RenderBlockList(subBlocks)
3446 </div>
3447 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label>
3448 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label>
3449 </div>
3450 }
3451 }
3452
3453
3454 @* Include the Blocks for the page *@
3455 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3456
3457 @using System
3458 @using System.Web
3459 @using System.Collections.Generic
3460 @using Dynamicweb.Rapido.Blocks.Extensibility
3461 @using Dynamicweb.Rapido.Blocks
3462
3463 @functions {
3464 string GoogleTagManagerID = "";
3465 string GoogleAnalyticsID = "";
3466 }
3467
3468 @{
3469 GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID");
3470 GoogleAnalyticsID = Model.Area.Item.GetItem("Settings").GetString("GoogleAnalyticsTrackingID");
3471
3472 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
3473
3474 if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID))
3475 {
3476 Block tagManager = new Block()
3477 {
3478 Id = "GoogleAnalytics",
3479 SortId = 0,
3480 Template = RenderGoogleAnalyticsSnippet()
3481 };
3482 topSnippetsBlocksPage.Add("Head", tagManager);
3483 }
3484
3485 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
3486 {
3487 Block tagManager = new Block()
3488 {
3489 Id = "TagManager",
3490 SortId = 1,
3491 Template = RenderGoogleTagManager()
3492 };
3493 topSnippetsBlocksPage.Add("Head", tagManager);
3494
3495 Block tagManagerBodySnippet = new Block()
3496 {
3497 Id = "TagManagerBodySnippet",
3498 SortId = 1,
3499 Template = RenderGoogleTagManagerBodySnippet()
3500 };
3501 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet);
3502 }
3503
3504 Block facebookPixel = new Block()
3505 {
3506 Id = "FacebookPixel",
3507 SortId = 2,
3508 Template = RenderFacebookPixel()
3509 };
3510
3511 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel);
3512 }
3513
3514 @helper RenderGoogleAnalyticsSnippet()
3515 {
3516 <!-- Global site tag (gtag.js) - Google Analytics -->
3517 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script>
3518 <script>
3519 window.dataLayer = window.dataLayer || [];
3520 function gtag(){dataLayer.push(arguments);}
3521 gtag('js', new Date());
3522
3523 gtag('config', '@GoogleAnalyticsID');
3524 </script>
3525
3526 }
3527
3528 @helper RenderGoogleTagManager()
3529 {
3530 <script>
3531 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
3532 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
3533 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
3534 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
3535 })(window,document,'script','dataLayer','@GoogleTagManagerID');
3536 </script>
3537 }
3538
3539 @helper RenderGoogleTagManagerBodySnippet()
3540 {
3541 <!-- Google Tag Manager (noscript) -->
3542 <noscript>
3543 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
3544 height="0" width="0" style="display:none;visibility:hidden"></iframe>
3545 </noscript>
3546 <!-- End Google Tag Manager (noscript) -->
3547 }
3548
3549 @helper RenderFacebookPixel()
3550 {
3551 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID");
3552
3553 if (!string.IsNullOrWhiteSpace(FacebookPixelID))
3554 {
3555 <!-- Facebook Pixel Code -->
3556 <script>
3557 !function(f,b,e,v,n,t,s)
3558 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
3559 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
3560 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
3561 n.queue=[];t=b.createElement(e);t.async=!0;
3562 t.src=v;s=b.getElementsByTagName(e)[0];
3563 s.parentNode.insertBefore(t,s)}(window, document,'script',
3564 'https://connect.facebook.net/en_US/fbevents.js');
3565 fbq('init', '@FacebookPixelID');
3566 fbq('track', 'PageView');
3567 </script>
3568 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
3569 }
3570 }
3571 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3572
3573 @using System
3574 @using System.Web
3575 @using System.Collections.Generic
3576 @using Dynamicweb.Rapido.Blocks
3577 @using Dynamicweb.Rapido.Blocks.Extensibility
3578 @using Dynamicweb.Security.UserManagement
3579 @using Dynamicweb.Security.UserManagement.ExternalAuthentication
3580 @using Dynamicweb.Rapido.Blocks.Components.General
3581
3582 @{
3583 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master");
3584
3585 Block loginModal = new Block()
3586 {
3587 Id = "LoginModal",
3588 SortId = 10,
3589 Component = new Modal
3590 {
3591 Id = "SignIn",
3592 Heading = new Heading
3593 {
3594 Level = 0,
3595 Title = Translate("Sign in")
3596 },
3597 Width = ModalWidth.Xs,
3598 BodyTemplate = RenderLoginForm()
3599 }
3600 };
3601
3602 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal);
3603 }
3604
3605 @helper RenderLoginForm()
3606 {
3607 int pageId = Model.TopPage.ID;
3608 string userSignedInErrorText = "";
3609 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3610 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
3611 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
3612 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Model.LogOnFailed;
3613 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
3614 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
3615 int productCatalog = GetPageIdByNavigationTag("ProductsPage");
3616
3617 ProviderCollection providers = Provider.GetActiveProviders();
3618
3619 if (Model.LogOnFailed)
3620 {
3621 switch (Model.LogOnFailedReason)
3622 {
3623 case LogOnFailedReason.PasswordLengthInvalid:
3624 userSignedInErrorText = Translate("Password length is invalid");
3625 break;
3626 case LogOnFailedReason.IncorrectLogin:
3627 userSignedInErrorText = Translate("Invalid email or password");
3628 break;
3629 case LogOnFailedReason.ExceededFailedLogOnLimit:
3630 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
3631 break;
3632 case LogOnFailedReason.LoginLocked:
3633 userSignedInErrorText = Translate("The user account is temporarily locked");
3634 break;
3635 case LogOnFailedReason.PasswordExpired:
3636 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
3637 break;
3638 default:
3639 userSignedInErrorText = Translate("An unknown error occured");
3640 break;
3641 }
3642 }
3643 var proviantGroup = "Default.aspx?ID=" + productCatalog +"&GroupID=A1";
3644 var friendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(proviantGroup);
3645 var actionUrl = string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, friendlyUrl);
3646
3647 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm", Action = "/"};
3648
3649 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) });
3650 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" });
3651 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" });
3652 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" });
3653 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true });
3654 form.Add(new TextField { Id = "LoginPassword", Name = "password", Type = TextFieldType.Password, Label = Translate("Password"), CssClass = "u-full-width", Required = true });
3655 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error });
3656 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") });
3657 form.Add(new Button {Id ="loginButton", ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event); sessionStorage.setItem('recentlyLoggedIn', 'true')" });
3658
3659 foreach (Provider LoginProvider in providers)
3660 {
3661 var ProviderName = LoginProvider.Name.ToLower();
3662 form.Add(new Link {
3663 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID,
3664 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After },
3665 ButtonLayout = ButtonLayout.LinkClean,
3666 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName,
3667 AltText = ProviderName
3668 });
3669 }
3670
3671 if (!hideCreateAccountLink) {
3672 form.Add(new Link { Href = "/default.aspx?ID=" + createAccountPageId, Title = Translate("Create account?"), ButtonLayout = ButtonLayout.None, CssClass = "u-block u-padding-bottom" });
3673 }
3674
3675 if (!hideForgotPasswordLink) {
3676 form.Add(new Link { Href = forgotPasswordPageLink, Title = Translate("Forgot your password?"), ButtonLayout = ButtonLayout.None, CssClass = "u-block u-padding-bottom" });
3677 }
3678
3679 @Render(form)
3680
3681 if (showModalOnStart)
3682 {
3683 <script>
3684 document.getElementById("SignInModalTrigger").checked = true;
3685 </script>
3686 }
3687 <script>
3688 function formOnEnter(event) {
3689 if(event.key === 'Enter'){
3690 formSubmit();
3691 }
3692 }
3693
3694 document.addEventListener('DOMContentLoaded', function () {
3695 var inputElement = document.getElementsByName('LoginModalForm');
3696 inputElement[0].addEventListener('keypress', formOnEnter);
3697 });
3698
3699 function formSubmit(){
3700 var inputElement = document.getElementsByName('LoginModalForm');
3701 inputElement[0].submit();
3702 }
3703 </script>
3704 }
3705
3706 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
3707 {
3708 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3709
3710 @using System
3711 @using System.Web
3712 @using System.Collections.Generic
3713 @using Dynamicweb.Rapido.Blocks.Extensibility
3714 @using Dynamicweb.Rapido.Blocks
3715 @using Dynamicweb.Rapido.Services
3716
3717
3718 @functions {
3719 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
3720 }
3721
3722 @{
3723 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";
3724 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
3725 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed();
3726
3727 Block mobileHeader = new Block()
3728 {
3729 Id = "MobileTop",
3730 SortId = 10,
3731 Template = RenderMobileTop(),
3732 SkipRenderBlocksList = true
3733 };
3734 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader);
3735
3736 Block mobileHeaderNavigation = new Block()
3737 {
3738 Id = "MobileHeaderNavigation",
3739 SortId = 10,
3740 Template = RenderMobileHeaderNavigation(),
3741 SkipRenderBlocksList = true,
3742 BlocksList = new List<Block>
3743 {
3744 new Block
3745 {
3746 Id = "MobileHeaderNavigationTrigger",
3747 SortId = 10,
3748 Template = RenderMobileHeaderNavigationTrigger()
3749 }
3750 }
3751 };
3752 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation);
3753
3754 Block mobileHeaderLogo = new Block()
3755 {
3756 Id = "MobileHeaderLogo",
3757 SortId = 20,
3758 Template = RenderMobileHeaderLogo(),
3759 SkipRenderBlocksList = true
3760 };
3761 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo);
3762
3763 Block mobileHeaderActions = new Block()
3764 {
3765 Id = "MobileHeaderActions",
3766 SortId = 30,
3767 Template = RenderMobileTopActions(),
3768 SkipRenderBlocksList = true
3769 };
3770 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions);
3771
3772 Block mobileBottomHeader = new Block()
3773 {
3774 Id = "MobileBottomHeader",
3775 SortId = 30,
3776 Template = RenderBottomMobile(),
3777 SkipRenderBlocksList = true
3778 };
3779 mobileHeaderBlocksPage.Add("MobileTop", mobileBottomHeader);
3780
3781 if (!mobileHideSearch)
3782 {
3783 Block mobileHeaderSearch = new Block
3784 {
3785 Id = "MobileHeaderSearch",
3786 SortId = 10,
3787 Template = RenderMobileTopSearch()
3788 };
3789 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch);
3790 }
3791
3792 Block mobileHeaderMiniCart;
3793
3794 if (!mobileHideCart)
3795 {
3796 mobileHeaderMiniCart = new Block
3797 {
3798 Id = "MobileHeaderMiniCart",
3799 SortId = 20,
3800 Template = RenderMobileTopMiniCart()
3801 };
3802
3803 Block miniCartCounterScriptTemplate = new Block
3804 {
3805 Id = "MiniCartCounterScriptTemplate",
3806 Template = RenderMobileMiniCartCounterContent()
3807 };
3808 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
3809 }
3810 else
3811 {
3812 mobileHeaderMiniCart = new Block
3813 {
3814 Id = "MobileHeaderMiniCart",
3815 SortId = 20
3816 };
3817 }
3818
3819 if (!mobileHideSearch)
3820 {
3821 Block mobileHeaderSearchBar = new Block()
3822 {
3823 Id = "MobileHeaderSearchBar",
3824 SortId = 30,
3825 Template = RenderMobileTopSearchBar()
3826 };
3827 // mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar);
3828 }
3829
3830 switch (mobileTopLayout)
3831 {
3832 case "nav-left":
3833 mobileHeaderNavigation.SortId = 10;
3834 mobileHeaderLogo.SortId = 20;
3835 mobileHeaderActions.SortId = 30;
3836 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3837 break;
3838 case "nav-right":
3839 mobileHeaderLogo.SortId = 10;
3840 mobileHeaderActions.SortId = 20;
3841 mobileHeaderNavigation.SortId = 30;
3842 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3843 break;
3844 case "nav-search-left":
3845 mobileHeaderNavigation.SortId = 10;
3846 mobileHeaderLogo.SortId = 20;
3847 mobileHeaderActions.SortId = 30;
3848 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3849 break;
3850 case "search-left":
3851 mobileHeaderActions.SortId = 10;
3852 mobileHeaderLogo.SortId = 20;
3853 mobileHeaderNavigation.SortId = 30;
3854 mobileHeaderMiniCart.SortId = 0;
3855 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3856 break;
3857 }
3858 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
3859 {
3860 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block
3861 {
3862 Id = "CartInitialization",
3863 Template = RenderMobileCartInitialization()
3864 });
3865 }
3866
3867 Block masterCategoryMenu = new Block
3868 {
3869 Id = "MasterCategoryMenu",
3870 SortId = 35,
3871 Template = RenderCategoryMenu()
3872 };
3873 mobileNavigationBlocksPage.Add("MobileBottomHeader", masterCategoryMenu);
3874 }
3875
3876
3877 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3878
3879 @using System
3880 @using System.Web
3881 @using Dynamicweb.Rapido.Blocks.Extensibility
3882 @using Dynamicweb.Rapido.Blocks
3883
3884 @{
3885 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
3886 }
3887
3888
3889
3890 @helper RenderMobileCartInitialization()
3891 {
3892 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3893 <script>
3894 window.cartId = "@miniCartFeedPageId";
3895 </script>
3896 }
3897
3898 @helper RenderMobileTop()
3899 {
3900 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList();
3901
3902 <nav class="main-navigation-mobile dw-mod">
3903 <div class="center-container top-container__center-container dw-mod">
3904 <div class="grid grid--align-center">
3905 @RenderBlockList(subBlocks)
3906 </div>
3907 </div>
3908 </nav>
3909 }
3910
3911 @helper RenderMobileHeaderNavigation()
3912 {
3913 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList();
3914
3915 <div class="grid__col-auto-width">
3916 <ul class="menu dw-mod">
3917 @RenderBlockList(subBlocks)
3918 </ul>
3919 </div>
3920 }
3921
3922 @helper RenderMobileHeaderNavigationTrigger()
3923 {
3924 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3925 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label>
3926 </li>
3927 }
3928
3929 @helper RenderMobileHeaderLogo()
3930 {
3931 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList();
3932
3933 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";
3934 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : "";
3935 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
3936 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
3937
3938 string mobileLogo = "/Files/Images/logo-dynamicweb.png";
3939 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null)
3940 {
3941 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded;
3942 }
3943
3944 if (Path.GetExtension(mobileLogo).ToLower() != ".svg")
3945 {
3946 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&width=100&crop=5&Compression=75&image=" + mobileLogo;
3947 }
3948 else
3949 {
3950 mobileLogo = HttpUtility.UrlDecode(mobileLogo);
3951 }
3952
3953 <div class="grid__col-auto grid__col--bleed">
3954 <div class="grid__cell @centeredLogo">
3955 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod">
3956 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />
3957 </a>
3958 </div>
3959
3960 @RenderBlockList(subBlocks)
3961 </div>
3962 }
3963
3964 @helper RenderMobileTopActions()
3965 {
3966 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList();
3967
3968 <div class="grid__col-auto-width">
3969 <ul class="menu dw-mod">
3970 @RenderBlockList(subBlocks)
3971 </ul>
3972 </div>
3973 }
3974
3975 @helper RenderBottomMobile()
3976 {
3977 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileBottomHeader").OrderBy(item => item.SortId).ToList();
3978
3979 <div class="grid__col-sm-12 u-no-padding-y">
3980 <ul class="category-menu dw-mod">
3981 @RenderBlockList(subBlocks)
3982 </ul>
3983 </div>
3984 }
3985
3986 @helper RenderMobileTopSearch()
3987 {
3988 @*<li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3989 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
3990 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
3991 </label>
3992 </li>*@
3993 }
3994
3995 @helper RenderMobileTopMiniCart()
3996 {
3997 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3998 int cartPageId = GetPageIdByNavigationTag("CartPage");
3999 double cartProductsCount = Model.Cart.OrderlinesCount;
4000 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart");
4001 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
4002
4003 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod bs-gap-3 bs-align-baseline" id="miniCartWrapper">
4004 <div class="dw-mod" style="display: flex; align-items: center; margin-top: 5px;">
4005 <div id="cartMiniApp"></div>
4006 </div>
4007 </li>
4008
4009 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
4010 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
4011 {
4012 //user data
4013 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO",
4014 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK",
4015 UserId = user?.ID,
4016 CustomerNumber = user?.CustomerNumber,
4017
4018 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True",
4019 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300",
4020 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True",
4021
4022 //site settings
4023 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
4024 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name,
4025 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"),
4026 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page
4027 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl)
4028 });
4029 //this app is responsible for fetching all the user details required by all our vue.js apps to run
4030 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div>
4031
4032 //this app is responsible for handling events sent from legacy JS components, like food calendar
4033 <div id="legacyEventHandler" style="visibility: hidden"></div>
4034 }
4035
4036 @helper RenderMobileTopSearchBar()
4037 {
4038 string searchFeedId = "";
4039 string searchSecondFeedId = "";
4040 int groupsFeedId;
4041 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
4042 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage"));
4043 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
4044 string resultPageLink;
4045 string searchPlaceholder;
4046 string searchType = "product-search";
4047 string searchTemplate;
4048 string searchContentTemplate = "";
4049 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
4050 bool showGroups = true;
4051
4052 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
4053 {
4054 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4055 resultPageLink = contentSearchPageLink;
4056 searchPlaceholder = Translate("Search page");
4057 groupsFeedId = 0;
4058 searchType = "content-search";
4059 searchTemplate = "SearchPagesTemplate";
4060 showGroups = false;
4061 }
4062 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
4063 {
4064 searchFeedId = searchPageId + "&feed=true";
4065 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4066 resultPageLink = Converter.ToString(productsPageId);
4067 searchPlaceholder = Translate("Search products or pages");
4068 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4069 searchType = "combined-search";
4070 searchTemplate = "SearchProductsTemplateWrap";
4071 searchContentTemplate = "SearchPagesTemplateWrap";
4072 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4073 }
4074 else
4075 {
4076 resultPageLink = Converter.ToString(productsPageId);
4077 searchFeedId = searchPageId + "&feed=true";
4078 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4079 searchPlaceholder = Translate("Search products");
4080 searchTemplate = "SearchProductsTemplate";
4081 searchType = "product-search";
4082 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4083 }
4084
4085 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" />
4086
4087 <div class="main-navigation-mobile typeahead-mobile dw-mod">
4088 <div class="center-container top-container__center-container dw-mod">
4089 <div class="grid">
4090 <div class="grid__col-auto">
4091 <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">
4092 <span class="u-position-relative">
4093 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue">
4094 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')">
4095 <i class="fas fa-times"></i>
4096 </button>
4097 </span>
4098 @if (string.IsNullOrEmpty(searchSecondFeedId))
4099 {
4100 <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>
4101 }
4102 else
4103 {
4104 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid">
4105 <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>
4106 <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>
4107 </div>
4108 }
4109 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn">
4110 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i>
4111 </button>
4112 </div>
4113 </div>
4114 <div class="grid__col-auto-width">
4115 @*<ul class="menu dw-mod">
4116 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
4117 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
4118 <i class="fas fa-times fa-1_5x"></i>
4119 </label>
4120 </li>
4121 </ul>*@
4122 </div>
4123 </div>
4124 </div>
4125 </div>
4126 }
4127
4128 @helper RenderMobileMiniCartCounterContent()
4129 {
4130 <script id="MiniCartCounterContent" type="text/x-template">
4131 {{#.}}
4132 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}">
4133 {{numberoforderlines}}
4134 </div>
4135 {{/.}}
4136 </script>
4137 }
4138
4139 @helper RenderCategoryMenu()
4140 {
4141 var navigationMarkup = RenderNavigation(new
4142 {
4143 id = "categorynav",
4144 cssclass = "dwnavigation menu",
4145 startLevel = 1,
4146 endlevel = 2,
4147 expandmode = "all",
4148 template = "BaseMenuWithDropdown.xslt"
4149 });
4150
4151 string searchFeedId = "";
4152 string searchSecondFeedId = "";
4153 int groupsFeedId;
4154 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
4155 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage"));
4156 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
4157 string resultPageLink;
4158 string searchPlaceholder;
4159 string searchType = "product-search";
4160 string searchTemplate;
4161 string searchContentTemplate = "";
4162 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
4163 bool showGroups = true;
4164
4165 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
4166 {
4167 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4168 resultPageLink = contentSearchPageLink;
4169 searchPlaceholder = Translate("Search page");
4170 groupsFeedId = 0;
4171 searchType = "content-search";
4172 searchTemplate = "SearchPagesTemplate";
4173 showGroups = false;
4174 }
4175 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
4176 {
4177 searchFeedId = productsPageId + "&feed=true";
4178 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4179 resultPageLink = Converter.ToString(productsPageId);
4180 searchPlaceholder = Translate("Search products or pages");
4181 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4182 searchType = "combined-search";
4183 searchTemplate = "SearchProductsTemplateWrap";
4184 searchContentTemplate = "SearchPagesTemplateWrap";
4185 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4186 }
4187 else
4188 {
4189 resultPageLink = Converter.ToString(productsPageId);
4190 searchFeedId = searchPageId + "&feed=true";
4191 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4192 searchPlaceholder = Translate("Search products");
4193 searchTemplate = "SearchProductsTemplate";
4194 searchType = "product-search";
4195 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4196 }
4197
4198 <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">
4199 <span class="search-ahead__wrapper">
4200 <input type="text" class="search-ahead__input js-typeahead-search-field" id="headerSearch" placeholder="@searchPlaceholder" value="@searchValue">
4201 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')">
4202 @*<i class="fas fa-times"></i>*@
4203 </button>
4204 <button type="button" class="search-icon__button js-typeahead-enter-btn">
4205 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i>
4206 </button>
4207 </span>
4208 @if (string.IsNullOrEmpty(searchSecondFeedId))
4209 {
4210 <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>
4211 }
4212 else
4213 {
4214 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid">
4215 <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>
4216 <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>
4217 </div>
4218 }
4219 </div>
4220 }</text>
4221 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4222
4223 @using System
4224 @using System.Web
4225 @using System.Collections.Generic
4226 @using Dynamicweb.Rapido.Blocks.Extensibility
4227 @using Dynamicweb.Rapido.Blocks
4228
4229 @functions {
4230 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master");
4231 }
4232
4233 @{
4234 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
4235 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
4236 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
4237 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
4238 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
4239
4240 Block mobileNavigation = new Block()
4241 {
4242 Id = "MobileNavigation",
4243 SortId = 10,
4244 Template = MobileNavigation(),
4245 SkipRenderBlocksList = true
4246 };
4247 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation);
4248
4249 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink)
4250 {
4251 Block mobileNavigationSignIn = new Block
4252 {
4253 Id = "MobileNavigationSignIn",
4254 SortId = 10,
4255 Template = RenderMobileNavigationSignIn()
4256 };
4257 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn);
4258 }
4259
4260 Block mobileNavigationMenu = new Block
4261 {
4262 Id = "MobileNavigationMenu",
4263 SortId = 20,
4264 Template = RenderMobileNavigationMenu()
4265 };
4266 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu);
4267
4268 Block mobileNavigationActions = new Block
4269 {
4270 Id = "MobileNavigationActions",
4271 SortId = 30,
4272 Template = RenderMobileNavigationActions(),
4273 SkipRenderBlocksList = true
4274 };
4275 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions);
4276
4277 if (!mobileNavigationItemsHideSignIn)
4278 {
4279 if (Model.CurrentUser.ID <= 0)
4280 {
4281 Block mobileNavigationSignInAction = new Block
4282 {
4283 Id = "MobileNavigationSignInAction",
4284 SortId = 10,
4285 Template = RenderMobileNavigationSignInAction()
4286 };
4287 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction);
4288
4289 Block mobileNavigationOldWebshop = new Block
4290 {
4291 Id = "MobileNavigationOldWebshop",
4292 SortId = 20,
4293 Template = RenderMobileNavigationOldWebshop()
4294 };
4295 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOldWebshop);
4296
4297 if (!mobileHideCreateAccountLink)
4298 {
4299 Block mobileNavigationCreateAccountAction = new Block
4300 {
4301 Id = "MobileNavigationCreateAccountAction",
4302 SortId = 30,
4303 Template = RenderMobileNavigationCreateAccountAction()
4304 };
4305 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction);
4306 }
4307 }
4308 else
4309 {
4310 if (!mobileHideMyOrdersLink)
4311 {
4312 Block mobileNavigationOrdersAction = new Block
4313 {
4314 Id = "MobileNavigationOrdersAction",
4315 SortId = 20,
4316 Template = RenderMobileNavigationOrdersAction()
4317 };
4318 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction);
4319 }
4320
4321 if (!mobileHideMySavedCardsLink)
4322 {
4323 Block mobileNavigationSavedCardsAction = new Block
4324 {
4325 Id = "MobileNavigationFavoritesAction",
4326 SortId = 30,
4327 Template = RenderMobileNavigationSavedCardsAction()
4328 };
4329 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction);
4330 }
4331
4332 Block mobileNavigationSignOutAction = new Block
4333 {
4334 Id = "MobileNavigationSignOutAction",
4335 SortId = 40,
4336 Template = RenderMobileNavigationSignOutAction()
4337 };
4338 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction);
4339 }
4340 }
4341
4342 if (Model.Languages.Count > 1)
4343 {
4344 Block mobileNavigationLanguagesAction = new Block
4345 {
4346 Id = "MobileNavigationLanguagesAction",
4347 SortId = 50,
4348 Template = RenderMobileNavigationLanguagesAction()
4349 };
4350 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction);
4351 }
4352 Block cartsSelectMobile = new Block
4353 {
4354 Id = "CartsSelectMobile",
4355 SortId = 60,
4356 Template = RenderCustomSelectCartsAndImpersonation()
4357 };
4358 mobileNavigationBlocksPage.Add("MobileNavigationActions", cartsSelectMobile);
4359 }
4360
4361
4362 @helper MobileNavigation()
4363 {
4364 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList();
4365 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
4366 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right";
4367
4368 <!-- Trigger for mobile navigation -->
4369 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" />
4370
4371 <!-- Mobile navigation -->
4372 <nav class="mobile-navigation mobile-navigation--@position dw-mod">
4373 <div class="mobile-navigation__wrapper u-padding-top--lg" id="mobileNavigationWrapper">
4374 <label class="mobile-nav-trigger-on u-margin-bottom--lg u-margin-left--lg u-brand-color-three" for="MobileNavTrigger">
4375 <span><i class="fas fa-times-circle fa-2x"></i></span>
4376 </label>
4377 @RenderBlockList(subBlocks)
4378 </div>
4379 </nav>
4380
4381 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
4382 }
4383
4384 @helper RenderMobileNavigationSignIn()
4385 {
4386 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4387 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4388 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4389 string myProfilePageLink = linkStart + myProfilePageId;
4390 string userName = Model.CurrentUser.FirstName;
4391 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName))
4392 {
4393 userName += " " + Model.CurrentUser.LastName;
4394 }
4395 if (string.IsNullOrEmpty(userName))
4396 {
4397 userName = Model.CurrentUser.Name;
4398 }
4399 if (string.IsNullOrEmpty(userName))
4400 {
4401 userName = Model.CurrentUser.UserName;
4402 }
4403 if (string.IsNullOrEmpty(userName))
4404 {
4405 userName = Model.CurrentUser.Email;
4406 }
4407
4408 <ul class="menu menu-mobile">
4409 <li class="menu-mobile__item">
4410 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4411 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @userName
4412 </a>
4413 </li>
4414 </ul>
4415 }
4416
4417 @helper RenderMobileNavigationMenu()
4418 {
4419 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4420 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt";
4421 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3";
4422 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4423 int startLevel = 0;
4424
4425 @RenderNavigation(new
4426 {
4427 id = "mobilenavigation",
4428 cssclass = "menu menu-mobile dwnavigation",
4429 startLevel = @startLevel,
4430 ecomStartLevel = @startLevel + 1,
4431 endlevel = @levels,
4432 expandmode = "all",
4433 template = @menuTemplate
4434 })
4435
4436 if (isSlidesDesign)
4437 {
4438 <script>
4439 function goToLevel(level) {
4440 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%";
4441 }
4442
4443 document.addEventListener('DOMContentLoaded', function () {
4444 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length);
4445 });
4446 </script>
4447 }
4448
4449 if (renderPagesInToolBar)
4450 {
4451 @RenderNavigation(new
4452 {
4453 id = "topToolsMobileNavigation",
4454 cssclass = "menu menu-mobile dwnavigation",
4455 template = "ToolsMenuForMobile.xslt"
4456 })
4457 }
4458 }
4459
4460 @helper RenderMobileNavigationActions()
4461 {
4462 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ;
4463
4464 <ul class="menu menu-mobile">
4465 @RenderBlockList(subBlocks)
4466 </ul>
4467 }
4468
4469 @helper RenderMobileNavigationSignInAction()
4470 {
4471 <li class="menu-mobile__item">
4472 <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>
4473 </li>
4474
4475 @*this app is responsible for setting all the settings for anonymous users in vue.js apps*@
4476 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
4477 {
4478 //user data
4479 CountryCode = "NO",
4480 CurrencyCode = "NOK",
4481 ShowNumberOfCartons = false,
4482 SendShipOwner = false,
4483 SendOnlySeeDiverse = false,
4484
4485 //site settings
4486 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
4487 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name,
4488 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"),
4489 CheckoutPageUrl = "",
4490 MinicartAvailable = false
4491 });
4492
4493 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div>
4494 }
4495
4496 @helper RenderMobileNavigationOldWebshop()
4497 {
4498 <li class="menu-mobile__item">
4499 <a href="https://ssoprovider.kraemer.no/users/sign_in" class="menu-mobile__link dw-mod menu-mobile__link--highlighted" onclick="RememberState.SetCookie('useAnotherAddress', false)" target="_blank">
4500 <i class="fas fa-shopping-basket u-margin-right"></i> @Translate("Old Webshop")
4501 </a>
4502 </li>
4503 }
4504
4505 @helper RenderMobileNavigationCreateAccountAction()
4506 {
4507 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4508
4509 <li class="menu-mobile__item">
4510 <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>
4511 </li>
4512 }
4513
4514 @helper RenderMobileNavigationProfileAction()
4515 {
4516 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4517 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4518 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4519 string myProfilePageLink = linkStart + myProfilePageId;
4520
4521 <li class="menu-mobile__item">
4522 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4523 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @Translate("My Profile")
4524 </a>
4525 </li>
4526 }
4527
4528 @helper RenderMobileNavigationOrdersAction()
4529 {
4530 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4531 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4532 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4533 int myReportsPageId = GetPageIdByNavigationTag("MyReports");
4534 int deviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage");
4535 int announcementPageId = GetPageIdByNavigationTag("Announcements");
4536 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList");
4537 int foodCalendarPageId = GetPageIdByNavigationTag("MenuView");
4538 int foodCalendarAdminPageId = GetPageIdByNavigationTag("MenuCalendarView");
4539 string announcementPageLink = linkStart + announcementPageId;
4540 string myOrdersPageLink = linkStart + myOrdersPageId;
4541 string myReportsPageLink = linkStart + myReportsPageId;
4542 string myDeviationsPageLink = linkStart + deviationsPageId;
4543 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4544 string foodCalendarPageLink = linkStart + foodCalendarPageId;
4545 string foodCalendarAdminPageLink = linkStart + foodCalendarAdminPageId;
4546 //string ordersIcon = "fas fa-list";
4547 var user = Pageview.User;
4548 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false;
4549 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false;
4550 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty;
4551 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty;
4552 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false;
4553 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : "";
4554 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : "";
4555 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false;
4556
4557 <li class="menu-mobile__item">
4558 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4559 <img width="20" height="20" src="/Files/Images/favorite-list-svg.svg"> @Translate("My Favorites")
4560 </a>
4561 </li>
4562 <li class="menu-mobile__item">
4563 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4564 <img width="20" height="20" src="/Files/Images/order-history-svg.svg"> @Translate("My Orders")
4565 </a>
4566 </li>
4567 if (hasAccessToAnnouncements)
4568 {
4569 <li class="menu-mobile__item">
4570 <a href="@announcementPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod u-brand-color-two bs-position-relative bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")">
4571 <img width="22" height="22" src="/Files/Images/notifications.svg">
4572 <svg class="announcement_notification-dot bs-position-absolute @announcementNotificationDotClass" style="top: 45%; left: 25px;height: 13px;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
4573 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30" />
4574 </svg>
4575 @Translate("Announcements")
4576 </a>
4577 </li>
4578 }
4579 if (hasAccessToFoodCalendar)
4580 {
4581 <li class="menu-mobile__item">
4582 <a href="@foodCalendarPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4583 <img width="20" height="20" src="/Files/Images/food-calendar.svg"> @Translate("Matretter")
4584 </a>
4585 </li>
4586 }
4587
4588 if (isFoodCalendarAdmin)
4589 {
4590 <li class="menu-mobile__item">
4591 <a href="@foodCalendarAdminPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4592 <img width="20" height="20" src="/Files/Images/food-calendar-menu-calendar.svg"> @Translate("Kalendervisning")
4593 </a>
4594 </li>
4595 }
4596
4597 <li class="menu-mobile__item">
4598 <a href="@myDeviationsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4599 <img width="20" height="20" src="/Files/Images/UnionRMA-icon.svg"> @Translate("My Deviations")
4600 </a>
4601 </li>
4602
4603 if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport)
4604 {
4605 <li class="menu-mobile__item">
4606 <a href="@myReportsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2">
4607 <img width="20" height="20" src="/Files/Images/IconPowerBi.svg"> @Translate("My reports")
4608 </a>
4609 </li>
4610 }
4611
4612
4613 }
4614
4615
4616 @helper RenderMobileNavigationSavedCardsAction()
4617 {
4618 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4619 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4620 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4621 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4622 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";
4623
4624 <li class="menu-mobile__item">
4625 <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>
4626 </li>
4627 }
4628
4629 @helper RenderMobileNavigationSignOutAction()
4630 {
4631 int pageId = Model.TopPage.ID;
4632 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";
4633 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null;
4634 bool promptForAccount = false;
4635
4636 if (userCustomFields != null)
4637 {
4638 foreach (var field in userCustomFields)
4639 {
4640 if (field.CustomField.SystemName == "AccessUser_PromptForAccount")
4641 {
4642 promptForAccount = field.Value.ToString() == "True";
4643 }
4644 }
4645 }
4646 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
4647 {
4648 <li class="menu-mobile__item">
4649 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div>
4650 </li>
4651 }
4652 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
4653 {
4654 if (promptForAccount)
4655 {
4656 <li class="menu-mobile__item">
4657 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div>
4658 </li>
4659 }
4660 else
4661 {
4662 <li class="menu-mobile__item">
4663 <a href="/" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a>
4664 </li>
4665 }
4666
4667 }
4668 else
4669 {
4670 <li class="menu-mobile__item">
4671 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a>
4672 </li>
4673 }
4674 @* <li class="menu-mobile__item">
4675 <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>
4676 </li>*@
4677 }
4678
4679 @helper RenderMobileNavigationLanguagesAction()
4680 {
4681 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4682 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() : "";
4683 string selectedLanguage = "";
4684 foreach (var lang in Model.Languages)
4685 {
4686 var language = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
4687 var languageTitle = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(language.ToLower());
4688
4689 if (lang.IsCurrent)
4690 {
4691 selectedLanguage = languageTitle;
4692 }
4693 }
4694
4695 <li class="menu-mobile__item dw-mod">
4696 @if (isSlidesDesign)
4697 {
4698 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);">
4699 }
4700 else
4701 {
4702 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
4703 }
4704 <div class="menu-mobile__link__wrap">
4705 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"><img width="20" height="20" src="/Files/Images/language-selector-svg.svg"> @selectedLanguage</label>
4706 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
4707 </div>
4708 <ul class="menu-mobile menu-mobile__submenu expand-menu">
4709 @if (isSlidesDesign)
4710 {
4711 <li class="menu-mobile__item dw-mod">
4712 <div class="menu-mobile__link__wrap">
4713 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" />
4714 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
4715 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
4716 </div>
4717 </li>
4718 }
4719 @*foreach (var lang in Model.Languages)
4720 {
4721 <li class="menu-mobile__item dw-mod">
4722 <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>
4723 </li>
4724 }*@
4725
4726 @foreach (var lang in Model.Languages)
4727 {
4728 var area = Dynamicweb.Content.Services.Areas.GetArea(lang.ID);
4729 string languageIcon = lang.Culture.Replace("nb", "").Replace("en", "").ToLower();
4730 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name;
4731 string cultureName = Regex.Replace(area.CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
4732 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
4733
4734
4735 if (languageViewType == "flag-culture")
4736 {
4737 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName;
4738 }
4739
4740 if (languageViewType == "flag")
4741 {
4742 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>";
4743 }
4744
4745 if (languageViewType == "name")
4746 {
4747 langInfo = lang.Name;
4748 }
4749
4750 if (languageViewType == "culture")
4751 {
4752 langInfo = cultureName;
4753 }
4754
4755 <li class="menu-mobile__item dw-mod">
4756 <a onclick="window.dispatchEvent(new CustomEvent('on-language-change', { detail: { languageId: '@area.EcomLanguageId.ToUpper()', culture: '@lang.Culture' } }))" href="/Default.aspx?AreaID=@area.ID" class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1">@langInfo</a>
4757 </li>
4758 }
4759 </ul>
4760 </li>
4761 }
4762
4763
4764
4765
4766 @helper RenderCustomSelectCartsAndImpersonation()
4767 {
4768 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed");
4769 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
4770 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
4771
4772 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
4773 string userName = userExists ? getUserName(Pageview.User) : "";
4774 int secondaryUsersCount = Model.SecondaryUsers.Count;
4775
4776 @*if (userExists)
4777 {
4778 <div class="u-max-w260px u-margin-left--lg u-margin-top--lg u-margin-bottom--lg">
4779 <span>@Translate("Handlekurv")</span>
4780 <div class="dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div>
4781 <div class="dw-mod">
4782 @Render(new Button
4783 {
4784 Title = Translate("Change Cart Name"),
4785 ButtonType = ButtonType.Button,
4786 ButtonLayout = ButtonLayout.None,
4787 CssClass = "u-margin-bottom change-cart-name",
4788 OnClick = "changeCartName()"
4789 })
4790 @Render(new Button
4791 {
4792 Title = Translate("Create New Cart"),
4793 ButtonType = ButtonType.Button,
4794 ButtonLayout = ButtonLayout.Primary,
4795 CssClass = "u-full-width",
4796 OnClick = "document.getElementById('NewCartModalTrigger').checked = true"
4797 })
4798 </div>
4799 </div>
4800 }*@
4801 <div class="u-max-w260px u-margin-left--lg">
4802 @if (secondaryUsersCount > 0)
4803 {
4804 @RenderDesktopToolsTextMobile()
4805 }
4806 </div>
4807 }
4808
4809
4810 @helper RenderDesktopToolsTextMobile()
4811 {
4812 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
4813 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
4814 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
4815 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
4816 string userName = userExists ? getUserName(Pageview.User) : "";
4817 int secondaryUsersCount = Model.SecondaryUsers.Count;
4818 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
4819 bool promptForAccount = getPromptForAccount();
4820
4821 <div class="" style="min-height: 30px">
4822 @if (userExists)
4823 {
4824 <div class="u-margin-bottom--lg u-margin-top--lg u-border-top u-border-bottom u-padding-top u-padding-bottom">
4825 @if (secondaryUsersCount > 0)
4826 {
4827 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
4828 {
4829 <div class="u-margin-right u-margin-bottom" data-prompt-account="@promptForAccount">@userName</div>
4830
4831 if (secondaryUsersCount > 1 || promptForAccount)
4832 {
4833 @RenderImpersonationDropdownMobile(impersonationListFeedPageId)
4834 }
4835 }
4836 else
4837 {
4838 <div class="u-margin-bottom">@Translate("Choose user to impersonate:") </div>
4839 @RenderImpersonationDropdownMobile(impersonationListFeedPageId)
4840 }
4841
4842
4843 }
4844
4845 </div>
4846 if (!string.IsNullOrEmpty(customerNumber))
4847 {
4848 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "")
4849 {
4850 <div>
4851 @Translate("currentLocation") <div class="location-space u-margin-bottom"></div>
4852
4853 @Render(new Button
4854 {
4855 ButtonType = ButtonType.Button,
4856 ButtonLayout = ButtonLayout.None,
4857 Title = Translate("Change Location"),
4858 CssClass = "u-no-margin btn btn--primary dw-mod",
4859 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true, document.querySelector('#MobileNavTrigger').checked = false"
4860 })
4861 </div>
4862 }
4863
4864 }
4865 }
4866
4867
4868 </div>
4869 }
4870
4871 @helper RenderImpersonationDropdownMobile(string impersonationListFeedPageId)
4872 {
4873 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
4874 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user");
4875 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-test="test1">
4876 <input type="hidden" name="DwExtranetRemoveSecondaryUser">
4877 </form>
4878 <div class="impersonation-container">
4879 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger" />
4880 <div class="dropdown variants-filters dw-mod">
4881 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label>
4882 <div class="dropdown__content u-padding dw-mod">
4883 <div class="dropdown__item__filter">
4884 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")">
4885 </div>
4886 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false">
4887 </div>
4888 </div>
4889 </div>
4890 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label>
4891 </div>
4892
4893
4894 }</text>
4895 }
4896 else
4897 {
4898 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4899
4900 @using System
4901 @using System.Web
4902 @using System.Collections.Generic
4903 @using Dynamicweb.Rapido.Blocks.Extensibility
4904 @using Dynamicweb.Rapido.Blocks
4905
4906 @functions {
4907 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master");
4908
4909 }
4910
4911 @{
4912 Block masterTools = new Block()
4913 {
4914 Id = "MasterDesktopTools",
4915 SortId = 10,
4916 Template = RenderDesktopTools(),
4917 SkipRenderBlocksList = true,
4918 BlocksList = new List<Block>
4919 {
4920 new Block
4921 {
4922 Id = "MasterDesktopToolsText",
4923 SortId = 10,
4924 Template = RenderDesktopToolsText(),
4925 Design = new Design
4926 {
4927 Size = "auto",
4928 HidePadding = true,
4929 RenderType = RenderType.Column
4930 }
4931 },
4932 new Block
4933 {
4934 Id = "MasterDesktopToolsNavigation",
4935 SortId = 20,
4936 Template = RenderDesktopToolsNavigation(),
4937 Design = new Design
4938 {
4939 Size = "auto-width",
4940 HidePadding = true,
4941 RenderType = RenderType.Column
4942 }
4943 }
4944 }
4945 };
4946 headerBlocksPage.Add("MasterHeader", masterTools);
4947
4948 Block masterDesktopExtra = new Block()
4949 {
4950 Id = "MasterDesktopExtra",
4951 SortId = 10,
4952 Template = RenderDesktopExtra(),
4953 SkipRenderBlocksList = true
4954 };
4955 headerBlocksPage.Add("MasterHeader", masterDesktopExtra);
4956
4957 Block masterDesktopNavigation = new Block()
4958 {
4959 Id = "MasterDesktopNavigation",
4960 SortId = 20,
4961 Template = RenderDesktopNavigation(),
4962 SkipRenderBlocksList = true
4963 };
4964 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation);
4965
4966 if (Model.CurrentUser.ID > 0)
4967 {
4968 Modal stopImpersonation = new Modal
4969 {
4970 Id = "StopImpersonation",
4971 Heading = new Heading
4972 {
4973 Level = 2,
4974 Title = Translate("Sign out"),
4975 Icon = new Icon
4976 {
4977 Name = "fa-sign-out",
4978 Prefix = "fas",
4979 LabelPosition = IconLabelPosition.After
4980 }
4981 },
4982 Width = ModalWidth.Md,
4983 BodyTemplate = RenderStopImpersonationForm()
4984 };
4985
4986 Block stopImpersonationBlock = new Block
4987 {
4988 Id = "StopImpersonationBlock",
4989 SortId = 10,
4990 Component = stopImpersonation
4991 };
4992 headerBlocksPage.Add("MasterHeader", stopImpersonationBlock);
4993 }
4994
4995 }
4996
4997 @* Include the Blocks for the page *@
4998 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4999
5000 @using System
5001 @using System.Web
5002 @using Dynamicweb.Rapido.Blocks.Extensibility
5003 @using Dynamicweb.Rapido.Blocks
5004
5005 @{
5006 Block masterDesktopLogo = new Block
5007 {
5008 Id = "MasterDesktopLogo",
5009 SortId = 10,
5010 Template = RenderDesktopLogo(),
5011 Design = new Design
5012 {
5013 Size = "auto-width",
5014 HidePadding = true,
5015 RenderType = RenderType.Column,
5016 CssClass = "grid--align-self-center"
5017 }
5018 };
5019
5020 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo);
5021 }
5022
5023
5024 @helper RenderDesktopLogo()
5025 {
5026 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
5027 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5028 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
5029 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass;
5030 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
5031 if (Path.GetExtension(logo).ToLower() != ".svg")
5032 {
5033 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight");
5034 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40;
5035 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&crop=5&Compression=75&image=" + logo;
5036 }
5037 else
5038 {
5039 logo = HttpUtility.UrlDecode(logo);
5040 }
5041
5042 <div class="logo @alignClass dw-mod">
5043 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
5044 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" />
5045 </a>
5046 </div>
5047 }
5048 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5049
5050 @using System
5051 @using System.Web
5052 @using Dynamicweb.Rapido.Blocks.Extensibility
5053 @using Dynamicweb.Rapido.Blocks
5054
5055 @functions {
5056 bool isMegaMenu;
5057 }
5058
5059 @{
5060 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false;
5061 Block masterDesktopMenu = new Block
5062 {
5063 Id = "MasterDesktopMenu",
5064 SortId = 10,
5065 Template = RenderDesktopMenu(),
5066 Design = new Design
5067 {
5068 Size = "auto",
5069 HidePadding = true,
5070 RenderType = RenderType.Column
5071 }
5072 };
5073
5074 if (isMegaMenu)
5075 {
5076 masterDesktopMenu.Design.CssClass = "u-reset-position";
5077 }
5078
5079 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu);
5080 }
5081
5082 @helper RenderDesktopMenu()
5083 {
5084 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5085 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : "";
5086 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout;
5087 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
5088 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
5089 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders");
5090 int startLevel = renderPagesInToolBar ? 1 : 0;
5091
5092 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink");
5093 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
5094
5095 bool isSlapp = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Slapp", StringComparison.OrdinalIgnoreCase)).Value.ToString() == "True" : false;
5096
5097 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment">
5098 @if (!isMegaMenu)
5099 {
5100 if (isSlapp)
5101 {
5102 @RenderNavigation(new
5103 {
5104 id = "topnavigation",
5105 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5106 startLevel = startLevel,
5107 ecomStartLevel = startLevel + 1,
5108 endlevel = 5,
5109 expandmode = "all",
5110 template = "BaseMenuWithDropdown-nocategory.xslt"
5111 });
5112
5113 }
5114 else
5115 {
5116 @RenderNavigation(new
5117 {
5118 id = "topnavigation",
5119 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5120 startLevel = startLevel,
5121 ecomStartLevel = startLevel + 1,
5122 endlevel = 5,
5123 expandmode = "all",
5124 template = "BaseMenuWithDropdown.xslt"
5125 });
5126 }
5127
5128 }
5129 else
5130 {
5131 @RenderNavigation(new
5132 {
5133 id = "topnavigation",
5134 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5135 startLevel = startLevel,
5136 ecomStartLevel = startLevel + 1,
5137 endlevel = 5,
5138 promotionImage = megamenuPromotionImage,
5139 promotionLink = promotionLink,
5140 expandmode = "all",
5141 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(),
5142 template = "BaseMegaMenu.xslt"
5143 });
5144 }
5145 </div>
5146 }
5147 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5148
5149 @using System
5150 @using System.Web
5151 @using Dynamicweb.Rapido.Blocks.Extensibility
5152 @using Dynamicweb.Rapido.Blocks
5153
5154 @{
5155 Block masterDesktopActionsMenu = new Block
5156 {
5157 Id = "MasterDesktopActionsMenu",
5158 SortId = 10,
5159 Template = RenderDesktopActionsMenu(),
5160 Design = new Design
5161 {
5162 CssClass = "u-flex"
5163 },
5164 SkipRenderBlocksList = true
5165
5166 };
5167 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu);
5168
5169 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink")))
5170 {
5171 Block masterDesktopActionsHeaderButton = new Block
5172 {
5173 Id = "MasterDesktopActionsHeaderButton",
5174 SortId = 60,
5175 Template = RenderHeaderButton()
5176 };
5177 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton);
5178 }
5179 }
5180
5181 @helper RenderDesktopActionsMenu()
5182 {
5183 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList();
5184
5185 <ul class="menu u-flex dw-mod">
5186 @RenderBlockList(subBlocks)
5187 </ul>
5188 }
5189
5190 @helper RenderHeaderButton()
5191 {
5192 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText");
5193 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink");
5194 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : "";
5195
5196 <li class="menu__item menu__item--horizontal menu--clean dw-mod">
5197 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a>
5198 </li>
5199 }
5200 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5201
5202 @using System
5203 @using System.Security.Cryptography
5204 @using System.Web
5205 @using Dynamicweb.Core;
5206 @using System.Text.RegularExpressions
5207 @using Dynamicweb.Rapido.Blocks.Extensibility
5208 @using Dynamicweb.Rapido.Blocks
5209
5210 @{
5211 Block masterDesktopActionsMenuLanguageSelector = new Block
5212 {
5213 Id = "MasterDesktopActionsMenuLanguageSelector",
5214 SortId = 90,
5215 Template = RenderLanguageSelector()
5216 };
5217
5218 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector);
5219 }
5220
5221 @helper RenderLanguageSelector()
5222 {
5223 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5224 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5225 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5226 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() : "";
5227 string currentLanguage = Pageview.Area.Culture.Replace("nb", "").Replace("en", "").ToLower();
5228 string currentLangInfo = "<span class=\"flag-icon flag-icon" + currentLanguage + " u-margin-right\"></span>";
5229
5230
5231 if (Model.Languages.Count > 1)
5232 {
5233 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod">
5234 <div class="@menuLinkClass dw-mod" title="@Translate("Language")">
5235 @currentLangInfo
5236 </div>
5237 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell">
5238 @foreach (var lang in Model.Languages)
5239 {
5240 var area = Dynamicweb.Content.Services.Areas.GetArea(lang.ID);
5241 string widthClass = "menu__item--fixed-width";
5242 string languageIcon = lang.Culture.Replace("nb", "").Replace("en", "").ToLower();
5243 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name;
5244 string cultureName = Regex.Replace(area.CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
5245 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
5246
5247 if (languageViewType == "flag-culture")
5248 {
5249 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName;
5250 }
5251
5252 if (languageViewType == "flag")
5253 {
5254 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>";
5255 widthClass = "";
5256 }
5257
5258 if (languageViewType == "name")
5259 {
5260 langInfo = lang.Name;
5261 }
5262
5263 if (languageViewType == "culture")
5264 {
5265 langInfo = cultureName;
5266 widthClass = "";
5267 }
5268
5269 <div class="menu__item dw-mod @widthClass">
5270 <a onclick="
5271 window.dispatchEvent(new CustomEvent('on-language-change', { detail: { languageId: '@area.EcomLanguageId.ToUpper()', culture: '@lang.Culture' } }))"
5272 href="/Default.aspx?AreaID=@area.ID"
5273 class="menu-dropdown__link dw-mod">@langInfo</a>
5274 </div>
5275 }
5276 </div>
5277 </li>
5278 }
5279 }
5280 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5281
5282 @using System
5283 @using System.Web
5284 @using Dynamicweb.Rapido.Blocks.Extensibility
5285 @using Dynamicweb.Rapido.Blocks
5286
5287 @{
5288 Block masterDesktopActionsMenuSignIn = new Block
5289 {
5290 Id = "MasterDesktopActionsMenuSignIn",
5291 SortId = 20,
5292 Template = RenderSignIn()
5293 };
5294
5295 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn);
5296 }
5297
5298 @helper RenderSignIn()
5299 {
5300 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
5301 string userInitials = "";
5302 int pageId = Model.TopPage.ID;
5303 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
5304 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
5305 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
5306 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
5307 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
5308 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
5309 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft");
5310 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
5311 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
5312 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
5313 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
5314 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
5315 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts");
5316 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
5317 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
5318
5319 string linkStart = "/Default.aspx?ID=";
5320 if (Model.CurrentUser.ID <= 0)
5321 {
5322 linkStart += signInProfilePageId + "&RedirectPageId=";
5323 }
5324
5325 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
5326 string myProfilePageLink = linkStart + myProfilePageId;
5327 string myOrdersPageLink = linkStart + myOrdersPageId;
5328 string myFavoritesPageLink = linkStart + myFavoritesPageId;
5329 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
5330 string myOrderDraftsLink = linkStart + myOrderDraftsPageId;
5331
5332 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
5333 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";
5334 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
5335 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : "";
5336
5337 if (Model.CurrentUser.ID != 0)
5338 {
5339 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName);
5340 }
5341
5342 if (!navigationItemsHideSignIn)
5343 {
5344 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5345 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
5346 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5347
5348
5349 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass u-margin-right-header-menu is-dropdown--no-icon dw-mod">
5350 <div class="@menuLinkClass dw-mod" >
5351 @if (Model.CurrentUser.ID <= 0)
5352 {
5353 <i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>
5354 }
5355 else
5356 {
5357 <div class="user-menu u-flex">
5358 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
5359 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
5360 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon)
5361
5362 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
5363 {
5364 <div class="u-margin-right">
5365 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></div>
5366 </div>
5367 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
5368 {
5369 <div class="u-margin-right">
5370 <a href="/" class="u-color-inherit" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></a>
5371 </div>
5372 } else {
5373 @RenderMenuIcon("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"), "far fa-sign-out-alt")
5374 }
5375
5376 </div>
5377 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@
5378 }
5379 </div>
5380 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod">
5381 <ul class="list list--clean dw-mod">
5382 @if (Model.CurrentUser.ID <= 0)
5383 {
5384 <li>
5385 <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>
5386 </li>
5387
5388 if (!hideCreateAccountLink)
5389 {
5390 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"));
5391 }
5392 if (!hideForgotPasswordLink)
5393 {
5394 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
5395 }
5396 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
5397 {
5398 @RenderSeparator()
5399 }
5400 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true )
5401 }
5402 else
5403 {
5404 if (!hideMyProfileLink)
5405 {
5406 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
5407 }
5408 if (!hideMyOrdersLink)
5409 {
5410 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
5411 }
5412 if (!hideMyFavoritesLink)
5413 {
5414 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
5415 }
5416 if (!hideMySavedCardsLink)
5417 {
5418 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
5419 }
5420 if (!hideMyOrderDraftsLink)
5421 {
5422 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon)
5423 }
5424 }
5425
5426 @if (Model.CurrentUser.ID > 0)
5427 {
5428 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
5429 {
5430 @RenderSeparator()
5431 }
5432
5433 //Check if impersonation is on
5434 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
5435 {
5436 <li>
5437 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;">
5438 @Translate("Sign out")
5439 </div>
5440 </li>
5441 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
5442 {
5443 <li>
5444 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)">
5445 @Translate("Sign out")
5446 </a>
5447 </li>
5448 } else {
5449 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
5450 }
5451 }
5452 </ul>
5453 </div>
5454 </li>
5455 }
5456 }
5457
5458 @helper RenderListItem(string link, string text, string icon = null, bool target = false) {
5459 string targetBlank = target == true ? "target='_blank'" : "";
5460 <li>
5461 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)" @targetBlank>
5462 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text
5463 </a>
5464 </li>
5465 }
5466
5467 @helper RenderSeparator()
5468 {
5469 <li class="list__seperator dw-mod"></li>
5470 }
5471
5472 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5473
5474 @using System
5475 @using System.Web
5476 @using Dynamicweb.Rapido.Blocks.Extensibility
5477 @using Dynamicweb.Rapido.Blocks
5478
5479 @{
5480 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
5481
5482 Block masterDesktopActionsMenuFavorites = new Block
5483 {
5484 Id = "MasterDesktopActionsMenuFavorites",
5485 SortId = 30,
5486 Template = RenderFavorites()
5487 };
5488
5489 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0)
5490 {
5491 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites);
5492 }
5493 }
5494
5495 @helper RenderFavorites()
5496 {
5497 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
5498 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId;
5499
5500 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5501 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5502 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5503
5504 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5505 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")">
5506 @*
5507 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i>
5508 *@
5509 <img src="/Files/Images/favorite-list-svg.svg"/>
5510 </a>
5511 </li>
5512 }
5513 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5514 @using Dynamicweb.Rapido.Blocks
5515
5516 @{
5517 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
5518 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
5519
5520 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart)
5521 {
5522 Block masterDesktopActionsMenuMiniCart = new Block
5523 {
5524 Id = "MasterDesktopActionsMenuMiniCart",
5525 SortId = 40,
5526 Template = RenderMiniCart(miniCartLayout == "dropdown"),
5527 SkipRenderBlocksList = true,
5528 BlocksList = new List<Block>()
5529 };
5530
5531 Block miniCartCounterScriptTemplate = new Block
5532 {
5533 Id = "MiniCartCounterScriptTemplate",
5534 Template = RenderMiniCartCounterContent()
5535 };
5536
5537 //dropdown layout is default
5538 RazorEngine.Templating.TemplateWriter layoutTemplate;
5539 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate;
5540
5541 switch (miniCartLayout)
5542 {
5543 case "dropdown":
5544 layoutTemplate = RenderMiniCartDropdownLayout();
5545 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5546 break;
5547 case "panel":
5548 layoutTemplate = RenderMiniCartPanelLayout();
5549 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5550 break;
5551 case "modal":
5552 layoutTemplate = RenderMiniCartModalLayout();
5553 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5554 break;
5555 case "none":
5556 default:
5557 layoutTemplate = RenderNoLayoutMiniCart();
5558 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5559 break;
5560 }
5561
5562 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5563 {
5564 Id = "MiniCartTrigger",
5565 SortId = 40,
5566 Template = miniCartTriggerTemplate
5567 });
5568
5569 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
5570 {
5571 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5572 {
5573 Id = "MiniCartLayout",
5574 SortId = 40,
5575 Template = layoutTemplate
5576 });
5577 }
5578
5579 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart);
5580 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
5581 }
5582
5583 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
5584 {
5585 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block
5586 {
5587 Id = "CartInitialization",
5588 Template = RenderNoLayoutMiniCart()
5589 });
5590 }
5591
5592 }
5593
5594 @helper RenderMiniCart(bool hasMouseEnterEvent)
5595 {
5596 @*List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList();
5597 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5598 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean";
5599 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5600 string mouseEvent = "";
5601 string id = "MiniCart";
5602 if (hasMouseEnterEvent)
5603 {
5604 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\"";
5605 id = "miniCartTrigger";
5606 }
5607 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent>
5608 @RenderBlockList(subBlocks)
5609 </li>*@
5610 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5611
5612 <li style="display: flex; align-items: center; margin-top: 19px;">
5613 <div id="cartMiniApp"></div>
5614 </li>
5615
5616 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
5617 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
5618 {
5619 //user data
5620 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO",
5621 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK",
5622 UserId = user?.ID,
5623 CustomerNumber = user?.CustomerNumber,
5624
5625 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True",
5626 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300",
5627 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True",
5628
5629 //site settings
5630 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
5631 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name,
5632 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"),
5633 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page
5634 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl)
5635 });
5636 //this app is responsible for fetching all the user details required by all our vue.js apps to run
5637 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div>
5638
5639 //this app is responsible for handling events sent from legacy JS components, like food calendar
5640 <div id="legacyEventHandler" style="visibility: hidden" ></div>
5641 }
5642
5643 @helper RenderNoLayoutMiniCart()
5644 {
5645 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5646 <script>
5647 window.cartId = "@miniCartFeedPageId";
5648 </script>
5649 }
5650
5651 @helper RenderMiniCartTriggerLabel()
5652 {
5653 int cartPageId = GetPageIdByNavigationTag("CartPage");
5654 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5655 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5656 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5657 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5658
5659 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="location.href = document.querySelector('[data-cart-page-link]').getAttribute('data-cart-page-link')" title="@Translate("Cart")">
5660 <div class="u-inline u-position-relative">
5661 <img src="/Files/Images/cart-svg.svg" />
5662 @RenderMiniCartCounter()
5663 </div>
5664 </div>
5665 }
5666
5667 @helper RenderMiniCartTriggerLink()
5668 {
5669 int cartPageId = GetPageIdByNavigationTag("CartPage");
5670 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5671 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5672 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5673
5674 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")">
5675 <span class="u-inline u-position-relative">
5676 <i class="@cartIcon fa-1_5x"></i>
5677 @RenderMiniCartCounter()
5678 </span>
5679 </a>
5680 }
5681
5682 @helper RenderMiniCartCounter()
5683 {
5684 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5685 string cartProductsCount = Model.Cart.OrderlinesCount.ToString();
5686 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5687 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5688 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : "";
5689 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : "";
5690
5691 if (showPrice && counterPosition == "right")
5692 {
5693 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")";
5694 }
5695
5696 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod">
5697 <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">
5698 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.OrderlinesCount.ToString()">
5699 @cartProductsCount @cartProductsTotalPrice
5700 </span>
5701 </span>
5702 </span>
5703 }
5704
5705 @helper RenderMiniCartCounterContent()
5706 {
5707 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5708 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5709 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
5710
5711 <script id="MiniCartCounterContent" type="text/x-template">
5712 {{#.}}
5713 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}">
5714 @if (showPriceInMiniCartCounter)
5715 {
5716 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
5717 }
5718 else
5719 {
5720 <text>{{numberoforderlines}}</text>
5721 }
5722 </span>
5723 {{/.}}
5724 </script>
5725 }
5726
5727 @helper RenderMiniCartDropdownLayout()
5728 {
5729 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5730 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5731
5732 <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">
5733 <div class="mini-cart-dropdown__inner dw-mod">
5734 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3>
5735 <div class="mini-cart-dropdown__body u-flex dw-mod">
5736 <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>
5737 </div>
5738 </div>
5739 </div>
5740 }
5741
5742 @helper RenderMiniCartPanelLayout()
5743 {
5744 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5745 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart");
5746 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed");
5747 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5748 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
5749 var hideOnCartPageClass = GetPageIdByNavigationTag("CartPage") == Model.ID ? "u-hidden" : "";
5750 var preventLoadOnProductList = GetPageIdByNavigationTag("ProductsPage") == Model.ID ? "data-init-onload=\"false\"" : "";
5751
5752 <div class="mini-cart grid__cell dw-mod">
5753 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" />
5754 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-add-to-cart-id="@WebAPIAddToCartPageId" data-show-type="block" data-cart-page-link="@cartPageLink">
5755 <label for="miniCartTrigger" class="panel__close-btn u-hidden" title="@Translate("Close panel")"><i class="fas fa-times"></i></label>
5756 <div class="panel__content u-full-width dw-mod">
5757 <div class="panel_toggle_button @hideOnCartPageClass">
5758 <button class="toggle-minicart btn btn--primary dw-mod" onclick="toggleMinicart(this)">
5759 <i class="fas fa-arrow-alt-circle-left"></i>
5760 </button>
5761 </div>
5762 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart list")</h3>
5763 <div class="">
5764 <div class="u-full-width dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div>
5765 <div class="dw-mod">
5766 @Render(new Button
5767 {
5768 Title = Translate("Change Cart Name"),
5769 ButtonType = ButtonType.Button,
5770 ButtonLayout = ButtonLayout.None,
5771 CssClass = "u-margin-bottom change-cart-name",
5772 OnClick = "changeCartName()"
5773 })
5774 @Render(new Button
5775 {
5776 Title = Translate("Create New Cart"),
5777 ButtonType = ButtonType.Button,
5778 ButtonLayout = ButtonLayout.Primary,
5779 CssClass = "u-full-width",
5780 OnClick = "document.getElementById('NewCartModalTrigger').checked = true"
5781 })
5782 </div>
5783 </div>
5784 <div class="panel__content-body panel__content-body--cart dw-mod">
5785 <div class="minicart-preloader-overlay" id="MiniCartOverlay"><div class="preloader-overlay__icon dw-mod" style="top: 0px;"></div></div>
5786 <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" @preventLoadOnProductList></div>
5787 </div>
5788 </div>
5789 </div>
5790 </div>
5791 }
5792
5793 @helper RenderMiniCartModalLayout()
5794 {
5795 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5796 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5797
5798 <div class="mini-cart grid__cell dw-mod">
5799 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" />
5800 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink">
5801 <label for="miniCartTrigger" class="modal-overlay"></label>
5802 <div class="modal modal--md modal--top-right dw-mod">
5803 <div class="modal__body u-flex grid--direction-column dw-mod">
5804 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3>
5805 <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>
5806 </div>
5807 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label>
5808 </div>
5809 </div>
5810 </div>
5811 }
5812
5813 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5814
5815 @using System
5816 @using System.Web
5817 @using Dynamicweb.Rapido.Blocks.Extensibility
5818 @using Dynamicweb.Rapido.Blocks
5819
5820 @{
5821 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon");
5822
5823 Block masterDesktopActionsMenuOrderDraft = new Block
5824 {
5825 Id = "MasterDesktopActionsMenuOrderDraft",
5826 SortId = 40,
5827 Template = RenderOrderDraft()
5828 };
5829
5830 if (showOrderDraftLink && Model.CurrentUser.ID > 0)
5831 {
5832 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft);
5833 }
5834 }
5835
5836 @helper RenderOrderDraft()
5837 {
5838 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft");
5839 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId;
5840 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
5841
5842
5843 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5844 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5845 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5846
5847 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5848 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")">
5849 <span class="u-inline u-position-relative">
5850 <i class="@draftIcon fa-1_5x"></i>
5851 </span>
5852 </a>
5853 </li>
5854 }
5855 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5856
5857 @using System
5858 @using System.Web
5859 @using Dynamicweb.Rapido.Blocks.Extensibility
5860 @using Dynamicweb.Rapido.Blocks
5861
5862 @{
5863 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart");
5864
5865 Block masterDesktopActionsMenuDownloadCart = new Block
5866 {
5867 Id = "MasterDesktopActionsMenuDownloadCart",
5868 SortId = 50,
5869 Template = RenderDownloadCart()
5870 };
5871
5872 if (showDownloadCartLink && Model.CurrentUser.ID > 0)
5873 {
5874 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart);
5875 }
5876 }
5877
5878 @helper RenderDownloadCart()
5879 {
5880 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart");
5881 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId;
5882
5883 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5884 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5885 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5886 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5887
5888 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5889 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")">
5890 <span class="u-inline u-position-relative">
5891 <i class="fas fa-cart-arrow-down fa-1_5x"></i>
5892 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span>
5893 </span>
5894 </a>
5895 </li>
5896 }
5897 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5898
5899 @using System
5900 @using System.Web
5901 @using Dynamicweb.Rapido.Blocks.Extensibility
5902 @using Dynamicweb.Rapido.Blocks
5903
5904 @functions {
5905 public class SearchConfiguration
5906 {
5907 public string searchFeedId { get; set; }
5908 public string searchSecondFeedId { get; set; }
5909 public int groupsFeedId { get; set; }
5910 public string resultPageLink { get; set; }
5911 public string searchPlaceholder { get; set; }
5912 public string searchType { get; set; }
5913 public string searchTemplate { get; set; }
5914 public string searchContentTemplate { get; set; }
5915 public string searchValue { get; set; }
5916 public bool showGroups { get; set; }
5917
5918 public SearchConfiguration()
5919 {
5920 searchFeedId = "";
5921 searchSecondFeedId = "";
5922 searchType = "product-search";
5923 searchContentTemplate = "";
5924 showGroups = true;
5925 }
5926 }
5927 }
5928 @{
5929 Block masterSearchBar = new Block
5930 {
5931 Id = "MasterSearchBar",
5932 SortId = 40,
5933 Template = RenderSearch("bar"),
5934 Design = new Design
5935 {
5936 Size = "auto",
5937 HidePadding = true,
5938 RenderType = RenderType.Column
5939 }
5940 };
5941
5942 Block masterSearchAction = new Block
5943 {
5944 Id = "MasterDesktopActionsMenuSearch",
5945 SortId = 10,
5946 Template = RenderSearch()
5947 };
5948
5949 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar);
5950 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction);
5951 }
5952
5953 @helper RenderSearch(string type = "mini-search")
5954 {
5955 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage"));
5956 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage"));
5957 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
5958 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch";
5959
5960 SearchConfiguration searchConfiguration = null;
5961
5962 switch (searchType) {
5963 case "contentSearch":
5964 searchConfiguration = new SearchConfiguration() {
5965 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5966 resultPageLink = contentSearchPageLink,
5967 searchPlaceholder = Translate("Search page"),
5968 groupsFeedId = 0,
5969 searchType = "content-search",
5970 searchTemplate = "SearchPagesTemplate",
5971 showGroups = false
5972 };
5973 break;
5974 case "combinedSearch":
5975 searchConfiguration = new SearchConfiguration() {
5976 searchFeedId = productsPageId + "&feed=true",
5977 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5978 resultPageLink = Converter.ToString(productsPageId),
5979 searchPlaceholder = Translate("Search products or pages"),
5980 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5981 searchType = "combined-search",
5982 searchTemplate = "SearchProductsTemplateWrap",
5983 searchContentTemplate = "SearchPagesTemplateWrap",
5984 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5985 };
5986 break;
5987 default: //productSearch
5988 searchConfiguration = new SearchConfiguration() {
5989 resultPageLink = Converter.ToString(productsPageId),
5990 searchFeedId = searchPageId + "&feed=true",
5991 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5992 searchPlaceholder = Translate("Search products"),
5993 searchTemplate = "SearchProductsTemplate",
5994 searchType = "product-search",
5995 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5996 };
5997 break;
5998 }
5999 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
6000
6001 if (type == "mini-search") {
6002 @RenderMiniSearch(searchConfiguration)
6003 } else {
6004 @RenderSearchBar(searchConfiguration)
6005 }
6006 }
6007
6008 @helper RenderSearchBar(SearchConfiguration options)
6009 {
6010 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar"
6011 data-page-size="7"
6012 data-search-feed-id="@options.searchFeedId"
6013 data-search-second-feed-id="@options.searchSecondFeedId"
6014 data-result-page-id="@options.resultPageLink"
6015 data-groups-page-id="@options.groupsFeedId"
6016 data-search-type="@options.searchType">
6017 @if (options.showGroups)
6018 {
6019 <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>
6020 <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>
6021 }
6022 <div class="typeahead-search-field">
6023 <input type="text" class="u-no-margin u-full-width search-ahead__input js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue">
6024 @*
6025 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"><i class="fas fa-times"></i></button>
6026 *@
6027 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
6028 {
6029 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul>
6030 }
6031 else
6032 {
6033 <div class="dropdown dropdown--absolute-position dropdown--combined grid">
6034 <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>
6035 <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>
6036 </div>
6037 }
6038 </div>
6039 <button type="button" class="search-icon-desktop js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button>
6040 </div>
6041 }
6042
6043 @helper RenderMiniSearch(SearchConfiguration options)
6044 {
6045 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6046 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
6047
6048 <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">
6049 <div class="@menuLinkClass dw-mod" title="@Translate("Search")">
6050 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
6051 </div>
6052 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
6053 <div class="typeahead js-typeahead" id="ProductSearchBar"
6054 data-page-size="7"
6055 data-search-feed-id="@options.searchFeedId"
6056 data-search-second-feed-id="@options.searchSecondFeedId"
6057 data-result-page-id="@options.resultPageLink"
6058 data-search-type="@options.searchType">
6059 <div class="typeahead-search-field">
6060 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue">
6061 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
6062 {
6063 <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" data-init-onload="false"></ul>
6064 }
6065 else
6066 {
6067 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
6068 <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" data-init-onload="false"></div>
6069 <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>
6070 </div>
6071 }
6072 </div>
6073 </div>
6074 </div>
6075 </li>
6076 }
6077 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6078
6079 @using System
6080 @using System.Web
6081 @using Dynamicweb.Rapido.Blocks.Extensibility
6082 @using Dynamicweb.Rapido.Blocks
6083
6084 @{
6085 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6086 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
6087
6088 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master");
6089
6090 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo");
6091 headerConfigurationPage.RemoveBlock(configDesktopLogo);
6092
6093 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu");
6094 headerConfigurationPage.RemoveBlock(configDesktopMenu);
6095
6096 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar");
6097 headerConfigurationPage.RemoveBlock(configSearchBar);
6098
6099 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch");
6100 headerConfigurationPage.RemoveBlock(configSearchAction);
6101
6102 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu");
6103 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu);
6104
6105 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra");
6106
6107 switch (headerConfigurationTopLayout)
6108 {
6109 case "condensed": //2
6110 configDesktopLogo.Design.Size = "auto-width";
6111 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6112
6113 configDesktopMenu.SortId = 20;
6114 configDesktopMenu.Design.Size = "auto";
6115 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6116
6117 configDesktopActionsMenu.SortId = 30;
6118 configDesktopActionsMenu.Design.Size = "auto-width";
6119 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6120
6121 if (!headerConfigurationHideSearch)
6122 {
6123 configSearchBar.SortId = 40;
6124 configSearchBar.Design.Size = "12";
6125 configDesktopExtra.SortId = 50;
6126 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6127 }
6128 break;
6129 case "splitted": //3
6130 configDesktopLogo.Design.Size = "auto";
6131 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6132
6133 if (!headerConfigurationHideSearch)
6134 {
6135 configSearchBar.SortId = 20;
6136 configSearchBar.Design.Size = "auto";
6137 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6138 }
6139
6140 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6141
6142 configDesktopActionsMenu.SortId = 20;
6143 configDesktopActionsMenu.Design.Size = "auto-width";
6144 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6145 break;
6146 case "splitted-center": //4
6147 configDesktopLogo.Design.Size = "auto";
6148 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6149 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6150
6151 configDesktopActionsMenu.SortId = 30;
6152 configDesktopActionsMenu.Design.Size = "auto-width";
6153 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
6154
6155 if (!headerConfigurationHideSearch)
6156 {
6157 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6158 }
6159 break;
6160 case "minimal": //5
6161 configDesktopLogo.Design.Size = "auto-width";
6162 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6163
6164 configDesktopMenu.Design.Size = "auto";
6165 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6166
6167 configDesktopActionsMenu.SortId = 20;
6168 configDesktopActionsMenu.Design.Size = "auto-width";
6169 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6170
6171 if (!headerConfigurationHideSearch)
6172 {
6173 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6174 }
6175 break;
6176 case "minimal-center": //6
6177 configDesktopLogo.Design.Size = "auto-width";
6178 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6179
6180 configDesktopMenu.Design.Size = "auto";
6181 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6182
6183 configDesktopActionsMenu.SortId = 20;
6184 configDesktopActionsMenu.Design.Size = "auto-width";
6185 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6186
6187 if (!headerConfigurationHideSearch)
6188 {
6189 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6190 }
6191 break;
6192 case "minimal-right": //7
6193 configDesktopLogo.Design.Size = "auto-width";
6194 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6195
6196 configDesktopMenu.Design.Size = "auto";
6197 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6198
6199 configDesktopActionsMenu.SortId = 20;
6200 configDesktopActionsMenu.Design.Size = "auto-width";
6201 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6202
6203 if (!headerConfigurationHideSearch)
6204 {
6205 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6206 }
6207 break;
6208 case "two-lines": //8
6209 configDesktopLogo.Design.Size = "auto";
6210 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6211
6212 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6213
6214 configDesktopActionsMenu.SortId = 20;
6215 configDesktopActionsMenu.Design.Size = "auto-width";
6216 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6217
6218 if (!headerConfigurationHideSearch)
6219 {
6220 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6221 }
6222 break;
6223 case "two-lines-centered": //9
6224 configDesktopLogo.Design.Size = "auto";
6225 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6226
6227 configDesktopMenu.Design.Size = "auto-width";
6228 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6229
6230 configDesktopActionsMenu.SortId = 20;
6231 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6232
6233 if (!headerConfigurationHideSearch)
6234 {
6235 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6236 }
6237 break;
6238 case "normal": //1
6239 default:
6240 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6241
6242 if (!headerConfigurationHideSearch)
6243 {
6244 configSearchBar.SortId = 20;
6245 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6246 }
6247
6248 configDesktopActionsMenu.SortId = 30;
6249 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
6250
6251 configDesktopActionsMenu.Design.Size = "auto-width";
6252 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6253 break;
6254 }
6255 }
6256 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6257
6258 @using System
6259 @using System.Web
6260 @using Dynamicweb.Rapido.Blocks.Extensibility
6261 @using Dynamicweb.Rapido.Blocks
6262
6263 @{
6264 Block masterCustomDesktopActionsMenuSignIn = new Block
6265 {
6266 Id = "MasterDesktopActionsMenuSignIn",
6267 SortId = 20,
6268 Template = RenderCustomSignIn()
6269 };
6270
6271 BlocksPage.GetBlockPage("Master").ReplaceBlock(masterCustomDesktopActionsMenuSignIn);
6272 }
6273
6274 @helper RenderCustomSignIn()
6275 {
6276 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
6277 string userInitials = "";
6278 int pageId = GetPageIdByNavigationTag("SignInPage");
6279 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
6280 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
6281 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
6282 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
6283 int announcementPageId = GetPageIdByNavigationTag("Announcements");
6284 int myDeviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage");
6285 int myDeviationsAdminPageId = GetPageIdByNavigationTag("DeviationsAdminHistoryPage");
6286 //int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
6287 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList");
6288 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
6289 int myReportsPageId = GetPageIdByNavigationTag("MyReports");
6290 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft");
6291 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
6292 int recipeBankPageId = GetPageIdByNavigationTag("MenuView");
6293 int menuCalendarPageId = GetPageIdByNavigationTag("MenuCalendarView");
6294 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
6295 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
6296 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
6297 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
6298 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts");
6299 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
6300 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
6301
6302 string linkStart = "/Default.aspx?ID=";
6303 if (Model.CurrentUser.ID <= 0)
6304 {
6305 linkStart += signInProfilePageId + "&RedirectPageId=";
6306 }
6307
6308 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
6309 string myProfilePageLink = linkStart + myProfilePageId;
6310 string myOrdersPageLink = linkStart + myOrdersPageId;
6311 string announcementPageLink = linkStart + announcementPageId;
6312 string myDeviationsPageLink = linkStart + myDeviationsPageId;
6313 string myReportsPageLink = linkStart + myReportsPageId;
6314 string myDeviationsAdminPageLink = linkStart + myDeviationsAdminPageId;
6315 string myFavoritesPageLink = linkStart + myFavoritesPageId + "&loadLists=true";
6316 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
6317 string myOrderDraftsLink = linkStart + myOrderDraftsPageId;
6318 string recipeBankPageLink = linkStart + recipeBankPageId;
6319 string menuCalendarPageLink = linkStart + menuCalendarPageId;
6320
6321 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
6322 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "far fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star";
6323 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
6324 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : "";
6325
6326 if (Model.CurrentUser.ID != 0)
6327 {
6328 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName);
6329 }
6330
6331 if (!navigationItemsHideSignIn)
6332 {
6333 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6334 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
6335 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
6336 bool promptForAccount = getPromptForAccount();
6337 string createPageId = GetPageIdByNavigationTag("CreateAccount").ToString();
6338 string createPageUrl = "/Default.aspx?Id=" + createPageId;
6339 bool isUserAnonymous = string.IsNullOrWhiteSpace(Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser()?.UserName.ToString());
6340 var user = Pageview.User;
6341 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false;
6342 var userCompany = Model.CurrentUser.Company;
6343 bool isRmaAdmin = userCompany != null && userCompany.ToLower() == "kraemer";
6344 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false;
6345 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false;
6346 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : "";
6347 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : "";
6348
6349 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty;
6350 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty;
6351 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false;
6352
6353 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod">
6354 <div class="@menuLinkClass dw-mod">
6355 @if (Model.CurrentUser.ID <= 0)
6356 {
6357 @*<i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>*@
6358 <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>
6359
6360 @*this app is responsible for setting all the settings for anonymous users in vue.js apps*@
6361 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
6362 {
6363 //user data
6364 CountryCode = "NO",
6365 CurrencyCode = "NOK",
6366 ShowNumberOfCartons = false,
6367 SendShipOwner = false,
6368 SendOnlySeeDiverse = false,
6369
6370 //site settings
6371 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
6372 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name,
6373 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"),
6374 CheckoutPageUrl = "",
6375 MinicartAvailable = false
6376 });
6377
6378 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div>
6379 }
6380 else
6381 {
6382 <div class="user-menu u-flex headerIcons" data-user-type-food-calendar="@isFoodCalendarAdmin">
6383 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon, "/Files/Images/favorite-list-svg.svg")
6384 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list", "/Files/Images/order-history-svg.svg")
6385 @if (hasAccessToAnnouncements)
6386 {
6387 @*
6388 @RenderMenuIcon(announcementPageLink, Translate("Announcements"), "fas fa-list", "/Files/Images/notifications.svg")
6389 *@
6390 <div class="u-margin-right--lg">
6391 <a href="@announcementPageLink" class="u-brand-color-two bs-position-relative" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")">
6392 <img src="/Files/Images/notifications.svg">
6393 <svg class="announcement_notification-dot bs-position-absolute bs-bottom-0 bs-end-0 @announcementNotificationDotClass" style="top: 45%;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
6394 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30" />
6395 </svg>
6396 </a>
6397 </div>
6398 }
6399 @if (hasAccessToFoodCalendar)
6400 {
6401 @RenderMenuIcon(recipeBankPageLink, Translate("Matretter"), "fas fa-list", "/Files/Images/food-calendar.svg")
6402 }
6403 @if (isFoodCalendarAdmin)
6404 {
6405 @RenderMenuIcon(menuCalendarPageLink, Translate("Kalendervisning"), "fas fa-list", "/Files/Images/food-calendar-menu-calendar.svg")
6406 }
6407
6408 @if (isRmaAdmin)
6409 {
6410 @RenderMenuIcon(myDeviationsAdminPageLink, Translate("Admin RMA"), "fas fa-list", "/Files/Images/unionRMA-Admin-icon.svg")
6411 }
6412 else
6413 {
6414 @RenderMenuIcon(myDeviationsPageLink, Translate("My Deviations"), "fas fa-list", "/Files/Images/UnionRMA-icon.svg")
6415 }
6416 @if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport)
6417 {
6418 @RenderMenuIcon(myReportsPageLink, Translate("My report"), "fas fa-list", "/Files/Images/IconPowerBi.svg")
6419 }
6420
6421 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon, "/Files/Images/my-account-svg.svg")
6422
6423 @*@if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
6424 {
6425 <div class="u-margin-right">
6426 <a href="/" class="u-color-inherit" testc onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")">
6427 <img src="/Files/Images/log-out-svg.svg"/>
6428 </a>
6429 </div>
6430 }
6431 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
6432 {
6433
6434 <div class="u-margin-right">
6435 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")">
6436 <img src="/Files/Images/log-out-svg.svg"/>
6437 </div>
6438 </div>
6439
6440 }
6441 else
6442 {*@
6443 <div class="u-margin-right--lg" testd>
6444 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="logOutPrimaryUser(event, this);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')" class="u-brand-color-two" title="@Translate("Sign out")">
6445 <img src="/Files/Images/log-out-svg.svg" alt="sign out">
6446 </a>
6447 </div>
6448 @*}*@
6449
6450 </div>
6451 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@
6452 }
6453 </div>
6454 <div class="menu menu--dropdown menu--dropdown-right menu--dropdown-right--custom menu--sign-in grid__cell dw-mod">
6455 <ul class="list list--clean dw-mod">
6456 @if (Model.CurrentUser.ID <= 0)
6457 {
6458 if (!hideCreateAccountLink)
6459 {
6460 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"))
6461 ;
6462 }
6463 if (!hideForgotPasswordLink)
6464 {
6465 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
6466 }
6467 @*if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
6468 {
6469 @RenderSeparator()
6470 }*@
6471 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true)
6472 }
6473 else
6474 {
6475 if (!hideMyProfileLink)
6476 {
6477 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
6478 }
6479 if (!hideMyOrdersLink)
6480 {
6481 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
6482 }
6483 if (!hideMyFavoritesLink)
6484 {
6485 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
6486 }
6487 if (!hideMySavedCardsLink)
6488 {
6489 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
6490 }
6491 if (!hideMyOrderDraftsLink)
6492 {
6493 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon)
6494 }
6495 }
6496
6497 @if (Model.CurrentUser.ID > 0)
6498 {
6499 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
6500 {
6501 @RenderSeparator()
6502 }
6503
6504 //Check if impersonation is on
6505 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
6506 {
6507 <li>
6508 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;">
6509 @Translate("Sign out")
6510 </div>
6511 </li>
6512 }
6513 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
6514 {
6515 <li>
6516 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)">
6517 @Translate("Sign out")
6518 </a>
6519 </li>
6520 }
6521 else
6522 {
6523 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
6524 }
6525 }
6526 </ul>
6527 </div>
6528 </li>
6529 if (isUserAnonymous)
6530 {
6531 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod">
6532 <a class="btn btn--primary btn--full u-no-margin create-account__button" href="@createPageUrl">@Translate("Bli kunde")</a>
6533 </li>
6534 }
6535 }
6536 }
6537
6538 @helper RenderMenuIcon(string link, string title, string icon = null, string iconSource = null)
6539 {
6540 <div class="u-margin-right--lg">
6541 <a href="@link" class="u-brand-color-two" title="@title">
6542 <img src="@iconSource">
6543 </a>
6544 </div>
6545 }
6546
6547
6548
6549
6550 @helper RenderDesktopTools()
6551 {
6552 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList();
6553
6554 <div class="tools-navigation dw-mod">
6555 <div class="center-container grid top-container__center-container dw-mod">
6556 @RenderBlockList(subBlocks)
6557 </div>
6558 </div>
6559 }
6560
6561 @helper RenderDesktopToolsText()
6562 {
6563 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
6564 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
6565 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
6566 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
6567 string userName = userExists ? getUserName(Pageview.User) : "";
6568 int secondaryUsersCount = Model.SecondaryUsers.Count;
6569 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
6570 bool promptForAccount = getPromptForAccount();
6571 <div class="u-flex u-flex--align-center u-justify-between" style="min-height: 30px">
6572 @if (userExists)
6573 {
6574 <div class="u-margin-top u-margin-bottom u-flex u-flex--align-center">
6575 @if (secondaryUsersCount > 0)
6576 {
6577 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
6578 {
6579 <div class="u-margin-right" data-prompt-account="@promptForAccount">@userName</div>
6580 @*if (secondaryUsersCount > 1) {
6581 @Render(new Button
6582 {
6583 ButtonType = ButtonType.Button,
6584 ButtonLayout = ButtonLayout.LinkClean,
6585 Title = Translate("Bytt konto"),
6586 Icon = new Icon {
6587 Name = "fa-sign-out",
6588 Prefix = "fal",
6589 LabelPosition = IconLabelPosition.Before
6590 },
6591 OnClick = "renderImpersonationList(true)",
6592 CssClass = "u-no-margin"
6593 })
6594 }*@
6595 // if (secondaryUsersCount > 1)
6596 // {
6597 @RenderImpersonationDropdown(impersonationListFeedPageId)
6598 // }
6599 }
6600 else
6601 {
6602 <div class="u-margin-right" style="text-transform: uppercase"><span>@Model.CurrentUser.Name</span></div>
6603 @RenderImpersonationDropdown(impersonationListFeedPageId)
6604 }
6605 }
6606
6607 </div>
6608 if (!string.IsNullOrEmpty(customerNumber))
6609 {
6610 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "")
6611 {
6612 <div>
6613 @Translate("currentLocation") <span class="location-space"></span>
6614 @Render(new Button
6615 {
6616 ButtonType = ButtonType.Button,
6617 ButtonLayout = ButtonLayout.None,
6618 Title = Translate("Change Location"),
6619 CssClass = "u-no-margin",
6620 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true"
6621 })
6622 </div>
6623 }
6624 }
6625 }
6626
6627
6628 </div>
6629 }
6630
6631 @helper RenderImpersonationDropdown(string impersonationListFeedPageId)
6632 {
6633 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
6634 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user");
6635 var hideSelfOption = ReturnCustomFieldValue("AccessUser_HideSelf");
6636 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-primary-user="@Model.CurrentUser.Name" data-secondary-user="@Model.CurrentSecondaryUser.Name">
6637 <input type="hidden" name="DwExtranetRemoveSecondaryUser"/>
6638 </form>
6639
6640 <div class="impersonation-container">
6641 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/>
6642 <div class="dropdown variants-filters dw-mod">
6643 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label>
6644 <div class="dropdown__content u-padding dw-mod">
6645 <div class="dropdown__item__filter">
6646 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")">
6647 </div>
6648 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false">
6649 </div>
6650 </div>
6651 </div>
6652 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label>
6653 </div>
6654
6655
6656
6657 }
6658
6659 @helper RenderDesktopToolsNavigation()
6660 {
6661 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
6662
6663 if (renderPagesInToolBar)
6664 {
6665 @RenderNavigation(new
6666 {
6667 id = "topToolsNavigation",
6668 cssclass = "menu menu-tools dw-mod dwnavigation",
6669 template = "TopMenu.xslt"
6670 })
6671 }
6672 }
6673
6674 @helper RenderDesktopNavigation()
6675 {
6676 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
6677 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6678 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : "";
6679 <nav class="main-navigation dw-mod">
6680 <div class="center-container top-container__center-container grid @alignClass dw-mod">
6681 @RenderBlockList(subBlocks)
6682 </div>
6683 </nav>
6684 }
6685
6686 @helper RenderDesktopExtra()
6687 {
6688 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList();
6689
6690 if (subBlocks.Count > 0)
6691 {
6692 <div class="header header-top dw-mod">
6693 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod">
6694 @RenderBlockList(subBlocks)
6695 </div>
6696 </div>
6697 }
6698 }</text>
6699 }
6700
6701 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6702
6703 @using System
6704 @using System.Web
6705 @using Dynamicweb.Rapido.Blocks.Extensibility
6706 @using Dynamicweb.Rapido.Blocks
6707 @using Dynamicweb.Rapido.Blocks.Components.General
6708 @using Dynamicweb.Frontend
6709
6710 @functions {
6711 int impersonationPageId;
6712 string impersonationLayout;
6713 int impersonationFeed;
6714 Block impersonationBar;
6715
6716 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName)
6717 {
6718 string username = "";
6719
6720 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName))
6721 {
6722 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName;
6723 }
6724 else if (!string.IsNullOrEmpty(name))
6725 {
6726 username = name;
6727 }
6728 else if (!string.IsNullOrEmpty(email))
6729 {
6730 username = email;
6731 }
6732 else
6733 {
6734 username = userName;
6735 }
6736 return username;
6737 }
6738
6739 string getUserName(UserViewModel user)
6740 {
6741 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6742 }
6743
6744 string getUserName(Dynamicweb.Security.UserManagement.User user)
6745 {
6746 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6747 }
6748 }
6749
6750 @{
6751 impersonationPageId = GetPageIdByNavigationTag("Impersonation");
6752 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar";
6753 impersonationFeed = GetPageIdByNavigationTag("UsersFeed");
6754
6755 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0 && 2==1)
6756 {
6757 impersonationBar = new Block
6758 {
6759 Id = "ImpersonationBar",
6760 SortId = 50,
6761 Template = RenderImpersonation(),
6762 SkipRenderBlocksList = true,
6763 Design = new Design
6764 {
6765 Size = "auto-width",
6766 HidePadding = true,
6767 RenderType = RenderType.Column
6768 }
6769 };
6770
6771 if (impersonationLayout == "top-bar") {
6772 impersonationBar.SortId = 9;
6773 }
6774
6775 Block impersonationContent = new Block
6776 {
6777 Id = "ImpersonationContent",
6778 SortId = 20
6779 };
6780
6781 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
6782 {
6783 //Render stop impersonation view
6784 impersonationContent.Template = RenderStopImpersonationView();
6785
6786
6787 Modal stopImpersonation = new Modal
6788 {
6789 Id = "StopImpersonation",
6790 Heading = new Heading {
6791 Level = 2,
6792 Title = Translate("Sign out"),
6793 Icon = new Icon {
6794 Name = "fa-sign-out",
6795 Prefix = "fas",
6796 LabelPosition = IconLabelPosition.After
6797 }
6798 },
6799 Width = ModalWidth.Sm,
6800 BodyTemplate = RenderStopImpersonationForm()
6801 };
6802
6803 Block stopImpersonationBlock = new Block
6804 {
6805 Id = "StopImpersonationBlock",
6806 SortId = 10,
6807 Component = stopImpersonation
6808 };
6809 impersonationBar.BlocksList.Add(stopImpersonationBlock);
6810 }
6811 else
6812 {
6813 //Render main view
6814 switch (impersonationLayout)
6815 {
6816 case "right-lower-box":
6817 impersonationContent.BlocksList.Add(
6818 new Block {
6819 Id = "RightLowerBoxHeader",
6820 SortId = 10,
6821 Component = new Heading {
6822 Level = 5,
6823 Title = Translate("View the list of users you can sign in as"),
6824 CssClass = "impersonation-text"
6825 }
6826 }
6827 );
6828 impersonationContent.BlocksList.Add(
6829 new Block {
6830 Id = "RightLowerBoxContent",
6831 SortId = 20,
6832 Template = RenderImpersonationControls()
6833 }
6834 );
6835 break;
6836 case "right-lower-bar":
6837 impersonationContent.BlocksList.Add(
6838 new Block {
6839 Id = "RightLowerBarContent",
6840 SortId = 10,
6841 Template = RenderImpersonationControls()
6842 }
6843 );
6844 break;
6845 case "bar":
6846 default:
6847 impersonationContent.BlocksList.Add(
6848 new Block {
6849 Id = "ViewListLink",
6850 SortId = 20,
6851 Template = RenderViewListLink()
6852 }
6853 );
6854 impersonationContent.BlocksList.Add(
6855 new Block {
6856 Id = "BarTypeaheadSearch",
6857 SortId = 30,
6858 Template = RenderTypeaheadSearch()
6859 }
6860 );
6861 break;
6862 }
6863 }
6864 impersonationBar.BlocksList.Add(impersonationContent);
6865
6866 impersonationBar.BlocksList.Add(
6867 new Block
6868 {
6869 Id = "ImpersonationSearchTemplates",
6870 SortId = 30,
6871 Template = RenderSearchResultTemplate()
6872 }
6873 );
6874 if (impersonationLayout != "bar" && impersonationLayout != "top-bar")
6875 {
6876 impersonationBar.BlocksList.Add(
6877 new Block
6878 {
6879 Id = "ImpersonationSearchScripts",
6880 SortId = 40,
6881 Template = RenderSearchScripts()
6882 }
6883 );
6884 }
6885 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar);
6886 }
6887 }
6888
6889 @helper RenderImpersonation()
6890 {
6891 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList();
6892 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" />
6893 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation">
6894 @if (impersonationLayout == "right-lower-box")
6895 {
6896 @RenderRightLowerBoxHeader()
6897 }
6898 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod">
6899 @*Impersonation*@
6900 @RenderBlockList(subBlocks)
6901 </div>
6902 </div>
6903 }
6904
6905 @helper RenderRightLowerBoxHeader()
6906 {
6907 <div class="impersonation__header dw-mod">
6908 <div class="impersonation__title">@Translate("Impersonation")</div>
6909 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();">
6910 @Render(new Icon
6911 {
6912 Prefix = "fas",
6913 Name = "fa-window-minimize"
6914 })
6915 </label>
6916 </div>
6917 }
6918
6919 @helper RenderStopImpersonationView()
6920 {
6921 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6922 string userName = getUserName(Pageview.User);
6923 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> ";
6924 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;
6925
6926 if (impersonationLayout == "right-lower-box")
6927 {
6928 <div class="u-margin-bottom--lg u-ta-center">
6929 @impersonationText
6930 </div>
6931 <div class="u-margin-bottom--lg u-ta-center">
6932 @RenderSwitchAccountButton()
6933 </div>
6934 @RenderStopImpersonationButton()
6935 }
6936 else
6937 {
6938 <div class="grid grid--align-center impersonation__stop-wrap">
6939 <div class="impersonation-bar-item dw-mod">
6940 @impersonationText
6941 </div>
6942 <div class="impersonation-bar-item dw-mod">
6943 @RenderSwitchAccountButton()
6944 </div>
6945 <div class="impersonation-bar-item dw-mod">
6946 @RenderStopImpersonationButton()
6947 </div>
6948 </div>
6949 }
6950 }
6951
6952 @helper RenderSwitchAccountButton() {
6953 @Render(new Button
6954 {
6955 Href = "/Default.aspx?ID=" + impersonationPageId,
6956 ButtonLayout = ButtonLayout.LinkClean,
6957 Title = Translate("Switch account"),
6958 Icon = new Icon {
6959 Name = "fa-users",
6960 Prefix = "fal",
6961 LabelPosition = IconLabelPosition.After
6962 },
6963 CssClass = "u-no-margin u-color-inherit"
6964 })
6965 }
6966
6967 @helper RenderStopImpersonationForm()
6968 {
6969 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6970 string userName = getUserName(Pageview.User);
6971 int pageId = Model.TopPage.ID;
6972
6973 <form method="post" class="u-no-margin">
6974 @Render(new Button
6975 {
6976 ButtonType = ButtonType.Submit,
6977 ButtonLayout = ButtonLayout.Primary,
6978 Title = Translate("Sign out as") + " " + userName,
6979 OnClick = "logOutImpersonationActions();location.href='/';",
6980 CssClass = "btn--full",
6981 Name = "DwExtranetRemoveSecondaryUser",
6982 })
6983 </form>
6984 @Render(new Button
6985 {
6986 ButtonType = ButtonType.Button,
6987 ButtonLayout = ButtonLayout.Primary,
6988 Title = Translate("Sign out as") + " " + secondaryUserName,
6989 CssClass = "btn--full",
6990 OnClick = "logOutPrimaryUser(event, this)"
6991 })
6992
6993 }
6994
6995 @helper RenderStopImpersonationButton() {
6996 @Render(new Button
6997 {
6998 ButtonType = ButtonType.Button,
6999 ButtonLayout = ButtonLayout.LinkClean,
7000 Title = Translate("Sign out"),
7001 Icon = new Icon {
7002 Name = "fa-sign-out",
7003 Prefix = "fal",
7004 LabelPosition = IconLabelPosition.After
7005 },
7006 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true",
7007 CssClass = "u-no-margin"
7008 })
7009 }
7010
7011 @helper RenderImpersonationControls()
7012 {
7013 <div class="impersonation__controls">
7014 @RenderViewListLink()
7015 @RenderSearchBox()
7016 </div>
7017 @RenderResultsList()
7018 }
7019
7020 @helper RenderViewListLink()
7021 {
7022 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as");
7023 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link";
7024
7025 @Render(new Link {
7026 ButtonLayout = ButtonLayout.None,
7027 Title = title,
7028 Href = "/Default.aspx?ID=" + impersonationPageId,
7029 CssClass = buttonClasses
7030 })
7031 }
7032
7033 @helper RenderSearchBox()
7034 {
7035 <div class="impersonation__search-wrap">
7036 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField">
7037 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)">
7038 <i class="fal fa-search"></i>
7039 </div>
7040 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();">
7041 <i class="fal fa-times"></i>
7042 </div>
7043 </div>
7044 }
7045
7046 @helper RenderTypeaheadSearch()
7047 {
7048 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar"
7049 data-page-size="5"
7050 data-search-feed-id="@impersonationFeed"
7051 data-result-page-id="@impersonationPageId"
7052 data-search-type="user-search"
7053 data-search-parameter-name="q">
7054
7055 <div class="typeahead-search-field">
7056 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")">
7057 <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>
7058 </div>
7059 </div>
7060 }
7061
7062 @helper RenderResultsList()
7063 {
7064 <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>
7065 }
7066
7067 @helper RenderSearchResultTemplate()
7068 {
7069 <script id="ImpersonationSearchResult" type="text/x-template">
7070 {{#.}}
7071 {{#Users}}
7072 <li class="impersonation__search-results-item impersonation-user">
7073 <form method="post" class="impersonation-user__form" name="account{{id}}">
7074 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}">
7075 <div class="impersonation-user__info">
7076 <div class="impersonation-user__name">{{userName}}</div>
7077 <div class="impersonation-user__number">{{customerNumber}}</div>
7078 </div>
7079 @Render(new Button
7080 {
7081 ButtonType = ButtonType.Submit,
7082 ButtonLayout = ButtonLayout.Secondary,
7083 Title = Translate("Sign in as"),
7084 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "")
7085 })
7086 </form>
7087 </li>
7088 {{/Users}}
7089 {{#unless Users}}
7090 <li class="impersonation__search-results-item impersonation__search-results-item--not-found">
7091 @Translate("Your search gave 0 results")
7092 </li>
7093 {{/unless}}
7094 {{/.}}
7095 </script>
7096 }
7097
7098 @helper RenderSearchScripts()
7099 {
7100 <script>
7101 let inputDelayTimer;
7102 function searchKeyUpHandler(e) {
7103 clearTimeout(inputDelayTimer);
7104 let value = e.target.value;
7105 if (value != "") {
7106 inputDelayTimer = setTimeout(function () {
7107 updateResults(value);
7108 }, 500);
7109 } else {
7110 clearResults();
7111 }
7112 };
7113
7114 function updateResults(value) {
7115 if (value == "") {
7116 return null;
7117 }
7118 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value);
7119 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden");
7120 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden");
7121 }
7122
7123 function clearResults() {
7124 document.getElementById("ImpersonationBoxSearchField").value = "";
7125 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults");
7126 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden");
7127 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden");
7128 }
7129 </script>
7130 }
7131 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7132
7133 @using System
7134 @using System.Web
7135 @using System.Collections.Generic
7136 @using Dynamicweb.Rapido.Blocks.Extensibility
7137 @using Dynamicweb.Rapido.Blocks
7138
7139 @{
7140 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
7141 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table";
7142
7143 Block orderLines = new Block
7144 {
7145 Id = "MiniCartOrderLines",
7146 SkipRenderBlocksList = true,
7147 BlocksList = new List<Block>
7148 {
7149 new Block {
7150 Id = "MiniCartOrderLinesList",
7151 SortId = 20,
7152 Template = RenderMiniCartOrderLinesList()
7153 }
7154 }
7155 };
7156
7157 Block orderlinesScriptTemplates = new Block
7158 {
7159 Id = "OrderlinesScriptTemplates"
7160 };
7161
7162 if (orderlinesView == "table")
7163 {
7164 orderLines.Template = RenderMiniCartOrderLinesTable();
7165 orderLines.BlocksList.Add(
7166 new Block
7167 {
7168 Id = "MiniCartOrderlinesTableHeader",
7169 SortId = 10,
7170 Template = RenderMiniCartOrderLinesHeader()
7171 }
7172 );
7173
7174 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates();
7175 }
7176 else
7177 {
7178 orderLines.Template = RenderMiniCartOrderLinesBlocks();
7179 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates();
7180 }
7181
7182 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates);
7183
7184 Block miniCartScriptTemplates = new Block()
7185 {
7186 Id = "MasterMiniCartTemplates",
7187 SortId = 1,
7188 Template = RenderMiniCartScriptTemplates(),
7189 SkipRenderBlocksList = true,
7190 BlocksList = new List<Block>
7191 {
7192 orderLines,
7193 new Block {
7194 Id = "MiniCartFooter",
7195 Template = RenderMiniCartFooter(),
7196 SortId = 50,
7197 SkipRenderBlocksList = true,
7198 BlocksList = new List<Block>
7199 {
7200 new Block {
7201 Id = "MiniCartSubTotal",
7202 Template = RenderMiniCartSubTotal(),
7203 SortId = 30
7204 },
7205 new Block {
7206 Id = "MiniCartFees",
7207 Template = RenderMiniCartFees(),
7208 SortId = 40
7209 },
7210 new Block {
7211 Id = "MiniCartPoints",
7212 Template = RenderMiniCartPoints(),
7213 SortId = 50
7214 },
7215 new Block {
7216 Id = "MiniCartTotal",
7217 Template = RenderMiniCartTotal(),
7218 SortId = 60
7219 },
7220 new Block {
7221 Id = "MiniCartDisclaimer",
7222 Template = RenderMiniCartDisclaimer(),
7223 SortId = 70
7224 },
7225 new Block {
7226 Id = "MiniCartActions",
7227 Template = RenderMiniCartActions(),
7228 SortId = 80
7229 }
7230 }
7231 }
7232 }
7233 };
7234
7235 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates);
7236 }
7237
7238 @helper RenderMiniCartScriptsTableTemplates()
7239 {
7240 string cartPageId = GetPageIdByNavigationTag("MiniCartFeed").ToString();
7241 <script id="MiniCartOrderline" type="text/x-template">
7242 {{#unless isEmpty}}
7243 <tr>
7244 <td class="u-ta-right u-va-middle mini-cart-orderline__quantity {{isDiscontinuedClass}}">
7245 <div class="u-flex u-flex--align-center grid--direction-column">
7246 @*@Render(new Button {
7247 Icon = new Icon { Prefix = "fas", Name = "fa-caret-up", LabelPosition = IconLabelPosition.After },
7248 CssClass = "value-button u-no-margin",
7249 ButtonType = ButtonType.Button,
7250 ButtonLayout = ButtonLayout.None,
7251 ExtraAttributes = new Dictionary<string, string>
7252 {
7253 { "data-operation", "increase"},
7254 }
7255 })*@
7256 <input type="text" value="{{quantityRaw}}" class="quantity bs-fw-bold mini-cart-quantity-orderline" data-step="{{ProductQuantityPerPurchaseUnit}}" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/>
7257 <input type="text" value="{{ProductBaseUnit}}" class="quantity" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/>
7258 @*@Render(new Button {
7259 Icon = new Icon { Prefix = "fas", Name = "fa-caret-down", LabelPosition = IconLabelPosition.After },
7260 CssClass = "value-button u-no-margin",
7261 ButtonType = ButtonType.Button,
7262 ButtonLayout = ButtonLayout.None,
7263 ExtraAttributes = new Dictionary<string, string>
7264 {
7265 { "data-operation", "decrease"},
7266 }
7267 })*@
7268 </div>
7269 </td>
7270 <td class="mini-cart-orderline__image u-va-middle {{isDiscontinuedClass}}">
7271 <a href="{{link}}" class="{{hideimage}} quick-view" data-load-page="{{link}}"><img loading="lazy" width="40" height="40" src="/Admin/Public/GetImage.ashx?width=40&height=40&crop=5&Compression=75&image={{image}}&altFmImage_path=/Images/Kraemer/RapidoProducts/missing-image.jpg" alt="{{name}}" title="{{name}}" style="aspect-ratio: 40 / 40; object-fit: contain;"></a>
7272 </td>
7273 <td class="u-va-middle {{isDiscontinuedClass}}">
7274 <a href="{{link}}" class="u-padding-top mini-cart-orderline__name quick-view" data-load-page="{{link}}" title="{{name}}">{{name}}</a>
7275 <div class="u-padding-bottom">{{productnumber}}</div>
7276 {{#if variantname}}
7277 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a>
7278 {{/if}}
7279 {{#if unitname}}
7280 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div>
7281 {{/if}}
7282 </td>
7283 {{#unless hidePricesOrderline}}
7284 <td class="u-ta-right u-va-middle mini-cart-orderline__price test mini-cart-orderline__price_{{orderLineId}} {{isDiscontinuedClass}}">
7285 {{#if pointsTotal}}
7286 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
7287 {{else}}
7288 {{totalprice}}
7289 {{/if}}
7290 </td>
7291 {{/unless}}
7292 <td class="u-ta-right u-va-middle mini-cart-orderline__delete {{#ifCond isDiscontinuedClass '!==' ""}} u-hidden-border-bottom {{/ifCond}}">
7293 @Render(new Button
7294 {
7295 OnClick = "deleteOrderline('" + cartPageId + "', '{{id}}', '{{orderLineId}}')",
7296 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After },
7297 CssClass = "u-no-margin",
7298 ButtonType = ButtonType.Button,
7299 ButtonLayout = ButtonLayout.None
7300 })
7301 </td>
7302 </tr>
7303 {{#if discontinued}}
7304 <tr class="disabled">
7305 <td class="discontinued-text" style="border-top: 0;" colspan="5">{{discontinuedText}}</td>
7306 </tr>
7307 {{/if}}
7308 {{/unless}}
7309
7310 </script>
7311
7312 <script id="MiniCartOrderlineDiscount" type="text/x-template">
7313 {{#unless isEmpty}}
7314 <tr class="table__row--no-border">
7315 <td class="u-w60px"> </td>
7316 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td>
7317 <td class="u-ta-right"> </td>
7318 {{#unless hidePrices}}
7319 <td class="u-ta-right">{{totalprice}}</td>
7320 {{/unless}}
7321 </tr>
7322 {{/unless}}
7323 </script>
7324 }
7325
7326 @helper RenderMiniCartScriptsListTemplates()
7327 {
7328 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
7329
7330 <script id="MiniCartOrderline" type="text/x-template">
7331 {{#unless isEmpty}}
7332 <div class="mini-cart-orderline grid dw-mod">
7333 <div class="grid__col-4">
7334 <a href="{{link}}" class="{{hideimage}}">
7335 <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}}">
7336 </a>
7337 </div>
7338 <div class="grid__col-8">
7339 <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>
7340 {{#if variantname}}
7341 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div>
7342 {{/if}}
7343 {{#if unitname}}
7344 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div>
7345 {{/if}}
7346 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div>
7347
7348 <div class="grid__cell-footer">
7349 <div class="grid__cell">
7350 {{#unless hidePrices}}
7351 <div class="u-pull--left mini-cart-orderline__price dw-mod">
7352 {{#if pointsTotal}}
7353 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
7354 {{else}}
7355 {{totalprice}}
7356 {{/if}}
7357 </div>
7358 {{/unless}}
7359 <button type="button"
7360 title="@Translate("Remove orderline")"
7361 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod"
7362 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button>
7363 </div>
7364 </div>
7365 </div>
7366 </div>
7367 {{/unless}}
7368 </script>
7369
7370 <script id="MiniCartOrderlineDiscount" type="text/x-template">
7371 {{#unless isEmpty}}
7372 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod">
7373 <div class="grid__col-4">
7374 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div>
7375 </div>
7376 {{#unless hidePrices}}
7377 <div class="grid__col-8">{{totalprice}}</div>
7378 {{/unless}}
7379 </div>
7380 {{/unless}}
7381 </script>
7382 }
7383
7384 @helper RenderMiniCartScriptTemplates()
7385 {
7386 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
7387 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
7388 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage"));
7389 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
7390
7391 <script id="MiniCartContent" type="text/x-template">
7392 {{#.}}
7393 {{#unless isEmpty}}
7394 @if (miniCartUseGoogleTagManager)
7395 {
7396 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
7397 }
7398 @RenderBlockList(subBlocks)
7399 {{/unless}}
7400 {{/.}}
7401 </script>
7402 }
7403
7404 @helper RenderMiniCartOrderLinesTable()
7405 {
7406 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
7407
7408 <div class="u-overflow-auto">
7409 <table class="table mini-cart-table dw-mod" data-test="true">
7410
7411 @RenderBlockList(subBlocks)
7412 </table>
7413 </div>
7414 }
7415
7416 @helper RenderMiniCartOrderLinesBlocks()
7417 {
7418 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
7419
7420 <div class="u-overflow-auto">
7421 @RenderBlockList(subBlocks)
7422 </div>
7423 }
7424
7425 @helper RenderMiniCartOrderLinesHeader()
7426 {
7427 @*<thead>
7428 <tr>
7429 <td> </td>
7430 <td>@Translate("Product")</td>
7431 <td class="u-ta-right">@Translate("Qty")</td>
7432 <td class="u-ta-right">@Translate("Price")</td>
7433 </tr>
7434 </thead>*@
7435 }
7436
7437 @helper RenderMiniCartOrderLinesList()
7438 {
7439 <text>
7440 {{#OrderLines}}
7441 {{#ifCond template "===" "CartOrderline"}}
7442 {{>MiniCartOrderline}}
7443 {{/ifCond}}
7444 {{#ifCond template "===" "CartOrderlineMobile"}}
7445 {{>MiniCartOrderline}}
7446 {{/ifCond}}
7447 {{#ifCond template "===" "CartOrderlineDiscount"}}
7448 {{>MiniCartOrderlineDiscount}}
7449 {{/ifCond}}
7450 {{/OrderLines}}
7451 </text>
7452 }
7453
7454 @helper RenderMiniCartFees()
7455 {
7456 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7457 if (!pointShop)
7458 {
7459 <text>
7460 {{#unless hidePaymentfee}}
7461 <div class="grid">
7462 <div class="grid__col-6 grid__col--bleed-y">
7463 {{paymentmethod}}
7464 </div>
7465 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div>
7466 </div>
7467 {{/unless}}
7468 </text>
7469 }
7470 <text>
7471 {{#unless hideShippingfee}}
7472 <div class="grid">
7473 <div class="grid__col-6 grid__col--bleed-y">
7474 {{shippingmethod}}
7475 </div>
7476 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div>
7477 </div>
7478 {{/unless}}
7479 </text>
7480 <text>
7481 {{#if hasTaxSettings}}
7482 <div class="grid">
7483 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div>
7484 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div>
7485 </div>
7486 {{/if}}
7487 </text>
7488 }
7489
7490 @helper RenderMiniCartFooter()
7491 {
7492 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList();
7493
7494 <div class="mini-cart__footer u-border-top u-padding-top dw-mod">
7495 @RenderBlockList(subBlocks)
7496 </div>
7497 }
7498
7499 @helper RenderMiniCartActions()
7500 {
7501 int cartPageId = GetPageIdByNavigationTag("CartPage");
7502
7503 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom bs-mb-2" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = true">@Translate("Empty cart")</button>
7504 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Proceed to cart")</a>
7505 }
7506
7507 @helper RenderMiniCartPoints()
7508 {
7509 <text>
7510 {{#if earnings}}
7511 <div class="grid">
7512 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div>
7513 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
7514 <div>
7515 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")
7516 </div>
7517 </div>
7518 </div>
7519 {{/if}}
7520 </text>
7521 }
7522
7523 @helper RenderMiniCartSubTotal()
7524 {
7525 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID);
7526 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7527 if (!pointShop)
7528 {
7529 @*<text>
7530 {{#unless hideSubTotal}}
7531 <div class="grid dw-mod u-bold">
7532 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div>
7533 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
7534 @if (hasTaxSettings)
7535 {
7536 <text>{{subtotalpricewithouttaxes}}</text>
7537 }
7538 else
7539 {
7540 <text>{{subtotalprice}}</text>
7541 }
7542 </div>
7543 </div>
7544 {{/unless}}
7545 </text>*@
7546 }
7547 }
7548
7549 @helper RenderMiniCartTotal()
7550 {
7551 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7552 <text>
7553 {{#unless hidePrices}}
7554 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod">
7555 <div class="grid__col-6">@Translate("Total")</div>
7556 <div class="grid__col-6 grid--align-end">
7557 <div>
7558 @if (pointShop)
7559 {
7560 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points")
7561 }
7562 else
7563 {
7564 <text>{{totalprice}}</text>
7565 }
7566 </div>
7567 </div>
7568 </div>
7569 {{/unless}}
7570 </text>
7571 }
7572
7573 @helper RenderMiniCartDisclaimer()
7574 {
7575 <text>
7576 {{#if showCheckoutDisclaimer}}
7577 <div class="grid u-margin-bottom u-ta-right">
7578 <small class="grid__col-12">{{checkoutDisclaimer}}</small>
7579 </div>
7580 {{/if}}
7581 </text>
7582 }
7583 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7584
7585 @using Dynamicweb.Rapido.Blocks.Extensibility
7586 @using Dynamicweb.Rapido.Blocks
7587 @using Dynamicweb.Rapido.Blocks.Components.General
7588 @using Dynamicweb.Rapido.Blocks.Components
7589 @using Dynamicweb.Rapido.Services
7590
7591 @{
7592 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
7593 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
7594 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
7595
7596 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType))
7597 {
7598 if (addToCartNotificationType == "modal")
7599 {
7600 Block addToCartNotificationModal = new Block
7601 {
7602 Id = "AddToCartNotificationModal",
7603 Template = RenderAddToCartNotificationModal()
7604 };
7605
7606 Block addToCartNotificationScript = new Block
7607 {
7608 Id = "AddToCartNotificationScript",
7609 Template = RenderAddToCartNotificationModalScript()
7610 };
7611 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal);
7612 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7613 }
7614 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
7615 {
7616 Block addToCartNotificationScript = new Block
7617 {
7618 Id = "AddToCartNotificationScript",
7619 Template = RenderAddToCartNotificationToggleScript()
7620 };
7621 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7622 }
7623 }
7624 }
7625
7626 @helper RenderAddToCartNotificationModal()
7627 {
7628 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
7629 }
7630
7631 @helper RenderAddToCartNotificationModalScript()
7632 {
7633 int cartPageId = GetPageIdByNavigationTag("CartPage");
7634
7635 <script id="LastAddedProductTemplate" type="text/x-template">
7636 @{
7637
7638 Modal lastAddedProduct = new Modal
7639 {
7640 Id = "LastAddedProduct",
7641 Heading = new Heading
7642 {
7643 Level = 2,
7644 Title = Translate("Product is added to the cart")
7645 },
7646 Width = ModalWidth.Md,
7647 BodyTemplate = RenderModalContent()
7648 };
7649
7650 lastAddedProduct.AddActions(
7651 new Button
7652 {
7653 ButtonType = ButtonType.Button,
7654 ButtonLayout = ButtonLayout.Secondary,
7655 Title = Translate("Continue shopping"),
7656 CssClass = "u-pull--left u-no-margin btn--sm",
7657 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false"
7658 },
7659 new Link
7660 {
7661 Href = "/Default.aspx?ID=" + cartPageId,
7662 ButtonLayout = ButtonLayout.Secondary,
7663 CssClass = "u-pull--right u-no-margin btn--sm",
7664 Title = Translate("Proceed to checkout")
7665 }
7666 );
7667
7668 @Render(lastAddedProduct)
7669 }
7670 </script>
7671
7672 }
7673
7674 @helper RenderModalContent()
7675 {
7676 <div class="grid">
7677 <div class="grid__col-2">
7678 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true })
7679 </div>
7680 <div class="u-padding grid--align-self-center">
7681 <span>{{quantity}}</span> x
7682 </div>
7683 <div class="grid__col-auto grid--align-self-center">
7684 <div>{{productInfo.name}}</div>
7685 {{#if productInfo.variantName}}
7686 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
7687 {{/if}}
7688 {{#if productInfo.unitName}}
7689 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
7690 {{/if}}
7691 </div>
7692 </div>
7693 }
7694
7695 @helper RenderAddToCartNotificationToggleScript()
7696 {
7697 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
7698
7699 <script>
7700 document.addEventListener('addToCart', function () {
7701 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
7702 });
7703 </script>
7704 }
7705 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7706
7707 @using System
7708 @using System.Web
7709 @using System.Collections.Generic
7710 @using Dynamicweb.Rapido.Blocks.Extensibility
7711 @using Dynamicweb.Rapido.Blocks
7712 @using Dynamicweb.Rapido.Blocks.Components.General
7713 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Math
7714
7715 @functions {
7716 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
7717 }
7718
7719 @{
7720 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content");
7721 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content");
7722 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content");
7723 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header");
7724 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header");
7725 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header");
7726
7727 Block masterFooterContent = new Block()
7728 {
7729 Id = "MasterFooterContent",
7730 SortId = 10,
7731 Template = RenderFooter(),
7732 SkipRenderBlocksList = true
7733 };
7734 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
7735
7736 /*if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
7737 {
7738 Block masterFooterColumnOne = new Block
7739 {
7740 Id = "MasterFooterColumnOne",
7741 SortId = 10,
7742 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
7743 Design = new Design
7744 {
7745 Size = "auto",
7746 RenderType = RenderType.Column
7747 }
7748 };
7749 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
7750 }
7751
7752 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
7753 {
7754 Block masterFooterColumnTwo = new Block
7755 {
7756 Id = "MasterFooterColumnTwo",
7757 SortId = 20,
7758 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent),
7759 Design = new Design
7760 {
7761 Size = "auto",
7762 RenderType = RenderType.Column
7763 }
7764 };
7765 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
7766 }
7767
7768 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
7769 {
7770 Block masterFooterColumnThree = new Block
7771 {
7772 Id = "MasterFooterColumnThree",
7773 SortId = 30,
7774 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent),
7775 Design = new Design
7776 {
7777 Size = "auto",
7778 RenderType = RenderType.Column
7779 }
7780 };
7781 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
7782 }*/
7783
7784 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
7785 {
7786 Block masterFooterNewsletterSignUp = new Block
7787 {
7788 Id = "MasterFooterNewsletterSignUp",
7789 SortId = 40,
7790 Template = RenderFooterNewsletterSignUp(),
7791 Design = new Design
7792 {
7793 Size = "auto",
7794 RenderType = RenderType.Column
7795 }
7796 };
7797 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp);
7798 }
7799
7800 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0)
7801 {
7802 Block masterFooterSocialLinks = new Block
7803 {
7804 Id = "MasterFooterSocialLinks",
7805 SortId = 50,
7806 Template = RenderFooterSocialLinks(),
7807 Design = new Design
7808 {
7809 Size = "auto",
7810 RenderType = RenderType.Column
7811 }
7812 };
7813 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
7814 }
7815
7816 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
7817 {
7818 Block masterFooterPayments = new Block
7819 {
7820 Id = "MasterFooterPayments",
7821 SortId = 60,
7822 Template = RenderFooterPayments(),
7823 Design = new Design
7824 {
7825 Size = "12",
7826 RenderType = RenderType.Column
7827 }
7828 };
7829 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
7830 }
7831
7832 Block masterFooterCopyright = new Block
7833 {
7834 Id = "MasterFooterCopyright",
7835 SortId = 70,
7836 Template = RenderFooterCopyright(),
7837 Design = new Design
7838 {
7839 CssClass = "u-full-width"
7840 }
7841 };
7842 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
7843 }
7844
7845 @helper RenderFooter()
7846 {
7847 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
7848 var imageSource = "/Files/Images/FooterWave.svg";
7849 List<int> pages = new List<int>();
7850 pages.Add(6953);
7851 var test = 0;
7852 var newCartPageId = GetPageIdByNavigationTag("CartPageV2");
7853 bool isNewCartPage = Pageview.Page.ID == newCartPageId;
7854 string centerBackgroundClass = isNewCartPage ? "background-color: #F9F7F6 !important" : "";
7855
7856 if (Model.Item != null)
7857 {
7858 test = Int32.Parse(Model?.Item?.PageID.ToString());
7859 }
7860 var footerBackgroundColor = "";
7861 if (test != 0)
7862 {
7863 footerBackgroundColor = pages.Contains(Model.Item.PageID) ? "bg-beige" : "";
7864
7865 <footer class="footer dw-mod @footerBackgroundColor" id="@Model.Item.PageID" style="position: relative;">
7866 <div class="backdrop">
7867 @{
7868 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg");
7869 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg");
7870 }
7871 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/>
7872 </div>
7873 <div class="footer__content">
7874 <div class="content-container">
7875 <div class="content-row">
7876 @RenderBlockList(subBlocks)
7877 </div>
7878 </div>
7879 </div>
7880 </footer>
7881 }else
7882 {
7883 <footer class="footer dw-mod " style="position: relative; @centerBackgroundClass">
7884 <div class="backdrop">
7885 @{
7886 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg");
7887 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg");
7888 }
7889 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/>
7890 </div>
7891 <div class="footer__content">
7892 <div class="content-container">
7893 <div class="content-row">
7894 @RenderBlockList(subBlocks)
7895 </div>
7896 </div>
7897 </div>
7898 </footer>
7899 }
7900 }
7901
7902 @helper RenderFooterColumn(string header, string content)
7903 {
7904 <h3 class="footer__heading dw-mod">@header</h3>
7905 <div class="footer__content dw-mod">
7906 @content
7907 </div>
7908 }
7909
7910 @helper RenderFooterNewsletterSignUp()
7911 {
7912 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString();
7913 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart };
7914
7915 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId });
7916 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" });
7917 form.Add(new TextField
7918 {
7919 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"),
7920 Type = TextFieldType.Email,
7921 ActionButton = new Button
7922 {
7923 ButtonType = ButtonType.Submit, Id = "Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed"
7924 }
7925 });
7926
7927 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
7928 <div class="footer__content dw-mod">
7929 @Render(form)
7930 </div>
7931 }
7932
7933 @helper RenderFooterSocialLinks()
7934 {
7935 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3>
7936 <div class="footer__content dw-mod">
7937 <div class="collection dw-mod">
7938 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
7939 {
7940 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
7941 string socialIconClass = socialIcon.SelectedValue;
7942 string socialIconTitle = socialIcon.SelectedName;
7943 string socialLink = socialitem.GetString("Link");
7944
7945 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener">
7946 <i class="@socialIconClass fa-2x"></i>
7947 </a>
7948 }
7949 </div>
7950 </div>
7951 }
7952
7953 @helper RenderFooterPayments()
7954 {
7955 <div class="footer__content dw-mod">
7956 <div class="collection dw-mod">
7957 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments"))
7958 {
7959 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel;
7960 string paymentImage = null;
7961 string paymentTitle = paymentItem.SelectedName;
7962 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault();
7963 if (selected != null)
7964 {
7965 paymentImage = selected.Icon;
7966 }
7967
7968 <div class="footer__card-type">
7969 <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"/>
7970 </div>
7971 }
7972 </div>
7973 </div>
7974 }
7975
7976 @helper RenderFooterCopyright()
7977 {
7978 <div class="footer__copyright u-position-relative">
7979 <div class="footer__copyright-logo">
7980 <img loadin="lazy" src="/Files/Images/dnv-good-fit.png" width="129" height="122" alt="footer-icon"/>
7981 </div>
7982 <p class="footer__copyright-text">© @DateTime.Now.Year @Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p>
7983
7984
7985 </div>
7986 }
7987 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
7988
7989 @using System
7990 @using System.Web
7991 @using System.Collections.Generic
7992 @using Dynamicweb.Rapido.Blocks.Extensibility
7993 @using Dynamicweb.Rapido.Blocks
7994 @using Dynamicweb.Ecommerce.Common
7995 @using WebApp.Singleton
7996
7997 @{
7998 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
7999
8000 Block masterScriptReferences = new Block()
8001 {
8002 Id = "MasterScriptReferences",
8003 SortId = 1,
8004 Template = RenderMasterScriptReferences()
8005 };
8006 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
8007 }
8008
8009 @helper RenderMasterScriptReferences()
8010 {
8011 var customJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/js/custom.js"));
8012 var appJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/app.bundle.js"));
8013 var foodCalendarJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js"));
8014 var shoppingListJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js"));
8015 var customGeneralJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js"));
8016 var foodCalendarExtensionJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendarExtension.bundle.js"));
8017
8018 var buildNumber = WebAppConfiguration.BuildNumber;
8019 string customJsSrc = $"/Files/Templates/Designs/Rapido/js/custom.js?buildNumber={buildNumber}";
8020 string appJsSrc = $"/Files/Templates/Designs/Rapido/dist/app.bundle.js?buildNumber={buildNumber}";
8021 string foodCalendarJsSrc = $"/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js?buildNumber={buildNumber}";
8022 string shoppingListJsSrc = $"/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js?buildNumber={buildNumber}";
8023 string customGeneralJsSrc = $"/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js?buildNumber={buildNumber}";
8024 var masterGeneralJsSrc = $"/Files/Templates/Designs/Rapido/js/master.js?buildNumber={buildNumber}";
8025 var handlebarJsSrc = "/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js";
8026
8027 <script src="@handlebarJsSrc" defer></script>
8028 <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js" defer></script>
8029 <script src="https://unpkg.com/@("@reduxjs")/toolkit@1.9.7/dist/redux-toolkit.umd.js" defer></script>
8030 <script src="@masterGeneralJsSrc" defer></script>
8031
8032 //vue referrences
8033 <script src="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.js?x=@buildNumber" defer type="module"></script>
8034 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.css?x=@buildNumber">
8035 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?x=@buildNumber">
8036
8037 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
8038 {
8039 <script src="/Files/Templates/Designs/Rapido/js/axios.js" defer></script>
8040
8041 <script src="@customJsSrc" defer></script>
8042 <script src="@appJsSrc" type="module"></script>
8043 <script src="@foodCalendarJsSrc" type="module"></script>
8044 <script src="@shoppingListJsSrc" type="module"></script>
8045 <script src="@customGeneralJsSrc" type="module"></script>
8046 }
8047 }
8048
8049 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
8050
8051 @using System
8052 @using System.Web
8053 @using System.Collections.Generic
8054 @using Dynamicweb.Rapido.Blocks.Extensibility
8055 @using Dynamicweb.Rapido.Blocks
8056 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8057 @using Dynamicweb.Rapido.Services
8058 @using Dynamicweb.Ecommerce.ProductCatalog
8059
8060 @{
8061 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
8062 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
8063 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID"));
8064
8065 if (!navigationItemsHideSearch || isFavoriteList)
8066 {
8067 Block masterSearchScriptTemplates = new Block()
8068 {
8069 Id = "MasterSearchScriptTemplates",
8070 SortId = 1,
8071 Template = RenderSearchScriptTemplates()
8072 };
8073
8074 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
8075 }
8076 }
8077
8078 @helper RenderSearchScriptTemplates()
8079 {
8080 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
8081 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
8082 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
8083 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
8084 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults");
8085 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton");
8086 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton");
8087 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton");
8088 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
8089 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star";
8090 string favoriteIcon = "fas fa-" + selectedFavoriteIcon;
8091 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon;
8092
8093 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID");
8094 string classMaxWidth = Pageview.Device.ToString() != "Mobile" ? "u-max-w260px" : "";
8095 string searchParameter = HttpContext.Current.Request.QueryString.Get("Search");
8096 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
8097 var showCartons = currentUser?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString();
8098
8099
8100 <script id="SearchGroupsTemplate" type="text/x-template">
8101 {{#.}}
8102 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
8103 {{/.}}
8104 </script>
8105
8106 <script id="SearchProductsTemplate" type="text/x-template">
8107 <div style="padding-top:15px; padding-left: 15px; padding-right: 15px;" class="dropdown__item--seperator bs-mb-4 bs-border-secondary dw-mod ">{{label}}
8108
8109 {{#each .}}
8110 {{#each FacetGroups}}
8111 <h4 class="bs-mb-3 u-color-inherit">@Translate("Kategorier")</h4>
8112 <div class="display-grid--two-columns bs-pb-4 ">
8113 {{#FacetOptions}}
8114 {{#ifCond queryParameter "===" "Category"}}
8115 <span class="u-color-inherit"
8116 style="font-weight: 600; cursor: pointer;"
8117 onclick="searchInCategoryButton(@productsPageId, {{ name }})">
8118 {{label}} ({{count}})
8119 </span>
8120 {{/ifCond}}
8121 {{/FacetOptions}}
8122 </div>
8123 {{/each}}
8124 {{/each}}
8125
8126 </div>
8127 {{#each .}}
8128 {{#each ProductsContainer}}
8129 {{#Product}}
8130 {{#ifCond template "!==" "SearchMore"}}
8131 {{#ifCond isDiscontinuedClass "!==" "disabled"}}
8132 <li class="dropdown__item test dropdown__item--seperator dw-mod">
8133 @if (useFacebookPixel)
8134 {
8135 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
8136 }
8137 @if (useGoogleTagManager)
8138 {
8139 <text>{{{googleEnchantImpression googleImpression}}}</text>
8140 }
8141 <div class="search__product-wrapper grid--align-center">
8142 <div class="search__product-wrapper-infos">
8143 <a href="{{link}}"
8144 class="js-typeahead-link quick-view u-color-inherit u-pull--left bs-d-flex" data-load-page="{{link}}"
8145 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}"
8146 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}">
8147 <div class="u-margin-right {{noimage}}" style="width: 50px"><img src="/Files/Images/Kraemer/RapidoProducts/{{number}}.jpg" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}" class="search-img" onerror="this.src='/Files/Images/Kraemer/RapidoProducts/missing-image.jpg';"></div>
8148 <div class="u-pull--left">
8149 <div class="u-bold u-truncate-text js-typeahead-name u-flex grid--align-center">
8150 <span class="u-padding-right">{{productId}}</span>
8151 <span class="u-flex grid--align-center u-padding-right">
8152 <i class="fas fa-circle cart-circle"></i>
8153 </span>
8154 <span class="search__product-name u-truncate-text u-inline-block bs-d-flex bs-align-items-center bs-gap-1" style="max-width: 200px">
8155 {{name}}{{#if variantName}}, {{variantName}}{{/if}}
8156 {{#ifCond ProductCountryManufacturerCode '===' "NO"}}
8157 <div class="product-country">
8158 <img height="18px" src='@("/Admin/Images/Flags/flag_" + "no" +".png")' title="@Translate("Norway")" alt='@Translate("Norway flag")'>
8159 </div>
8160 {{/ifCond}}
8161 </span>
8162 </div>
8163 <div class="u-flex grid--align-center u-truncate-text product-search-description">
8164 {{#if transit}}
8165 <span class="cart-table__product-name-infos-transit">
8166 <div class="transit-container u-margin-right" title="@Translate("Transittvare")">
8167 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
8168 <circle cx="10" cy="10" r="10" fill="#0052A0" />
8169 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white" />
8170 </svg>
8171 <div class="tooltip">@Translate("Transittvare")</div>
8172 </div>
8173 </span>
8174 {{/if}}
8175 {{#if showBreakableIcon}}
8176 <span class="cart-table__product-name-infos-showbreakableicon">
8177 <div class="transit-container u-margin-right" title="@Translate("Anbrekksvare")">
8178 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
8179 <circle cx="10" cy="10" r="10" fill="#0052A0" />
8180 <path d="M11.7979 12.9492H8.20215L7.51855 15H5.33789L9.04297 5.04688H10.9434L14.6689 15H12.4883L11.7979 12.9492ZM8.75586 11.2881H11.2441L9.99316 7.5625L8.75586 11.2881Z" fill="white" />
8181 </svg>
8182 <div class="tooltip">@Translate("Anbrekksvare")</div>
8183 </div>
8184 </span>
8185 {{/if}}
8186 <span class="js-typeahead-name u-padding-right u-flex grid--align-center search__manufacture-name"> {{ManufacturerName}}</span>
8187 <span class="u-flex grid--align-center u-padding-right"><i class="fas fa-circle cart-circle"></i></span>
8188 <span class="package-contents search__product-package u-truncate-text">{{truncateFirst20 ProductPackageContents}}</span>
8189
8190
8191 {{#ifCond StorageAvailableInSessionLocation '!==' true}}
8192 {{#ifCond warehouseDescription '!==' ""}}
8193 {{#ifCond warehouseDescription '!==' null}}
8194
8195 @if (Pageview.User != null)
8196 {
8197 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #f1ff80" title="@Translate("Central warehouse - longer lead time")">{{warehouseDescription}}</div>
8198 }
8199
8200 {{/ifCond}}
8201 {{/ifCond}}
8202
8203
8204 {{#ifCond stockDescriptiontext '!==' ""}}
8205 {{#ifCond stockDescriptiontext '!==' null}}
8206 {{#ifCond stockDescriptiontext '!==' "Lagerført"}}
8207
8208 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Limited")"}}
8209
8210 @if (Pageview.User != null)
8211 {
8212 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Limited")">{{stockDescriptiontext}}</div>
8213 }
8214
8215 {{/ifCond}}
8216
8217 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Unavailable")"}}
8218
8219 @if (Pageview.User != null)
8220 {
8221 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Unavailable")">{{stockDescriptiontext}}</div>
8222 }
8223
8224 {{/ifCond}}
8225
8226 {{/ifCond}}
8227 {{/ifCond}}
8228 {{/ifCond}}
8229 {{/ifCond}}
8230 </div>
8231 @* @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed())
8232 {
8233 if (pointShopOnly)
8234 {
8235 <text>
8236 {{#if havePointPrice}}
8237 <div>
8238 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
8239 </div>
8240 {{else}}
8241 <small class="help-text u-no-margin">@Translate("Not available")</small>
8242 {{/if}}
8243 {{#unless canBePurchasedWithPoints}}
8244 {{#if havePointPrice}}
8245 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
8246 {{/if}}
8247 {{/unless}}
8248 </text>
8249 }
8250 else
8251 {
8252 <div>{{price}}</div>
8253 }
8254 }*@
8255 </div>
8256 </a>
8257 </div>
8258 <div class="u-flex search__product-wrapper-price">
8259 <div class="u-margin-left">
8260 @{
8261 var viewBtn = new Link
8262 {
8263 Href = "{{link}}",
8264 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}",
8265 ButtonLayout = ButtonLayout.Secondary,
8266 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside u-hidden",
8267 Title = Translate("View")
8268 };
8269 }
8270
8271 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
8272 {
8273 <text>{{#if hideAddToCartButton}}</text>
8274 @Render(viewBtn)
8275 <text>{{else}}</text>
8276 <div class="u-flex grid--align-center grid--wrap">
8277 <div class="price price--product-list price--micro u-margin-right dw-mod">{{price}} / {{ProductBaseUnit}}
8278 @*<span class="purchase-unit-details dw-mod u-color-dark u-margin-left--lg">{{ProductQuantityPerPurchaseUnit}} x</span>*@
8279 </div>
8280 <div class="add-quantity-container u-flex u-flex--align">
8281
8282 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
8283 { <div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" >
8284 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')">-</button>
8285 @Render(new NumberField
8286 {
8287 Id = "SearchQuantity{{productId}}",
8288 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}",
8289 Value = "",
8290 ExtraAttributes = new Dictionary<string, string>
8291 {
8292 {"data-breakable", "{{Breakable}}"},
8293 {"data-prev-value", "0"},
8294 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"},
8295 {"data-product-id", "{{productId}}"},
8296 {"tabindex", "0"},
8297 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8298 { "step", "{{ProductQuantityPerPurchaseUnit}}"},
8299 { "data-type", "Search" },
8300 { "data-name", "{{name}}"},
8301 }
8302 })
8303 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); input.dispatchEvent(new Event('change')); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')">+</button>
8304 </div>
8305 @Render(new Button {
8306 OnClick = "enableField(this)",
8307 Id = "SearchQuantityBtn{{productId}}",
8308 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After },
8309 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class",
8310 ButtonType = ButtonType.Button,
8311 ButtonLayout = ButtonLayout.Primary,
8312 ExtraAttributes = new Dictionary<string, string>
8313 {
8314 { "data-type", "Search"},
8315 { "data-breakable", "{{Breakable}}"},
8316 { "data-product-info", "{{productInfo}}" },
8317 { "data-unit-id", "{{unitId}}" },
8318 { "data-variant-id", "{{variantid}}" },
8319 { "data-product-id", "{{productId}}" },
8320 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" },
8321 { "data-unit-price","{{priceDouble}}" },
8322 { "data-link","{{link}}" },
8323 { "data-unit-base","{{ProductBaseUnit}}"},
8324 { "{{disableButton}}", ""}
8325 }
8326
8327 })
8328
8329 if (showCartons == "True")
8330 {
8331 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div>
8332 }
8333 }
8334 else
8335 {<div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" >
8336 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')" style="min-width: unset!important;">-</button>
8337 @Render(new NumberField {
8338 Id = "SearchQuantity{{productId}}",
8339 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}",
8340 Value = "",
8341 ExtraAttributes = new Dictionary<string, string>
8342 {
8343 {"data-breakable", "{{Breakable}}"},
8344 {"data-prev-value", "0"},
8345 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"},
8346 {"data-product-id", "{{productId}}"},
8347 {"tabindex", "0"},
8348 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8349 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8350 {"data-type", "Search"},
8351 { "data-name", "{{name}}"},
8352 {"style","width: 40px !important;height:2ch!important;"}
8353 }
8354 })
8355 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')" style="min-width: unset!important;">+</button>
8356 </div>
8357 @Render(new Button {
8358 OnClick = "enableField(this)",
8359 Id = "SearchQuantityBtn{{productId}}",
8360 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After },
8361 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class",
8362 ButtonType = ButtonType.Button,
8363 ButtonLayout = ButtonLayout.Primary,
8364 ExtraAttributes = new Dictionary<string, string>
8365 {
8366 { "data-type", "Search"},
8367 { "data-breakable", "{{Breakable}}"},
8368 { "data-product-info", "{{productInfo}}" },
8369 { "data-unit-id", "{{unitId}}" },
8370 { "data-variant-id", "{{variantid}}" },
8371 { "data-product-id", "{{productId}}" },
8372 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" },
8373 { "data-unit-price","{{priceDouble}}" },
8374 { "data-link","{{link}}" },
8375 { "data-unit-base","{{ProductBaseUnit}}"},
8376 { "{{disableButton}}", ""}
8377 }
8378
8379 })
8380 if (showCartons == "True")
8381 {
8382 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div>
8383 }
8384
8385 }
8386
8387 <div class="loader-container u-hidden">
8388 <i class="fas fa-circle-notch fa-spin preloader"></i>
8389 </div>
8390
8391 </div>
8392 </div>
8393
8394 <text>{{/if}}</text>
8395 }
8396 else if (showViewButton)
8397 {
8398 @Render(viewBtn)
8399 }
8400 @if (showAddToDownloadButton)
8401 {
8402 <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}}">
8403 <i class="fas fa-plus js-button-icon"></i>
8404 </button>
8405 }
8406 </div>
8407
8408 @if (currentUser != null)
8409 {
8410 <div class="favorites product-list__details-favorites">
8411 <div class="favorites product-list__details-favorites bs-d-flex bs-align-items-center bs-justify-content-center" style="position: relative;">
8412 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{number}}" data-quantity="{{ProductQuantityPerPurchaseUnit}}" title="@Translate("HOVER_FavouriteList")">
8413 <img class="popup-toggle" data-product-number="{{number}}" height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/>
8414 </a>
8415 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;top: 100%;z-index: 99999999999999; height: 200px;">
8416 </div>
8417 </div>
8418 </div>
8419 }
8420
8421 </div>
8422 </div>
8423 </li>
8424 {{/ifCond}}
8425 {{/ifCond}}
8426
8427 @*{{#ifCond template "===" "SearchMore"}}
8428 {{>SearchMoreProducts}}
8429 {{/ifCond}}*@
8430 {{/Product}}
8431 {{else}}
8432 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
8433 @Translate("Your search gave 0 results")
8434 </li>
8435 {{/each}}
8436 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod js-typeahead">
8437 <button type="button" @* href="/Default.aspx?ID=@productsPageId&Search=@searchParameter&GroupID={{groupId}}"*@ class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-viewAll" onclick="searchAllButton()">
8438 @Translate("View all")
8439 </button>
8440 </li>
8441 {{/each}}
8442 </script>
8443
8444 <script id="SearchMoreProducts" type="text/x-template">
8445 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
8446 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
8447 @Translate("View all")
8448 </a>
8449 </li>
8450 </script>
8451
8452 <script id="SearchMorePages" type="text/x-template">
8453 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
8454 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
8455 @Translate("View all")
8456 </a>
8457 </li>
8458 </script>
8459
8460 <script id="SearchPagesTemplate" type="text/x-template">
8461 {{#each .}}
8462 {{#ifCond template "!==" "SearchMore"}}
8463 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod">
8464 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit">
8465 <div class="u-margin-right"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
8466 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
8467 </a>
8468 </li>
8469 {{/ifCond}}
8470 {{#ifCond template "===" "SearchMore"}}
8471 {{>SearchMorePages}}
8472 {{/ifCond}}
8473 {{else}}
8474 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
8475 @Translate("Your search gave 0 results")
8476 </li>
8477 {{/each}}
8478 </script>
8479
8480 <script id="SearchPagesTemplateWrap" type="text/x-template">
8481 <div class="dropdown__column-header">@Translate("Pages")</div>
8482 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
8483 {{>SearchPagesTemplate}}
8484 </ul>
8485 </script>
8486
8487 <script id="SearchProductsTemplateWrap" type="text/x-template">
8488 <div class="dropdown__column-header">@Translate("Products")</div>
8489 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
8490 {{>SearchProductsTemplate}}
8491 </ul>
8492 </script>
8493
8494
8495 <script>
8496 @if (!string.IsNullOrEmpty(currentFavoriteListId))
8497 {
8498 <text>
8499 window.currentFavoriteListId = "@currentFavoriteListId";
8500 </text>
8501 }
8502 function toggleFavAction(button, event) {
8503 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) {
8504 Scroll.SavePosition(event);
8505 @if (useFacebookPixel)
8506 {
8507 <text>
8508 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object')));
8509 </text>
8510 }
8511 location.href = button.getAttribute('data-add-link');
8512 return;
8513 }
8514 let isAdd = button.getAttribute('data-is-in-list') == "false";
8515 Request.Fetch().get(
8516 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'),
8517 function (result) {
8518 console.log({button})
8519 button.querySelector('img').src = isAdd ? "/Files/Images/trash-icon-outline.svg" : "/Files/Images/favorite-list-svg.svg";
8520 button.setAttribute('data-is-in-list', isAdd);
8521 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name'))
8522 let favList = button.closest('.js-favorites-list');
8523 let favBtn = favList.querySelector('.js-favorite-btn img');
8524 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null;
8525 if (isInAnyFavoriteList) {
8526 favBtn.src = "/Files/Images/favorite-list-Filled.svg";
8527 } else {
8528 favBtn.src = "/Files/Images/favorite-list-svg.svg";
8529 }
8530 document.getElementById(favList.getAttribute('data-close-overlay')).checked = false;
8531 @if (useFacebookPixel)
8532 {
8533 <text>
8534 if (isAdd) {
8535 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object')));
8536 }
8537 </text>
8538 }
8539 if (window.currentFavoriteListId != null) { //if this page is favorite list
8540 let listId = button.getAttribute("data-list-id");
8541 if (listId == window.currentFavoriteListId && !isAdd) {
8542 location.reload();
8543 }
8544 }
8545 },
8546 function () {
8547 console.error("FavoriteLists: Error in ToggleFavAction request");
8548 },
8549 false
8550 );
8551 }
8552 </script>
8553 }
8554
8555 @using Dynamicweb.Rapido.Blocks.Components
8556 @using Dynamicweb.Rapido.Blocks.Components.General
8557 @using Dynamicweb.Rapido.Blocks
8558 @using System.IO
8559
8560
8561 @using Dynamicweb.Rapido.Blocks.Components.General
8562 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8563
8564
8565 @* Component *@
8566
8567 @helper RenderVariantMatrix(VariantMatrix settings) {
8568 if (settings != null)
8569 {
8570 int productLoopCounter = 0;
8571 int groupCount = 0;
8572 List<VariantOption> firstDimension = new List<VariantOption>();
8573 List<VariantOption> secondDimension = new List<VariantOption>();
8574 List<VariantOption> thirdDimension = new List<VariantOption>();
8575
8576 foreach (VariantGroup variantGroup in settings.GetVariantGroups())
8577 {
8578 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions())
8579 {
8580 if (groupCount == 0) {
8581 firstDimension.Add(variantOptions);
8582 }
8583 if (groupCount == 1)
8584 {
8585 secondDimension.Add(variantOptions);
8586 }
8587 if (groupCount == 2)
8588 {
8589 thirdDimension.Add(variantOptions);
8590 }
8591 }
8592 groupCount++;
8593 }
8594
8595 int rowCount = 0;
8596 int columnCount = 0;
8597
8598 <script>
8599 var variantsCollection = [];
8600 </script>
8601
8602 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId">
8603 @if (groupCount == 1)
8604 {
8605 <tbody>
8606 @foreach (VariantOption firstVariantOption in firstDimension)
8607 {
8608 var variantId = firstVariantOption.Id;
8609 <tr>
8610 <td class="u-bold">
8611 @firstVariantOption.Name
8612 </td>
8613 <td>
8614 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8615 </td>
8616 </tr>
8617 productLoopCounter++;
8618 }
8619
8620 <tr>
8621 <td> </td>
8622 <td>
8623 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8624 </td>
8625 </tr>
8626 </tbody>
8627 }
8628 @if (groupCount == 2)
8629 {
8630 <thead>
8631 <tr>
8632 <td> </td>
8633 @foreach (VariantOption variant in secondDimension)
8634 {
8635 <td>@variant.Name</td>
8636 }
8637 </tr>
8638 </thead>
8639 <tbody>
8640 @foreach (VariantOption firstVariantOption in firstDimension)
8641 {
8642 string variantId = "";
8643 columnCount = 0;
8644
8645 <tr>
8646 <td class="u-min-w120px">@firstVariantOption.Name</td>
8647
8648 @foreach (VariantOption secondVariantOption in secondDimension)
8649 {
8650 variantId = firstVariantOption.Id + "." + secondVariantOption.Id;
8651 <td>
8652 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8653 </td>
8654
8655 columnCount++;
8656
8657 productLoopCounter++;
8658 }
8659
8660 <td>
8661 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
8662 </td>
8663 </tr>
8664
8665 rowCount++;
8666 }
8667
8668 @{
8669 columnCount = 0;
8670 }
8671
8672 <tr>
8673 <td> </td>
8674 @foreach (VariantOption secondVariantOption in secondDimension)
8675 {
8676 <td>
8677 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8678 </td>
8679
8680 columnCount++;
8681 }
8682 <td> </td>
8683 </tr>
8684 </tbody>
8685 }
8686 @if (groupCount == 3)
8687 {
8688 <thead>
8689 <tr>
8690 <td> </td>
8691 @foreach (VariantOption thirdVariantOption in thirdDimension)
8692 {
8693 <td>@thirdVariantOption.Name</td>
8694 }
8695 </tr>
8696 </thead>
8697 <tbody>
8698 @foreach (VariantOption firstVariantOption in firstDimension)
8699 {
8700 int colspan = (thirdDimension.Count + 1);
8701
8702 <tr>
8703 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td>
8704 </tr>
8705
8706 foreach (VariantOption secondVariantOption in secondDimension)
8707 {
8708 string variantId = "";
8709 columnCount = 0;
8710
8711 <tr>
8712 <td class="u-min-w120px">@secondVariantOption.Name</td>
8713
8714 @foreach (VariantOption thirdVariantOption in thirdDimension)
8715 {
8716 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id;
8717
8718 <td>
8719 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8720 </td>
8721
8722 columnCount++;
8723 productLoopCounter++;
8724 }
8725
8726 <td>
8727 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
8728 </td>
8729 </tr>
8730 rowCount++;
8731 }
8732 }
8733
8734 @{
8735 columnCount = 0;
8736 }
8737
8738 <tr>
8739 <td> </td>
8740 @foreach (VariantOption thirdVariantOption in thirdDimension)
8741 {
8742 <td>
8743 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8744 </td>
8745
8746 columnCount++;
8747 }
8748 <td> </td>
8749 </tr>
8750 </tbody>
8751 }
8752 </table>
8753
8754 <script>
8755 document.addEventListener("DOMContentLoaded", function (event) {
8756 MatrixUpdateQuantity("@settings.ProductId");
8757 });
8758
8759 MatrixUpdateQuantity = function (productId) {
8760 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId);
8761 var allQtyFields = currentMatrix.getElementsByClassName("js-qty");
8762
8763 var qtyRowArr = [];
8764 var qtyColumnArr = [];
8765
8766 var totalQty = 0;
8767
8768 for (var i = 0; i < allQtyFields.length; i++) {
8769 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0;
8770 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0;
8771 }
8772
8773 for (var i = 0; i < allQtyFields.length; i++) {
8774 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value);
8775 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value);
8776 totalQty += parseFloat(allQtyFields[i].value);
8777 }
8778
8779 //Update row counters
8780 for (var i = 0; i < qtyRowArr.length; i++) {
8781 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
8782
8783 if (qtyRowArr[i] != undefined && qtyCounter != null) {
8784 var currentCount = qtyCounter.innerHTML;
8785 qtyCounter.innerHTML = qtyRowArr[i];
8786
8787 if (currentCount != qtyCounter.innerHTML) {
8788 qtyCounter.classList.add("qty-field--active");
8789 }
8790 }
8791
8792 }
8793
8794 //Update column counters
8795 for (var i = 0; i < qtyColumnArr.length; i++) {
8796 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
8797
8798 if (qtyColumnArr[i] != undefined && qtyCounter != null) {
8799 var currentCount = qtyCounter.innerHTML;
8800 qtyCounter.innerHTML = qtyColumnArr[i];
8801
8802 if (currentCount != qtyCounter.innerHTML) {
8803 qtyCounter.classList.add("qty-field--active");
8804 }
8805 }
8806 }
8807
8808 if (document.getElementById("TotalQtyCount_" + productId)) {
8809 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty;
8810 }
8811
8812 //Clean up animations
8813 setTimeout(function () {
8814 for (var i = 0; i < qtyRowArr.length; i++) {
8815 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
8816 if (qtyCounter != null) {
8817 qtyCounter.classList.remove("qty-field--active");
8818 }
8819 }
8820 for (var i = 0; i < qtyColumnArr.length; i++) {
8821 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
8822 if (qtyCounter != null) {
8823 qtyCounter.classList.remove("qty-field--active");
8824 }
8825 }
8826 }, 1000);
8827 }
8828 </script>
8829 }
8830 }
8831
8832 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount)
8833 {
8834 string loopCount = productLoopCounter.ToString();
8835
8836 bool combinationFound = false;
8837 double stock = 0;
8838 double quantityValue = 0;
8839 string note = "";
8840
8841 VariantProduct variantProduct = null;
8842
8843 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct))
8844 {
8845 stock = variantProduct.Stock;
8846 quantityValue = variantProduct.Quantity;
8847 combinationFound = true;
8848 }
8849
8850 if (combinationFound)
8851 {
8852 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" />
8853 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" />
8854 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" />
8855 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" />
8856 <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">
8857
8858 if (stock != 0)
8859 {
8860 <small>@Translate("Stock") @stock</small>
8861 }
8862
8863 <script>
8864 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}';
8865 variantsCollection.push(variants);
8866 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" );
8867 </script>
8868 }
8869 else
8870 {
8871 <div class="use-btn-height" style="background-color: #a8a8a8"></div>
8872 }
8873 }
8874 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8875
8876 @* Component *@
8877
8878 @helper RenderAddToCart(AddToCart settings)
8879 {
8880 //set Id for quantity selector to get it's value from button
8881 if (settings.QuantitySelector != null)
8882 {
8883 if (string.IsNullOrEmpty(settings.QuantitySelector.Id))
8884 {
8885 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N");
8886 }
8887
8888 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id;
8889
8890 if (settings.Disabled)
8891 {
8892 settings.QuantitySelector.Disabled = true;
8893 }
8894
8895 if (string.IsNullOrEmpty(settings.QuantitySelector.Name))
8896 {
8897 settings.QuantitySelector.Name = settings.QuantitySelector.Id;
8898 }
8899 }
8900
8901 if (settings.Disabled)
8902 {
8903 settings.AddButton.Disabled = true;
8904 }
8905
8906 settings.AddButton.CssClass += " btn--condensed";
8907
8908 //unitsSelector
8909 if (settings.UnitSelector != null)
8910 {
8911 if (settings.Disabled)
8912 {
8913 settings.QuantitySelector.Disabled = true;
8914 }
8915 }
8916
8917 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
8918 @if (settings.UnitSelector != null)
8919 {
8920 @Render(settings.UnitSelector)
8921 }
8922 @if (settings.QuantitySelector != null)
8923 {
8924 @Render(settings.QuantitySelector)
8925 }
8926 @Render(settings.AddButton)
8927 </div>
8928 }
8929 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8930
8931 @* Component *@
8932
8933 @helper RenderAddToCartButton(AddToCartButton settings)
8934 {
8935 if (!settings.HideTitle)
8936 {
8937 if (string.IsNullOrEmpty(settings.Title))
8938 {
8939 if (settings.BuyForPoints)
8940 {
8941 settings.Title = Translate("Buy with points");
8942 }
8943 else
8944 {
8945 settings.Title = Translate("Add to cart");
8946 }
8947 }
8948 }
8949 else
8950 {
8951 settings.Title = "";
8952 }
8953
8954 if (settings.Icon == null)
8955 {
8956 settings.Icon = new Icon();
8957 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After;
8958 }
8959
8960 if (string.IsNullOrEmpty(settings.Icon.Name))
8961 {
8962 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue;
8963 }
8964
8965 settings.OnClick = "Cart.AddToCart(event, { " +
8966 "id: '" + settings.ProductId + "'," +
8967 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") +
8968 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") +
8969 (settings.BuyForPoints ? "buyForPoints: true," : "") +
8970 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") +
8971 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") +
8972 "});" + settings.OnClick;
8973
8974 @RenderButton(settings)
8975 }
8976 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8977
8978 @* Component *@
8979
8980 @helper RenderUnitSelector(UnitSelector settings)
8981 {
8982 if (string.IsNullOrEmpty(settings.Id))
8983 {
8984 settings.Id = Guid.NewGuid().ToString("N");
8985 }
8986 var disabledClass = settings.Disabled ? "disabled" : "";
8987
8988 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" />
8989 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
8990 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label>
8991 <div class="dropdown__content dw-mod">
8992 @settings.OptionsContent
8993 </div>
8994 <label class="dropdown-trigger-off" for="@settings.Id"></label>
8995 </div>
8996 }
8997 @using System.Reflection
8998 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8999
9000 @* Component *@
9001
9002 @helper RenderQuantitySelector(QuantitySelector settings)
9003 {
9004 var attributes = new Dictionary<string, string>();
9005
9006 /*base settings*/
9007 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
9008 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
9009 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
9010 if (settings.Disabled) { attributes.Add("disabled", "true"); }
9011 if (settings.Required) { attributes.Add("required", "true"); }
9012 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
9013 /*end*/
9014
9015 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
9016 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
9017 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
9018 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
9019 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); }
9020 if (settings.Min == null) { settings.Min = 1; }
9021 attributes.Add("min", settings.Min.ToString());
9022 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); }
9023 if (settings.Value == null) { settings.Value = 1; }
9024 attributes.Add("value", settings.Value.ToString());
9025 attributes.Add("type", "number");
9026
9027 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9028
9029 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
9030 }
9031 @using Dynamicweb.Rapido.Blocks.Components
9032
9033 @using Dynamicweb.Frontend
9034 @using Dynamicweb.Frontend.Devices
9035 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
9036 @using Dynamicweb.Rapido.Blocks.Components.General
9037 @using System.Collections.Generic;
9038
9039 @* Component *@
9040
9041 @helper RenderCustomerCenterList(CustomerCenterList settings)
9042 {
9043 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false;
9044 string hideActions = isTouchDevice ? "u-block" : "";
9045
9046 <table class="table data-list dw-mod">
9047 @if (settings.GetHeaders().Length > 0) {
9048 <thead>
9049 <tr class="u-bold">
9050 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders())
9051 {
9052 var attributes = new Dictionary<string, string>();
9053 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); }
9054 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); }
9055 attributes.Add("align", header.Align.ToString());
9056 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9057
9058 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td>
9059 }
9060 </tr>
9061 </thead>
9062 }
9063 @foreach (CustomerCenterListItem listItem in settings.GetItems())
9064 {
9065 int columnCount = 0;
9066 int totalColumns = listItem.GetInfoItems().Length;
9067 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-acions" : "";
9068 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N");
9069
9070 var attributes = new Dictionary<string, string>();
9071 var width = Pageview.Device.ToString() != "Mobile" ? "150" : "100";
9072 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); };
9073
9074 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9075 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)>
9076 <tr>
9077 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) {
9078 <td onclick="@listItem.OnClick" class="data-list__main-item dw-mod" width="@width">
9079 @if (!string.IsNullOrEmpty(listItem.Title)) {
9080 <div class="u-bold">@listItem.Title</div>
9081 }
9082 @if (!string.IsNullOrEmpty(listItem.Description)) {
9083 <div>@listItem.Description</div>
9084 }
9085 </td>
9086 }
9087
9088 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems())
9089 {
9090 var infoAttributes = new Dictionary<string, string>();
9091 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); };
9092 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); };
9093 infoAttributes.Add("align", infoItem.Align.ToString());
9094
9095 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9096 string columnClick = columnCount < (totalColumns-2) ? "onclick=\"" + listItem.OnClick + "\"" : "";
9097
9098 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod">
9099 @if (!string.IsNullOrEmpty(infoItem.Title)) {
9100 <div>@infoItem.Title</div>
9101 }
9102 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) {
9103 <div><small>@infoItem.Subtitle</small></div>
9104 }
9105 </td>
9106
9107 columnCount++;
9108 }
9109 </tr>
9110 <tr>
9111 <td colspan="7" align="right" class="u-va-bottom u-no-border">
9112 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id">
9113 @foreach (ButtonBase action in listItem.GetActions())
9114 {
9115 action.ButtonLayout = ButtonLayout.LinkClean;
9116 action.CssClass += " data-list__action-button link";
9117
9118 @Render(action)
9119 }
9120 </div>
9121 </td>
9122 </tr>
9123 </tbody>
9124 }
9125 </table>
9126 }
9127 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
9128
9129 @using System
9130 @using System.Web
9131 @using System.Collections.Generic
9132 @using Dynamicweb.Rapido.Blocks.Extensibility
9133 @using Dynamicweb.Rapido.Blocks
9134
9135 @{
9136 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
9137
9138 Block primaryBottomSnippets = new Block()
9139 {
9140 Id = "MasterJavascriptInitializers",
9141 SortId = 100,
9142 Template = RenderPrimaryBottomSnippets()
9143 };
9144 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
9145 }
9146
9147 @helper RenderPrimaryBottomSnippets()
9148 {
9149 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
9150 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
9151
9152 if (isWireframeMode)
9153 {
9154 <script>
9155 Wireframe.Init(true);
9156 </script>
9157 }
9158
9159
9160 if (useGoogleTagManager)
9161 {
9162 <script>
9163 document.addEventListener('addToCart', function(event) {
9164 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
9165 if (typeof googleImpression == "string") {
9166 googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
9167 }
9168 dataLayer.push({
9169 'event': 'addToCart',
9170 'ecommerce': {
9171 'currencyCode': googleImpression.currency,
9172 'add': {
9173 'products': [{
9174 'name': googleImpression.name,
9175 'id': googleImpression.id,
9176 'price': googleImpression.price,
9177 'brand': googleImpression.brand,
9178 'category': googleImpression.category,
9179 'variant': googleImpression.variant,
9180 'quantity': event.detail.quantity
9181 }]
9182 }
9183 }
9184 });
9185 });
9186 </script>
9187 }
9188
9189 //if digitalwarehouse
9190 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"))
9191 {
9192 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]);
9193
9194 if (string.IsNullOrEmpty(cartContextId))
9195 {
9196 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2");
9197 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps);
9198 cartContextId = cartSettings.OrderContextID;
9199 HttpContext.Current.Application["DownloadCartContext"] = cartContextId;
9200 }
9201
9202 <script>
9203 let downloadCart = new DownloadCart({
9204 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"),
9205 contextId: "@cartContextId",
9206 addButtonText: "@Translate("Add")",
9207 removeButtonText: "@Translate("Remove")"
9208 });
9209 </script>
9210 }
9211
9212 <!--$$Javascripts-->
9213 }
9214 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
9215 @using System
9216 @using System.Web
9217 @using System.Collections.Generic
9218 @using Dynamicweb.Ecommerce.WebAPI.Controllers
9219 @using Dynamicweb.Ecommerce.Frontend
9220 @using Dynamicweb.Rapido.Blocks
9221 @using Degree.Kraemer.Rma.Infrastructure.Authentication
9222
9223 @functions{
9224
9225 public string ReturnCustomFieldValue(string customFieldSystemName)
9226 {
9227 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null;
9228
9229 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
9230 {
9231 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues;
9232 }
9233 else if (Model.CurrentUser != null && Model.CurrentUser.ID > 0)
9234 {
9235 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues;
9236 }
9237 var currentUserLocation = "";
9238
9239 if (userCustomFields != null)
9240 {
9241 foreach (var field in userCustomFields)
9242 {
9243 if (field.CustomField.SystemName == customFieldSystemName)
9244 {
9245 currentUserLocation = field.Value.ToString();
9246 }
9247 }
9248 }
9249 else
9250 {
9251 currentUserLocation = "test";
9252 }
9253
9254 return currentUserLocation;
9255 }
9256
9257 public bool getPromptForAccount()
9258 {
9259 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.CurrentSecondaryUser;
9260 var user = secondaryUser != null ? secondaryUser : Dynamicweb.Security.UserManagement.User.get_Current(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend);
9261 // bool userIsMain = Model.CurrentSecondaryUser.ID == 0;
9262 var promptForAccount = user != null ? user.CustomFieldValues.First(f => f.CustomField.SystemName == "AccessUser_PromptForAccount").Value.ToString() == "True" : false;
9263
9264 return promptForAccount;
9265 }
9266
9267 }
9268
9269 @{
9270 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master");
9271 }
9272
9273 @{
9274 Block SideNavigation = new Block()
9275 {
9276 Id = "SideNavigation",
9277 SortId = 5,
9278 Template = RenderSideNavigation(),
9279 SkipRenderBlocksList = true
9280 };
9281 Block userLocationModal = new Block()
9282 {
9283 Id = "UserLocationsModal",
9284 SortId = 10,
9285 Template = RenderUserLocations(),
9286 SkipRenderBlocksList = true
9287 };
9288 masterCustomBlocksPage.Add(userLocationModal);
9289
9290 Block newRMAModal = new Block()
9291 {
9292 Id = "newRmaModal",
9293 SortId = 109,
9294 Template = RenderNewRmaForm(),
9295 SkipRenderBlocksList = true
9296 };
9297
9298 masterCustomBlocksPage.Add(newRMAModal);
9299 Block viewRMADetails = new Block()
9300 {
9301 Id = "newRmaModal",
9302 SortId = 108,
9303 Template = RenderNewRmaViewDetails(),
9304 SkipRenderBlocksList = true
9305 };
9306
9307 masterCustomBlocksPage.Add(viewRMADetails);
9308 Block viewRMAFullOrderDetails = new Block()
9309 {
9310 Id = "newRmaModalFullOrder",
9311 SortId = 107,
9312 Template = RenderNewRmaViewFullOrderDetails(),
9313 SkipRenderBlocksList = true
9314 };
9315
9316 masterCustomBlocksPage.Add(viewRMAFullOrderDetails);
9317 Block RmaViewDetailsEditableBlock = new Block()
9318 {
9319 Id = "DraftRmaModal",
9320 SortId = 105,
9321 Template = RenderNewRmaViewDetailsEditable(),
9322 SkipRenderBlocksList = true
9323 };
9324
9325 masterCustomBlocksPage.Add(RmaViewDetailsEditableBlock);
9326 Block viewOrderDetails = new Block()
9327 {
9328 Id = "newOrderHistoryDetailsModal",
9329 SortId = 106,
9330 Template = RenderNewOrderHistoryViewDetails(),
9331 SkipRenderBlocksList = true
9332 };
9333
9334 masterCustomBlocksPage.Add(viewOrderDetails);
9335 Block newCartModal = new Block()
9336 {
9337 Id = "NewCartModal",
9338 SortId = 20,
9339 Template = RenderNewCartModal(),
9340 SkipRenderBlocksList = true
9341 };
9342 masterCustomBlocksPage.Add(newCartModal);
9343
9344 Block newCartNameModal = new Block()
9345 {
9346 Id = "CartNameModal",
9347 SortId = 50,
9348 Template = RenderNewCartNameModal(),
9349 SkipRenderBlocksList = true
9350 };
9351 masterCustomBlocksPage.Add(newCartNameModal);
9352
9353 if (Model.HasSecondaryUsers)
9354 {
9355 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
9356 {
9357 Block impersonationListModal = new Block()
9358 {
9359 Id = "ImpersonationListModal",
9360 SortId = 30,
9361 Template = RenderImpersonationModal(),
9362 SkipRenderBlocksList = true
9363 };
9364
9365 masterCustomBlocksPage.Add(impersonationListModal);
9366 }
9367 else
9368 {
9369 Block impersonationListModal = new Block()
9370 {
9371 Id = "ImpersonationListModal",
9372 SortId = 30,
9373 Template = RenderImpersonationModal(),
9374 SkipRenderBlocksList = true
9375 };
9376
9377 masterCustomBlocksPage.Add(impersonationListModal);
9378 }
9379
9380 Block impersonationTemplate = new Block()
9381 {
9382 Id = "ImpersonationTemplate",
9383 SortId = 40,
9384 Template = RenderImpersonationListSelect()
9385 };
9386 masterCustomBlocksPage.Add("MasterHeader", impersonationTemplate);
9387 }
9388 Block quickViewModal = new Block()
9389 {
9390 Id = "QuickViewModal",
9391 SortId = 60,
9392 Template = RenderQuickViewModal(),
9393 SkipRenderBlocksList = true
9394 };
9395
9396 masterCustomBlocksPage.Add(quickViewModal);
9397 // masterCustomBlocksPage.Add(MasterBlockId.MasterMain, UserLocationModal);
9398
9399 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block
9400 {
9401 Id = "CartListScript",
9402 Template = RenderCartsListSelect()
9403 });
9404
9405 if (Model.CurrentUser.ID > 0)
9406 {
9407 Modal stopImpersonation = new Modal
9408 {
9409 Id = "StopImpersonation",
9410 Heading = new Heading
9411 {
9412 Level = 2,
9413 Title = Translate("Sign out"),
9414 Icon = new Icon
9415 {
9416 Name = "fa-sign-out",
9417 Prefix = "fas",
9418 LabelPosition = IconLabelPosition.After
9419 }
9420 },
9421 Width = ModalWidth.Md,
9422 BodyTemplate = RenderStopImpersonationForm()
9423 };
9424
9425 Block stopCustomImpersonation = new Block
9426 {
9427 Id = "StopImpersonationBlock",
9428 SortId = 10,
9429 Component = stopImpersonation
9430 };
9431 masterCustomBlocksPage.RemoveBlockById("StopImpersonationBlock");
9432 masterCustomBlocksPage.Add(stopCustomImpersonation);
9433 }
9434 Block emptyCartModal = new Block()
9435 {
9436 Id = "EmptyCartModal",
9437 SortId = 80,
9438 Template = RenderEmptyCartModal(),
9439 SkipRenderBlocksList = true
9440 };
9441
9442 masterCustomBlocksPage.Add(emptyCartModal);
9443
9444 Block stepQuantityErrorModal = new Block()
9445 {
9446 Id = "StepQuantityErrorModal",
9447 SortId = 90,
9448 Template = RenderStepQuantityErrorModal()
9449 };
9450
9451 masterCustomBlocksPage.Add(stepQuantityErrorModal);
9452
9453 }
9454 @{
9455 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9456
9457 }
9458
9459 @helper RenderSideNavigation()
9460 {<p>test</p>}
9461
9462 @helper RenderUserLocations()
9463 {
9464 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
9465 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
9466 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9467 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations");
9468 Modal getLocations = new Modal
9469 {
9470 Id = "UserLocationModal",
9471 Heading = new Heading
9472 {
9473 Level = 2,
9474 Title = Translate("Select a location")
9475 },
9476 Width = ModalWidth.Md,
9477 BodyTemplate = RenderUserLocationsContentModal()
9478 };
9479 if (userExists && !string.IsNullOrEmpty(customerNumber))
9480 {
9481 <div data-location="@currentUserLocation" data-location-list="@locationList"></div>
9482
9483 if (currentUserLocation == "")
9484 {
9485 <div> @Render(getLocations) </div>
9486 }
9487 }
9488 }
9489
9490 @helper RenderUserLocationsContentModal()
9491 {
9492 <div>
9493 @RenderLocationsSelect()
9494 @Render(new Button
9495 {
9496 Title = Translate("Set location"),
9497 ButtonType = ButtonType.Button,
9498 ButtonLayout = ButtonLayout.Primary,
9499 CssClass = "u-no-margin",
9500 OnClick = "addLocation(document.querySelector('#UserLocationModalModal #LocationsSelect'))"
9501 })
9502 </div>
9503 }
9504
9505 @helper RenderLocationsSelect()
9506 {
9507 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations");
9508 List<string> locations = locationList.ToString().Split(',').ToList();
9509 SelectField selectField = new SelectField
9510 {
9511 Id = "LocationsSelect",
9512 Label = Translate("Select a location"),
9513 CssClass = "u-margin-bottom",
9514 Required = true
9515 };
9516
9517 foreach (var loc in locations)
9518 {
9519 string label;
9520 string code;
9521 string askoCode;
9522 string[] parts = loc.Split('|');
9523 if (parts.Length >= 3)
9524 {
9525 label = parts[0].Trim();
9526 code = parts[1].Trim();
9527 askoCode = parts[2].Trim();
9528 }
9529 else
9530 {
9531 label = parts[0].Trim();
9532 code = parts[1].Trim();
9533 }
9534 selectField.Options.Add(new SelectFieldOption { Label = label, Value = code });
9535 }
9536 @Render(selectField)
9537 }
9538
9539 @helper RenderNewCartModal()
9540 {
9541 var newCartModal = new Modal
9542 {
9543 Id = "NewCart",
9544 Heading = new Heading { Title = Translate("Create New Cart") },
9545 Width = ModalWidth.Md,
9546 BodyTemplate = RenderNewCartContentModal()
9547 };
9548
9549 <div>@Render(newCartModal) </div>
9550 }
9551
9552 @helper RenderNewCartContentModal()
9553 {
9554 var baseurl = HttpContext.Current.Request.Url.ToString();
9555 string currentUserId = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUserId().ToString();
9556 var newCartURL = baseurl.Contains("?") ? baseurl + "&redirect=false&cartcmd=createnew&CartUserId=" + currentUserId + "&CartName=" : baseurl + "?cartcmd=createnew&redirect=false&CartUserId=" + currentUserId + "&CartName=";
9557 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID=";
9558 var cartsListFeedPageId = "/Default.aspx?ID=" + GetPageIdByNavigationTag("CartsListFeed");
9559
9560 <div>
9561 <form method="post" id="NewCartForm" data-submit-url="@newCartURL" data-carts-url="@cartsListFeedPageId" data-change-cart-url="@setCartURL">
9562 @Render(new HiddenField { Id = "CartUserId", Name = "CartUserId", Value = currentUserId })
9563 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "createnew" })
9564 @Render(new TextField { Id = "CartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Cart Name"), Required = true })
9565 @*@Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Create") })*@
9566 <button type="button" id="CreateNewCartButton" class="btn btn--primary dw-mod">@Translate("Create")</button>
9567 </form>
9568 </div>
9569 }
9570
9571 @helper RenderNewCartNameModal()
9572 {
9573 var newCartNameModal = new Modal
9574 {
9575 Id = "NewCartName",
9576 Heading = new Heading { Title = Translate("ChangeCartName") },
9577 Width = ModalWidth.Md,
9578 BodyTemplate = RenderNewCartNameContentModal()
9579 };
9580
9581 <div>@Render(newCartNameModal) </div>
9582 }
9583
9584 @helper RenderNewCartNameContentModal()
9585 {
9586 <form method="post">
9587 @Render(new HiddenField { Id = "CartID", Name = "CartID", Value = "" })
9588 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "setname" })
9589 @Render(new TextField { Id = "NewCartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Enter New Name"), Required = true })
9590 @Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Endre navn") })
9591 </form>
9592 }
9593
9594 @helper RenderImpersonationModal()
9595 {
9596 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
9597 var promptForAccount = getPromptForAccount();
9598 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
9599 string headerMessage = isImpersonating ? Translate("Change account") : Translate("Secondary Users");
9600 Modal secondaryUsers = new Modal
9601 {
9602
9603 Id = "SecondarUsersModal",
9604 Heading = new Heading
9605 {
9606 Level = 2,
9607 Title = headerMessage
9608 },
9609
9610 Width = ModalWidth.Md,
9611 BodyTemplate = RenderImpersonationContentModal()
9612 };
9613 <div data-prompt-account="@promptForAccount">@Render(secondaryUsers)</div>
9614 }
9615
9616 @helper RenderImpersonationContentModal()
9617 {
9618 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
9619 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
9620 string buttonTitle = isImpersonating ? Translate("Choose user") : Translate("Set user");
9621
9622 <div class="u-margin-right u-margin-bottom">@Translate("Choose user to impersonate:")</div>
9623 <div class="impersonation-container">
9624 <input type="checkbox" id="ImpersonationSelect_modal" class="dropdown-trigger" />
9625 <div class="dropdown variants-filters dw-mod">
9626 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_modal">@Translate("Choose user")</label>
9627 <div class="dropdown__content u-padding dw-mod">
9628 <div class="dropdown__item__filter">
9629 <input type="text" data-container-id="impersonationListModal" data-view-type="modal" placeholder="@Translate("Search")">
9630 </div>
9631 <div class="js-handlebars-root dw-mod u-margin-bottom" id="impersonationListModal" data-template="ImpersonationListContent" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div>
9632 </div>
9633 <label class="dropdown-trigger-off" for="ImpersonationSelect_modal"></label>
9634 </div>
9635 </div>
9636 @Render(new Button
9637 {
9638 Title = buttonTitle,
9639 ButtonType = ButtonType.Button,
9640 ButtonLayout = ButtonLayout.Primary,
9641 CssClass = "u-no-margin u-margin-top",
9642 ExtraAttributes = new Dictionary<string, string>
9643 {
9644 { "data-role", "impersonate-submit" }
9645 }
9646 // OnClick = "sessionStorage.setItem('impersonationModalOpen', 'true'); sessionStorage.setItem('recentlyLoggedIn', 'true'); localStorage.removeItem('userLocation'); document.getElementById(document.querySelector('#SecondarUsersModalModal .dropdown__header').getAttribute('data-value')).submit();"
9647 })
9648 }
9649
9650 @helper RenderImpersonationListSelect()
9651 {
9652 bool promtForAccount = getPromptForAccount();
9653
9654 if (promtForAccount)
9655 {
9656 <script id="ImpersonationListContent" data-test="1" type="text/x-template">
9657
9658 {{#.}}
9659 {{#Users}}
9660 {{#if main}}
9661 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div>
9662 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9663 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9664 </form>
9665 {{else}}
9666 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div>
9667 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9668 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9669 </form>
9670 {{/if}}
9671 {{/Users}}
9672 {{/.}}
9673 </script>
9674 }
9675 else
9676 {
9677 <script id="ImpersonationListContent" data-test="2" type="text/x-template">
9678
9679 {{#.}}
9680 {{#ifCond totalUsers "!==" "2"}}
9681
9682 {{#Users}}
9683 {{#if main}}
9684 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div>
9685 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9686 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9687 </form>
9688 {{else}}
9689
9690 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'false');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div>
9691 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9692 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9693 </form>
9694 {{/if}}
9695 {{/Users}}
9696
9697 {{/ifCond}}
9698 {{/.}}
9699 </script>
9700 }
9701
9702 <script id="ImpersonationListContentHeader" type="text/x-template">
9703 {{#.}}
9704 {{#Users}}
9705 {{#if main}}
9706 {{#if secondaryUser}}
9707 {{#unless hideSelf}}
9708 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div>
9709 {{/unless}}
9710 {{else}}
9711 {{#unless hideSelf}}
9712 {{#ifCond ../totalUsers "!==" 2}}
9713 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'true');logOutCurrentUser()" tabindex="0">{{name}}</div>
9714 {{else}}
9715 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div>
9716 {{/ifCond}}
9717 {{/unless}}
9718 {{/if}}
9719
9720 {{else}}
9721 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span><span>{{formatCustomerNumber customerNumber}}<span></div>
9722 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9723 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9724 </form>
9725 {{/if}}
9726 {{/Users}}
9727
9728 {{/.}}
9729 </script>
9730 }
9731
9732 @helper RenderQuickViewModal()
9733 {
9734 <div class="quick-view-modal">
9735 @Render(new Modal
9736 {
9737 Id = "ProductDetailQuickView",
9738 Heading = new Heading
9739 {
9740 Level = 3,
9741 Title = "",
9742 CssClass = "bs-margin-bottom-0 bs-border-none"
9743 },
9744 Width = ModalWidth.Full,
9745 Height = ModalHeight.Full,
9746 BodyText = ""
9747 })
9748 </div>
9749 }
9750
9751 @helper RenderCartsListSelect()
9752 {
9753 var baseurl = HttpContext.Current.Request.Url.ToString();
9754 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID=";
9755
9756 <script id="CartsListContent" type="text/x-template">
9757 {{#.}}
9758 <select id="CartsSelect" class="u-full-width u-margin-bottom" data-url="@setCartURL">
9759 @*<option>@Translate("Change Cart")</option>*@
9760 {{#Carts}}
9761 <option value="{{id}}" data-active="{{isCartActive}}" {{selected}}>{{name}}</option>
9762 {{/Carts}}
9763 </select>
9764 {{/.}}
9765 </script>
9766 }
9767
9768 @helper RenderEmptyCartModal()
9769 {
9770 @Render(new Modal
9771 {
9772 Id = "EmptyCartModal",
9773 Heading = new Heading
9774 {
9775 Level = 3,
9776 Title = Translate("cartEmptyDisclaimer"),
9777 CssClass = "u-margin-bottom"
9778 },
9779 Width = ModalWidth.Md,
9780 BodyTemplate = RenderEmptyCartModalBody()
9781 })
9782 }
9783
9784 @helper RenderEmptyCartModalBody()
9785 {
9786 <div class="u-flex grid--justify-space-between">
9787 <button type="button" title="@Translate("Yes")" class="btn empty-cart btn--primary dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event); document.getElementById('EmptyCartModalModalTrigger').checked = false; sessionStorage.setItem('minicartState', 'closed'); getContentFirstCart();">@Translate("Yes")</button>
9788 <button type="button" title="@Translate("No")" class="btn empty-cart btn--secondary dw-mod u-no-margin u-margin-bottom" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = false;">@Translate("No")</button>
9789 </div>
9790 }
9791
9792 @helper RenderStepQuantityErrorModal()
9793 {
9794 Modal stepQuantityError = new Modal
9795 {
9796 Id = "StepQuantityError",
9797 Heading = new Heading { Title = Translate("Quantity error") },
9798 Width = ModalWidth.Md,
9799 BodyTemplate = RenderErrorModalContent()
9800 };
9801
9802 <div>@Render(stepQuantityError)</div>
9803 }
9804
9805 @helper RenderErrorModalContent()
9806 {
9807 <div class="u-padding">
9808 <h5 class="u-margin-bottom">
9809 <span class="product-name"></span>
9810 </h5>
9811 <h5 class="quantity-change-error-text-multiple">
9812 @Translate("add multi quantity")
9813 <span class="product-quantity"></span>
9814 </h5>
9815 <h5 class="quantity-change-error-text-zero u-hidden">
9816 @Translate("Please insert the minimum quantity")
9817 <span class="product-quantity"></span>
9818 </h5>
9819 </div>
9820 }
9821
9822 @helper RenderNewRmaViewDetails()
9823 {
9824 Modal rmaViewDetails = new Modal
9825 {
9826 Id = "rmaViewDetails",
9827 Heading = new Heading { Title = Translate("AVVIK") },
9828 BodyTemplate = RmaViewDetails()
9829 };
9830 <div data-ref="rmaViewDetails">@Render(rmaViewDetails)</div>
9831 }
9832 @helper RenderNewOrderHistoryViewDetails()
9833 {
9834 Modal orderHistoryDetails = new Modal
9835 {
9836 Id = "rmaViewDetails2",
9837 Heading = new Heading { Title = Translate("ORDREBEKREFTELSE") },
9838 BodyTemplate = ViewOrderDetails2()
9839 };
9840 <div data-ref="orderHistoryDetails">@Render(orderHistoryDetails)</div>
9841 }
9842 @helper RenderNewRmaForm()
9843 {
9844 Modal newRmaForm = new Modal
9845 {
9846 Id = "rmaForm",
9847 Heading = new Heading { Title = Translate("AVVIK") },
9848 BodyTemplate = RmaFormContent()
9849 };
9850 <div data-ref="newRMA">@Render(newRmaForm)</div>
9851 }
9852
9853 @helper RenderNewRmaViewFullOrderDetails()
9854 {
9855 Modal rmaViewDetailsFullOrder = new Modal
9856 {
9857 Id = "rmaViewDetailsFullOrder",
9858 Heading = new Heading { Title = Translate("AVVIK") },
9859 BodyTemplate = RmaViewDetailsFullOrder()
9860 };
9861 <div>@Render(rmaViewDetailsFullOrder)</div>
9862 }
9863
9864 @helper RenderNewRmaViewDetailsEditable()
9865 {
9866 Modal rmaViewDetailsEditable = new Modal
9867 {
9868 Id = "rmaViewDetailsEditable",
9869 Heading = new Heading { Title = Translate("AVVIK") },
9870 BodyTemplate = RmaViewDetailsEditable()
9871 };
9872 <div>@Render(rmaViewDetailsEditable)</div>
9873 }
9874
9875 @helper RmaFormContent()
9876 {
9877 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
9878 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString();
9879 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId;
9880 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0;
9881 // var token = userID != 0 ? Auth.GetToken(userID) : "0";
9882 var token = ReturnCustomFieldValue("AccessUser_UserToken");
9883 var company = Model.CurrentUser.Company;
9884 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
9885 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9886 @*<h1>@userID</h1>
9887 <h1>@token</h1>*@
9888 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div>
9889 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" />
9890 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div>
9891 <div class="u-hidden" id="CurrentUserCompany" data-customer-company="@isCompanyKraemer"></div>
9892 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" />
9893 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden">
9894
9895 <div class="rma-modal__container">
9896
9897 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-container" data-template="rma-form-hidden-inputs" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form>
9898
9899 <header class="bs-d-flex bs-flex-column bs-flex-xl-row bs-flex-wrap bs-gap-3 bs-gap-lg-5 rma-modal__header">
9900 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
9901 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" />
9902 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" />
9903 @*<h1 class="mb-0">@Model.SecondaryUsers.Count</h1>*@
9904 <div class="bs-d-flex bs-flex-column bs-flex-md-row bs-gap-3">
9905 @if (Model.HasSecondaryUsers)
9906 {
9907 <div class="modal__select-rma impersonation-container-filter-rma create-rma-modal">
9908 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" />
9909 <div class="dropdown variants-filters bs-w-100 dw-mod">
9910 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose user")</label>
9911 <div class="dropdown__content u-padding dw-mod">
9912 <div class="dropdown__item__filter">
9913 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
9914 </div>
9915 <div class=" js-handlebars-root dw-mod" id="impersonationListFilterCreateRmaModal" data-template="ImpersonationListContentFilterCreateRmaModal" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div>
9916 </div>
9917 </div>
9918 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label>
9919 </div>
9920 }
9921
9922 <div class="modal__select-rma">
9923 <div class="order-container-filter create-rma-modal">
9924 <input type="checkbox" id="OrderSelect" class="dropdown-trigger" />
9925 <div class="dropdown variants-filters bs-w-100 dw-mod">
9926 <label class="dropdown__header dropdown__btn dw-mod" for="OrderSelect" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose an order")</label>
9927 <div class="dropdown__content u-padding dw-mod">
9928 <div class="dropdown__item__filter">
9929 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
9930 </div>
9931 <div class=" js-handlebars-root dw-mod" id="RMA-Order-Select-container" data-template="RMA-Order-Select" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false">
9932 </div>
9933 </div>
9934 <label class="dropdown-trigger-off" for="OrderSelect"></label>
9935 </div>
9936 </div>
9937 </div>
9938 </div>
9939 </header>
9940 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
9941 <div class="bs-d-flex">
9942 <div class="toast-body">
9943 @Translate("Please fill all required fields")
9944 </div>
9945 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
9946 </div>
9947 </div>
9948 <div class="rma-modal__selected-order orderline-form">
9949
9950 @* Switch between full order rma and orderline RMA *@
9951 <div class="rma-modal-container bs-px-3 form-orderline">
9952 <div class="modal-container__content u-hidden">
9953 <div class="bs-grid rma-modal-container bs-mt-5">
9954 <div class="g-col-md-1 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div>
9955 <div class="g-col-md-5 g-col-12 d-flex u-flex--row bs-align-items-center bs-justify-content-center bs-position-relative">
9956 <input type="text" id="SearchOrderlinesInput" name="search-rma" placeholder="@Translate("Søk etter produkt...")" class="mb-0 form-control search-ahead__input">
9957 <button type="button" id="SearchOrderlinesButton" class="search-icon-desktop js-typeahead-enter-btn" title="Søk">
9958 <i class="far fa-search bs-px-2"></i>
9959 </button>
9960 <button type="button" id="RemoveSearchOrderlinesButton" class=" u-hidden search-icon-desktop js-typeahead-enter-btn" title="Søk">
9961 <i class="far fa-times bs-px-2"></i>
9962 </button>
9963 </div>
9964 <div class="g-col-md-3 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div>
9965 <div class="g-col-md-3 g-col-12 bs-d-grid">
9966 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-w-100 bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1" style="justify-self:end;">@Translate("Hel order")</button>
9967 </div>
9968 </div>
9969 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg ">
9970 <div class="u-border-bottom rma-page__header-grid-container rma-header">
9971 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div>
9972 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div>
9973 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksårsak")</div>
9974 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert")</div>
9975 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksantall")</div>
9976 @* <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert Antall")</div>*@
9977 </div>
9978 </div>
9979 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
9980 <div class="bs-d-flex">
9981 <div class="toast-body">
9982 @Translate("Please fill all required fields")
9983 </div>
9984 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
9985 </div>
9986 </div>
9987 </div>
9988 @* products loop *@
9989 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-orderlines-container" data-template="rma-form-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div>
9990 </div>
9991 </div>
9992 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3">
9993 <div class="rma-modal-container">
9994 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
9995 <div class="bs-d-flex">
9996 <div class="toast-body">
9997 @Translate("Please fill all required fields")
9998 </div>
9999 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10000 </div>
10001 </div>
10002 <div class="d-flex bs-flex-wrap bs-gap-3 bs-flex-row bs-justify-content-between bs-mt-5 bs-mb-2 rma-options-container">
10003 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)">
10004 <option value="0">@Translate("Avviksårsak")</option>
10005 <option value="1">@Translate("Faktura")</option>
10006 <option value="3">@Translate("Kvalitet")</option>
10007 <option value="2">@Translate("Pakking")</option>
10008 <option value="4">@Translate("Vedlikehold")</option>
10009 <option value="5">@Translate("Feil Levert")</option>
10010 <option value="6">@Translate("Multiple")</option>
10011 </select>
10012 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button>
10013 </div>
10014 <div class="inputComment bs-w-100 bs-mt-5">
10015 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea>
10016 @*
10017 <label for="FullOrderComment">@Translate("Avvikskommentar")</label>
10018 *@
10019 </div>
10020 <div class="inputComment bs-w-100 bs-mt-3">
10021 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea>
10022 </div>
10023 <input class="create-rma-form-input form-control create-rma-Attachment-input bs-mt-3" id="CreateRmaFormAttachmentFull" name="FullOrderAttachment" type="file" multiple="multiple" />
10024 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5">
10025 </div>
10026 <div class="bs-mt-5 bs-w-50 bs-mb-5">
10027 <div class="orderInfo d-flex bs-justify-content-between">
10028 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Antall produktlinjer")</p>
10029 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-orderlines">7</p>
10030 </div>
10031 <div class="orderInfo d-flex bs-justify-content-between">
10032 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Totalt antall produkter")</p>
10033 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-quantity">289</p>
10034 </div>
10035 <div class="orderInfo d-flex bs-justify-content-between">
10036 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Ordretotal eks. MVA")</p>
10037 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-amount">35 897,18 kr </p>
10038 </div>
10039 </div>
10040 </div>
10041 </div>
10042
10043 <footer class="modal__rma-footer">
10044 <div class="footer-button-container">
10045 <button class="submit-rma-button disabled submit-rma-button bs-btn bs-btn-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,true,this)">@Translate("Opprett Avvik")</button>
10046 </div>
10047 <div class="modal__rma-footer-icon-buttons">
10048 </div>
10049 </footer>
10050 </div>
10051 <script id="ImpersonationListContentFilterCreateRmaModal" type="text/x-template">
10052 {{#.}}
10053 {{#Users}}
10054 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div>
10055 {{/Users}}
10056 {{/.}}
10057 </script>
10058
10059 <script id="rma-form-hidden-inputs" type="text/x-template">
10060 {{#.}}
10061 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" />
10062 <input name="deviationId" value="0" type="text" class="u-hidden" />
10063 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" />
10064 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" />
10065 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" />
10066 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" />
10067 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden">
10068 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden">
10069 {{/.}}
10070 </script>
10071
10072 <script id="rma-form-orderlines" type="text/x-template">
10073 {{#.}}
10074 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" data-product-name="{{orderLineProductName}}" data-product-number="{{orderLineProductNumber}}" style="border-color: #597CCA;">
10075 <input type="hidden" name="productId" value="{{orderLineProductId}}" />
10076 <input name="deviationId" value="{{orderId}}" type="text" class="u-hidden" />
10077 <input name="deviationOrderLineId" value="{{orderId}}" type="text" class="u-hidden" />
10078 <input name="deviationLineId" value="0" type="text" class="u-hidden" />
10079
10080 <input type="hidden" name="productNumber" value="{{orderLineProductNumber}}" />
10081 <input type="hidden" name="productName" value="{{orderLineProductName}}" />
10082 <input type="hidden" name="productImage" value="{{#if orderLineProductImage}}{{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" />
10083 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10084 <input type="hidden" name="supplierName" value="{{orderLineSupplierName}}" />
10085 <div class="rma-form-grid-item rma-table-item">
10086 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10087 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" />
10088 </div>
10089 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row bs-align-items-center">
10090 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10091 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="rma-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div>
10092 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}" data-test="44444">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div>
10093 </div>
10094 </div>
10095 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10096 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" name="reason" onchange="showAdditionalOrderlineFields(this, this.value)">
10097 <option value="0">@Translate("Avviksårsak")</option>
10098 <option value="1">@Translate("Faktura")</option>
10099 <option value="3">@Translate("Kvalitet")</option>
10100 <option value="2">@Translate("Pakking")</option>
10101 <option value="4">@Translate("Vedlikehold")</option>
10102 <option value="5">@Translate("Feil Levert")</option>
10103 <option value="6">@Translate("Multiple")</option>
10104 </select>
10105 </div>
10106
10107 <div class=" rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div>
10108 <input type="hidden" name="deliveredQuantity" value="{{orderLineQuantity}}" />
10109 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{orderLineUnitPrice}}" />
10110 <input type="hidden" name="Total-Test-orderLineUnitPrice" value="{{orderLineTotalPrice}}" />
10111
10112 <div class="fw-700 rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10113 <input class="create-rma-form-input create-rma-quantity-input disabled" data-delivered-quantity="{{orderLineQuantity}}" @*value="{{orderLineQuantity}}"*@ value="0" name="deviationQuantity" type="number" min="0" step="1" oninput="showAdditionalOrderlineFields(this, this.value)" max="{{orderLineQuantity}}" />
10114 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 u-hidden removeOrderlineButton" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline">
10115 <i class="far fa-times bs-text-danger bs-px-2"></i>
10116 </button>
10117 </div>
10118 </div>
10119 <div class="grid u-hidden additional-rma-orderline-fields additional-fields-rma">
10120 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10121 </div>
10122 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;">
10123 <input type="text" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" />
10124 </div>
10125 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10126 <input class="create-rma-form-input create-rma-expected-result" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" />
10127 </div>
10128 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10129 <input class="create-rma-form-input form-control create-rma-Attachment-input" id="CreateRmaFormAttachment_{{orderLineProductId}}" name="attachment" type="file" />
10130 <div class="u-hidden emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div>
10131 </div>
10132 </div>
10133 </form>
10134 {{/.}}
10135 </script>
10136
10137 <script id="RMA-Order-Select" type="text/x-template">
10138
10139 {{#.}}
10140 {{#ifCond orderId "!==" "No"}}
10141 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div>
10142 {{/ifCond}}
10143 {{/.}}
10144 </script>
10145
10146 }
10147 @helper DelayTranslations(string word)
10148 {
10149 <p>@Translate(word)</p>
10150 }
10151 @helper RmaViewDetailsEditable()
10152 {
10153 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
10154 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString();
10155 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId;
10156 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0;
10157 // var token = userID != 0 ? Auth.GetToken(userID) : "0";
10158 var token = ReturnCustomFieldValue("AccessUser_UserToken");
10159
10160 if (string.IsNullOrEmpty(token))
10161 {
10162 token = Degree.Kraemer.Ecommerce.Infrastructure.Authentication.AuthenticationManager.GetToken(userID.ToString());
10163 }
10164
10165 string favoriteUserToken = "";
10166 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser();
10167
10168 if (currentUserAccess != null)
10169 {
10170 favoriteUserToken = JwtService.GetToken(currentUserAccess, 86400);
10171 }
10172
10173 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
10174
10175 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div>
10176 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" />
10177 <input type="hidden" id="FavoriteUserToken" value="@favoriteUserToken" />
10178 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div>
10179 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" />
10180 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden">
10181
10182 <div class="rma-modal__container">
10183
10184 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-draft-container" data-template="rma-form-hidden-inputs-draft" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form>
10185
10186 <header class="u-flex u-flex--row rma-modal__header" bs-d-flex bs-flex-wrap>
10187 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10188 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" />
10189 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" />
10190 <div class="fs-4 fw-bold text-primary" id="SelectedCustomerName"></div>
10191 <div class="fs-4 fw-bold text-primary" id="SelectedOrderId"></div>
10192 <div class="fs-4 fw-bold text-primary" id="SelectedDeviationId"></div>
10193 </header>
10194 <div class="">
10195 <div class="">
10196 <div class="rma-modal__selected-order orderline-form">
10197
10198 <div class="bs-grid rma-modal-container bs-mt-md-5">
10199 <div class="g-col-12 g-col-md-1 d-flex u-flex--row align-items-center justify-content-center"></div>
10200 <div class="g-col-12 g-col-md-5 d-flex u-flex--row align-items-center justify-content-center position-relative">
10201 </div>
10202 <div class="g-col-12 g-col-md-3 d-flex u-flex--row align-items-center justify-content-center"></div>
10203 <div class="g-col-12 g-col-md-3 bs-d-flex bs-justify-content-center">
10204 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1 toFullOrderDraftButton">@Translate("Hel order")</button>
10205 </div>
10206 </div>
10207 @* Switch between full order rma and orderline RMA *@
10208 <div class="rma-modal-container bs-px-3 form-orderline">
10209 <div class="d-flex">
10210 </div>
10211 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg ">
10212 <div class="u-border-bottom rma-page__header-grid-container">
10213 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div>
10214 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div>
10215 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center justify-content-center">@Translate("Avviksårsak")</div>
10216 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert")</div>
10217 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Avviksantall")</div>
10218 <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert Antall")</div>
10219 </div>
10220 </div>
10221 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
10222 <div class="bs-d-flex">
10223 <div class="toast-body">
10224 @Translate("Please fill all required fields")
10225 </div>
10226 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10227 </div>
10228 </div>
10229
10230 @* products loop *@
10231 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-draft-orderlines-container" data-template="rma-form-draft-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div>
10232 @*<div class="bs-d-flex bs-align-items-center bs-justify-content-start bs-my-5">
10233 <input id="DeviationAgreementDraftFormOrderline" class="bs-me-3 " onclick="enableSubmitButton(this)" type="checkbox" style="width: 27px;height: 27px;" />
10234 <label class="mb-0" for="DeviationAgreementDraftFormOrderline">
10235 <span class=""></span>@Translate("Ja, jeg er kjent med retningslinjene for avvik og mener at dette er et avvik. ")
10236 </label>
10237 </div>*@
10238 </div>
10239 </div>
10240 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3">
10241 <div class="rma-modal-container">
10242 <div class="d-flex bs-justify-content-between bs-mt-5 bs-mb-2">
10243 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)">
10244 <option value="0">@Translate("Avviksårsak")</option>
10245 <option value="1">@Translate("Faktura")</option>
10246 <option value="3">@Translate("Kvalitet")</option>
10247 <option value="2">@Translate("Pakking")</option>
10248 <option value="4">@Translate("Vedlikehold")</option>
10249 <option value="5">@Translate("Feil Levert")</option>
10250 <option value="6">@Translate("Multiple")</option>
10251 </select>
10252 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button>
10253 </div>
10254 <div class="inputComment bs-w-100 bs-mt-5">
10255 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea>
10256 </div>
10257 <div class="inputComment bs-w-100 bs-mt-3">
10258 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea>
10259 </div>
10260 <input class="create-rma-form-input form-control create-rma-Attachment-input" name="FullOrderAttachment" type="file" multiple="multiple" />
10261 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5">
10262 </div>
10263 </div>
10264 </div>
10265 </div>
10266 </div>
10267 <footer class="modal__rma-footer">
10268 <div class="footer-button-container">
10269 <button class="submit-rma-button bs-btn bs-btn-primary " type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,false)">@Translate("Opprett Avvik")</button>
10270 <button class="submit-rma-button bs-bg-white bs-btn bs-btn-outline-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),1,false)">@Translate("Save as draft")</button>
10271 </div>
10272 <div class="modal__rma-footer-icon-buttons">
10273 </div>
10274 </footer>
10275 </div>
10276 <script id="ImpersonationListContentFilterCreateRmaDraftModal" type="text/x-template">
10277 @{
10278 string title = @Translate("Choose user");
10279 }
10280 {{#.}}
10281 <div class="impersonation-container-filter-rma create-rma-modal">
10282 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" />
10283 <div class="dropdown variants-filters bs-w-100 dw-mod">
10284 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@title</label>
10285 <div class="dropdown__content u-padding dw-mod">
10286 <div class="dropdown__item__filter">
10287 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
10288 </div>
10289
10290 {{>ImpersonationListContentFilterSelectCreateRmaDraftModal}}
10291 </div>
10292 </div>
10293 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label>
10294 </div>
10295
10296 {{/.}}
10297 </script>
10298 <script id="ImpersonationListContentFilterSelectCreateRmaDraftModal" type="text/x-template">
10299 {{#.}}
10300 {{#Users}}
10301 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div>
10302 {{/Users}}
10303 {{/.}}
10304 </script>
10305
10306 <script id="rma-form-hidden-inputs-draft" type="text/x-template">
10307 {{#.}}
10308 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" />
10309 <input name="deviationId" id="HiddenInputsDeviationId" value="0" type="text" class="u-hidden" />
10310 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" />
10311 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" />
10312 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" />
10313 @*
10314 <input name="userId" value="@Model.CurrentUser.ID" type="text" class="u-hidden" />
10315 *@
10316 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" />
10317 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden">
10318 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden">
10319 @*<input name="isFullDeviation" value="false" type="text" class="u-hidden">*@
10320 {{/.}}
10321 </script>
10322
10323 <script id="rma-form-draft-orderlines" type="text/x-template">
10324 {{#.}}
10325 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" style="border-color: #597CCA;">
10326 <input type="hidden" name="productId" value="{{productId}}" />
10327 <input name="deviationId" id="HiddenInputsDeviationId" value="{{deviationId}}" type="text" class="u-hidden" />
10328 <input name="deviationOrderLineId" value="{{deviationOrderLineId}}" type="text" class="u-hidden" />
10329 <input name="deviationLineId" value="{{deviationLineId}}" type="text" class="u-hidden" />
10330
10331 <input type="hidden" name="productNumber" value="{{productNumber}}" />
10332 <input type="hidden" name="productName" value="{{productName}}" />
10333 <input type="hidden" name="productImage" value="{{#if productImage}}{{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" />
10334 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10335 <input type="hidden" name="supplierName" value="{{supplierName}}" />
10336 <div class="rma-form-grid-item">
10337 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10338 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" />
10339 </div>
10340 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row align-items-center">
10341 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10342 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{deviationOrderLineId}}" style="flex-wrap: wrap"><span>{{productNumber}}</span>{{#ifCond productNumber '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateFirst20 productName}}</span></div>
10343 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineMeasurementUnit '!==' ''}}bs-mt-2{{/ifCond}}"><span>{{truncateLast16 supplierName}}</span>{{#ifCond orderLineMeasurementUnit '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div>
10344 </div>
10345 </div>
10346 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10347 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" value={{reason}} name="reason" onchange="showAdditionalOrderlineFields(this, this.value)">
10348 <option {{#ifCond reason '===' 0}} selected {{/ifCond}} value="0">@Translate("Avviksårsak")</option>
10349 <option {{#ifCond reason '===' 1}} selected {{/ifCond}} value="1">@Translate("Faktura")</option>
10350 <option {{#ifCond reason '===' 3}} selected {{/ifCond}} value="3">@Translate("Kvalitet")</option>
10351 <option {{#ifCond reason '===' 2}} selected {{/ifCond}} value="2">@Translate("Pakking")</option>
10352 <option {{#ifCond reason '===' 4}} selected {{/ifCond}} value="4">@Translate("Vedlikehold")</option>
10353 <option {{#ifCond reason '===' 5}} selected {{/ifCond}} value="5">@Translate("Feil Levert")</option>
10354 <option {{#ifCond reason '===' 6}} selected {{/ifCond}} value="6">@Translate("Multiple")</option>
10355 </select>
10356 </div>
10357 <div class="rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10358 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10359 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{deviationOrderLineTotalPrice}}" />
10360 <div class=" rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10361 <input class="create-rma-form-input create-rma-quantity-input {{#ifCond deviationQuantity '===' 0}} disabled {{/ifCond}}" value="{{deviationQuantity}}" oninput="showAdditionalOrderlineFields(this, this.value)" data-delivered-quantity="{{deliveredQuantity}}" name="deviationQuantity" type="number" min="0" step="1" max="{{deliveredQuantity}}" />
10362 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 removeOrderlineButton {{#ifCond deviationQuantity '===' 0}} u-hidden {{/ifCond}}" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline">
10363 <i class="far fa-times bs-text-danger bs-px-2"></i>
10364 </button>
10365 </div>
10366 </div>
10367 <div class="grid {{#ifCond reason '===' 0}} u-hidden {{/ifCond}} additional-rma-orderline-fields">
10368 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10369 </div>
10370 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;">
10371 <input type="text" value="{{#each messages}}{{message}}{{/each}}" data-message-id="{{#each messages}}{{messageId}}{{/each}}" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" />
10372 </div>
10373 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10374 <input class="create-rma-form-input create-rma-expected-result" value="{{requestedOutcome}}" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" />
10375 </div>
10376 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10377 <input class="create-rma-form-input form-control create-rma-Attachment-input" data-image-path="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" value="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" id="CreateRmaFormAttachment_{{productId}}" name="attachment" type="file" />
10378 <div class="{{#ifCond messageFile '!==' null}} u-hidden {{/ifCond}}emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div>
10379 </div>
10380 </div>
10381 </form>
10382 {{/.}}
10383 </script>
10384
10385 <script id="RMA-Order-Select" type="text/x-template">
10386
10387 {{#.}}
10388 {{#ifCond orderId "!==" "No"}}
10389 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div>
10390 {{/ifCond}}
10391 {{/.}}
10392 </script>
10393
10394 }
10395
10396 @helper RmaViewDetails()
10397 {
10398 var company = Model.CurrentUser.Company;
10399 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
10400
10401 <form class="rma-modal__container">
10402 <header class="u-flex u-flex--row rma-modal__header bs-px-3 bs-d-flex bs-flex-wrap">
10403 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10404 <div class="rma-order-number rma-view-details__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div>
10405 </header>
10406 <input type="hidden" id="SelectedDeviationId" value="" />
10407 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" />
10408 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" />
10409 <div class="js-handlebars-root bs-px-3 bs-mb-5 dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div>
10410
10411 <div class="bs-px-3">
10412 <div class="rma-modal-container">
10413 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg u-border-bottom">
10414 <div class="rma-details-page__header-grid-container">
10415 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block"></div>
10416 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Produkt")</div>
10417 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksårsak")</div>
10418 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Levert")</div>
10419 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksantall")</div>
10420 <div class="fw-700 rma-page__grid-table-cell">@Translate("Pris")</div>
10421 </div>
10422 </div>
10423 @*// products loop *@
10424 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-handlebars-container" data-template="Rma-Details-handlebars" data-json-feed="" data-preloader="overlay" data-init-onload="true"></div>
10425 </div>
10426 </div>
10427 @*End of Products Loop *@
10428 <div class="modal__content bs-px-3 rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div>
10429 @*Start of the Messaging Loop*@
10430 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div>
10431 <div class="rma-page__write-comment">
10432 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea>
10433 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center">
10434 @*<label for="file-input">
10435 <img width="19" height="38" src="/Files/Images/attachment.svg" />
10436 </label>*@
10437 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" />
10438 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button>
10439 <span id="file-input-error" style="display:none">@Translate("Wrong file")</span>
10440 </div>
10441 </div>
10442 <footer class="modal__rma-footer">
10443 <div class="footer__buttons">
10444 @if (isCompanyKraemer)
10445 {
10446 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect">
10447 @*<option value="1">@Translate("STATUS_1")</option>*@
10448 <option value="2" default selected>@Translate("STATUS_2")</option>
10449 <option value="3">@Translate("STATUS_3")</option>
10450 <option value="4">@Translate("STATUS_4")</option>
10451 </select>
10452 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button>
10453 }
10454 else
10455 {
10456 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenRmaModal">@Translate("Re-open Deviation")</button>
10457 <div class="bs-modal bs-fade" id="reopenRmaModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
10458 <div class="modal-dialog bs-mt-4">
10459 <div class="modal-content bs-border-primary-dark bs-bg-sand-light">
10460 <div class="modal-body bs-pb-0 bs-text-center">
10461 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6">
10462 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3>
10463 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p>
10464 </div>
10465 </div>
10466 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3">
10467 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button>
10468 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button>
10469 </div>
10470 </div>
10471 </div>
10472 </div>
10473
10474 }
10475 </div>
10476 <div class="modal__rma-footer-icon-buttons">
10477 </div>
10478 </footer>
10479 </form>
10480 <script>
10481 let applyReasonTranslation = ()=>{
10482 document.querySelectorAll(".reasonTranslation").forEach(el =>{
10483 let reason = el.innerHTML;
10484 switch (reason){
10485
10486 case "REASON_0":
10487 el.innerHTML = `@Translate("REASON_0")`;
10488 break;
10489 case "REASON_1":
10490 el.innerHTML = `@Translate("REASON_1")`;
10491 break;
10492 case "REASON_2":
10493 console.log("REASON_2")
10494 el.innerHTML = `@Translate("REASON_2")`;
10495 break;
10496 case "REASON_3":
10497 el.innerHTML = `@Translate("REASON_3")`;
10498 break;
10499 case "REASON_4":
10500 console.log("REASON_4")
10501 el.innerHTML = `@Translate("REASON_4")`;
10502 break;
10503 case "REASON_5":
10504 el.innerHTML = `@Translate("REASON_5")`;
10505 break;
10506 case "REASON_6":
10507 el.innerHTML = `@Translate("REASON_6")`;
10508 break;
10509 }
10510 })
10511 }
10512 let applyStatusTranslation = ()=>{
10513 document.querySelectorAll(".statusTranslation").forEach(el =>{
10514 let status = el.innerHTML;
10515 switch (status){
10516 case "STATUS_0":
10517 el.innerHTML = `@Translate("STATUS_0")`;
10518 break;
10519 case "STATUS_1":
10520 el.innerHTML = `@Translate("STATUS_1")`;
10521 break;
10522 case "STATUS_2":
10523 console.log("STATUS_2")
10524 el.innerHTML = `@Translate("STATUS_2")`;
10525 break;
10526 case "STATUS_3":
10527 el.innerHTML = `@Translate("STATUS_3")`;
10528 break;
10529 case "STATUS_4":
10530 console.log("STATUS_4")
10531 el.innerHTML = `@Translate("STATUS_4")`;
10532 break;
10533 case "STATUS_5":
10534 el.innerHTML = `@Translate("STATUS_5")`;
10535 break;
10536 case "STATUS_6":
10537 el.innerHTML = `@Translate("STATUS_6")`;
10538 break;
10539 }
10540 })
10541 }
10542 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10543 applyReasonTranslation();
10544 })
10545 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10546 applyReasonTranslation();
10547 })
10548 document.getElementById("Rma-Order-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10549 applyStatusTranslation();
10550 })
10551 document.getElementById("Rma-Order-Details-handlebars-container-first-row").addEventListener('contentLoaded', function (e) {
10552 applyStatusTranslation();
10553 })
10554 document.getElementById("Rma-Order-Details-handlebars-container-second-row").addEventListener('contentLoaded', function (e) {
10555 applyStatusTranslation();
10556 applyReasonTranslation();
10557 })
10558 </script>
10559 <script id="Rma-Details-handlebars" type="text/x-template">
10560
10561 {{#.}}
10562 <div class="u-hidden deviationIdDiv">{{deviationId}}</div>
10563 <div class="rma-products-list bs-border-bottom">
10564 <div class="rma-details-page__header-grid-container">
10565 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center">
10566 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" />
10567 </div>
10568 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row align-items-center">
10569 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10570 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div>
10571 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="1111111">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div>
10572 </div>
10573 </div>
10574 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div>
10575 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10576 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10577 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationOrderLineTotalPrice}}</div>
10578 </div>
10579
10580 <div class="grid">
10581 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center">
10582 </div>
10583 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start">
10584 <div class="rma-product-info-container">
10585 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div>
10586 <div class="rma-product-details d-flex u-flex--row align-items-center">
10587 {{#each messages}}
10588 {{message}}
10589 {{/each}}
10590 </div>
10591 </div>
10592 </div>
10593 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row bs-align-items-start">
10594 <div class="rma-product-info-container">
10595 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div>
10596 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div>
10597 </div>
10598 </div>
10599 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center"></div>
10600 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start">
10601 <div class="rma-product-info-container">
10602 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div>
10603 <div class="bs-d-flex bs-gap-2 bs-flex-wrap">
10604 {{#each messages}}
10605 {{#each messageFiles}}
10606 @*
10607 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div>
10608 *@ <a href="{{messageFile}}" target="_blank">
10609 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10610 </a>
10611 {{/each}}
10612 {{/each}}
10613 </div>
10614 </div>
10615 </div>
10616 </div>
10617 </div>
10618 {{/.}}
10619 </script>
10620 <script id="Rma-Details-messaging-handlebars" type="text/x-template">
10621 {{#.}}
10622 <div class="d-grid">
10623 {{#if isCustomer}}
10624 <div class="rma-page__user-message">
10625 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10626 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10627 <div class="rma-page__message-date ">{{messageDate}}</div>
10628 </div>
10629 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10630 <div class="rma-page__attachment-footer">
10631 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer">
10632 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10633 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank">
10634 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10635 </a> {{/each}}
10636 </a>
10637 </div>
10638 </div>
10639 {{else}}
10640 <div class="rma-page__admin-message">
10641 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10642 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10643 <div class="rma-page__message-date ">{{messageDate}}</div>
10644 </div>
10645 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10646 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap">
10647
10648 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10649 {{#each messageFiles}}
10650 <a href="{{messageFile}}" target="_blank">
10651 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10652 </a>
10653 {{/each}}
10654 </div>
10655 </div>
10656 {{/if}}
10657 </div>
10658
10659 {{/.}}
10660 </script>
10661 <script id="Rma-Order-Details-handlebars" type="text/x-template">
10662 {{#.}}
10663 <div class="rma-selected-order-info-data bs-mt-3 bs-px-5 bs-grid">
10664 <div class="cell g-col-6 g-col-md-3">
10665 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div>
10666 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}} " class="bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div>
10667 </div>
10668 <div class="cell g-col-6 g-col-md-3">
10669 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div>
10670 <div class="">{{formatDate createdDate}}</div>
10671 </div>
10672 <div class="cell g-col-6 g-col-md-3">
10673 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div>
10674 <div class=" statusTranslation">STATUS_{{status}}</div>
10675 </div>
10676 <div class="cell g-col-6 g-col-md-3">
10677 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div>
10678 <div class="">{{formatDate updatedDate}}</div>
10679 </div>
10680 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
10681 <div class="bs-d-flex">
10682 <div class="toast-body">
10683 @Translate("You can only view your own orders")
10684 </div>
10685 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10686 </div>
10687 </div>
10688 </div>
10689
10690 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10691 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" />
10692 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10693 <input type="hidden" id="SelectedStatus" value="{{status}}" />
10694 <div class="deviationId-header u-hidden">{{deviationId}}</div>
10695 {{/.}}
10696 </script>
10697 }
10698
10699 @helper RmaViewDetailsFullOrder()
10700 {
10701 var company = Model.CurrentUser.Company;
10702 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
10703
10704 <form class="rma-modal__container">
10705
10706 <header class="u-flex u-flex--row rma-modal__header bs-d-flex bs-flex-wrap">
10707 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10708 <div class="rma-order-number rma-view-details-full-order__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div>
10709 </header>
10710 <input type="hidden" id="SelectedDeviationId" value="" />
10711 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" />
10712 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" />
10713 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-first-row" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div>
10714
10715 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-second-row" data-template="Rma-Order-Details-handlebars-second-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div>
10716
10717 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-third-row" data-template="Rma-Order-Details-handlebars-third-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div>
10718 <div class="bs-grid">
10719 <div class="rma-selected-order-info g-col-12 g-col-md-6 bs-my-5 bs-px-2 bs-px-md-6">
10720 <div class="bs-mb-3 bs-fs-5 fw-700">@Translate("Ordredetaljer")</div>
10721 <div class="orderInfo d-flex bs-justify-content-between">
10722 <p class="bs-mb-2 bs-fs-5 fw-bold">@Translate("Antall produktlinjer")</p>
10723 <p class="bs-mb-2 bs-fs-5 rma-form-total-orderlines">7</p>
10724 </div>
10725 <div class="orderInfo d-flex bs-justify-content-between">
10726 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Totalt antall produkter")</p>
10727 <p class="bs-mb-2 bs-fs-5 rma-form-total-quantity">289</p>
10728 </div>
10729 <div class="orderInfo d-flex bs-justify-content-between">
10730 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Ordretotal eks. MVA")</p>
10731 <p class="bs-mb-2 bs-fs-5 rma-form-total-amount">7324,54 kr</p>
10732 </div>
10733 </div>
10734 </div>
10735 <div class="modal__content rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div>
10736 @*Start of the Messaging Loop*@
10737 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container-full-order" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div>
10738 <div class="rma-page__write-comment">
10739 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea>
10740 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center">
10741 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" />
10742 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button>
10743 <span id="file-input-error2" style="display:none">@Translate("Wrong file")</span>
10744 </div>
10745 </div>
10746 <footer class="modal__rma-footer">
10747 <div class="footer__buttons">
10748 @if (isCompanyKraemer)
10749 {
10750 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect">
10751 @*<option value="1">@Translate("STATUS_1")</option>*@
10752 <option value="2" default selected>@Translate("STATUS_2")</option>
10753 <option value="3">@Translate("STATUS_3")</option>
10754 <option value="4">@Translate("STATUS_4")</option>
10755 </select>
10756 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button>
10757 }
10758 else
10759 {
10760 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenFullOrder">@Translate("Re-open Deviation")</button>
10761 @*
10762 <button class="submit-deviation-state bs-btn bs-btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal" >@Translate("Modal Test")</button>
10763 *@
10764 <div class="bs-modal bs-fade" id="reopenFullOrder" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
10765 <div class="modal-dialog bs-mt-4">
10766 <div class="modal-content bs-border-primary-dark bs-bg-sand-light">
10767 <div class="modal-body bs-pb-0 bs-text-center">
10768 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6">
10769 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3>
10770 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p>
10771 </div>
10772 </div>
10773 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3">
10774 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button>
10775 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button>
10776 </div>
10777 </div>
10778 </div>
10779 </div>
10780 }
10781 </div>
10782 <div class="modal__rma-footer-icon-buttons">
10783 </div>
10784 </footer>
10785 </form>
10786
10787 <script id="Rma-Details-handlebars" type="text/x-template">
10788
10789 {{#.}}
10790 <div class="u-hidden deviationIdDiv">{{deviationId}}</div>
10791 <div class="rma-products-list bs-border-bottom">
10792 <div class="rma-details-page__header-grid-container">
10793 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center">
10794 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" />
10795 </div>
10796 <div class=" rma-page__grid-table-cell rma-details__name vertical-align-center d-flex u-flex--row align-items-center">
10797 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10798 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div>
10799 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="222222222">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div>
10800 </div>
10801 </div>
10802 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div>
10803 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10804 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10805 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{deviationOrderLineTotalPrice}}</div>
10806 </div>
10807 <div class="rma-details-page__header-grid-container">
10808 <div class="rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"></div>
10809 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10810 <div class="rma-product-info-container">
10811 <div class="fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div>
10812 <div class="rma-product-details d-flex u-flex--row align-items-center">
10813 {{#each messages}}
10814 {{message}}
10815 {{/each}}
10816 </div>
10817 </div>
10818 </div>
10819 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10820 <div class="rma-product-info-container">
10821 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div>
10822 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div>
10823 </div>
10824 </div>
10825 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center"></div>
10826 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10827 <div class="rma-product-info-container">
10828 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div>
10829 <div class="bs-d-flex bs-gap-2 bs-flex-wrap">
10830 {{#each messages}}
10831 {{#each messageFiles}}
10832 @*
10833 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div>
10834 *@ <a href="{{messageFile}}" target="_blank">
10835 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10836 </a>
10837 {{/each}}
10838 {{/each}}
10839 </div>
10840 </div>
10841 </div>
10842 </div>
10843 </div>
10844 {{/.}}
10845 </script>
10846 <script id="Rma-Details-messaging-handlebars" type="text/x-template">
10847 {{#.}}
10848 <div class="d-grid">
10849 {{#if isCustomer}}
10850 <div class="rma-page__user-message">
10851 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10852 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10853 <div class="rma-page__message-date ">{{messageDate}}</div>
10854 </div>
10855 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10856 <div class="rma-page__attachment-footer">
10857 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer">
10858 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10859 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank">
10860 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10861 </a> {{/each}}
10862 </a>
10863 </div>
10864 </div>
10865 {{else}}
10866 <div class="rma-page__admin-message">
10867 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10868 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10869 <div class="rma-page__message-date ">{{messageDate}}</div>
10870 </div>
10871 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10872 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap">
10873
10874 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10875 {{#each messageFiles}}
10876 <a href="{{messageFile}}" target="_blank">
10877 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10878 </a>
10879 {{/each}}
10880 </div>
10881 </div>
10882
10883 {{/if}}
10884 </div>
10885
10886 {{/.}}
10887 </script>
10888 <script id="Rma-Order-Details-handlebars" type="text/x-template">
10889 {{#.}}
10890 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10891 <input type="hidden" id="OrderLocation" value="{{orderLocation}}" />
10892 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10893 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10894 <div class="cell g-col-6 g-col-md-3">
10895 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div>
10896 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}}" data-customer-number="{{customerNumber}}" class="rma-order-header-info bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div>
10897 </div>
10898 <div class="cell g-col-6 g-col-md-3">
10899 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div>
10900 <div class="">{{formatDate createdDate}}</div>
10901 </div>
10902 <div class="cell g-col-6 g-col-md-3">
10903 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div>
10904 <div class=" statusTranslation">STATUS_{{status}}</div>
10905 </div>
10906 <div class="cell g-col-6 g-col-md-3">
10907 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div>
10908 <div class="">{{formatDate updatedDate}}</div>
10909 </div>
10910 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
10911 <div class="bs-d-flex">
10912 <div class="toast-body">
10913 @Translate("You can only view your own orders")
10914 </div>
10915 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10916 </div>
10917 </div>
10918 </div>
10919
10920 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10921 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" />
10922 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10923 <div class="deviationId-header u-hidden">{{deviationId}}</div>
10924 {{/.}}
10925 </script>
10926
10927 <script id="Rma-Order-Details-handlebars-second-row" type="text/x-template">
10928 {{#.}}
10929
10930 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10931 <div class="cell g-col-6 g-col-md-3">
10932 <div class="bs-fw-bold bs-mb-3">@Translate("Avviksårsak")</div>
10933 <div class="reasonTranslation">REASON_{{reason}}</div>
10934 </div>
10935 <div class="cell g-col-6 g-col-md-3">
10936 <div class="bs-fw-bold bs-mb-3">@Translate("S/O")</div>
10937 <div class="">{{orderShopReference}}</div>
10938 </div>
10939 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}">
10940 </div>
10941 {{/.}}
10942 </script>
10943
10944 <script id="Rma-Order-Details-handlebars-third-row" type="text/x-template">
10945 {{#.}}
10946 <div class="rma-selected-order-info bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10947 <div class="cell g-col-12 g-col-md-6">
10948 <div class="bs-fw-bold bs-mb-3">@Translate("Vedlegg")</div>
10949 <div class="bs-d-flex bs-flex-row bs-flex-wrap bs-gap-3">
10950 {{#each messages}}{{#each messageFiles}}
10951 <a href="{{messageFile}}" target="_blank">
10952 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" />
10953 </a>
10954 {{/each}}{{/each}}
10955 </div>
10956 </div>
10957
10958 <div class="cell g-col-6 g-col-md-3">
10959 <div class="bs-fw-bold bs-mb-3">@Translate("Kommentar")</div>
10960 <div class="">{{#each messages}}{{message}}{{/each}}</div>
10961 </div>
10962 <div class="cell g-col-6 g-col-md-3">
10963 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket utfall")</div>
10964 <div class="">{{requestedOutcome}}</div>
10965 </div>
10966 </div>
10967 {{/.}}
10968 </script>
10969
10970 }
10971
10972 @helper ViewOrderDetails2()
10973 {
10974 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser();
10975 var cartPageId = GetPageIdByNavigationTag("CartPage");
10976 string dwAPIToken = "";
10977 if (currentUserAccess != null)
10978 {
10979 dwAPIToken = JwtService.GetToken(currentUserAccess, 86400);
10980 }
10981 <form class="rma-modal__container">
10982 <header class="modal-header bs-bg-sand-light bs-justify-content-start">
10983 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" alt="Kraemer logo" />
10984 <div class="rma-order-number">@Translate("TAKK FOR DIN ORDRE!")</div>
10985 </header>
10986
10987 <div class="js-handlebars-root modal-body" id="Order-Header-Details-handlebars-container" data-template="Order-Header-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div>
10988
10989 <div class="modal-body bs-pt-0">
10990 <div class="modal__content rma-page_table-header bs-mt-3 bs-my-lg-3">
10991 <div class="order-history-header bs-fw-bold bs-border-bottom bs-border-primary-dark">
10992 <div class="cell bs-d-none bs-d-lg-block"></div>
10993 <div class="cell">@Translate("Produkt")</div>
10994 <div class="cell bs-d-none bs-d-lg-block">@Translate("Kommentar")</div>
10995 <div class="cell">@Translate("Antall")</div>
10996 <div class="cell">@Translate("Pris")</div>
10997 <div class="cell">@Translate("Total Eks. MVA")</div>
10998 </div>
10999 </div>
11000 @*// products loop *@
11001 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Order-Details-handlebars-container" data-template="Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div>
11002 </div>
11003 <div data-message="error-order-does-not-exist" data-bs-delay="1800" class="toast bs-align-items-center bs-px-3 bs-mx-auto bs-bg-danger bs-text-light bs-border-0 bs-w-75 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true">
11004 <div class="bs-d-flex">
11005 <div class="toast-body">
11006 @Translate("This order is not yet available to create a RMA.")
11007 </div>
11008 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
11009 </div>
11010 </div>
11011 <footer class="modal__rma-footer bs-py-4 bs-justify-content-end orderHistory-footer">
11012 @*<button class="submit-rma-button" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'))">@Translate("Opprett Avvik")</button>*@
11013 <div class="modal__rma-footer-icon-buttons">
11014 <a class="rma-page__icon-buttons bs-mx-2 openRmaModalButton bs-ms-0" title="@Translate("HOVER_StartDeviation")" onclick="openRMAModal('OrderSelected')">
11015 <img height="26" width="26" src="/Files/Images/UnionRMA-icon.svg" />
11016 </a>
11017 @*<a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button
11018 open-full-favorite-list-button" data-token="@dwAPIToken" onclick="showFavoriteListsForFullOrder(this,
11019 true)" title="@Translate("HOVER_FavouriteList")">
11020 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" />
11021 </a>*@
11022 @*<div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container')
11023 .classList.add('u-hidden');this.classList.add('bs-d-none');"></div>
11024 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border
11025 bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;z-index:1;">
11026 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3">
11027 </div>
11028 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary">
11029 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" />
11030 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button>
11031 </div>
11032 </div>*@
11033 <a class="rma-page__icon-buttons bs-mx-2" title="@Translate("HOVER_Download")">
11034 <img height="26" width="26" onclick="PrintElem(this.closest('form'))" src="/Files/Images/print-icon.svg" />
11035 </a>
11036 </div>
11037 </footer>
11038 </form>
11039 <script id="Order-Header-Details-handlebars" type="text/x-template">
11040
11041 <div class="bs-grid">
11042 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderId '===' null}} invisible {{else}} {{#ifCond orderId '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11043 <div class="bs-fw-bold bs-mb-3">@Translate("Ordre-ID")</div>
11044 <div class="" id="ModalOpenedOrderId" data-order-id="{{orderId}}">{{orderId}}</div>
11045 <input type="hidden" id="ModalOpenedUserId" value="@Model.CurrentUser.ID">
11046 </div>
11047 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDate '===' null}} invisible {{else}} {{#ifCond orderDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11048 <div class="bs-fw-bold bs-mb-3">@Translate("Bestillingsdato")</div>
11049 <div class="">{{formatDate orderDate}}</div>
11050 </div>
11051
11052 <div class="cell g-col-6 g-col-md-3 {{#ifCond theListName '===' null}} invisible {{else}} {{#ifCond theListName '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11053 <div class="bs-fw-bold bs-mb-3">@Translate("Handlekurv navn")</div>
11054 <div class="">{{orderCartName}}</div>
11055 </div>
11056 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderLocation '===' null}} invisible {{else}} {{#ifCond orderLocation '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11057 <div class="bs-fw-bold bs-mb-3">@Translate("Ordrelokasjon")</div>
11058 <div class="">{{orderLocation}}</div>
11059 </div>
11060 </div>
11061
11062 <div class="bs-grid">
11063 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPoNumber '===' null}} invisible {{else}} {{#ifCond orderPoNumber '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11064 <div class="bs-fw-bold bs-mb-3">@Translate("P.O. Nummer")</div>
11065 <div class="">{{orderPoNumber}}</div>
11066 </div>
11067 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDesiredDeliveryDate '===' null}} invisible {{else}} {{#ifCond orderDesiredDeliveryDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11068 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket leveringsdag")</div>
11069 <div class="">{{formatDate orderDesiredDeliveryDate}}</div>
11070 </div>
11071 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPurchaserName '===' null}} invisible {{else}} {{#ifCond orderPurchaserName '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11072 <div class="bs-fw-bold bs-mb-3">@Translate("Navn på kjøper")</div>
11073 <div class="">{{orderPurchaserName}}</div>
11074 </div>
11075 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDeliveryPlace '===' null}} invisible {{else}} {{#ifCond orderDeliveryPlace '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11076 <div class="bs-fw-bold bs-mb-3">@Translate("Leveringssted")</div>
11077 <div class="">{{orderDeliveryPlace}}</div>
11078 </div>
11079 </div>
11080 </script>
11081
11082 <script id="Order-Details-handlebars" type="text/x-template">
11083 {{#.}}
11084 <div class="order-history-item-container">
11085 <div class="order-history-item bs-py-2 {{#ifCond orderLineDiscontinued '!==' false}} disabled {{/ifCond}} bs-py-lg-0">
11086 <div class="cell bs-d-none bs-d-lg-block">
11087 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" class="img-fluid" alt="{{orderLineProductName}}" />
11088 </div>
11089 <div class="cell order-history-detail__name bs-justify-self">
11090 <div class="rma-product-info-container">
11091 <div class="bs-fw-bold bs-d-flex bs-align-items-center order-history-product-info" data-quantity="{{orderLineQuantity}}" data-product-number="{{orderLineProductNumber}}" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="order-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div>
11092 <div class="bs-d-none bs-d-lg-block {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div>
11093 <div class="bs-text-danger order-history-product-unavailable">{{#ifCond orderLineDiscontinued '!==' false}}@Translate("Denne varen er ikke lenger tilgjengelig"){{/ifCond}}</div>
11094 </div>
11095 </div>
11096 <div class="cell order-history-detail__comment bs-d-none bs-d-lg-block">{{orderLineComment}}</div>
11097 <div class="cell order-history-quantity-field" data-quantity={{orderLineQuantity}}>{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div>
11098 <div class="cell order-history-price">{{orderLinePricePerMeasurementUnit}}</div>
11099 <div class="cell">{{orderLineTotalPrice}} @*{{orderLinePriceUnit}}*@</div>
11100 <div class="cell bs-d-flex bs-flex-row" style="position: relative;">
11101 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button"
11102 onclick="showFavoriteListsForProduct(this)"
11103 data-product-number="{{orderLineProductNumber}}"
11104 data-quantity="1"
11105 title="@Translate("HOVER_FavouriteList")">
11106 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" class="popup-toggle" data-product-number="{{orderLineProductNumber}}" />
11107 </a>
11108 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container')
11109 .classList.add('u-hidden');"></div>
11110 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content; right: 38px; top: 7%; height: 200px; z-index: 99999999;">
11111 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3">
11112 @*<div class="bs-fs-5 favorite-list-item bs-list-group-item bs-list-group-item-action" data-list-id="ListID" onclick="addToShoppingList(this)">Example1</div>*@
11113 </div>
11114 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary">
11115 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" />
11116 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button>
11117 </div>
11118 </div>
11119 </div>
11120 </div>
11121 </div>
11122 {{/.}}
11123 </script>
11124 }
11125
11126
11127 @functions {
11128 public class ManifestIcon
11129 {
11130 public string src { get; set; }
11131 public string type { get; set; }
11132 public string sizes { get; set; }
11133 }
11134
11135 public class Manifest
11136 {
11137 public string name { get; set; }
11138 public string short_name { get; set; }
11139 public string start_url { get; set; }
11140 public string display { get; set; }
11141 public string background_color { get; set; }
11142 public string theme_color { get; set; }
11143 public List<ManifestIcon> icons { get; set; }
11144 }
11145 }
11146
11147 <!DOCTYPE html>
11148
11149 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
11150
11151
11152
11153 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
11154 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
11155
11156
11157
11158 @helper RenderMasterHead() {
11159 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList();
11160
11161 <head>
11162 <!-- Rapido version 3.3 -->
11163
11164 @RenderBlockList(subBlocks)
11165 </head>
11166 }
11167
11168 @helper RenderMasterMetadata() {
11169 var swatches = new Dynamicweb.Content.Items.ColorSwatchService();
11170 var brandColors = swatches.GetColorSwatch(1);
11171 string brandColorOne = brandColors.Palette["BrandColor1"];
11172
11173 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) {
11174 Manifest manifest = new Manifest
11175 {
11176 name = Model.Area.Item.GetItem("Settings").GetString("AppName"),
11177 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"),
11178 start_url = "/",
11179 display = "standalone",
11180 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"),
11181 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor")
11182 };
11183
11184 manifest.icons = new List<ManifestIcon> {
11185 new ManifestIcon {
11186 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11187 sizes = "192x192",
11188 type = "image/png"
11189 },
11190 new ManifestIcon {
11191 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11192 sizes = "512x512",
11193 type = "image/png"
11194 },
11195 new ManifestIcon {
11196 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11197 sizes = "1024x1024",
11198 type = "image/png"
11199 }
11200 };
11201
11202 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json");
11203 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest);
11204 string currentManifest = File.ReadAllText(manifestFilePath);
11205
11206 if (manifestJSON != currentManifest)
11207 {
11208 File.WriteAllText(manifestFilePath, manifestJSON);
11209 }
11210 }
11211
11212 <meta charset="utf-8" />
11213 <title>@Model.Title</title>
11214 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
11215 <meta name="robots" content="index, follow">
11216 <meta name="theme-color" content="@brandColorOne" />
11217
11218 if (!Model.MetaTags.Contains("og:image")) {
11219 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")));
11220 }
11221
11222 if (!Model.MetaTags.Contains("og:description")) {
11223 Pageview.Meta.AddTag("og:description", Model.Description);
11224 }
11225
11226 Pageview.Meta.AddTag("og:title", Model.Title);
11227 Pageview.Meta.AddTag("og:site_name", Model.Name);
11228 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString());
11229 Pageview.Meta.AddTag("og:type", "Website");
11230 Pageview.Meta.AddTag("fb:page_id", Model.ID.ToString());
11231
11232 @Model.MetaTags
11233 }
11234
11235 @helper RenderMasterCss() {
11236 var fonts = new string[] {
11237 getFontFamily("Layout", "HeaderFont"),
11238 getFontFamily("Layout", "SubheaderFont"),
11239 getFontFamily("Layout", "TertiaryHeaderFont"),
11240 getFontFamily("Layout", "BodyText"),
11241 getFontFamily("Layout", "Header", "ToolsFont"),
11242 getFontFamily("Layout", "Header", "NavigationFont"),
11243 getFontFamily("Layout", "MobileNavigation", "Font"),
11244 getFontFamily("ProductList", "Facets", "HeaderFont"),
11245 getFontFamily("ProductPage", "PriceFontDesign"),
11246 getFontFamily("Ecommerce", "SaleSticker", "Font"),
11247 getFontFamily("Ecommerce", "NewSticker", "Font"),
11248 getFontFamily("Ecommerce", "CustomSticker", "Font")
11249 };
11250
11251 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
11252 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
11253 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
11254 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css";
11255 if (useFontAwesomePro)
11256 {
11257 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css";
11258 }
11259
11260 bool movetoproduction = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("movetoproduction")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("movetoproduction")) : false;
11261
11262 //Favicon
11263 <link href="@favicon" rel="icon" type="image/png">
11264
11265 //Base (Default, wireframe) styles
11266 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
11267
11268 //Rapido Css from Website Settings
11269 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css">
11270
11271 //Ignite Css (Custom site specific styles)
11272 //<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=25">
11273
11274 /*TODO remove and compile css*/
11275 @* <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/custom.css?v=22"> *@
11276 //Font awesome
11277 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css">
11278
11279 //Flag icon
11280 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css">
11281
11282 //Google fonts
11283 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)));
11284
11285 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
11286 bool featureFlagCSSFramework = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("feature")) && HttpContext.Current.Request.QueryString.Get("feature") == "cssframework";
11287 /*if (featureFlagCSSFramework)
11288 {*/
11289
11290 var cssStyleFileInfo = new System.IO.FileInfo(Dynamicweb.Core.SystemInformation.MapPath("/Files/Templates/Designs/Rapido/dist/app.bundle.css"));
11291 // <link rel="stylesheet" type="text/css" href="@autoCssBundleLink">
11292 <link href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?@cssStyleFileInfo.LastWriteTime.Ticks" rel="stylesheet" media="all" type="text/css">
11293 @*}
11294 else
11295 {
11296 <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css">
11297
11298 }*@
11299 }
11300
11301 @helper RenderMasterManifest() {
11302 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")))
11303 {
11304 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json">
11305 PushPromise("/Files/Templates/Designs/Rapido/manifest.json");
11306 }
11307 }
11308
11309 @helper RenderMasterBody() {
11310 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList();
11311 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : "";
11312 if (!String.IsNullOrEmpty(designLayout)) {
11313 designLayout = "class=\"" + designLayout + "\"";
11314 }
11315
11316 List<int> pages = new List<int>();
11317 pages.Add(GetPageIdByNavigationTag("RecipeBank"));
11318 pages.Add(GetPageIdByNavigationTag("DeviationsHistoryPage"));
11319 pages.Add(GetPageIdByNavigationTag("MenuView"));
11320 pages.Add(GetPageIdByNavigationTag("MenuCalendarView"));
11321 pages.Add(GetPageIdByNavigationTag("ShoppingList"));
11322 pages.Add(GetPageIdByNavigationTag("CustomerOrders"));
11323 pages.Add(GetPageIdByNavigationTag("MenuCreationView"));
11324 List<int> availablePages = pages.Where(x=>x!=0).ToList();
11325
11326 int currentPage = Pageview?.ID ?? 0;
11327 bool pageHasWhiteBackground = availablePages.Contains(currentPage);
11328
11329 <body @designLayout OnKeyPress="return disableEnterKey(event)" data-preloader-text='@Translate("loader reordering")' data-test="@Dynamicweb.Ecommerce.Common.Context.LanguageID" style="--comm-background: @(pageHasWhiteBackground ? "#FFF" : "#F9F7F6")">
11330 @RenderBlockList(subBlocks)
11331 </body>
11332 }
11333
11334 @helper RenderMasterHeader()
11335 {
11336 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
11337 //bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11338 bool isNavigationStickyMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11339 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
11340
11341 <header class="top-container @stickyTop dw-mod u-no-print" id="Top">
11342 @RenderBlockList(subBlocks)
11343 </header>
11344 }
11345
11346 @helper RenderMain()
11347 {
11348 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
11349
11350 <main class="site dw-mod">
11351 @RenderBlockList(subBlocks)
11352 </main>
11353 }
11354
11355 @helper RenderPageContent()
11356 {
11357 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11358 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
11359 var cartPageUrl = GetPageIdByNavigationTag("CartPage");
11360
11361 <div id="Page" class="page @pagePos" data-cart-url="@cartPageUrl">
11362 <div id="content">
11363 @RenderSnippet("Content")
11364 </div>
11365 </div>
11366 }
11367
11368 @* Hack to support nested helpers *@
11369 @SnippetStart("Content")
11370 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
11371 @using WebApp.Singleton;
11372
11373 @{
11374 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
11375 var shipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner").Value;
11376 var onlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse").Value.ToString();
11377 var mode = HttpContext.Current.Request["mode"];
11378 var languageId = Dynamicweb.Ecommerce.Common.Context.LanguageID;
11379
11380
11381 var serverDataJson = mode == "quicksearch"
11382 ? Newtonsoft.Json.JsonConvert.SerializeObject(new
11383 {
11384 RootGroupId = "",
11385 RootGroupName = ""
11386 })
11387 :
11388 Newtonsoft.Json.JsonConvert.SerializeObject(new
11389 {
11390 RootGroupId = HttpContext.Current.Request["GroupId"],
11391 RootGroupName = string.IsNullOrWhiteSpace(HttpContext.Current.Request["GroupName"])
11392 ? new Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService().GetById(HttpContext.Current.Request["GroupId"], languageId, shipOwner?.ToString() == "26300").Name
11393 : HttpContext.Current.Request["GroupName"],
11394 });
11395 }
11396
11397
11398
11399 @*needed for proper navigation translationds*@
11400 @if (shipOwner?.ToString() == "26300")
11401 {
11402 <input type="hidden" id="shipOwnerValue" value="" />
11403 }
11404
11405 @if (onlySeeDiverse?.ToString() == "True")
11406 {
11407 <input type="hidden" id="OnlySeeDiverse" value="" />
11408 }
11409
11410 <div class="content-container" >
11411 <div
11412 id="productListApp"
11413 style="padding-top: 30px;" data-server='@serverDataJson'
11414 class="content-row content-row--full content-row--column-gap-xl content-row--center content-row--height-auto content-row--spacing-none">
11415 </div>
11416 </div>
11417
11418 @SnippetEnd("Content")
11419
11420 @helper RenderIosTabletFix() {
11421
11422 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios)
11423 {
11424 <script>
11425 var cartPageUrl = document.querySelector("#Page").getAttribute("data-cart-url");
11426 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream;
11427 if (isIpadIOS) {
11428 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&";
11429 var isCheckout = (window.location.href.indexOf(cartPageUrl) > -1) ? true : false;
11430 if(isCheckout) {
11431 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios&CartV2.GotoStep1=true";
11432 } else {
11433 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios";
11434 }
11435 }
11436 </script>
11437 }
11438 }
11439
11440 </html>
11441
11442 <script>
11443 function disableEnterKey(e)
11444 {
11445 var key;
11446 if(window.event)
11447 key = window.event.keyCode; //IE
11448 else
11449 key = e.which; //firefox
11450
11451 return (key != 13);
11452 }
11453 </script>