Error executing template "Designs/Rapido/_parsed/Kraemer_ProductList.parsed.cshtml"
System.InvalidOperationException: Invalid attempt to read when no data is present.
at System.Data.SqlClient.SqlDataReader.CheckDataIsReady(Int32 columnIndex, Boolean allowPartiallyReadColumn, Boolean permitAsync, String methodName)
at System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn)
at System.Data.SqlClient.SqlDataReader.GetString(Int32 i)
at Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService.GetById(String groupId, String languageId)
at CompiledRazorTemplates.Dynamic.RazorEngine_7f14ab9388c749fb898e79d90abcc7b0.Execute() in D:\dynamicweb.net\Solutions\Degree\kraemer.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Kraemer_ProductList.parsed.cshtml:line 11330
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
4476 @helper RenderMobileNavigationOldWebshop()
4477 {
4478 <li class="menu-mobile__item">
4479 <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">
4480 <i class="fas fa-shopping-basket u-margin-right"></i> @Translate("Old Webshop")
4481 </a>
4482 </li>
4483 }
4484
4485 @helper RenderMobileNavigationCreateAccountAction()
4486 {
4487 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4488
4489 <li class="menu-mobile__item">
4490 <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>
4491 </li>
4492 }
4493
4494 @helper RenderMobileNavigationProfileAction()
4495 {
4496 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4497 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4498 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4499 string myProfilePageLink = linkStart + myProfilePageId;
4500
4501 <li class="menu-mobile__item">
4502 <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">
4503 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @Translate("My Profile")
4504 </a>
4505 </li>
4506 }
4507
4508 @helper RenderMobileNavigationOrdersAction()
4509 {
4510 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4511 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4512 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4513 int myReportsPageId = GetPageIdByNavigationTag("MyReports");
4514 int deviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage");
4515 int announcementPageId = GetPageIdByNavigationTag("Announcements");
4516 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList");
4517 int foodCalendarPageId = GetPageIdByNavigationTag("MenuView");
4518 int foodCalendarAdminPageId = GetPageIdByNavigationTag("MenuCalendarView");
4519 string announcementPageLink = linkStart + announcementPageId;
4520 string myOrdersPageLink = linkStart + myOrdersPageId;
4521 string myReportsPageLink = linkStart + myReportsPageId;
4522 string myDeviationsPageLink = linkStart + deviationsPageId;
4523 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4524 string foodCalendarPageLink = linkStart + foodCalendarPageId;
4525 string foodCalendarAdminPageLink = linkStart + foodCalendarAdminPageId;
4526 //string ordersIcon = "fas fa-list";
4527 var user = Pageview.User;
4528 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false;
4529 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false;
4530 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty;
4531 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty;
4532 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false;
4533 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : "";
4534 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : "";
4535 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false;
4536
4537 <li class="menu-mobile__item">
4538 <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">
4539 <img width="20" height="20" src="/Files/Images/favorite-list-svg.svg"> @Translate("My Favorites")
4540 </a>
4541 </li>
4542 <li class="menu-mobile__item">
4543 <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">
4544 <img width="20" height="20" src="/Files/Images/order-history-svg.svg"> @Translate("My Orders")
4545 </a>
4546 </li>
4547 if (hasAccessToAnnouncements)
4548 {
4549 <li class="menu-mobile__item">
4550 <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")">
4551 <img width="22" height="22" src="/Files/Images/notifications.svg">
4552 <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">
4553 <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"/>
4554 </svg>
4555 @Translate("Announcements")
4556 </a>
4557 </li>
4558 }
4559 if (hasAccessToFoodCalendar)
4560 {
4561 <li class="menu-mobile__item">
4562 <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">
4563 <img width="20" height="20" src="/Files/Images/food-calendar.svg"> @Translate("Matretter")
4564 </a>
4565 </li>
4566 }
4567
4568 if (isFoodCalendarAdmin)
4569 {
4570 <li class="menu-mobile__item">
4571 <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">
4572 <img width="20" height="20" src="/Files/Images/food-calendar-menu-calendar.svg"> @Translate("Kalendervisning")
4573 </a>
4574 </li>
4575 }
4576
4577 <li class="menu-mobile__item">
4578 <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">
4579 <img width="20" height="20" src="/Files/Images/UnionRMA-icon.svg"> @Translate("My Deviations")
4580 </a>
4581 </li>
4582
4583 if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport)
4584 {
4585 <li class="menu-mobile__item">
4586 <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">
4587 <img width="20" height="20" src="/Files/Images/IconPowerBi.svg"> @Translate("My reports")
4588 </a>
4589 </li>
4590 }
4591
4592
4593 }
4594
4595
4596 @helper RenderMobileNavigationSavedCardsAction()
4597 {
4598 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4599 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4600 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4601 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4602 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";
4603
4604 <li class="menu-mobile__item">
4605 <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>
4606 </li>
4607 }
4608
4609 @helper RenderMobileNavigationSignOutAction()
4610 {
4611 int pageId = Model.TopPage.ID;
4612 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";
4613 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null;
4614 bool promptForAccount = false;
4615
4616 if(userCustomFields != null) {
4617 foreach (var field in userCustomFields)
4618 {
4619 if (field.CustomField.SystemName == "AccessUser_PromptForAccount")
4620 {
4621 promptForAccount = field.Value.ToString() == "True";
4622 }
4623 }
4624 }
4625 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
4626 {
4627 <li class="menu-mobile__item">
4628 <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>
4629 </li>
4630 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
4631 {
4632 if(promptForAccount) {
4633 <li class="menu-mobile__item">
4634 <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>
4635 </li>
4636 } else {
4637 <li class="menu-mobile__item">
4638 <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>
4639 </li>
4640 }
4641
4642 } else {
4643 <li class="menu-mobile__item">
4644 <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>
4645 </li>
4646 }
4647 @* <li class="menu-mobile__item">
4648 <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>
4649 </li>*@
4650 }
4651
4652 @helper RenderMobileNavigationLanguagesAction()
4653 {
4654 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4655 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() : "";
4656 string selectedLanguage = "";
4657 foreach (var lang in Model.Languages)
4658 {
4659 var language = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
4660 var languageTitle = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(language.ToLower());
4661
4662 if (lang.IsCurrent)
4663 {
4664 selectedLanguage = languageTitle;
4665 }
4666 }
4667
4668 <li class="menu-mobile__item dw-mod">
4669 @if (isSlidesDesign)
4670 {
4671 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);">
4672 }
4673 else
4674 {
4675 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
4676 }
4677 <div class="menu-mobile__link__wrap">
4678 <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>
4679 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
4680 </div>
4681 <ul class="menu-mobile menu-mobile__submenu expand-menu">
4682 @if (isSlidesDesign)
4683 {
4684 <li class="menu-mobile__item dw-mod">
4685 <div class="menu-mobile__link__wrap">
4686 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" />
4687 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
4688 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
4689 </div>
4690 </li>
4691 }
4692 @*foreach (var lang in Model.Languages)
4693 {
4694 <li class="menu-mobile__item dw-mod">
4695 <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>
4696 </li>
4697 }*@
4698
4699 @foreach (var lang in Model.Languages)
4700 {
4701 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower();
4702 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name;
4703 string cultureName = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
4704 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
4705 var language = Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName.Split('(')[0].Trim();
4706
4707
4708 if (languageViewType == "flag-culture")
4709 {
4710 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName;
4711 }
4712
4713 if (languageViewType == "flag")
4714 {
4715 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>";
4716 }
4717
4718 if (languageViewType == "name")
4719 {
4720 langInfo = lang.Name;
4721 }
4722
4723 if (languageViewType == "culture")
4724 {
4725 langInfo = cultureName;
4726 }
4727
4728 <li class="menu-mobile__item dw-mod">
4729 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@langInfo</a>
4730 </li>
4731 }
4732 </ul>
4733 </li>
4734 }
4735
4736
4737
4738
4739 @helper RenderCustomSelectCartsAndImpersonation()
4740 {
4741 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed");
4742 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
4743 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
4744
4745 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
4746 string userName = userExists ? getUserName(Pageview.User) : "";
4747 int secondaryUsersCount = Model.SecondaryUsers.Count;
4748
4749 @*if (userExists)
4750 {
4751 <div class="u-max-w260px u-margin-left--lg u-margin-top--lg u-margin-bottom--lg">
4752 <span>@Translate("Handlekurv")</span>
4753 <div class="dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div>
4754 <div class="dw-mod">
4755 @Render(new Button
4756 {
4757 Title = Translate("Change Cart Name"),
4758 ButtonType = ButtonType.Button,
4759 ButtonLayout = ButtonLayout.None,
4760 CssClass = "u-margin-bottom change-cart-name",
4761 OnClick = "changeCartName()"
4762 })
4763 @Render(new Button
4764 {
4765 Title = Translate("Create New Cart"),
4766 ButtonType = ButtonType.Button,
4767 ButtonLayout = ButtonLayout.Primary,
4768 CssClass = "u-full-width",
4769 OnClick = "document.getElementById('NewCartModalTrigger').checked = true"
4770 })
4771 </div>
4772 </div>
4773 }*@
4774 <div class="u-max-w260px u-margin-left--lg">
4775 @if (secondaryUsersCount > 0)
4776 {
4777 @RenderDesktopToolsTextMobile()
4778 }
4779 </div>
4780 }
4781
4782
4783 @helper RenderDesktopToolsTextMobile()
4784 {
4785 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
4786 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
4787 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
4788 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
4789 string userName = userExists ? getUserName(Pageview.User) : "";
4790 int secondaryUsersCount = Model.SecondaryUsers.Count;
4791 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
4792 bool promptForAccount = getPromptForAccount();
4793
4794 <div class="" style="min-height: 30px">
4795 @if (userExists)
4796 {
4797 <div class="u-margin-bottom--lg u-margin-top--lg u-border-top u-border-bottom u-padding-top u-padding-bottom">
4798 @if (secondaryUsersCount > 0)
4799 {
4800 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
4801 {
4802 <div class="u-margin-right u-margin-bottom" data-prompt-account="@promptForAccount" >@userName</div>
4803
4804 if(secondaryUsersCount> 1 || promptForAccount) {
4805 @RenderImpersonationDropdownMobile(impersonationListFeedPageId)
4806 }
4807 }
4808 else
4809 {
4810 <div class="u-margin-bottom">@Translate("Choose user to impersonate:") </div>
4811 @RenderImpersonationDropdownMobile( impersonationListFeedPageId)
4812 }
4813
4814
4815 }
4816
4817 </div>
4818 if(!string.IsNullOrEmpty(customerNumber)) {
4819 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "")
4820 {
4821 <div>@Translate("currentLocation") <div class="location-space u-margin-bottom"></div>
4822
4823 @Render(new Button
4824 {
4825 ButtonType = ButtonType.Button,
4826 ButtonLayout = ButtonLayout.None,
4827 Title = Translate("Change Location"),
4828 CssClass = "u-no-margin btn btn--primary dw-mod",
4829 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true, document.querySelector('#MobileNavTrigger').checked = false"
4830 })
4831 </div>
4832 }
4833
4834 }
4835 }
4836
4837
4838 </div>
4839 }
4840
4841 @helper RenderImpersonationDropdownMobile(string impersonationListFeedPageId) {
4842 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
4843 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user");
4844 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-test="test1">
4845 <input type="hidden" name="DwExtranetRemoveSecondaryUser">
4846 </form>
4847 <div class="impersonation-container">
4848 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/>
4849 <div class="dropdown variants-filters dw-mod">
4850 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label>
4851 <div class="dropdown__content u-padding dw-mod">
4852 <div class="dropdown__item__filter">
4853 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")">
4854 </div>
4855 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false">
4856 </div>
4857 </div>
4858 </div>
4859 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label>
4860 </div>
4861
4862
4863 }</text>
4864 }
4865 else
4866 {
4867 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4868
4869 @using System
4870 @using System.Web
4871 @using System.Collections.Generic
4872 @using Dynamicweb.Rapido.Blocks.Extensibility
4873 @using Dynamicweb.Rapido.Blocks
4874
4875 @functions {
4876 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master");
4877
4878 }
4879
4880 @{
4881 Block masterTools = new Block()
4882 {
4883 Id = "MasterDesktopTools",
4884 SortId = 10,
4885 Template = RenderDesktopTools(),
4886 SkipRenderBlocksList = true,
4887 BlocksList = new List<Block>
4888 {
4889 new Block
4890 {
4891 Id = "MasterDesktopToolsText",
4892 SortId = 10,
4893 Template = RenderDesktopToolsText(),
4894 Design = new Design
4895 {
4896 Size = "auto",
4897 HidePadding = true,
4898 RenderType = RenderType.Column
4899 }
4900 },
4901 new Block
4902 {
4903 Id = "MasterDesktopToolsNavigation",
4904 SortId = 20,
4905 Template = RenderDesktopToolsNavigation(),
4906 Design = new Design
4907 {
4908 Size = "auto-width",
4909 HidePadding = true,
4910 RenderType = RenderType.Column
4911 }
4912 }
4913 }
4914 };
4915 headerBlocksPage.Add("MasterHeader", masterTools);
4916
4917 Block masterDesktopExtra = new Block()
4918 {
4919 Id = "MasterDesktopExtra",
4920 SortId = 10,
4921 Template = RenderDesktopExtra(),
4922 SkipRenderBlocksList = true
4923 };
4924 headerBlocksPage.Add("MasterHeader", masterDesktopExtra);
4925
4926 Block masterDesktopNavigation = new Block()
4927 {
4928 Id = "MasterDesktopNavigation",
4929 SortId = 20,
4930 Template = RenderDesktopNavigation(),
4931 SkipRenderBlocksList = true
4932 };
4933 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation);
4934
4935 if (Model.CurrentUser.ID > 0)
4936 {
4937 Modal stopImpersonation = new Modal
4938 {
4939 Id = "StopImpersonation",
4940 Heading = new Heading
4941 {
4942 Level = 2,
4943 Title = Translate("Sign out"),
4944 Icon = new Icon
4945 {
4946 Name = "fa-sign-out",
4947 Prefix = "fas",
4948 LabelPosition = IconLabelPosition.After
4949 }
4950 },
4951 Width = ModalWidth.Md,
4952 BodyTemplate = RenderStopImpersonationForm()
4953 };
4954
4955 Block stopImpersonationBlock = new Block
4956 {
4957 Id = "StopImpersonationBlock",
4958 SortId = 10,
4959 Component = stopImpersonation
4960 };
4961 headerBlocksPage.Add("MasterHeader", stopImpersonationBlock);
4962 }
4963
4964 }
4965
4966 @* Include the Blocks for the page *@
4967 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4968
4969 @using System
4970 @using System.Web
4971 @using Dynamicweb.Rapido.Blocks.Extensibility
4972 @using Dynamicweb.Rapido.Blocks
4973
4974 @{
4975 Block masterDesktopLogo = new Block
4976 {
4977 Id = "MasterDesktopLogo",
4978 SortId = 10,
4979 Template = RenderDesktopLogo(),
4980 Design = new Design
4981 {
4982 Size = "auto-width",
4983 HidePadding = true,
4984 RenderType = RenderType.Column,
4985 CssClass = "grid--align-self-center"
4986 }
4987 };
4988
4989 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo);
4990 }
4991
4992
4993 @helper RenderDesktopLogo()
4994 {
4995 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
4996 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4997 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
4998 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass;
4999 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
5000 if (Path.GetExtension(logo).ToLower() != ".svg")
5001 {
5002 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight");
5003 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40;
5004 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&crop=5&Compression=75&image=" + logo;
5005 }
5006 else
5007 {
5008 logo = HttpUtility.UrlDecode(logo);
5009 }
5010
5011 <div class="logo @alignClass dw-mod">
5012 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
5013 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" />
5014 </a>
5015 </div>
5016 }
5017 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5018
5019 @using System
5020 @using System.Web
5021 @using Dynamicweb.Rapido.Blocks.Extensibility
5022 @using Dynamicweb.Rapido.Blocks
5023
5024 @functions {
5025 bool isMegaMenu;
5026 }
5027
5028 @{
5029 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false;
5030 Block masterDesktopMenu = new Block
5031 {
5032 Id = "MasterDesktopMenu",
5033 SortId = 10,
5034 Template = RenderDesktopMenu(),
5035 Design = new Design
5036 {
5037 Size = "auto",
5038 HidePadding = true,
5039 RenderType = RenderType.Column
5040 }
5041 };
5042
5043 if (isMegaMenu)
5044 {
5045 masterDesktopMenu.Design.CssClass = "u-reset-position";
5046 }
5047
5048 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu);
5049 }
5050
5051 @helper RenderDesktopMenu()
5052 {
5053 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5054 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : "";
5055 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout;
5056 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
5057 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
5058 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders");
5059 int startLevel = renderPagesInToolBar ? 1 : 0;
5060
5061 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink");
5062 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
5063
5064 bool isSlapp = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Slapp", StringComparison.OrdinalIgnoreCase)).Value.ToString() == "True" : false;
5065
5066 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment">
5067 @if (!isMegaMenu)
5068 {
5069 if (isSlapp)
5070 {
5071 @RenderNavigation(new
5072 {
5073 id = "topnavigation",
5074 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5075 startLevel = startLevel,
5076 ecomStartLevel = startLevel + 1,
5077 endlevel = 5,
5078 expandmode = "all",
5079 template = "BaseMenuWithDropdown-nocategory.xslt"
5080 });
5081
5082 }
5083 else
5084 {
5085 @RenderNavigation(new
5086 {
5087 id = "topnavigation",
5088 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5089 startLevel = startLevel,
5090 ecomStartLevel = startLevel + 1,
5091 endlevel = 5,
5092 expandmode = "all",
5093 template = "BaseMenuWithDropdown.xslt"
5094 });
5095 }
5096
5097 }
5098 else
5099 {
5100 @RenderNavigation(new
5101 {
5102 id = "topnavigation",
5103 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
5104 startLevel = startLevel,
5105 ecomStartLevel = startLevel + 1,
5106 endlevel = 5,
5107 promotionImage = megamenuPromotionImage,
5108 promotionLink = promotionLink,
5109 expandmode = "all",
5110 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(),
5111 template = "BaseMegaMenu.xslt"
5112 });
5113 }
5114 </div>
5115 }
5116 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5117
5118 @using System
5119 @using System.Web
5120 @using Dynamicweb.Rapido.Blocks.Extensibility
5121 @using Dynamicweb.Rapido.Blocks
5122
5123 @{
5124 Block masterDesktopActionsMenu = new Block
5125 {
5126 Id = "MasterDesktopActionsMenu",
5127 SortId = 10,
5128 Template = RenderDesktopActionsMenu(),
5129 Design = new Design
5130 {
5131 CssClass = "u-flex"
5132 },
5133 SkipRenderBlocksList = true
5134
5135 };
5136 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu);
5137
5138 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink")))
5139 {
5140 Block masterDesktopActionsHeaderButton = new Block
5141 {
5142 Id = "MasterDesktopActionsHeaderButton",
5143 SortId = 60,
5144 Template = RenderHeaderButton()
5145 };
5146 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton);
5147 }
5148 }
5149
5150 @helper RenderDesktopActionsMenu()
5151 {
5152 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList();
5153
5154 <ul class="menu u-flex dw-mod">
5155 @RenderBlockList(subBlocks)
5156 </ul>
5157 }
5158
5159 @helper RenderHeaderButton()
5160 {
5161 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText");
5162 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink");
5163 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : "";
5164
5165 <li class="menu__item menu__item--horizontal menu--clean dw-mod">
5166 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a>
5167 </li>
5168 }
5169 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5170
5171 @using System
5172 @using System.Security.Cryptography
5173 @using System.Web
5174 @using Dynamicweb.Core;
5175 @using System.Text.RegularExpressions
5176 @using Dynamicweb.Rapido.Blocks.Extensibility
5177 @using Dynamicweb.Rapido.Blocks
5178
5179 @{
5180 Block masterDesktopActionsMenuLanguageSelector = new Block
5181 {
5182 Id = "MasterDesktopActionsMenuLanguageSelector",
5183 SortId = 90,
5184 Template = RenderLanguageSelector()
5185 };
5186
5187 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector);
5188 }
5189
5190 @helper RenderLanguageSelector()
5191 {
5192 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5193 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5194 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5195 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() : "";
5196 string currentLanguage = Pageview.Area.Culture.Replace("nb","").Replace("en","").ToLower();
5197 string currentLangInfo = "<span class=\"flag-icon flag-icon" + currentLanguage + " u-margin-right\"></span>";
5198
5199
5200 if (Model.Languages.Count > 1)
5201 {
5202 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod">
5203 <div class="@menuLinkClass dw-mod" title="@Translate("Language")">
5204 @currentLangInfo
5205 </div>
5206 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell">
5207 @foreach (var lang in Model.Languages)
5208 {
5209 string widthClass = "menu__item--fixed-width";
5210 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower();
5211 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name;
5212 string cultureName = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
5213 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
5214
5215
5216 if (languageViewType == "flag-culture")
5217 {
5218 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName;
5219 }
5220
5221 if (languageViewType == "flag")
5222 {
5223 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>";
5224 widthClass = "";
5225 }
5226
5227 if (languageViewType == "name")
5228 {
5229 langInfo = lang.Name;
5230 }
5231
5232 if (languageViewType == "culture")
5233 {
5234 langInfo = cultureName;
5235 widthClass = "";
5236 }
5237
5238 <div class="menu__item dw-mod @widthClass">
5239 <a href="/Default.aspx?AreaID=@Dynamicweb.Content.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a>
5240 </div>
5241 }
5242 </div>
5243 </li>
5244 }
5245 }
5246 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5247
5248 @using System
5249 @using System.Web
5250 @using Dynamicweb.Rapido.Blocks.Extensibility
5251 @using Dynamicweb.Rapido.Blocks
5252
5253 @{
5254 Block masterDesktopActionsMenuSignIn = new Block
5255 {
5256 Id = "MasterDesktopActionsMenuSignIn",
5257 SortId = 20,
5258 Template = RenderSignIn()
5259 };
5260
5261 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn);
5262 }
5263
5264 @helper RenderSignIn()
5265 {
5266 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
5267 string userInitials = "";
5268 int pageId = Model.TopPage.ID;
5269 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
5270 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
5271 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
5272 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
5273 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
5274 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
5275 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft");
5276 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
5277 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
5278 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
5279 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
5280 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
5281 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts");
5282 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
5283 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
5284
5285 string linkStart = "/Default.aspx?ID=";
5286 if (Model.CurrentUser.ID <= 0)
5287 {
5288 linkStart += signInProfilePageId + "&RedirectPageId=";
5289 }
5290
5291 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
5292 string myProfilePageLink = linkStart + myProfilePageId;
5293 string myOrdersPageLink = linkStart + myOrdersPageId;
5294 string myFavoritesPageLink = linkStart + myFavoritesPageId;
5295 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
5296 string myOrderDraftsLink = linkStart + myOrderDraftsPageId;
5297
5298 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
5299 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";
5300 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
5301 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : "";
5302
5303 if (Model.CurrentUser.ID != 0)
5304 {
5305 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName);
5306 }
5307
5308 if (!navigationItemsHideSignIn)
5309 {
5310 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5311 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
5312 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5313
5314
5315 <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">
5316 <div class="@menuLinkClass dw-mod" >
5317 @if (Model.CurrentUser.ID <= 0)
5318 {
5319 <i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>
5320 }
5321 else
5322 {
5323 <div class="user-menu u-flex">
5324 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
5325 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
5326 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon)
5327
5328 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
5329 {
5330 <div class="u-margin-right">
5331 <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>
5332 </div>
5333 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
5334 {
5335 <div class="u-margin-right">
5336 <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>
5337 </div>
5338 } else {
5339 @RenderMenuIcon("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"), "far fa-sign-out-alt")
5340 }
5341
5342 </div>
5343 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@
5344 }
5345 </div>
5346 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod">
5347 <ul class="list list--clean dw-mod">
5348 @if (Model.CurrentUser.ID <= 0)
5349 {
5350 <li>
5351 <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>
5352 </li>
5353
5354 if (!hideCreateAccountLink)
5355 {
5356 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"));
5357 }
5358 if (!hideForgotPasswordLink)
5359 {
5360 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
5361 }
5362 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
5363 {
5364 @RenderSeparator()
5365 }
5366 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true )
5367 }
5368 else
5369 {
5370 if (!hideMyProfileLink)
5371 {
5372 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
5373 }
5374 if (!hideMyOrdersLink)
5375 {
5376 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
5377 }
5378 if (!hideMyFavoritesLink)
5379 {
5380 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
5381 }
5382 if (!hideMySavedCardsLink)
5383 {
5384 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
5385 }
5386 if (!hideMyOrderDraftsLink)
5387 {
5388 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon)
5389 }
5390 }
5391
5392 @if (Model.CurrentUser.ID > 0)
5393 {
5394 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
5395 {
5396 @RenderSeparator()
5397 }
5398
5399 //Check if impersonation is on
5400 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
5401 {
5402 <li>
5403 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;">
5404 @Translate("Sign out")
5405 </div>
5406 </li>
5407 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
5408 {
5409 <li>
5410 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)">
5411 @Translate("Sign out")
5412 </a>
5413 </li>
5414 } else {
5415 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
5416 }
5417 }
5418 </ul>
5419 </div>
5420 </li>
5421 }
5422 }
5423
5424 @helper RenderListItem(string link, string text, string icon = null, bool target = false) {
5425 string targetBlank = target == true ? "target='_blank'" : "";
5426 <li>
5427 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)" @targetBlank>
5428 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text
5429 </a>
5430 </li>
5431 }
5432
5433 @helper RenderSeparator()
5434 {
5435 <li class="list__seperator dw-mod"></li>
5436 }
5437
5438 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5439
5440 @using System
5441 @using System.Web
5442 @using Dynamicweb.Rapido.Blocks.Extensibility
5443 @using Dynamicweb.Rapido.Blocks
5444
5445 @{
5446 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
5447
5448 Block masterDesktopActionsMenuFavorites = new Block
5449 {
5450 Id = "MasterDesktopActionsMenuFavorites",
5451 SortId = 30,
5452 Template = RenderFavorites()
5453 };
5454
5455 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0)
5456 {
5457 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites);
5458 }
5459 }
5460
5461 @helper RenderFavorites()
5462 {
5463 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
5464 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId;
5465
5466 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5467 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5468 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5469
5470 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5471 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")">
5472 @*
5473 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i>
5474 *@
5475 <img src="/Files/Images/favorite-list-svg.svg"/>
5476 </a>
5477 </li>
5478 }
5479 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5480 @using Dynamicweb.Rapido.Blocks
5481
5482 @{
5483 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
5484 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
5485
5486 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart)
5487 {
5488 Block masterDesktopActionsMenuMiniCart = new Block
5489 {
5490 Id = "MasterDesktopActionsMenuMiniCart",
5491 SortId = 40,
5492 Template = RenderMiniCart(miniCartLayout == "dropdown"),
5493 SkipRenderBlocksList = true,
5494 BlocksList = new List<Block>()
5495 };
5496
5497 Block miniCartCounterScriptTemplate = new Block
5498 {
5499 Id = "MiniCartCounterScriptTemplate",
5500 Template = RenderMiniCartCounterContent()
5501 };
5502
5503 //dropdown layout is default
5504 RazorEngine.Templating.TemplateWriter layoutTemplate;
5505 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate;
5506
5507 switch (miniCartLayout)
5508 {
5509 case "dropdown":
5510 layoutTemplate = RenderMiniCartDropdownLayout();
5511 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5512 break;
5513 case "panel":
5514 layoutTemplate = RenderMiniCartPanelLayout();
5515 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5516 break;
5517 case "modal":
5518 layoutTemplate = RenderMiniCartModalLayout();
5519 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5520 break;
5521 case "none":
5522 default:
5523 layoutTemplate = RenderNoLayoutMiniCart();
5524 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5525 break;
5526 }
5527
5528 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5529 {
5530 Id = "MiniCartTrigger",
5531 SortId = 40,
5532 Template = miniCartTriggerTemplate
5533 });
5534
5535 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
5536 {
5537 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5538 {
5539 Id = "MiniCartLayout",
5540 SortId = 40,
5541 Template = layoutTemplate
5542 });
5543 }
5544
5545 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart);
5546 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
5547 }
5548
5549 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
5550 {
5551 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block
5552 {
5553 Id = "CartInitialization",
5554 Template = RenderNoLayoutMiniCart()
5555 });
5556 }
5557
5558 }
5559
5560 @helper RenderMiniCart(bool hasMouseEnterEvent)
5561 {
5562 @*List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList();
5563 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5564 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean";
5565 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5566 string mouseEvent = "";
5567 string id = "MiniCart";
5568 if (hasMouseEnterEvent)
5569 {
5570 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\"";
5571 id = "miniCartTrigger";
5572 }
5573 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent>
5574 @RenderBlockList(subBlocks)
5575 </li>*@
5576 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5577
5578 <li style="display: flex; align-items: center; margin-top: 19px;">
5579 <div id="cartMiniApp"></div>
5580 </li>
5581
5582 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
5583 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
5584 {
5585 //user data
5586 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO",
5587 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK",
5588 UserId = user?.ID,
5589 CustomerNumber = user?.CustomerNumber,
5590
5591 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True",
5592 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300",
5593 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True",
5594
5595 //site settings
5596 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
5597 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name,
5598 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"),
5599 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page
5600 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl)
5601 });
5602 //this app is responsible for fetching all the user details required by all our vue.js apps to run
5603 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div>
5604
5605 //this app is responsible for handling events sent from legacy JS components, like food calendar
5606 <div id="legacyEventHandler" style="visibility: hidden" ></div>
5607 }
5608
5609 @helper RenderNoLayoutMiniCart()
5610 {
5611 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5612 <script>
5613 window.cartId = "@miniCartFeedPageId";
5614 </script>
5615 }
5616
5617 @helper RenderMiniCartTriggerLabel()
5618 {
5619 int cartPageId = GetPageIdByNavigationTag("CartPage");
5620 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5621 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5622 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5623 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5624
5625 <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")">
5626 <div class="u-inline u-position-relative">
5627 <img src="/Files/Images/cart-svg.svg" />
5628 @RenderMiniCartCounter()
5629 </div>
5630 </div>
5631 }
5632
5633 @helper RenderMiniCartTriggerLink()
5634 {
5635 int cartPageId = GetPageIdByNavigationTag("CartPage");
5636 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5637 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5638 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5639
5640 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")">
5641 <span class="u-inline u-position-relative">
5642 <i class="@cartIcon fa-1_5x"></i>
5643 @RenderMiniCartCounter()
5644 </span>
5645 </a>
5646 }
5647
5648 @helper RenderMiniCartCounter()
5649 {
5650 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5651 string cartProductsCount = Model.Cart.OrderlinesCount.ToString();
5652 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5653 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5654 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : "";
5655 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : "";
5656
5657 if (showPrice && counterPosition == "right")
5658 {
5659 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")";
5660 }
5661
5662 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod">
5663 <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">
5664 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.OrderlinesCount.ToString()">
5665 @cartProductsCount @cartProductsTotalPrice
5666 </span>
5667 </span>
5668 </span>
5669 }
5670
5671 @helper RenderMiniCartCounterContent()
5672 {
5673 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5674 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5675 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
5676
5677 <script id="MiniCartCounterContent" type="text/x-template">
5678 {{#.}}
5679 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}">
5680 @if (showPriceInMiniCartCounter)
5681 {
5682 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
5683 }
5684 else
5685 {
5686 <text>{{numberoforderlines}}</text>
5687 }
5688 </span>
5689 {{/.}}
5690 </script>
5691 }
5692
5693 @helper RenderMiniCartDropdownLayout()
5694 {
5695 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5696 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5697
5698 <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">
5699 <div class="mini-cart-dropdown__inner dw-mod">
5700 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3>
5701 <div class="mini-cart-dropdown__body u-flex dw-mod">
5702 <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>
5703 </div>
5704 </div>
5705 </div>
5706 }
5707
5708 @helper RenderMiniCartPanelLayout()
5709 {
5710 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5711 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart");
5712 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed");
5713 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5714 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
5715 var hideOnCartPageClass = GetPageIdByNavigationTag("CartPage") == Model.ID ? "u-hidden" : "";
5716 var preventLoadOnProductList = GetPageIdByNavigationTag("ProductsPage") == Model.ID ? "data-init-onload=\"false\"" : "";
5717
5718 <div class="mini-cart grid__cell dw-mod">
5719 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" />
5720 <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">
5721 <label for="miniCartTrigger" class="panel__close-btn u-hidden" title="@Translate("Close panel")"><i class="fas fa-times"></i></label>
5722 <div class="panel__content u-full-width dw-mod">
5723 <div class="panel_toggle_button @hideOnCartPageClass">
5724 <button class="toggle-minicart btn btn--primary dw-mod" onclick="toggleMinicart(this)">
5725 <i class="fas fa-arrow-alt-circle-left"></i>
5726 </button>
5727 </div>
5728 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart list")</h3>
5729 <div class="">
5730 <div class="u-full-width dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div>
5731 <div class="dw-mod">
5732 @Render(new Button
5733 {
5734 Title = Translate("Change Cart Name"),
5735 ButtonType = ButtonType.Button,
5736 ButtonLayout = ButtonLayout.None,
5737 CssClass = "u-margin-bottom change-cart-name",
5738 OnClick = "changeCartName()"
5739 })
5740 @Render(new Button
5741 {
5742 Title = Translate("Create New Cart"),
5743 ButtonType = ButtonType.Button,
5744 ButtonLayout = ButtonLayout.Primary,
5745 CssClass = "u-full-width",
5746 OnClick = "document.getElementById('NewCartModalTrigger').checked = true"
5747 })
5748 </div>
5749 </div>
5750 <div class="panel__content-body panel__content-body--cart dw-mod">
5751 <div class="minicart-preloader-overlay" id="MiniCartOverlay"><div class="preloader-overlay__icon dw-mod" style="top: 0px;"></div></div>
5752 <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>
5753 </div>
5754 </div>
5755 </div>
5756 </div>
5757 }
5758
5759 @helper RenderMiniCartModalLayout()
5760 {
5761 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5762 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5763
5764 <div class="mini-cart grid__cell dw-mod">
5765 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" />
5766 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink">
5767 <label for="miniCartTrigger" class="modal-overlay"></label>
5768 <div class="modal modal--md modal--top-right dw-mod">
5769 <div class="modal__body u-flex grid--direction-column dw-mod">
5770 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3>
5771 <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>
5772 </div>
5773 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label>
5774 </div>
5775 </div>
5776 </div>
5777 }
5778
5779 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5780
5781 @using System
5782 @using System.Web
5783 @using Dynamicweb.Rapido.Blocks.Extensibility
5784 @using Dynamicweb.Rapido.Blocks
5785
5786 @{
5787 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon");
5788
5789 Block masterDesktopActionsMenuOrderDraft = new Block
5790 {
5791 Id = "MasterDesktopActionsMenuOrderDraft",
5792 SortId = 40,
5793 Template = RenderOrderDraft()
5794 };
5795
5796 if (showOrderDraftLink && Model.CurrentUser.ID > 0)
5797 {
5798 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft);
5799 }
5800 }
5801
5802 @helper RenderOrderDraft()
5803 {
5804 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft");
5805 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId;
5806 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
5807
5808
5809 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5810 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5811 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5812
5813 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5814 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")">
5815 <span class="u-inline u-position-relative">
5816 <i class="@draftIcon fa-1_5x"></i>
5817 </span>
5818 </a>
5819 </li>
5820 }
5821 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5822
5823 @using System
5824 @using System.Web
5825 @using Dynamicweb.Rapido.Blocks.Extensibility
5826 @using Dynamicweb.Rapido.Blocks
5827
5828 @{
5829 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart");
5830
5831 Block masterDesktopActionsMenuDownloadCart = new Block
5832 {
5833 Id = "MasterDesktopActionsMenuDownloadCart",
5834 SortId = 50,
5835 Template = RenderDownloadCart()
5836 };
5837
5838 if (showDownloadCartLink && Model.CurrentUser.ID > 0)
5839 {
5840 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart);
5841 }
5842 }
5843
5844 @helper RenderDownloadCart()
5845 {
5846 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart");
5847 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId;
5848
5849 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5850 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5851 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5852 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5853
5854 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5855 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")">
5856 <span class="u-inline u-position-relative">
5857 <i class="fas fa-cart-arrow-down fa-1_5x"></i>
5858 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span>
5859 </span>
5860 </a>
5861 </li>
5862 }
5863 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5864
5865 @using System
5866 @using System.Web
5867 @using Dynamicweb.Rapido.Blocks.Extensibility
5868 @using Dynamicweb.Rapido.Blocks
5869
5870 @functions {
5871 public class SearchConfiguration
5872 {
5873 public string searchFeedId { get; set; }
5874 public string searchSecondFeedId { get; set; }
5875 public int groupsFeedId { get; set; }
5876 public string resultPageLink { get; set; }
5877 public string searchPlaceholder { get; set; }
5878 public string searchType { get; set; }
5879 public string searchTemplate { get; set; }
5880 public string searchContentTemplate { get; set; }
5881 public string searchValue { get; set; }
5882 public bool showGroups { get; set; }
5883
5884 public SearchConfiguration()
5885 {
5886 searchFeedId = "";
5887 searchSecondFeedId = "";
5888 searchType = "product-search";
5889 searchContentTemplate = "";
5890 showGroups = true;
5891 }
5892 }
5893 }
5894 @{
5895 Block masterSearchBar = new Block
5896 {
5897 Id = "MasterSearchBar",
5898 SortId = 40,
5899 Template = RenderSearch("bar"),
5900 Design = new Design
5901 {
5902 Size = "auto",
5903 HidePadding = true,
5904 RenderType = RenderType.Column
5905 }
5906 };
5907
5908 Block masterSearchAction = new Block
5909 {
5910 Id = "MasterDesktopActionsMenuSearch",
5911 SortId = 10,
5912 Template = RenderSearch()
5913 };
5914
5915 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar);
5916 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction);
5917 }
5918
5919 @helper RenderSearch(string type = "mini-search")
5920 {
5921 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage"));
5922 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage"));
5923 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
5924 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch";
5925
5926 SearchConfiguration searchConfiguration = null;
5927
5928 switch (searchType) {
5929 case "contentSearch":
5930 searchConfiguration = new SearchConfiguration() {
5931 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5932 resultPageLink = contentSearchPageLink,
5933 searchPlaceholder = Translate("Search page"),
5934 groupsFeedId = 0,
5935 searchType = "content-search",
5936 searchTemplate = "SearchPagesTemplate",
5937 showGroups = false
5938 };
5939 break;
5940 case "combinedSearch":
5941 searchConfiguration = new SearchConfiguration() {
5942 searchFeedId = productsPageId + "&feed=true",
5943 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5944 resultPageLink = Converter.ToString(productsPageId),
5945 searchPlaceholder = Translate("Search products or pages"),
5946 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5947 searchType = "combined-search",
5948 searchTemplate = "SearchProductsTemplateWrap",
5949 searchContentTemplate = "SearchPagesTemplateWrap",
5950 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5951 };
5952 break;
5953 default: //productSearch
5954 searchConfiguration = new SearchConfiguration() {
5955 resultPageLink = Converter.ToString(productsPageId),
5956 searchFeedId = searchPageId + "&feed=true",
5957 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5958 searchPlaceholder = Translate("Search products"),
5959 searchTemplate = "SearchProductsTemplate",
5960 searchType = "product-search",
5961 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5962 };
5963 break;
5964 }
5965 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
5966
5967 if (type == "mini-search") {
5968 @RenderMiniSearch(searchConfiguration)
5969 } else {
5970 @RenderSearchBar(searchConfiguration)
5971 }
5972 }
5973
5974 @helper RenderSearchBar(SearchConfiguration options)
5975 {
5976 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar"
5977 data-page-size="7"
5978 data-search-feed-id="@options.searchFeedId"
5979 data-search-second-feed-id="@options.searchSecondFeedId"
5980 data-result-page-id="@options.resultPageLink"
5981 data-groups-page-id="@options.groupsFeedId"
5982 data-search-type="@options.searchType">
5983 @if (options.showGroups)
5984 {
5985 <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>
5986 <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>
5987 }
5988 <div class="typeahead-search-field">
5989 <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">
5990 @*
5991 <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>
5992 *@
5993 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
5994 {
5995 <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>
5996 }
5997 else
5998 {
5999 <div class="dropdown dropdown--absolute-position dropdown--combined grid">
6000 <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>
6001 <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>
6002 </div>
6003 }
6004 </div>
6005 <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>
6006 </div>
6007 }
6008
6009 @helper RenderMiniSearch(SearchConfiguration options)
6010 {
6011 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6012 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
6013
6014 <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">
6015 <div class="@menuLinkClass dw-mod" title="@Translate("Search")">
6016 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
6017 </div>
6018 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
6019 <div class="typeahead js-typeahead" id="ProductSearchBar"
6020 data-page-size="7"
6021 data-search-feed-id="@options.searchFeedId"
6022 data-search-second-feed-id="@options.searchSecondFeedId"
6023 data-result-page-id="@options.resultPageLink"
6024 data-search-type="@options.searchType">
6025 <div class="typeahead-search-field">
6026 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue">
6027 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
6028 {
6029 <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>
6030 }
6031 else
6032 {
6033 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
6034 <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>
6035 <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>
6036 </div>
6037 }
6038 </div>
6039 </div>
6040 </div>
6041 </li>
6042 }
6043 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6044
6045 @using System
6046 @using System.Web
6047 @using Dynamicweb.Rapido.Blocks.Extensibility
6048 @using Dynamicweb.Rapido.Blocks
6049
6050 @{
6051 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6052 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
6053
6054 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master");
6055
6056 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo");
6057 headerConfigurationPage.RemoveBlock(configDesktopLogo);
6058
6059 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu");
6060 headerConfigurationPage.RemoveBlock(configDesktopMenu);
6061
6062 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar");
6063 headerConfigurationPage.RemoveBlock(configSearchBar);
6064
6065 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch");
6066 headerConfigurationPage.RemoveBlock(configSearchAction);
6067
6068 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu");
6069 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu);
6070
6071 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra");
6072
6073 switch (headerConfigurationTopLayout)
6074 {
6075 case "condensed": //2
6076 configDesktopLogo.Design.Size = "auto-width";
6077 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6078
6079 configDesktopMenu.SortId = 20;
6080 configDesktopMenu.Design.Size = "auto";
6081 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6082
6083 configDesktopActionsMenu.SortId = 30;
6084 configDesktopActionsMenu.Design.Size = "auto-width";
6085 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6086
6087 if (!headerConfigurationHideSearch)
6088 {
6089 configSearchBar.SortId = 40;
6090 configSearchBar.Design.Size = "12";
6091 configDesktopExtra.SortId = 50;
6092 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6093 }
6094 break;
6095 case "splitted": //3
6096 configDesktopLogo.Design.Size = "auto";
6097 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6098
6099 if (!headerConfigurationHideSearch)
6100 {
6101 configSearchBar.SortId = 20;
6102 configSearchBar.Design.Size = "auto";
6103 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6104 }
6105
6106 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6107
6108 configDesktopActionsMenu.SortId = 20;
6109 configDesktopActionsMenu.Design.Size = "auto-width";
6110 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6111 break;
6112 case "splitted-center": //4
6113 configDesktopLogo.Design.Size = "auto";
6114 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6115 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6116
6117 configDesktopActionsMenu.SortId = 30;
6118 configDesktopActionsMenu.Design.Size = "auto-width";
6119 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
6120
6121 if (!headerConfigurationHideSearch)
6122 {
6123 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6124 }
6125 break;
6126 case "minimal": //5
6127 configDesktopLogo.Design.Size = "auto-width";
6128 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6129
6130 configDesktopMenu.Design.Size = "auto";
6131 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6132
6133 configDesktopActionsMenu.SortId = 20;
6134 configDesktopActionsMenu.Design.Size = "auto-width";
6135 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6136
6137 if (!headerConfigurationHideSearch)
6138 {
6139 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6140 }
6141 break;
6142 case "minimal-center": //6
6143 configDesktopLogo.Design.Size = "auto-width";
6144 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6145
6146 configDesktopMenu.Design.Size = "auto";
6147 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6148
6149 configDesktopActionsMenu.SortId = 20;
6150 configDesktopActionsMenu.Design.Size = "auto-width";
6151 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6152
6153 if (!headerConfigurationHideSearch)
6154 {
6155 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6156 }
6157 break;
6158 case "minimal-right": //7
6159 configDesktopLogo.Design.Size = "auto-width";
6160 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
6161
6162 configDesktopMenu.Design.Size = "auto";
6163 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6164
6165 configDesktopActionsMenu.SortId = 20;
6166 configDesktopActionsMenu.Design.Size = "auto-width";
6167 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6168
6169 if (!headerConfigurationHideSearch)
6170 {
6171 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6172 }
6173 break;
6174 case "two-lines": //8
6175 configDesktopLogo.Design.Size = "auto";
6176 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6177
6178 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6179
6180 configDesktopActionsMenu.SortId = 20;
6181 configDesktopActionsMenu.Design.Size = "auto-width";
6182 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6183
6184 if (!headerConfigurationHideSearch)
6185 {
6186 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6187 }
6188 break;
6189 case "two-lines-centered": //9
6190 configDesktopLogo.Design.Size = "auto";
6191 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6192
6193 configDesktopMenu.Design.Size = "auto-width";
6194 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6195
6196 configDesktopActionsMenu.SortId = 20;
6197 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
6198
6199 if (!headerConfigurationHideSearch)
6200 {
6201 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
6202 }
6203 break;
6204 case "normal": //1
6205 default:
6206 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
6207
6208 if (!headerConfigurationHideSearch)
6209 {
6210 configSearchBar.SortId = 20;
6211 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
6212 }
6213
6214 configDesktopActionsMenu.SortId = 30;
6215 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
6216
6217 configDesktopActionsMenu.Design.Size = "auto-width";
6218 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
6219 break;
6220 }
6221 }
6222 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6223
6224 @using System
6225 @using System.Web
6226 @using Dynamicweb.Rapido.Blocks.Extensibility
6227 @using Dynamicweb.Rapido.Blocks
6228
6229 @{
6230 Block masterCustomDesktopActionsMenuSignIn = new Block
6231 {
6232 Id = "MasterDesktopActionsMenuSignIn",
6233 SortId = 20,
6234 Template = RenderCustomSignIn()
6235 };
6236
6237 BlocksPage.GetBlockPage("Master").ReplaceBlock(masterCustomDesktopActionsMenuSignIn);
6238 }
6239
6240 @helper RenderCustomSignIn()
6241 {
6242 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
6243 string userInitials = "";
6244 int pageId = GetPageIdByNavigationTag("SignInPage");
6245 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
6246 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
6247 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
6248 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
6249 int announcementPageId = GetPageIdByNavigationTag("Announcements");
6250 int myDeviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage");
6251 int myDeviationsAdminPageId = GetPageIdByNavigationTag("DeviationsAdminHistoryPage");
6252 //int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
6253 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList");
6254 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
6255 int myReportsPageId = GetPageIdByNavigationTag("MyReports");
6256 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft");
6257 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
6258 int recipeBankPageId = GetPageIdByNavigationTag("MenuView");
6259 int menuCalendarPageId = GetPageIdByNavigationTag("MenuCalendarView");
6260 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
6261 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
6262 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
6263 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
6264 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts");
6265 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
6266 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
6267
6268 string linkStart = "/Default.aspx?ID=";
6269 if (Model.CurrentUser.ID <= 0)
6270 {
6271 linkStart += signInProfilePageId + "&RedirectPageId=";
6272 }
6273
6274 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
6275 string myProfilePageLink = linkStart + myProfilePageId;
6276 string myOrdersPageLink = linkStart + myOrdersPageId;
6277 string announcementPageLink = linkStart + announcementPageId;
6278 string myDeviationsPageLink = linkStart + myDeviationsPageId;
6279 string myReportsPageLink = linkStart + myReportsPageId;
6280 string myDeviationsAdminPageLink = linkStart + myDeviationsAdminPageId;
6281 string myFavoritesPageLink = linkStart + myFavoritesPageId + "&loadLists=true";
6282 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
6283 string myOrderDraftsLink = linkStart + myOrderDraftsPageId;
6284 string recipeBankPageLink = linkStart + recipeBankPageId;
6285 string menuCalendarPageLink = linkStart + menuCalendarPageId;
6286
6287 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
6288 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";
6289 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
6290 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : "";
6291
6292 if (Model.CurrentUser.ID != 0)
6293 {
6294 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName);
6295 }
6296
6297 if (!navigationItemsHideSignIn)
6298 {
6299 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6300 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
6301 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
6302 bool promptForAccount = getPromptForAccount();
6303 string createPageId = GetPageIdByNavigationTag("CreateAccount").ToString();
6304 string createPageUrl = "/Default.aspx?Id=" + createPageId;
6305 bool isUserAnonymous = string.IsNullOrWhiteSpace(Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser()?.UserName.ToString());
6306 var user = Pageview.User;
6307 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false;
6308 var userCompany = Model.CurrentUser.Company;
6309 bool isRmaAdmin = userCompany != null && userCompany.ToLower() == "kraemer";
6310 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false;
6311 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false;
6312 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : "";
6313 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : "";
6314
6315 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty;
6316 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty;
6317 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false;
6318
6319 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod">
6320 <div class="@menuLinkClass dw-mod">
6321 @if (Model.CurrentUser.ID <= 0)
6322 {
6323 @*<i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>*@
6324 <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>
6325 }
6326 else
6327 {
6328 <div class="user-menu u-flex headerIcons" data-user-type-food-calendar="@isFoodCalendarAdmin">
6329 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon, "/Files/Images/favorite-list-svg.svg")
6330 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list", "/Files/Images/order-history-svg.svg")
6331 @if (hasAccessToAnnouncements)
6332 {
6333 @*
6334 @RenderMenuIcon(announcementPageLink, Translate("Announcements"), "fas fa-list", "/Files/Images/notifications.svg")
6335 *@
6336 <div class="u-margin-right--lg">
6337 <a href="@announcementPageLink" class="u-brand-color-two bs-position-relative" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")">
6338 <img src="/Files/Images/notifications.svg">
6339 <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">
6340 <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"/>
6341 </svg>
6342 </a>
6343 </div>
6344 }
6345 @if (hasAccessToFoodCalendar)
6346 {
6347 @RenderMenuIcon(recipeBankPageLink, Translate("Matretter"), "fas fa-list", "/Files/Images/food-calendar.svg")
6348 }
6349 @if (isFoodCalendarAdmin)
6350 {
6351 @RenderMenuIcon(menuCalendarPageLink, Translate("Kalendervisning"), "fas fa-list", "/Files/Images/food-calendar-menu-calendar.svg")
6352 }
6353
6354 @if (isRmaAdmin)
6355 {
6356 @RenderMenuIcon(myDeviationsAdminPageLink, Translate("Admin RMA"), "fas fa-list", "/Files/Images/unionRMA-Admin-icon.svg")
6357 }
6358 else
6359 {
6360 @RenderMenuIcon(myDeviationsPageLink, Translate("My Deviations"), "fas fa-list", "/Files/Images/UnionRMA-icon.svg")
6361 }
6362 @if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport)
6363 {
6364 @RenderMenuIcon(myReportsPageLink, Translate("My report"), "fas fa-list", "/Files/Images/IconPowerBi.svg")
6365 }
6366
6367 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon, "/Files/Images/my-account-svg.svg")
6368
6369 @*@if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
6370 {
6371 <div class="u-margin-right">
6372 <a href="/" class="u-color-inherit" testc onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")">
6373 <img src="/Files/Images/log-out-svg.svg"/>
6374 </a>
6375 </div>
6376 }
6377 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
6378 {
6379
6380 <div class="u-margin-right">
6381 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")">
6382 <img src="/Files/Images/log-out-svg.svg"/>
6383 </div>
6384 </div>
6385
6386 }
6387 else
6388 {*@
6389 <div class="u-margin-right--lg" testd>
6390 <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")">
6391 <img src="/Files/Images/log-out-svg.svg" alt="sign out">
6392 </a>
6393 </div>
6394 @*}*@
6395
6396 </div>
6397 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@
6398 }
6399 </div>
6400 <div class="menu menu--dropdown menu--dropdown-right menu--dropdown-right--custom menu--sign-in grid__cell dw-mod">
6401 <ul class="list list--clean dw-mod">
6402 @if (Model.CurrentUser.ID <= 0)
6403 {
6404 if (!hideCreateAccountLink)
6405 {
6406 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"))
6407 ;
6408 }
6409 if (!hideForgotPasswordLink)
6410 {
6411 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
6412 }
6413 @*if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
6414 {
6415 @RenderSeparator()
6416 }*@
6417 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true)
6418 }
6419 else
6420 {
6421 if (!hideMyProfileLink)
6422 {
6423 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
6424 }
6425 if (!hideMyOrdersLink)
6426 {
6427 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
6428 }
6429 if (!hideMyFavoritesLink)
6430 {
6431 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
6432 }
6433 if (!hideMySavedCardsLink)
6434 {
6435 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
6436 }
6437 if (!hideMyOrderDraftsLink)
6438 {
6439 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon)
6440 }
6441 }
6442
6443 @if (Model.CurrentUser.ID > 0)
6444 {
6445 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
6446 {
6447 @RenderSeparator()
6448 }
6449
6450 //Check if impersonation is on
6451 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers)
6452 {
6453 <li>
6454 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;">
6455 @Translate("Sign out")
6456 </div>
6457 </li>
6458 }
6459 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1)
6460 {
6461 <li>
6462 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)">
6463 @Translate("Sign out")
6464 </a>
6465 </li>
6466 }
6467 else
6468 {
6469 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
6470 }
6471 }
6472 </ul>
6473 </div>
6474 </li>
6475 if (isUserAnonymous)
6476 {
6477 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod">
6478 <a class="btn btn--primary btn--full u-no-margin create-account__button" href="@createPageUrl">@Translate("Bli kunde")</a>
6479 </li>
6480 }
6481 }
6482 }
6483
6484 @helper RenderMenuIcon(string link, string title, string icon = null, string iconSource = null)
6485 {
6486 <div class="u-margin-right--lg">
6487 <a href="@link" class="u-brand-color-two" title="@title">
6488 <img src="@iconSource">
6489 </a>
6490 </div>
6491 }
6492
6493
6494
6495
6496 @helper RenderDesktopTools()
6497 {
6498 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList();
6499
6500 <div class="tools-navigation dw-mod">
6501 <div class="center-container grid top-container__center-container dw-mod">
6502 @RenderBlockList(subBlocks)
6503 </div>
6504 </div>
6505 }
6506
6507 @helper RenderDesktopToolsText()
6508 {
6509 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
6510 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
6511 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
6512 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
6513 string userName = userExists ? getUserName(Pageview.User) : "";
6514 int secondaryUsersCount = Model.SecondaryUsers.Count;
6515 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
6516 bool promptForAccount = getPromptForAccount();
6517 <div class="u-flex u-flex--align-center u-justify-between" style="min-height: 30px">
6518 @if (userExists)
6519 {
6520 <div class="u-margin-top u-margin-bottom u-flex u-flex--align-center">
6521 @if (secondaryUsersCount > 0)
6522 {
6523 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
6524 {
6525 <div class="u-margin-right" data-prompt-account="@promptForAccount">@userName</div>
6526 @*if (secondaryUsersCount > 1) {
6527 @Render(new Button
6528 {
6529 ButtonType = ButtonType.Button,
6530 ButtonLayout = ButtonLayout.LinkClean,
6531 Title = Translate("Bytt konto"),
6532 Icon = new Icon {
6533 Name = "fa-sign-out",
6534 Prefix = "fal",
6535 LabelPosition = IconLabelPosition.Before
6536 },
6537 OnClick = "renderImpersonationList(true)",
6538 CssClass = "u-no-margin"
6539 })
6540 }*@
6541 // if (secondaryUsersCount > 1)
6542 // {
6543 @RenderImpersonationDropdown(impersonationListFeedPageId)
6544 // }
6545 }
6546 else
6547 {
6548 <div class="u-margin-right" style="text-transform: uppercase"><span>@Model.CurrentUser.Name</span></div>
6549 @RenderImpersonationDropdown(impersonationListFeedPageId)
6550 }
6551 }
6552
6553 </div>
6554 if (!string.IsNullOrEmpty(customerNumber))
6555 {
6556 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "")
6557 {
6558 <div>
6559 @Translate("currentLocation") <span class="location-space"></span>
6560 @Render(new Button
6561 {
6562 ButtonType = ButtonType.Button,
6563 ButtonLayout = ButtonLayout.None,
6564 Title = Translate("Change Location"),
6565 CssClass = "u-no-margin",
6566 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true"
6567 })
6568 </div>
6569 }
6570 }
6571 }
6572
6573
6574 </div>
6575 }
6576
6577 @helper RenderImpersonationDropdown(string impersonationListFeedPageId)
6578 {
6579 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
6580 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user");
6581 var hideSelfOption = ReturnCustomFieldValue("AccessUser_HideSelf");
6582 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-primary-user="@Model.CurrentUser.Name" data-secondary-user="@Model.CurrentSecondaryUser.Name">
6583 <input type="hidden" name="DwExtranetRemoveSecondaryUser"/>
6584 </form>
6585
6586 <div class="impersonation-container">
6587 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/>
6588 <div class="dropdown variants-filters dw-mod">
6589 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label>
6590 <div class="dropdown__content u-padding dw-mod">
6591 <div class="dropdown__item__filter">
6592 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")">
6593 </div>
6594 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false">
6595 </div>
6596 </div>
6597 </div>
6598 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label>
6599 </div>
6600
6601
6602
6603 }
6604
6605 @helper RenderDesktopToolsNavigation()
6606 {
6607 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
6608
6609 if (renderPagesInToolBar)
6610 {
6611 @RenderNavigation(new
6612 {
6613 id = "topToolsNavigation",
6614 cssclass = "menu menu-tools dw-mod dwnavigation",
6615 template = "TopMenu.xslt"
6616 })
6617 }
6618 }
6619
6620 @helper RenderDesktopNavigation()
6621 {
6622 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
6623 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6624 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : "";
6625 <nav class="main-navigation dw-mod">
6626 <div class="center-container top-container__center-container grid @alignClass dw-mod">
6627 @RenderBlockList(subBlocks)
6628 </div>
6629 </nav>
6630 }
6631
6632 @helper RenderDesktopExtra()
6633 {
6634 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList();
6635
6636 if (subBlocks.Count > 0)
6637 {
6638 <div class="header header-top dw-mod">
6639 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod">
6640 @RenderBlockList(subBlocks)
6641 </div>
6642 </div>
6643 }
6644 }</text>
6645 }
6646
6647 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6648
6649 @using System
6650 @using System.Web
6651 @using Dynamicweb.Rapido.Blocks.Extensibility
6652 @using Dynamicweb.Rapido.Blocks
6653 @using Dynamicweb.Rapido.Blocks.Components.General
6654 @using Dynamicweb.Frontend
6655
6656 @functions {
6657 int impersonationPageId;
6658 string impersonationLayout;
6659 int impersonationFeed;
6660 Block impersonationBar;
6661
6662 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName)
6663 {
6664 string username = "";
6665
6666 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName))
6667 {
6668 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName;
6669 }
6670 else if (!string.IsNullOrEmpty(name))
6671 {
6672 username = name;
6673 }
6674 else if (!string.IsNullOrEmpty(email))
6675 {
6676 username = email;
6677 }
6678 else
6679 {
6680 username = userName;
6681 }
6682 return username;
6683 }
6684
6685 string getUserName(UserViewModel user)
6686 {
6687 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6688 }
6689
6690 string getUserName(Dynamicweb.Security.UserManagement.User user)
6691 {
6692 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6693 }
6694 }
6695
6696 @{
6697 impersonationPageId = GetPageIdByNavigationTag("Impersonation");
6698 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar";
6699 impersonationFeed = GetPageIdByNavigationTag("UsersFeed");
6700
6701 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0 && 2==1)
6702 {
6703 impersonationBar = new Block
6704 {
6705 Id = "ImpersonationBar",
6706 SortId = 50,
6707 Template = RenderImpersonation(),
6708 SkipRenderBlocksList = true,
6709 Design = new Design
6710 {
6711 Size = "auto-width",
6712 HidePadding = true,
6713 RenderType = RenderType.Column
6714 }
6715 };
6716
6717 if (impersonationLayout == "top-bar") {
6718 impersonationBar.SortId = 9;
6719 }
6720
6721 Block impersonationContent = new Block
6722 {
6723 Id = "ImpersonationContent",
6724 SortId = 20
6725 };
6726
6727 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
6728 {
6729 //Render stop impersonation view
6730 impersonationContent.Template = RenderStopImpersonationView();
6731
6732
6733 Modal stopImpersonation = new Modal
6734 {
6735 Id = "StopImpersonation",
6736 Heading = new Heading {
6737 Level = 2,
6738 Title = Translate("Sign out"),
6739 Icon = new Icon {
6740 Name = "fa-sign-out",
6741 Prefix = "fas",
6742 LabelPosition = IconLabelPosition.After
6743 }
6744 },
6745 Width = ModalWidth.Sm,
6746 BodyTemplate = RenderStopImpersonationForm()
6747 };
6748
6749 Block stopImpersonationBlock = new Block
6750 {
6751 Id = "StopImpersonationBlock",
6752 SortId = 10,
6753 Component = stopImpersonation
6754 };
6755 impersonationBar.BlocksList.Add(stopImpersonationBlock);
6756 }
6757 else
6758 {
6759 //Render main view
6760 switch (impersonationLayout)
6761 {
6762 case "right-lower-box":
6763 impersonationContent.BlocksList.Add(
6764 new Block {
6765 Id = "RightLowerBoxHeader",
6766 SortId = 10,
6767 Component = new Heading {
6768 Level = 5,
6769 Title = Translate("View the list of users you can sign in as"),
6770 CssClass = "impersonation-text"
6771 }
6772 }
6773 );
6774 impersonationContent.BlocksList.Add(
6775 new Block {
6776 Id = "RightLowerBoxContent",
6777 SortId = 20,
6778 Template = RenderImpersonationControls()
6779 }
6780 );
6781 break;
6782 case "right-lower-bar":
6783 impersonationContent.BlocksList.Add(
6784 new Block {
6785 Id = "RightLowerBarContent",
6786 SortId = 10,
6787 Template = RenderImpersonationControls()
6788 }
6789 );
6790 break;
6791 case "bar":
6792 default:
6793 impersonationContent.BlocksList.Add(
6794 new Block {
6795 Id = "ViewListLink",
6796 SortId = 20,
6797 Template = RenderViewListLink()
6798 }
6799 );
6800 impersonationContent.BlocksList.Add(
6801 new Block {
6802 Id = "BarTypeaheadSearch",
6803 SortId = 30,
6804 Template = RenderTypeaheadSearch()
6805 }
6806 );
6807 break;
6808 }
6809 }
6810 impersonationBar.BlocksList.Add(impersonationContent);
6811
6812 impersonationBar.BlocksList.Add(
6813 new Block
6814 {
6815 Id = "ImpersonationSearchTemplates",
6816 SortId = 30,
6817 Template = RenderSearchResultTemplate()
6818 }
6819 );
6820 if (impersonationLayout != "bar" && impersonationLayout != "top-bar")
6821 {
6822 impersonationBar.BlocksList.Add(
6823 new Block
6824 {
6825 Id = "ImpersonationSearchScripts",
6826 SortId = 40,
6827 Template = RenderSearchScripts()
6828 }
6829 );
6830 }
6831 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar);
6832 }
6833 }
6834
6835 @helper RenderImpersonation()
6836 {
6837 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList();
6838 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" />
6839 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation">
6840 @if (impersonationLayout == "right-lower-box")
6841 {
6842 @RenderRightLowerBoxHeader()
6843 }
6844 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod">
6845 @*Impersonation*@
6846 @RenderBlockList(subBlocks)
6847 </div>
6848 </div>
6849 }
6850
6851 @helper RenderRightLowerBoxHeader()
6852 {
6853 <div class="impersonation__header dw-mod">
6854 <div class="impersonation__title">@Translate("Impersonation")</div>
6855 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();">
6856 @Render(new Icon
6857 {
6858 Prefix = "fas",
6859 Name = "fa-window-minimize"
6860 })
6861 </label>
6862 </div>
6863 }
6864
6865 @helper RenderStopImpersonationView()
6866 {
6867 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6868 string userName = getUserName(Pageview.User);
6869 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> ";
6870 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;
6871
6872 if (impersonationLayout == "right-lower-box")
6873 {
6874 <div class="u-margin-bottom--lg u-ta-center">
6875 @impersonationText
6876 </div>
6877 <div class="u-margin-bottom--lg u-ta-center">
6878 @RenderSwitchAccountButton()
6879 </div>
6880 @RenderStopImpersonationButton()
6881 }
6882 else
6883 {
6884 <div class="grid grid--align-center impersonation__stop-wrap">
6885 <div class="impersonation-bar-item dw-mod">
6886 @impersonationText
6887 </div>
6888 <div class="impersonation-bar-item dw-mod">
6889 @RenderSwitchAccountButton()
6890 </div>
6891 <div class="impersonation-bar-item dw-mod">
6892 @RenderStopImpersonationButton()
6893 </div>
6894 </div>
6895 }
6896 }
6897
6898 @helper RenderSwitchAccountButton() {
6899 @Render(new Button
6900 {
6901 Href = "/Default.aspx?ID=" + impersonationPageId,
6902 ButtonLayout = ButtonLayout.LinkClean,
6903 Title = Translate("Switch account"),
6904 Icon = new Icon {
6905 Name = "fa-users",
6906 Prefix = "fal",
6907 LabelPosition = IconLabelPosition.After
6908 },
6909 CssClass = "u-no-margin u-color-inherit"
6910 })
6911 }
6912
6913 @helper RenderStopImpersonationForm()
6914 {
6915 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6916 string userName = getUserName(Pageview.User);
6917 int pageId = Model.TopPage.ID;
6918
6919 <form method="post" class="u-no-margin">
6920 @Render(new Button
6921 {
6922 ButtonType = ButtonType.Submit,
6923 ButtonLayout = ButtonLayout.Primary,
6924 Title = Translate("Sign out as") + " " + userName,
6925 OnClick = "logOutImpersonationActions();location.href='/';",
6926 CssClass = "btn--full",
6927 Name = "DwExtranetRemoveSecondaryUser",
6928 })
6929 </form>
6930 @Render(new Button
6931 {
6932 ButtonType = ButtonType.Button,
6933 ButtonLayout = ButtonLayout.Primary,
6934 Title = Translate("Sign out as") + " " + secondaryUserName,
6935 CssClass = "btn--full",
6936 OnClick = "logOutPrimaryUser(event, this)"
6937 })
6938
6939 }
6940
6941 @helper RenderStopImpersonationButton() {
6942 @Render(new Button
6943 {
6944 ButtonType = ButtonType.Button,
6945 ButtonLayout = ButtonLayout.LinkClean,
6946 Title = Translate("Sign out"),
6947 Icon = new Icon {
6948 Name = "fa-sign-out",
6949 Prefix = "fal",
6950 LabelPosition = IconLabelPosition.After
6951 },
6952 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true",
6953 CssClass = "u-no-margin"
6954 })
6955 }
6956
6957 @helper RenderImpersonationControls()
6958 {
6959 <div class="impersonation__controls">
6960 @RenderViewListLink()
6961 @RenderSearchBox()
6962 </div>
6963 @RenderResultsList()
6964 }
6965
6966 @helper RenderViewListLink()
6967 {
6968 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as");
6969 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link";
6970
6971 @Render(new Link {
6972 ButtonLayout = ButtonLayout.None,
6973 Title = title,
6974 Href = "/Default.aspx?ID=" + impersonationPageId,
6975 CssClass = buttonClasses
6976 })
6977 }
6978
6979 @helper RenderSearchBox()
6980 {
6981 <div class="impersonation__search-wrap">
6982 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField">
6983 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)">
6984 <i class="fal fa-search"></i>
6985 </div>
6986 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();">
6987 <i class="fal fa-times"></i>
6988 </div>
6989 </div>
6990 }
6991
6992 @helper RenderTypeaheadSearch()
6993 {
6994 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar"
6995 data-page-size="5"
6996 data-search-feed-id="@impersonationFeed"
6997 data-result-page-id="@impersonationPageId"
6998 data-search-type="user-search"
6999 data-search-parameter-name="q">
7000
7001 <div class="typeahead-search-field">
7002 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")">
7003 <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>
7004 </div>
7005 </div>
7006 }
7007
7008 @helper RenderResultsList()
7009 {
7010 <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>
7011 }
7012
7013 @helper RenderSearchResultTemplate()
7014 {
7015 <script id="ImpersonationSearchResult" type="text/x-template">
7016 {{#.}}
7017 {{#Users}}
7018 <li class="impersonation__search-results-item impersonation-user">
7019 <form method="post" class="impersonation-user__form" name="account{{id}}">
7020 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}">
7021 <div class="impersonation-user__info">
7022 <div class="impersonation-user__name">{{userName}}</div>
7023 <div class="impersonation-user__number">{{customerNumber}}</div>
7024 </div>
7025 @Render(new Button
7026 {
7027 ButtonType = ButtonType.Submit,
7028 ButtonLayout = ButtonLayout.Secondary,
7029 Title = Translate("Sign in as"),
7030 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "")
7031 })
7032 </form>
7033 </li>
7034 {{/Users}}
7035 {{#unless Users}}
7036 <li class="impersonation__search-results-item impersonation__search-results-item--not-found">
7037 @Translate("Your search gave 0 results")
7038 </li>
7039 {{/unless}}
7040 {{/.}}
7041 </script>
7042 }
7043
7044 @helper RenderSearchScripts()
7045 {
7046 <script>
7047 let inputDelayTimer;
7048 function searchKeyUpHandler(e) {
7049 clearTimeout(inputDelayTimer);
7050 let value = e.target.value;
7051 if (value != "") {
7052 inputDelayTimer = setTimeout(function () {
7053 updateResults(value);
7054 }, 500);
7055 } else {
7056 clearResults();
7057 }
7058 };
7059
7060 function updateResults(value) {
7061 if (value == "") {
7062 return null;
7063 }
7064 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value);
7065 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden");
7066 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden");
7067 }
7068
7069 function clearResults() {
7070 document.getElementById("ImpersonationBoxSearchField").value = "";
7071 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults");
7072 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden");
7073 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden");
7074 }
7075 </script>
7076 }
7077 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7078
7079 @using System
7080 @using System.Web
7081 @using System.Collections.Generic
7082 @using Dynamicweb.Rapido.Blocks.Extensibility
7083 @using Dynamicweb.Rapido.Blocks
7084
7085 @{
7086 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
7087 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table";
7088
7089 Block orderLines = new Block
7090 {
7091 Id = "MiniCartOrderLines",
7092 SkipRenderBlocksList = true,
7093 BlocksList = new List<Block>
7094 {
7095 new Block {
7096 Id = "MiniCartOrderLinesList",
7097 SortId = 20,
7098 Template = RenderMiniCartOrderLinesList()
7099 }
7100 }
7101 };
7102
7103 Block orderlinesScriptTemplates = new Block
7104 {
7105 Id = "OrderlinesScriptTemplates"
7106 };
7107
7108 if (orderlinesView == "table")
7109 {
7110 orderLines.Template = RenderMiniCartOrderLinesTable();
7111 orderLines.BlocksList.Add(
7112 new Block
7113 {
7114 Id = "MiniCartOrderlinesTableHeader",
7115 SortId = 10,
7116 Template = RenderMiniCartOrderLinesHeader()
7117 }
7118 );
7119
7120 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates();
7121 }
7122 else
7123 {
7124 orderLines.Template = RenderMiniCartOrderLinesBlocks();
7125 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates();
7126 }
7127
7128 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates);
7129
7130 Block miniCartScriptTemplates = new Block()
7131 {
7132 Id = "MasterMiniCartTemplates",
7133 SortId = 1,
7134 Template = RenderMiniCartScriptTemplates(),
7135 SkipRenderBlocksList = true,
7136 BlocksList = new List<Block>
7137 {
7138 orderLines,
7139 new Block {
7140 Id = "MiniCartFooter",
7141 Template = RenderMiniCartFooter(),
7142 SortId = 50,
7143 SkipRenderBlocksList = true,
7144 BlocksList = new List<Block>
7145 {
7146 new Block {
7147 Id = "MiniCartSubTotal",
7148 Template = RenderMiniCartSubTotal(),
7149 SortId = 30
7150 },
7151 new Block {
7152 Id = "MiniCartFees",
7153 Template = RenderMiniCartFees(),
7154 SortId = 40
7155 },
7156 new Block {
7157 Id = "MiniCartPoints",
7158 Template = RenderMiniCartPoints(),
7159 SortId = 50
7160 },
7161 new Block {
7162 Id = "MiniCartTotal",
7163 Template = RenderMiniCartTotal(),
7164 SortId = 60
7165 },
7166 new Block {
7167 Id = "MiniCartDisclaimer",
7168 Template = RenderMiniCartDisclaimer(),
7169 SortId = 70
7170 },
7171 new Block {
7172 Id = "MiniCartActions",
7173 Template = RenderMiniCartActions(),
7174 SortId = 80
7175 }
7176 }
7177 }
7178 }
7179 };
7180
7181 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates);
7182 }
7183
7184 @helper RenderMiniCartScriptsTableTemplates()
7185 {
7186 string cartPageId = GetPageIdByNavigationTag("MiniCartFeed").ToString();
7187 <script id="MiniCartOrderline" type="text/x-template">
7188 {{#unless isEmpty}}
7189 <tr>
7190 <td class="u-ta-right u-va-middle mini-cart-orderline__quantity {{isDiscontinuedClass}}">
7191 <div class="u-flex u-flex--align-center grid--direction-column">
7192 @*@Render(new Button {
7193 Icon = new Icon { Prefix = "fas", Name = "fa-caret-up", LabelPosition = IconLabelPosition.After },
7194 CssClass = "value-button u-no-margin",
7195 ButtonType = ButtonType.Button,
7196 ButtonLayout = ButtonLayout.None,
7197 ExtraAttributes = new Dictionary<string, string>
7198 {
7199 { "data-operation", "increase"},
7200 }
7201 })*@
7202 <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/>
7203 <input type="text" value="{{ProductBaseUnit}}" class="quantity" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/>
7204 @*@Render(new Button {
7205 Icon = new Icon { Prefix = "fas", Name = "fa-caret-down", LabelPosition = IconLabelPosition.After },
7206 CssClass = "value-button u-no-margin",
7207 ButtonType = ButtonType.Button,
7208 ButtonLayout = ButtonLayout.None,
7209 ExtraAttributes = new Dictionary<string, string>
7210 {
7211 { "data-operation", "decrease"},
7212 }
7213 })*@
7214 </div>
7215 </td>
7216 <td class="mini-cart-orderline__image u-va-middle {{isDiscontinuedClass}}">
7217 <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>
7218 </td>
7219 <td class="u-va-middle {{isDiscontinuedClass}}">
7220 <a href="{{link}}" class="u-padding-top mini-cart-orderline__name quick-view" data-load-page="{{link}}" title="{{name}}">{{name}}</a>
7221 <div class="u-padding-bottom">{{productnumber}}</div>
7222 {{#if variantname}}
7223 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a>
7224 {{/if}}
7225 {{#if unitname}}
7226 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div>
7227 {{/if}}
7228 </td>
7229 {{#unless hidePricesOrderline}}
7230 <td class="u-ta-right u-va-middle mini-cart-orderline__price test mini-cart-orderline__price_{{orderLineId}} {{isDiscontinuedClass}}">
7231 {{#if pointsTotal}}
7232 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
7233 {{else}}
7234 {{totalprice}}
7235 {{/if}}
7236 </td>
7237 {{/unless}}
7238 <td class="u-ta-right u-va-middle mini-cart-orderline__delete {{#ifCond isDiscontinuedClass '!==' ""}} u-hidden-border-bottom {{/ifCond}}">
7239 @Render(new Button
7240 {
7241 OnClick = "deleteOrderline('" + cartPageId + "', '{{id}}', '{{orderLineId}}')",
7242 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After },
7243 CssClass = "u-no-margin",
7244 ButtonType = ButtonType.Button,
7245 ButtonLayout = ButtonLayout.None
7246 })
7247 </td>
7248 </tr>
7249 {{#if discontinued}}
7250 <tr class="disabled">
7251 <td class="discontinued-text" style="border-top: 0;" colspan="5">{{discontinuedText}}</td>
7252 </tr>
7253 {{/if}}
7254 {{/unless}}
7255
7256 </script>
7257
7258 <script id="MiniCartOrderlineDiscount" type="text/x-template">
7259 {{#unless isEmpty}}
7260 <tr class="table__row--no-border">
7261 <td class="u-w60px"> </td>
7262 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td>
7263 <td class="u-ta-right"> </td>
7264 {{#unless hidePrices}}
7265 <td class="u-ta-right">{{totalprice}}</td>
7266 {{/unless}}
7267 </tr>
7268 {{/unless}}
7269 </script>
7270 }
7271
7272 @helper RenderMiniCartScriptsListTemplates()
7273 {
7274 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
7275
7276 <script id="MiniCartOrderline" type="text/x-template">
7277 {{#unless isEmpty}}
7278 <div class="mini-cart-orderline grid dw-mod">
7279 <div class="grid__col-4">
7280 <a href="{{link}}" class="{{hideimage}}">
7281 <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}}">
7282 </a>
7283 </div>
7284 <div class="grid__col-8">
7285 <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>
7286 {{#if variantname}}
7287 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div>
7288 {{/if}}
7289 {{#if unitname}}
7290 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div>
7291 {{/if}}
7292 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div>
7293
7294 <div class="grid__cell-footer">
7295 <div class="grid__cell">
7296 {{#unless hidePrices}}
7297 <div class="u-pull--left mini-cart-orderline__price dw-mod">
7298 {{#if pointsTotal}}
7299 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
7300 {{else}}
7301 {{totalprice}}
7302 {{/if}}
7303 </div>
7304 {{/unless}}
7305 <button type="button"
7306 title="@Translate("Remove orderline")"
7307 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod"
7308 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button>
7309 </div>
7310 </div>
7311 </div>
7312 </div>
7313 {{/unless}}
7314 </script>
7315
7316 <script id="MiniCartOrderlineDiscount" type="text/x-template">
7317 {{#unless isEmpty}}
7318 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod">
7319 <div class="grid__col-4">
7320 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div>
7321 </div>
7322 {{#unless hidePrices}}
7323 <div class="grid__col-8">{{totalprice}}</div>
7324 {{/unless}}
7325 </div>
7326 {{/unless}}
7327 </script>
7328 }
7329
7330 @helper RenderMiniCartScriptTemplates()
7331 {
7332 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
7333 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
7334 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage"));
7335 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
7336
7337 <script id="MiniCartContent" type="text/x-template">
7338 {{#.}}
7339 {{#unless isEmpty}}
7340 @if (miniCartUseGoogleTagManager)
7341 {
7342 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
7343 }
7344 @RenderBlockList(subBlocks)
7345 {{/unless}}
7346 {{/.}}
7347 </script>
7348 }
7349
7350 @helper RenderMiniCartOrderLinesTable()
7351 {
7352 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
7353
7354 <div class="u-overflow-auto">
7355 <table class="table mini-cart-table dw-mod" data-test="true">
7356
7357 @RenderBlockList(subBlocks)
7358 </table>
7359 </div>
7360 }
7361
7362 @helper RenderMiniCartOrderLinesBlocks()
7363 {
7364 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
7365
7366 <div class="u-overflow-auto">
7367 @RenderBlockList(subBlocks)
7368 </div>
7369 }
7370
7371 @helper RenderMiniCartOrderLinesHeader()
7372 {
7373 @*<thead>
7374 <tr>
7375 <td> </td>
7376 <td>@Translate("Product")</td>
7377 <td class="u-ta-right">@Translate("Qty")</td>
7378 <td class="u-ta-right">@Translate("Price")</td>
7379 </tr>
7380 </thead>*@
7381 }
7382
7383 @helper RenderMiniCartOrderLinesList()
7384 {
7385 <text>
7386 {{#OrderLines}}
7387 {{#ifCond template "===" "CartOrderline"}}
7388 {{>MiniCartOrderline}}
7389 {{/ifCond}}
7390 {{#ifCond template "===" "CartOrderlineMobile"}}
7391 {{>MiniCartOrderline}}
7392 {{/ifCond}}
7393 {{#ifCond template "===" "CartOrderlineDiscount"}}
7394 {{>MiniCartOrderlineDiscount}}
7395 {{/ifCond}}
7396 {{/OrderLines}}
7397 </text>
7398 }
7399
7400 @helper RenderMiniCartFees()
7401 {
7402 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7403 if (!pointShop)
7404 {
7405 <text>
7406 {{#unless hidePaymentfee}}
7407 <div class="grid">
7408 <div class="grid__col-6 grid__col--bleed-y">
7409 {{paymentmethod}}
7410 </div>
7411 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div>
7412 </div>
7413 {{/unless}}
7414 </text>
7415 }
7416 <text>
7417 {{#unless hideShippingfee}}
7418 <div class="grid">
7419 <div class="grid__col-6 grid__col--bleed-y">
7420 {{shippingmethod}}
7421 </div>
7422 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div>
7423 </div>
7424 {{/unless}}
7425 </text>
7426 <text>
7427 {{#if hasTaxSettings}}
7428 <div class="grid">
7429 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div>
7430 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div>
7431 </div>
7432 {{/if}}
7433 </text>
7434 }
7435
7436 @helper RenderMiniCartFooter()
7437 {
7438 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList();
7439
7440 <div class="mini-cart__footer u-border-top u-padding-top dw-mod">
7441 @RenderBlockList(subBlocks)
7442 </div>
7443 }
7444
7445 @helper RenderMiniCartActions()
7446 {
7447 int cartPageId = GetPageIdByNavigationTag("CartPage");
7448
7449 <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>
7450 <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>
7451 }
7452
7453 @helper RenderMiniCartPoints()
7454 {
7455 <text>
7456 {{#if earnings}}
7457 <div class="grid">
7458 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div>
7459 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
7460 <div>
7461 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")
7462 </div>
7463 </div>
7464 </div>
7465 {{/if}}
7466 </text>
7467 }
7468
7469 @helper RenderMiniCartSubTotal()
7470 {
7471 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID);
7472 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7473 if (!pointShop)
7474 {
7475 @*<text>
7476 {{#unless hideSubTotal}}
7477 <div class="grid dw-mod u-bold">
7478 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div>
7479 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
7480 @if (hasTaxSettings)
7481 {
7482 <text>{{subtotalpricewithouttaxes}}</text>
7483 }
7484 else
7485 {
7486 <text>{{subtotalprice}}</text>
7487 }
7488 </div>
7489 </div>
7490 {{/unless}}
7491 </text>*@
7492 }
7493 }
7494
7495 @helper RenderMiniCartTotal()
7496 {
7497 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7498 <text>
7499 {{#unless hidePrices}}
7500 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod">
7501 <div class="grid__col-6">@Translate("Total")</div>
7502 <div class="grid__col-6 grid--align-end">
7503 <div>
7504 @if (pointShop)
7505 {
7506 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points")
7507 }
7508 else
7509 {
7510 <text>{{totalprice}}</text>
7511 }
7512 </div>
7513 </div>
7514 </div>
7515 {{/unless}}
7516 </text>
7517 }
7518
7519 @helper RenderMiniCartDisclaimer()
7520 {
7521 <text>
7522 {{#if showCheckoutDisclaimer}}
7523 <div class="grid u-margin-bottom u-ta-right">
7524 <small class="grid__col-12">{{checkoutDisclaimer}}</small>
7525 </div>
7526 {{/if}}
7527 </text>
7528 }
7529 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7530
7531 @using Dynamicweb.Rapido.Blocks.Extensibility
7532 @using Dynamicweb.Rapido.Blocks
7533 @using Dynamicweb.Rapido.Blocks.Components.General
7534 @using Dynamicweb.Rapido.Blocks.Components
7535 @using Dynamicweb.Rapido.Services
7536
7537 @{
7538 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
7539 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
7540 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
7541
7542 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType))
7543 {
7544 if (addToCartNotificationType == "modal")
7545 {
7546 Block addToCartNotificationModal = new Block
7547 {
7548 Id = "AddToCartNotificationModal",
7549 Template = RenderAddToCartNotificationModal()
7550 };
7551
7552 Block addToCartNotificationScript = new Block
7553 {
7554 Id = "AddToCartNotificationScript",
7555 Template = RenderAddToCartNotificationModalScript()
7556 };
7557 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal);
7558 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7559 }
7560 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
7561 {
7562 Block addToCartNotificationScript = new Block
7563 {
7564 Id = "AddToCartNotificationScript",
7565 Template = RenderAddToCartNotificationToggleScript()
7566 };
7567 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7568 }
7569 }
7570 }
7571
7572 @helper RenderAddToCartNotificationModal()
7573 {
7574 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
7575 }
7576
7577 @helper RenderAddToCartNotificationModalScript()
7578 {
7579 int cartPageId = GetPageIdByNavigationTag("CartPage");
7580
7581 <script id="LastAddedProductTemplate" type="text/x-template">
7582 @{
7583
7584 Modal lastAddedProduct = new Modal
7585 {
7586 Id = "LastAddedProduct",
7587 Heading = new Heading
7588 {
7589 Level = 2,
7590 Title = Translate("Product is added to the cart")
7591 },
7592 Width = ModalWidth.Md,
7593 BodyTemplate = RenderModalContent()
7594 };
7595
7596 lastAddedProduct.AddActions(
7597 new Button
7598 {
7599 ButtonType = ButtonType.Button,
7600 ButtonLayout = ButtonLayout.Secondary,
7601 Title = Translate("Continue shopping"),
7602 CssClass = "u-pull--left u-no-margin btn--sm",
7603 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false"
7604 },
7605 new Link
7606 {
7607 Href = "/Default.aspx?ID=" + cartPageId,
7608 ButtonLayout = ButtonLayout.Secondary,
7609 CssClass = "u-pull--right u-no-margin btn--sm",
7610 Title = Translate("Proceed to checkout")
7611 }
7612 );
7613
7614 @Render(lastAddedProduct)
7615 }
7616 </script>
7617
7618 }
7619
7620 @helper RenderModalContent()
7621 {
7622 <div class="grid">
7623 <div class="grid__col-2">
7624 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true })
7625 </div>
7626 <div class="u-padding grid--align-self-center">
7627 <span>{{quantity}}</span> x
7628 </div>
7629 <div class="grid__col-auto grid--align-self-center">
7630 <div>{{productInfo.name}}</div>
7631 {{#if productInfo.variantName}}
7632 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
7633 {{/if}}
7634 {{#if productInfo.unitName}}
7635 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
7636 {{/if}}
7637 </div>
7638 </div>
7639 }
7640
7641 @helper RenderAddToCartNotificationToggleScript()
7642 {
7643 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
7644
7645 <script>
7646 document.addEventListener('addToCart', function () {
7647 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
7648 });
7649 </script>
7650 }
7651 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7652
7653 @using System
7654 @using System.Web
7655 @using System.Collections.Generic
7656 @using Dynamicweb.Rapido.Blocks.Extensibility
7657 @using Dynamicweb.Rapido.Blocks
7658 @using Dynamicweb.Rapido.Blocks.Components.General
7659 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Math
7660
7661 @functions {
7662 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
7663 }
7664
7665 @{
7666 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content");
7667 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content");
7668 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content");
7669 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header");
7670 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header");
7671 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header");
7672
7673 Block masterFooterContent = new Block()
7674 {
7675 Id = "MasterFooterContent",
7676 SortId = 10,
7677 Template = RenderFooter(),
7678 SkipRenderBlocksList = true
7679 };
7680 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
7681
7682 /*if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
7683 {
7684 Block masterFooterColumnOne = new Block
7685 {
7686 Id = "MasterFooterColumnOne",
7687 SortId = 10,
7688 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
7689 Design = new Design
7690 {
7691 Size = "auto",
7692 RenderType = RenderType.Column
7693 }
7694 };
7695 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
7696 }
7697
7698 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
7699 {
7700 Block masterFooterColumnTwo = new Block
7701 {
7702 Id = "MasterFooterColumnTwo",
7703 SortId = 20,
7704 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent),
7705 Design = new Design
7706 {
7707 Size = "auto",
7708 RenderType = RenderType.Column
7709 }
7710 };
7711 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
7712 }
7713
7714 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
7715 {
7716 Block masterFooterColumnThree = new Block
7717 {
7718 Id = "MasterFooterColumnThree",
7719 SortId = 30,
7720 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent),
7721 Design = new Design
7722 {
7723 Size = "auto",
7724 RenderType = RenderType.Column
7725 }
7726 };
7727 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
7728 }*/
7729
7730 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
7731 {
7732 Block masterFooterNewsletterSignUp = new Block
7733 {
7734 Id = "MasterFooterNewsletterSignUp",
7735 SortId = 40,
7736 Template = RenderFooterNewsletterSignUp(),
7737 Design = new Design
7738 {
7739 Size = "auto",
7740 RenderType = RenderType.Column
7741 }
7742 };
7743 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp);
7744 }
7745
7746 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0)
7747 {
7748 Block masterFooterSocialLinks = new Block
7749 {
7750 Id = "MasterFooterSocialLinks",
7751 SortId = 50,
7752 Template = RenderFooterSocialLinks(),
7753 Design = new Design
7754 {
7755 Size = "auto",
7756 RenderType = RenderType.Column
7757 }
7758 };
7759 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
7760 }
7761
7762 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
7763 {
7764 Block masterFooterPayments = new Block
7765 {
7766 Id = "MasterFooterPayments",
7767 SortId = 60,
7768 Template = RenderFooterPayments(),
7769 Design = new Design
7770 {
7771 Size = "12",
7772 RenderType = RenderType.Column
7773 }
7774 };
7775 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
7776 }
7777
7778 Block masterFooterCopyright = new Block
7779 {
7780 Id = "MasterFooterCopyright",
7781 SortId = 70,
7782 Template = RenderFooterCopyright(),
7783 Design = new Design
7784 {
7785 CssClass = "u-full-width"
7786 }
7787 };
7788 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
7789 }
7790
7791 @helper RenderFooter()
7792 {
7793 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
7794 var imageSource = "/Files/Images/FooterWave.svg";
7795 List<int> pages = new List<int>();
7796 pages.Add(6953);
7797 var test = 0;
7798 var newCartPageId = GetPageIdByNavigationTag("CartPageV2");
7799 bool isNewCartPage = Pageview.Page.ID == newCartPageId;
7800 string centerBackgroundClass = isNewCartPage ? "background-color: #F9F7F6 !important" : "";
7801
7802 if (Model.Item != null)
7803 {
7804 test = Int32.Parse(Model?.Item?.PageID.ToString());
7805 }
7806 var footerBackgroundColor = "";
7807 if (test != 0)
7808 {
7809 footerBackgroundColor = pages.Contains(Model.Item.PageID) ? "bg-beige" : "";
7810
7811 <footer class="footer dw-mod @footerBackgroundColor" id="@Model.Item.PageID" style="position: relative;">
7812 <div class="backdrop">
7813 @{
7814 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg");
7815 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg");
7816 }
7817 <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"/>
7818 </div>
7819 <div class="footer__content">
7820 <div class="content-container">
7821 <div class="content-row">
7822 @RenderBlockList(subBlocks)
7823 </div>
7824 </div>
7825 </div>
7826 </footer>
7827 }else
7828 {
7829 <footer class="footer dw-mod " style="position: relative; @centerBackgroundClass">
7830 <div class="backdrop">
7831 @{
7832 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg");
7833 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg");
7834 }
7835 <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"/>
7836 </div>
7837 <div class="footer__content">
7838 <div class="content-container">
7839 <div class="content-row">
7840 @RenderBlockList(subBlocks)
7841 </div>
7842 </div>
7843 </div>
7844 </footer>
7845 }
7846 }
7847
7848 @helper RenderFooterColumn(string header, string content)
7849 {
7850 <h3 class="footer__heading dw-mod">@header</h3>
7851 <div class="footer__content dw-mod">
7852 @content
7853 </div>
7854 }
7855
7856 @helper RenderFooterNewsletterSignUp()
7857 {
7858 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString();
7859 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart };
7860
7861 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId });
7862 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" });
7863 form.Add(new TextField
7864 {
7865 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"),
7866 Type = TextFieldType.Email,
7867 ActionButton = new Button
7868 {
7869 ButtonType = ButtonType.Submit, Id = "Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed"
7870 }
7871 });
7872
7873 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
7874 <div class="footer__content dw-mod">
7875 @Render(form)
7876 </div>
7877 }
7878
7879 @helper RenderFooterSocialLinks()
7880 {
7881 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3>
7882 <div class="footer__content dw-mod">
7883 <div class="collection dw-mod">
7884 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
7885 {
7886 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
7887 string socialIconClass = socialIcon.SelectedValue;
7888 string socialIconTitle = socialIcon.SelectedName;
7889 string socialLink = socialitem.GetString("Link");
7890
7891 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener">
7892 <i class="@socialIconClass fa-2x"></i>
7893 </a>
7894 }
7895 </div>
7896 </div>
7897 }
7898
7899 @helper RenderFooterPayments()
7900 {
7901 <div class="footer__content dw-mod">
7902 <div class="collection dw-mod">
7903 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments"))
7904 {
7905 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel;
7906 string paymentImage = null;
7907 string paymentTitle = paymentItem.SelectedName;
7908 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault();
7909 if (selected != null)
7910 {
7911 paymentImage = selected.Icon;
7912 }
7913
7914 <div class="footer__card-type">
7915 <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"/>
7916 </div>
7917 }
7918 </div>
7919 </div>
7920 }
7921
7922 @helper RenderFooterCopyright()
7923 {
7924 <div class="footer__copyright u-position-relative">
7925 <div class="footer__copyright-logo">
7926 <img loadin="lazy" src="/Files/Images/dnv-good-fit.png" width="129" height="122" alt="footer-icon"/>
7927 </div>
7928 <p class="footer__copyright-text">© @DateTime.Now.Year @Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p>
7929
7930
7931 </div>
7932 }
7933 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
7934
7935 @using System
7936 @using System.Web
7937 @using System.Collections.Generic
7938 @using Dynamicweb.Rapido.Blocks.Extensibility
7939 @using Dynamicweb.Rapido.Blocks
7940 @using Dynamicweb.Ecommerce.Common
7941 @using WebApp.Singleton
7942
7943 @{
7944 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
7945
7946 Block masterScriptReferences = new Block()
7947 {
7948 Id = "MasterScriptReferences",
7949 SortId = 1,
7950 Template = RenderMasterScriptReferences()
7951 };
7952 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
7953 }
7954
7955 @helper RenderMasterScriptReferences()
7956 {
7957 var customJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/js/custom.js"));
7958 var appJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/app.bundle.js"));
7959 var foodCalendarJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js"));
7960 var shoppingListJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js"));
7961 var customGeneralJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js"));
7962 var foodCalendarExtensionJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendarExtension.bundle.js"));
7963
7964 var buildNumber = WebAppConfiguration.BuildNumber;
7965 string customJsSrc = $"/Files/Templates/Designs/Rapido/js/custom.js?buildNumber={buildNumber}";
7966 string appJsSrc = $"/Files/Templates/Designs/Rapido/dist/app.bundle.js?buildNumber={buildNumber}";
7967 string foodCalendarJsSrc = $"/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js?buildNumber={buildNumber}";
7968 string shoppingListJsSrc = $"/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js?buildNumber={buildNumber}";
7969 string customGeneralJsSrc = $"/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js?buildNumber={buildNumber}";
7970 var masterGeneralJsSrc = $"/Files/Templates/Designs/Rapido/js/master.js?buildNumber={buildNumber}";
7971
7972 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js" defer></script>
7973 <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js" defer></script>
7974 <script src="https://unpkg.com/@("@reduxjs")/toolkit@1.9.7/dist/redux-toolkit.umd.js" defer></script>
7975 <script src="/Files/Templates/Designs/Rapido/js/master.js?v=5" defer></script>
7976
7977 //vue referrences
7978 <script src="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.js?x=@buildNumber" defer type="module"></script>
7979 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.css?x=@buildNumber">
7980 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?x=@buildNumber">
7981
7982 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
7983 {
7984 <script src="/Files/Templates/Designs/Rapido/js/axios.js" defer></script>
7985
7986 <script src="@customJsSrc" defer></script>
7987 <script src="@appJsSrc" type="module"></script>
7988 <script src="@foodCalendarJsSrc" type="module"></script>
7989 <script src="@shoppingListJsSrc" type="module"></script>
7990 <script src="@customGeneralJsSrc" type="module"></script>
7991
7992
7993 PushPromise("/Files/Templates/Designs/Rapido/js/axios.js");
7994 PushPromise(customJsSrc);
7995 PushPromise(foodCalendarJsSrc);
7996 PushPromise(shoppingListJsSrc);
7997 PushPromise(customGeneralJsSrc);
7998 }
7999
8000 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js");
8001 PushPromise("/Files/Templates/Designs/Rapido/js/master.js?v=5");
8002 }
8003
8004 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
8005
8006 @using System
8007 @using System.Web
8008 @using System.Collections.Generic
8009 @using Dynamicweb.Rapido.Blocks.Extensibility
8010 @using Dynamicweb.Rapido.Blocks
8011 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8012 @using Dynamicweb.Rapido.Services
8013 @using Dynamicweb.Ecommerce.ProductCatalog
8014
8015 @{
8016 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
8017 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
8018 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID"));
8019
8020 if (!navigationItemsHideSearch || isFavoriteList)
8021 {
8022 Block masterSearchScriptTemplates = new Block()
8023 {
8024 Id = "MasterSearchScriptTemplates",
8025 SortId = 1,
8026 Template = RenderSearchScriptTemplates()
8027 };
8028
8029 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
8030 }
8031 }
8032
8033 @helper RenderSearchScriptTemplates()
8034 {
8035 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
8036 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
8037 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
8038 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
8039 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults");
8040 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton");
8041 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton");
8042 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton");
8043 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
8044 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star";
8045 string favoriteIcon = "fas fa-" + selectedFavoriteIcon;
8046 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon;
8047
8048 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID");
8049 string classMaxWidth = Pageview.Device.ToString() != "Mobile" ? "u-max-w260px" : "";
8050 string searchParameter = HttpContext.Current.Request.QueryString.Get("Search");
8051 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
8052 var showCartons = currentUser?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString();
8053
8054
8055 <script id="SearchGroupsTemplate" type="text/x-template">
8056 {{#.}}
8057 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
8058 {{/.}}
8059 </script>
8060
8061 <script id="SearchProductsTemplate" type="text/x-template">
8062 <div style="padding-top:15px; padding-left: 15px; padding-right: 15px;" class="dropdown__item--seperator bs-mb-4 bs-border-secondary dw-mod ">{{label}}
8063
8064 {{#each .}}
8065 {{#each FacetGroups}}
8066 <h4 class="bs-mb-3 u-color-inherit">@Translate("Kategorier")</h4>
8067 <div class="display-grid--two-columns bs-pb-4 ">
8068 {{#FacetOptions}}
8069 {{#ifCond queryParameter "===" "Category"}}
8070 <span class="u-color-inherit"
8071 style="font-weight: 600; cursor: pointer;"
8072 onclick="searchInCategoryButton(@productsPageId, {{ name }})">
8073 {{label}} ({{count}})
8074 </span>
8075 {{/ifCond}}
8076 {{/FacetOptions}}
8077 </div>
8078 {{/each}}
8079 {{/each}}
8080
8081 </div>
8082 {{#each .}}
8083 {{#each ProductsContainer}}
8084 {{#Product}}
8085 {{#ifCond template "!==" "SearchMore"}}
8086 {{#ifCond isDiscontinuedClass "!==" "disabled"}}
8087 <li class="dropdown__item test dropdown__item--seperator dw-mod">
8088 @if (useFacebookPixel)
8089 {
8090 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
8091 }
8092 @if (useGoogleTagManager)
8093 {
8094 <text>{{{googleEnchantImpression googleImpression}}}</text>
8095 }
8096 <div class="search__product-wrapper grid--align-center">
8097 <div class="search__product-wrapper-infos">
8098 <a href="{{link}}"
8099 class="js-typeahead-link quick-view u-color-inherit u-pull--left bs-d-flex" data-load-page="{{link}}"
8100 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}"
8101 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}">
8102 <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>
8103 <div class="u-pull--left">
8104 <div class="u-bold u-truncate-text js-typeahead-name u-flex grid--align-center">
8105 <span class="u-padding-right">{{productId}}</span>
8106 <span class="u-flex grid--align-center u-padding-right">
8107 <i class="fas fa-circle cart-circle"></i>
8108 </span>
8109 <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">
8110 {{name}}{{#if variantName}}, {{variantName}}{{/if}}
8111 {{#ifCond ProductCountryManufacturerCode '===' "NO"}}
8112 <div class="product-country">
8113 <img height="18px" src='@("/Admin/Images/Flags/flag_" + "no" +".png")' title="@Translate("Norway")" alt='@Translate("Norway flag")'>
8114 </div>
8115 {{/ifCond}}
8116 </span>
8117 </div>
8118 <div class="u-flex grid--align-center u-truncate-text product-search-description">
8119 {{#if transit}}
8120 <span class="cart-table__product-name-infos-transit">
8121 <div class="transit-container u-margin-right" title="@Translate("Transittvare")">
8122 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
8123 <circle cx="10" cy="10" r="10" fill="#0052A0" />
8124 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white" />
8125 </svg>
8126 <div class="tooltip">@Translate("Transittvare")</div>
8127 </div>
8128 </span>
8129 {{/if}}
8130 {{#if showBreakableIcon}}
8131 <span class="cart-table__product-name-infos-showbreakableicon">
8132 <div class="transit-container u-margin-right" title="@Translate("Anbrekksvare")">
8133 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
8134 <circle cx="10" cy="10" r="10" fill="#0052A0" />
8135 <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" />
8136 </svg>
8137 <div class="tooltip">@Translate("Anbrekksvare")</div>
8138 </div>
8139 </span>
8140 {{/if}}
8141 <span class="js-typeahead-name u-padding-right u-flex grid--align-center search__manufacture-name"> {{ManufacturerName}}</span>
8142 <span class="u-flex grid--align-center u-padding-right"><i class="fas fa-circle cart-circle"></i></span>
8143 <span class="package-contents search__product-package u-truncate-text">{{truncateFirst20 ProductPackageContents}}</span>
8144
8145
8146 {{#ifCond StorageAvailableInSessionLocation '!==' true}}
8147 {{#ifCond warehouseDescription '!==' ""}}
8148 {{#ifCond warehouseDescription '!==' null}}
8149
8150 @if (Pageview.User != null)
8151 {
8152 <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>
8153 }
8154
8155 {{/ifCond}}
8156 {{/ifCond}}
8157
8158
8159 {{#ifCond stockDescriptiontext '!==' ""}}
8160 {{#ifCond stockDescriptiontext '!==' null}}
8161 {{#ifCond stockDescriptiontext '!==' "Lagerført"}}
8162
8163 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Limited")"}}
8164
8165 @if (Pageview.User != null)
8166 {
8167 <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>
8168 }
8169
8170 {{/ifCond}}
8171
8172 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Unavailable")"}}
8173
8174 @if (Pageview.User != null)
8175 {
8176 <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>
8177 }
8178
8179 {{/ifCond}}
8180
8181 {{/ifCond}}
8182 {{/ifCond}}
8183 {{/ifCond}}
8184 {{/ifCond}}
8185 </div>
8186 @* @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed())
8187 {
8188 if (pointShopOnly)
8189 {
8190 <text>
8191 {{#if havePointPrice}}
8192 <div>
8193 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
8194 </div>
8195 {{else}}
8196 <small class="help-text u-no-margin">@Translate("Not available")</small>
8197 {{/if}}
8198 {{#unless canBePurchasedWithPoints}}
8199 {{#if havePointPrice}}
8200 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
8201 {{/if}}
8202 {{/unless}}
8203 </text>
8204 }
8205 else
8206 {
8207 <div>{{price}}</div>
8208 }
8209 }*@
8210 </div>
8211 </a>
8212 </div>
8213 <div class="u-flex search__product-wrapper-price">
8214 <div class="u-margin-left">
8215 @{
8216 var viewBtn = new Link
8217 {
8218 Href = "{{link}}",
8219 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}",
8220 ButtonLayout = ButtonLayout.Secondary,
8221 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside u-hidden",
8222 Title = Translate("View")
8223 };
8224 }
8225
8226 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
8227 {
8228 <text>{{#if hideAddToCartButton}}</text>
8229 @Render(viewBtn)
8230 <text>{{else}}</text>
8231 <div class="u-flex grid--align-center grid--wrap">
8232 <div class="price price--product-list price--micro u-margin-right dw-mod">{{price}} / {{ProductBaseUnit}}
8233 @*<span class="purchase-unit-details dw-mod u-color-dark u-margin-left--lg">{{ProductQuantityPerPurchaseUnit}} x</span>*@
8234 </div>
8235 <div class="add-quantity-container u-flex u-flex--align">
8236
8237 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
8238 { <div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" >
8239 <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>
8240 @Render(new NumberField
8241 {
8242 Id = "SearchQuantity{{productId}}",
8243 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}",
8244 Value = "",
8245 ExtraAttributes = new Dictionary<string, string>
8246 {
8247 {"data-breakable", "{{Breakable}}"},
8248 {"data-prev-value", "0"},
8249 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"},
8250 {"data-product-id", "{{productId}}"},
8251 {"tabindex", "0"},
8252 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8253 { "step", "{{ProductQuantityPerPurchaseUnit}}"},
8254 { "data-type", "Search" },
8255 { "data-name", "{{name}}"},
8256 }
8257 })
8258 <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>
8259 </div>
8260 @Render(new Button {
8261 OnClick = "enableField(this)",
8262 Id = "SearchQuantityBtn{{productId}}",
8263 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After },
8264 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class",
8265 ButtonType = ButtonType.Button,
8266 ButtonLayout = ButtonLayout.Primary,
8267 ExtraAttributes = new Dictionary<string, string>
8268 {
8269 { "data-type", "Search"},
8270 { "data-breakable", "{{Breakable}}"},
8271 { "data-product-info", "{{productInfo}}" },
8272 { "data-unit-id", "{{unitId}}" },
8273 { "data-variant-id", "{{variantid}}" },
8274 { "data-product-id", "{{productId}}" },
8275 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" },
8276 { "data-unit-price","{{priceDouble}}" },
8277 { "data-link","{{link}}" },
8278 { "data-unit-base","{{ProductBaseUnit}}"},
8279 { "{{disableButton}}", ""}
8280 }
8281
8282 })
8283
8284 if (showCartons == "True")
8285 {
8286 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div>
8287 }
8288 }
8289 else
8290 {<div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" >
8291 <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>
8292 @Render(new NumberField {
8293 Id = "SearchQuantity{{productId}}",
8294 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}",
8295 Value = "",
8296 ExtraAttributes = new Dictionary<string, string>
8297 {
8298 {"data-breakable", "{{Breakable}}"},
8299 {"data-prev-value", "0"},
8300 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"},
8301 {"data-product-id", "{{productId}}"},
8302 {"tabindex", "0"},
8303 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8304 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"},
8305 {"data-type", "Search"},
8306 { "data-name", "{{name}}"},
8307 {"style","width: 40px !important;height:2ch!important;"}
8308 }
8309 })
8310 <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>
8311 </div>
8312 @Render(new Button {
8313 OnClick = "enableField(this)",
8314 Id = "SearchQuantityBtn{{productId}}",
8315 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After },
8316 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class",
8317 ButtonType = ButtonType.Button,
8318 ButtonLayout = ButtonLayout.Primary,
8319 ExtraAttributes = new Dictionary<string, string>
8320 {
8321 { "data-type", "Search"},
8322 { "data-breakable", "{{Breakable}}"},
8323 { "data-product-info", "{{productInfo}}" },
8324 { "data-unit-id", "{{unitId}}" },
8325 { "data-variant-id", "{{variantid}}" },
8326 { "data-product-id", "{{productId}}" },
8327 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" },
8328 { "data-unit-price","{{priceDouble}}" },
8329 { "data-link","{{link}}" },
8330 { "data-unit-base","{{ProductBaseUnit}}"},
8331 { "{{disableButton}}", ""}
8332 }
8333
8334 })
8335 if (showCartons == "True")
8336 {
8337 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div>
8338 }
8339
8340 }
8341
8342 <div class="loader-container u-hidden">
8343 <i class="fas fa-circle-notch fa-spin preloader"></i>
8344 </div>
8345
8346 </div>
8347 </div>
8348
8349 <text>{{/if}}</text>
8350 }
8351 else if (showViewButton)
8352 {
8353 @Render(viewBtn)
8354 }
8355 @if (showAddToDownloadButton)
8356 {
8357 <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}}">
8358 <i class="fas fa-plus js-button-icon"></i>
8359 </button>
8360 }
8361 </div>
8362
8363 @if (currentUser != null)
8364 {
8365 <div class="favorites product-list__details-favorites">
8366 <div class="favorites product-list__details-favorites bs-d-flex bs-align-items-center bs-justify-content-center" style="position: relative;">
8367 <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")">
8368 <img class="popup-toggle" data-product-number="{{number}}" height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/>
8369 </a>
8370 <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;">
8371 </div>
8372 </div>
8373 </div>
8374 }
8375
8376 </div>
8377 </div>
8378 </li>
8379 {{/ifCond}}
8380 {{/ifCond}}
8381
8382 @*{{#ifCond template "===" "SearchMore"}}
8383 {{>SearchMoreProducts}}
8384 {{/ifCond}}*@
8385 {{/Product}}
8386 {{else}}
8387 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
8388 @Translate("Your search gave 0 results")
8389 </li>
8390 {{/each}}
8391 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod js-typeahead">
8392 <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()">
8393 @Translate("View all")
8394 </button>
8395 </li>
8396 {{/each}}
8397 </script>
8398
8399 <script id="SearchMoreProducts" type="text/x-template">
8400 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
8401 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
8402 @Translate("View all")
8403 </a>
8404 </li>
8405 </script>
8406
8407 <script id="SearchMorePages" type="text/x-template">
8408 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
8409 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
8410 @Translate("View all")
8411 </a>
8412 </li>
8413 </script>
8414
8415 <script id="SearchPagesTemplate" type="text/x-template">
8416 {{#each .}}
8417 {{#ifCond template "!==" "SearchMore"}}
8418 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod">
8419 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit">
8420 <div class="u-margin-right"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
8421 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
8422 </a>
8423 </li>
8424 {{/ifCond}}
8425 {{#ifCond template "===" "SearchMore"}}
8426 {{>SearchMorePages}}
8427 {{/ifCond}}
8428 {{else}}
8429 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
8430 @Translate("Your search gave 0 results")
8431 </li>
8432 {{/each}}
8433 </script>
8434
8435 <script id="SearchPagesTemplateWrap" type="text/x-template">
8436 <div class="dropdown__column-header">@Translate("Pages")</div>
8437 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
8438 {{>SearchPagesTemplate}}
8439 </ul>
8440 </script>
8441
8442 <script id="SearchProductsTemplateWrap" type="text/x-template">
8443 <div class="dropdown__column-header">@Translate("Products")</div>
8444 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
8445 {{>SearchProductsTemplate}}
8446 </ul>
8447 </script>
8448
8449
8450 <script>
8451 @if (!string.IsNullOrEmpty(currentFavoriteListId))
8452 {
8453 <text>
8454 window.currentFavoriteListId = "@currentFavoriteListId";
8455 </text>
8456 }
8457 function toggleFavAction(button, event) {
8458 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) {
8459 Scroll.SavePosition(event);
8460 @if (useFacebookPixel)
8461 {
8462 <text>
8463 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object')));
8464 </text>
8465 }
8466 location.href = button.getAttribute('data-add-link');
8467 return;
8468 }
8469 let isAdd = button.getAttribute('data-is-in-list') == "false";
8470 Request.Fetch().get(
8471 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'),
8472 function (result) {
8473 console.log({button})
8474 button.querySelector('img').src = isAdd ? "/Files/Images/trash-icon-outline.svg" : "/Files/Images/favorite-list-svg.svg";
8475 button.setAttribute('data-is-in-list', isAdd);
8476 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name'))
8477 let favList = button.closest('.js-favorites-list');
8478 let favBtn = favList.querySelector('.js-favorite-btn img');
8479 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null;
8480 if (isInAnyFavoriteList) {
8481 favBtn.src = "/Files/Images/favorite-list-Filled.svg";
8482 } else {
8483 favBtn.src = "/Files/Images/favorite-list-svg.svg";
8484 }
8485 document.getElementById(favList.getAttribute('data-close-overlay')).checked = false;
8486 @if (useFacebookPixel)
8487 {
8488 <text>
8489 if (isAdd) {
8490 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object')));
8491 }
8492 </text>
8493 }
8494 if (window.currentFavoriteListId != null) { //if this page is favorite list
8495 let listId = button.getAttribute("data-list-id");
8496 if (listId == window.currentFavoriteListId && !isAdd) {
8497 location.reload();
8498 }
8499 }
8500 },
8501 function () {
8502 console.error("FavoriteLists: Error in ToggleFavAction request");
8503 },
8504 false
8505 );
8506 }
8507 </script>
8508 }
8509
8510 @using Dynamicweb.Rapido.Blocks.Components
8511 @using Dynamicweb.Rapido.Blocks.Components.General
8512 @using Dynamicweb.Rapido.Blocks
8513 @using System.IO
8514
8515
8516 @using Dynamicweb.Rapido.Blocks.Components.General
8517 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8518
8519
8520 @* Component *@
8521
8522 @helper RenderVariantMatrix(VariantMatrix settings) {
8523 if (settings != null)
8524 {
8525 int productLoopCounter = 0;
8526 int groupCount = 0;
8527 List<VariantOption> firstDimension = new List<VariantOption>();
8528 List<VariantOption> secondDimension = new List<VariantOption>();
8529 List<VariantOption> thirdDimension = new List<VariantOption>();
8530
8531 foreach (VariantGroup variantGroup in settings.GetVariantGroups())
8532 {
8533 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions())
8534 {
8535 if (groupCount == 0) {
8536 firstDimension.Add(variantOptions);
8537 }
8538 if (groupCount == 1)
8539 {
8540 secondDimension.Add(variantOptions);
8541 }
8542 if (groupCount == 2)
8543 {
8544 thirdDimension.Add(variantOptions);
8545 }
8546 }
8547 groupCount++;
8548 }
8549
8550 int rowCount = 0;
8551 int columnCount = 0;
8552
8553 <script>
8554 var variantsCollection = [];
8555 </script>
8556
8557 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId">
8558 @if (groupCount == 1)
8559 {
8560 <tbody>
8561 @foreach (VariantOption firstVariantOption in firstDimension)
8562 {
8563 var variantId = firstVariantOption.Id;
8564 <tr>
8565 <td class="u-bold">
8566 @firstVariantOption.Name
8567 </td>
8568 <td>
8569 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8570 </td>
8571 </tr>
8572 productLoopCounter++;
8573 }
8574
8575 <tr>
8576 <td> </td>
8577 <td>
8578 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8579 </td>
8580 </tr>
8581 </tbody>
8582 }
8583 @if (groupCount == 2)
8584 {
8585 <thead>
8586 <tr>
8587 <td> </td>
8588 @foreach (VariantOption variant in secondDimension)
8589 {
8590 <td>@variant.Name</td>
8591 }
8592 </tr>
8593 </thead>
8594 <tbody>
8595 @foreach (VariantOption firstVariantOption in firstDimension)
8596 {
8597 string variantId = "";
8598 columnCount = 0;
8599
8600 <tr>
8601 <td class="u-min-w120px">@firstVariantOption.Name</td>
8602
8603 @foreach (VariantOption secondVariantOption in secondDimension)
8604 {
8605 variantId = firstVariantOption.Id + "." + secondVariantOption.Id;
8606 <td>
8607 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8608 </td>
8609
8610 columnCount++;
8611
8612 productLoopCounter++;
8613 }
8614
8615 <td>
8616 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
8617 </td>
8618 </tr>
8619
8620 rowCount++;
8621 }
8622
8623 @{
8624 columnCount = 0;
8625 }
8626
8627 <tr>
8628 <td> </td>
8629 @foreach (VariantOption secondVariantOption in secondDimension)
8630 {
8631 <td>
8632 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8633 </td>
8634
8635 columnCount++;
8636 }
8637 <td> </td>
8638 </tr>
8639 </tbody>
8640 }
8641 @if (groupCount == 3)
8642 {
8643 <thead>
8644 <tr>
8645 <td> </td>
8646 @foreach (VariantOption thirdVariantOption in thirdDimension)
8647 {
8648 <td>@thirdVariantOption.Name</td>
8649 }
8650 </tr>
8651 </thead>
8652 <tbody>
8653 @foreach (VariantOption firstVariantOption in firstDimension)
8654 {
8655 int colspan = (thirdDimension.Count + 1);
8656
8657 <tr>
8658 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td>
8659 </tr>
8660
8661 foreach (VariantOption secondVariantOption in secondDimension)
8662 {
8663 string variantId = "";
8664 columnCount = 0;
8665
8666 <tr>
8667 <td class="u-min-w120px">@secondVariantOption.Name</td>
8668
8669 @foreach (VariantOption thirdVariantOption in thirdDimension)
8670 {
8671 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id;
8672
8673 <td>
8674 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
8675 </td>
8676
8677 columnCount++;
8678 productLoopCounter++;
8679 }
8680
8681 <td>
8682 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
8683 </td>
8684 </tr>
8685 rowCount++;
8686 }
8687 }
8688
8689 @{
8690 columnCount = 0;
8691 }
8692
8693 <tr>
8694 <td> </td>
8695 @foreach (VariantOption thirdVariantOption in thirdDimension)
8696 {
8697 <td>
8698 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
8699 </td>
8700
8701 columnCount++;
8702 }
8703 <td> </td>
8704 </tr>
8705 </tbody>
8706 }
8707 </table>
8708
8709 <script>
8710 document.addEventListener("DOMContentLoaded", function (event) {
8711 MatrixUpdateQuantity("@settings.ProductId");
8712 });
8713
8714 MatrixUpdateQuantity = function (productId) {
8715 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId);
8716 var allQtyFields = currentMatrix.getElementsByClassName("js-qty");
8717
8718 var qtyRowArr = [];
8719 var qtyColumnArr = [];
8720
8721 var totalQty = 0;
8722
8723 for (var i = 0; i < allQtyFields.length; i++) {
8724 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0;
8725 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0;
8726 }
8727
8728 for (var i = 0; i < allQtyFields.length; i++) {
8729 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value);
8730 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value);
8731 totalQty += parseFloat(allQtyFields[i].value);
8732 }
8733
8734 //Update row counters
8735 for (var i = 0; i < qtyRowArr.length; i++) {
8736 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
8737
8738 if (qtyRowArr[i] != undefined && qtyCounter != null) {
8739 var currentCount = qtyCounter.innerHTML;
8740 qtyCounter.innerHTML = qtyRowArr[i];
8741
8742 if (currentCount != qtyCounter.innerHTML) {
8743 qtyCounter.classList.add("qty-field--active");
8744 }
8745 }
8746
8747 }
8748
8749 //Update column counters
8750 for (var i = 0; i < qtyColumnArr.length; i++) {
8751 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
8752
8753 if (qtyColumnArr[i] != undefined && qtyCounter != null) {
8754 var currentCount = qtyCounter.innerHTML;
8755 qtyCounter.innerHTML = qtyColumnArr[i];
8756
8757 if (currentCount != qtyCounter.innerHTML) {
8758 qtyCounter.classList.add("qty-field--active");
8759 }
8760 }
8761 }
8762
8763 if (document.getElementById("TotalQtyCount_" + productId)) {
8764 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty;
8765 }
8766
8767 //Clean up animations
8768 setTimeout(function () {
8769 for (var i = 0; i < qtyRowArr.length; i++) {
8770 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
8771 if (qtyCounter != null) {
8772 qtyCounter.classList.remove("qty-field--active");
8773 }
8774 }
8775 for (var i = 0; i < qtyColumnArr.length; i++) {
8776 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
8777 if (qtyCounter != null) {
8778 qtyCounter.classList.remove("qty-field--active");
8779 }
8780 }
8781 }, 1000);
8782 }
8783 </script>
8784 }
8785 }
8786
8787 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount)
8788 {
8789 string loopCount = productLoopCounter.ToString();
8790
8791 bool combinationFound = false;
8792 double stock = 0;
8793 double quantityValue = 0;
8794 string note = "";
8795
8796 VariantProduct variantProduct = null;
8797
8798 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct))
8799 {
8800 stock = variantProduct.Stock;
8801 quantityValue = variantProduct.Quantity;
8802 combinationFound = true;
8803 }
8804
8805 if (combinationFound)
8806 {
8807 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" />
8808 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" />
8809 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" />
8810 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" />
8811 <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">
8812
8813 if (stock != 0)
8814 {
8815 <small>@Translate("Stock") @stock</small>
8816 }
8817
8818 <script>
8819 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}';
8820 variantsCollection.push(variants);
8821 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" );
8822 </script>
8823 }
8824 else
8825 {
8826 <div class="use-btn-height" style="background-color: #a8a8a8"></div>
8827 }
8828 }
8829 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8830
8831 @* Component *@
8832
8833 @helper RenderAddToCart(AddToCart settings)
8834 {
8835 //set Id for quantity selector to get it's value from button
8836 if (settings.QuantitySelector != null)
8837 {
8838 if (string.IsNullOrEmpty(settings.QuantitySelector.Id))
8839 {
8840 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N");
8841 }
8842
8843 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id;
8844
8845 if (settings.Disabled)
8846 {
8847 settings.QuantitySelector.Disabled = true;
8848 }
8849
8850 if (string.IsNullOrEmpty(settings.QuantitySelector.Name))
8851 {
8852 settings.QuantitySelector.Name = settings.QuantitySelector.Id;
8853 }
8854 }
8855
8856 if (settings.Disabled)
8857 {
8858 settings.AddButton.Disabled = true;
8859 }
8860
8861 settings.AddButton.CssClass += " btn--condensed";
8862
8863 //unitsSelector
8864 if (settings.UnitSelector != null)
8865 {
8866 if (settings.Disabled)
8867 {
8868 settings.QuantitySelector.Disabled = true;
8869 }
8870 }
8871
8872 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
8873 @if (settings.UnitSelector != null)
8874 {
8875 @Render(settings.UnitSelector)
8876 }
8877 @if (settings.QuantitySelector != null)
8878 {
8879 @Render(settings.QuantitySelector)
8880 }
8881 @Render(settings.AddButton)
8882 </div>
8883 }
8884 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8885
8886 @* Component *@
8887
8888 @helper RenderAddToCartButton(AddToCartButton settings)
8889 {
8890 if (!settings.HideTitle)
8891 {
8892 if (string.IsNullOrEmpty(settings.Title))
8893 {
8894 if (settings.BuyForPoints)
8895 {
8896 settings.Title = Translate("Buy with points");
8897 }
8898 else
8899 {
8900 settings.Title = Translate("Add to cart");
8901 }
8902 }
8903 }
8904 else
8905 {
8906 settings.Title = "";
8907 }
8908
8909 if (settings.Icon == null)
8910 {
8911 settings.Icon = new Icon();
8912 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After;
8913 }
8914
8915 if (string.IsNullOrEmpty(settings.Icon.Name))
8916 {
8917 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue;
8918 }
8919
8920 settings.OnClick = "Cart.AddToCart(event, { " +
8921 "id: '" + settings.ProductId + "'," +
8922 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") +
8923 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") +
8924 (settings.BuyForPoints ? "buyForPoints: true," : "") +
8925 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") +
8926 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") +
8927 "});" + settings.OnClick;
8928
8929 @RenderButton(settings)
8930 }
8931 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8932
8933 @* Component *@
8934
8935 @helper RenderUnitSelector(UnitSelector settings)
8936 {
8937 if (string.IsNullOrEmpty(settings.Id))
8938 {
8939 settings.Id = Guid.NewGuid().ToString("N");
8940 }
8941 var disabledClass = settings.Disabled ? "disabled" : "";
8942
8943 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" />
8944 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
8945 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label>
8946 <div class="dropdown__content dw-mod">
8947 @settings.OptionsContent
8948 </div>
8949 <label class="dropdown-trigger-off" for="@settings.Id"></label>
8950 </div>
8951 }
8952 @using System.Reflection
8953 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8954
8955 @* Component *@
8956
8957 @helper RenderQuantitySelector(QuantitySelector settings)
8958 {
8959 var attributes = new Dictionary<string, string>();
8960
8961 /*base settings*/
8962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
8963 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
8964 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
8965 if (settings.Disabled) { attributes.Add("disabled", "true"); }
8966 if (settings.Required) { attributes.Add("required", "true"); }
8967 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
8968 /*end*/
8969
8970 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
8971 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
8972 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
8973 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
8974 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); }
8975 if (settings.Min == null) { settings.Min = 1; }
8976 attributes.Add("min", settings.Min.ToString());
8977 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); }
8978 if (settings.Value == null) { settings.Value = 1; }
8979 attributes.Add("value", settings.Value.ToString());
8980 attributes.Add("type", "number");
8981
8982 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
8983
8984 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
8985 }
8986 @using Dynamicweb.Rapido.Blocks.Components
8987
8988 @using Dynamicweb.Frontend
8989 @using Dynamicweb.Frontend.Devices
8990 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8991 @using Dynamicweb.Rapido.Blocks.Components.General
8992 @using System.Collections.Generic;
8993
8994 @* Component *@
8995
8996 @helper RenderCustomerCenterList(CustomerCenterList settings)
8997 {
8998 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false;
8999 string hideActions = isTouchDevice ? "u-block" : "";
9000
9001 <table class="table data-list dw-mod">
9002 @if (settings.GetHeaders().Length > 0) {
9003 <thead>
9004 <tr class="u-bold">
9005 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders())
9006 {
9007 var attributes = new Dictionary<string, string>();
9008 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); }
9009 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); }
9010 attributes.Add("align", header.Align.ToString());
9011 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9012
9013 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td>
9014 }
9015 </tr>
9016 </thead>
9017 }
9018 @foreach (CustomerCenterListItem listItem in settings.GetItems())
9019 {
9020 int columnCount = 0;
9021 int totalColumns = listItem.GetInfoItems().Length;
9022 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-acions" : "";
9023 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N");
9024
9025 var attributes = new Dictionary<string, string>();
9026 var width = Pageview.Device.ToString() != "Mobile" ? "150" : "100";
9027 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); };
9028
9029 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9030 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)>
9031 <tr>
9032 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) {
9033 <td onclick="@listItem.OnClick" class="data-list__main-item dw-mod" width="@width">
9034 @if (!string.IsNullOrEmpty(listItem.Title)) {
9035 <div class="u-bold">@listItem.Title</div>
9036 }
9037 @if (!string.IsNullOrEmpty(listItem.Description)) {
9038 <div>@listItem.Description</div>
9039 }
9040 </td>
9041 }
9042
9043 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems())
9044 {
9045 var infoAttributes = new Dictionary<string, string>();
9046 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); };
9047 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); };
9048 infoAttributes.Add("align", infoItem.Align.ToString());
9049
9050 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
9051 string columnClick = columnCount < (totalColumns-2) ? "onclick=\"" + listItem.OnClick + "\"" : "";
9052
9053 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod">
9054 @if (!string.IsNullOrEmpty(infoItem.Title)) {
9055 <div>@infoItem.Title</div>
9056 }
9057 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) {
9058 <div><small>@infoItem.Subtitle</small></div>
9059 }
9060 </td>
9061
9062 columnCount++;
9063 }
9064 </tr>
9065 <tr>
9066 <td colspan="7" align="right" class="u-va-bottom u-no-border">
9067 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id">
9068 @foreach (ButtonBase action in listItem.GetActions())
9069 {
9070 action.ButtonLayout = ButtonLayout.LinkClean;
9071 action.CssClass += " data-list__action-button link";
9072
9073 @Render(action)
9074 }
9075 </div>
9076 </td>
9077 </tr>
9078 </tbody>
9079 }
9080 </table>
9081 }
9082 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
9083
9084 @using System
9085 @using System.Web
9086 @using System.Collections.Generic
9087 @using Dynamicweb.Rapido.Blocks.Extensibility
9088 @using Dynamicweb.Rapido.Blocks
9089
9090 @{
9091 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
9092
9093 Block primaryBottomSnippets = new Block()
9094 {
9095 Id = "MasterJavascriptInitializers",
9096 SortId = 100,
9097 Template = RenderPrimaryBottomSnippets()
9098 };
9099 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
9100 }
9101
9102 @helper RenderPrimaryBottomSnippets()
9103 {
9104 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
9105 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
9106
9107 if (isWireframeMode)
9108 {
9109 <script>
9110 Wireframe.Init(true);
9111 </script>
9112 }
9113
9114
9115 if (useGoogleTagManager)
9116 {
9117 <script>
9118 document.addEventListener('addToCart', function(event) {
9119 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
9120 if (typeof googleImpression == "string") {
9121 googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
9122 }
9123 dataLayer.push({
9124 'event': 'addToCart',
9125 'ecommerce': {
9126 'currencyCode': googleImpression.currency,
9127 'add': {
9128 'products': [{
9129 'name': googleImpression.name,
9130 'id': googleImpression.id,
9131 'price': googleImpression.price,
9132 'brand': googleImpression.brand,
9133 'category': googleImpression.category,
9134 'variant': googleImpression.variant,
9135 'quantity': event.detail.quantity
9136 }]
9137 }
9138 }
9139 });
9140 });
9141 </script>
9142 }
9143
9144 //if digitalwarehouse
9145 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"))
9146 {
9147 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]);
9148
9149 if (string.IsNullOrEmpty(cartContextId))
9150 {
9151 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2");
9152 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps);
9153 cartContextId = cartSettings.OrderContextID;
9154 HttpContext.Current.Application["DownloadCartContext"] = cartContextId;
9155 }
9156
9157 <script>
9158 let downloadCart = new DownloadCart({
9159 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"),
9160 contextId: "@cartContextId",
9161 addButtonText: "@Translate("Add")",
9162 removeButtonText: "@Translate("Remove")"
9163 });
9164 </script>
9165 }
9166
9167 <!--$$Javascripts-->
9168 }
9169 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
9170 @using System
9171 @using System.Web
9172 @using System.Collections.Generic
9173 @using Dynamicweb.Ecommerce.WebAPI.Controllers
9174 @using Dynamicweb.Ecommerce.Frontend
9175 @using Dynamicweb.Rapido.Blocks
9176 @using Degree.Kraemer.Rma.Infrastructure.Authentication
9177
9178 @functions{
9179
9180 public string ReturnCustomFieldValue(string customFieldSystemName)
9181 {
9182 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null;
9183
9184 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
9185 {
9186 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues;
9187 }
9188 else if (Model.CurrentUser != null && Model.CurrentUser.ID > 0)
9189 {
9190 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues;
9191 }
9192 var currentUserLocation = "";
9193
9194 if (userCustomFields != null)
9195 {
9196 foreach (var field in userCustomFields)
9197 {
9198 if (field.CustomField.SystemName == customFieldSystemName)
9199 {
9200 currentUserLocation = field.Value.ToString();
9201 }
9202 }
9203 }
9204 else
9205 {
9206 currentUserLocation = "test";
9207 }
9208
9209 return currentUserLocation;
9210 }
9211
9212 public bool getPromptForAccount()
9213 {
9214 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.CurrentSecondaryUser;
9215 var user = secondaryUser != null ? secondaryUser : Dynamicweb.Security.UserManagement.User.get_Current(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend);
9216 // bool userIsMain = Model.CurrentSecondaryUser.ID == 0;
9217 var promptForAccount = user != null ? user.CustomFieldValues.First(f => f.CustomField.SystemName == "AccessUser_PromptForAccount").Value.ToString() == "True" : false;
9218
9219 return promptForAccount;
9220 }
9221
9222 }
9223
9224 @{
9225 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master");
9226 }
9227
9228 @{
9229 Block SideNavigation = new Block()
9230 {
9231 Id = "SideNavigation",
9232 SortId = 5,
9233 Template = RenderSideNavigation(),
9234 SkipRenderBlocksList = true
9235 };
9236 Block userLocationModal = new Block()
9237 {
9238 Id = "UserLocationsModal",
9239 SortId = 10,
9240 Template = RenderUserLocations(),
9241 SkipRenderBlocksList = true
9242 };
9243 masterCustomBlocksPage.Add(userLocationModal);
9244
9245 Block newRMAModal = new Block()
9246 {
9247 Id = "newRmaModal",
9248 SortId = 109,
9249 Template = RenderNewRmaForm(),
9250 SkipRenderBlocksList = true
9251 };
9252
9253 masterCustomBlocksPage.Add(newRMAModal);
9254 Block viewRMADetails = new Block()
9255 {
9256 Id = "newRmaModal",
9257 SortId = 108,
9258 Template = RenderNewRmaViewDetails(),
9259 SkipRenderBlocksList = true
9260 };
9261
9262 masterCustomBlocksPage.Add(viewRMADetails);
9263 Block viewRMAFullOrderDetails = new Block()
9264 {
9265 Id = "newRmaModalFullOrder",
9266 SortId = 107,
9267 Template = RenderNewRmaViewFullOrderDetails(),
9268 SkipRenderBlocksList = true
9269 };
9270
9271 masterCustomBlocksPage.Add(viewRMAFullOrderDetails);
9272 Block RmaViewDetailsEditableBlock = new Block()
9273 {
9274 Id = "DraftRmaModal",
9275 SortId = 105,
9276 Template = RenderNewRmaViewDetailsEditable(),
9277 SkipRenderBlocksList = true
9278 };
9279
9280 masterCustomBlocksPage.Add(RmaViewDetailsEditableBlock);
9281 Block viewOrderDetails = new Block()
9282 {
9283 Id = "newOrderHistoryDetailsModal",
9284 SortId = 106,
9285 Template = RenderNewOrderHistoryViewDetails(),
9286 SkipRenderBlocksList = true
9287 };
9288
9289 masterCustomBlocksPage.Add(viewOrderDetails);
9290 Block newCartModal = new Block()
9291 {
9292 Id = "NewCartModal",
9293 SortId = 20,
9294 Template = RenderNewCartModal(),
9295 SkipRenderBlocksList = true
9296 };
9297 masterCustomBlocksPage.Add(newCartModal);
9298
9299 Block newCartNameModal = new Block()
9300 {
9301 Id = "CartNameModal",
9302 SortId = 50,
9303 Template = RenderNewCartNameModal(),
9304 SkipRenderBlocksList = true
9305 };
9306 masterCustomBlocksPage.Add(newCartNameModal);
9307
9308 if (Model.HasSecondaryUsers)
9309 {
9310 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
9311 {
9312 Block impersonationListModal = new Block()
9313 {
9314 Id = "ImpersonationListModal",
9315 SortId = 30,
9316 Template = RenderImpersonationModal(),
9317 SkipRenderBlocksList = true
9318 };
9319
9320 masterCustomBlocksPage.Add(impersonationListModal);
9321 }
9322 else
9323 {
9324 Block impersonationListModal = new Block()
9325 {
9326 Id = "ImpersonationListModal",
9327 SortId = 30,
9328 Template = RenderImpersonationModal(),
9329 SkipRenderBlocksList = true
9330 };
9331
9332 masterCustomBlocksPage.Add(impersonationListModal);
9333 }
9334
9335 Block impersonationTemplate = new Block()
9336 {
9337 Id = "ImpersonationTemplate",
9338 SortId = 40,
9339 Template = RenderImpersonationListSelect()
9340 };
9341 masterCustomBlocksPage.Add("MasterHeader", impersonationTemplate);
9342 }
9343 Block quickViewModal = new Block()
9344 {
9345 Id = "QuickViewModal",
9346 SortId = 60,
9347 Template = RenderQuickViewModal(),
9348 SkipRenderBlocksList = true
9349 };
9350
9351 masterCustomBlocksPage.Add(quickViewModal);
9352 // masterCustomBlocksPage.Add(MasterBlockId.MasterMain, UserLocationModal);
9353
9354 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block
9355 {
9356 Id = "CartListScript",
9357 Template = RenderCartsListSelect()
9358 });
9359
9360 if (Model.CurrentUser.ID > 0)
9361 {
9362 Modal stopImpersonation = new Modal
9363 {
9364 Id = "StopImpersonation",
9365 Heading = new Heading
9366 {
9367 Level = 2,
9368 Title = Translate("Sign out"),
9369 Icon = new Icon
9370 {
9371 Name = "fa-sign-out",
9372 Prefix = "fas",
9373 LabelPosition = IconLabelPosition.After
9374 }
9375 },
9376 Width = ModalWidth.Md,
9377 BodyTemplate = RenderStopImpersonationForm()
9378 };
9379
9380 Block stopCustomImpersonation = new Block
9381 {
9382 Id = "StopImpersonationBlock",
9383 SortId = 10,
9384 Component = stopImpersonation
9385 };
9386 masterCustomBlocksPage.RemoveBlockById("StopImpersonationBlock");
9387 masterCustomBlocksPage.Add(stopCustomImpersonation);
9388 }
9389 Block emptyCartModal = new Block()
9390 {
9391 Id = "EmptyCartModal",
9392 SortId = 80,
9393 Template = RenderEmptyCartModal(),
9394 SkipRenderBlocksList = true
9395 };
9396
9397 masterCustomBlocksPage.Add(emptyCartModal);
9398
9399 Block stepQuantityErrorModal = new Block()
9400 {
9401 Id = "StepQuantityErrorModal",
9402 SortId = 90,
9403 Template = RenderStepQuantityErrorModal()
9404 };
9405
9406 masterCustomBlocksPage.Add(stepQuantityErrorModal);
9407
9408 }
9409 @{
9410 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9411
9412 }
9413
9414 @helper RenderSideNavigation()
9415 {<p>test</p>}
9416
9417 @helper RenderUserLocations()
9418 {
9419 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode");
9420 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
9421 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9422 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations");
9423 Modal getLocations = new Modal
9424 {
9425 Id = "UserLocationModal",
9426 Heading = new Heading
9427 {
9428 Level = 2,
9429 Title = Translate("Select a location")
9430 },
9431 Width = ModalWidth.Md,
9432 BodyTemplate = RenderUserLocationsContentModal()
9433 };
9434 if (userExists && !string.IsNullOrEmpty(customerNumber))
9435 {
9436 <div data-location="@currentUserLocation" data-location-list="@locationList"></div>
9437
9438 if (currentUserLocation == "")
9439 {
9440 <div> @Render(getLocations) </div>
9441 }
9442 }
9443 }
9444
9445 @helper RenderUserLocationsContentModal()
9446 {
9447 <div>
9448 @RenderLocationsSelect()
9449 @Render(new Button
9450 {
9451 Title = Translate("Set location"),
9452 ButtonType = ButtonType.Button,
9453 ButtonLayout = ButtonLayout.Primary,
9454 CssClass = "u-no-margin",
9455 OnClick = "addLocation(document.querySelector('#UserLocationModalModal #LocationsSelect'))"
9456 })
9457 </div>
9458 }
9459
9460 @helper RenderLocationsSelect()
9461 {
9462 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations");
9463 List<string> locations = locationList.ToString().Split(',').ToList();
9464 SelectField selectField = new SelectField
9465 {
9466 Id = "LocationsSelect",
9467 Label = Translate("Select a location"),
9468 CssClass = "u-margin-bottom",
9469 Required = true
9470 };
9471
9472 foreach (var loc in locations)
9473 {
9474 string label;
9475 string code;
9476 string askoCode;
9477 string[] parts = loc.Split('|');
9478 if (parts.Length >= 3)
9479 {
9480 label = parts[0].Trim();
9481 code = parts[1].Trim();
9482 askoCode = parts[2].Trim();
9483 }
9484 else
9485 {
9486 label = parts[0].Trim();
9487 code = parts[1].Trim();
9488 }
9489 selectField.Options.Add(new SelectFieldOption { Label = label, Value = code });
9490 }
9491 @Render(selectField)
9492 }
9493
9494 @helper RenderNewCartModal()
9495 {
9496 var newCartModal = new Modal
9497 {
9498 Id = "NewCart",
9499 Heading = new Heading { Title = Translate("Create New Cart") },
9500 Width = ModalWidth.Md,
9501 BodyTemplate = RenderNewCartContentModal()
9502 };
9503
9504 <div>@Render(newCartModal) </div>
9505 }
9506
9507 @helper RenderNewCartContentModal()
9508 {
9509 var baseurl = HttpContext.Current.Request.Url.ToString();
9510 string currentUserId = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUserId().ToString();
9511 var newCartURL = baseurl.Contains("?") ? baseurl + "&redirect=false&cartcmd=createnew&CartUserId=" + currentUserId + "&CartName=" : baseurl + "?cartcmd=createnew&redirect=false&CartUserId=" + currentUserId + "&CartName=";
9512 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID=";
9513 var cartsListFeedPageId = "/Default.aspx?ID=" + GetPageIdByNavigationTag("CartsListFeed");
9514
9515 <div>
9516 <form method="post" id="NewCartForm" data-submit-url="@newCartURL" data-carts-url="@cartsListFeedPageId" data-change-cart-url="@setCartURL">
9517 @Render(new HiddenField { Id = "CartUserId", Name = "CartUserId", Value = currentUserId })
9518 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "createnew" })
9519 @Render(new TextField { Id = "CartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Cart Name"), Required = true })
9520 @*@Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Create") })*@
9521 <button type="button" id="CreateNewCartButton" class="btn btn--primary dw-mod">@Translate("Create")</button>
9522 </form>
9523 </div>
9524 }
9525
9526 @helper RenderNewCartNameModal()
9527 {
9528 var newCartNameModal = new Modal
9529 {
9530 Id = "NewCartName",
9531 Heading = new Heading { Title = Translate("ChangeCartName") },
9532 Width = ModalWidth.Md,
9533 BodyTemplate = RenderNewCartNameContentModal()
9534 };
9535
9536 <div>@Render(newCartNameModal) </div>
9537 }
9538
9539 @helper RenderNewCartNameContentModal()
9540 {
9541 <form method="post">
9542 @Render(new HiddenField { Id = "CartID", Name = "CartID", Value = "" })
9543 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "setname" })
9544 @Render(new TextField { Id = "NewCartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Enter New Name"), Required = true })
9545 @Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Endre navn") })
9546 </form>
9547 }
9548
9549 @helper RenderImpersonationModal()
9550 {
9551 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0;
9552 var promptForAccount = getPromptForAccount();
9553 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
9554 string headerMessage = isImpersonating ? Translate("Change account") : Translate("Secondary Users");
9555 Modal secondaryUsers = new Modal
9556 {
9557
9558 Id = "SecondarUsersModal",
9559 Heading = new Heading
9560 {
9561 Level = 2,
9562 Title = headerMessage
9563 },
9564
9565 Width = ModalWidth.Md,
9566 BodyTemplate = RenderImpersonationContentModal()
9567 };
9568 <div data-prompt-account="@promptForAccount">@Render(secondaryUsers)</div>
9569 }
9570
9571 @helper RenderImpersonationContentModal()
9572 {
9573 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
9574 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0;
9575 string buttonTitle = isImpersonating ? Translate("Choose user") : Translate("Set user");
9576
9577 <div class="u-margin-right u-margin-bottom">@Translate("Choose user to impersonate:")</div>
9578 <div class="impersonation-container">
9579 <input type="checkbox" id="ImpersonationSelect_modal" class="dropdown-trigger" />
9580 <div class="dropdown variants-filters dw-mod">
9581 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_modal">@Translate("Choose user")</label>
9582 <div class="dropdown__content u-padding dw-mod">
9583 <div class="dropdown__item__filter">
9584 <input type="text" data-container-id="impersonationListModal" data-view-type="modal" placeholder="@Translate("Search")">
9585 </div>
9586 <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>
9587 </div>
9588 <label class="dropdown-trigger-off" for="ImpersonationSelect_modal"></label>
9589 </div>
9590 </div>
9591 @Render(new Button
9592 {
9593 Title = buttonTitle,
9594 ButtonType = ButtonType.Button,
9595 ButtonLayout = ButtonLayout.Primary,
9596 CssClass = "u-no-margin u-margin-top",
9597 ExtraAttributes = new Dictionary<string, string>
9598 {
9599 { "data-role", "impersonate-submit" }
9600 }
9601 // OnClick = "sessionStorage.setItem('impersonationModalOpen', 'true'); sessionStorage.setItem('recentlyLoggedIn', 'true'); localStorage.removeItem('userLocation'); document.getElementById(document.querySelector('#SecondarUsersModalModal .dropdown__header').getAttribute('data-value')).submit();"
9602 })
9603 }
9604
9605 @helper RenderImpersonationListSelect()
9606 {
9607 bool promtForAccount = getPromptForAccount();
9608
9609 if (promtForAccount)
9610 {
9611 <script id="ImpersonationListContent" data-test="1" type="text/x-template">
9612
9613 {{#.}}
9614 {{#Users}}
9615 {{#if main}}
9616 <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>
9617 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9618 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9619 </form>
9620 {{else}}
9621 <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>
9622 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9623 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9624 </form>
9625 {{/if}}
9626 {{/Users}}
9627 {{/.}}
9628 </script>
9629 }
9630 else
9631 {
9632 <script id="ImpersonationListContent" data-test="2" type="text/x-template">
9633
9634 {{#.}}
9635 {{#ifCond totalUsers "!==" "2"}}
9636
9637 {{#Users}}
9638 {{#if main}}
9639 <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>
9640 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9641 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9642 </form>
9643 {{else}}
9644
9645 <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>
9646 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9647 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9648 </form>
9649 {{/if}}
9650 {{/Users}}
9651
9652 {{/ifCond}}
9653 {{/.}}
9654 </script>
9655 }
9656
9657 <script id="ImpersonationListContentHeader" type="text/x-template">
9658 {{#.}}
9659 {{#Users}}
9660 {{#if main}}
9661 {{#if secondaryUser}}
9662 {{#unless hideSelf}}
9663 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div>
9664 {{/unless}}
9665 {{else}}
9666 {{#unless hideSelf}}
9667 {{#ifCond ../totalUsers "!==" 2}}
9668 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'true');logOutCurrentUser()" tabindex="0">{{name}}</div>
9669 {{else}}
9670 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div>
9671 {{/ifCond}}
9672 {{/unless}}
9673 {{/if}}
9674
9675 {{else}}
9676 <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>
9677 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}">
9678 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector">
9679 </form>
9680 {{/if}}
9681 {{/Users}}
9682
9683 {{/.}}
9684 </script>
9685 }
9686
9687 @helper RenderQuickViewModal()
9688 {
9689 <div class="quick-view-modal">
9690 @Render(new Modal
9691 {
9692 Id = "ProductDetailQuickView",
9693 Heading = new Heading
9694 {
9695 Level = 3,
9696 Title = "",
9697 CssClass = "bs-margin-bottom-0 bs-border-none"
9698 },
9699 Width = ModalWidth.Full,
9700 Height = ModalHeight.Full,
9701 BodyText = ""
9702 })
9703 </div>
9704 }
9705
9706 @helper RenderCartsListSelect()
9707 {
9708 var baseurl = HttpContext.Current.Request.Url.ToString();
9709 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID=";
9710
9711 <script id="CartsListContent" type="text/x-template">
9712 {{#.}}
9713 <select id="CartsSelect" class="u-full-width u-margin-bottom" data-url="@setCartURL">
9714 @*<option>@Translate("Change Cart")</option>*@
9715 {{#Carts}}
9716 <option value="{{id}}" data-active="{{isCartActive}}" {{selected}}>{{name}}</option>
9717 {{/Carts}}
9718 </select>
9719 {{/.}}
9720 </script>
9721 }
9722
9723 @helper RenderEmptyCartModal()
9724 {
9725 @Render(new Modal
9726 {
9727 Id = "EmptyCartModal",
9728 Heading = new Heading
9729 {
9730 Level = 3,
9731 Title = Translate("cartEmptyDisclaimer"),
9732 CssClass = "u-margin-bottom"
9733 },
9734 Width = ModalWidth.Md,
9735 BodyTemplate = RenderEmptyCartModalBody()
9736 })
9737 }
9738
9739 @helper RenderEmptyCartModalBody()
9740 {
9741 <div class="u-flex grid--justify-space-between">
9742 <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>
9743 <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>
9744 </div>
9745 }
9746
9747 @helper RenderStepQuantityErrorModal()
9748 {
9749 Modal stepQuantityError = new Modal
9750 {
9751 Id = "StepQuantityError",
9752 Heading = new Heading { Title = Translate("Quantity error") },
9753 Width = ModalWidth.Md,
9754 BodyTemplate = RenderErrorModalContent()
9755 };
9756
9757 <div>@Render(stepQuantityError)</div>
9758 }
9759
9760 @helper RenderErrorModalContent()
9761 {
9762 <div class="u-padding">
9763 <h5 class="u-margin-bottom">
9764 <span class="product-name"></span>
9765 </h5>
9766 <h5 class="quantity-change-error-text-multiple">
9767 @Translate("add multi quantity")
9768 <span class="product-quantity"></span>
9769 </h5>
9770 <h5 class="quantity-change-error-text-zero u-hidden">
9771 @Translate("Please insert the minimum quantity")
9772 <span class="product-quantity"></span>
9773 </h5>
9774 </div>
9775 }
9776
9777 @helper RenderNewRmaViewDetails()
9778 {
9779 Modal rmaViewDetails = new Modal
9780 {
9781 Id = "rmaViewDetails",
9782 Heading = new Heading { Title = Translate("AVVIK") },
9783 BodyTemplate = RmaViewDetails()
9784 };
9785 <div data-ref="rmaViewDetails">@Render(rmaViewDetails)</div>
9786 }
9787 @helper RenderNewOrderHistoryViewDetails()
9788 {
9789 Modal orderHistoryDetails = new Modal
9790 {
9791 Id = "rmaViewDetails2",
9792 Heading = new Heading { Title = Translate("ORDREBEKREFTELSE") },
9793 BodyTemplate = ViewOrderDetails2()
9794 };
9795 <div data-ref="orderHistoryDetails">@Render(orderHistoryDetails)</div>
9796 }
9797 @helper RenderNewRmaForm()
9798 {
9799 Modal newRmaForm = new Modal
9800 {
9801 Id = "rmaForm",
9802 Heading = new Heading { Title = Translate("AVVIK") },
9803 BodyTemplate = RmaFormContent()
9804 };
9805 <div data-ref="newRMA">@Render(newRmaForm)</div>
9806 }
9807
9808 @helper RenderNewRmaViewFullOrderDetails()
9809 {
9810 Modal rmaViewDetailsFullOrder = new Modal
9811 {
9812 Id = "rmaViewDetailsFullOrder",
9813 Heading = new Heading { Title = Translate("AVVIK") },
9814 BodyTemplate = RmaViewDetailsFullOrder()
9815 };
9816 <div>@Render(rmaViewDetailsFullOrder)</div>
9817 }
9818
9819 @helper RenderNewRmaViewDetailsEditable()
9820 {
9821 Modal rmaViewDetailsEditable = new Modal
9822 {
9823 Id = "rmaViewDetailsEditable",
9824 Heading = new Heading { Title = Translate("AVVIK") },
9825 BodyTemplate = RmaViewDetailsEditable()
9826 };
9827 <div>@Render(rmaViewDetailsEditable)</div>
9828 }
9829
9830 @helper RmaFormContent()
9831 {
9832 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
9833 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString();
9834 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId;
9835 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0;
9836 // var token = userID != 0 ? Auth.GetToken(userID) : "0";
9837 var token = ReturnCustomFieldValue("AccessUser_UserToken");
9838 var company = Model.CurrentUser.Company;
9839 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
9840 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
9841 @*<h1>@userID</h1>
9842 <h1>@token</h1>*@
9843 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div>
9844 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" />
9845 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div>
9846 <div class="u-hidden" id="CurrentUserCompany" data-customer-company="@isCompanyKraemer"></div>
9847 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" />
9848 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden">
9849
9850 <div class="rma-modal__container">
9851
9852 <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>
9853
9854 <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">
9855 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
9856 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" />
9857 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" />
9858 @*<h1 class="mb-0">@Model.SecondaryUsers.Count</h1>*@
9859 <div class="bs-d-flex bs-flex-column bs-flex-md-row bs-gap-3">
9860 @if (Model.HasSecondaryUsers)
9861 {
9862 <div class="modal__select-rma impersonation-container-filter-rma create-rma-modal">
9863 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" />
9864 <div class="dropdown variants-filters bs-w-100 dw-mod">
9865 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose user")</label>
9866 <div class="dropdown__content u-padding dw-mod">
9867 <div class="dropdown__item__filter">
9868 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
9869 </div>
9870 <div class=" js-handlebars-root dw-mod" id="impersonationListFilterCreateRmaModal" data-template="ImpersonationListContentFilterCreateRmaModal" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div>
9871 </div>
9872 </div>
9873 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label>
9874 </div>
9875 }
9876
9877 <div class="modal__select-rma">
9878 <div class="order-container-filter create-rma-modal">
9879 <input type="checkbox" id="OrderSelect" class="dropdown-trigger" />
9880 <div class="dropdown variants-filters bs-w-100 dw-mod">
9881 <label class="dropdown__header dropdown__btn dw-mod" for="OrderSelect" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose an order")</label>
9882 <div class="dropdown__content u-padding dw-mod">
9883 <div class="dropdown__item__filter">
9884 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
9885 </div>
9886 <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">
9887 </div>
9888 </div>
9889 <label class="dropdown-trigger-off" for="OrderSelect"></label>
9890 </div>
9891 </div>
9892 </div>
9893 </div>
9894 </header>
9895 <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">
9896 <div class="bs-d-flex">
9897 <div class="toast-body">
9898 @Translate("Please fill all required fields")
9899 </div>
9900 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
9901 </div>
9902 </div>
9903 <div class="rma-modal__selected-order orderline-form">
9904
9905 @* Switch between full order rma and orderline RMA *@
9906 <div class="rma-modal-container bs-px-3 form-orderline">
9907 <div class="modal-container__content u-hidden">
9908 <div class="bs-grid rma-modal-container bs-mt-5">
9909 <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>
9910 <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">
9911 <input type="text" id="SearchOrderlinesInput" name="search-rma" placeholder="@Translate("Søk etter produkt...")" class="mb-0 form-control search-ahead__input">
9912 <button type="button" id="SearchOrderlinesButton" class="search-icon-desktop js-typeahead-enter-btn" title="Søk">
9913 <i class="far fa-search bs-px-2"></i>
9914 </button>
9915 <button type="button" id="RemoveSearchOrderlinesButton" class=" u-hidden search-icon-desktop js-typeahead-enter-btn" title="Søk">
9916 <i class="far fa-times bs-px-2"></i>
9917 </button>
9918 </div>
9919 <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>
9920 <div class="g-col-md-3 g-col-12 bs-d-grid">
9921 <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>
9922 </div>
9923 </div>
9924 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg ">
9925 <div class="u-border-bottom rma-page__header-grid-container rma-header">
9926 <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>
9927 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div>
9928 <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>
9929 <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>
9930 <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>
9931 @* <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>*@
9932 </div>
9933 </div>
9934 <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">
9935 <div class="bs-d-flex">
9936 <div class="toast-body">
9937 @Translate("Please fill all required fields")
9938 </div>
9939 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
9940 </div>
9941 </div>
9942 </div>
9943 @* products loop *@
9944 <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>
9945 </div>
9946 </div>
9947 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3">
9948 <div class="rma-modal-container">
9949 <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">
9950 <div class="bs-d-flex">
9951 <div class="toast-body">
9952 @Translate("Please fill all required fields")
9953 </div>
9954 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
9955 </div>
9956 </div>
9957 <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">
9958 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)">
9959 <option value="0">@Translate("Avviksårsak")</option>
9960 <option value="1">@Translate("Faktura")</option>
9961 <option value="3">@Translate("Kvalitet")</option>
9962 <option value="2">@Translate("Pakking")</option>
9963 <option value="4">@Translate("Vedlikehold")</option>
9964 <option value="5">@Translate("Feil Levert")</option>
9965 <option value="6">@Translate("Multiple")</option>
9966 </select>
9967 <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>
9968 </div>
9969 <div class="inputComment bs-w-100 bs-mt-5">
9970 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea>
9971 @*
9972 <label for="FullOrderComment">@Translate("Avvikskommentar")</label>
9973 *@
9974 </div>
9975 <div class="inputComment bs-w-100 bs-mt-3">
9976 <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>
9977 </div>
9978 <input class="create-rma-form-input form-control create-rma-Attachment-input bs-mt-3" id="CreateRmaFormAttachmentFull" name="FullOrderAttachment" type="file" multiple="multiple" />
9979 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5">
9980 </div>
9981 <div class="bs-mt-5 bs-w-50 bs-mb-5">
9982 <div class="orderInfo d-flex bs-justify-content-between">
9983 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Antall produktlinjer")</p>
9984 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-orderlines">7</p>
9985 </div>
9986 <div class="orderInfo d-flex bs-justify-content-between">
9987 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Totalt antall produkter")</p>
9988 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-quantity">289</p>
9989 </div>
9990 <div class="orderInfo d-flex bs-justify-content-between">
9991 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Ordretotal eks. MVA")</p>
9992 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-amount">35 897,18 kr </p>
9993 </div>
9994 </div>
9995 </div>
9996 </div>
9997
9998 <footer class="modal__rma-footer">
9999 <div class="footer-button-container">
10000 <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)">@Translate("Opprett Avvik")</button>
10001 </div>
10002 <div class="modal__rma-footer-icon-buttons">
10003 </div>
10004 </footer>
10005 </div>
10006 <script id="ImpersonationListContentFilterCreateRmaModal" type="text/x-template">
10007 {{#.}}
10008 {{#Users}}
10009 <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>
10010 {{/Users}}
10011 {{/.}}
10012 </script>
10013
10014 <script id="rma-form-hidden-inputs" type="text/x-template">
10015 {{#.}}
10016 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" />
10017 <input name="deviationId" value="0" type="text" class="u-hidden" />
10018 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" />
10019 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" />
10020 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" />
10021 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" />
10022 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden">
10023 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden">
10024 {{/.}}
10025 </script>
10026
10027 <script id="rma-form-orderlines" type="text/x-template">
10028 {{#.}}
10029 <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;">
10030 <input type="hidden" name="productId" value="{{orderLineProductId}}" />
10031 <input name="deviationId" value="{{orderId}}" type="text" class="u-hidden" />
10032 <input name="deviationOrderLineId" value="{{orderId}}" type="text" class="u-hidden" />
10033 <input name="deviationLineId" value="0" type="text" class="u-hidden" />
10034
10035 <input type="hidden" name="productNumber" value="{{orderLineProductNumber}}" />
10036 <input type="hidden" name="productName" value="{{orderLineProductName}}" />
10037 <input type="hidden" name="productImage" value="{{#if orderLineProductImage}}{{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" />
10038 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10039 <input type="hidden" name="supplierName" value="{{orderLineSupplierName}}" />
10040 <div class="rma-form-grid-item rma-table-item">
10041 <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;">
10042 <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" />
10043 </div>
10044 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row bs-align-items-center">
10045 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10046 <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>
10047 <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>
10048 </div>
10049 </div>
10050 <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;">
10051 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" name="reason" onchange="showAdditionalOrderlineFields(this, this.value)">
10052 <option value="0">@Translate("Avviksårsak")</option>
10053 <option value="1">@Translate("Faktura")</option>
10054 <option value="3">@Translate("Kvalitet")</option>
10055 <option value="2">@Translate("Pakking")</option>
10056 <option value="4">@Translate("Vedlikehold")</option>
10057 <option value="5">@Translate("Feil Levert")</option>
10058 <option value="6">@Translate("Multiple")</option>
10059 </select>
10060 </div>
10061
10062 <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>
10063 <input type="hidden" name="deliveredQuantity" value="{{orderLineQuantity}}" />
10064 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{orderLineUnitPrice}}" />
10065 <input type="hidden" name="Total-Test-orderLineUnitPrice" value="{{orderLineTotalPrice}}" />
10066
10067 <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;">
10068 <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}}" />
10069 <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">
10070 <i class="far fa-times bs-text-danger bs-px-2"></i>
10071 </button>
10072 </div>
10073 </div>
10074 <div class="grid u-hidden additional-rma-orderline-fields additional-fields-rma">
10075 <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;">
10076 </div>
10077 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;">
10078 <input type="text" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" />
10079 </div>
10080 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10081 <input class="create-rma-form-input create-rma-expected-result" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" />
10082 </div>
10083 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10084 <input class="create-rma-form-input form-control create-rma-Attachment-input" id="CreateRmaFormAttachment_{{orderLineProductId}}" name="attachment" type="file" />
10085 <div class="u-hidden emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div>
10086 </div>
10087 </div>
10088 </form>
10089 {{/.}}
10090 </script>
10091
10092 <script id="RMA-Order-Select" type="text/x-template">
10093
10094 {{#.}}
10095 {{#ifCond orderId "!==" "No"}}
10096 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div>
10097 {{/ifCond}}
10098 {{/.}}
10099 </script>
10100
10101 }
10102 @helper DelayTranslations(string word)
10103 {
10104 <p>@Translate(word)</p>
10105 }
10106 @helper RmaViewDetailsEditable()
10107 {
10108 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString();
10109 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString();
10110 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId;
10111 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0;
10112 // var token = userID != 0 ? Auth.GetToken(userID) : "0";
10113 var token = ReturnCustomFieldValue("AccessUser_UserToken");
10114 string favoriteUserToken = "";
10115 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser();
10116
10117 if (currentUserAccess != null)
10118 {
10119 favoriteUserToken = JwtService.GetToken(currentUserAccess, 86400);
10120 }
10121 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : "";
10122
10123 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div>
10124 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" />
10125 <input type="hidden" id="FavoriteUserToken" value="@favoriteUserToken" />
10126 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div>
10127 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" />
10128 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden">
10129
10130 <div class="rma-modal__container">
10131
10132 <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>
10133
10134 <header class="u-flex u-flex--row rma-modal__header" bs-d-flex bs-flex-wrap>
10135 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10136 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" />
10137 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" />
10138 <div class="fs-4 fw-bold text-primary" id="SelectedCustomerName"></div>
10139 <div class="fs-4 fw-bold text-primary" id="SelectedOrderId"></div>
10140 <div class="fs-4 fw-bold text-primary" id="SelectedDeviationId"></div>
10141 </header>
10142 <div class="">
10143 <div class="">
10144 <div class="rma-modal__selected-order orderline-form">
10145
10146 <div class="bs-grid rma-modal-container bs-mt-md-5">
10147 <div class="g-col-12 g-col-md-1 d-flex u-flex--row align-items-center justify-content-center"></div>
10148 <div class="g-col-12 g-col-md-5 d-flex u-flex--row align-items-center justify-content-center position-relative">
10149 </div>
10150 <div class="g-col-12 g-col-md-3 d-flex u-flex--row align-items-center justify-content-center"></div>
10151 <div class="g-col-12 g-col-md-3 bs-d-flex bs-justify-content-center">
10152 <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>
10153 </div>
10154 </div>
10155 @* Switch between full order rma and orderline RMA *@
10156 <div class="rma-modal-container bs-px-3 form-orderline">
10157 <div class="d-flex">
10158 </div>
10159 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg ">
10160 <div class="u-border-bottom rma-page__header-grid-container">
10161 <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>
10162 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div>
10163 <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>
10164 <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>
10165 <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>
10166 <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>
10167 </div>
10168 </div>
10169 <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">
10170 <div class="bs-d-flex">
10171 <div class="toast-body">
10172 @Translate("Please fill all required fields")
10173 </div>
10174 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10175 </div>
10176 </div>
10177
10178 @* products loop *@
10179 <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>
10180 @*<div class="bs-d-flex bs-align-items-center bs-justify-content-start bs-my-5">
10181 <input id="DeviationAgreementDraftFormOrderline" class="bs-me-3 " onclick="enableSubmitButton(this)" type="checkbox" style="width: 27px;height: 27px;" />
10182 <label class="mb-0" for="DeviationAgreementDraftFormOrderline">
10183 <span class=""></span>@Translate("Ja, jeg er kjent med retningslinjene for avvik og mener at dette er et avvik. ")
10184 </label>
10185 </div>*@
10186 </div>
10187 </div>
10188 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3">
10189 <div class="rma-modal-container">
10190 <div class="d-flex bs-justify-content-between bs-mt-5 bs-mb-2">
10191 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)">
10192 <option value="0">@Translate("Avviksårsak")</option>
10193 <option value="1">@Translate("Faktura")</option>
10194 <option value="3">@Translate("Kvalitet")</option>
10195 <option value="2">@Translate("Pakking")</option>
10196 <option value="4">@Translate("Vedlikehold")</option>
10197 <option value="5">@Translate("Feil Levert")</option>
10198 <option value="6">@Translate("Multiple")</option>
10199 </select>
10200 <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>
10201 </div>
10202 <div class="inputComment bs-w-100 bs-mt-5">
10203 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea>
10204 </div>
10205 <div class="inputComment bs-w-100 bs-mt-3">
10206 <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>
10207 </div>
10208 <input class="create-rma-form-input form-control create-rma-Attachment-input" name="FullOrderAttachment" type="file" multiple="multiple" />
10209 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5">
10210 </div>
10211 </div>
10212 </div>
10213 </div>
10214 </div>
10215 <footer class="modal__rma-footer">
10216 <div class="footer-button-container">
10217 <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>
10218 <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>
10219 </div>
10220 <div class="modal__rma-footer-icon-buttons">
10221 </div>
10222 </footer>
10223 </div>
10224 <script id="ImpersonationListContentFilterCreateRmaDraftModal" type="text/x-template">
10225 @{
10226 string title = @Translate("Choose user");
10227 }
10228 {{#.}}
10229 <div class="impersonation-container-filter-rma create-rma-modal">
10230 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" />
10231 <div class="dropdown variants-filters bs-w-100 dw-mod">
10232 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@title</label>
10233 <div class="dropdown__content u-padding dw-mod">
10234 <div class="dropdown__item__filter">
10235 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")">
10236 </div>
10237
10238 {{>ImpersonationListContentFilterSelectCreateRmaDraftModal}}
10239 </div>
10240 </div>
10241 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label>
10242 </div>
10243
10244 {{/.}}
10245 </script>
10246 <script id="ImpersonationListContentFilterSelectCreateRmaDraftModal" type="text/x-template">
10247 {{#.}}
10248 {{#Users}}
10249 <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>
10250 {{/Users}}
10251 {{/.}}
10252 </script>
10253
10254 <script id="rma-form-hidden-inputs-draft" type="text/x-template">
10255 {{#.}}
10256 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" />
10257 <input name="deviationId" id="HiddenInputsDeviationId" value="0" type="text" class="u-hidden" />
10258 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" />
10259 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" />
10260 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" />
10261 @*
10262 <input name="userId" value="@Model.CurrentUser.ID" type="text" class="u-hidden" />
10263 *@
10264 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" />
10265 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden">
10266 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden">
10267 @*<input name="isFullDeviation" value="false" type="text" class="u-hidden">*@
10268 {{/.}}
10269 </script>
10270
10271 <script id="rma-form-draft-orderlines" type="text/x-template">
10272 {{#.}}
10273 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" style="border-color: #597CCA;">
10274 <input type="hidden" name="productId" value="{{productId}}" />
10275 <input name="deviationId" id="HiddenInputsDeviationId" value="{{deviationId}}" type="text" class="u-hidden" />
10276 <input name="deviationOrderLineId" value="{{deviationOrderLineId}}" type="text" class="u-hidden" />
10277 <input name="deviationLineId" value="{{deviationLineId}}" type="text" class="u-hidden" />
10278
10279 <input type="hidden" name="productNumber" value="{{productNumber}}" />
10280 <input type="hidden" name="productName" value="{{productName}}" />
10281 <input type="hidden" name="productImage" value="{{#if productImage}}{{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" />
10282 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10283 <input type="hidden" name="supplierName" value="{{supplierName}}" />
10284 <div class="rma-form-grid-item">
10285 <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;">
10286 <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" />
10287 </div>
10288 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row align-items-center">
10289 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10290 <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>
10291 <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>
10292 </div>
10293 </div>
10294 <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;">
10295 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" value={{reason}} name="reason" onchange="showAdditionalOrderlineFields(this, this.value)">
10296 <option {{#ifCond reason '===' 0}} selected {{/ifCond}} value="0">@Translate("Avviksårsak")</option>
10297 <option {{#ifCond reason '===' 1}} selected {{/ifCond}} value="1">@Translate("Faktura")</option>
10298 <option {{#ifCond reason '===' 3}} selected {{/ifCond}} value="3">@Translate("Kvalitet")</option>
10299 <option {{#ifCond reason '===' 2}} selected {{/ifCond}} value="2">@Translate("Pakking")</option>
10300 <option {{#ifCond reason '===' 4}} selected {{/ifCond}} value="4">@Translate("Vedlikehold")</option>
10301 <option {{#ifCond reason '===' 5}} selected {{/ifCond}} value="5">@Translate("Feil Levert")</option>
10302 <option {{#ifCond reason '===' 6}} selected {{/ifCond}} value="6">@Translate("Multiple")</option>
10303 </select>
10304 </div>
10305 <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>
10306 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" />
10307 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{deviationOrderLineTotalPrice}}" />
10308 <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;">
10309 <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}}" />
10310 <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">
10311 <i class="far fa-times bs-text-danger bs-px-2"></i>
10312 </button>
10313 </div>
10314 </div>
10315 <div class="grid {{#ifCond reason '===' 0}} u-hidden {{/ifCond}} additional-rma-orderline-fields">
10316 <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;">
10317 </div>
10318 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;">
10319 <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" />
10320 </div>
10321 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10322 <input class="create-rma-form-input create-rma-expected-result" value="{{requestedOutcome}}" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" />
10323 </div>
10324 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">
10325 <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" />
10326 <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>
10327 </div>
10328 </div>
10329 </form>
10330 {{/.}}
10331 </script>
10332
10333 <script id="RMA-Order-Select" type="text/x-template">
10334
10335 {{#.}}
10336 {{#ifCond orderId "!==" "No"}}
10337 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div>
10338 {{/ifCond}}
10339 {{/.}}
10340 </script>
10341
10342 }
10343
10344 @helper RmaViewDetails()
10345 {
10346 var company = Model.CurrentUser.Company;
10347 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
10348
10349 <form class="rma-modal__container">
10350 <header class="u-flex u-flex--row rma-modal__header bs-px-3 bs-d-flex bs-flex-wrap">
10351 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10352 <div class="rma-order-number rma-view-details__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div>
10353 </header>
10354 <input type="hidden" id="SelectedDeviationId" value="" />
10355 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" />
10356 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" />
10357 <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>
10358
10359 <div class="bs-px-3">
10360 <div class="rma-modal-container">
10361 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg u-border-bottom">
10362 <div class="rma-details-page__header-grid-container">
10363 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block"></div>
10364 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Produkt")</div>
10365 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksårsak")</div>
10366 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Levert")</div>
10367 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksantall")</div>
10368 <div class="fw-700 rma-page__grid-table-cell">@Translate("Pris")</div>
10369 </div>
10370 </div>
10371 @*// products loop *@
10372 <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>
10373 </div>
10374 </div>
10375 @*End of Products Loop *@
10376 <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>
10377 @*Start of the Messaging Loop*@
10378 <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>
10379 <div class="rma-page__write-comment">
10380 <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>
10381 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center">
10382 @*<label for="file-input">
10383 <img width="19" height="38" src="/Files/Images/attachment.svg" />
10384 </label>*@
10385 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" />
10386 <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>
10387 <span id="file-input-error" style="display:none">@Translate("Wrong file")</span>
10388 </div>
10389 </div>
10390 <footer class="modal__rma-footer">
10391 <div class="footer__buttons">
10392 @if (isCompanyKraemer)
10393 {
10394 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect">
10395 @*<option value="1">@Translate("STATUS_1")</option>*@
10396 <option value="2" default selected>@Translate("STATUS_2")</option>
10397 <option value="3">@Translate("STATUS_3")</option>
10398 <option value="4">@Translate("STATUS_4")</option>
10399 </select>
10400 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button>
10401 }
10402 else
10403 {
10404 <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>
10405 <div class="bs-modal bs-fade" id="reopenRmaModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
10406 <div class="modal-dialog bs-mt-4">
10407 <div class="modal-content bs-border-primary-dark bs-bg-sand-light">
10408 <div class="modal-body bs-pb-0 bs-text-center">
10409 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6">
10410 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3>
10411 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p>
10412 </div>
10413 </div>
10414 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3">
10415 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button>
10416 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button>
10417 </div>
10418 </div>
10419 </div>
10420 </div>
10421
10422 }
10423 </div>
10424 <div class="modal__rma-footer-icon-buttons">
10425 </div>
10426 </footer>
10427 </form>
10428 <script>
10429 let applyReasonTranslation = ()=>{
10430 document.querySelectorAll(".reasonTranslation").forEach(el =>{
10431 let reason = el.innerHTML;
10432 switch (reason){
10433
10434 case "REASON_0":
10435 el.innerHTML = `@Translate("REASON_0")`;
10436 break;
10437 case "REASON_1":
10438 el.innerHTML = `@Translate("REASON_1")`;
10439 break;
10440 case "REASON_2":
10441 console.log("REASON_2")
10442 el.innerHTML = `@Translate("REASON_2")`;
10443 break;
10444 case "REASON_3":
10445 el.innerHTML = `@Translate("REASON_3")`;
10446 break;
10447 case "REASON_4":
10448 console.log("REASON_4")
10449 el.innerHTML = `@Translate("REASON_4")`;
10450 break;
10451 case "REASON_5":
10452 el.innerHTML = `@Translate("REASON_5")`;
10453 break;
10454 case "REASON_6":
10455 el.innerHTML = `@Translate("REASON_6")`;
10456 break;
10457 }
10458 })
10459 }
10460 let applyStatusTranslation = ()=>{
10461 document.querySelectorAll(".statusTranslation").forEach(el =>{
10462 let status = el.innerHTML;
10463 switch (status){
10464 case "STATUS_0":
10465 el.innerHTML = `@Translate("STATUS_0")`;
10466 break;
10467 case "STATUS_1":
10468 el.innerHTML = `@Translate("STATUS_1")`;
10469 break;
10470 case "STATUS_2":
10471 console.log("STATUS_2")
10472 el.innerHTML = `@Translate("STATUS_2")`;
10473 break;
10474 case "STATUS_3":
10475 el.innerHTML = `@Translate("STATUS_3")`;
10476 break;
10477 case "STATUS_4":
10478 console.log("STATUS_4")
10479 el.innerHTML = `@Translate("STATUS_4")`;
10480 break;
10481 case "STATUS_5":
10482 el.innerHTML = `@Translate("STATUS_5")`;
10483 break;
10484 case "STATUS_6":
10485 el.innerHTML = `@Translate("STATUS_6")`;
10486 break;
10487 }
10488 })
10489 }
10490 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10491 applyReasonTranslation();
10492 })
10493 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10494 applyReasonTranslation();
10495 })
10496 document.getElementById("Rma-Order-Details-handlebars-container").addEventListener('contentLoaded', function (e) {
10497 applyStatusTranslation();
10498 })
10499 document.getElementById("Rma-Order-Details-handlebars-container-first-row").addEventListener('contentLoaded', function (e) {
10500 applyStatusTranslation();
10501 })
10502 document.getElementById("Rma-Order-Details-handlebars-container-second-row").addEventListener('contentLoaded', function (e) {
10503 applyStatusTranslation();
10504 applyReasonTranslation();
10505 })
10506 </script>
10507 <script id="Rma-Details-handlebars" type="text/x-template">
10508
10509 {{#.}}
10510 <div class="u-hidden deviationIdDiv">{{deviationId}}</div>
10511 <div class="rma-products-list bs-border-bottom">
10512 <div class="rma-details-page__header-grid-container">
10513 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center">
10514 <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" />
10515 </div>
10516 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row align-items-center">
10517 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10518 <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>
10519 <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>
10520 </div>
10521 </div>
10522 <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>
10523 <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>
10524 <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>
10525 <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>
10526 </div>
10527
10528 <div class="grid">
10529 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center">
10530 </div>
10531 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start">
10532 <div class="rma-product-info-container">
10533 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div>
10534 <div class="rma-product-details d-flex u-flex--row align-items-center">
10535 {{#each messages}}
10536 {{message}}
10537 {{/each}}
10538 </div>
10539 </div>
10540 </div>
10541 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row bs-align-items-start">
10542 <div class="rma-product-info-container">
10543 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div>
10544 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div>
10545 </div>
10546 </div>
10547 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center"></div>
10548 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start">
10549 <div class="rma-product-info-container">
10550 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div>
10551 <div class="bs-d-flex bs-gap-2 bs-flex-wrap">
10552 {{#each messages}}
10553 {{#each messageFiles}}
10554 @*
10555 <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>
10556 *@ <a href="{{messageFile}}" target="_blank">
10557 <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" />
10558 </a>
10559 {{/each}}
10560 {{/each}}
10561 </div>
10562 </div>
10563 </div>
10564 </div>
10565 </div>
10566 {{/.}}
10567 </script>
10568 <script id="Rma-Details-messaging-handlebars" type="text/x-template">
10569 {{#.}}
10570 <div class="d-grid">
10571 {{#if isCustomer}}
10572 <div class="rma-page__user-message">
10573 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10574 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10575 <div class="rma-page__message-date ">{{messageDate}}</div>
10576 </div>
10577 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10578 <div class="rma-page__attachment-footer">
10579 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer">
10580 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10581 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank">
10582 <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" />
10583 </a> {{/each}}
10584 </a>
10585 </div>
10586 </div>
10587 {{else}}
10588 <div class="rma-page__admin-message">
10589 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10590 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10591 <div class="rma-page__message-date ">{{messageDate}}</div>
10592 </div>
10593 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10594 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap">
10595
10596 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10597 {{#each messageFiles}}
10598 <a href="{{messageFile}}" target="_blank">
10599 <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" />
10600 </a>
10601 {{/each}}
10602 </div>
10603 </div>
10604 {{/if}}
10605 </div>
10606
10607 {{/.}}
10608 </script>
10609 <script id="Rma-Order-Details-handlebars" type="text/x-template">
10610 {{#.}}
10611 <div class="rma-selected-order-info-data bs-mt-3 bs-px-5 bs-grid">
10612 <div class="cell g-col-6 g-col-md-3">
10613 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div>
10614 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}} " class="bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div>
10615 </div>
10616 <div class="cell g-col-6 g-col-md-3">
10617 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div>
10618 <div class="">{{formatDate createdDate}}</div>
10619 </div>
10620 <div class="cell g-col-6 g-col-md-3">
10621 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div>
10622 <div class=" statusTranslation">STATUS_{{status}}</div>
10623 </div>
10624 <div class="cell g-col-6 g-col-md-3">
10625 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div>
10626 <div class="">{{formatDate updatedDate}}</div>
10627 </div>
10628 <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">
10629 <div class="bs-d-flex">
10630 <div class="toast-body">
10631 @Translate("You can only view your own orders")
10632 </div>
10633 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10634 </div>
10635 </div>
10636 </div>
10637
10638 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10639 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" />
10640 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10641 <input type="hidden" id="SelectedStatus" value="{{status}}" />
10642 <div class="deviationId-header u-hidden">{{deviationId}}</div>
10643 {{/.}}
10644 </script>
10645 }
10646
10647 @helper RmaViewDetailsFullOrder()
10648 {
10649 var company = Model.CurrentUser.Company;
10650 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer";
10651
10652 <form class="rma-modal__container">
10653
10654 <header class="u-flex u-flex--row rma-modal__header bs-d-flex bs-flex-wrap">
10655 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" />
10656 <div class="rma-order-number rma-view-details-full-order__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div>
10657 </header>
10658 <input type="hidden" id="SelectedDeviationId" value="" />
10659 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" />
10660 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" />
10661 <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>
10662
10663 <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>
10664
10665 <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>
10666 <div class="bs-grid">
10667 <div class="rma-selected-order-info g-col-12 g-col-md-6 bs-my-5 bs-px-2 bs-px-md-6">
10668 <div class="bs-mb-3 bs-fs-5 fw-700">@Translate("Ordredetaljer")</div>
10669 <div class="orderInfo d-flex bs-justify-content-between">
10670 <p class="bs-mb-2 bs-fs-5 fw-bold">@Translate("Antall produktlinjer")</p>
10671 <p class="bs-mb-2 bs-fs-5 rma-form-total-orderlines">7</p>
10672 </div>
10673 <div class="orderInfo d-flex bs-justify-content-between">
10674 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Totalt antall produkter")</p>
10675 <p class="bs-mb-2 bs-fs-5 rma-form-total-quantity">289</p>
10676 </div>
10677 <div class="orderInfo d-flex bs-justify-content-between">
10678 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Ordretotal eks. MVA")</p>
10679 <p class="bs-mb-2 bs-fs-5 rma-form-total-amount">7324,54 kr</p>
10680 </div>
10681 </div>
10682 </div>
10683 <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>
10684 @*Start of the Messaging Loop*@
10685 <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>
10686 <div class="rma-page__write-comment">
10687 <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>
10688 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center">
10689 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" />
10690 <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>
10691 <span id="file-input-error2" style="display:none">@Translate("Wrong file")</span>
10692 </div>
10693 </div>
10694 <footer class="modal__rma-footer">
10695 <div class="footer__buttons">
10696 @if (isCompanyKraemer)
10697 {
10698 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect">
10699 @*<option value="1">@Translate("STATUS_1")</option>*@
10700 <option value="2" default selected>@Translate("STATUS_2")</option>
10701 <option value="3">@Translate("STATUS_3")</option>
10702 <option value="4">@Translate("STATUS_4")</option>
10703 </select>
10704 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button>
10705 }
10706 else
10707 {
10708 <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>
10709 @*
10710 <button class="submit-deviation-state bs-btn bs-btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal" >@Translate("Modal Test")</button>
10711 *@
10712 <div class="bs-modal bs-fade" id="reopenFullOrder" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
10713 <div class="modal-dialog bs-mt-4">
10714 <div class="modal-content bs-border-primary-dark bs-bg-sand-light">
10715 <div class="modal-body bs-pb-0 bs-text-center">
10716 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6">
10717 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3>
10718 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p>
10719 </div>
10720 </div>
10721 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3">
10722 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button>
10723 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button>
10724 </div>
10725 </div>
10726 </div>
10727 </div>
10728 }
10729 </div>
10730 <div class="modal__rma-footer-icon-buttons">
10731 </div>
10732 </footer>
10733 </form>
10734
10735 <script id="Rma-Details-handlebars" type="text/x-template">
10736
10737 {{#.}}
10738 <div class="u-hidden deviationIdDiv">{{deviationId}}</div>
10739 <div class="rma-products-list bs-border-bottom">
10740 <div class="rma-details-page__header-grid-container">
10741 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center">
10742 <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" />
10743 </div>
10744 <div class=" rma-page__grid-table-cell rma-details__name vertical-align-center d-flex u-flex--row align-items-center">
10745 <div class="rma-product-info-container bs-d-flex bs-flex-column">
10746 <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>
10747 <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>
10748 </div>
10749 </div>
10750 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div>
10751 <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>
10752 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div>
10753 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{deviationOrderLineTotalPrice}}</div>
10754 </div>
10755 <div class="rma-details-page__header-grid-container">
10756 <div class="rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"></div>
10757 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10758 <div class="rma-product-info-container">
10759 <div class="fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div>
10760 <div class="rma-product-details d-flex u-flex--row align-items-center">
10761 {{#each messages}}
10762 {{message}}
10763 {{/each}}
10764 </div>
10765 </div>
10766 </div>
10767 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10768 <div class="rma-product-info-container">
10769 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div>
10770 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div>
10771 </div>
10772 </div>
10773 <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>
10774 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start">
10775 <div class="rma-product-info-container">
10776 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div>
10777 <div class="bs-d-flex bs-gap-2 bs-flex-wrap">
10778 {{#each messages}}
10779 {{#each messageFiles}}
10780 @*
10781 <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>
10782 *@ <a href="{{messageFile}}" target="_blank">
10783 <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" />
10784 </a>
10785 {{/each}}
10786 {{/each}}
10787 </div>
10788 </div>
10789 </div>
10790 </div>
10791 </div>
10792 {{/.}}
10793 </script>
10794 <script id="Rma-Details-messaging-handlebars" type="text/x-template">
10795 {{#.}}
10796 <div class="d-grid">
10797 {{#if isCustomer}}
10798 <div class="rma-page__user-message">
10799 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10800 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10801 <div class="rma-page__message-date ">{{messageDate}}</div>
10802 </div>
10803 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10804 <div class="rma-page__attachment-footer">
10805 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer">
10806 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10807 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank">
10808 <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" />
10809 </a> {{/each}}
10810 </a>
10811 </div>
10812 </div>
10813 {{else}}
10814 <div class="rma-page__admin-message">
10815 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break">
10816 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div>
10817 <div class="rma-page__message-date ">{{messageDate}}</div>
10818 </div>
10819 <div class="rma-page__message-content bs-text-break">{{message}}</div>
10820 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap">
10821
10822 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@
10823 {{#each messageFiles}}
10824 <a href="{{messageFile}}" target="_blank">
10825 <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" />
10826 </a>
10827 {{/each}}
10828 </div>
10829 </div>
10830
10831 {{/if}}
10832 </div>
10833
10834 {{/.}}
10835 </script>
10836 <script id="Rma-Order-Details-handlebars" type="text/x-template">
10837 {{#.}}
10838 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10839 <input type="hidden" id="OrderLocation" value="{{orderLocation}}" />
10840 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10841 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10842 <div class="cell g-col-6 g-col-md-3">
10843 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div>
10844 <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>
10845 </div>
10846 <div class="cell g-col-6 g-col-md-3">
10847 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div>
10848 <div class="">{{formatDate createdDate}}</div>
10849 </div>
10850 <div class="cell g-col-6 g-col-md-3">
10851 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div>
10852 <div class=" statusTranslation">STATUS_{{status}}</div>
10853 </div>
10854 <div class="cell g-col-6 g-col-md-3">
10855 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div>
10856 <div class="">{{formatDate updatedDate}}</div>
10857 </div>
10858 <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">
10859 <div class="bs-d-flex">
10860 <div class="toast-body">
10861 @Translate("You can only view your own orders")
10862 </div>
10863 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10864 </div>
10865 </div>
10866 </div>
10867
10868 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" />
10869 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" />
10870 <input type="hidden" id="SelectedReason" value="{{reason}}" />
10871 <div class="deviationId-header u-hidden">{{deviationId}}</div>
10872 {{/.}}
10873 </script>
10874
10875 <script id="Rma-Order-Details-handlebars-second-row" type="text/x-template">
10876 {{#.}}
10877
10878 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10879 <div class="cell g-col-6 g-col-md-3">
10880 <div class="bs-fw-bold bs-mb-3">@Translate("Avviksårsak")</div>
10881 <div class="reasonTranslation">REASON_{{reason}}</div>
10882 </div>
10883 <div class="cell g-col-6 g-col-md-3">
10884 <div class="bs-fw-bold bs-mb-3">@Translate("S/O")</div>
10885 <div class="">{{orderShopReference}}</div>
10886 </div>
10887 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}">
10888 </div>
10889 {{/.}}
10890 </script>
10891
10892 <script id="Rma-Order-Details-handlebars-third-row" type="text/x-template">
10893 {{#.}}
10894 <div class="rma-selected-order-info bs-mt-3 bs-px-1 bs-px-md-6 bs-grid">
10895 <div class="cell g-col-12 g-col-md-6">
10896 <div class="bs-fw-bold bs-mb-3">@Translate("Vedlegg")</div>
10897 <div class="bs-d-flex bs-flex-row bs-flex-wrap bs-gap-3">
10898 {{#each messages}}{{#each messageFiles}}
10899 <a href="{{messageFile}}" target="_blank">
10900 <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" />
10901 </a>
10902 {{/each}}{{/each}}
10903 </div>
10904 </div>
10905
10906 <div class="cell g-col-6 g-col-md-3">
10907 <div class="bs-fw-bold bs-mb-3">@Translate("Kommentar")</div>
10908 <div class="">{{#each messages}}{{message}}{{/each}}</div>
10909 </div>
10910 <div class="cell g-col-6 g-col-md-3">
10911 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket utfall")</div>
10912 <div class="">{{requestedOutcome}}</div>
10913 </div>
10914 </div>
10915 {{/.}}
10916 </script>
10917
10918 }
10919
10920 @helper ViewOrderDetails2()
10921 {
10922 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser();
10923 var cartPageId = GetPageIdByNavigationTag("CartPage");
10924 string dwAPIToken = "";
10925 if (currentUserAccess != null)
10926 {
10927 dwAPIToken = JwtService.GetToken(currentUserAccess, 86400);
10928 }
10929 <form class="rma-modal__container">
10930 <header class="modal-header bs-bg-sand-light bs-justify-content-start">
10931 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" alt="Kraemer logo" />
10932 <div class="rma-order-number">@Translate("TAKK FOR DIN ORDRE!")</div>
10933 </header>
10934
10935 <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>
10936
10937 <div class="modal-body bs-pt-0">
10938 <div class="modal__content rma-page_table-header bs-mt-3 bs-my-lg-3">
10939 <div class="order-history-header bs-fw-bold bs-border-bottom bs-border-primary-dark">
10940 <div class="cell bs-d-none bs-d-lg-block"></div>
10941 <div class="cell">@Translate("Produkt")</div>
10942 <div class="cell bs-d-none bs-d-lg-block">@Translate("Kommentar")</div>
10943 <div class="cell">@Translate("Antall")</div>
10944 <div class="cell">@Translate("Pris")</div>
10945 <div class="cell">@Translate("Total Eks. MVA")</div>
10946 </div>
10947 </div>
10948 @*// products loop *@
10949 <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>
10950 </div>
10951 <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">
10952 <div class="bs-d-flex">
10953 <div class="toast-body">
10954 @Translate("This order is not yet available to create a RMA.")
10955 </div>
10956 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
10957 </div>
10958 </div>
10959 <footer class="modal__rma-footer bs-py-4 bs-justify-content-end orderHistory-footer">
10960 @*<button class="submit-rma-button" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'))">@Translate("Opprett Avvik")</button>*@
10961 <div class="modal__rma-footer-icon-buttons">
10962 <a class="rma-page__icon-buttons bs-mx-2 openRmaModalButton bs-ms-0" title="@Translate("HOVER_StartDeviation")" onclick="openRMAModal('OrderSelected')">
10963 <img height="26" width="26" src="/Files/Images/UnionRMA-icon.svg" />
10964 </a>
10965 @*<a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button
10966 open-full-favorite-list-button" data-token="@dwAPIToken" onclick="showFavoriteListsForFullOrder(this,
10967 true)" title="@Translate("HOVER_FavouriteList")">
10968 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" />
10969 </a>*@
10970 @*<div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container')
10971 .classList.add('u-hidden');this.classList.add('bs-d-none');"></div>
10972 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border
10973 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;">
10974 <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">
10975 </div>
10976 <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">
10977 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" />
10978 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button>
10979 </div>
10980 </div>*@
10981 <a class="rma-page__icon-buttons bs-mx-2" title="@Translate("HOVER_Download")">
10982 <img height="26" width="26" onclick="PrintElem(this.closest('form'))" src="/Files/Images/print-icon.svg" />
10983 </a>
10984 </div>
10985 </footer>
10986 </form>
10987 <script id="Order-Header-Details-handlebars" type="text/x-template">
10988
10989 <div class="bs-grid">
10990 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderId '===' null}} invisible {{else}} {{#ifCond orderId '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
10991 <div class="bs-fw-bold bs-mb-3">@Translate("Ordre-ID")</div>
10992 <div class="" id="ModalOpenedOrderId" data-order-id="{{orderId}}">{{orderId}}</div>
10993 <input type="hidden" id="ModalOpenedUserId" value="@Model.CurrentUser.ID">
10994 </div>
10995 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDate '===' null}} invisible {{else}} {{#ifCond orderDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
10996 <div class="bs-fw-bold bs-mb-3">@Translate("Bestillingsdato")</div>
10997 <div class="">{{formatDate orderDate}}</div>
10998 </div>
10999
11000 <div class="cell g-col-6 g-col-md-3 {{#ifCond theListName '===' null}} invisible {{else}} {{#ifCond theListName '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11001 <div class="bs-fw-bold bs-mb-3">@Translate("Handlekurv navn")</div>
11002 <div class="">{{orderCartName}}</div>
11003 </div>
11004 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderLocation '===' null}} invisible {{else}} {{#ifCond orderLocation '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11005 <div class="bs-fw-bold bs-mb-3">@Translate("Ordrelokasjon")</div>
11006 <div class="">{{orderLocation}}</div>
11007 </div>
11008 </div>
11009
11010 <div class="bs-grid">
11011 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPoNumber '===' null}} invisible {{else}} {{#ifCond orderPoNumber '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11012 <div class="bs-fw-bold bs-mb-3">@Translate("P.O. Nummer")</div>
11013 <div class="">{{orderPoNumber}}</div>
11014 </div>
11015 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDesiredDeliveryDate '===' null}} invisible {{else}} {{#ifCond orderDesiredDeliveryDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11016 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket leveringsdag")</div>
11017 <div class="">{{formatDate orderDesiredDeliveryDate}}</div>
11018 </div>
11019 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPurchaserName '===' null}} invisible {{else}} {{#ifCond orderPurchaserName '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11020 <div class="bs-fw-bold bs-mb-3">@Translate("Navn på kjøper")</div>
11021 <div class="">{{orderPurchaserName}}</div>
11022 </div>
11023 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDeliveryPlace '===' null}} invisible {{else}} {{#ifCond orderDeliveryPlace '===' ''}} invisible {{/ifCond}} {{/ifCond}}">
11024 <div class="bs-fw-bold bs-mb-3">@Translate("Leveringssted")</div>
11025 <div class="">{{orderDeliveryPlace}}</div>
11026 </div>
11027 </div>
11028 </script>
11029
11030 <script id="Order-Details-handlebars" type="text/x-template">
11031 {{#.}}
11032 <div class="order-history-item-container">
11033 <div class="order-history-item bs-py-2 {{#ifCond orderLineDiscontinued '!==' false}} disabled {{/ifCond}} bs-py-lg-0">
11034 <div class="cell bs-d-none bs-d-lg-block">
11035 <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}}" />
11036 </div>
11037 <div class="cell order-history-detail__name bs-justify-self">
11038 <div class="rma-product-info-container">
11039 <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>
11040 <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>
11041 <div class="bs-text-danger order-history-product-unavailable">{{#ifCond orderLineDiscontinued '!==' false}}@Translate("Denne varen er ikke lenger tilgjengelig"){{/ifCond}}</div>
11042 </div>
11043 </div>
11044 <div class="cell order-history-detail__comment bs-d-none bs-d-lg-block">{{orderLineComment}}</div>
11045 <div class="cell order-history-quantity-field" data-quantity={{orderLineQuantity}}>{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div>
11046 <div class="cell order-history-price">{{orderLinePricePerMeasurementUnit}}</div>
11047 <div class="cell">{{orderLineTotalPrice}} @*{{orderLinePriceUnit}}*@</div>
11048 <div class="cell bs-d-flex bs-flex-row">
11049 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{orderLineProductNumber}}" title="@Translate("HOVER_FavouriteList")">
11050 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" />
11051 </a>
11052 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container')
11053 .classList.add('u-hidden');"></div>
11054 <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: 30px">
11055 <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">
11056 @*<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>*@
11057 </div>
11058 <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">
11059 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" />
11060 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button>
11061 </div>
11062 </div>
11063 </div>
11064 </div>
11065 </div>
11066 {{/.}}
11067 </script>
11068 }
11069
11070
11071 @functions {
11072 public class ManifestIcon
11073 {
11074 public string src { get; set; }
11075 public string type { get; set; }
11076 public string sizes { get; set; }
11077 }
11078
11079 public class Manifest
11080 {
11081 public string name { get; set; }
11082 public string short_name { get; set; }
11083 public string start_url { get; set; }
11084 public string display { get; set; }
11085 public string background_color { get; set; }
11086 public string theme_color { get; set; }
11087 public List<ManifestIcon> icons { get; set; }
11088 }
11089 }
11090
11091 <!DOCTYPE html>
11092
11093 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
11094
11095
11096
11097 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
11098 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
11099
11100
11101
11102 @helper RenderMasterHead() {
11103 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList();
11104
11105 <head>
11106 <!-- Rapido version 3.3 -->
11107
11108 @RenderBlockList(subBlocks)
11109 </head>
11110 }
11111
11112 @helper RenderMasterMetadata() {
11113 var swatches = new Dynamicweb.Content.Items.ColorSwatchService();
11114 var brandColors = swatches.GetColorSwatch(1);
11115 string brandColorOne = brandColors.Palette["BrandColor1"];
11116
11117 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) {
11118 Manifest manifest = new Manifest
11119 {
11120 name = Model.Area.Item.GetItem("Settings").GetString("AppName"),
11121 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"),
11122 start_url = "/",
11123 display = "standalone",
11124 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"),
11125 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor")
11126 };
11127
11128 manifest.icons = new List<ManifestIcon> {
11129 new ManifestIcon {
11130 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11131 sizes = "192x192",
11132 type = "image/png"
11133 },
11134 new ManifestIcon {
11135 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11136 sizes = "512x512",
11137 type = "image/png"
11138 },
11139 new ManifestIcon {
11140 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
11141 sizes = "1024x1024",
11142 type = "image/png"
11143 }
11144 };
11145
11146 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json");
11147 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest);
11148 string currentManifest = File.ReadAllText(manifestFilePath);
11149
11150 if (manifestJSON != currentManifest)
11151 {
11152 File.WriteAllText(manifestFilePath, manifestJSON);
11153 }
11154 }
11155
11156 <meta charset="utf-8" />
11157 <title>@Model.Title</title>
11158 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
11159 <meta name="robots" content="index, follow">
11160 <meta name="theme-color" content="@brandColorOne" />
11161
11162 if (!Model.MetaTags.Contains("og:image")) {
11163 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")));
11164 }
11165
11166 if (!Model.MetaTags.Contains("og:description")) {
11167 Pageview.Meta.AddTag("og:description", Model.Description);
11168 }
11169
11170 Pageview.Meta.AddTag("og:title", Model.Title);
11171 Pageview.Meta.AddTag("og:site_name", Model.Name);
11172 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString());
11173 Pageview.Meta.AddTag("og:type", "Website");
11174 Pageview.Meta.AddTag("fb:page_id", Model.ID.ToString());
11175
11176 @Model.MetaTags
11177 }
11178
11179 @helper RenderMasterCss() {
11180 var fonts = new string[] {
11181 getFontFamily("Layout", "HeaderFont"),
11182 getFontFamily("Layout", "SubheaderFont"),
11183 getFontFamily("Layout", "TertiaryHeaderFont"),
11184 getFontFamily("Layout", "BodyText"),
11185 getFontFamily("Layout", "Header", "ToolsFont"),
11186 getFontFamily("Layout", "Header", "NavigationFont"),
11187 getFontFamily("Layout", "MobileNavigation", "Font"),
11188 getFontFamily("ProductList", "Facets", "HeaderFont"),
11189 getFontFamily("ProductPage", "PriceFontDesign"),
11190 getFontFamily("Ecommerce", "SaleSticker", "Font"),
11191 getFontFamily("Ecommerce", "NewSticker", "Font"),
11192 getFontFamily("Ecommerce", "CustomSticker", "Font")
11193 };
11194
11195 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
11196 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
11197 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
11198 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css";
11199 if (useFontAwesomePro)
11200 {
11201 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css";
11202 }
11203
11204 bool movetoproduction = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("movetoproduction")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("movetoproduction")) : false;
11205
11206 //Favicon
11207 <link href="@favicon" rel="icon" type="image/png">
11208
11209 //Base (Default, wireframe) styles
11210 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
11211
11212 //Rapido Css from Website Settings
11213 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css">
11214
11215 //Ignite Css (Custom site specific styles)
11216 //<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=25">
11217
11218 /*TODO remove and compile css*/
11219 @* <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/custom.css?v=22"> *@
11220 //Font awesome
11221 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css">
11222
11223 //Flag icon
11224 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css">
11225
11226 //Google fonts
11227 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)));
11228
11229 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
11230 bool featureFlagCSSFramework = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("feature")) && HttpContext.Current.Request.QueryString.Get("feature") == "cssframework";
11231 /*if (featureFlagCSSFramework)
11232 {*/
11233
11234 var cssStyleFileInfo = new System.IO.FileInfo(Dynamicweb.Core.SystemInformation.MapPath("/Files/Templates/Designs/Rapido/dist/app.bundle.css"));
11235 // <link rel="stylesheet" type="text/css" href="@autoCssBundleLink">
11236 <link href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?@cssStyleFileInfo.LastWriteTime.Ticks" rel="stylesheet" media="all" type="text/css">
11237 @*}
11238 else
11239 {
11240 <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css">
11241
11242 }*@
11243 PushPromise(favicon);
11244 PushPromise(fontAwesomeCssLink);
11245 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css");
11246 PushPromise(autoCssLink);
11247 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css");
11248 PushPromise("/Files/Images/placeholder.gif");
11249 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css");
11250 }
11251
11252 @helper RenderMasterManifest() {
11253 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")))
11254 {
11255 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json">
11256 PushPromise("/Files/Templates/Designs/Rapido/manifest.json");
11257 }
11258 }
11259
11260 @helper RenderMasterBody() {
11261 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList();
11262 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : "";
11263 if (!String.IsNullOrEmpty(designLayout)) {
11264 designLayout = "class=\"" + designLayout + "\"";
11265 }
11266
11267 List<int> pages = new List<int>();
11268 pages.Add(GetPageIdByNavigationTag("RecipeBank"));
11269 pages.Add(GetPageIdByNavigationTag("DeviationsHistoryPage"));
11270 pages.Add(GetPageIdByNavigationTag("MenuView"));
11271 pages.Add(GetPageIdByNavigationTag("MenuCalendarView"));
11272 pages.Add(GetPageIdByNavigationTag("ShoppingList"));
11273 pages.Add(GetPageIdByNavigationTag("CustomerOrders"));
11274 pages.Add(GetPageIdByNavigationTag("MenuCreationView"));
11275 List<int> availablePages = pages.Where(x=>x!=0).ToList();
11276
11277 int currentPage = Pageview?.ID ?? 0;
11278 bool pageHasWhiteBackground = availablePages.Contains(currentPage);
11279
11280 <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")">
11281 @RenderBlockList(subBlocks)
11282 </body>
11283 }
11284
11285 @helper RenderMasterHeader()
11286 {
11287 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
11288 //bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11289 bool isNavigationStickyMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11290 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
11291
11292 <header class="top-container @stickyTop dw-mod u-no-print" id="Top">
11293 @RenderBlockList(subBlocks)
11294 </header>
11295 }
11296
11297 @helper RenderMain()
11298 {
11299 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
11300
11301 <main class="site dw-mod">
11302 @RenderBlockList(subBlocks)
11303 </main>
11304 }
11305
11306 @helper RenderPageContent()
11307 {
11308 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
11309 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
11310 var cartPageUrl = GetPageIdByNavigationTag("CartPage");
11311
11312 <div id="Page" class="page @pagePos" data-cart-url="@cartPageUrl">
11313 <div id="content">
11314 @RenderSnippet("Content")
11315 </div>
11316 </div>
11317 }
11318
11319 @* Hack to support nested helpers *@
11320 @SnippetStart("Content")
11321 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
11322 @using WebApp.Singleton;
11323
11324 @{
11325 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser();
11326 var shipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner").Value;
11327 var onlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse").Value.ToString();
11328 var mode = HttpContext.Current.Request["mode"];
11329
11330 var serverDataJson = mode == "quicksearch"
11331 ? Newtonsoft.Json.JsonConvert.SerializeObject(new
11332 {
11333 RootGroupId = "",
11334 RootGroupName = ""
11335 })
11336 :
11337 Newtonsoft.Json.JsonConvert.SerializeObject(new
11338 {
11339 RootGroupId = HttpContext.Current.Request["GroupId"],
11340 RootGroupName = string.IsNullOrWhiteSpace(HttpContext.Current.Request["GroupName"])
11341 ? new Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService().GetById(HttpContext.Current.Request["GroupId"], "LANG17").Name
11342 : HttpContext.Current.Request["GroupName"],
11343 });
11344 }
11345
11346
11347
11348 @*needed for proper navigation translationds*@
11349 @if (shipOwner?.ToString() == "26300")
11350 {
11351 <input type="hidden" id="shipOwnerValue" value="" />
11352 }
11353
11354 @if (onlySeeDiverse?.ToString() == "True")
11355 {
11356 <input type="hidden" id="OnlySeeDiverse" value="" />
11357 }
11358
11359 <div class="content-container" >
11360 <div
11361 id="productListApp"
11362 style="padding-top: 30px;" data-server='@serverDataJson'
11363 class="content-row content-row--full content-row--column-gap-xl content-row--center content-row--height-auto content-row--spacing-none">
11364 </div>
11365 </div>
11366
11367 @SnippetEnd("Content")
11368
11369 @helper RenderIosTabletFix() {
11370
11371 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios)
11372 {
11373 <script>
11374 var cartPageUrl = document.querySelector("#Page").getAttribute("data-cart-url");
11375 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream;
11376 if (isIpadIOS) {
11377 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&";
11378 var isCheckout = (window.location.href.indexOf(cartPageUrl) > -1) ? true : false;
11379 if(isCheckout) {
11380 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios&CartV2.GotoStep1=true";
11381 } else {
11382 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios";
11383 }
11384 }
11385 </script>
11386 }
11387 }
11388
11389 </html>
11390
11391 <script>
11392 function disableEnterKey(e)
11393 {
11394 var key;
11395 if(window.event)
11396 key = window.event.keyCode; //IE
11397 else
11398 key = e.which; //firefox
11399
11400 return (key != 13);
11401 }
11402 </script>