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