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