Error executing template "Designs/Rapido/_parsed/Kraemer_ProductList.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_0ee926897139478e97942bda6540ef40.Execute() in D:\dynamicweb.net\Solutions\Degree\kraemer.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Kraemer_ProductList.parsed.cshtml:line 11381
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 3 @using System.Web; 4 @using Dynamicweb.Frontend 5 @using Dynamicweb.Frontend.Devices 6 @using Dynamicweb.Extensibility 7 @using Dynamicweb.Content 8 @using Dynamicweb.Security 9 @using Dynamicweb.Core 10 @using System 11 @using System.Web 12 @using System.IO 13 @using Dynamicweb.Rapido.Blocks 14 @using System.Net 15 16 17 @functions { 18 BlocksPage masterPage = BlocksPage.GetBlockPage("Master"); 19 20 string getFontFamily(params string[] items) 21 { 22 var itemParent = Pageview.AreaSettings; 23 foreach (var item in items) 24 { 25 itemParent = itemParent.GetItem(item); 26 if (itemParent == null) 27 { 28 return null; 29 } 30 } 31 32 var googleFont = itemParent.GetGoogleFont("FontFamily"); 33 if (googleFont == null) 34 { 35 return null; 36 } 37 return googleFont.Family.Replace(" ", "+"); 38 } 39 } 40 41 @{ 42 Block root = new Block 43 { 44 Id = "Root", 45 SortId = 10, 46 BlocksList = new List<Block> 47 { 48 new Block { 49 Id = "Head", 50 SortId = 10, 51 SkipRenderBlocksList = true, 52 Template = RenderMasterHead(), 53 BlocksList = new List<Block> 54 { 55 new Block { 56 Id = "HeadMetadata", 57 SortId = 10, 58 Template = RenderMasterMetadata(), 59 }, 60 new Block { 61 Id = "HeadCss", 62 SortId = 20, 63 Template = RenderMasterCss(), 64 }, 65 new Block { 66 Id = "HeadManifest", 67 SortId = 30, 68 Template = RenderMasterManifest(), 69 } 70 } 71 }, 72 new Block { 73 Id = "Body", 74 SortId = 20, 75 SkipRenderBlocksList = true, 76 Template = RenderMasterBody(), 77 BlocksList = new List<Block> 78 { 79 new Block() 80 { 81 Id = "Master", 82 SortId = 10, 83 BlocksList = new List<Block> { 84 new Block { 85 Id = "MasterTopSnippets", 86 SortId = 10 87 }, 88 new Block { 89 Id = "MasterMain", 90 SortId = 20, 91 Template = RenderMain(), 92 SkipRenderBlocksList = true, 93 BlocksList = new List<Block> { 94 new Block { 95 Id = "MasterHeader", 96 SortId = 10, 97 Template = RenderMasterHeader(), 98 SkipRenderBlocksList = true 99 }, 100 new Block { 101 Id = "MasterPageContent", 102 SortId = 20, 103 Template = RenderPageContent() 104 } 105 } 106 }, 107 new Block { 108 Id = "MasterFooter", 109 SortId = 30 110 }, 111 new Block { 112 Id = "MasterReferences", 113 SortId = 40 114 }, 115 new Block { 116 Id = "MasterBottomSnippets", 117 SortId = 50, 118 BlocksList = new List<Block> { 119 new Block { 120 Id = "iOsTabletFix", 121 SortId = 90, 122 Template = RenderIosTabletFix() 123 } 124 } 125 } 126 } 127 } 128 } 129 } 130 } 131 }; 132 133 masterPage.Add(root); 134 } 135 136 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 137 @using System.Text.RegularExpressions 138 @using System.Collections.Generic 139 @using System.Reflection 140 @using System.Web 141 @using System.Web.UI.HtmlControls 142 @using Dynamicweb.Rapido.Blocks.Components 143 @using Dynamicweb.Rapido.Blocks.Components.Articles 144 @using Dynamicweb.Rapido.Blocks.Components.Documentation 145 @using Dynamicweb.Rapido.Blocks 146 147 148 @*--- START: Base block renderers ---*@ 149 150 @helper RenderBlockList(List<Block> blocks) 151 { 152 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 153 blocks = blocks.OrderBy(item => item.SortId).ToList(); 154 155 foreach (Block item in blocks) 156 { 157 if (debug) 158 { 159 <!-- Block START: @item.Id --> 160 } 161 162 if (item.Design == null) 163 { 164 @RenderBlock(item) 165 } 166 else if (item.Design.RenderType == RenderType.None) 167 { 168 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 169 170 <div class="@cssClass dw-mod"> 171 @RenderBlock(item) 172 </div> 173 } 174 else if (item.Design.RenderType != RenderType.Hide) 175 { 176 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 177 178 if (!item.SkipRenderBlocksList) 179 { 180 if (item.Design.RenderType == RenderType.Row) 181 { 182 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 183 @RenderBlock(item) 184 </div> 185 } 186 187 if (item.Design.RenderType == RenderType.Column) 188 { 189 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 190 string size = item.Design.Size ?? "12"; 191 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 192 193 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id"> 194 @RenderBlock(item) 195 </div> 196 } 197 198 if (item.Design.RenderType == RenderType.Table) 199 { 200 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 201 @RenderBlock(item) 202 </table> 203 } 204 205 if (item.Design.RenderType == RenderType.TableRow) 206 { 207 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 208 @RenderBlock(item) 209 </tr> 210 } 211 212 if (item.Design.RenderType == RenderType.TableColumn) 213 { 214 <td class="@cssClass dw-mod" id="Block__@item.Id"> 215 @RenderBlock(item) 216 </td> 217 } 218 219 if (item.Design.RenderType == RenderType.CardHeader) 220 { 221 <div class="card-header @cssClass dw-mod"> 222 @RenderBlock(item) 223 </div> 224 } 225 226 if (item.Design.RenderType == RenderType.CardBody) 227 { 228 <div class="card @cssClass dw-mod"> 229 @RenderBlock(item) 230 </div> 231 } 232 233 if (item.Design.RenderType == RenderType.CardFooter) 234 { 235 <div class="card-footer @cssClass dw-mod"> 236 @RenderBlock(item) 237 </div> 238 } 239 } 240 else 241 { 242 @RenderBlock(item) 243 } 244 } 245 246 if (debug) 247 { 248 <!-- Block END: @item.Id --> 249 } 250 } 251 } 252 253 @helper RenderBlock(Block item) 254 { 255 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 256 257 if (item.Template != null) 258 { 259 @BlocksPage.RenderTemplate(item.Template) 260 } 261 262 if (item.Component != null) 263 { 264 string customSufix = "Custom"; 265 string methodName = item.Component.HelperName; 266 267 ComponentBase[] methodParameters = new ComponentBase[1]; 268 methodParameters[0] = item.Component; 269 Type methodType = this.GetType(); 270 271 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 272 MethodInfo generalMethod = methodType.GetMethod(methodName); 273 274 try 275 { 276 if (debug) 277 { 278 <!-- Component: @methodName.Replace("Render", "") --> 279 } 280 if (customMethod != null) 281 { 282 @customMethod.Invoke(this, methodParameters).ToString(); 283 } 284 else 285 { 286 @generalMethod.Invoke(this, methodParameters).ToString(); 287 } 288 } 289 catch 290 { 291 try 292 { 293 @generalMethod.Invoke(this, methodParameters).ToString(); 294 } 295 catch (Exception ex) 296 { 297 throw new Exception(item.Component.GetType().Name + " method '" + methodName + "' could not be invoked", ex); 298 } 299 } 300 } 301 302 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 303 { 304 @RenderBlockList(item.BlocksList) 305 } 306 } 307 308 @*--- END: Base block renderers ---*@ 309 310 311 @* Include the components *@ 312 @using Dynamicweb.Rapido.Blocks.Components 313 @using Dynamicweb.Rapido.Blocks.Components.General 314 @using Dynamicweb.Rapido.Blocks 315 @using System.IO 316 317 @* Required *@ 318 @using Dynamicweb.Rapido.Blocks.Components 319 @using Dynamicweb.Rapido.Blocks.Components.General 320 @using Dynamicweb.Rapido.Blocks 321 322 323 @helper Render(ComponentBase component) 324 { 325 if (component != null) 326 { 327 @component.Render(this) 328 } 329 } 330 331 @* Components *@ 332 @using System.Reflection 333 @using Dynamicweb.Rapido.Blocks.Components.General 334 335 336 @* Component *@ 337 338 @helper RenderIcon(Icon settings) 339 { 340 if (settings != null) 341 { 342 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 343 344 if (settings.Name != null) 345 { 346 if (settings.Prefix == "svg" || settings.Name.Contains(".svg")) 347 { 348 349 <span class="u-flex u-flex--row " style="align-items: center;gap: 10px;justify-content: center"> <img width="18" height="18" src="@settings.Name"/> @settings.Label </span> 350 }else{ 351 if (string.IsNullOrEmpty(settings.Label)) 352 { 353 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 354 } 355 else 356 { 357 if (settings.LabelPosition == IconLabelPosition.Before) 358 { 359 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span> 360 } 361 else 362 { 363 <span><i class="@settings.Prefix @settings.Name u-margin-right--lg @settings.CssClass u-w20px" @color></i>@settings.Label</span> 364 } 365 } 366 } 367 } 368 else if (!string.IsNullOrEmpty(settings.Label)) 369 { 370 @settings.Label 371 } 372 } 373 } 374 @using System.Reflection 375 @using Dynamicweb.Rapido.Blocks.Components.General 376 @using Dynamicweb.Rapido.Blocks.Components 377 @using Dynamicweb.Core 378 379 @* Component *@ 380 381 @helper RenderButton(Button settings) 382 { 383 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 384 { 385 Dictionary<string, string> attributes = new Dictionary<string, string>(); 386 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 387 if (settings.Disabled) { 388 attributes.Add("disabled", "true"); 389 classList.Add("disabled"); 390 } 391 392 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 393 { 394 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 395 @RenderConfirmDialog(settings); 396 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 397 } 398 399 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 400 /*if (!string.IsNullOrEmpty(settings.Image)) { attributes.Add("image", settings.Image); }*/ 401 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 402 if (!string.IsNullOrEmpty(settings.AltText)) 403 { 404 attributes.Add("title", settings.AltText); 405 } 406 else if (!string.IsNullOrEmpty(settings.Title)) 407 { 408 attributes.Add("title", settings.Title); 409 } 410 411 var onClickEvents = new List<string>(); 412 if (!string.IsNullOrEmpty(settings.OnClick)) 413 { 414 onClickEvents.Add(settings.OnClick); 415 } 416 if (!string.IsNullOrEmpty(settings.Href)) 417 { 418 onClickEvents.Add("location.href='" + settings.Href + "'"); 419 } 420 if (onClickEvents.Count > 0) 421 { 422 attributes.Add("onClick", string.Join(";", onClickEvents)); 423 } 424 425 if (settings.ButtonLayout != ButtonLayout.None) 426 { 427 classList.Add("btn"); 428 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 429 if (btnLayout == "linkclean") 430 { 431 btnLayout = "link-clean"; //fix 432 } 433 classList.Add("btn--" + btnLayout); 434 } 435 436 if (settings.Icon == null) 437 { 438 settings.Icon = new Icon(); 439 } 440 settings.Icon.Label = settings.Title; 441 442 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 443 444 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 445 } 446 } 447 448 @helper RenderConfirmDialog(Button settings) 449 { 450 Modal confirmDialog = new Modal { 451 Id = settings.Id, 452 Width = ModalWidth.Sm, 453 Heading = new Heading 454 { 455 Level = 2, 456 Title = settings.ConfirmTitle 457 }, 458 BodyText = settings.ConfirmText 459 }; 460 461 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 462 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 463 464 @Render(confirmDialog) 465 } 466 @using Dynamicweb.Rapido.Blocks.Components.General 467 @using Dynamicweb.Rapido.Blocks.Components 468 @using Dynamicweb.Core 469 470 @helper RenderDashboard(Dashboard settings) 471 { 472 var widgets = settings.GetWidgets(); 473 474 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 475 { 476 //set bg color for them 477 478 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 479 int r = Convert.ToInt16(color.R); 480 int g = Convert.ToInt16(color.G); 481 int b = Convert.ToInt16(color.B); 482 483 var count = widgets.Length; 484 var max = Math.Max(r, Math.Max(g, b)); 485 double step = 255.0 / (max * count); 486 var i = 0; 487 foreach (var widget in widgets) 488 { 489 i++; 490 491 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 492 widget.BackgroundColor = shade; 493 } 494 } 495 496 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 497 @foreach (var widget in widgets) 498 { 499 <div class="dashboard__widget"> 500 @Render(widget) 501 </div> 502 } 503 </div> 504 } 505 @using Dynamicweb.Rapido.Blocks.Components.General 506 @using Dynamicweb.Rapido.Blocks.Components 507 508 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 509 { 510 if (!string.IsNullOrEmpty(settings.Link)) 511 { 512 var backgroundStyles = ""; 513 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 514 { 515 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 516 } 517 518 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 519 <div class="u-center-middle u-color-light"> 520 @if (settings.Icon != null) 521 { 522 settings.Icon.CssClass += "widget__icon"; 523 @Render(settings.Icon) 524 } 525 <div class="widget__title">@settings.Title</div> 526 </div> 527 </a> 528 } 529 } 530 @using Dynamicweb.Rapido.Blocks.Components.General 531 @using Dynamicweb.Rapido.Blocks.Components 532 533 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 534 { 535 var backgroundStyles = ""; 536 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 537 { 538 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 539 } 540 541 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 542 <div class="u-center-middle u-color-light"> 543 @if (settings.Icon != null) 544 { 545 settings.Icon.CssClass += "widget__icon"; 546 @Render(settings.Icon) 547 } 548 <div class="widget__counter">@settings.Count</div> 549 <div class="widget__title">@settings.Title</div> 550 </div> 551 </div> 552 } 553 @using System.Reflection 554 @using Dynamicweb.Rapido.Blocks.Components.General 555 @using Dynamicweb.Rapido.Blocks.Components 556 @using Dynamicweb.Core 557 558 @* Component *@ 559 560 @helper RenderLink(Link settings) 561 { 562 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 563 { 564 Dictionary<string, string> attributes = new Dictionary<string, string>(); 565 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 566 if (settings.Disabled) 567 { 568 attributes.Add("disabled", "true"); 569 classList.Add("disabled"); 570 } 571 572 if (!string.IsNullOrEmpty(settings.AltText)) 573 { 574 attributes.Add("title", settings.AltText); 575 } 576 else if (!string.IsNullOrEmpty(settings.Title)) 577 { 578 attributes.Add("title", settings.Title); 579 } 580 581 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 582 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 583 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 584 attributes.Add("href", settings.Href); 585 586 if (settings.ButtonLayout != ButtonLayout.None) 587 { 588 classList.Add("btn"); 589 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 590 if (btnLayout == "linkclean") 591 { 592 btnLayout = "link-clean"; //fix 593 } 594 classList.Add("btn--" + btnLayout); 595 } 596 597 if (settings.Icon == null) 598 { 599 settings.Icon = new Icon(); 600 } 601 settings.Icon.Label = settings.Title; 602 603 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 604 { 605 settings.Rel = LinkRelType.Noopener; 606 } 607 if (settings.Target != LinkTargetType.None) 608 { 609 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 610 } 611 if (settings.Download) 612 { 613 attributes.Add("download", "true"); 614 } 615 if (settings.Rel != LinkRelType.None) 616 { 617 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 618 } 619 620 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 621 } 622 } 623 @using System.Reflection 624 @using Dynamicweb.Rapido.Blocks.Components 625 @using Dynamicweb.Rapido.Blocks.Components.General 626 @using Dynamicweb.Rapido.Blocks 627 628 629 @* Component *@ 630 631 @helper RenderRating(Rating settings) 632 { 633 if (settings.Score > 0) 634 { 635 int rating = settings.Score; 636 string iconType = "fa-star"; 637 638 switch (settings.Type.ToString()) { 639 case "Stars": 640 iconType = "fa-star"; 641 break; 642 case "Hearts": 643 iconType = "fa-heart"; 644 break; 645 case "Lemons": 646 iconType = "fa-lemon"; 647 break; 648 case "Bombs": 649 iconType = "fa-bomb"; 650 break; 651 } 652 653 <div class="u-ta-right"> 654 @for (int i = 0; i < settings.OutOf; i++) 655 { 656 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 657 } 658 </div> 659 } 660 } 661 @using System.Reflection 662 @using Dynamicweb.Rapido.Blocks.Components.General 663 @using Dynamicweb.Rapido.Blocks.Components 664 665 666 @* Component *@ 667 668 @helper RenderSelectFieldOption(SelectFieldOption settings) 669 { 670 Dictionary<string, string> attributes = new Dictionary<string, string>(); 671 if (settings.Checked) { attributes.Add("selected", "true"); } 672 if (settings.Disabled) { attributes.Add("disabled", "true"); } 673 if (settings.Value != null) { attributes.Add("value", settings.Value); } 674 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 675 676 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 677 } 678 @using System.Reflection 679 @using Dynamicweb.Rapido.Blocks.Components.General 680 @using Dynamicweb.Rapido.Blocks.Components 681 682 683 @* Component *@ 684 685 @helper RenderNavigation(Navigation settings) { 686 @RenderNavigation(new 687 { 688 id = settings.Id, 689 cssclass = settings.CssClass, 690 startLevel = settings.StartLevel, 691 endlevel = settings.EndLevel, 692 expandmode = settings.Expandmode, 693 sitemapmode = settings.SitemapMode, 694 template = settings.Template 695 }) 696 } 697 @using Dynamicweb.Rapido.Blocks.Components.General 698 @using Dynamicweb.Rapido.Blocks.Components 699 700 701 @* Component *@ 702 703 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 704 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 705 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 706 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 707 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 708 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 709 settings.SitemapMode = false; 710 711 @RenderNavigation(settings) 712 } 713 @using Dynamicweb.Rapido.Blocks.Components.General 714 @using Dynamicweb.Rapido.Blocks.Components 715 716 717 @* Component *@ 718 719 @helper RenderLeftNavigation(LeftNavigation settings) { 720 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 721 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 722 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 723 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 724 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 725 726 <div class="grid__cell"> 727 @RenderNavigation(settings) 728 </div> 729 } 730 @using System.Reflection 731 @using Dynamicweb.Rapido.Blocks.Components.General 732 @using Dynamicweb.Core 733 734 @* Component *@ 735 736 @helper RenderHeading(Heading settings) 737 { 738 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 739 { 740 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 741 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 742 743 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 744 if (!string.IsNullOrEmpty(settings.Link)) 745 { 746 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 747 } 748 else 749 { 750 if (settings.Icon == null) 751 { 752 settings.Icon = new Icon(); 753 } 754 settings.Icon.Label = settings.Title; 755 @Render(settings.Icon) 756 } 757 @("</" + tagName + ">"); 758 } 759 } 760 @using Dynamicweb.Rapido.Blocks.Components 761 @using Dynamicweb.Rapido.Blocks.Components.General 762 @using Dynamicweb.Rapido.Blocks 763 764 765 @* Component *@ 766 767 @helper RenderImage(Image settings) 768 { 769 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 770 { 771 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 772 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 773 774 if (settings.Caption != null) 775 { 776 @:<div> 777 } 778 779 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 780 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 781 782 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 783 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 784 @if (settings.Link != null) 785 { 786 <a href="@settings.Link"> 787 @RenderTheImage(settings) 788 </a> 789 } 790 else 791 { 792 @RenderTheImage(settings) 793 } 794 </div> 795 </div> 796 797 if (settings.Caption != null) 798 { 799 <span class="image-caption dw-mod">@settings.Caption</span> 800 @:</div> 801 } 802 } 803 else 804 { 805 if (settings.Caption != null) 806 { 807 @:<div> 808 } 809 if (!string.IsNullOrEmpty(settings.Link)) 810 { 811 <a href="@settings.Link"> 812 @RenderTheImage(settings) 813 </a> 814 } 815 else 816 { 817 @RenderTheImage(settings) 818 } 819 820 if (settings.Caption != null) 821 { 822 <span class="image-caption dw-mod">@settings.Caption</span> 823 @:</div> 824 } 825 } 826 } 827 828 @helper RenderTheImage(Image settings) 829 { 830 if (settings != null) 831 { 832 string placeholderImage = "/Files/Images/placeholder.gif"; 833 string imageEngine = "/Admin/Public/GetImage.ashx?"; 834 string alternativeImage = "/Images/Kraemer/RapidoProducts/missing-image.jpg"; 835 836 string imageStyle = ""; 837 838 switch (settings.Style) 839 { 840 case ImageStyle.Ball: 841 imageStyle = "grid__cell-img--ball"; 842 break; 843 844 case ImageStyle.Triangle: 845 imageStyle = "grid__cell-img--triangle"; 846 break; 847 } 848 849 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 850 { 851 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 852 853 if (settings.ImageDefault != null) 854 { 855 settings.ImageDefault.Height = settings.ImageDefault.Width; 856 } 857 if (settings.ImageMedium != null) 858 { 859 settings.ImageMedium.Height = settings.ImageMedium.Width; 860 } 861 if (settings.ImageSmall != null) 862 { 863 settings.ImageSmall.Height = settings.ImageSmall.Width; 864 } 865 } 866 867 string defaultImage = imageEngine; 868 string imageSmall = ""; 869 string imageMedium = ""; 870 871 if (settings.DisableImageEngine) 872 { 873 defaultImage = settings.Path; 874 } 875 else 876 { 877 if (settings.ImageDefault != null) 878 { 879 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 880 881 if (settings.Path.GetType() != typeof(string)) 882 { 883 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 884 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 885 } 886 else 887 { 888 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 889 } 890 defaultImage += "&altFmImage_path=" + alternativeImage; 891 } 892 893 if (settings.ImageSmall != null) 894 { 895 imageSmall = "data-src-small=\"" + imageEngine; 896 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 897 898 if (settings.Path.GetType() != typeof(string)) 899 { 900 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 901 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 902 } 903 else 904 { 905 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 906 } 907 908 imageSmall += "\""; 909 } 910 911 if (settings.ImageMedium != null) 912 { 913 imageMedium = "data-src-medium=\"" + imageEngine; 914 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 915 916 if (settings.Path.GetType() != typeof(string)) 917 { 918 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 919 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 920 } 921 else 922 { 923 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 924 } 925 926 imageMedium += "\""; 927 } 928 } 929 930 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 931 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 932 if (!string.IsNullOrEmpty(settings.Title)) 933 { 934 optionalAttributes.Add("alt", settings.Title); 935 optionalAttributes.Add("title", settings.Title); 936 } 937 938 if (settings.DisableLazyLoad) 939 { 940 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 941 } 942 else 943 { 944 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 945 } 946 } 947 } 948 @using System.Reflection 949 @using Dynamicweb.Rapido.Blocks.Components.General 950 @using Dynamicweb.Rapido.Blocks.Components 951 952 @* Component *@ 953 954 @helper RenderFileField(FileField settings) 955 { 956 var attributes = new Dictionary<string, string>(); 957 if (string.IsNullOrEmpty(settings.Id)) 958 { 959 settings.Id = Guid.NewGuid().ToString("N"); 960 } 961 962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 963 if (settings.Disabled) { attributes.Add("disabled", "true"); } 964 if (settings.Required) { attributes.Add("required", "true"); } 965 if (settings.Multiple) { attributes.Add("multiple", "true"); } 966 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 967 if (string.IsNullOrEmpty(settings.ChooseFileText)) 968 { 969 settings.ChooseFileText = Translate("Choose file"); 970 } 971 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 972 { 973 settings.NoFilesChosenText = Translate("No files chosen..."); 974 } 975 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 976 977 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 978 979 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 980 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 981 982 attributes.Add("type", "file"); 983 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 984 settings.CssClass = "u-full-width " + settings.CssClass; 985 986 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 987 988 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 989 @if (!string.IsNullOrEmpty(settings.Label)) 990 { 991 <label for="@settings.Id">@settings.Label</label> 992 } 993 @if (!string.IsNullOrEmpty(settings.HelpText)) 994 { 995 <small class="form__help-text">@settings.HelpText</small> 996 } 997 998 <div class="form__field-combi file-input u-no-margin dw-mod"> 999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 1002 @if (settings.UploadButton != null) 1003 { 1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 1005 @Render(settings.UploadButton) 1006 } 1007 </div> 1008 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1009 </div> 1010 } 1011 @using System.Reflection 1012 @using Dynamicweb.Rapido.Blocks.Components.General 1013 @using Dynamicweb.Rapido.Blocks.Components 1014 @using Dynamicweb.Core 1015 @using System.Linq 1016 1017 @* Component *@ 1018 1019 @helper RenderDateTimeField(DateTimeField settings) 1020 { 1021 if (string.IsNullOrEmpty(settings.Id)) 1022 { 1023 settings.Id = Guid.NewGuid().ToString("N"); 1024 } 1025 1026 var textField = new TextField { 1027 Name = settings.Name, 1028 Id = settings.Id, 1029 Label = settings.Label, 1030 HelpText = settings.HelpText, 1031 Value = settings.Value, 1032 Disabled = settings.Disabled, 1033 Required = settings.Required, 1034 ErrorMessage = settings.ErrorMessage, 1035 CssClass = settings.CssClass, 1036 WrapperCssClass = settings.WrapperCssClass, 1037 OnChange = settings.OnChange, 1038 OnClick = settings.OnClick, 1039 ExtraAttributes = settings.ExtraAttributes, 1040 // 1041 Placeholder = settings.Placeholder 1042 }; 1043 1044 @Render(textField) 1045 1046 List<string> jsAttributes = new List<string>(); 1047 1048 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1049 1050 if (!string.IsNullOrEmpty(settings.DateFormat)) 1051 { 1052 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1053 } 1054 if (!string.IsNullOrEmpty(settings.MinDate)) 1055 { 1056 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1057 } 1058 if (!string.IsNullOrEmpty(settings.MaxDate)) 1059 { 1060 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1061 } 1062 if (settings.IsInline) 1063 { 1064 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1065 } 1066 if (settings.EnableTime) 1067 { 1068 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1069 } 1070 if (settings.EnableWeekNumbers) 1071 { 1072 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1073 } 1074 1075 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1076 1077 <script> 1078 document.addEventListener("DOMContentLoaded", function () { 1079 flatpickr("#@textField.Id", { 1080 @string.Join(",", jsAttributes) 1081 }); 1082 }); 1083 </script> 1084 } 1085 @using System.Reflection 1086 @using Dynamicweb.Rapido.Blocks.Components.General 1087 @using Dynamicweb.Rapido.Blocks.Components 1088 1089 @* Component *@ 1090 1091 @helper RenderTextField(TextField settings) 1092 { 1093 var attributes = new Dictionary<string, string>(); 1094 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1095 { 1096 settings.Id = Guid.NewGuid().ToString("N"); 1097 } 1098 1099 /*base settings*/ 1100 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1101 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1102 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1103 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1104 if (settings.Required) { attributes.Add("required", "true"); } 1105 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1106 /*end*/ 1107 1108 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1109 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1110 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1111 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1112 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1113 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1114 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1115 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1116 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1117 settings.CssClass = "u-full-width " + settings.CssClass; 1118 1119 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1120 1121 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1122 1123 string noMargin = "u-no-margin"; 1124 if (!settings.ReadOnly) { 1125 noMargin = ""; 1126 } 1127 1128 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1129 @if (!string.IsNullOrEmpty(settings.Label)) 1130 { 1131 <label for="@settings.Id">@settings.Label</label> 1132 } 1133 @if (!string.IsNullOrEmpty(settings.HelpText)) 1134 { 1135 <small class="form__help-text">@settings.HelpText</small> 1136 } 1137 1138 @if (settings.ActionButton != null) 1139 { 1140 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1141 <div class="form__field-combi u-no-margin dw-mod"> 1142 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1143 @Render(settings.ActionButton) 1144 </div> 1145 } 1146 else 1147 { 1148 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1149 } 1150 1151 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1152 </div> 1153 } 1154 @using System.Reflection 1155 @using Dynamicweb.Rapido.Blocks.Components.General 1156 @using Dynamicweb.Rapido.Blocks.Components 1157 1158 @* Component *@ 1159 1160 @helper RenderNumberField(NumberField settings) 1161 { 1162 var attributes = new Dictionary<string, string>(); 1163 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1164 { 1165 settings.Id = Guid.NewGuid().ToString("N"); 1166 } 1167 1168 /*base settings*/ 1169 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1170 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1171 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1172 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1173 if (settings.Required) { attributes.Add("required", "true"); } 1174 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1175 /*end*/ 1176 1177 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1178 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1179 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1180 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1181 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1182 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1183 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1184 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1185 attributes.Add("type", "number"); 1186 1187 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1188 1189 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1190 @if (!string.IsNullOrEmpty(settings.Label)) 1191 { 1192 <label for="@settings.Id">@settings.Label</label> 1193 } 1194 @if (!string.IsNullOrEmpty(settings.HelpText)) 1195 { 1196 <small class="form__help-text">@settings.HelpText</small> 1197 } 1198 1199 @if (settings.ActionButton != null) 1200 { 1201 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1202 <div class="form__field-combi u-no-margin dw-mod"> 1203 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1204 @Render(settings.ActionButton) 1205 </div> 1206 } 1207 else 1208 { 1209 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1210 } 1211 1212 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1213 </div> 1214 } 1215 @using System.Reflection 1216 @using Dynamicweb.Rapido.Blocks.Components.General 1217 @using Dynamicweb.Rapido.Blocks.Components 1218 1219 1220 @* Component *@ 1221 1222 @helper RenderTextareaField(TextareaField settings) 1223 { 1224 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1225 string id = settings.Id; 1226 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1227 { 1228 id = Guid.NewGuid().ToString("N"); 1229 } 1230 1231 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1232 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1233 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1234 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1235 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1236 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1237 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1238 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1239 if (settings.Required) { attributes.Add("required", "true"); } 1240 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1241 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1242 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1243 attributes.Add("name", settings.Name); 1244 1245 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1246 1247 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1248 @if (!string.IsNullOrEmpty(settings.Label)) 1249 { 1250 <label for="@id">@settings.Label</label> 1251 } 1252 @if (!string.IsNullOrEmpty(settings.HelpText)) 1253 { 1254 <small class="form__help-text">@settings.HelpText</small> 1255 } 1256 1257 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1258 1259 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1260 </div> 1261 } 1262 @using System.Reflection 1263 @using Dynamicweb.Rapido.Blocks.Components.General 1264 @using Dynamicweb.Rapido.Blocks.Components 1265 1266 1267 @* Component *@ 1268 1269 @helper RenderHiddenField(HiddenField settings) { 1270 var attributes = new Dictionary<string, string>(); 1271 attributes.Add("type", "hidden"); 1272 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1273 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1274 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1275 1276 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1277 } 1278 @using System.Reflection 1279 @using Dynamicweb.Rapido.Blocks.Components.General 1280 @using Dynamicweb.Rapido.Blocks.Components 1281 1282 @* Component *@ 1283 1284 @helper RenderCheckboxField(CheckboxField settings) 1285 { 1286 var attributes = new Dictionary<string, string>(); 1287 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1288 { 1289 settings.Id = Guid.NewGuid().ToString("N"); 1290 } 1291 1292 /*base settings*/ 1293 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1294 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1295 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1296 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1297 if (settings.Required) { attributes.Add("required", "true"); } 1298 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1299 /*end*/ 1300 1301 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1302 1303 attributes.Add("type", "checkbox"); 1304 if (settings.Checked) { attributes.Add("checked", "true"); } 1305 settings.CssClass = "form__control " + settings.CssClass; 1306 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1307 1308 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1309 1310 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1311 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1312 @if (!string.IsNullOrEmpty(settings.Label)) 1313 { 1314 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1315 } 1316 @if (!string.IsNullOrEmpty(settings.HelpText)) 1317 { 1318 <small class="form__help-text">@settings.HelpText</small> 1319 } 1320 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1321 </div> 1322 } 1323 @using System.Reflection 1324 @using Dynamicweb.Rapido.Blocks.Components.General 1325 @using Dynamicweb.Rapido.Blocks.Components 1326 1327 1328 @* Component *@ 1329 1330 @helper RenderCheckboxListField(CheckboxListField settings) 1331 { 1332 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1333 @if (!string.IsNullOrEmpty(settings.Label)) 1334 { 1335 <label>@settings.Label</label> 1336 } 1337 @if (!string.IsNullOrEmpty(settings.HelpText)) 1338 { 1339 <small class="form__help-text">@settings.HelpText</small> 1340 } 1341 1342 @foreach (var item in settings.Options) 1343 { 1344 if (settings.Required) 1345 { 1346 item.Required = true; 1347 } 1348 if (settings.Disabled) 1349 { 1350 item.Disabled = true; 1351 } 1352 if (!string.IsNullOrEmpty(settings.Name)) 1353 { 1354 item.Name = settings.Name; 1355 } 1356 if (!string.IsNullOrEmpty(settings.CssClass)) 1357 { 1358 item.CssClass += settings.CssClass; 1359 } 1360 1361 /* value is not supported */ 1362 1363 if (!string.IsNullOrEmpty(settings.OnClick)) 1364 { 1365 item.OnClick += settings.OnClick; 1366 } 1367 if (!string.IsNullOrEmpty(settings.OnChange)) 1368 { 1369 item.OnChange += settings.OnChange; 1370 } 1371 @Render(item) 1372 } 1373 1374 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1375 </div> 1376 } 1377 @using Dynamicweb.Rapido.Blocks.Components.General 1378 1379 @* Component *@ 1380 1381 @helper RenderSearch(Search settings) 1382 { 1383 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1384 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1385 1386 if (string.IsNullOrEmpty(settings.Id)) 1387 { 1388 settings.Id = Guid.NewGuid().ToString("N"); 1389 } 1390 1391 var resultAttributes = new Dictionary<string, string>(); 1392 1393 if (settings.PageSize != 0) 1394 { 1395 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1396 } 1397 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1398 { 1399 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1400 if (!string.IsNullOrEmpty(groupValue)) 1401 { 1402 resultAttributes.Add("data-selected-group", groupValue); 1403 } 1404 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1405 { 1406 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1407 } 1408 } 1409 resultAttributes.Add("data-force-init", "true"); 1410 if (settings.GoToFirstSearchResultOnEnter) 1411 { 1412 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1413 } 1414 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1415 { 1416 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1417 } 1418 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1419 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1420 1421 if (settings.SecondSearchData != null) 1422 { 1423 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1424 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1425 } 1426 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1427 { 1428 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1429 } 1430 1431 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1432 1433 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1434 1435 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1436 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1437 { 1438 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1439 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1440 } 1441 1442 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1443 1444 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1445 @if (settings.SecondSearchData != null) 1446 { 1447 <div class="search__column search__column--products dw-mod"> 1448 <div class="search__column-header dw-mod">@Translate("Products")</div> 1449 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1450 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1451 { 1452 @Render(new Link { 1453 Title = Translate("View all"), 1454 CssClass = "js-view-all-button u-margin", 1455 Href = settings.SearchData.ResultsPageUrl 1456 }); 1457 } 1458 </div> 1459 <div class="search__column search__column--pages dw-mod"> 1460 <div class="search__column-header">@Translate("Pages")</div> 1461 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1462 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1463 { 1464 @Render(new Link 1465 { 1466 Title = Translate("View all"), 1467 CssClass = "js-view-all-button u-margin", 1468 Href = settings.SecondSearchData.ResultsPageUrl 1469 }); 1470 } 1471 </div> 1472 } 1473 else 1474 { 1475 <div class="search__column search__column--only dw-mod"> 1476 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1477 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1478 { 1479 @Render(new Link { 1480 Title = Translate("View all"), 1481 CssClass = "js-view-all-button u-margin", 1482 Href = settings.SearchData.ResultsPageUrl 1483 }); 1484 } 1485 </div> 1486 } 1487 </div> 1488 1489 @if (settings.SearchButton != null) 1490 { 1491 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1492 if (settings.RenderDefaultSearchIcon) 1493 { 1494 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1495 } 1496 @Render(settings.SearchButton); 1497 } 1498 </div> 1499 } 1500 @using System.Reflection 1501 @using Dynamicweb.Rapido.Blocks.Components.General 1502 @using Dynamicweb.Rapido.Blocks.Components 1503 1504 1505 @* Component *@ 1506 1507 @helper RenderSelectField(SelectField settings) 1508 { 1509 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1510 { 1511 settings.Id = Guid.NewGuid().ToString("N"); 1512 } 1513 1514 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1515 @if (!string.IsNullOrEmpty(settings.Label)) 1516 { 1517 <label for="@settings.Id">@settings.Label</label> 1518 } 1519 @if (!string.IsNullOrEmpty(settings.HelpText)) 1520 { 1521 <small class="form__help-text">@settings.HelpText</small> 1522 } 1523 1524 @if (settings.ActionButton != null) 1525 { 1526 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1527 <div class="form__field-combi u-no-margin dw-mod"> 1528 @RenderSelectBase(settings) 1529 @Render(settings.ActionButton) 1530 </div> 1531 } 1532 else 1533 { 1534 @RenderSelectBase(settings) 1535 } 1536 1537 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1538 </div> 1539 } 1540 1541 @helper RenderSelectBase(SelectField settings) 1542 { 1543 var attributes = new Dictionary<string, string>(); 1544 1545 /*base settings*/ 1546 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1547 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1548 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1549 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1550 if (settings.Required) { attributes.Add("required", "true"); } 1551 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1552 /*end*/ 1553 1554 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1555 1556 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1557 @if (settings.Default != null) 1558 { 1559 @Render(settings.Default) 1560 } 1561 1562 @foreach (var item in settings.Options) 1563 { 1564 if (!string.IsNullOrEmpty(settings.Value)) { 1565 item.Checked = item.Value == settings.Value; 1566 } 1567 @Render(item) 1568 } 1569 </select> 1570 } 1571 @using System.Reflection 1572 @using Dynamicweb.Rapido.Blocks.Components.General 1573 @using Dynamicweb.Rapido.Blocks.Components 1574 1575 @* Component *@ 1576 1577 @helper RenderRadioButtonField(RadioButtonField settings) 1578 { 1579 var attributes = new Dictionary<string, string>(); 1580 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1581 { 1582 settings.Id = Guid.NewGuid().ToString("N"); 1583 } 1584 1585 /*base settings*/ 1586 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1587 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1588 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1589 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1590 if (settings.Required) { attributes.Add("required", "true"); } 1591 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1592 /*end*/ 1593 1594 attributes.Add("type", "radio"); 1595 if (settings.Checked) { attributes.Add("checked", "true"); } 1596 settings.CssClass = "form__control " + settings.CssClass; 1597 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1598 1599 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1600 1601 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1602 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1603 @if (!string.IsNullOrEmpty(settings.Label)) 1604 { 1605 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1606 } 1607 @if (!string.IsNullOrEmpty(settings.HelpText)) 1608 { 1609 <small class="form__help-text">@settings.HelpText</small> 1610 } 1611 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1612 </div> 1613 } 1614 @using System.Reflection 1615 @using Dynamicweb.Rapido.Blocks.Components.General 1616 @using Dynamicweb.Rapido.Blocks.Components 1617 1618 1619 @* Component *@ 1620 1621 @helper RenderRadioButtonListField(RadioButtonListField settings) 1622 { 1623 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1624 1625 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1626 @if (!string.IsNullOrEmpty(settings.Label)) 1627 { 1628 <label>@settings.Label</label> 1629 } 1630 @if (!string.IsNullOrEmpty(settings.HelpText)) 1631 { 1632 <small class="form__help-text">@settings.HelpText</small> 1633 } 1634 1635 @foreach (var item in settings.Options) 1636 { 1637 if (settings.Required) 1638 { 1639 item.Required = true; 1640 } 1641 if (settings.Disabled) 1642 { 1643 item.Disabled = true; 1644 } 1645 if (!string.IsNullOrEmpty(settings.Name)) 1646 { 1647 item.Name = settings.Name; 1648 } 1649 if (!string.IsNullOrEmpty(settings.Value) && settings.Value == item.Value) 1650 { 1651 item.Checked = true; 1652 } 1653 if (!string.IsNullOrEmpty(settings.OnClick)) 1654 { 1655 item.OnClick += settings.OnClick; 1656 } 1657 if (!string.IsNullOrEmpty(settings.OnChange)) 1658 { 1659 item.OnChange += settings.OnChange; 1660 } 1661 if (!string.IsNullOrEmpty(settings.CssClass)) 1662 { 1663 item.CssClass += settings.CssClass; 1664 } 1665 @Render(item) 1666 } 1667 1668 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1669 </div> 1670 } 1671 @using System.Reflection 1672 @using Dynamicweb.Rapido.Blocks.Components.General 1673 @using Dynamicweb.Rapido.Blocks.Components 1674 1675 1676 @* Component *@ 1677 1678 @helper RenderNotificationMessage(NotificationMessage settings) 1679 { 1680 if (!string.IsNullOrEmpty(settings.Message)) 1681 { 1682 var attributes = new Dictionary<string, string>(); 1683 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1684 1685 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1686 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>@settings.Message</div> 1687 } 1688 } 1689 @using Dynamicweb.Rapido.Blocks.Components.General 1690 1691 1692 @* Component *@ 1693 1694 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1695 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1696 1697 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender> 1698 @if (settings.SubBlocks != null) { 1699 @RenderBlockList(settings.SubBlocks) 1700 } 1701 </div> 1702 } 1703 @using System.Reflection 1704 @using Dynamicweb.Rapido.Blocks.Components.General 1705 @using Dynamicweb.Rapido.Blocks.Components 1706 @using System.Text.RegularExpressions 1707 1708 1709 @* Component *@ 1710 1711 @helper RenderSticker(Sticker settings) { 1712 if (!String.IsNullOrEmpty(settings.Title)) { 1713 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1714 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1715 1716 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1717 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1718 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1719 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1720 optionalAttributes.Add("style", styleTag); 1721 } 1722 1723 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1724 } 1725 } 1726 1727 @using System.Reflection 1728 @using Dynamicweb.Rapido.Blocks.Components.General 1729 @using Dynamicweb.Rapido.Blocks.Components 1730 1731 1732 @* Component *@ 1733 1734 @helper RenderStickersCollection(StickersCollection settings) 1735 { 1736 if (settings.Stickers.Count > 0) 1737 { 1738 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1739 1740 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1741 @foreach (Sticker sticker in settings.Stickers) 1742 { 1743 @Render(sticker) 1744 } 1745 </div> 1746 } 1747 } 1748 1749 @using Dynamicweb.Rapido.Blocks.Components.General 1750 1751 1752 @* Component *@ 1753 1754 @helper RenderForm(Form settings) { 1755 if (settings != null) 1756 { 1757 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1758 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1759 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1760 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1761 var enctypes = new Dictionary<string, string> 1762 { 1763 { "multipart", "multipart/form-data" }, 1764 { "text", "text/plain" }, 1765 { "application", "application/x-www-form-urlencoded" } 1766 }; 1767 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1768 optionalAttributes.Add("method", settings.Method.ToString()); 1769 1770 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1771 { 1772 @settings.FormStartMarkup 1773 } 1774 else 1775 { 1776 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1777 } 1778 1779 foreach (var field in settings.GetFields()) 1780 { 1781 @Render(field) 1782 } 1783 1784 @:</form> 1785 } 1786 } 1787 @using System.Reflection 1788 @using Dynamicweb.Rapido.Blocks.Components.General 1789 @using Dynamicweb.Rapido.Blocks.Components 1790 1791 1792 @* Component *@ 1793 1794 @helper RenderText(Text settings) 1795 { 1796 @settings.Content 1797 } 1798 @using System.Reflection 1799 @using Dynamicweb.Rapido.Blocks.Components.General 1800 @using Dynamicweb.Rapido.Blocks.Components 1801 1802 1803 @* Component *@ 1804 1805 @helper RenderContentModule(ContentModule settings) { 1806 if (!string.IsNullOrEmpty(settings.Content)) 1807 { 1808 @settings.Content 1809 } 1810 } 1811 @using System.Reflection 1812 @using Dynamicweb.Rapido.Blocks.Components.General 1813 @using Dynamicweb.Rapido.Blocks.Components 1814 1815 1816 @* Component *@ 1817 1818 @helper RenderModal(Modal settings) { 1819 if (settings != null) 1820 { 1821 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1822 1823 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1824 1825 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1826 1827 <div class="modal-container u-no-print"> 1828 @if (!settings.DisableDarkOverlay) 1829 { 1830 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1831 } 1832 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1833 @if (settings.Heading != null) 1834 { 1835 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1836 { 1837 <div class="modal__header modal-header bs-border-bottom"> 1838 @Render(settings.Heading) 1839 <label for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1840 </div> 1841 }else 1842 { 1843 <div class="modal__header modal-header bs-py-2"> 1844 <div class="bs-visibility-hidden"></div> 1845 <label class="bs-m-0" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1846 </div> 1847 } 1848 } 1849 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1850 @if (!string.IsNullOrEmpty(settings.BodyText)) 1851 { 1852 @settings.BodyText 1853 } 1854 @if (settings.BodyTemplate != null) 1855 { 1856 @settings.BodyTemplate 1857 } 1858 @{ 1859 var actions = settings.GetActions(); 1860 } 1861 </div> 1862 @if (actions.Length > 0) 1863 { 1864 <div class="modal__footer"> 1865 @foreach (var action in actions) 1866 { 1867 action.CssClass += " u-no-margin"; 1868 @Render(action) 1869 } 1870 </div> 1871 } 1872 @* <label class="new-modal__close-btn" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> *@ 1873 </div> 1874 </div> 1875 } 1876 } 1877 @using Dynamicweb.Rapido.Blocks.Components.General 1878 1879 @* Component *@ 1880 1881 @helper RenderMediaListItem(MediaListItem settings) 1882 { 1883 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1884 @if (!string.IsNullOrEmpty(settings.Label)) 1885 { 1886 if (!string.IsNullOrEmpty(settings.Link)) 1887 { 1888 @Render(new Link 1889 { 1890 Href = settings.Link, 1891 CssClass = "media-list-item__sticker dw-mod", 1892 ButtonLayout = ButtonLayout.None, 1893 Title = settings.Label, 1894 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1895 }) 1896 } 1897 else if (!string.IsNullOrEmpty(settings.OnClick)) 1898 { 1899 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1900 <span class="u-uppercase">@settings.Label</span> 1901 </span> 1902 } 1903 else 1904 { 1905 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1906 <span class="u-uppercase">@settings.Label</span> 1907 </span> 1908 } 1909 } 1910 <div class="media-list-item__wrap"> 1911 <div class="media-list-item__info dw-mod"> 1912 <div class="media-list-item__header dw-mod"> 1913 @if (!string.IsNullOrEmpty(settings.Title)) 1914 { 1915 if (!string.IsNullOrEmpty(settings.Link)) 1916 { 1917 @Render(new Link 1918 { 1919 Href = settings.Link, 1920 CssClass = "media-list-item__name dw-mod", 1921 ButtonLayout = ButtonLayout.None, 1922 Title = settings.Title, 1923 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1924 }) 1925 } 1926 else if (!string.IsNullOrEmpty(settings.OnClick)) 1927 { 1928 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1929 } 1930 else 1931 { 1932 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1933 } 1934 } 1935 1936 @if (!string.IsNullOrEmpty(settings.Status)) 1937 { 1938 <div class="media-list-item__state dw-mod">@settings.Status</div> 1939 } 1940 </div> 1941 @{ 1942 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1943 } 1944 1945 @Render(settings.InfoTable) 1946 </div> 1947 <div class="media-list-item__actions dw-mod"> 1948 <div class="media-list-item__actions-list dw-mod"> 1949 @{ 1950 var actions = settings.GetActions(); 1951 1952 foreach (ButtonBase action in actions) 1953 { 1954 action.ButtonLayout = ButtonLayout.None; 1955 action.CssClass += " media-list-item__action link"; 1956 1957 @Render(action) 1958 } 1959 } 1960 </div> 1961 1962 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 1963 { 1964 settings.SelectButton.CssClass += " u-no-margin"; 1965 1966 <div class="media-list-item__action-button"> 1967 @Render(settings.SelectButton) 1968 </div> 1969 } 1970 </div> 1971 </div> 1972 </div> 1973 } 1974 @using Dynamicweb.Rapido.Blocks.Components.General 1975 @using Dynamicweb.Rapido.Blocks.Components 1976 1977 @helper RenderTable(Table settings) 1978 { 1979 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1980 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1981 1982 var enumToClasses = new Dictionary<TableDesign, string> 1983 { 1984 { TableDesign.Clean, "table--clean" }, 1985 { TableDesign.Bordered, "table--bordered" }, 1986 { TableDesign.Striped, "table--striped" }, 1987 { TableDesign.Hover, "table--hover" }, 1988 { TableDesign.Compact, "table--compact" }, 1989 { TableDesign.Condensed, "table--condensed" }, 1990 { TableDesign.NoTopBorder, "table--no-top-border" } 1991 }; 1992 string tableDesignClass = ""; 1993 if (settings.Design != TableDesign.None) 1994 { 1995 tableDesignClass = enumToClasses[settings.Design]; 1996 } 1997 1998 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 1999 2000 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2001 2002 <table @ComponentMethods.AddAttributes(resultAttributes)> 2003 @if (settings.Header != null) 2004 { 2005 <thead> 2006 @Render(settings.Header) 2007 </thead> 2008 } 2009 <tbody> 2010 @foreach (var row in settings.Rows) 2011 { 2012 @Render(row) 2013 } 2014 </tbody> 2015 @if (settings.Footer != null) 2016 { 2017 <tfoot> 2018 @Render(settings.Footer) 2019 </tfoot> 2020 } 2021 </table> 2022 } 2023 @using Dynamicweb.Rapido.Blocks.Components.General 2024 @using Dynamicweb.Rapido.Blocks.Components 2025 2026 @helper RenderTableRow(TableRow settings) 2027 { 2028 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2029 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2030 2031 var enumToClasses = new Dictionary<TableRowDesign, string> 2032 { 2033 { TableRowDesign.NoBorder, "table__row--no-border" }, 2034 { TableRowDesign.Border, "table__row--border" }, 2035 { TableRowDesign.TopBorder, "table__row--top-line" }, 2036 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2037 { TableRowDesign.Solid, "table__row--solid" } 2038 }; 2039 2040 string tableRowDesignClass = ""; 2041 if (settings.Design != TableRowDesign.None) 2042 { 2043 tableRowDesignClass = enumToClasses[settings.Design]; 2044 } 2045 2046 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2047 2048 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2049 2050 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2051 @foreach (var cell in settings.Cells) 2052 { 2053 if (settings.IsHeaderRow) 2054 { 2055 cell.IsHeader = true; 2056 } 2057 @Render(cell) 2058 } 2059 </tr> 2060 } 2061 @using Dynamicweb.Rapido.Blocks.Components.General 2062 @using Dynamicweb.Rapido.Blocks.Components 2063 @using Dynamicweb.Core 2064 2065 @helper RenderTableCell(TableCell settings) 2066 { 2067 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2068 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2069 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2070 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2071 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2072 2073 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2074 2075 string tagName = settings.IsHeader ? "th" : "td"; 2076 2077 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2078 @settings.Content 2079 @("</" + tagName + ">"); 2080 } 2081 @using System.Linq 2082 @using Dynamicweb.Rapido.Blocks.Components.General 2083 2084 @* Component *@ 2085 2086 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2087 { 2088 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2089 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2090 2091 if (settings.NumberOfPages > 1) 2092 { 2093 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2094 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2095 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2096 2097 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2098 @if (settings.ShowPagingInfo) 2099 { 2100 <div class="pager__info dw-mod"> 2101 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2102 </div> 2103 } 2104 <ul class="pager__list dw-mod"> 2105 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2106 { 2107 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2108 } 2109 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2110 { 2111 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2112 } 2113 @if (settings.GetPages().Any()) 2114 { 2115 foreach (var page in settings.GetPages()) 2116 { 2117 @Render(page) 2118 } 2119 } 2120 else 2121 { 2122 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2123 { 2124 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2125 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2126 } 2127 } 2128 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2129 { 2130 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2131 } 2132 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2133 { 2134 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2135 } 2136 </ul> 2137 </div> 2138 } 2139 } 2140 2141 @helper RenderPaginationItem(PaginationItem settings) 2142 { 2143 if (settings.Icon == null) 2144 { 2145 settings.Icon = new Icon(); 2146 } 2147 2148 settings.Icon.Label = settings.Label; 2149 <li class="pager__btn dw-mod"> 2150 @if (settings.IsActive) 2151 { 2152 <span class="pager__num pager__num--current dw-mod"> 2153 @Render(settings.Icon) 2154 </span> 2155 } 2156 else 2157 { 2158 <a href="@settings.Link" class="pager__num dw-mod"> 2159 @Render(settings.Icon) 2160 </a> 2161 } 2162 </li> 2163 } 2164 2165 2166 @using Dynamicweb.Rapido.Blocks.Components.General 2167 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2168 2169 2170 @using Dynamicweb.Frontend 2171 @using System.Reflection 2172 @using Dynamicweb.Content.Items 2173 @using System.Web.UI.HtmlControls 2174 @using Dynamicweb.Rapido.Blocks.Components 2175 @using Dynamicweb.Rapido.Blocks 2176 @using Dynamicweb.Rapido.Blocks.Components.Articles 2177 2178 @* Components for the articles *@ 2179 @using System.Reflection 2180 @using Dynamicweb.Rapido.Blocks.Components.Articles 2181 2182 2183 @* Component for the articles *@ 2184 2185 @helper RenderArticleBanner(dynamic settings) { 2186 string filterClasses = "image-filter image-filter--darken"; 2187 settings.Layout = ArticleHeaderLayout.Banner; 2188 2189 if (settings.Image != null) 2190 { 2191 if (settings.Image.Path != null) 2192 { 2193 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2194 <div class="background-image @filterClasses dw-mod"> 2195 <div class="background-image__wrapper @filterClasses dw-mod"> 2196 @{ 2197 settings.Image.CssClass += "background-image__cover dw-mod"; 2198 } 2199 @Render(settings.Image) 2200 </div> 2201 </div> 2202 <div class="center-container dw-mod"> 2203 <div class="grid"> 2204 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg"> 2205 <div class="u-left-middle"> 2206 <div> 2207 @if (!String.IsNullOrEmpty(settings.Heading)) 2208 { 2209 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2210 } 2211 @if (!String.IsNullOrEmpty(settings.Subheading)) 2212 { 2213 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2214 } 2215 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2216 { 2217 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2218 } 2219 @if (!String.IsNullOrEmpty(settings.Link)) { 2220 <div class="grid__cell"> 2221 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2222 </div> 2223 } 2224 </div> 2225 </div> 2226 </div> 2227 @if (settings.ExternalParagraphId != 0) 2228 { 2229 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod"> 2230 <div class="u-color-light-gray--bg u-color-dark dw-mod"> 2231 @RenderParagraphContent(settings.ExternalParagraphId) 2232 </div> 2233 </div> 2234 } 2235 2236 </div> 2237 </div> 2238 </section> 2239 if (!String.IsNullOrEmpty(settings.Image.Caption)) { 2240 <div class="image-caption dw-mod">@settings.Image.Caption</div> 2241 } 2242 } 2243 else 2244 { 2245 settings.Layout = ArticleHeaderLayout.Clean; 2246 @RenderArticleCleanHeader(settings); 2247 } 2248 } 2249 else 2250 { 2251 settings.Layout = ArticleHeaderLayout.Clean; 2252 @RenderArticleCleanHeader(settings); 2253 } 2254 } 2255 @using System.Reflection 2256 @using Dynamicweb.Rapido.Blocks.Components 2257 @using Dynamicweb.Rapido.Blocks.Components.General 2258 @using Dynamicweb.Rapido.Blocks.Components.Articles 2259 @using Dynamicweb.Rapido.Blocks 2260 2261 2262 @* Component for the articles *@ 2263 2264 @helper RenderArticleHeader(ArticleHeader settings) { 2265 dynamic[] methodParameters = new dynamic[1]; 2266 methodParameters[0] = settings; 2267 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom"); 2268 2269 if (customMethod != null) 2270 { 2271 @customMethod.Invoke(this, methodParameters).ToString(); 2272 } else { 2273 switch (settings.Layout) 2274 { 2275 case ArticleHeaderLayout.Clean: 2276 @RenderArticleCleanHeader(settings); 2277 break; 2278 case ArticleHeaderLayout.Split: 2279 @RenderArticleSplitHeader(settings); 2280 break; 2281 case ArticleHeaderLayout.Banner: 2282 @RenderArticleBannerHeader(settings); 2283 break; 2284 case ArticleHeaderLayout.Overlay: 2285 @RenderArticleOverlayHeader(settings); 2286 break; 2287 default: 2288 @RenderArticleCleanHeader(settings); 2289 break; 2290 } 2291 } 2292 } 2293 2294 @helper RenderArticleCleanHeader(ArticleHeader settings) { 2295 dynamic[] methodParameters = new dynamic[1]; 2296 methodParameters[0] = settings; 2297 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom"); 2298 2299 if (customMethod != null) 2300 { 2301 @customMethod.Invoke(this, methodParameters).ToString(); 2302 } 2303 else 2304 { 2305 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2306 2307 <div class="grid grid--align-content-start grid--justify-start"> 2308 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod"> 2309 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0) 2310 { 2311 <div class="u-border-bottom u-padding-bottom"> 2312 @if (!String.IsNullOrEmpty(settings.Category)) 2313 { 2314 <div class="u-pull--left"> 2315 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2316 </div> 2317 } 2318 <div class="u-pull--right"> 2319 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2320 { 2321 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small> 2322 } 2323 @if (settings.RatingOutOf != 0) 2324 { 2325 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2326 } 2327 </div> 2328 </div> 2329 } 2330 2331 <div class="grid__cell"> 2332 @if (!String.IsNullOrEmpty(settings.Heading)) 2333 { 2334 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2335 } 2336 @if (settings.Image != null) 2337 { 2338 if (settings.Image.Path != null) 2339 { 2340 <div class="u-padding-bottom--lg"> 2341 @Render(settings.Image) 2342 </div> 2343 } 2344 } 2345 @if (!String.IsNullOrEmpty(settings.Subheading)) 2346 { 2347 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2348 } 2349 @if (!String.IsNullOrEmpty(settings.Link)) 2350 { 2351 <div class="grid__cell"> 2352 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2353 </div> 2354 } 2355 </div> 2356 </div> 2357 @if (settings.ExternalParagraphId != 0) 2358 { 2359 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod"> 2360 @RenderParagraphContent(settings.ExternalParagraphId) 2361 </div> 2362 } 2363 </div> 2364 } 2365 } 2366 2367 @helper RenderArticleSplitHeader(ArticleHeader settings) { 2368 dynamic[] methodParameters = new dynamic[1]; 2369 methodParameters[0] = settings; 2370 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom"); 2371 2372 if (customMethod != null) 2373 { 2374 @customMethod.Invoke(this, methodParameters).ToString(); 2375 } 2376 else 2377 { 2378 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6"; 2379 2380 if (settings.Image != null) 2381 { 2382 if (settings.Image.Path != null) 2383 { 2384 <section class="multiple-paragraphs-container paragraph-container--full-width"> 2385 <div class="grid"> 2386 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2387 <div class="u-left-middle u-padding--lg"> 2388 <div> 2389 @if (!String.IsNullOrEmpty(settings.Category)) 2390 { 2391 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2392 } 2393 @if (!String.IsNullOrEmpty(settings.Heading)) 2394 { 2395 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2396 } 2397 @if (!String.IsNullOrEmpty(settings.Subheading)) 2398 { 2399 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2400 } 2401 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2402 { 2403 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small> 2404 } 2405 @if (settings.RatingOutOf != 0) 2406 { 2407 <div class="u-pull--right"> 2408 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2409 </div> 2410 } 2411 @if (!String.IsNullOrEmpty(settings.Link)) { 2412 <div class="u-full-width u-pull--left u-margin-top"> 2413 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2414 </div> 2415 } 2416 </div> 2417 </div> 2418 </div> 2419 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&amp;height=1100&amp;crop=0&amp;Compression=85&amp;DoNotUpscale=true&amp;image=@settings.Image.Path); background-position: center center; background-size: cover;"></div> 2420 @if (settings.ExternalParagraphId != 0) 2421 { 2422 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto u-color-light-gray--bg dw-mod"> 2423 @RenderParagraphContent(settings.ExternalParagraphId) 2424 </div> 2425 } 2426 </div> 2427 </section> 2428 } 2429 } 2430 else 2431 { 2432 @RenderArticleCleanHeader(settings); 2433 } 2434 } 2435 } 2436 2437 @helper RenderArticleOverlayHeader(ArticleHeader settings) { 2438 dynamic[] methodParameters = new dynamic[1]; 2439 methodParameters[0] = settings; 2440 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom"); 2441 2442 if (customMethod != null) 2443 { 2444 @customMethod.Invoke(this, methodParameters).ToString(); 2445 } 2446 else 2447 { 2448 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2449 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : ""; 2450 2451 if (settings.Image != null) 2452 { 2453 if (settings.Image.Path != null) 2454 { 2455 if (settings.ExternalParagraphId == 0) 2456 { 2457 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2458 <div class="background-image image-filter image-filter--darken dw-mod"> 2459 <div class="background-image__wrapper image-filter image-filter--darken dw-mod"> 2460 @{ 2461 settings.Image.CssClass += "background-image__cover dw-mod"; 2462 } 2463 @Render(settings.Image) 2464 </div> 2465 </div> 2466 <div class="center-container dw-mod"> 2467 <div class="grid @contentAlignment"> 2468 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl u-no-padding dw-mod"> 2469 @if (!String.IsNullOrEmpty(settings.Heading)) 2470 { 2471 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2472 } 2473 @if (!String.IsNullOrEmpty(settings.Subheading)) 2474 { 2475 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2476 } 2477 <div class="u-margin-top"> 2478 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2479 { 2480 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2481 } 2482 @if (settings.RatingOutOf != 0) 2483 { 2484 <div class="u-pull--right"> 2485 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2486 </div> 2487 } 2488 </div> 2489 @if (!String.IsNullOrEmpty(settings.Link)) 2490 { 2491 <div class="grid__cell"> 2492 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2493 </div> 2494 } 2495 </div> 2496 </div> 2497 </div> 2498 </section> 2499 } 2500 else 2501 { 2502 @RenderArticleBanner(settings); 2503 } 2504 } 2505 } 2506 else 2507 { 2508 @RenderArticleCleanHeader(settings); 2509 } 2510 } 2511 } 2512 2513 @helper RenderArticleBannerHeader(dynamic settings) { 2514 dynamic[] methodParameters = new dynamic[1]; 2515 methodParameters[0] = settings; 2516 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom"); 2517 2518 if (customMethod != null) 2519 { 2520 @customMethod.Invoke(this, methodParameters).ToString(); 2521 } 2522 else 2523 { 2524 @RenderArticleBanner(settings); 2525 } 2526 } 2527 @using System.Reflection 2528 @using System.Text.RegularExpressions; 2529 @using Dynamicweb.Frontend 2530 @using Dynamicweb.Content.Items 2531 @using Dynamicweb.Rapido.Blocks.Components 2532 @using Dynamicweb.Rapido.Blocks.Components.Articles 2533 @using Dynamicweb.Rapido.Blocks 2534 2535 @* Component for the articles *@ 2536 2537 @helper RenderArticleBodyRow(ArticleBodyRow settings) 2538 { 2539 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : ""; 2540 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : ""; 2541 2542 <div class="grid grid--align-content-start @contentAlignment @position dw-mod"> 2543 @RenderBlockList(settings.SubBlocks) 2544 </div> 2545 } 2546 @using System.Reflection 2547 @using Dynamicweb.Rapido.Blocks.Components 2548 @using Dynamicweb.Rapido.Blocks.Components.General 2549 @using Dynamicweb.Rapido.Blocks.Components.Articles 2550 @using Dynamicweb.Rapido.Blocks 2551 2552 @* Component for the articles *@ 2553 2554 @helper RenderArticleImage(ArticleImage settings) 2555 { 2556 if (settings.Image != null) 2557 { 2558 if (settings.Image.Path != null) 2559 { 2560 <div class="u-margin-bottom--lg"> 2561 @Render(settings.Image) 2562 </div> 2563 } 2564 } 2565 } 2566 @using System.Reflection 2567 @using Dynamicweb.Rapido.Blocks.Components 2568 @using Dynamicweb.Rapido.Blocks.Components.Articles 2569 2570 2571 @* Component for the articles *@ 2572 2573 @helper RenderArticleSubHeader(ArticleSubHeader settings) 2574 { 2575 if (!String.IsNullOrEmpty(settings.Title)) 2576 { 2577 <h2 class="article__header">@settings.Title</h2> 2578 } 2579 } 2580 @using System.Reflection 2581 @using Dynamicweb.Rapido.Blocks.Components 2582 @using Dynamicweb.Rapido.Blocks.Components.Articles 2583 @using Dynamicweb.Rapido.Blocks 2584 2585 2586 @* Component for the articles *@ 2587 2588 @helper RenderArticleText(ArticleText settings) 2589 { 2590 if (!String.IsNullOrEmpty(settings.Text)) 2591 { 2592 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : ""; 2593 2594 <div class="article__paragraph @greatTextClass"> 2595 @settings.Text 2596 </div> 2597 } 2598 } 2599 @using System.Reflection 2600 @using Dynamicweb.Rapido.Blocks.Components 2601 @using Dynamicweb.Rapido.Blocks.Components.Articles 2602 @using Dynamicweb.Rapido.Blocks 2603 2604 2605 @* Component for the articles *@ 2606 2607 @helper RenderArticleQuote(ArticleQuote settings) 2608 { 2609 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty); 2610 2611 <div class="grid u-padding-bottom--lg"> 2612 @if (settings.Image != null) 2613 { 2614 if (settings.Image.Path != null) { 2615 <div class="grid__col-3"> 2616 <div class="grid__cell-img"> 2617 @{ 2618 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author; 2619 settings.Image.CssClass += " article__image article__image--ball"; 2620 settings.Image.ImageDefault.Width = 200; 2621 settings.Image.ImageDefault.Height = 200; 2622 } 2623 @Render(settings.Image) 2624 </div> 2625 </div> 2626 } 2627 } 2628 <div class="grid__col-auto"> 2629 @if (!String.IsNullOrEmpty(settings.Text)) 2630 { 2631 <div class="article__quote dw-mod"> 2632 <i class="fas fa-quote-right u-margin-bottom--lg"></i> 2633 @settings.Text 2634 <i class="fas fa-quote-right"></i> 2635 </div> 2636 } 2637 @if (!String.IsNullOrEmpty(settings.Author)) 2638 { 2639 <div class="article__quote-author dw-mod"> 2640 - @settings.Author 2641 </div> 2642 } 2643 </div> 2644 </div> 2645 } 2646 @using System.Reflection 2647 @using Dynamicweb.Rapido.Blocks.Components 2648 @using Dynamicweb.Rapido.Blocks.Components.Articles 2649 @using Dynamicweb.Rapido.Blocks 2650 2651 @* Component for the articles *@ 2652 2653 @helper RenderArticleInfoTable(ArticleInfoTable settings) 2654 { 2655 <table class="table table--clean"> 2656 @foreach (var row in settings.Rows) 2657 { 2658 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two"; 2659 2660 <tr> 2661 @if (!String.IsNullOrEmpty(row.Icon)) 2662 { 2663 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td> 2664 } 2665 <td class="u-no-margin-on-p-elements"> 2666 <div class="u-bold">@row.Title</div> 2667 @if (!String.IsNullOrEmpty(row.SubTitle)) 2668 { 2669 if (row.Link == null) 2670 { 2671 <div>@row.SubTitle</div> 2672 } 2673 else 2674 { 2675 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a> 2676 } 2677 } 2678 </td> 2679 </tr> 2680 } 2681 </table> 2682 } 2683 @using System.Reflection 2684 @using Dynamicweb.Rapido.Blocks.Components 2685 @using Dynamicweb.Rapido.Blocks.Components.General 2686 @using Dynamicweb.Rapido.Blocks.Components.Articles 2687 @using Dynamicweb.Rapido.Blocks 2688 2689 @* Component for the articles *@ 2690 2691 @helper RenderArticleGalleryModal(ArticleGalleryModal settings) 2692 { 2693 Modal galleryModal = new Modal 2694 { 2695 Id = "ParagraphGallery", 2696 Width = ModalWidth.Full, 2697 BodyTemplate = RenderArticleGalleryModalContent() 2698 }; 2699 2700 @Render(galleryModal) 2701 } 2702 2703 @helper RenderArticleGalleryModalContent() { 2704 <div class="modal__image-min-size-wrapper"> 2705 @Render(new Image { 2706 Id = "ParagraphGallery", 2707 Path = "#", 2708 CssClass = "modal--full__img", 2709 DisableLazyLoad = true, 2710 DisableImageEngine = true 2711 }) 2712 </div> 2713 2714 <div class="modal__images-counter" id="ParagraphGallery_counter"></div> 2715 2716 @Render(new Button { 2717 Id = "ParagraphGallery_prev", 2718 ButtonType = ButtonType.Button, 2719 ButtonLayout = ButtonLayout.None, 2720 CssClass = "modal__prev-btn", 2721 Icon = new Icon { Prefix = "far", Name = "fa-angle-left", LabelPosition = IconLabelPosition.After }, 2722 OnClick = "Gallery.prevImage('ParagraphGallery')" 2723 }) 2724 2725 @Render(new Button { 2726 Id = "ParagraphGallery_next", 2727 ButtonType = ButtonType.Button, 2728 ButtonLayout = ButtonLayout.None, 2729 CssClass = "modal__next-btn", 2730 Icon = new Icon { Prefix = "far", Name = "fa-angle-right", LabelPosition = IconLabelPosition.After }, 2731 OnClick = "Gallery.nextImage('ParagraphGallery')" 2732 }) 2733 } 2734 @using System.Reflection 2735 @using Dynamicweb.Rapido.Blocks.Components 2736 @using Dynamicweb.Rapido.Blocks.Components.Articles 2737 @using Dynamicweb.Rapido.Blocks 2738 2739 2740 @* Component for the articles *@ 2741 2742 @helper RenderArticleRelated(ArticleRelated settings) 2743 { 2744 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : ""; 2745 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : ""; 2746 2747 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width"> 2748 <div class="center-container dw-mod"> 2749 <div class="grid u-padding"> 2750 <div class="grid__col-md-12 grid__col-xs-12"> 2751 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2> 2752 </div> 2753 </div> 2754 2755 <div class="js-handlebars-root u-padding" id="@settings.Title.Replace(" ", String.Empty)" data-template="RelatedSimpleTemplate" data-json-feed="/Default.aspx?ID=@settings.FeedPageId&@settings.Query&ExcludeItemID=@settings.CurrentPageId&PageSize=@settings.PageSize"></div> 2756 2757 <script id="RelatedSimpleTemplate" type="text/x-template"> 2758 {{#.}} 2759 <div class="grid u-padding-bottom--lg"> 2760 {{#Cases}} 2761 <div class="grid__col-lg-3 grid__col-sm-6 image-hover--zoom dw-mod"> 2762 <a href="{{link}}" class="u-full-height u-color-light--bg"> 2763 {{#if image}} 2764 <div class="u-color-light--bg u-no-padding dw-mod"> 2765 <div class="flex-img image-hover__wrapper"> 2766 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=680&height=314&amp;crop=1&amp;DoNotUpscale=True&amp;Compression=75&amp;image={{image}}" alt="{{title}}" /> 2767 </div> 2768 </div> 2769 {{/if}} 2770 2771 <div class="card u-color-light--bg dw-mod"> 2772 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3> 2773 <p class="article__short-summary dw-mod">{{summary}}</p> 2774 </div> 2775 </a> 2776 </div> 2777 {{/Cases}} 2778 </div> 2779 {{/.}} 2780 </script> 2781 </div> 2782 </section> 2783 } 2784 @using System.Reflection 2785 @using Dynamicweb.Rapido.Blocks.Components 2786 @using Dynamicweb.Rapido.Blocks.Components.Articles 2787 @using Dynamicweb.Rapido.Blocks 2788 2789 2790 @* Component for the articles *@ 2791 2792 @helper RenderArticleMenu(ArticleMenu settings) 2793 { 2794 if (!String.IsNullOrEmpty(settings.Title)) { 2795 <div class="u-margin u-border-bottom"> 2796 <h3 class="u-no-margin">@settings.Title</h3> 2797 </div> 2798 } 2799 2800 <ul class="menu-left u-margin-bottom dw-mod"> 2801 @foreach (var item in settings.Items) 2802 { 2803 @Render(item) 2804 } 2805 </ul> 2806 } 2807 2808 @helper RenderArticleMenuItem(ArticleMenuItem settings) 2809 { 2810 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#"; 2811 2812 if (!String.IsNullOrEmpty(settings.Title)) { 2813 <li class="menu-left__item dw-mod"> 2814 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a> 2815 </li> 2816 } 2817 } 2818 @using System.Reflection 2819 @using Dynamicweb.Rapido.Blocks.Components 2820 @using Dynamicweb.Rapido.Blocks.Components.Articles 2821 @using Dynamicweb.Rapido.Blocks 2822 2823 @* Component for the articles *@ 2824 2825 @helper RenderArticleList(ArticleList settings) 2826 { 2827 if (Pageview != null) 2828 { 2829 bool isParagraph = Pageview.CurrentParagraph != null ? true : false; 2830 string[] sortArticlesListBy = new string[2]; 2831 2832 if (isParagraph) { 2833 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2834 } 2835 else { 2836 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" }; 2837 } 2838 2839 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString(); 2840 2841 if (!settings.DisablePagination) { 2842 @RenderItemList(new 2843 { 2844 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2845 ListSourceType = settings.SourceType, 2846 ListSourcePage = sourcePage, 2847 ItemFieldsList = "*", 2848 Filter = settings.Filter, 2849 ListOrderBy = sortArticlesListBy[0], 2850 ListOrderByDirection = sortArticlesListBy[1], 2851 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2852 ListSecondOrderByDirection = "ASC", 2853 IncludeAllChildItems = true, 2854 ListTemplate = settings.Template, 2855 ListPageSize = settings.PageSize.ToString() 2856 }); 2857 } else { 2858 @RenderItemList(new 2859 { 2860 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle", 2861 ListSourceType = settings.SourceType, 2862 ListSourcePage = sourcePage, 2863 ItemFieldsList = "*", 2864 Filter = settings.Filter, 2865 ListOrderBy = sortArticlesListBy[0], 2866 ListOrderByDirection = sortArticlesListBy[1], 2867 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date", 2868 ListSecondOrderByDirection = "ASC", 2869 IncludeAllChildItems = true, 2870 ListTemplate = settings.Template, 2871 ListPageSize = settings.PageSize.ToString(), 2872 ListViewMode = "Partial", 2873 ListShowTo = settings.PageSize + 1 2874 }); 2875 } 2876 } 2877 } 2878 @using System.Reflection 2879 @using Dynamicweb.Rapido.Blocks.Components.Articles 2880 2881 2882 @* Component for the articles *@ 2883 2884 @helper RenderArticleSummary(ArticleSummary settings) 2885 { 2886 if (!String.IsNullOrEmpty(settings.Text)) 2887 { 2888 <div class="article__summary dw-mod">@settings.Text</div> 2889 } 2890 } 2891 @using System.Reflection 2892 @using Dynamicweb.Rapido.Blocks.Components 2893 @using Dynamicweb.Rapido.Blocks.Components.Articles 2894 @using Dynamicweb.Rapido.Blocks 2895 2896 @* Component for the articles *@ 2897 2898 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings) 2899 { 2900 string pageId = Pageview.ID.ToString(); 2901 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All"); 2902 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 2903 2904 foreach (var option in settings.Categories) 2905 { 2906 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter; 2907 } 2908 2909 if (selectedFilter == pageId) 2910 { 2911 selectedFilter = Translate("All"); 2912 } 2913 2914 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 2915 { 2916 <div class="u-pull--right u-margin-left"> 2917 <div class="collection u-no-margin"> 2918 <h5>@Translate("Category")</h5> 2919 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 2920 <div class="dropdown u-w180px dw-mod"> 2921 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 2922 <div class="dropdown__content dw-mod"> 2923 @foreach (var option in settings.Categories) 2924 { 2925 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 2926 } 2927 </div> 2928 <label class="dropdown-trigger-off" for="CategorySelector"></label> 2929 </div> 2930 </div> 2931 </div> 2932 } 2933 else 2934 { 2935 <div class="u-full-width u-margin-bottom"> 2936 <h5 class="u-no-margin">@Translate("Category")</h5> 2937 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" /> 2938 <div class="dropdown u-full-width dw-mod"> 2939 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label> 2940 <div class="dropdown__content dw-mod"> 2941 @foreach (var option in settings.Categories) 2942 { 2943 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div> 2944 } 2945 </div> 2946 <label class="dropdown-trigger-off" for="CategorySelector"></label> 2947 </div> 2948 </div> 2949 } 2950 } 2951 @using System.Reflection 2952 @using Dynamicweb.Rapido.Blocks.Components 2953 @using Dynamicweb.Rapido.Blocks.Components.Articles 2954 @using Dynamicweb.Rapido.Blocks 2955 @using System.Collections.Generic 2956 2957 @* Component for the articles *@ 2958 2959 @helper RenderArticleListFilter(ArticleListFilter settings) 2960 { 2961 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All"); 2962 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); 2963 2964 if (settings.Options != null) 2965 { 2966 if (settings.Options is IEnumerable<dynamic>) 2967 { 2968 var options = (IEnumerable<dynamic>) settings.Options; 2969 settings.Options = options.OrderBy(item => item.Name); 2970 } 2971 2972 foreach (var option in settings.Options) 2973 { 2974 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter; 2975 } 2976 2977 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 2978 { 2979 <div class="u-pull--right u-margin-left"> 2980 <div class="collection u-no-margin"> 2981 <h5>@settings.Label</h5> 2982 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 2983 <div class="dropdown u-w180px dw-mod"> 2984 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 2985 <div class="dropdown__content dw-mod"> 2986 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 2987 @foreach (var option in settings.Options) 2988 { 2989 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 2990 } 2991 </div> 2992 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 2993 </div> 2994 </div> 2995 </div> 2996 } 2997 else 2998 { 2999 <div class="u-full-width u-margin-bottom"> 3000 <h5 class="u-no-margin">@settings.Label</h5> 3001 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" /> 3002 <div class="dropdown u-full-width w-mod"> 3003 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label> 3004 <div class="dropdown__content dw-mod"> 3005 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div> 3006 @foreach (var option in settings.Options) 3007 { 3008 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div> 3009 } 3010 </div> 3011 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label> 3012 </div> 3013 </div> 3014 } 3015 } 3016 } 3017 @using System.Reflection 3018 @using Dynamicweb.Rapido.Blocks.Components 3019 @using Dynamicweb.Rapido.Blocks.Components.Articles 3020 @using Dynamicweb.Rapido.Blocks 3021 3022 @* Component for the articles *@ 3023 3024 @helper RenderArticleListSearch(ArticleListSearch settings) 3025 { 3026 string searchParameter = !string.IsNullOrEmpty(settings.SearchParameter) ? settings.SearchParameter : "Title"; 3027 string searchWord = HttpContext.Current.Request.QueryString.Get(searchParameter); 3028 string searchString = !string.IsNullOrEmpty(searchWord) ? searchWord.Trim('*') : ""; 3029 string className = "u-w340px u-pull--right u-margin-left"; 3030 3031 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3032 { 3033 className = "u-full-width"; 3034 } 3035 3036 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className"> 3037 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('@searchParameter', '*' + document.getElementById('ArticleListSearchInput').value + '*')"> 3038 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button> 3039 </div> 3040 } 3041 @using System.Reflection 3042 @using Dynamicweb.Rapido.Blocks.Components 3043 @using Dynamicweb.Rapido.Blocks.Components.Articles 3044 @using Dynamicweb.Rapido.Blocks 3045 3046 @* Component for the articles *@ 3047 3048 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings) 3049 { 3050 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div> 3051 } 3052 @using System.Reflection 3053 @using Dynamicweb.Rapido.Blocks.Components 3054 @using Dynamicweb.Rapido.Blocks.Components.General 3055 @using Dynamicweb.Rapido.Blocks.Components.Articles 3056 @using Dynamicweb.Rapido.Blocks 3057 @using System.Text.RegularExpressions 3058 3059 @* Component for the articles *@ 3060 3061 @helper RenderArticleListItem(ArticleListItem settings) 3062 { 3063 switch (settings.Type) { 3064 case ArticleListItemType.Card: 3065 @RenderArticleListItemCard(settings); 3066 break; 3067 case ArticleListItemType.List: 3068 @RenderArticleListItemList(settings); 3069 break; 3070 case ArticleListItemType.Simple: 3071 @RenderArticleListItemSimple(settings); 3072 break; 3073 default: 3074 @RenderArticleListItemCard(settings); 3075 break; 3076 } 3077 } 3078 3079 @helper RenderArticleListItemCard(ArticleListItem settings) { 3080 <a href="@settings.Link" class="u-full-height u-color-light--bg"> 3081 <div class="u-color-light--bg u-no-padding dw-mod"> 3082 @if (settings.Logo != null) 3083 { 3084 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3085 settings.Logo.ImageDefault.Crop = 5; 3086 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3087 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3088 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3089 @if (settings.Stickers != null) 3090 { 3091 if (settings.Stickers.Position != StickersListPosition.Custom) 3092 { 3093 @Render(settings.Stickers); 3094 } 3095 } 3096 @RenderImage(settings.Logo) 3097 </div> 3098 } else if (settings.Image != null) 3099 { 3100 <div class="flex-img image-hover__wrapper u-position-relative dw-mod"> 3101 @if (settings.Stickers != null) 3102 { 3103 if (settings.Stickers.Position != StickersListPosition.Custom) 3104 { 3105 @Render(settings.Stickers); 3106 } 3107 } 3108 @Render(settings.Image) 3109 </div> 3110 } 3111 </div> 3112 3113 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3114 { 3115 <div class="card u-color-light--bg dw-mod"> 3116 @if (settings.Stickers != null) 3117 { 3118 if (settings.Stickers.Position == StickersListPosition.Custom) 3119 { 3120 @Render(settings.Stickers); 3121 } 3122 } 3123 @if (!String.IsNullOrEmpty(settings.Title)) 3124 { 3125 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3126 } 3127 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3128 { 3129 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3130 } 3131 @if (!String.IsNullOrEmpty(settings.Summary)) 3132 { 3133 <p class="article__short-summary dw-mod">@settings.Summary</p> 3134 } 3135 </div> 3136 } 3137 </a> 3138 } 3139 3140 @helper RenderArticleListItemList(ArticleListItem settings) { 3141 <a href="@settings.Link"> 3142 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3143 <div class="grid__col-md-3"> 3144 <div class="u-color-light--bg u-no-padding dw-mod"> 3145 @if (settings.Logo != null) 3146 { 3147 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=True&amp;image=" + settings.Image.Path + "); background-size: cover;" : ""; 3148 settings.Logo.ImageDefault.Crop = 5; 3149 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width; 3150 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height; 3151 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage"> 3152 @if (settings.Stickers != null) 3153 { 3154 if (settings.Stickers.Position != StickersListPosition.Custom) 3155 { 3156 @Render(settings.Stickers); 3157 } 3158 } 3159 @RenderImage(settings.Logo) 3160 </div> 3161 } else if (settings.Image != null) 3162 { 3163 <div class="flex-img image-hover__wrapper dw-mod"> 3164 @if (settings.Stickers != null) 3165 { 3166 if (settings.Stickers.Position != StickersListPosition.Custom) 3167 { 3168 @Render(settings.Stickers); 3169 } 3170 } 3171 @Render(settings.Image) 3172 </div> 3173 } 3174 </div> 3175 </div> 3176 3177 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary)) 3178 { 3179 <div class="grid__col-md-9"> 3180 @if (!String.IsNullOrEmpty(settings.Title)) 3181 { 3182 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3> 3183 } 3184 @if (settings.Stickers != null) 3185 { 3186 if (settings.Stickers.Position == StickersListPosition.Custom) 3187 { 3188 @Render(settings.Stickers); 3189 } 3190 } 3191 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3192 { 3193 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3194 } 3195 @if (!String.IsNullOrEmpty(settings.Summary)) 3196 { 3197 <p class="article__short-summary dw-mod">@settings.Summary</p> 3198 } 3199 </div> 3200 } 3201 </div> 3202 </a> 3203 } 3204 3205 @helper RenderArticleListItemSimple(ArticleListItem settings) { 3206 <a href="@settings.Link" class="u-color-inherit"> 3207 <div class="grid u-color-light--bg u-no-padding dw-mod"> 3208 <div class="grid__col-md-12"> 3209 @if (!String.IsNullOrEmpty(settings.Title)) 3210 { 3211 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div> 3212 } 3213 @if (!String.IsNullOrEmpty(settings.SubTitle)) 3214 { 3215 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div> 3216 } 3217 </div> 3218 </div> 3219 </a> 3220 } 3221 @using System.Reflection 3222 @using Dynamicweb.Rapido.Blocks.Components.Articles 3223 3224 3225 @* Component for the articles *@ 3226 3227 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings) 3228 { 3229 <small class="article__subscription"> 3230 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3231 { 3232 <text>@Translate("Written")</text> 3233 } 3234 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3235 { 3236 <text>@Translate("by") @settings.Author</text> 3237 } 3238 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3239 { 3240 <text>@Translate("on") @settings.Date</text> 3241 } 3242 </small> 3243 } 3244 @using System.Reflection 3245 @using Dynamicweb.Rapido.Blocks.Components.Articles 3246 @using Dynamicweb.Rapido.Blocks.Components.General 3247 3248 3249 @* Component for the articles *@ 3250 3251 @helper RenderArticleLink(ArticleLink settings) 3252 { 3253 if (!string.IsNullOrEmpty(settings.Title)) 3254 { 3255 Button link = new Button { 3256 ConfirmText = settings.ConfirmText, 3257 ConfirmTitle = settings.ConfirmTitle, 3258 ButtonType = settings.ButtonType, 3259 Id = settings.Id, 3260 Title = settings.Title, 3261 AltText = settings.AltText, 3262 OnClick = settings.OnClick, 3263 CssClass = settings.CssClass, 3264 Disabled = settings.Disabled, 3265 Icon = settings.Icon, 3266 Name = settings.Name, 3267 Href = settings.Href, 3268 ButtonLayout = settings.ButtonLayout, 3269 ExtraAttributes = settings.ExtraAttributes 3270 }; 3271 <div class="grid__cell"> 3272 @Render(link) 3273 </div> 3274 } 3275 } 3276 @using System.Reflection 3277 @using Dynamicweb.Rapido.Blocks 3278 @using Dynamicweb.Rapido.Blocks.Components.Articles 3279 @using Dynamicweb.Rapido.Blocks.Components.General 3280 3281 3282 @* Component for the articles *@ 3283 3284 @helper RenderArticleCarousel(ArticleCarousel settings) 3285 { 3286 <div class="grid"> 3287 <div class="grid__col-12"> 3288 <div class="carousel" id="carousel_@settings.Id"> 3289 <div class="carousel__container js-carousel-slides dw-mod"> 3290 @RenderBlockList(settings.SubBlocks) 3291 </div> 3292 </div> 3293 </div> 3294 </div> 3295 3296 <script> 3297 document.addEventListener("DOMContentLoaded", function () { 3298 new CarouselModule("#carousel_@settings.Id", { 3299 slideTime: 0, 3300 dots: true 3301 }); 3302 }); 3303 </script> 3304 } 3305 3306 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings) 3307 { 3308 string imageEngine = "/Admin/Public/GetImage.ashx?"; 3309 3310 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image; 3311 if (settings.ImageSettings != null) 3312 { 3313 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : ""; 3314 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : ""; 3315 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&"; 3316 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&"; 3317 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&"; 3318 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&"; 3319 } 3320 defaultImage += "&Image=" + settings.Image; 3321 3322 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')"> 3323 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title"> 3324 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2> 3325 <div class="article-list__item-info"> 3326 @if (settings.Stickers != null) 3327 { 3328 settings.Stickers.Position = StickersListPosition.Custom; 3329 @Render(settings.Stickers); 3330 } 3331 3332 <small class="u-margin-top--lg u-color-light"> 3333 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date))) 3334 { 3335 <text>@Translate("Written")</text> 3336 } 3337 @if (!string.IsNullOrWhiteSpace(settings.Author)) 3338 { 3339 <text>@Translate("by") @settings.Author</text> 3340 } 3341 @if (!string.IsNullOrWhiteSpace(settings.Date)) 3342 { 3343 <text>@Translate("on") @settings.Date</text> 3344 } 3345 </small> 3346 </div> 3347 3348 <h3 class="article__short-summary u-color-light">@settings.Summary</h3> 3349 </a> 3350 @if (settings.UseFilters == true) 3351 { 3352 <div class="background-image image-filter image-filter--darken dw-mod"></div> 3353 } 3354 </div> 3355 } 3356 @using System.Text.RegularExpressions 3357 @using Dynamicweb.Rapido.Blocks.Components 3358 @using Dynamicweb.Rapido.Blocks.Components.General 3359 @using Dynamicweb.Rapido.Blocks.Components.Articles 3360 @using Dynamicweb.Rapido.Blocks 3361 3362 @* Component for the articles *@ 3363 3364 @helper RenderArticleVideo(ArticleVideo settings) 3365 { 3366 if (settings.Url != null) 3367 { 3368 //getting video ID from youtube URL 3369 string videoCode = settings.Url; 3370 Regex regex = new Regex(@".be\/(.[^?]*)"); 3371 Match match = regex.Match(videoCode); 3372 string videoId = ""; 3373 if (match.Success) 3374 { 3375 videoId = match.Groups[1].Value; 3376 } 3377 else 3378 { 3379 regex = new Regex(@"v=([^&]+)"); 3380 match = regex.Match(videoCode); 3381 if (match.Success) 3382 { 3383 videoId = match.Groups[1].Value; 3384 } 3385 } 3386 3387 int autoPlay = settings.AutoPlay == "true" ? 1 : 0; 3388 3389 <div class="video-wrapper"> 3390 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div> 3391 </div> 3392 } 3393 } 3394 3395 3396 3397 @* Simple helpers *@ 3398 3399 @*Requires the Gallery ItemType that comes with Rapido*@ 3400 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) { 3401 if (gallery != null && gallery.Count > 0) 3402 { 3403 int count = 1; 3404 3405 foreach (var item in gallery) 3406 { 3407 if (item.GetFile("ImagePath") != null) 3408 { 3409 string image = item.GetFile("ImagePath").PathUrlEncoded; 3410 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&amp;height=820&amp;crop=5&amp;Compression=75&amp;DoNotUpscale=1&amp;image="; 3411 int imagesCount = gallery.Count; 3412 3413 if (count == 1) 3414 { 3415 <label class="gallery" for="ParagraphGalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))"> 3416 <span class="gallery__main-image"> 3417 <img src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=992&amp;height=760&amp;crop=0&amp;Compression=75&amp;DoNotUpscale=1&amp;image=@image" class="b-lazy flex-img js-gallery" alt="" data-for="ParagraphGallery" data-image="@imagePrefix@image" /> 3418 </span> 3419 <span class="gallery__image-counter"> 3420 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span> 3421 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span> 3422 </span> 3423 </label> 3424 } 3425 else 3426 { 3427 <div class="u-hidden js-gallery" data-for="ParagraphGallery" data-image="@imagePrefix@image"></div> 3428 } 3429 3430 count++; 3431 } 3432 } 3433 3434 @Render(new ArticleGalleryModal()) 3435 } 3436 } 3437 3438 @helper RenderMobileFilters(List<Block> subBlocks) 3439 { 3440 if (subBlocks.Count > 0) 3441 { 3442 <div class="grid__col-12"> 3443 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" /> 3444 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters"> 3445 @RenderBlockList(subBlocks) 3446 </div> 3447 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label> 3448 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label> 3449 </div> 3450 } 3451 } 3452 3453 3454 @* Include the Blocks for the page *@ 3455 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3456 3457 @using System 3458 @using System.Web 3459 @using System.Collections.Generic 3460 @using Dynamicweb.Rapido.Blocks.Extensibility 3461 @using Dynamicweb.Rapido.Blocks 3462 3463 @functions { 3464 string GoogleTagManagerID = ""; 3465 string GoogleAnalyticsID = ""; 3466 } 3467 3468 @{ 3469 GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"); 3470 GoogleAnalyticsID = Model.Area.Item.GetItem("Settings").GetString("GoogleAnalyticsTrackingID"); 3471 3472 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 3473 3474 if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID)) 3475 { 3476 Block tagManager = new Block() 3477 { 3478 Id = "GoogleAnalytics", 3479 SortId = 0, 3480 Template = RenderGoogleAnalyticsSnippet() 3481 }; 3482 topSnippetsBlocksPage.Add("Head", tagManager); 3483 } 3484 3485 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID)) 3486 { 3487 Block tagManager = new Block() 3488 { 3489 Id = "TagManager", 3490 SortId = 1, 3491 Template = RenderGoogleTagManager() 3492 }; 3493 topSnippetsBlocksPage.Add("Head", tagManager); 3494 3495 Block tagManagerBodySnippet = new Block() 3496 { 3497 Id = "TagManagerBodySnippet", 3498 SortId = 1, 3499 Template = RenderGoogleTagManagerBodySnippet() 3500 }; 3501 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet); 3502 } 3503 3504 Block facebookPixel = new Block() 3505 { 3506 Id = "FacebookPixel", 3507 SortId = 2, 3508 Template = RenderFacebookPixel() 3509 }; 3510 3511 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel); 3512 } 3513 3514 @helper RenderGoogleAnalyticsSnippet() 3515 { 3516 <!-- Global site tag (gtag.js) - Google Analytics --> 3517 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script> 3518 <script> 3519 window.dataLayer = window.dataLayer || []; 3520 function gtag(){dataLayer.push(arguments);} 3521 gtag('js', new Date()); 3522 3523 gtag('config', '@GoogleAnalyticsID'); 3524 </script> 3525 3526 } 3527 3528 @helper RenderGoogleTagManager() 3529 { 3530 <script> 3531 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 3532 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 3533 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 3534 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 3535 })(window,document,'script','dataLayer','@GoogleTagManagerID'); 3536 </script> 3537 } 3538 3539 @helper RenderGoogleTagManagerBodySnippet() 3540 { 3541 <!-- Google Tag Manager (noscript) --> 3542 <noscript> 3543 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID" 3544 height="0" width="0" style="display:none;visibility:hidden"></iframe> 3545 </noscript> 3546 <!-- End Google Tag Manager (noscript) --> 3547 } 3548 3549 @helper RenderFacebookPixel() 3550 { 3551 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID"); 3552 3553 if (!string.IsNullOrWhiteSpace(FacebookPixelID)) 3554 { 3555 <!-- Facebook Pixel Code --> 3556 <script> 3557 !function(f,b,e,v,n,t,s) 3558 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 3559 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 3560 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 3561 n.queue=[];t=b.createElement(e);t.async=!0; 3562 t.src=v;s=b.getElementsByTagName(e)[0]; 3563 s.parentNode.insertBefore(t,s)}(window, document,'script', 3564 'https://connect.facebook.net/en_US/fbevents.js'); 3565 fbq('init', '@FacebookPixelID'); 3566 fbq('track', 'PageView'); 3567 </script> 3568 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript> 3569 } 3570 } 3571 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3572 3573 @using System 3574 @using System.Web 3575 @using System.Collections.Generic 3576 @using Dynamicweb.Rapido.Blocks 3577 @using Dynamicweb.Rapido.Blocks.Extensibility 3578 @using Dynamicweb.Security.UserManagement 3579 @using Dynamicweb.Security.UserManagement.ExternalAuthentication 3580 @using Dynamicweb.Rapido.Blocks.Components.General 3581 3582 @{ 3583 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master"); 3584 3585 Block loginModal = new Block() 3586 { 3587 Id = "LoginModal", 3588 SortId = 10, 3589 Component = new Modal 3590 { 3591 Id = "SignIn", 3592 Heading = new Heading 3593 { 3594 Level = 0, 3595 Title = Translate("Sign in") 3596 }, 3597 Width = ModalWidth.Xs, 3598 BodyTemplate = RenderLoginForm() 3599 } 3600 }; 3601 3602 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal); 3603 } 3604 3605 @helper RenderLoginForm() 3606 { 3607 int pageId = Model.TopPage.ID; 3608 string userSignedInErrorText = ""; 3609 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 3610 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 3611 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 3612 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Model.LogOnFailed; 3613 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 3614 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 3615 int productCatalog = GetPageIdByNavigationTag("ProductsPage"); 3616 3617 ProviderCollection providers = Provider.GetActiveProviders(); 3618 3619 if (Model.LogOnFailed) 3620 { 3621 switch (Model.LogOnFailedReason) 3622 { 3623 case LogOnFailedReason.PasswordLengthInvalid: 3624 userSignedInErrorText = Translate("Password length is invalid"); 3625 break; 3626 case LogOnFailedReason.IncorrectLogin: 3627 userSignedInErrorText = Translate("Invalid email or password"); 3628 break; 3629 case LogOnFailedReason.ExceededFailedLogOnLimit: 3630 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked"); 3631 break; 3632 case LogOnFailedReason.LoginLocked: 3633 userSignedInErrorText = Translate("The user account is temporarily locked"); 3634 break; 3635 case LogOnFailedReason.PasswordExpired: 3636 userSignedInErrorText = Translate("The password has expired and needs to be renewed"); 3637 break; 3638 default: 3639 userSignedInErrorText = Translate("An unknown error occured"); 3640 break; 3641 } 3642 } 3643 var proviantGroup = "Default.aspx?ID=" + productCatalog +"&GroupID=A1"; 3644 var friendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(proviantGroup); 3645 var actionUrl = string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, friendlyUrl); 3646 3647 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm", Action = "/"}; 3648 3649 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) }); 3650 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" }); 3651 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" }); 3652 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" }); 3653 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true }); 3654 form.Add(new TextField { Id = "LoginPassword", Name = "password", Type = TextFieldType.Password, Label = Translate("Password"), CssClass = "u-full-width", Required = true }); 3655 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error }); 3656 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") }); 3657 form.Add(new Button {Id ="loginButton", ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event); sessionStorage.setItem('recentlyLoggedIn', 'true')" }); 3658 3659 foreach (Provider LoginProvider in providers) 3660 { 3661 var ProviderName = LoginProvider.Name.ToLower(); 3662 form.Add(new Link { 3663 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID, 3664 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After }, 3665 ButtonLayout = ButtonLayout.LinkClean, 3666 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName, 3667 AltText = ProviderName 3668 }); 3669 } 3670 3671 if (!hideCreateAccountLink) { 3672 form.Add(new Link { Href = "/default.aspx?ID=" + createAccountPageId, Title = Translate("Create account?"), ButtonLayout = ButtonLayout.None, CssClass = "u-block u-padding-bottom" }); 3673 } 3674 3675 if (!hideForgotPasswordLink) { 3676 form.Add(new Link { Href = forgotPasswordPageLink, Title = Translate("Forgot your password?"), ButtonLayout = ButtonLayout.None, CssClass = "u-block u-padding-bottom" }); 3677 } 3678 3679 @Render(form) 3680 3681 if (showModalOnStart) 3682 { 3683 <script> 3684 document.getElementById("SignInModalTrigger").checked = true; 3685 </script> 3686 } 3687 <script> 3688 function formOnEnter(event) { 3689 if(event.key === 'Enter'){ 3690 formSubmit(); 3691 } 3692 } 3693 3694 document.addEventListener('DOMContentLoaded', function () { 3695 var inputElement = document.getElementsByName('LoginModalForm'); 3696 inputElement[0].addEventListener('keypress', formOnEnter); 3697 }); 3698 3699 function formSubmit(){ 3700 var inputElement = document.getElementsByName('LoginModalForm'); 3701 inputElement[0].submit(); 3702 } 3703 </script> 3704 } 3705 3706 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") 3707 { 3708 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3709 3710 @using System 3711 @using System.Web 3712 @using System.Collections.Generic 3713 @using Dynamicweb.Rapido.Blocks.Extensibility 3714 @using Dynamicweb.Rapido.Blocks 3715 @using Dynamicweb.Rapido.Services 3716 3717 3718 @functions { 3719 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3720 } 3721 3722 @{ 3723 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 3724 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 3725 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed(); 3726 3727 Block mobileHeader = new Block() 3728 { 3729 Id = "MobileTop", 3730 SortId = 10, 3731 Template = RenderMobileTop(), 3732 SkipRenderBlocksList = true 3733 }; 3734 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader); 3735 3736 Block mobileHeaderNavigation = new Block() 3737 { 3738 Id = "MobileHeaderNavigation", 3739 SortId = 10, 3740 Template = RenderMobileHeaderNavigation(), 3741 SkipRenderBlocksList = true, 3742 BlocksList = new List<Block> 3743 { 3744 new Block 3745 { 3746 Id = "MobileHeaderNavigationTrigger", 3747 SortId = 10, 3748 Template = RenderMobileHeaderNavigationTrigger() 3749 } 3750 } 3751 }; 3752 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation); 3753 3754 Block mobileHeaderLogo = new Block() 3755 { 3756 Id = "MobileHeaderLogo", 3757 SortId = 20, 3758 Template = RenderMobileHeaderLogo(), 3759 SkipRenderBlocksList = true 3760 }; 3761 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo); 3762 3763 Block mobileHeaderActions = new Block() 3764 { 3765 Id = "MobileHeaderActions", 3766 SortId = 30, 3767 Template = RenderMobileTopActions(), 3768 SkipRenderBlocksList = true 3769 }; 3770 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions); 3771 3772 Block mobileBottomHeader = new Block() 3773 { 3774 Id = "MobileBottomHeader", 3775 SortId = 30, 3776 Template = RenderBottomMobile(), 3777 SkipRenderBlocksList = true 3778 }; 3779 mobileHeaderBlocksPage.Add("MobileTop", mobileBottomHeader); 3780 3781 if (!mobileHideSearch) 3782 { 3783 Block mobileHeaderSearch = new Block 3784 { 3785 Id = "MobileHeaderSearch", 3786 SortId = 10, 3787 Template = RenderMobileTopSearch() 3788 }; 3789 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch); 3790 } 3791 3792 Block mobileHeaderMiniCart; 3793 3794 if (!mobileHideCart) 3795 { 3796 mobileHeaderMiniCart = new Block 3797 { 3798 Id = "MobileHeaderMiniCart", 3799 SortId = 20, 3800 Template = RenderMobileTopMiniCart() 3801 }; 3802 3803 Block miniCartCounterScriptTemplate = new Block 3804 { 3805 Id = "MiniCartCounterScriptTemplate", 3806 Template = RenderMobileMiniCartCounterContent() 3807 }; 3808 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 3809 } 3810 else 3811 { 3812 mobileHeaderMiniCart = new Block 3813 { 3814 Id = "MobileHeaderMiniCart", 3815 SortId = 20 3816 }; 3817 } 3818 3819 if (!mobileHideSearch) 3820 { 3821 Block mobileHeaderSearchBar = new Block() 3822 { 3823 Id = "MobileHeaderSearchBar", 3824 SortId = 30, 3825 Template = RenderMobileTopSearchBar() 3826 }; 3827 // mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar); 3828 } 3829 3830 switch (mobileTopLayout) 3831 { 3832 case "nav-left": 3833 mobileHeaderNavigation.SortId = 10; 3834 mobileHeaderLogo.SortId = 20; 3835 mobileHeaderActions.SortId = 30; 3836 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3837 break; 3838 case "nav-right": 3839 mobileHeaderLogo.SortId = 10; 3840 mobileHeaderActions.SortId = 20; 3841 mobileHeaderNavigation.SortId = 30; 3842 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart); 3843 break; 3844 case "nav-search-left": 3845 mobileHeaderNavigation.SortId = 10; 3846 mobileHeaderLogo.SortId = 20; 3847 mobileHeaderActions.SortId = 30; 3848 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3849 break; 3850 case "search-left": 3851 mobileHeaderActions.SortId = 10; 3852 mobileHeaderLogo.SortId = 20; 3853 mobileHeaderNavigation.SortId = 30; 3854 mobileHeaderMiniCart.SortId = 0; 3855 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart); 3856 break; 3857 } 3858 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 3859 { 3860 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 3861 { 3862 Id = "CartInitialization", 3863 Template = RenderMobileCartInitialization() 3864 }); 3865 } 3866 3867 Block masterCategoryMenu = new Block 3868 { 3869 Id = "MasterCategoryMenu", 3870 SortId = 35, 3871 Template = RenderCategoryMenu() 3872 }; 3873 mobileNavigationBlocksPage.Add("MobileBottomHeader", masterCategoryMenu); 3874 } 3875 3876 3877 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3878 3879 @using System 3880 @using System.Web 3881 @using Dynamicweb.Rapido.Blocks.Extensibility 3882 @using Dynamicweb.Rapido.Blocks 3883 3884 @{ 3885 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master"); 3886 } 3887 3888 3889 3890 @helper RenderMobileCartInitialization() 3891 { 3892 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 3893 <script> 3894 window.cartId = "@miniCartFeedPageId"; 3895 </script> 3896 } 3897 3898 @helper RenderMobileTop() 3899 { 3900 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList(); 3901 3902 <nav class="main-navigation-mobile dw-mod"> 3903 <div class="center-container top-container__center-container dw-mod"> 3904 <div class="grid grid--align-center"> 3905 @RenderBlockList(subBlocks) 3906 </div> 3907 </div> 3908 </nav> 3909 } 3910 3911 @helper RenderMobileHeaderNavigation() 3912 { 3913 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList(); 3914 3915 <div class="grid__col-auto-width"> 3916 <ul class="menu dw-mod"> 3917 @RenderBlockList(subBlocks) 3918 </ul> 3919 </div> 3920 } 3921 3922 @helper RenderMobileHeaderNavigationTrigger() 3923 { 3924 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 3925 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label> 3926 </li> 3927 } 3928 3929 @helper RenderMobileHeaderLogo() 3930 { 3931 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList(); 3932 3933 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 3934 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : ""; 3935 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 3936 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName"); 3937 3938 string mobileLogo = "/Files/Images/logo-dynamicweb.png"; 3939 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null) 3940 { 3941 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded; 3942 } 3943 3944 if (Path.GetExtension(mobileLogo).ToLower() != ".svg") 3945 { 3946 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&amp;width=100&amp;crop=5&amp;Compression=75&amp;image=" + mobileLogo; 3947 } 3948 else 3949 { 3950 mobileLogo = HttpUtility.UrlDecode(mobileLogo); 3951 } 3952 3953 <div class="grid__col-auto grid__col--bleed"> 3954 <div class="grid__cell @centeredLogo"> 3955 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod"> 3956 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" /> 3957 </a> 3958 </div> 3959 3960 @RenderBlockList(subBlocks) 3961 </div> 3962 } 3963 3964 @helper RenderMobileTopActions() 3965 { 3966 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList(); 3967 3968 <div class="grid__col-auto-width"> 3969 <ul class="menu dw-mod"> 3970 @RenderBlockList(subBlocks) 3971 </ul> 3972 </div> 3973 } 3974 3975 @helper RenderBottomMobile() 3976 { 3977 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileBottomHeader").OrderBy(item => item.SortId).ToList(); 3978 3979 <div class="grid__col-sm-12 u-no-padding-y"> 3980 <ul class="category-menu dw-mod"> 3981 @RenderBlockList(subBlocks) 3982 </ul> 3983 </div> 3984 } 3985 3986 @helper RenderMobileTopSearch() 3987 { 3988 @*<li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 3989 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 3990 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 3991 </label> 3992 </li>*@ 3993 } 3994 3995 @helper RenderMobileTopMiniCart() 3996 { 3997 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 3998 int cartPageId = GetPageIdByNavigationTag("CartPage"); 3999 double cartProductsCount = Model.Cart.OrderlinesCount; 4000 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart"); 4001 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 4002 4003 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod bs-gap-3 bs-align-baseline" id="miniCartWrapper"> 4004 <div class="dw-mod" style="display: flex; align-items: center; margin-top: 5px;"> 4005 <div id="cartMiniApp"></div> 4006 </div> 4007 </li> 4008 4009 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 4010 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new 4011 { 4012 //user data 4013 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO", 4014 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK", 4015 UserId = user?.ID, 4016 CustomerNumber = user?.CustomerNumber, 4017 4018 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True", 4019 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300", 4020 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True", 4021 4022 //site settings 4023 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 4024 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name, 4025 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"), 4026 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page 4027 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl) 4028 }); 4029 //this app is responsible for fetching all the user details required by all our vue.js apps to run 4030 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div> 4031 4032 //this app is responsible for handling events sent from legacy JS components, like food calendar 4033 <div id="legacyEventHandler" style="visibility: hidden"></div> 4034 } 4035 4036 @helper RenderMobileTopSearchBar() 4037 { 4038 string searchFeedId = ""; 4039 string searchSecondFeedId = ""; 4040 int groupsFeedId; 4041 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4042 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 4043 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4044 string resultPageLink; 4045 string searchPlaceholder; 4046 string searchType = "product-search"; 4047 string searchTemplate; 4048 string searchContentTemplate = ""; 4049 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4050 bool showGroups = true; 4051 4052 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4053 { 4054 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4055 resultPageLink = contentSearchPageLink; 4056 searchPlaceholder = Translate("Search page"); 4057 groupsFeedId = 0; 4058 searchType = "content-search"; 4059 searchTemplate = "SearchPagesTemplate"; 4060 showGroups = false; 4061 } 4062 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4063 { 4064 searchFeedId = searchPageId + "&feed=true"; 4065 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4066 resultPageLink = Converter.ToString(productsPageId); 4067 searchPlaceholder = Translate("Search products or pages"); 4068 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4069 searchType = "combined-search"; 4070 searchTemplate = "SearchProductsTemplateWrap"; 4071 searchContentTemplate = "SearchPagesTemplateWrap"; 4072 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4073 } 4074 else 4075 { 4076 resultPageLink = Converter.ToString(productsPageId); 4077 searchFeedId = searchPageId + "&feed=true"; 4078 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4079 searchPlaceholder = Translate("Search products"); 4080 searchTemplate = "SearchProductsTemplate"; 4081 searchType = "product-search"; 4082 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4083 } 4084 4085 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" /> 4086 4087 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4088 <div class="center-container top-container__center-container dw-mod"> 4089 <div class="grid"> 4090 <div class="grid__col-auto"> 4091 <div class="typeahead-mobile__search-field dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4092 <span class="u-position-relative"> 4093 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4094 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"> 4095 <i class="fas fa-times"></i> 4096 </button> 4097 </span> 4098 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4099 { 4100 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4101 } 4102 else 4103 { 4104 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4105 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4106 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4107 </div> 4108 } 4109 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"> 4110 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i> 4111 </button> 4112 </div> 4113 </div> 4114 <div class="grid__col-auto-width"> 4115 @*<ul class="menu dw-mod"> 4116 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4117 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4118 <i class="fas fa-times fa-1_5x"></i> 4119 </label> 4120 </li> 4121 </ul>*@ 4122 </div> 4123 </div> 4124 </div> 4125 </div> 4126 } 4127 4128 @helper RenderMobileMiniCartCounterContent() 4129 { 4130 <script id="MiniCartCounterContent" type="text/x-template"> 4131 {{#.}} 4132 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}"> 4133 {{numberoforderlines}} 4134 </div> 4135 {{/.}} 4136 </script> 4137 } 4138 4139 @helper RenderCategoryMenu() 4140 { 4141 var navigationMarkup = RenderNavigation(new 4142 { 4143 id = "categorynav", 4144 cssclass = "dwnavigation menu", 4145 startLevel = 1, 4146 endlevel = 2, 4147 expandmode = "all", 4148 template = "BaseMenuWithDropdown.xslt" 4149 }); 4150 4151 string searchFeedId = ""; 4152 string searchSecondFeedId = ""; 4153 int groupsFeedId; 4154 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4155 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 4156 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4157 string resultPageLink; 4158 string searchPlaceholder; 4159 string searchType = "product-search"; 4160 string searchTemplate; 4161 string searchContentTemplate = ""; 4162 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4163 bool showGroups = true; 4164 4165 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4166 { 4167 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4168 resultPageLink = contentSearchPageLink; 4169 searchPlaceholder = Translate("Search page"); 4170 groupsFeedId = 0; 4171 searchType = "content-search"; 4172 searchTemplate = "SearchPagesTemplate"; 4173 showGroups = false; 4174 } 4175 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4176 { 4177 searchFeedId = productsPageId + "&feed=true"; 4178 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4179 resultPageLink = Converter.ToString(productsPageId); 4180 searchPlaceholder = Translate("Search products or pages"); 4181 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4182 searchType = "combined-search"; 4183 searchTemplate = "SearchProductsTemplateWrap"; 4184 searchContentTemplate = "SearchPagesTemplateWrap"; 4185 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4186 } 4187 else 4188 { 4189 resultPageLink = Converter.ToString(productsPageId); 4190 searchFeedId = searchPageId + "&feed=true"; 4191 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4192 searchPlaceholder = Translate("Search products"); 4193 searchTemplate = "SearchProductsTemplate"; 4194 searchType = "product-search"; 4195 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4196 } 4197 4198 <div class=" dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4199 <span class="search-ahead__wrapper"> 4200 <input type="text" class="search-ahead__input js-typeahead-search-field" id="headerSearch" placeholder="@searchPlaceholder" value="@searchValue"> 4201 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"> 4202 @*<i class="fas fa-times"></i>*@ 4203 </button> 4204 <button type="button" class="search-icon__button js-typeahead-enter-btn"> 4205 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i> 4206 </button> 4207 </span> 4208 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4209 { 4210 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4211 } 4212 else 4213 { 4214 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4215 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4216 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4217 </div> 4218 } 4219 </div> 4220 }</text> 4221 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4222 4223 @using System 4224 @using System.Web 4225 @using System.Collections.Generic 4226 @using Dynamicweb.Rapido.Blocks.Extensibility 4227 @using Dynamicweb.Rapido.Blocks 4228 4229 @functions { 4230 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4231 } 4232 4233 @{ 4234 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4235 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4236 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4237 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4238 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4239 4240 Block mobileNavigation = new Block() 4241 { 4242 Id = "MobileNavigation", 4243 SortId = 10, 4244 Template = MobileNavigation(), 4245 SkipRenderBlocksList = true 4246 }; 4247 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4248 4249 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4250 { 4251 Block mobileNavigationSignIn = new Block 4252 { 4253 Id = "MobileNavigationSignIn", 4254 SortId = 10, 4255 Template = RenderMobileNavigationSignIn() 4256 }; 4257 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4258 } 4259 4260 Block mobileNavigationMenu = new Block 4261 { 4262 Id = "MobileNavigationMenu", 4263 SortId = 20, 4264 Template = RenderMobileNavigationMenu() 4265 }; 4266 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4267 4268 Block mobileNavigationActions = new Block 4269 { 4270 Id = "MobileNavigationActions", 4271 SortId = 30, 4272 Template = RenderMobileNavigationActions(), 4273 SkipRenderBlocksList = true 4274 }; 4275 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4276 4277 if (!mobileNavigationItemsHideSignIn) 4278 { 4279 if (Model.CurrentUser.ID <= 0) 4280 { 4281 Block mobileNavigationSignInAction = new Block 4282 { 4283 Id = "MobileNavigationSignInAction", 4284 SortId = 10, 4285 Template = RenderMobileNavigationSignInAction() 4286 }; 4287 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4288 4289 Block mobileNavigationOldWebshop = new Block 4290 { 4291 Id = "MobileNavigationOldWebshop", 4292 SortId = 20, 4293 Template = RenderMobileNavigationOldWebshop() 4294 }; 4295 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOldWebshop); 4296 4297 if (!mobileHideCreateAccountLink) 4298 { 4299 Block mobileNavigationCreateAccountAction = new Block 4300 { 4301 Id = "MobileNavigationCreateAccountAction", 4302 SortId = 30, 4303 Template = RenderMobileNavigationCreateAccountAction() 4304 }; 4305 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4306 } 4307 } 4308 else 4309 { 4310 if (!mobileHideMyOrdersLink) 4311 { 4312 Block mobileNavigationOrdersAction = new Block 4313 { 4314 Id = "MobileNavigationOrdersAction", 4315 SortId = 20, 4316 Template = RenderMobileNavigationOrdersAction() 4317 }; 4318 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4319 } 4320 4321 if (!mobileHideMySavedCardsLink) 4322 { 4323 Block mobileNavigationSavedCardsAction = new Block 4324 { 4325 Id = "MobileNavigationFavoritesAction", 4326 SortId = 30, 4327 Template = RenderMobileNavigationSavedCardsAction() 4328 }; 4329 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4330 } 4331 4332 Block mobileNavigationSignOutAction = new Block 4333 { 4334 Id = "MobileNavigationSignOutAction", 4335 SortId = 40, 4336 Template = RenderMobileNavigationSignOutAction() 4337 }; 4338 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4339 } 4340 } 4341 4342 if (Model.Languages.Count > 1) 4343 { 4344 Block mobileNavigationLanguagesAction = new Block 4345 { 4346 Id = "MobileNavigationLanguagesAction", 4347 SortId = 50, 4348 Template = RenderMobileNavigationLanguagesAction() 4349 }; 4350 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4351 } 4352 Block cartsSelectMobile = new Block 4353 { 4354 Id = "CartsSelectMobile", 4355 SortId = 60, 4356 Template = RenderCustomSelectCartsAndImpersonation() 4357 }; 4358 mobileNavigationBlocksPage.Add("MobileNavigationActions", cartsSelectMobile); 4359 } 4360 4361 4362 @helper MobileNavigation() 4363 { 4364 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4365 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4366 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4367 4368 <!-- Trigger for mobile navigation --> 4369 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4370 4371 <!-- Mobile navigation --> 4372 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4373 <div class="mobile-navigation__wrapper u-padding-top--lg" id="mobileNavigationWrapper"> 4374 <label class="mobile-nav-trigger-on u-margin-bottom--lg u-margin-left--lg u-brand-color-three" for="MobileNavTrigger"> 4375 <span><i class="fas fa-times-circle fa-2x"></i></span> 4376 </label> 4377 @RenderBlockList(subBlocks) 4378 </div> 4379 </nav> 4380 4381 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4382 } 4383 4384 @helper RenderMobileNavigationSignIn() 4385 { 4386 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4387 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4388 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4389 string myProfilePageLink = linkStart + myProfilePageId; 4390 string userName = Model.CurrentUser.FirstName; 4391 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4392 { 4393 userName += " " + Model.CurrentUser.LastName; 4394 } 4395 if (string.IsNullOrEmpty(userName)) 4396 { 4397 userName = Model.CurrentUser.Name; 4398 } 4399 if (string.IsNullOrEmpty(userName)) 4400 { 4401 userName = Model.CurrentUser.UserName; 4402 } 4403 if (string.IsNullOrEmpty(userName)) 4404 { 4405 userName = Model.CurrentUser.Email; 4406 } 4407 4408 <ul class="menu menu-mobile"> 4409 <li class="menu-mobile__item"> 4410 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4411 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @userName 4412 </a> 4413 </li> 4414 </ul> 4415 } 4416 4417 @helper RenderMobileNavigationMenu() 4418 { 4419 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4420 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4421 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4422 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4423 int startLevel = 0; 4424 4425 @RenderNavigation(new 4426 { 4427 id = "mobilenavigation", 4428 cssclass = "menu menu-mobile dwnavigation", 4429 startLevel = @startLevel, 4430 ecomStartLevel = @startLevel + 1, 4431 endlevel = @levels, 4432 expandmode = "all", 4433 template = @menuTemplate 4434 }) 4435 4436 if (isSlidesDesign) 4437 { 4438 <script> 4439 function goToLevel(level) { 4440 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4441 } 4442 4443 document.addEventListener('DOMContentLoaded', function () { 4444 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4445 }); 4446 </script> 4447 } 4448 4449 if (renderPagesInToolBar) 4450 { 4451 @RenderNavigation(new 4452 { 4453 id = "topToolsMobileNavigation", 4454 cssclass = "menu menu-mobile dwnavigation", 4455 template = "ToolsMenuForMobile.xslt" 4456 }) 4457 } 4458 } 4459 4460 @helper RenderMobileNavigationActions() 4461 { 4462 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4463 4464 <ul class="menu menu-mobile"> 4465 @RenderBlockList(subBlocks) 4466 </ul> 4467 } 4468 4469 @helper RenderMobileNavigationSignInAction() 4470 { 4471 <li class="menu-mobile__item"> 4472 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label> 4473 </li> 4474 4475 @*this app is responsible for setting all the settings for anonymous users in vue.js apps*@ 4476 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new 4477 { 4478 //user data 4479 CountryCode = "NO", 4480 CurrencyCode = "NOK", 4481 ShowNumberOfCartons = false, 4482 SendShipOwner = false, 4483 SendOnlySeeDiverse = false, 4484 4485 //site settings 4486 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 4487 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name, 4488 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"), 4489 CheckoutPageUrl = "", 4490 MinicartAvailable = false 4491 }); 4492 4493 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div> 4494 } 4495 4496 @helper RenderMobileNavigationOldWebshop() 4497 { 4498 <li class="menu-mobile__item"> 4499 <a href="https://ssoprovider.kraemer.no/users/sign_in" class="menu-mobile__link dw-mod menu-mobile__link--highlighted" onclick="RememberState.SetCookie('useAnotherAddress', false)" target="_blank"> 4500 <i class="fas fa-shopping-basket u-margin-right"></i> @Translate("Old Webshop") 4501 </a> 4502 </li> 4503 } 4504 4505 @helper RenderMobileNavigationCreateAccountAction() 4506 { 4507 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4508 4509 <li class="menu-mobile__item"> 4510 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a> 4511 </li> 4512 } 4513 4514 @helper RenderMobileNavigationProfileAction() 4515 { 4516 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4517 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4518 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4519 string myProfilePageLink = linkStart + myProfilePageId; 4520 4521 <li class="menu-mobile__item"> 4522 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4523 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @Translate("My Profile") 4524 </a> 4525 </li> 4526 } 4527 4528 @helper RenderMobileNavigationOrdersAction() 4529 { 4530 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4531 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4532 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4533 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 4534 int deviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 4535 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 4536 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 4537 int foodCalendarPageId = GetPageIdByNavigationTag("MenuView"); 4538 int foodCalendarAdminPageId = GetPageIdByNavigationTag("MenuCalendarView"); 4539 string announcementPageLink = linkStart + announcementPageId; 4540 string myOrdersPageLink = linkStart + myOrdersPageId; 4541 string myReportsPageLink = linkStart + myReportsPageId; 4542 string myDeviationsPageLink = linkStart + deviationsPageId; 4543 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4544 string foodCalendarPageLink = linkStart + foodCalendarPageId; 4545 string foodCalendarAdminPageLink = linkStart + foodCalendarAdminPageId; 4546 //string ordersIcon = "fas fa-list"; 4547 var user = Pageview.User; 4548 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 4549 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 4550 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 4551 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 4552 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 4553 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 4554 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 4555 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 4556 4557 <li class="menu-mobile__item"> 4558 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4559 <img width="20" height="20" src="/Files/Images/favorite-list-svg.svg"> @Translate("My Favorites") 4560 </a> 4561 </li> 4562 <li class="menu-mobile__item"> 4563 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4564 <img width="20" height="20" src="/Files/Images/order-history-svg.svg"> @Translate("My Orders") 4565 </a> 4566 </li> 4567 if (hasAccessToAnnouncements) 4568 { 4569 <li class="menu-mobile__item"> 4570 <a href="@announcementPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod u-brand-color-two bs-position-relative bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 4571 <img width="22" height="22" src="/Files/Images/notifications.svg"> 4572 <svg class="announcement_notification-dot bs-position-absolute @announcementNotificationDotClass" style="top: 45%; left: 25px;height: 13px;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 4573 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30" /> 4574 </svg> 4575 @Translate("Announcements") 4576 </a> 4577 </li> 4578 } 4579 if (hasAccessToFoodCalendar) 4580 { 4581 <li class="menu-mobile__item"> 4582 <a href="@foodCalendarPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4583 <img width="20" height="20" src="/Files/Images/food-calendar.svg"> @Translate("Matretter") 4584 </a> 4585 </li> 4586 } 4587 4588 if (isFoodCalendarAdmin) 4589 { 4590 <li class="menu-mobile__item"> 4591 <a href="@foodCalendarAdminPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4592 <img width="20" height="20" src="/Files/Images/food-calendar-menu-calendar.svg"> @Translate("Kalendervisning") 4593 </a> 4594 </li> 4595 } 4596 4597 <li class="menu-mobile__item"> 4598 <a href="@myDeviationsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4599 <img width="20" height="20" src="/Files/Images/UnionRMA-icon.svg"> @Translate("My Deviations") 4600 </a> 4601 </li> 4602 4603 if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 4604 { 4605 <li class="menu-mobile__item"> 4606 <a href="@myReportsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4607 <img width="20" height="20" src="/Files/Images/IconPowerBi.svg"> @Translate("My reports") 4608 </a> 4609 </li> 4610 } 4611 4612 4613 } 4614 4615 4616 @helper RenderMobileNavigationSavedCardsAction() 4617 { 4618 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4619 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4620 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4621 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4622 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card"; 4623 4624 <li class="menu-mobile__item"> 4625 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a> 4626 </li> 4627 } 4628 4629 @helper RenderMobileNavigationSignOutAction() 4630 { 4631 int pageId = Model.TopPage.ID; 4632 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt"; 4633 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 4634 bool promptForAccount = false; 4635 4636 if (userCustomFields != null) 4637 { 4638 foreach (var field in userCustomFields) 4639 { 4640 if (field.CustomField.SystemName == "AccessUser_PromptForAccount") 4641 { 4642 promptForAccount = field.Value.ToString() == "True"; 4643 } 4644 } 4645 } 4646 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 4647 { 4648 <li class="menu-mobile__item"> 4649 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4650 </li> 4651 } 4652 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 4653 { 4654 if (promptForAccount) 4655 { 4656 <li class="menu-mobile__item"> 4657 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4658 </li> 4659 } 4660 else 4661 { 4662 <li class="menu-mobile__item"> 4663 <a href="/" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4664 </li> 4665 } 4666 4667 } 4668 else 4669 { 4670 <li class="menu-mobile__item"> 4671 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4672 </li> 4673 } 4674 @* <li class="menu-mobile__item"> 4675 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a> 4676 </li>*@ 4677 } 4678 4679 @helper RenderMobileNavigationLanguagesAction() 4680 { 4681 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4682 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 4683 string selectedLanguage = ""; 4684 foreach (var lang in Model.Languages) 4685 { 4686 var language = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4687 var languageTitle = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(language.ToLower()); 4688 4689 if (lang.IsCurrent) 4690 { 4691 selectedLanguage = languageTitle; 4692 } 4693 } 4694 4695 <li class="menu-mobile__item dw-mod"> 4696 @if (isSlidesDesign) 4697 { 4698 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4699 } 4700 else 4701 { 4702 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4703 } 4704 <div class="menu-mobile__link__wrap"> 4705 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"><img width="20" height="20" src="/Files/Images/language-selector-svg.svg"> @selectedLanguage</label> 4706 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4707 </div> 4708 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4709 @if (isSlidesDesign) 4710 { 4711 <li class="menu-mobile__item dw-mod"> 4712 <div class="menu-mobile__link__wrap"> 4713 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4714 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4715 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4716 </div> 4717 </li> 4718 } 4719 @*foreach (var lang in Model.Languages) 4720 { 4721 <li class="menu-mobile__item dw-mod"> 4722 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4723 </li> 4724 }*@ 4725 4726 @foreach (var lang in Model.Languages) 4727 { 4728 var area = Dynamicweb.Content.Services.Areas.GetArea(lang.ID); 4729 string languageIcon = lang.Culture.Replace("nb", "").Replace("en", "").ToLower(); 4730 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 4731 string cultureName = Regex.Replace(area.CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4732 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4733 4734 4735 if (languageViewType == "flag-culture") 4736 { 4737 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 4738 } 4739 4740 if (languageViewType == "flag") 4741 { 4742 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 4743 } 4744 4745 if (languageViewType == "name") 4746 { 4747 langInfo = lang.Name; 4748 } 4749 4750 if (languageViewType == "culture") 4751 { 4752 langInfo = cultureName; 4753 } 4754 4755 <li class="menu-mobile__item dw-mod"> 4756 <a onclick="window.dispatchEvent(new CustomEvent('on-language-change', { detail: { languageId: '@area.EcomLanguageId.ToUpper()', culture: '@lang.Culture' } }))" href="/Default.aspx?AreaID=@area.ID" class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1">@langInfo</a> 4757 </li> 4758 } 4759 </ul> 4760 </li> 4761 } 4762 4763 4764 4765 4766 @helper RenderCustomSelectCartsAndImpersonation() 4767 { 4768 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 4769 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4770 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 4771 4772 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4773 string userName = userExists ? getUserName(Pageview.User) : ""; 4774 int secondaryUsersCount = Model.SecondaryUsers.Count; 4775 4776 @*if (userExists) 4777 { 4778 <div class="u-max-w260px u-margin-left--lg u-margin-top--lg u-margin-bottom--lg"> 4779 <span>@Translate("Handlekurv")</span> 4780 <div class="dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 4781 <div class="dw-mod"> 4782 @Render(new Button 4783 { 4784 Title = Translate("Change Cart Name"), 4785 ButtonType = ButtonType.Button, 4786 ButtonLayout = ButtonLayout.None, 4787 CssClass = "u-margin-bottom change-cart-name", 4788 OnClick = "changeCartName()" 4789 }) 4790 @Render(new Button 4791 { 4792 Title = Translate("Create New Cart"), 4793 ButtonType = ButtonType.Button, 4794 ButtonLayout = ButtonLayout.Primary, 4795 CssClass = "u-full-width", 4796 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 4797 }) 4798 </div> 4799 </div> 4800 }*@ 4801 <div class="u-max-w260px u-margin-left--lg"> 4802 @if (secondaryUsersCount > 0) 4803 { 4804 @RenderDesktopToolsTextMobile() 4805 } 4806 </div> 4807 } 4808 4809 4810 @helper RenderDesktopToolsTextMobile() 4811 { 4812 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 4813 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4814 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 4815 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4816 string userName = userExists ? getUserName(Pageview.User) : ""; 4817 int secondaryUsersCount = Model.SecondaryUsers.Count; 4818 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 4819 bool promptForAccount = getPromptForAccount(); 4820 4821 <div class="" style="min-height: 30px"> 4822 @if (userExists) 4823 { 4824 <div class="u-margin-bottom--lg u-margin-top--lg u-border-top u-border-bottom u-padding-top u-padding-bottom"> 4825 @if (secondaryUsersCount > 0) 4826 { 4827 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4828 { 4829 <div class="u-margin-right u-margin-bottom" data-prompt-account="@promptForAccount">@userName</div> 4830 4831 if (secondaryUsersCount > 1 || promptForAccount) 4832 { 4833 @RenderImpersonationDropdownMobile(impersonationListFeedPageId) 4834 } 4835 } 4836 else 4837 { 4838 <div class="u-margin-bottom">@Translate("Choose user to impersonate:") </div> 4839 @RenderImpersonationDropdownMobile(impersonationListFeedPageId) 4840 } 4841 4842 4843 } 4844 4845 </div> 4846 if (!string.IsNullOrEmpty(customerNumber)) 4847 { 4848 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 4849 { 4850 <div> 4851 @Translate("currentLocation") <div class="location-space u-margin-bottom"></div> 4852 4853 @Render(new Button 4854 { 4855 ButtonType = ButtonType.Button, 4856 ButtonLayout = ButtonLayout.None, 4857 Title = Translate("Change Location"), 4858 CssClass = "u-no-margin btn btn--primary dw-mod", 4859 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true, document.querySelector('#MobileNavTrigger').checked = false" 4860 }) 4861 </div> 4862 } 4863 4864 } 4865 } 4866 4867 4868 </div> 4869 } 4870 4871 @helper RenderImpersonationDropdownMobile(string impersonationListFeedPageId) 4872 { 4873 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 4874 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 4875 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-test="test1"> 4876 <input type="hidden" name="DwExtranetRemoveSecondaryUser"> 4877 </form> 4878 <div class="impersonation-container"> 4879 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger" /> 4880 <div class="dropdown variants-filters dw-mod"> 4881 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 4882 <div class="dropdown__content u-padding dw-mod"> 4883 <div class="dropdown__item__filter"> 4884 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 4885 </div> 4886 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 4887 </div> 4888 </div> 4889 </div> 4890 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 4891 </div> 4892 4893 4894 }</text> 4895 } 4896 else 4897 { 4898 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4899 4900 @using System 4901 @using System.Web 4902 @using System.Collections.Generic 4903 @using Dynamicweb.Rapido.Blocks.Extensibility 4904 @using Dynamicweb.Rapido.Blocks 4905 4906 @functions { 4907 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4908 4909 } 4910 4911 @{ 4912 Block masterTools = new Block() 4913 { 4914 Id = "MasterDesktopTools", 4915 SortId = 10, 4916 Template = RenderDesktopTools(), 4917 SkipRenderBlocksList = true, 4918 BlocksList = new List<Block> 4919 { 4920 new Block 4921 { 4922 Id = "MasterDesktopToolsText", 4923 SortId = 10, 4924 Template = RenderDesktopToolsText(), 4925 Design = new Design 4926 { 4927 Size = "auto", 4928 HidePadding = true, 4929 RenderType = RenderType.Column 4930 } 4931 }, 4932 new Block 4933 { 4934 Id = "MasterDesktopToolsNavigation", 4935 SortId = 20, 4936 Template = RenderDesktopToolsNavigation(), 4937 Design = new Design 4938 { 4939 Size = "auto-width", 4940 HidePadding = true, 4941 RenderType = RenderType.Column 4942 } 4943 } 4944 } 4945 }; 4946 headerBlocksPage.Add("MasterHeader", masterTools); 4947 4948 Block masterDesktopExtra = new Block() 4949 { 4950 Id = "MasterDesktopExtra", 4951 SortId = 10, 4952 Template = RenderDesktopExtra(), 4953 SkipRenderBlocksList = true 4954 }; 4955 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4956 4957 Block masterDesktopNavigation = new Block() 4958 { 4959 Id = "MasterDesktopNavigation", 4960 SortId = 20, 4961 Template = RenderDesktopNavigation(), 4962 SkipRenderBlocksList = true 4963 }; 4964 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4965 4966 if (Model.CurrentUser.ID > 0) 4967 { 4968 Modal stopImpersonation = new Modal 4969 { 4970 Id = "StopImpersonation", 4971 Heading = new Heading 4972 { 4973 Level = 2, 4974 Title = Translate("Sign out"), 4975 Icon = new Icon 4976 { 4977 Name = "fa-sign-out", 4978 Prefix = "fas", 4979 LabelPosition = IconLabelPosition.After 4980 } 4981 }, 4982 Width = ModalWidth.Md, 4983 BodyTemplate = RenderStopImpersonationForm() 4984 }; 4985 4986 Block stopImpersonationBlock = new Block 4987 { 4988 Id = "StopImpersonationBlock", 4989 SortId = 10, 4990 Component = stopImpersonation 4991 }; 4992 headerBlocksPage.Add("MasterHeader", stopImpersonationBlock); 4993 } 4994 4995 } 4996 4997 @* Include the Blocks for the page *@ 4998 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4999 5000 @using System 5001 @using System.Web 5002 @using Dynamicweb.Rapido.Blocks.Extensibility 5003 @using Dynamicweb.Rapido.Blocks 5004 5005 @{ 5006 Block masterDesktopLogo = new Block 5007 { 5008 Id = "MasterDesktopLogo", 5009 SortId = 10, 5010 Template = RenderDesktopLogo(), 5011 Design = new Design 5012 { 5013 Size = "auto-width", 5014 HidePadding = true, 5015 RenderType = RenderType.Column, 5016 CssClass = "grid--align-self-center" 5017 } 5018 }; 5019 5020 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 5021 } 5022 5023 5024 @helper RenderDesktopLogo() 5025 { 5026 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 5027 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5028 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 5029 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 5030 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 5031 if (Path.GetExtension(logo).ToLower() != ".svg") 5032 { 5033 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 5034 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 5035 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 5036 } 5037 else 5038 { 5039 logo = HttpUtility.UrlDecode(logo); 5040 } 5041 5042 <div class="logo @alignClass dw-mod"> 5043 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 5044 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 5045 </a> 5046 </div> 5047 } 5048 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5049 5050 @using System 5051 @using System.Web 5052 @using Dynamicweb.Rapido.Blocks.Extensibility 5053 @using Dynamicweb.Rapido.Blocks 5054 5055 @functions { 5056 bool isMegaMenu; 5057 } 5058 5059 @{ 5060 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 5061 Block masterDesktopMenu = new Block 5062 { 5063 Id = "MasterDesktopMenu", 5064 SortId = 10, 5065 Template = RenderDesktopMenu(), 5066 Design = new Design 5067 { 5068 Size = "auto", 5069 HidePadding = true, 5070 RenderType = RenderType.Column 5071 } 5072 }; 5073 5074 if (isMegaMenu) 5075 { 5076 masterDesktopMenu.Design.CssClass = "u-reset-position"; 5077 } 5078 5079 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 5080 } 5081 5082 @helper RenderDesktopMenu() 5083 { 5084 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5085 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 5086 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 5087 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 5088 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5089 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 5090 int startLevel = renderPagesInToolBar ? 1 : 0; 5091 5092 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 5093 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 5094 5095 bool isSlapp = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Slapp", StringComparison.OrdinalIgnoreCase)).Value.ToString() == "True" : false; 5096 5097 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 5098 @if (!isMegaMenu) 5099 { 5100 if (isSlapp) 5101 { 5102 @RenderNavigation(new 5103 { 5104 id = "topnavigation", 5105 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5106 startLevel = startLevel, 5107 ecomStartLevel = startLevel + 1, 5108 endlevel = 5, 5109 expandmode = "all", 5110 template = "BaseMenuWithDropdown-nocategory.xslt" 5111 }); 5112 5113 } 5114 else 5115 { 5116 @RenderNavigation(new 5117 { 5118 id = "topnavigation", 5119 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5120 startLevel = startLevel, 5121 ecomStartLevel = startLevel + 1, 5122 endlevel = 5, 5123 expandmode = "all", 5124 template = "BaseMenuWithDropdown.xslt" 5125 }); 5126 } 5127 5128 } 5129 else 5130 { 5131 @RenderNavigation(new 5132 { 5133 id = "topnavigation", 5134 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5135 startLevel = startLevel, 5136 ecomStartLevel = startLevel + 1, 5137 endlevel = 5, 5138 promotionImage = megamenuPromotionImage, 5139 promotionLink = promotionLink, 5140 expandmode = "all", 5141 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 5142 template = "BaseMegaMenu.xslt" 5143 }); 5144 } 5145 </div> 5146 } 5147 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5148 5149 @using System 5150 @using System.Web 5151 @using Dynamicweb.Rapido.Blocks.Extensibility 5152 @using Dynamicweb.Rapido.Blocks 5153 5154 @{ 5155 Block masterDesktopActionsMenu = new Block 5156 { 5157 Id = "MasterDesktopActionsMenu", 5158 SortId = 10, 5159 Template = RenderDesktopActionsMenu(), 5160 Design = new Design 5161 { 5162 CssClass = "u-flex" 5163 }, 5164 SkipRenderBlocksList = true 5165 5166 }; 5167 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 5168 5169 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 5170 { 5171 Block masterDesktopActionsHeaderButton = new Block 5172 { 5173 Id = "MasterDesktopActionsHeaderButton", 5174 SortId = 60, 5175 Template = RenderHeaderButton() 5176 }; 5177 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 5178 } 5179 } 5180 5181 @helper RenderDesktopActionsMenu() 5182 { 5183 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 5184 5185 <ul class="menu u-flex dw-mod"> 5186 @RenderBlockList(subBlocks) 5187 </ul> 5188 } 5189 5190 @helper RenderHeaderButton() 5191 { 5192 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 5193 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 5194 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 5195 5196 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 5197 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a> 5198 </li> 5199 } 5200 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5201 5202 @using System 5203 @using System.Security.Cryptography 5204 @using System.Web 5205 @using Dynamicweb.Core; 5206 @using System.Text.RegularExpressions 5207 @using Dynamicweb.Rapido.Blocks.Extensibility 5208 @using Dynamicweb.Rapido.Blocks 5209 5210 @{ 5211 Block masterDesktopActionsMenuLanguageSelector = new Block 5212 { 5213 Id = "MasterDesktopActionsMenuLanguageSelector", 5214 SortId = 90, 5215 Template = RenderLanguageSelector() 5216 }; 5217 5218 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 5219 } 5220 5221 @helper RenderLanguageSelector() 5222 { 5223 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5224 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5225 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5226 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 5227 string currentLanguage = Pageview.Area.Culture.Replace("nb", "").Replace("en", "").ToLower(); 5228 string currentLangInfo = "<span class=\"flag-icon flag-icon" + currentLanguage + " u-margin-right\"></span>"; 5229 5230 5231 if (Model.Languages.Count > 1) 5232 { 5233 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 5234 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 5235 @currentLangInfo 5236 </div> 5237 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 5238 @foreach (var lang in Model.Languages) 5239 { 5240 var area = Dynamicweb.Content.Services.Areas.GetArea(lang.ID); 5241 string widthClass = "menu__item--fixed-width"; 5242 string languageIcon = lang.Culture.Replace("nb", "").Replace("en", "").ToLower(); 5243 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 5244 string cultureName = Regex.Replace(area.CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 5245 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 5246 5247 if (languageViewType == "flag-culture") 5248 { 5249 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 5250 } 5251 5252 if (languageViewType == "flag") 5253 { 5254 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 5255 widthClass = ""; 5256 } 5257 5258 if (languageViewType == "name") 5259 { 5260 langInfo = lang.Name; 5261 } 5262 5263 if (languageViewType == "culture") 5264 { 5265 langInfo = cultureName; 5266 widthClass = ""; 5267 } 5268 5269 <div class="menu__item dw-mod @widthClass"> 5270 <a onclick=" 5271 window.dispatchEvent(new CustomEvent('on-language-change', { detail: { languageId: '@area.EcomLanguageId.ToUpper()', culture: '@lang.Culture' } }))" 5272 href="/Default.aspx?AreaID=@area.ID" 5273 class="menu-dropdown__link dw-mod">@langInfo</a> 5274 </div> 5275 } 5276 </div> 5277 </li> 5278 } 5279 } 5280 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5281 5282 @using System 5283 @using System.Web 5284 @using Dynamicweb.Rapido.Blocks.Extensibility 5285 @using Dynamicweb.Rapido.Blocks 5286 5287 @{ 5288 Block masterDesktopActionsMenuSignIn = new Block 5289 { 5290 Id = "MasterDesktopActionsMenuSignIn", 5291 SortId = 20, 5292 Template = RenderSignIn() 5293 }; 5294 5295 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 5296 } 5297 5298 @helper RenderSignIn() 5299 { 5300 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 5301 string userInitials = ""; 5302 int pageId = Model.TopPage.ID; 5303 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 5304 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 5305 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 5306 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 5307 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5308 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 5309 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 5310 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 5311 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 5312 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 5313 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 5314 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 5315 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 5316 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 5317 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 5318 5319 string linkStart = "/Default.aspx?ID="; 5320 if (Model.CurrentUser.ID <= 0) 5321 { 5322 linkStart += signInProfilePageId + "&RedirectPageId="; 5323 } 5324 5325 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 5326 string myProfilePageLink = linkStart + myProfilePageId; 5327 string myOrdersPageLink = linkStart + myOrdersPageId; 5328 string myFavoritesPageLink = linkStart + myFavoritesPageId; 5329 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 5330 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 5331 5332 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 5333 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 5334 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5335 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 5336 5337 if (Model.CurrentUser.ID != 0) 5338 { 5339 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 5340 } 5341 5342 if (!navigationItemsHideSignIn) 5343 { 5344 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5345 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 5346 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5347 5348 5349 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass u-margin-right-header-menu is-dropdown--no-icon dw-mod"> 5350 <div class="@menuLinkClass dw-mod" > 5351 @if (Model.CurrentUser.ID <= 0) 5352 { 5353 <i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i> 5354 } 5355 else 5356 { 5357 <div class="user-menu u-flex"> 5358 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5359 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5360 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon) 5361 5362 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5363 { 5364 <div class="u-margin-right"> 5365 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></div> 5366 </div> 5367 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5368 { 5369 <div class="u-margin-right"> 5370 <a href="/" class="u-color-inherit" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></a> 5371 </div> 5372 } else { 5373 @RenderMenuIcon("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"), "far fa-sign-out-alt") 5374 } 5375 5376 </div> 5377 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 5378 } 5379 </div> 5380 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 5381 <ul class="list list--clean dw-mod"> 5382 @if (Model.CurrentUser.ID <= 0) 5383 { 5384 <li> 5385 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 5386 </li> 5387 5388 if (!hideCreateAccountLink) 5389 { 5390 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 5391 } 5392 if (!hideForgotPasswordLink) 5393 { 5394 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 5395 } 5396 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5397 { 5398 @RenderSeparator() 5399 } 5400 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true ) 5401 } 5402 else 5403 { 5404 if (!hideMyProfileLink) 5405 { 5406 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 5407 } 5408 if (!hideMyOrdersLink) 5409 { 5410 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5411 } 5412 if (!hideMyFavoritesLink) 5413 { 5414 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5415 } 5416 if (!hideMySavedCardsLink) 5417 { 5418 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 5419 } 5420 if (!hideMyOrderDraftsLink) 5421 { 5422 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 5423 } 5424 } 5425 5426 @if (Model.CurrentUser.ID > 0) 5427 { 5428 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5429 { 5430 @RenderSeparator() 5431 } 5432 5433 //Check if impersonation is on 5434 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5435 { 5436 <li> 5437 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 5438 @Translate("Sign out") 5439 </div> 5440 </li> 5441 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5442 { 5443 <li> 5444 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 5445 @Translate("Sign out") 5446 </a> 5447 </li> 5448 } else { 5449 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 5450 } 5451 } 5452 </ul> 5453 </div> 5454 </li> 5455 } 5456 } 5457 5458 @helper RenderListItem(string link, string text, string icon = null, bool target = false) { 5459 string targetBlank = target == true ? "target='_blank'" : ""; 5460 <li> 5461 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)" @targetBlank> 5462 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5463 </a> 5464 </li> 5465 } 5466 5467 @helper RenderSeparator() 5468 { 5469 <li class="list__seperator dw-mod"></li> 5470 } 5471 5472 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5473 5474 @using System 5475 @using System.Web 5476 @using Dynamicweb.Rapido.Blocks.Extensibility 5477 @using Dynamicweb.Rapido.Blocks 5478 5479 @{ 5480 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5481 5482 Block masterDesktopActionsMenuFavorites = new Block 5483 { 5484 Id = "MasterDesktopActionsMenuFavorites", 5485 SortId = 30, 5486 Template = RenderFavorites() 5487 }; 5488 5489 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5490 { 5491 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5492 } 5493 } 5494 5495 @helper RenderFavorites() 5496 { 5497 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5498 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5499 5500 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5501 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5502 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5503 5504 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5505 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5506 @* 5507 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5508 *@ 5509 <img src="/Files/Images/favorite-list-svg.svg"/> 5510 </a> 5511 </li> 5512 } 5513 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5514 @using Dynamicweb.Rapido.Blocks 5515 5516 @{ 5517 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5518 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5519 5520 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5521 { 5522 Block masterDesktopActionsMenuMiniCart = new Block 5523 { 5524 Id = "MasterDesktopActionsMenuMiniCart", 5525 SortId = 40, 5526 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5527 SkipRenderBlocksList = true, 5528 BlocksList = new List<Block>() 5529 }; 5530 5531 Block miniCartCounterScriptTemplate = new Block 5532 { 5533 Id = "MiniCartCounterScriptTemplate", 5534 Template = RenderMiniCartCounterContent() 5535 }; 5536 5537 //dropdown layout is default 5538 RazorEngine.Templating.TemplateWriter layoutTemplate; 5539 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5540 5541 switch (miniCartLayout) 5542 { 5543 case "dropdown": 5544 layoutTemplate = RenderMiniCartDropdownLayout(); 5545 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5546 break; 5547 case "panel": 5548 layoutTemplate = RenderMiniCartPanelLayout(); 5549 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5550 break; 5551 case "modal": 5552 layoutTemplate = RenderMiniCartModalLayout(); 5553 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5554 break; 5555 case "none": 5556 default: 5557 layoutTemplate = RenderNoLayoutMiniCart(); 5558 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5559 break; 5560 } 5561 5562 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5563 { 5564 Id = "MiniCartTrigger", 5565 SortId = 40, 5566 Template = miniCartTriggerTemplate 5567 }); 5568 5569 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5570 { 5571 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5572 { 5573 Id = "MiniCartLayout", 5574 SortId = 40, 5575 Template = layoutTemplate 5576 }); 5577 } 5578 5579 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5580 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5581 } 5582 5583 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5584 { 5585 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 5586 { 5587 Id = "CartInitialization", 5588 Template = RenderNoLayoutMiniCart() 5589 }); 5590 } 5591 5592 } 5593 5594 @helper RenderMiniCart(bool hasMouseEnterEvent) 5595 { 5596 @*List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5597 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5598 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5599 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5600 string mouseEvent = ""; 5601 string id = "MiniCart"; 5602 if (hasMouseEnterEvent) 5603 { 5604 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5605 id = "miniCartTrigger"; 5606 } 5607 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5608 @RenderBlockList(subBlocks) 5609 </li>*@ 5610 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5611 5612 <li style="display: flex; align-items: center; margin-top: 19px;"> 5613 <div id="cartMiniApp"></div> 5614 </li> 5615 5616 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 5617 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new 5618 { 5619 //user data 5620 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO", 5621 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK", 5622 UserId = user?.ID, 5623 CustomerNumber = user?.CustomerNumber, 5624 5625 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True", 5626 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300", 5627 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True", 5628 5629 //site settings 5630 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 5631 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name, 5632 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"), 5633 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page 5634 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl) 5635 }); 5636 //this app is responsible for fetching all the user details required by all our vue.js apps to run 5637 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div> 5638 5639 //this app is responsible for handling events sent from legacy JS components, like food calendar 5640 <div id="legacyEventHandler" style="visibility: hidden" ></div> 5641 } 5642 5643 @helper RenderNoLayoutMiniCart() 5644 { 5645 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5646 <script> 5647 window.cartId = "@miniCartFeedPageId"; 5648 </script> 5649 } 5650 5651 @helper RenderMiniCartTriggerLabel() 5652 { 5653 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5654 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5655 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5656 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5657 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5658 5659 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="location.href = document.querySelector('[data-cart-page-link]').getAttribute('data-cart-page-link')" title="@Translate("Cart")"> 5660 <div class="u-inline u-position-relative"> 5661 <img src="/Files/Images/cart-svg.svg" /> 5662 @RenderMiniCartCounter() 5663 </div> 5664 </div> 5665 } 5666 5667 @helper RenderMiniCartTriggerLink() 5668 { 5669 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5670 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5671 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5672 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5673 5674 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5675 <span class="u-inline u-position-relative"> 5676 <i class="@cartIcon fa-1_5x"></i> 5677 @RenderMiniCartCounter() 5678 </span> 5679 </a> 5680 } 5681 5682 @helper RenderMiniCartCounter() 5683 { 5684 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5685 string cartProductsCount = Model.Cart.OrderlinesCount.ToString(); 5686 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5687 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5688 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5689 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5690 5691 if (showPrice && counterPosition == "right") 5692 { 5693 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5694 } 5695 5696 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5697 <span class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 5698 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.OrderlinesCount.ToString()"> 5699 @cartProductsCount @cartProductsTotalPrice 5700 </span> 5701 </span> 5702 </span> 5703 } 5704 5705 @helper RenderMiniCartCounterContent() 5706 { 5707 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5708 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5709 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5710 5711 <script id="MiniCartCounterContent" type="text/x-template"> 5712 {{#.}} 5713 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}"> 5714 @if (showPriceInMiniCartCounter) 5715 { 5716 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5717 } 5718 else 5719 { 5720 <text>{{numberoforderlines}}</text> 5721 } 5722 </span> 5723 {{/.}} 5724 </script> 5725 } 5726 5727 @helper RenderMiniCartDropdownLayout() 5728 { 5729 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5730 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5731 5732 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink"> 5733 <div class="mini-cart-dropdown__inner dw-mod"> 5734 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5735 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5736 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5737 </div> 5738 </div> 5739 </div> 5740 } 5741 5742 @helper RenderMiniCartPanelLayout() 5743 { 5744 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5745 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart"); 5746 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 5747 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5748 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 5749 var hideOnCartPageClass = GetPageIdByNavigationTag("CartPage") == Model.ID ? "u-hidden" : ""; 5750 var preventLoadOnProductList = GetPageIdByNavigationTag("ProductsPage") == Model.ID ? "data-init-onload=\"false\"" : ""; 5751 5752 <div class="mini-cart grid__cell dw-mod"> 5753 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5754 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-add-to-cart-id="@WebAPIAddToCartPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5755 <label for="miniCartTrigger" class="panel__close-btn u-hidden" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5756 <div class="panel__content u-full-width dw-mod"> 5757 <div class="panel_toggle_button @hideOnCartPageClass"> 5758 <button class="toggle-minicart btn btn--primary dw-mod" onclick="toggleMinicart(this)"> 5759 <i class="fas fa-arrow-alt-circle-left"></i> 5760 </button> 5761 </div> 5762 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart list")</h3> 5763 <div class=""> 5764 <div class="u-full-width dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 5765 <div class="dw-mod"> 5766 @Render(new Button 5767 { 5768 Title = Translate("Change Cart Name"), 5769 ButtonType = ButtonType.Button, 5770 ButtonLayout = ButtonLayout.None, 5771 CssClass = "u-margin-bottom change-cart-name", 5772 OnClick = "changeCartName()" 5773 }) 5774 @Render(new Button 5775 { 5776 Title = Translate("Create New Cart"), 5777 ButtonType = ButtonType.Button, 5778 ButtonLayout = ButtonLayout.Primary, 5779 CssClass = "u-full-width", 5780 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 5781 }) 5782 </div> 5783 </div> 5784 <div class="panel__content-body panel__content-body--cart dw-mod"> 5785 <div class="minicart-preloader-overlay" id="MiniCartOverlay"><div class="preloader-overlay__icon dw-mod" style="top: 0px;"></div></div> 5786 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" @preventLoadOnProductList></div> 5787 </div> 5788 </div> 5789 </div> 5790 </div> 5791 } 5792 5793 @helper RenderMiniCartModalLayout() 5794 { 5795 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5796 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5797 5798 <div class="mini-cart grid__cell dw-mod"> 5799 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5800 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5801 <label for="miniCartTrigger" class="modal-overlay"></label> 5802 <div class="modal modal--md modal--top-right dw-mod"> 5803 <div class="modal__body u-flex grid--direction-column dw-mod"> 5804 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5805 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5806 </div> 5807 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5808 </div> 5809 </div> 5810 </div> 5811 } 5812 5813 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5814 5815 @using System 5816 @using System.Web 5817 @using Dynamicweb.Rapido.Blocks.Extensibility 5818 @using Dynamicweb.Rapido.Blocks 5819 5820 @{ 5821 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5822 5823 Block masterDesktopActionsMenuOrderDraft = new Block 5824 { 5825 Id = "MasterDesktopActionsMenuOrderDraft", 5826 SortId = 40, 5827 Template = RenderOrderDraft() 5828 }; 5829 5830 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5831 { 5832 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5833 } 5834 } 5835 5836 @helper RenderOrderDraft() 5837 { 5838 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5839 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5840 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5841 5842 5843 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5844 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5845 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5846 5847 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5848 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5849 <span class="u-inline u-position-relative"> 5850 <i class="@draftIcon fa-1_5x"></i> 5851 </span> 5852 </a> 5853 </li> 5854 } 5855 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5856 5857 @using System 5858 @using System.Web 5859 @using Dynamicweb.Rapido.Blocks.Extensibility 5860 @using Dynamicweb.Rapido.Blocks 5861 5862 @{ 5863 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5864 5865 Block masterDesktopActionsMenuDownloadCart = new Block 5866 { 5867 Id = "MasterDesktopActionsMenuDownloadCart", 5868 SortId = 50, 5869 Template = RenderDownloadCart() 5870 }; 5871 5872 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5873 { 5874 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5875 } 5876 } 5877 5878 @helper RenderDownloadCart() 5879 { 5880 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5881 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5882 5883 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5884 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5885 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5886 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5887 5888 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5889 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5890 <span class="u-inline u-position-relative"> 5891 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5892 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5893 </span> 5894 </a> 5895 </li> 5896 } 5897 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5898 5899 @using System 5900 @using System.Web 5901 @using Dynamicweb.Rapido.Blocks.Extensibility 5902 @using Dynamicweb.Rapido.Blocks 5903 5904 @functions { 5905 public class SearchConfiguration 5906 { 5907 public string searchFeedId { get; set; } 5908 public string searchSecondFeedId { get; set; } 5909 public int groupsFeedId { get; set; } 5910 public string resultPageLink { get; set; } 5911 public string searchPlaceholder { get; set; } 5912 public string searchType { get; set; } 5913 public string searchTemplate { get; set; } 5914 public string searchContentTemplate { get; set; } 5915 public string searchValue { get; set; } 5916 public bool showGroups { get; set; } 5917 5918 public SearchConfiguration() 5919 { 5920 searchFeedId = ""; 5921 searchSecondFeedId = ""; 5922 searchType = "product-search"; 5923 searchContentTemplate = ""; 5924 showGroups = true; 5925 } 5926 } 5927 } 5928 @{ 5929 Block masterSearchBar = new Block 5930 { 5931 Id = "MasterSearchBar", 5932 SortId = 40, 5933 Template = RenderSearch("bar"), 5934 Design = new Design 5935 { 5936 Size = "auto", 5937 HidePadding = true, 5938 RenderType = RenderType.Column 5939 } 5940 }; 5941 5942 Block masterSearchAction = new Block 5943 { 5944 Id = "MasterDesktopActionsMenuSearch", 5945 SortId = 10, 5946 Template = RenderSearch() 5947 }; 5948 5949 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5950 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5951 } 5952 5953 @helper RenderSearch(string type = "mini-search") 5954 { 5955 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5956 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 5957 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5958 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5959 5960 SearchConfiguration searchConfiguration = null; 5961 5962 switch (searchType) { 5963 case "contentSearch": 5964 searchConfiguration = new SearchConfiguration() { 5965 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5966 resultPageLink = contentSearchPageLink, 5967 searchPlaceholder = Translate("Search page"), 5968 groupsFeedId = 0, 5969 searchType = "content-search", 5970 searchTemplate = "SearchPagesTemplate", 5971 showGroups = false 5972 }; 5973 break; 5974 case "combinedSearch": 5975 searchConfiguration = new SearchConfiguration() { 5976 searchFeedId = productsPageId + "&feed=true", 5977 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5978 resultPageLink = Converter.ToString(productsPageId), 5979 searchPlaceholder = Translate("Search products or pages"), 5980 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5981 searchType = "combined-search", 5982 searchTemplate = "SearchProductsTemplateWrap", 5983 searchContentTemplate = "SearchPagesTemplateWrap", 5984 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5985 }; 5986 break; 5987 default: //productSearch 5988 searchConfiguration = new SearchConfiguration() { 5989 resultPageLink = Converter.ToString(productsPageId), 5990 searchFeedId = searchPageId + "&feed=true", 5991 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5992 searchPlaceholder = Translate("Search products"), 5993 searchTemplate = "SearchProductsTemplate", 5994 searchType = "product-search", 5995 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5996 }; 5997 break; 5998 } 5999 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 6000 6001 if (type == "mini-search") { 6002 @RenderMiniSearch(searchConfiguration) 6003 } else { 6004 @RenderSearchBar(searchConfiguration) 6005 } 6006 } 6007 6008 @helper RenderSearchBar(SearchConfiguration options) 6009 { 6010 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 6011 data-page-size="7" 6012 data-search-feed-id="@options.searchFeedId" 6013 data-search-second-feed-id="@options.searchSecondFeedId" 6014 data-result-page-id="@options.resultPageLink" 6015 data-groups-page-id="@options.groupsFeedId" 6016 data-search-type="@options.searchType"> 6017 @if (options.showGroups) 6018 { 6019 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button> 6020 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul> 6021 } 6022 <div class="typeahead-search-field"> 6023 <input type="text" class="u-no-margin u-full-width search-ahead__input js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 6024 @* 6025 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"><i class="fas fa-times"></i></button> 6026 *@ 6027 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 6028 { 6029 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 6030 } 6031 else 6032 { 6033 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 6034 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div> 6035 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div> 6036 </div> 6037 } 6038 </div> 6039 <button type="button" class="search-icon-desktop js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 6040 </div> 6041 } 6042 6043 @helper RenderMiniSearch(SearchConfiguration options) 6044 { 6045 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6046 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 6047 6048 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon"> 6049 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 6050 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 6051 </div> 6052 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 6053 <div class="typeahead js-typeahead" id="ProductSearchBar" 6054 data-page-size="7" 6055 data-search-feed-id="@options.searchFeedId" 6056 data-search-second-feed-id="@options.searchSecondFeedId" 6057 data-result-page-id="@options.resultPageLink" 6058 data-search-type="@options.searchType"> 6059 <div class="typeahead-search-field"> 6060 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 6061 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 6062 { 6063 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 6064 } 6065 else 6066 { 6067 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 6068 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></div> 6069 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div> 6070 </div> 6071 } 6072 </div> 6073 </div> 6074 </div> 6075 </li> 6076 } 6077 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6078 6079 @using System 6080 @using System.Web 6081 @using Dynamicweb.Rapido.Blocks.Extensibility 6082 @using Dynamicweb.Rapido.Blocks 6083 6084 @{ 6085 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6086 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 6087 6088 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 6089 6090 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 6091 headerConfigurationPage.RemoveBlock(configDesktopLogo); 6092 6093 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 6094 headerConfigurationPage.RemoveBlock(configDesktopMenu); 6095 6096 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 6097 headerConfigurationPage.RemoveBlock(configSearchBar); 6098 6099 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 6100 headerConfigurationPage.RemoveBlock(configSearchAction); 6101 6102 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 6103 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 6104 6105 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 6106 6107 switch (headerConfigurationTopLayout) 6108 { 6109 case "condensed": //2 6110 configDesktopLogo.Design.Size = "auto-width"; 6111 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6112 6113 configDesktopMenu.SortId = 20; 6114 configDesktopMenu.Design.Size = "auto"; 6115 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6116 6117 configDesktopActionsMenu.SortId = 30; 6118 configDesktopActionsMenu.Design.Size = "auto-width"; 6119 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6120 6121 if (!headerConfigurationHideSearch) 6122 { 6123 configSearchBar.SortId = 40; 6124 configSearchBar.Design.Size = "12"; 6125 configDesktopExtra.SortId = 50; 6126 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6127 } 6128 break; 6129 case "splitted": //3 6130 configDesktopLogo.Design.Size = "auto"; 6131 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6132 6133 if (!headerConfigurationHideSearch) 6134 { 6135 configSearchBar.SortId = 20; 6136 configSearchBar.Design.Size = "auto"; 6137 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6138 } 6139 6140 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6141 6142 configDesktopActionsMenu.SortId = 20; 6143 configDesktopActionsMenu.Design.Size = "auto-width"; 6144 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6145 break; 6146 case "splitted-center": //4 6147 configDesktopLogo.Design.Size = "auto"; 6148 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6149 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6150 6151 configDesktopActionsMenu.SortId = 30; 6152 configDesktopActionsMenu.Design.Size = "auto-width"; 6153 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6154 6155 if (!headerConfigurationHideSearch) 6156 { 6157 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6158 } 6159 break; 6160 case "minimal": //5 6161 configDesktopLogo.Design.Size = "auto-width"; 6162 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6163 6164 configDesktopMenu.Design.Size = "auto"; 6165 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6166 6167 configDesktopActionsMenu.SortId = 20; 6168 configDesktopActionsMenu.Design.Size = "auto-width"; 6169 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6170 6171 if (!headerConfigurationHideSearch) 6172 { 6173 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6174 } 6175 break; 6176 case "minimal-center": //6 6177 configDesktopLogo.Design.Size = "auto-width"; 6178 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6179 6180 configDesktopMenu.Design.Size = "auto"; 6181 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6182 6183 configDesktopActionsMenu.SortId = 20; 6184 configDesktopActionsMenu.Design.Size = "auto-width"; 6185 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6186 6187 if (!headerConfigurationHideSearch) 6188 { 6189 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6190 } 6191 break; 6192 case "minimal-right": //7 6193 configDesktopLogo.Design.Size = "auto-width"; 6194 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6195 6196 configDesktopMenu.Design.Size = "auto"; 6197 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6198 6199 configDesktopActionsMenu.SortId = 20; 6200 configDesktopActionsMenu.Design.Size = "auto-width"; 6201 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6202 6203 if (!headerConfigurationHideSearch) 6204 { 6205 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6206 } 6207 break; 6208 case "two-lines": //8 6209 configDesktopLogo.Design.Size = "auto"; 6210 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6211 6212 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6213 6214 configDesktopActionsMenu.SortId = 20; 6215 configDesktopActionsMenu.Design.Size = "auto-width"; 6216 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6217 6218 if (!headerConfigurationHideSearch) 6219 { 6220 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6221 } 6222 break; 6223 case "two-lines-centered": //9 6224 configDesktopLogo.Design.Size = "auto"; 6225 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6226 6227 configDesktopMenu.Design.Size = "auto-width"; 6228 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6229 6230 configDesktopActionsMenu.SortId = 20; 6231 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6232 6233 if (!headerConfigurationHideSearch) 6234 { 6235 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6236 } 6237 break; 6238 case "normal": //1 6239 default: 6240 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6241 6242 if (!headerConfigurationHideSearch) 6243 { 6244 configSearchBar.SortId = 20; 6245 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6246 } 6247 6248 configDesktopActionsMenu.SortId = 30; 6249 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6250 6251 configDesktopActionsMenu.Design.Size = "auto-width"; 6252 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6253 break; 6254 } 6255 } 6256 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6257 6258 @using System 6259 @using System.Web 6260 @using Dynamicweb.Rapido.Blocks.Extensibility 6261 @using Dynamicweb.Rapido.Blocks 6262 6263 @{ 6264 Block masterCustomDesktopActionsMenuSignIn = new Block 6265 { 6266 Id = "MasterDesktopActionsMenuSignIn", 6267 SortId = 20, 6268 Template = RenderCustomSignIn() 6269 }; 6270 6271 BlocksPage.GetBlockPage("Master").ReplaceBlock(masterCustomDesktopActionsMenuSignIn); 6272 } 6273 6274 @helper RenderCustomSignIn() 6275 { 6276 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 6277 string userInitials = ""; 6278 int pageId = GetPageIdByNavigationTag("SignInPage"); 6279 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 6280 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 6281 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 6282 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 6283 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 6284 int myDeviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 6285 int myDeviationsAdminPageId = GetPageIdByNavigationTag("DeviationsAdminHistoryPage"); 6286 //int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 6287 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 6288 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 6289 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 6290 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 6291 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 6292 int recipeBankPageId = GetPageIdByNavigationTag("MenuView"); 6293 int menuCalendarPageId = GetPageIdByNavigationTag("MenuCalendarView"); 6294 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 6295 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 6296 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 6297 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 6298 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 6299 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 6300 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 6301 6302 string linkStart = "/Default.aspx?ID="; 6303 if (Model.CurrentUser.ID <= 0) 6304 { 6305 linkStart += signInProfilePageId + "&RedirectPageId="; 6306 } 6307 6308 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 6309 string myProfilePageLink = linkStart + myProfilePageId; 6310 string myOrdersPageLink = linkStart + myOrdersPageId; 6311 string announcementPageLink = linkStart + announcementPageId; 6312 string myDeviationsPageLink = linkStart + myDeviationsPageId; 6313 string myReportsPageLink = linkStart + myReportsPageId; 6314 string myDeviationsAdminPageLink = linkStart + myDeviationsAdminPageId; 6315 string myFavoritesPageLink = linkStart + myFavoritesPageId + "&loadLists=true"; 6316 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 6317 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 6318 string recipeBankPageLink = linkStart + recipeBankPageId; 6319 string menuCalendarPageLink = linkStart + menuCalendarPageId; 6320 6321 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 6322 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "far fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 6323 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 6324 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 6325 6326 if (Model.CurrentUser.ID != 0) 6327 { 6328 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 6329 } 6330 6331 if (!navigationItemsHideSignIn) 6332 { 6333 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6334 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 6335 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 6336 bool promptForAccount = getPromptForAccount(); 6337 string createPageId = GetPageIdByNavigationTag("CreateAccount").ToString(); 6338 string createPageUrl = "/Default.aspx?Id=" + createPageId; 6339 bool isUserAnonymous = string.IsNullOrWhiteSpace(Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser()?.UserName.ToString()); 6340 var user = Pageview.User; 6341 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 6342 var userCompany = Model.CurrentUser.Company; 6343 bool isRmaAdmin = userCompany != null && userCompany.ToLower() == "kraemer"; 6344 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 6345 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 6346 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 6347 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 6348 6349 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 6350 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 6351 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 6352 6353 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6354 <div class="@menuLinkClass dw-mod"> 6355 @if (Model.CurrentUser.ID <= 0) 6356 { 6357 @*<i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>*@ 6358 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 6359 6360 @*this app is responsible for setting all the settings for anonymous users in vue.js apps*@ 6361 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new 6362 { 6363 //user data 6364 CountryCode = "NO", 6365 CurrencyCode = "NOK", 6366 ShowNumberOfCartons = false, 6367 SendShipOwner = false, 6368 SendOnlySeeDiverse = false, 6369 6370 //site settings 6371 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 6372 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name, 6373 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"), 6374 CheckoutPageUrl = "", 6375 MinicartAvailable = false 6376 }); 6377 6378 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div> 6379 } 6380 else 6381 { 6382 <div class="user-menu u-flex headerIcons" data-user-type-food-calendar="@isFoodCalendarAdmin"> 6383 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon, "/Files/Images/favorite-list-svg.svg") 6384 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list", "/Files/Images/order-history-svg.svg") 6385 @if (hasAccessToAnnouncements) 6386 { 6387 @* 6388 @RenderMenuIcon(announcementPageLink, Translate("Announcements"), "fas fa-list", "/Files/Images/notifications.svg") 6389 *@ 6390 <div class="u-margin-right--lg"> 6391 <a href="@announcementPageLink" class="u-brand-color-two bs-position-relative" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 6392 <img src="/Files/Images/notifications.svg"> 6393 <svg class="announcement_notification-dot bs-position-absolute bs-bottom-0 bs-end-0 @announcementNotificationDotClass" style="top: 45%;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 6394 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30" /> 6395 </svg> 6396 </a> 6397 </div> 6398 } 6399 @if (hasAccessToFoodCalendar) 6400 { 6401 @RenderMenuIcon(recipeBankPageLink, Translate("Matretter"), "fas fa-list", "/Files/Images/food-calendar.svg") 6402 } 6403 @if (isFoodCalendarAdmin) 6404 { 6405 @RenderMenuIcon(menuCalendarPageLink, Translate("Kalendervisning"), "fas fa-list", "/Files/Images/food-calendar-menu-calendar.svg") 6406 } 6407 6408 @if (isRmaAdmin) 6409 { 6410 @RenderMenuIcon(myDeviationsAdminPageLink, Translate("Admin RMA"), "fas fa-list", "/Files/Images/unionRMA-Admin-icon.svg") 6411 } 6412 else 6413 { 6414 @RenderMenuIcon(myDeviationsPageLink, Translate("My Deviations"), "fas fa-list", "/Files/Images/UnionRMA-icon.svg") 6415 } 6416 @if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 6417 { 6418 @RenderMenuIcon(myReportsPageLink, Translate("My report"), "fas fa-list", "/Files/Images/IconPowerBi.svg") 6419 } 6420 6421 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon, "/Files/Images/my-account-svg.svg") 6422 6423 @*@if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6424 { 6425 <div class="u-margin-right"> 6426 <a href="/" class="u-color-inherit" testc onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"> 6427 <img src="/Files/Images/log-out-svg.svg"/> 6428 </a> 6429 </div> 6430 } 6431 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6432 { 6433 6434 <div class="u-margin-right"> 6435 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"> 6436 <img src="/Files/Images/log-out-svg.svg"/> 6437 </div> 6438 </div> 6439 6440 } 6441 else 6442 {*@ 6443 <div class="u-margin-right--lg" testd> 6444 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="logOutPrimaryUser(event, this);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')" class="u-brand-color-two" title="@Translate("Sign out")"> 6445 <img src="/Files/Images/log-out-svg.svg" alt="sign out"> 6446 </a> 6447 </div> 6448 @*}*@ 6449 6450 </div> 6451 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 6452 } 6453 </div> 6454 <div class="menu menu--dropdown menu--dropdown-right menu--dropdown-right--custom menu--sign-in grid__cell dw-mod"> 6455 <ul class="list list--clean dw-mod"> 6456 @if (Model.CurrentUser.ID <= 0) 6457 { 6458 if (!hideCreateAccountLink) 6459 { 6460 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")) 6461 ; 6462 } 6463 if (!hideForgotPasswordLink) 6464 { 6465 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 6466 } 6467 @*if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6468 { 6469 @RenderSeparator() 6470 }*@ 6471 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true) 6472 } 6473 else 6474 { 6475 if (!hideMyProfileLink) 6476 { 6477 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 6478 } 6479 if (!hideMyOrdersLink) 6480 { 6481 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 6482 } 6483 if (!hideMyFavoritesLink) 6484 { 6485 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 6486 } 6487 if (!hideMySavedCardsLink) 6488 { 6489 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 6490 } 6491 if (!hideMyOrderDraftsLink) 6492 { 6493 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 6494 } 6495 } 6496 6497 @if (Model.CurrentUser.ID > 0) 6498 { 6499 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6500 { 6501 @RenderSeparator() 6502 } 6503 6504 //Check if impersonation is on 6505 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6506 { 6507 <li> 6508 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 6509 @Translate("Sign out") 6510 </div> 6511 </li> 6512 } 6513 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6514 { 6515 <li> 6516 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 6517 @Translate("Sign out") 6518 </a> 6519 </li> 6520 } 6521 else 6522 { 6523 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 6524 } 6525 } 6526 </ul> 6527 </div> 6528 </li> 6529 if (isUserAnonymous) 6530 { 6531 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6532 <a class="btn btn--primary btn--full u-no-margin create-account__button" href="@createPageUrl">@Translate("Bli kunde")</a> 6533 </li> 6534 } 6535 } 6536 } 6537 6538 @helper RenderMenuIcon(string link, string title, string icon = null, string iconSource = null) 6539 { 6540 <div class="u-margin-right--lg"> 6541 <a href="@link" class="u-brand-color-two" title="@title"> 6542 <img src="@iconSource"> 6543 </a> 6544 </div> 6545 } 6546 6547 6548 6549 6550 @helper RenderDesktopTools() 6551 { 6552 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 6553 6554 <div class="tools-navigation dw-mod"> 6555 <div class="center-container grid top-container__center-container dw-mod"> 6556 @RenderBlockList(subBlocks) 6557 </div> 6558 </div> 6559 } 6560 6561 @helper RenderDesktopToolsText() 6562 { 6563 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 6564 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 6565 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 6566 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 6567 string userName = userExists ? getUserName(Pageview.User) : ""; 6568 int secondaryUsersCount = Model.SecondaryUsers.Count; 6569 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 6570 bool promptForAccount = getPromptForAccount(); 6571 <div class="u-flex u-flex--align-center u-justify-between" style="min-height: 30px"> 6572 @if (userExists) 6573 { 6574 <div class="u-margin-top u-margin-bottom u-flex u-flex--align-center"> 6575 @if (secondaryUsersCount > 0) 6576 { 6577 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6578 { 6579 <div class="u-margin-right" data-prompt-account="@promptForAccount">@userName</div> 6580 @*if (secondaryUsersCount > 1) { 6581 @Render(new Button 6582 { 6583 ButtonType = ButtonType.Button, 6584 ButtonLayout = ButtonLayout.LinkClean, 6585 Title = Translate("Bytt konto"), 6586 Icon = new Icon { 6587 Name = "fa-sign-out", 6588 Prefix = "fal", 6589 LabelPosition = IconLabelPosition.Before 6590 }, 6591 OnClick = "renderImpersonationList(true)", 6592 CssClass = "u-no-margin" 6593 }) 6594 }*@ 6595 // if (secondaryUsersCount > 1) 6596 // { 6597 @RenderImpersonationDropdown(impersonationListFeedPageId) 6598 // } 6599 } 6600 else 6601 { 6602 <div class="u-margin-right" style="text-transform: uppercase"><span>@Model.CurrentUser.Name</span></div> 6603 @RenderImpersonationDropdown(impersonationListFeedPageId) 6604 } 6605 } 6606 6607 </div> 6608 if (!string.IsNullOrEmpty(customerNumber)) 6609 { 6610 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 6611 { 6612 <div> 6613 @Translate("currentLocation") <span class="location-space"></span> 6614 @Render(new Button 6615 { 6616 ButtonType = ButtonType.Button, 6617 ButtonLayout = ButtonLayout.None, 6618 Title = Translate("Change Location"), 6619 CssClass = "u-no-margin", 6620 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true" 6621 }) 6622 </div> 6623 } 6624 } 6625 } 6626 6627 6628 </div> 6629 } 6630 6631 @helper RenderImpersonationDropdown(string impersonationListFeedPageId) 6632 { 6633 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 6634 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 6635 var hideSelfOption = ReturnCustomFieldValue("AccessUser_HideSelf"); 6636 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-primary-user="@Model.CurrentUser.Name" data-secondary-user="@Model.CurrentSecondaryUser.Name"> 6637 <input type="hidden" name="DwExtranetRemoveSecondaryUser"/> 6638 </form> 6639 6640 <div class="impersonation-container"> 6641 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/> 6642 <div class="dropdown variants-filters dw-mod"> 6643 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 6644 <div class="dropdown__content u-padding dw-mod"> 6645 <div class="dropdown__item__filter"> 6646 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 6647 </div> 6648 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 6649 </div> 6650 </div> 6651 </div> 6652 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 6653 </div> 6654 6655 6656 6657 } 6658 6659 @helper RenderDesktopToolsNavigation() 6660 { 6661 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 6662 6663 if (renderPagesInToolBar) 6664 { 6665 @RenderNavigation(new 6666 { 6667 id = "topToolsNavigation", 6668 cssclass = "menu menu-tools dw-mod dwnavigation", 6669 template = "TopMenu.xslt" 6670 }) 6671 } 6672 } 6673 6674 @helper RenderDesktopNavigation() 6675 { 6676 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 6677 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6678 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 6679 <nav class="main-navigation dw-mod"> 6680 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 6681 @RenderBlockList(subBlocks) 6682 </div> 6683 </nav> 6684 } 6685 6686 @helper RenderDesktopExtra() 6687 { 6688 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 6689 6690 if (subBlocks.Count > 0) 6691 { 6692 <div class="header header-top dw-mod"> 6693 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 6694 @RenderBlockList(subBlocks) 6695 </div> 6696 </div> 6697 } 6698 }</text> 6699 } 6700 6701 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6702 6703 @using System 6704 @using System.Web 6705 @using Dynamicweb.Rapido.Blocks.Extensibility 6706 @using Dynamicweb.Rapido.Blocks 6707 @using Dynamicweb.Rapido.Blocks.Components.General 6708 @using Dynamicweb.Frontend 6709 6710 @functions { 6711 int impersonationPageId; 6712 string impersonationLayout; 6713 int impersonationFeed; 6714 Block impersonationBar; 6715 6716 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 6717 { 6718 string username = ""; 6719 6720 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 6721 { 6722 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 6723 } 6724 else if (!string.IsNullOrEmpty(name)) 6725 { 6726 username = name; 6727 } 6728 else if (!string.IsNullOrEmpty(email)) 6729 { 6730 username = email; 6731 } 6732 else 6733 { 6734 username = userName; 6735 } 6736 return username; 6737 } 6738 6739 string getUserName(UserViewModel user) 6740 { 6741 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6742 } 6743 6744 string getUserName(Dynamicweb.Security.UserManagement.User user) 6745 { 6746 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6747 } 6748 } 6749 6750 @{ 6751 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 6752 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 6753 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 6754 6755 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0 && 2==1) 6756 { 6757 impersonationBar = new Block 6758 { 6759 Id = "ImpersonationBar", 6760 SortId = 50, 6761 Template = RenderImpersonation(), 6762 SkipRenderBlocksList = true, 6763 Design = new Design 6764 { 6765 Size = "auto-width", 6766 HidePadding = true, 6767 RenderType = RenderType.Column 6768 } 6769 }; 6770 6771 if (impersonationLayout == "top-bar") { 6772 impersonationBar.SortId = 9; 6773 } 6774 6775 Block impersonationContent = new Block 6776 { 6777 Id = "ImpersonationContent", 6778 SortId = 20 6779 }; 6780 6781 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6782 { 6783 //Render stop impersonation view 6784 impersonationContent.Template = RenderStopImpersonationView(); 6785 6786 6787 Modal stopImpersonation = new Modal 6788 { 6789 Id = "StopImpersonation", 6790 Heading = new Heading { 6791 Level = 2, 6792 Title = Translate("Sign out"), 6793 Icon = new Icon { 6794 Name = "fa-sign-out", 6795 Prefix = "fas", 6796 LabelPosition = IconLabelPosition.After 6797 } 6798 }, 6799 Width = ModalWidth.Sm, 6800 BodyTemplate = RenderStopImpersonationForm() 6801 }; 6802 6803 Block stopImpersonationBlock = new Block 6804 { 6805 Id = "StopImpersonationBlock", 6806 SortId = 10, 6807 Component = stopImpersonation 6808 }; 6809 impersonationBar.BlocksList.Add(stopImpersonationBlock); 6810 } 6811 else 6812 { 6813 //Render main view 6814 switch (impersonationLayout) 6815 { 6816 case "right-lower-box": 6817 impersonationContent.BlocksList.Add( 6818 new Block { 6819 Id = "RightLowerBoxHeader", 6820 SortId = 10, 6821 Component = new Heading { 6822 Level = 5, 6823 Title = Translate("View the list of users you can sign in as"), 6824 CssClass = "impersonation-text" 6825 } 6826 } 6827 ); 6828 impersonationContent.BlocksList.Add( 6829 new Block { 6830 Id = "RightLowerBoxContent", 6831 SortId = 20, 6832 Template = RenderImpersonationControls() 6833 } 6834 ); 6835 break; 6836 case "right-lower-bar": 6837 impersonationContent.BlocksList.Add( 6838 new Block { 6839 Id = "RightLowerBarContent", 6840 SortId = 10, 6841 Template = RenderImpersonationControls() 6842 } 6843 ); 6844 break; 6845 case "bar": 6846 default: 6847 impersonationContent.BlocksList.Add( 6848 new Block { 6849 Id = "ViewListLink", 6850 SortId = 20, 6851 Template = RenderViewListLink() 6852 } 6853 ); 6854 impersonationContent.BlocksList.Add( 6855 new Block { 6856 Id = "BarTypeaheadSearch", 6857 SortId = 30, 6858 Template = RenderTypeaheadSearch() 6859 } 6860 ); 6861 break; 6862 } 6863 } 6864 impersonationBar.BlocksList.Add(impersonationContent); 6865 6866 impersonationBar.BlocksList.Add( 6867 new Block 6868 { 6869 Id = "ImpersonationSearchTemplates", 6870 SortId = 30, 6871 Template = RenderSearchResultTemplate() 6872 } 6873 ); 6874 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 6875 { 6876 impersonationBar.BlocksList.Add( 6877 new Block 6878 { 6879 Id = "ImpersonationSearchScripts", 6880 SortId = 40, 6881 Template = RenderSearchScripts() 6882 } 6883 ); 6884 } 6885 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6886 } 6887 } 6888 6889 @helper RenderImpersonation() 6890 { 6891 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6892 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6893 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6894 @if (impersonationLayout == "right-lower-box") 6895 { 6896 @RenderRightLowerBoxHeader() 6897 } 6898 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6899 @*Impersonation*@ 6900 @RenderBlockList(subBlocks) 6901 </div> 6902 </div> 6903 } 6904 6905 @helper RenderRightLowerBoxHeader() 6906 { 6907 <div class="impersonation__header dw-mod"> 6908 <div class="impersonation__title">@Translate("Impersonation")</div> 6909 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6910 @Render(new Icon 6911 { 6912 Prefix = "fas", 6913 Name = "fa-window-minimize" 6914 }) 6915 </label> 6916 </div> 6917 } 6918 6919 @helper RenderStopImpersonationView() 6920 { 6921 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6922 string userName = getUserName(Pageview.User); 6923 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> "; 6924 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText; 6925 6926 if (impersonationLayout == "right-lower-box") 6927 { 6928 <div class="u-margin-bottom--lg u-ta-center"> 6929 @impersonationText 6930 </div> 6931 <div class="u-margin-bottom--lg u-ta-center"> 6932 @RenderSwitchAccountButton() 6933 </div> 6934 @RenderStopImpersonationButton() 6935 } 6936 else 6937 { 6938 <div class="grid grid--align-center impersonation__stop-wrap"> 6939 <div class="impersonation-bar-item dw-mod"> 6940 @impersonationText 6941 </div> 6942 <div class="impersonation-bar-item dw-mod"> 6943 @RenderSwitchAccountButton() 6944 </div> 6945 <div class="impersonation-bar-item dw-mod"> 6946 @RenderStopImpersonationButton() 6947 </div> 6948 </div> 6949 } 6950 } 6951 6952 @helper RenderSwitchAccountButton() { 6953 @Render(new Button 6954 { 6955 Href = "/Default.aspx?ID=" + impersonationPageId, 6956 ButtonLayout = ButtonLayout.LinkClean, 6957 Title = Translate("Switch account"), 6958 Icon = new Icon { 6959 Name = "fa-users", 6960 Prefix = "fal", 6961 LabelPosition = IconLabelPosition.After 6962 }, 6963 CssClass = "u-no-margin u-color-inherit" 6964 }) 6965 } 6966 6967 @helper RenderStopImpersonationForm() 6968 { 6969 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6970 string userName = getUserName(Pageview.User); 6971 int pageId = Model.TopPage.ID; 6972 6973 <form method="post" class="u-no-margin"> 6974 @Render(new Button 6975 { 6976 ButtonType = ButtonType.Submit, 6977 ButtonLayout = ButtonLayout.Primary, 6978 Title = Translate("Sign out as") + " " + userName, 6979 OnClick = "logOutImpersonationActions();location.href='/';", 6980 CssClass = "btn--full", 6981 Name = "DwExtranetRemoveSecondaryUser", 6982 }) 6983 </form> 6984 @Render(new Button 6985 { 6986 ButtonType = ButtonType.Button, 6987 ButtonLayout = ButtonLayout.Primary, 6988 Title = Translate("Sign out as") + " " + secondaryUserName, 6989 CssClass = "btn--full", 6990 OnClick = "logOutPrimaryUser(event, this)" 6991 }) 6992 6993 } 6994 6995 @helper RenderStopImpersonationButton() { 6996 @Render(new Button 6997 { 6998 ButtonType = ButtonType.Button, 6999 ButtonLayout = ButtonLayout.LinkClean, 7000 Title = Translate("Sign out"), 7001 Icon = new Icon { 7002 Name = "fa-sign-out", 7003 Prefix = "fal", 7004 LabelPosition = IconLabelPosition.After 7005 }, 7006 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 7007 CssClass = "u-no-margin" 7008 }) 7009 } 7010 7011 @helper RenderImpersonationControls() 7012 { 7013 <div class="impersonation__controls"> 7014 @RenderViewListLink() 7015 @RenderSearchBox() 7016 </div> 7017 @RenderResultsList() 7018 } 7019 7020 @helper RenderViewListLink() 7021 { 7022 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 7023 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 7024 7025 @Render(new Link { 7026 ButtonLayout = ButtonLayout.None, 7027 Title = title, 7028 Href = "/Default.aspx?ID=" + impersonationPageId, 7029 CssClass = buttonClasses 7030 }) 7031 } 7032 7033 @helper RenderSearchBox() 7034 { 7035 <div class="impersonation__search-wrap"> 7036 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 7037 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 7038 <i class="fal fa-search"></i> 7039 </div> 7040 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 7041 <i class="fal fa-times"></i> 7042 </div> 7043 </div> 7044 } 7045 7046 @helper RenderTypeaheadSearch() 7047 { 7048 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 7049 data-page-size="5" 7050 data-search-feed-id="@impersonationFeed" 7051 data-result-page-id="@impersonationPageId" 7052 data-search-type="user-search" 7053 data-search-parameter-name="q"> 7054 7055 <div class="typeahead-search-field"> 7056 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 7057 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul> 7058 </div> 7059 </div> 7060 } 7061 7062 @helper RenderResultsList() 7063 { 7064 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul> 7065 } 7066 7067 @helper RenderSearchResultTemplate() 7068 { 7069 <script id="ImpersonationSearchResult" type="text/x-template"> 7070 {{#.}} 7071 {{#Users}} 7072 <li class="impersonation__search-results-item impersonation-user"> 7073 <form method="post" class="impersonation-user__form" name="account{{id}}"> 7074 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 7075 <div class="impersonation-user__info"> 7076 <div class="impersonation-user__name">{{userName}}</div> 7077 <div class="impersonation-user__number">{{customerNumber}}</div> 7078 </div> 7079 @Render(new Button 7080 { 7081 ButtonType = ButtonType.Submit, 7082 ButtonLayout = ButtonLayout.Secondary, 7083 Title = Translate("Sign in as"), 7084 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 7085 }) 7086 </form> 7087 </li> 7088 {{/Users}} 7089 {{#unless Users}} 7090 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 7091 @Translate("Your search gave 0 results") 7092 </li> 7093 {{/unless}} 7094 {{/.}} 7095 </script> 7096 } 7097 7098 @helper RenderSearchScripts() 7099 { 7100 <script> 7101 let inputDelayTimer; 7102 function searchKeyUpHandler(e) { 7103 clearTimeout(inputDelayTimer); 7104 let value = e.target.value; 7105 if (value != "") { 7106 inputDelayTimer = setTimeout(function () { 7107 updateResults(value); 7108 }, 500); 7109 } else { 7110 clearResults(); 7111 } 7112 }; 7113 7114 function updateResults(value) { 7115 if (value == "") { 7116 return null; 7117 } 7118 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 7119 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 7120 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 7121 } 7122 7123 function clearResults() { 7124 document.getElementById("ImpersonationBoxSearchField").value = ""; 7125 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 7126 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 7127 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 7128 } 7129 </script> 7130 } 7131 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7132 7133 @using System 7134 @using System.Web 7135 @using System.Collections.Generic 7136 @using Dynamicweb.Rapido.Blocks.Extensibility 7137 @using Dynamicweb.Rapido.Blocks 7138 7139 @{ 7140 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 7141 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 7142 7143 Block orderLines = new Block 7144 { 7145 Id = "MiniCartOrderLines", 7146 SkipRenderBlocksList = true, 7147 BlocksList = new List<Block> 7148 { 7149 new Block { 7150 Id = "MiniCartOrderLinesList", 7151 SortId = 20, 7152 Template = RenderMiniCartOrderLinesList() 7153 } 7154 } 7155 }; 7156 7157 Block orderlinesScriptTemplates = new Block 7158 { 7159 Id = "OrderlinesScriptTemplates" 7160 }; 7161 7162 if (orderlinesView == "table") 7163 { 7164 orderLines.Template = RenderMiniCartOrderLinesTable(); 7165 orderLines.BlocksList.Add( 7166 new Block 7167 { 7168 Id = "MiniCartOrderlinesTableHeader", 7169 SortId = 10, 7170 Template = RenderMiniCartOrderLinesHeader() 7171 } 7172 ); 7173 7174 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 7175 } 7176 else 7177 { 7178 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 7179 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 7180 } 7181 7182 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 7183 7184 Block miniCartScriptTemplates = new Block() 7185 { 7186 Id = "MasterMiniCartTemplates", 7187 SortId = 1, 7188 Template = RenderMiniCartScriptTemplates(), 7189 SkipRenderBlocksList = true, 7190 BlocksList = new List<Block> 7191 { 7192 orderLines, 7193 new Block { 7194 Id = "MiniCartFooter", 7195 Template = RenderMiniCartFooter(), 7196 SortId = 50, 7197 SkipRenderBlocksList = true, 7198 BlocksList = new List<Block> 7199 { 7200 new Block { 7201 Id = "MiniCartSubTotal", 7202 Template = RenderMiniCartSubTotal(), 7203 SortId = 30 7204 }, 7205 new Block { 7206 Id = "MiniCartFees", 7207 Template = RenderMiniCartFees(), 7208 SortId = 40 7209 }, 7210 new Block { 7211 Id = "MiniCartPoints", 7212 Template = RenderMiniCartPoints(), 7213 SortId = 50 7214 }, 7215 new Block { 7216 Id = "MiniCartTotal", 7217 Template = RenderMiniCartTotal(), 7218 SortId = 60 7219 }, 7220 new Block { 7221 Id = "MiniCartDisclaimer", 7222 Template = RenderMiniCartDisclaimer(), 7223 SortId = 70 7224 }, 7225 new Block { 7226 Id = "MiniCartActions", 7227 Template = RenderMiniCartActions(), 7228 SortId = 80 7229 } 7230 } 7231 } 7232 } 7233 }; 7234 7235 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 7236 } 7237 7238 @helper RenderMiniCartScriptsTableTemplates() 7239 { 7240 string cartPageId = GetPageIdByNavigationTag("MiniCartFeed").ToString(); 7241 <script id="MiniCartOrderline" type="text/x-template"> 7242 {{#unless isEmpty}} 7243 <tr> 7244 <td class="u-ta-right u-va-middle mini-cart-orderline__quantity {{isDiscontinuedClass}}"> 7245 <div class="u-flex u-flex--align-center grid--direction-column"> 7246 @*@Render(new Button { 7247 Icon = new Icon { Prefix = "fas", Name = "fa-caret-up", LabelPosition = IconLabelPosition.After }, 7248 CssClass = "value-button u-no-margin", 7249 ButtonType = ButtonType.Button, 7250 ButtonLayout = ButtonLayout.None, 7251 ExtraAttributes = new Dictionary<string, string> 7252 { 7253 { "data-operation", "increase"}, 7254 } 7255 })*@ 7256 <input type="text" value="{{quantityRaw}}" class="quantity bs-fw-bold mini-cart-quantity-orderline" data-step="{{ProductQuantityPerPurchaseUnit}}" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7257 <input type="text" value="{{ProductBaseUnit}}" class="quantity" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7258 @*@Render(new Button { 7259 Icon = new Icon { Prefix = "fas", Name = "fa-caret-down", LabelPosition = IconLabelPosition.After }, 7260 CssClass = "value-button u-no-margin", 7261 ButtonType = ButtonType.Button, 7262 ButtonLayout = ButtonLayout.None, 7263 ExtraAttributes = new Dictionary<string, string> 7264 { 7265 { "data-operation", "decrease"}, 7266 } 7267 })*@ 7268 </div> 7269 </td> 7270 <td class="mini-cart-orderline__image u-va-middle {{isDiscontinuedClass}}"> 7271 <a href="{{link}}" class="{{hideimage}} quick-view" data-load-page="{{link}}"><img loading="lazy" width="40" height="40" src="/Admin/Public/GetImage.ashx?width=40&height=40&crop=5&Compression=75&image={{image}}&altFmImage_path=/Images/Kraemer/RapidoProducts/missing-image.jpg" alt="{{name}}" title="{{name}}" style="aspect-ratio: 40 / 40; object-fit: contain;"></a> 7272 </td> 7273 <td class="u-va-middle {{isDiscontinuedClass}}"> 7274 <a href="{{link}}" class="u-padding-top mini-cart-orderline__name quick-view" data-load-page="{{link}}" title="{{name}}">{{name}}</a> 7275 <div class="u-padding-bottom">{{productnumber}}</div> 7276 {{#if variantname}} 7277 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 7278 {{/if}} 7279 {{#if unitname}} 7280 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 7281 {{/if}} 7282 </td> 7283 {{#unless hidePricesOrderline}} 7284 <td class="u-ta-right u-va-middle mini-cart-orderline__price test mini-cart-orderline__price_{{orderLineId}} {{isDiscontinuedClass}}"> 7285 {{#if pointsTotal}} 7286 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7287 {{else}} 7288 {{totalprice}} 7289 {{/if}} 7290 </td> 7291 {{/unless}} 7292 <td class="u-ta-right u-va-middle mini-cart-orderline__delete {{#ifCond isDiscontinuedClass '!==' ""}} u-hidden-border-bottom {{/ifCond}}"> 7293 @Render(new Button 7294 { 7295 OnClick = "deleteOrderline('" + cartPageId + "', '{{id}}', '{{orderLineId}}')", 7296 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After }, 7297 CssClass = "u-no-margin", 7298 ButtonType = ButtonType.Button, 7299 ButtonLayout = ButtonLayout.None 7300 }) 7301 </td> 7302 </tr> 7303 {{#if discontinued}} 7304 <tr class="disabled"> 7305 <td class="discontinued-text" style="border-top: 0;" colspan="5">{{discontinuedText}}</td> 7306 </tr> 7307 {{/if}} 7308 {{/unless}} 7309 7310 </script> 7311 7312 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7313 {{#unless isEmpty}} 7314 <tr class="table__row--no-border"> 7315 <td class="u-w60px">&nbsp;</td> 7316 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 7317 <td class="u-ta-right">&nbsp;</td> 7318 {{#unless hidePrices}} 7319 <td class="u-ta-right">{{totalprice}}</td> 7320 {{/unless}} 7321 </tr> 7322 {{/unless}} 7323 </script> 7324 } 7325 7326 @helper RenderMiniCartScriptsListTemplates() 7327 { 7328 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7329 7330 <script id="MiniCartOrderline" type="text/x-template"> 7331 {{#unless isEmpty}} 7332 <div class="mini-cart-orderline grid dw-mod"> 7333 <div class="grid__col-4"> 7334 <a href="{{link}}" class="{{hideimage}}"> 7335 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"> 7336 </a> 7337 </div> 7338 <div class="grid__col-8"> 7339 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a> 7340 {{#if variantname}} 7341 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 7342 {{/if}} 7343 {{#if unitname}} 7344 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 7345 {{/if}} 7346 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 7347 7348 <div class="grid__cell-footer"> 7349 <div class="grid__cell"> 7350 {{#unless hidePrices}} 7351 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 7352 {{#if pointsTotal}} 7353 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7354 {{else}} 7355 {{totalprice}} 7356 {{/if}} 7357 </div> 7358 {{/unless}} 7359 <button type="button" 7360 title="@Translate("Remove orderline")" 7361 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 7362 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 7363 </div> 7364 </div> 7365 </div> 7366 </div> 7367 {{/unless}} 7368 </script> 7369 7370 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7371 {{#unless isEmpty}} 7372 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 7373 <div class="grid__col-4"> 7374 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 7375 </div> 7376 {{#unless hidePrices}} 7377 <div class="grid__col-8">{{totalprice}}</div> 7378 {{/unless}} 7379 </div> 7380 {{/unless}} 7381 </script> 7382 } 7383 7384 @helper RenderMiniCartScriptTemplates() 7385 { 7386 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 7387 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7388 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 7389 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7390 7391 <script id="MiniCartContent" type="text/x-template"> 7392 {{#.}} 7393 {{#unless isEmpty}} 7394 @if (miniCartUseGoogleTagManager) 7395 { 7396 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 7397 } 7398 @RenderBlockList(subBlocks) 7399 {{/unless}} 7400 {{/.}} 7401 </script> 7402 } 7403 7404 @helper RenderMiniCartOrderLinesTable() 7405 { 7406 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7407 7408 <div class="u-overflow-auto"> 7409 <table class="table mini-cart-table dw-mod" data-test="true"> 7410 7411 @RenderBlockList(subBlocks) 7412 </table> 7413 </div> 7414 } 7415 7416 @helper RenderMiniCartOrderLinesBlocks() 7417 { 7418 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7419 7420 <div class="u-overflow-auto"> 7421 @RenderBlockList(subBlocks) 7422 </div> 7423 } 7424 7425 @helper RenderMiniCartOrderLinesHeader() 7426 { 7427 @*<thead> 7428 <tr> 7429 <td>&nbsp;</td> 7430 <td>@Translate("Product")</td> 7431 <td class="u-ta-right">@Translate("Qty")</td> 7432 <td class="u-ta-right">@Translate("Price")</td> 7433 </tr> 7434 </thead>*@ 7435 } 7436 7437 @helper RenderMiniCartOrderLinesList() 7438 { 7439 <text> 7440 {{#OrderLines}} 7441 {{#ifCond template "===" "CartOrderline"}} 7442 {{>MiniCartOrderline}} 7443 {{/ifCond}} 7444 {{#ifCond template "===" "CartOrderlineMobile"}} 7445 {{>MiniCartOrderline}} 7446 {{/ifCond}} 7447 {{#ifCond template "===" "CartOrderlineDiscount"}} 7448 {{>MiniCartOrderlineDiscount}} 7449 {{/ifCond}} 7450 {{/OrderLines}} 7451 </text> 7452 } 7453 7454 @helper RenderMiniCartFees() 7455 { 7456 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7457 if (!pointShop) 7458 { 7459 <text> 7460 {{#unless hidePaymentfee}} 7461 <div class="grid"> 7462 <div class="grid__col-6 grid__col--bleed-y"> 7463 {{paymentmethod}} 7464 </div> 7465 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 7466 </div> 7467 {{/unless}} 7468 </text> 7469 } 7470 <text> 7471 {{#unless hideShippingfee}} 7472 <div class="grid"> 7473 <div class="grid__col-6 grid__col--bleed-y"> 7474 {{shippingmethod}} 7475 </div> 7476 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 7477 </div> 7478 {{/unless}} 7479 </text> 7480 <text> 7481 {{#if hasTaxSettings}} 7482 <div class="grid"> 7483 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 7484 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 7485 </div> 7486 {{/if}} 7487 </text> 7488 } 7489 7490 @helper RenderMiniCartFooter() 7491 { 7492 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 7493 7494 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 7495 @RenderBlockList(subBlocks) 7496 </div> 7497 } 7498 7499 @helper RenderMiniCartActions() 7500 { 7501 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7502 7503 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom bs-mb-2" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = true">@Translate("Empty cart")</button> 7504 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Proceed to cart")</a> 7505 } 7506 7507 @helper RenderMiniCartPoints() 7508 { 7509 <text> 7510 {{#if earnings}} 7511 <div class="grid"> 7512 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 7513 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7514 <div> 7515 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 7516 </div> 7517 </div> 7518 </div> 7519 {{/if}} 7520 </text> 7521 } 7522 7523 @helper RenderMiniCartSubTotal() 7524 { 7525 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 7526 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7527 if (!pointShop) 7528 { 7529 @*<text> 7530 {{#unless hideSubTotal}} 7531 <div class="grid dw-mod u-bold"> 7532 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 7533 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7534 @if (hasTaxSettings) 7535 { 7536 <text>{{subtotalpricewithouttaxes}}</text> 7537 } 7538 else 7539 { 7540 <text>{{subtotalprice}}</text> 7541 } 7542 </div> 7543 </div> 7544 {{/unless}} 7545 </text>*@ 7546 } 7547 } 7548 7549 @helper RenderMiniCartTotal() 7550 { 7551 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7552 <text> 7553 {{#unless hidePrices}} 7554 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 7555 <div class="grid__col-6">@Translate("Total")</div> 7556 <div class="grid__col-6 grid--align-end"> 7557 <div> 7558 @if (pointShop) 7559 { 7560 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 7561 } 7562 else 7563 { 7564 <text>{{totalprice}}</text> 7565 } 7566 </div> 7567 </div> 7568 </div> 7569 {{/unless}} 7570 </text> 7571 } 7572 7573 @helper RenderMiniCartDisclaimer() 7574 { 7575 <text> 7576 {{#if showCheckoutDisclaimer}} 7577 <div class="grid u-margin-bottom u-ta-right"> 7578 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 7579 </div> 7580 {{/if}} 7581 </text> 7582 } 7583 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7584 7585 @using Dynamicweb.Rapido.Blocks.Extensibility 7586 @using Dynamicweb.Rapido.Blocks 7587 @using Dynamicweb.Rapido.Blocks.Components.General 7588 @using Dynamicweb.Rapido.Blocks.Components 7589 @using Dynamicweb.Rapido.Services 7590 7591 @{ 7592 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 7593 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 7594 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 7595 7596 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 7597 { 7598 if (addToCartNotificationType == "modal") 7599 { 7600 Block addToCartNotificationModal = new Block 7601 { 7602 Id = "AddToCartNotificationModal", 7603 Template = RenderAddToCartNotificationModal() 7604 }; 7605 7606 Block addToCartNotificationScript = new Block 7607 { 7608 Id = "AddToCartNotificationScript", 7609 Template = RenderAddToCartNotificationModalScript() 7610 }; 7611 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 7612 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7613 } 7614 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 7615 { 7616 Block addToCartNotificationScript = new Block 7617 { 7618 Id = "AddToCartNotificationScript", 7619 Template = RenderAddToCartNotificationToggleScript() 7620 }; 7621 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7622 } 7623 } 7624 } 7625 7626 @helper RenderAddToCartNotificationModal() 7627 { 7628 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 7629 } 7630 7631 @helper RenderAddToCartNotificationModalScript() 7632 { 7633 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7634 7635 <script id="LastAddedProductTemplate" type="text/x-template"> 7636 @{ 7637 7638 Modal lastAddedProduct = new Modal 7639 { 7640 Id = "LastAddedProduct", 7641 Heading = new Heading 7642 { 7643 Level = 2, 7644 Title = Translate("Product is added to the cart") 7645 }, 7646 Width = ModalWidth.Md, 7647 BodyTemplate = RenderModalContent() 7648 }; 7649 7650 lastAddedProduct.AddActions( 7651 new Button 7652 { 7653 ButtonType = ButtonType.Button, 7654 ButtonLayout = ButtonLayout.Secondary, 7655 Title = Translate("Continue shopping"), 7656 CssClass = "u-pull--left u-no-margin btn--sm", 7657 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 7658 }, 7659 new Link 7660 { 7661 Href = "/Default.aspx?ID=" + cartPageId, 7662 ButtonLayout = ButtonLayout.Secondary, 7663 CssClass = "u-pull--right u-no-margin btn--sm", 7664 Title = Translate("Proceed to checkout") 7665 } 7666 ); 7667 7668 @Render(lastAddedProduct) 7669 } 7670 </script> 7671 7672 } 7673 7674 @helper RenderModalContent() 7675 { 7676 <div class="grid"> 7677 <div class="grid__col-2"> 7678 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 7679 </div> 7680 <div class="u-padding grid--align-self-center"> 7681 <span>{{quantity}}</span> x 7682 </div> 7683 <div class="grid__col-auto grid--align-self-center"> 7684 <div>{{productInfo.name}}</div> 7685 {{#if productInfo.variantName}} 7686 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 7687 {{/if}} 7688 {{#if productInfo.unitName}} 7689 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 7690 {{/if}} 7691 </div> 7692 </div> 7693 } 7694 7695 @helper RenderAddToCartNotificationToggleScript() 7696 { 7697 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7698 7699 <script> 7700 document.addEventListener('addToCart', function () { 7701 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 7702 }); 7703 </script> 7704 } 7705 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7706 7707 @using System 7708 @using System.Web 7709 @using System.Collections.Generic 7710 @using Dynamicweb.Rapido.Blocks.Extensibility 7711 @using Dynamicweb.Rapido.Blocks 7712 @using Dynamicweb.Rapido.Blocks.Components.General 7713 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Math 7714 7715 @functions { 7716 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 7717 } 7718 7719 @{ 7720 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 7721 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 7722 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 7723 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 7724 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 7725 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 7726 7727 Block masterFooterContent = new Block() 7728 { 7729 Id = "MasterFooterContent", 7730 SortId = 10, 7731 Template = RenderFooter(), 7732 SkipRenderBlocksList = true 7733 }; 7734 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 7735 7736 /*if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 7737 { 7738 Block masterFooterColumnOne = new Block 7739 { 7740 Id = "MasterFooterColumnOne", 7741 SortId = 10, 7742 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 7743 Design = new Design 7744 { 7745 Size = "auto", 7746 RenderType = RenderType.Column 7747 } 7748 }; 7749 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 7750 } 7751 7752 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 7753 { 7754 Block masterFooterColumnTwo = new Block 7755 { 7756 Id = "MasterFooterColumnTwo", 7757 SortId = 20, 7758 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 7759 Design = new Design 7760 { 7761 Size = "auto", 7762 RenderType = RenderType.Column 7763 } 7764 }; 7765 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 7766 } 7767 7768 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 7769 { 7770 Block masterFooterColumnThree = new Block 7771 { 7772 Id = "MasterFooterColumnThree", 7773 SortId = 30, 7774 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 7775 Design = new Design 7776 { 7777 Size = "auto", 7778 RenderType = RenderType.Column 7779 } 7780 }; 7781 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 7782 }*/ 7783 7784 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 7785 { 7786 Block masterFooterNewsletterSignUp = new Block 7787 { 7788 Id = "MasterFooterNewsletterSignUp", 7789 SortId = 40, 7790 Template = RenderFooterNewsletterSignUp(), 7791 Design = new Design 7792 { 7793 Size = "auto", 7794 RenderType = RenderType.Column 7795 } 7796 }; 7797 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 7798 } 7799 7800 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 7801 { 7802 Block masterFooterSocialLinks = new Block 7803 { 7804 Id = "MasterFooterSocialLinks", 7805 SortId = 50, 7806 Template = RenderFooterSocialLinks(), 7807 Design = new Design 7808 { 7809 Size = "auto", 7810 RenderType = RenderType.Column 7811 } 7812 }; 7813 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 7814 } 7815 7816 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 7817 { 7818 Block masterFooterPayments = new Block 7819 { 7820 Id = "MasterFooterPayments", 7821 SortId = 60, 7822 Template = RenderFooterPayments(), 7823 Design = new Design 7824 { 7825 Size = "12", 7826 RenderType = RenderType.Column 7827 } 7828 }; 7829 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 7830 } 7831 7832 Block masterFooterCopyright = new Block 7833 { 7834 Id = "MasterFooterCopyright", 7835 SortId = 70, 7836 Template = RenderFooterCopyright(), 7837 Design = new Design 7838 { 7839 CssClass = "u-full-width" 7840 } 7841 }; 7842 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 7843 } 7844 7845 @helper RenderFooter() 7846 { 7847 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 7848 var imageSource = "/Files/Images/FooterWave.svg"; 7849 List<int> pages = new List<int>(); 7850 pages.Add(6953); 7851 var test = 0; 7852 var newCartPageId = GetPageIdByNavigationTag("CartPageV2"); 7853 bool isNewCartPage = Pageview.Page.ID == newCartPageId; 7854 string centerBackgroundClass = isNewCartPage ? "background-color: #F9F7F6 !important" : ""; 7855 7856 if (Model.Item != null) 7857 { 7858 test = Int32.Parse(Model?.Item?.PageID.ToString()); 7859 } 7860 var footerBackgroundColor = ""; 7861 if (test != 0) 7862 { 7863 footerBackgroundColor = pages.Contains(Model.Item.PageID) ? "bg-beige" : ""; 7864 7865 <footer class="footer dw-mod @footerBackgroundColor" id="@Model.Item.PageID" style="position: relative;"> 7866 <div class="backdrop"> 7867 @{ 7868 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7869 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7870 } 7871 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7872 </div> 7873 <div class="footer__content"> 7874 <div class="content-container"> 7875 <div class="content-row"> 7876 @RenderBlockList(subBlocks) 7877 </div> 7878 </div> 7879 </div> 7880 </footer> 7881 }else 7882 { 7883 <footer class="footer dw-mod " style="position: relative; @centerBackgroundClass"> 7884 <div class="backdrop"> 7885 @{ 7886 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7887 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7888 } 7889 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7890 </div> 7891 <div class="footer__content"> 7892 <div class="content-container"> 7893 <div class="content-row"> 7894 @RenderBlockList(subBlocks) 7895 </div> 7896 </div> 7897 </div> 7898 </footer> 7899 } 7900 } 7901 7902 @helper RenderFooterColumn(string header, string content) 7903 { 7904 <h3 class="footer__heading dw-mod">@header</h3> 7905 <div class="footer__content dw-mod"> 7906 @content 7907 </div> 7908 } 7909 7910 @helper RenderFooterNewsletterSignUp() 7911 { 7912 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 7913 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 7914 7915 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 7916 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 7917 form.Add(new TextField 7918 { 7919 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 7920 Type = TextFieldType.Email, 7921 ActionButton = new Button 7922 { 7923 ButtonType = ButtonType.Submit, Id = "Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 7924 } 7925 }); 7926 7927 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 7928 <div class="footer__content dw-mod"> 7929 @Render(form) 7930 </div> 7931 } 7932 7933 @helper RenderFooterSocialLinks() 7934 { 7935 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 7936 <div class="footer__content dw-mod"> 7937 <div class="collection dw-mod"> 7938 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 7939 { 7940 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 7941 string socialIconClass = socialIcon.SelectedValue; 7942 string socialIconTitle = socialIcon.SelectedName; 7943 string socialLink = socialitem.GetString("Link"); 7944 7945 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"> 7946 <i class="@socialIconClass fa-2x"></i> 7947 </a> 7948 } 7949 </div> 7950 </div> 7951 } 7952 7953 @helper RenderFooterPayments() 7954 { 7955 <div class="footer__content dw-mod"> 7956 <div class="collection dw-mod"> 7957 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 7958 { 7959 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 7960 string paymentImage = null; 7961 string paymentTitle = paymentItem.SelectedName; 7962 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 7963 if (selected != null) 7964 { 7965 paymentImage = selected.Icon; 7966 } 7967 7968 <div class="footer__card-type"> 7969 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle"/> 7970 </div> 7971 } 7972 </div> 7973 </div> 7974 } 7975 7976 @helper RenderFooterCopyright() 7977 { 7978 <div class="footer__copyright u-position-relative"> 7979 <div class="footer__copyright-logo"> 7980 <img loadin="lazy" src="/Files/Images/dnv-good-fit.png" width="129" height="122" alt="footer-icon"/> 7981 </div> 7982 <p class="footer__copyright-text">&copy; @DateTime.Now.Year @Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 7983 7984 7985 </div> 7986 } 7987 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7988 7989 @using System 7990 @using System.Web 7991 @using System.Collections.Generic 7992 @using Dynamicweb.Rapido.Blocks.Extensibility 7993 @using Dynamicweb.Rapido.Blocks 7994 @using Dynamicweb.Ecommerce.Common 7995 @using WebApp.Singleton 7996 7997 @{ 7998 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 7999 8000 Block masterScriptReferences = new Block() 8001 { 8002 Id = "MasterScriptReferences", 8003 SortId = 1, 8004 Template = RenderMasterScriptReferences() 8005 }; 8006 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 8007 } 8008 8009 @helper RenderMasterScriptReferences() 8010 { 8011 var customJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/js/custom.js")); 8012 var appJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/app.bundle.js")); 8013 var foodCalendarJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js")); 8014 var shoppingListJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js")); 8015 var customGeneralJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js")); 8016 var foodCalendarExtensionJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendarExtension.bundle.js")); 8017 8018 var buildNumber = WebAppConfiguration.BuildNumber; 8019 string customJsSrc = $"/Files/Templates/Designs/Rapido/js/custom.js?buildNumber={buildNumber}"; 8020 string appJsSrc = $"/Files/Templates/Designs/Rapido/dist/app.bundle.js?buildNumber={buildNumber}"; 8021 string foodCalendarJsSrc = $"/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js?buildNumber={buildNumber}"; 8022 string shoppingListJsSrc = $"/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js?buildNumber={buildNumber}"; 8023 string customGeneralJsSrc = $"/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js?buildNumber={buildNumber}"; 8024 var masterGeneralJsSrc = $"/Files/Templates/Designs/Rapido/js/master.js?buildNumber={buildNumber}"; 8025 var handlebarJsSrc = "/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"; 8026 8027 <script src="@handlebarJsSrc" defer></script> 8028 <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js" defer></script> 8029 <script src="https://unpkg.com/@("@reduxjs")/toolkit@1.9.7/dist/redux-toolkit.umd.js" defer></script> 8030 <script src="@masterGeneralJsSrc" defer></script> 8031 8032 //vue referrences 8033 <script src="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.js?x=@buildNumber" defer type="module"></script> 8034 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.css?x=@buildNumber"> 8035 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?x=@buildNumber"> 8036 8037 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 8038 { 8039 <script src="/Files/Templates/Designs/Rapido/js/axios.js" defer></script> 8040 8041 <script src="@customJsSrc" defer></script> 8042 <script src="@appJsSrc" type="module"></script> 8043 <script src="@foodCalendarJsSrc" type="module"></script> 8044 <script src="@shoppingListJsSrc" type="module"></script> 8045 <script src="@customGeneralJsSrc" type="module"></script> 8046 } 8047 } 8048 8049 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8050 8051 @using System 8052 @using System.Web 8053 @using System.Collections.Generic 8054 @using Dynamicweb.Rapido.Blocks.Extensibility 8055 @using Dynamicweb.Rapido.Blocks 8056 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8057 @using Dynamicweb.Rapido.Services 8058 @using Dynamicweb.Ecommerce.ProductCatalog 8059 8060 @{ 8061 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 8062 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 8063 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 8064 8065 if (!navigationItemsHideSearch || isFavoriteList) 8066 { 8067 Block masterSearchScriptTemplates = new Block() 8068 { 8069 Id = "MasterSearchScriptTemplates", 8070 SortId = 1, 8071 Template = RenderSearchScriptTemplates() 8072 }; 8073 8074 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 8075 } 8076 } 8077 8078 @helper RenderSearchScriptTemplates() 8079 { 8080 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 8081 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 8082 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 8083 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 8084 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 8085 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 8086 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 8087 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 8088 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 8089 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star"; 8090 string favoriteIcon = "fas fa-" + selectedFavoriteIcon; 8091 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon; 8092 8093 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID"); 8094 string classMaxWidth = Pageview.Device.ToString() != "Mobile" ? "u-max-w260px" : ""; 8095 string searchParameter = HttpContext.Current.Request.QueryString.Get("Search"); 8096 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 8097 var showCartons = currentUser?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString(); 8098 8099 8100 <script id="SearchGroupsTemplate" type="text/x-template"> 8101 {{#.}} 8102 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 8103 {{/.}} 8104 </script> 8105 8106 <script id="SearchProductsTemplate" type="text/x-template"> 8107 <div style="padding-top:15px; padding-left: 15px; padding-right: 15px;" class="dropdown__item--seperator bs-mb-4 bs-border-secondary dw-mod ">{{label}} 8108 8109 {{#each .}} 8110 {{#each FacetGroups}} 8111 <h4 class="bs-mb-3 u-color-inherit">@Translate("Kategorier")</h4> 8112 <div class="display-grid--two-columns bs-pb-4 "> 8113 {{#FacetOptions}} 8114 {{#ifCond queryParameter "===" "Category"}} 8115 <span class="u-color-inherit" 8116 style="font-weight: 600; cursor: pointer;" 8117 onclick="searchInCategoryButton(@productsPageId, {{ name }})"> 8118 {{label}} ({{count}}) 8119 </span> 8120 {{/ifCond}} 8121 {{/FacetOptions}} 8122 </div> 8123 {{/each}} 8124 {{/each}} 8125 8126 </div> 8127 {{#each .}} 8128 {{#each ProductsContainer}} 8129 {{#Product}} 8130 {{#ifCond template "!==" "SearchMore"}} 8131 {{#ifCond isDiscontinuedClass "!==" "disabled"}} 8132 <li class="dropdown__item test dropdown__item--seperator dw-mod"> 8133 @if (useFacebookPixel) 8134 { 8135 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 8136 } 8137 @if (useGoogleTagManager) 8138 { 8139 <text>{{{googleEnchantImpression googleImpression}}}</text> 8140 } 8141 <div class="search__product-wrapper grid--align-center"> 8142 <div class="search__product-wrapper-infos"> 8143 <a href="{{link}}" 8144 class="js-typeahead-link quick-view u-color-inherit u-pull--left bs-d-flex" data-load-page="{{link}}" 8145 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 8146 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 8147 <div class="u-margin-right {{noimage}}" style="width: 50px"><img src="/Files/Images/Kraemer/RapidoProducts/{{number}}.jpg" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}" class="search-img" onerror="this.src='/Files/Images/Kraemer/RapidoProducts/missing-image.jpg';"></div> 8148 <div class="u-pull--left"> 8149 <div class="u-bold u-truncate-text js-typeahead-name u-flex grid--align-center"> 8150 <span class="u-padding-right">{{productId}}</span> 8151 <span class="u-flex grid--align-center u-padding-right"> 8152 <i class="fas fa-circle cart-circle"></i> 8153 </span> 8154 <span class="search__product-name u-truncate-text u-inline-block bs-d-flex bs-align-items-center bs-gap-1" style="max-width: 200px"> 8155 {{name}}{{#if variantName}}, {{variantName}}{{/if}} 8156 {{#ifCond ProductCountryManufacturerCode '===' "NO"}} 8157 <div class="product-country"> 8158 <img height="18px" src='@("/Admin/Images/Flags/flag_" + "no" +".png")' title="@Translate("Norway")" alt='@Translate("Norway flag")'> 8159 </div> 8160 {{/ifCond}} 8161 </span> 8162 </div> 8163 <div class="u-flex grid--align-center u-truncate-text product-search-description"> 8164 {{#if transit}} 8165 <span class="cart-table__product-name-infos-transit"> 8166 <div class="transit-container u-margin-right" title="@Translate("Transittvare")"> 8167 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8168 <circle cx="10" cy="10" r="10" fill="#0052A0" /> 8169 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white" /> 8170 </svg> 8171 <div class="tooltip">@Translate("Transittvare")</div> 8172 </div> 8173 </span> 8174 {{/if}} 8175 {{#if showBreakableIcon}} 8176 <span class="cart-table__product-name-infos-showbreakableicon"> 8177 <div class="transit-container u-margin-right" title="@Translate("Anbrekksvare")"> 8178 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8179 <circle cx="10" cy="10" r="10" fill="#0052A0" /> 8180 <path d="M11.7979 12.9492H8.20215L7.51855 15H5.33789L9.04297 5.04688H10.9434L14.6689 15H12.4883L11.7979 12.9492ZM8.75586 11.2881H11.2441L9.99316 7.5625L8.75586 11.2881Z" fill="white" /> 8181 </svg> 8182 <div class="tooltip">@Translate("Anbrekksvare")</div> 8183 </div> 8184 </span> 8185 {{/if}} 8186 <span class="js-typeahead-name u-padding-right u-flex grid--align-center search__manufacture-name"> {{ManufacturerName}}</span> 8187 <span class="u-flex grid--align-center u-padding-right"><i class="fas fa-circle cart-circle"></i></span> 8188 <span class="package-contents search__product-package u-truncate-text">{{truncateFirst20 ProductPackageContents}}</span> 8189 8190 8191 {{#ifCond StorageAvailableInSessionLocation '!==' true}} 8192 {{#ifCond warehouseDescription '!==' ""}} 8193 {{#ifCond warehouseDescription '!==' null}} 8194 8195 @if (Pageview.User != null) 8196 { 8197 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #f1ff80" title="@Translate("Central warehouse - longer lead time")">{{warehouseDescription}}</div> 8198 } 8199 8200 {{/ifCond}} 8201 {{/ifCond}} 8202 8203 8204 {{#ifCond stockDescriptiontext '!==' ""}} 8205 {{#ifCond stockDescriptiontext '!==' null}} 8206 {{#ifCond stockDescriptiontext '!==' "Lagerført"}} 8207 8208 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Limited")"}} 8209 8210 @if (Pageview.User != null) 8211 { 8212 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Limited")">{{stockDescriptiontext}}</div> 8213 } 8214 8215 {{/ifCond}} 8216 8217 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Unavailable")"}} 8218 8219 @if (Pageview.User != null) 8220 { 8221 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Unavailable")">{{stockDescriptiontext}}</div> 8222 } 8223 8224 {{/ifCond}} 8225 8226 {{/ifCond}} 8227 {{/ifCond}} 8228 {{/ifCond}} 8229 {{/ifCond}} 8230 </div> 8231 @* @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 8232 { 8233 if (pointShopOnly) 8234 { 8235 <text> 8236 {{#if havePointPrice}} 8237 <div> 8238 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 8239 </div> 8240 {{else}} 8241 <small class="help-text u-no-margin">@Translate("Not available")</small> 8242 {{/if}} 8243 {{#unless canBePurchasedWithPoints}} 8244 {{#if havePointPrice}} 8245 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 8246 {{/if}} 8247 {{/unless}} 8248 </text> 8249 } 8250 else 8251 { 8252 <div>{{price}}</div> 8253 } 8254 }*@ 8255 </div> 8256 </a> 8257 </div> 8258 <div class="u-flex search__product-wrapper-price"> 8259 <div class="u-margin-left"> 8260 @{ 8261 var viewBtn = new Link 8262 { 8263 Href = "{{link}}", 8264 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 8265 ButtonLayout = ButtonLayout.Secondary, 8266 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside u-hidden", 8267 Title = Translate("View") 8268 }; 8269 } 8270 8271 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 8272 { 8273 <text>{{#if hideAddToCartButton}}</text> 8274 @Render(viewBtn) 8275 <text>{{else}}</text> 8276 <div class="u-flex grid--align-center grid--wrap"> 8277 <div class="price price--product-list price--micro u-margin-right dw-mod">{{price}} / {{ProductBaseUnit}} 8278 @*<span class="purchase-unit-details dw-mod u-color-dark u-margin-left--lg">{{ProductQuantityPerPurchaseUnit}} x</span>*@ 8279 </div> 8280 <div class="add-quantity-container u-flex u-flex--align"> 8281 8282 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 8283 { <div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8284 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')">-</button> 8285 @Render(new NumberField 8286 { 8287 Id = "SearchQuantity{{productId}}", 8288 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8289 Value = "", 8290 ExtraAttributes = new Dictionary<string, string> 8291 { 8292 {"data-breakable", "{{Breakable}}"}, 8293 {"data-prev-value", "0"}, 8294 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8295 {"data-product-id", "{{productId}}"}, 8296 {"tabindex", "0"}, 8297 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8298 { "step", "{{ProductQuantityPerPurchaseUnit}}"}, 8299 { "data-type", "Search" }, 8300 { "data-name", "{{name}}"}, 8301 } 8302 }) 8303 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); input.dispatchEvent(new Event('change')); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')">+</button> 8304 </div> 8305 @Render(new Button { 8306 OnClick = "enableField(this)", 8307 Id = "SearchQuantityBtn{{productId}}", 8308 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8309 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8310 ButtonType = ButtonType.Button, 8311 ButtonLayout = ButtonLayout.Primary, 8312 ExtraAttributes = new Dictionary<string, string> 8313 { 8314 { "data-type", "Search"}, 8315 { "data-breakable", "{{Breakable}}"}, 8316 { "data-product-info", "{{productInfo}}" }, 8317 { "data-unit-id", "{{unitId}}" }, 8318 { "data-variant-id", "{{variantid}}" }, 8319 { "data-product-id", "{{productId}}" }, 8320 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8321 { "data-unit-price","{{priceDouble}}" }, 8322 { "data-link","{{link}}" }, 8323 { "data-unit-base","{{ProductBaseUnit}}"}, 8324 { "{{disableButton}}", ""} 8325 } 8326 8327 }) 8328 8329 if (showCartons == "True") 8330 { 8331 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8332 } 8333 } 8334 else 8335 {<div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8336 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')" style="min-width: unset!important;">-</button> 8337 @Render(new NumberField { 8338 Id = "SearchQuantity{{productId}}", 8339 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8340 Value = "", 8341 ExtraAttributes = new Dictionary<string, string> 8342 { 8343 {"data-breakable", "{{Breakable}}"}, 8344 {"data-prev-value", "0"}, 8345 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8346 {"data-product-id", "{{productId}}"}, 8347 {"tabindex", "0"}, 8348 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8349 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8350 {"data-type", "Search"}, 8351 { "data-name", "{{name}}"}, 8352 {"style","width: 40px !important;height:2ch!important;"} 8353 } 8354 }) 8355 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')" style="min-width: unset!important;">+</button> 8356 </div> 8357 @Render(new Button { 8358 OnClick = "enableField(this)", 8359 Id = "SearchQuantityBtn{{productId}}", 8360 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8361 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8362 ButtonType = ButtonType.Button, 8363 ButtonLayout = ButtonLayout.Primary, 8364 ExtraAttributes = new Dictionary<string, string> 8365 { 8366 { "data-type", "Search"}, 8367 { "data-breakable", "{{Breakable}}"}, 8368 { "data-product-info", "{{productInfo}}" }, 8369 { "data-unit-id", "{{unitId}}" }, 8370 { "data-variant-id", "{{variantid}}" }, 8371 { "data-product-id", "{{productId}}" }, 8372 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8373 { "data-unit-price","{{priceDouble}}" }, 8374 { "data-link","{{link}}" }, 8375 { "data-unit-base","{{ProductBaseUnit}}"}, 8376 { "{{disableButton}}", ""} 8377 } 8378 8379 }) 8380 if (showCartons == "True") 8381 { 8382 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8383 } 8384 8385 } 8386 8387 <div class="loader-container u-hidden"> 8388 <i class="fas fa-circle-notch fa-spin preloader"></i> 8389 </div> 8390 8391 </div> 8392 </div> 8393 8394 <text>{{/if}}</text> 8395 } 8396 else if (showViewButton) 8397 { 8398 @Render(viewBtn) 8399 } 8400 @if (showAddToDownloadButton) 8401 { 8402 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 8403 <i class="fas fa-plus js-button-icon"></i> 8404 </button> 8405 } 8406 </div> 8407 8408 @if (currentUser != null) 8409 { 8410 <div class="favorites product-list__details-favorites"> 8411 <div class="favorites product-list__details-favorites bs-d-flex bs-align-items-center bs-justify-content-center" style="position: relative;"> 8412 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{number}}" data-quantity="{{ProductQuantityPerPurchaseUnit}}" title="@Translate("HOVER_FavouriteList")"> 8413 <img class="popup-toggle" data-product-number="{{number}}" height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/> 8414 </a> 8415 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;top: 100%;z-index: 99999999999999; height: 200px;"> 8416 </div> 8417 </div> 8418 </div> 8419 } 8420 8421 </div> 8422 </div> 8423 </li> 8424 {{/ifCond}} 8425 {{/ifCond}} 8426 8427 @*{{#ifCond template "===" "SearchMore"}} 8428 {{>SearchMoreProducts}} 8429 {{/ifCond}}*@ 8430 {{/Product}} 8431 {{else}} 8432 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8433 @Translate("Your search gave 0 results") 8434 </li> 8435 {{/each}} 8436 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod js-typeahead"> 8437 <button type="button" @* href="/Default.aspx?ID=@productsPageId&Search=@searchParameter&GroupID={{groupId}}"*@ class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-viewAll" onclick="searchAllButton()"> 8438 @Translate("View all") 8439 </button> 8440 </li> 8441 {{/each}} 8442 </script> 8443 8444 <script id="SearchMoreProducts" type="text/x-template"> 8445 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8446 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8447 @Translate("View all") 8448 </a> 8449 </li> 8450 </script> 8451 8452 <script id="SearchMorePages" type="text/x-template"> 8453 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8454 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8455 @Translate("View all") 8456 </a> 8457 </li> 8458 </script> 8459 8460 <script id="SearchPagesTemplate" type="text/x-template"> 8461 {{#each .}} 8462 {{#ifCond template "!==" "SearchMore"}} 8463 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 8464 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 8465 <div class="u-margin-right"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 8466 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div> 8467 </a> 8468 </li> 8469 {{/ifCond}} 8470 {{#ifCond template "===" "SearchMore"}} 8471 {{>SearchMorePages}} 8472 {{/ifCond}} 8473 {{else}} 8474 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8475 @Translate("Your search gave 0 results") 8476 </li> 8477 {{/each}} 8478 </script> 8479 8480 <script id="SearchPagesTemplateWrap" type="text/x-template"> 8481 <div class="dropdown__column-header">@Translate("Pages")</div> 8482 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8483 {{>SearchPagesTemplate}} 8484 </ul> 8485 </script> 8486 8487 <script id="SearchProductsTemplateWrap" type="text/x-template"> 8488 <div class="dropdown__column-header">@Translate("Products")</div> 8489 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8490 {{>SearchProductsTemplate}} 8491 </ul> 8492 </script> 8493 8494 8495 <script> 8496 @if (!string.IsNullOrEmpty(currentFavoriteListId)) 8497 { 8498 <text> 8499 window.currentFavoriteListId = "@currentFavoriteListId"; 8500 </text> 8501 } 8502 function toggleFavAction(button, event) { 8503 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 8504 Scroll.SavePosition(event); 8505 @if (useFacebookPixel) 8506 { 8507 <text> 8508 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8509 </text> 8510 } 8511 location.href = button.getAttribute('data-add-link'); 8512 return; 8513 } 8514 let isAdd = button.getAttribute('data-is-in-list') == "false"; 8515 Request.Fetch().get( 8516 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 8517 function (result) { 8518 console.log({button}) 8519 button.querySelector('img').src = isAdd ? "/Files/Images/trash-icon-outline.svg" : "/Files/Images/favorite-list-svg.svg"; 8520 button.setAttribute('data-is-in-list', isAdd); 8521 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name')) 8522 let favList = button.closest('.js-favorites-list'); 8523 let favBtn = favList.querySelector('.js-favorite-btn img'); 8524 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 8525 if (isInAnyFavoriteList) { 8526 favBtn.src = "/Files/Images/favorite-list-Filled.svg"; 8527 } else { 8528 favBtn.src = "/Files/Images/favorite-list-svg.svg"; 8529 } 8530 document.getElementById(favList.getAttribute('data-close-overlay')).checked = false; 8531 @if (useFacebookPixel) 8532 { 8533 <text> 8534 if (isAdd) { 8535 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8536 } 8537 </text> 8538 } 8539 if (window.currentFavoriteListId != null) { //if this page is favorite list 8540 let listId = button.getAttribute("data-list-id"); 8541 if (listId == window.currentFavoriteListId && !isAdd) { 8542 location.reload(); 8543 } 8544 } 8545 }, 8546 function () { 8547 console.error("FavoriteLists: Error in ToggleFavAction request"); 8548 }, 8549 false 8550 ); 8551 } 8552 </script> 8553 } 8554 8555 @using Dynamicweb.Rapido.Blocks.Components 8556 @using Dynamicweb.Rapido.Blocks.Components.General 8557 @using Dynamicweb.Rapido.Blocks 8558 @using System.IO 8559 8560 8561 @using Dynamicweb.Rapido.Blocks.Components.General 8562 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8563 8564 8565 @* Component *@ 8566 8567 @helper RenderVariantMatrix(VariantMatrix settings) { 8568 if (settings != null) 8569 { 8570 int productLoopCounter = 0; 8571 int groupCount = 0; 8572 List<VariantOption> firstDimension = new List<VariantOption>(); 8573 List<VariantOption> secondDimension = new List<VariantOption>(); 8574 List<VariantOption> thirdDimension = new List<VariantOption>(); 8575 8576 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 8577 { 8578 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 8579 { 8580 if (groupCount == 0) { 8581 firstDimension.Add(variantOptions); 8582 } 8583 if (groupCount == 1) 8584 { 8585 secondDimension.Add(variantOptions); 8586 } 8587 if (groupCount == 2) 8588 { 8589 thirdDimension.Add(variantOptions); 8590 } 8591 } 8592 groupCount++; 8593 } 8594 8595 int rowCount = 0; 8596 int columnCount = 0; 8597 8598 <script> 8599 var variantsCollection = []; 8600 </script> 8601 8602 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 8603 @if (groupCount == 1) 8604 { 8605 <tbody> 8606 @foreach (VariantOption firstVariantOption in firstDimension) 8607 { 8608 var variantId = firstVariantOption.Id; 8609 <tr> 8610 <td class="u-bold"> 8611 @firstVariantOption.Name 8612 </td> 8613 <td> 8614 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8615 </td> 8616 </tr> 8617 productLoopCounter++; 8618 } 8619 8620 <tr> 8621 <td>&nbsp;</td> 8622 <td> 8623 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8624 </td> 8625 </tr> 8626 </tbody> 8627 } 8628 @if (groupCount == 2) 8629 { 8630 <thead> 8631 <tr> 8632 <td>&nbsp;</td> 8633 @foreach (VariantOption variant in secondDimension) 8634 { 8635 <td>@variant.Name</td> 8636 } 8637 </tr> 8638 </thead> 8639 <tbody> 8640 @foreach (VariantOption firstVariantOption in firstDimension) 8641 { 8642 string variantId = ""; 8643 columnCount = 0; 8644 8645 <tr> 8646 <td class="u-min-w120px">@firstVariantOption.Name</td> 8647 8648 @foreach (VariantOption secondVariantOption in secondDimension) 8649 { 8650 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 8651 <td> 8652 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8653 </td> 8654 8655 columnCount++; 8656 8657 productLoopCounter++; 8658 } 8659 8660 <td> 8661 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8662 </td> 8663 </tr> 8664 8665 rowCount++; 8666 } 8667 8668 @{ 8669 columnCount = 0; 8670 } 8671 8672 <tr> 8673 <td>&nbsp;</td> 8674 @foreach (VariantOption secondVariantOption in secondDimension) 8675 { 8676 <td> 8677 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8678 </td> 8679 8680 columnCount++; 8681 } 8682 <td>&nbsp;</td> 8683 </tr> 8684 </tbody> 8685 } 8686 @if (groupCount == 3) 8687 { 8688 <thead> 8689 <tr> 8690 <td>&nbsp;</td> 8691 @foreach (VariantOption thirdVariantOption in thirdDimension) 8692 { 8693 <td>@thirdVariantOption.Name</td> 8694 } 8695 </tr> 8696 </thead> 8697 <tbody> 8698 @foreach (VariantOption firstVariantOption in firstDimension) 8699 { 8700 int colspan = (thirdDimension.Count + 1); 8701 8702 <tr> 8703 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 8704 </tr> 8705 8706 foreach (VariantOption secondVariantOption in secondDimension) 8707 { 8708 string variantId = ""; 8709 columnCount = 0; 8710 8711 <tr> 8712 <td class="u-min-w120px">@secondVariantOption.Name</td> 8713 8714 @foreach (VariantOption thirdVariantOption in thirdDimension) 8715 { 8716 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 8717 8718 <td> 8719 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8720 </td> 8721 8722 columnCount++; 8723 productLoopCounter++; 8724 } 8725 8726 <td> 8727 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8728 </td> 8729 </tr> 8730 rowCount++; 8731 } 8732 } 8733 8734 @{ 8735 columnCount = 0; 8736 } 8737 8738 <tr> 8739 <td>&nbsp;</td> 8740 @foreach (VariantOption thirdVariantOption in thirdDimension) 8741 { 8742 <td> 8743 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8744 </td> 8745 8746 columnCount++; 8747 } 8748 <td>&nbsp;</td> 8749 </tr> 8750 </tbody> 8751 } 8752 </table> 8753 8754 <script> 8755 document.addEventListener("DOMContentLoaded", function (event) { 8756 MatrixUpdateQuantity("@settings.ProductId"); 8757 }); 8758 8759 MatrixUpdateQuantity = function (productId) { 8760 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 8761 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 8762 8763 var qtyRowArr = []; 8764 var qtyColumnArr = []; 8765 8766 var totalQty = 0; 8767 8768 for (var i = 0; i < allQtyFields.length; i++) { 8769 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 8770 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 8771 } 8772 8773 for (var i = 0; i < allQtyFields.length; i++) { 8774 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 8775 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 8776 totalQty += parseFloat(allQtyFields[i].value); 8777 } 8778 8779 //Update row counters 8780 for (var i = 0; i < qtyRowArr.length; i++) { 8781 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8782 8783 if (qtyRowArr[i] != undefined && qtyCounter != null) { 8784 var currentCount = qtyCounter.innerHTML; 8785 qtyCounter.innerHTML = qtyRowArr[i]; 8786 8787 if (currentCount != qtyCounter.innerHTML) { 8788 qtyCounter.classList.add("qty-field--active"); 8789 } 8790 } 8791 8792 } 8793 8794 //Update column counters 8795 for (var i = 0; i < qtyColumnArr.length; i++) { 8796 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8797 8798 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 8799 var currentCount = qtyCounter.innerHTML; 8800 qtyCounter.innerHTML = qtyColumnArr[i]; 8801 8802 if (currentCount != qtyCounter.innerHTML) { 8803 qtyCounter.classList.add("qty-field--active"); 8804 } 8805 } 8806 } 8807 8808 if (document.getElementById("TotalQtyCount_" + productId)) { 8809 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 8810 } 8811 8812 //Clean up animations 8813 setTimeout(function () { 8814 for (var i = 0; i < qtyRowArr.length; i++) { 8815 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8816 if (qtyCounter != null) { 8817 qtyCounter.classList.remove("qty-field--active"); 8818 } 8819 } 8820 for (var i = 0; i < qtyColumnArr.length; i++) { 8821 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8822 if (qtyCounter != null) { 8823 qtyCounter.classList.remove("qty-field--active"); 8824 } 8825 } 8826 }, 1000); 8827 } 8828 </script> 8829 } 8830 } 8831 8832 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 8833 { 8834 string loopCount = productLoopCounter.ToString(); 8835 8836 bool combinationFound = false; 8837 double stock = 0; 8838 double quantityValue = 0; 8839 string note = ""; 8840 8841 VariantProduct variantProduct = null; 8842 8843 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 8844 { 8845 stock = variantProduct.Stock; 8846 quantityValue = variantProduct.Quantity; 8847 combinationFound = true; 8848 } 8849 8850 if (combinationFound) 8851 { 8852 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 8853 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 8854 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 8855 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 8856 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 8857 8858 if (stock != 0) 8859 { 8860 <small>@Translate("Stock") @stock</small> 8861 } 8862 8863 <script> 8864 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 8865 variantsCollection.push(variants); 8866 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 8867 </script> 8868 } 8869 else 8870 { 8871 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 8872 } 8873 } 8874 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8875 8876 @* Component *@ 8877 8878 @helper RenderAddToCart(AddToCart settings) 8879 { 8880 //set Id for quantity selector to get it's value from button 8881 if (settings.QuantitySelector != null) 8882 { 8883 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 8884 { 8885 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 8886 } 8887 8888 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 8889 8890 if (settings.Disabled) 8891 { 8892 settings.QuantitySelector.Disabled = true; 8893 } 8894 8895 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 8896 { 8897 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 8898 } 8899 } 8900 8901 if (settings.Disabled) 8902 { 8903 settings.AddButton.Disabled = true; 8904 } 8905 8906 settings.AddButton.CssClass += " btn--condensed"; 8907 8908 //unitsSelector 8909 if (settings.UnitSelector != null) 8910 { 8911 if (settings.Disabled) 8912 { 8913 settings.QuantitySelector.Disabled = true; 8914 } 8915 } 8916 8917 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8918 @if (settings.UnitSelector != null) 8919 { 8920 @Render(settings.UnitSelector) 8921 } 8922 @if (settings.QuantitySelector != null) 8923 { 8924 @Render(settings.QuantitySelector) 8925 } 8926 @Render(settings.AddButton) 8927 </div> 8928 } 8929 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8930 8931 @* Component *@ 8932 8933 @helper RenderAddToCartButton(AddToCartButton settings) 8934 { 8935 if (!settings.HideTitle) 8936 { 8937 if (string.IsNullOrEmpty(settings.Title)) 8938 { 8939 if (settings.BuyForPoints) 8940 { 8941 settings.Title = Translate("Buy with points"); 8942 } 8943 else 8944 { 8945 settings.Title = Translate("Add to cart"); 8946 } 8947 } 8948 } 8949 else 8950 { 8951 settings.Title = ""; 8952 } 8953 8954 if (settings.Icon == null) 8955 { 8956 settings.Icon = new Icon(); 8957 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 8958 } 8959 8960 if (string.IsNullOrEmpty(settings.Icon.Name)) 8961 { 8962 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 8963 } 8964 8965 settings.OnClick = "Cart.AddToCart(event, { " + 8966 "id: '" + settings.ProductId + "'," + 8967 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 8968 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 8969 (settings.BuyForPoints ? "buyForPoints: true," : "") + 8970 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 8971 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 8972 "});" + settings.OnClick; 8973 8974 @RenderButton(settings) 8975 } 8976 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8977 8978 @* Component *@ 8979 8980 @helper RenderUnitSelector(UnitSelector settings) 8981 { 8982 if (string.IsNullOrEmpty(settings.Id)) 8983 { 8984 settings.Id = Guid.NewGuid().ToString("N"); 8985 } 8986 var disabledClass = settings.Disabled ? "disabled" : ""; 8987 8988 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 8989 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8990 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 8991 <div class="dropdown__content dw-mod"> 8992 @settings.OptionsContent 8993 </div> 8994 <label class="dropdown-trigger-off" for="@settings.Id"></label> 8995 </div> 8996 } 8997 @using System.Reflection 8998 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8999 9000 @* Component *@ 9001 9002 @helper RenderQuantitySelector(QuantitySelector settings) 9003 { 9004 var attributes = new Dictionary<string, string>(); 9005 9006 /*base settings*/ 9007 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 9008 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 9009 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 9010 if (settings.Disabled) { attributes.Add("disabled", "true"); } 9011 if (settings.Required) { attributes.Add("required", "true"); } 9012 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 9013 /*end*/ 9014 9015 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 9016 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 9017 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 9018 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 9019 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 9020 if (settings.Min == null) { settings.Min = 1; } 9021 attributes.Add("min", settings.Min.ToString()); 9022 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 9023 if (settings.Value == null) { settings.Value = 1; } 9024 attributes.Add("value", settings.Value.ToString()); 9025 attributes.Add("type", "number"); 9026 9027 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9028 9029 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 9030 } 9031 @using Dynamicweb.Rapido.Blocks.Components 9032 9033 @using Dynamicweb.Frontend 9034 @using Dynamicweb.Frontend.Devices 9035 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 9036 @using Dynamicweb.Rapido.Blocks.Components.General 9037 @using System.Collections.Generic; 9038 9039 @* Component *@ 9040 9041 @helper RenderCustomerCenterList(CustomerCenterList settings) 9042 { 9043 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 9044 string hideActions = isTouchDevice ? "u-block" : ""; 9045 9046 <table class="table data-list dw-mod"> 9047 @if (settings.GetHeaders().Length > 0) { 9048 <thead> 9049 <tr class="u-bold"> 9050 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 9051 { 9052 var attributes = new Dictionary<string, string>(); 9053 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 9054 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 9055 attributes.Add("align", header.Align.ToString()); 9056 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9057 9058 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 9059 } 9060 </tr> 9061 </thead> 9062 } 9063 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 9064 { 9065 int columnCount = 0; 9066 int totalColumns = listItem.GetInfoItems().Length; 9067 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-acions" : ""; 9068 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 9069 9070 var attributes = new Dictionary<string, string>(); 9071 var width = Pageview.Device.ToString() != "Mobile" ? "150" : "100"; 9072 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 9073 9074 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9075 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 9076 <tr> 9077 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 9078 <td onclick="@listItem.OnClick" class="data-list__main-item dw-mod" width="@width"> 9079 @if (!string.IsNullOrEmpty(listItem.Title)) { 9080 <div class="u-bold">@listItem.Title</div> 9081 } 9082 @if (!string.IsNullOrEmpty(listItem.Description)) { 9083 <div>@listItem.Description</div> 9084 } 9085 </td> 9086 } 9087 9088 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 9089 { 9090 var infoAttributes = new Dictionary<string, string>(); 9091 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 9092 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 9093 infoAttributes.Add("align", infoItem.Align.ToString()); 9094 9095 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9096 string columnClick = columnCount < (totalColumns-2) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 9097 9098 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 9099 @if (!string.IsNullOrEmpty(infoItem.Title)) { 9100 <div>@infoItem.Title</div> 9101 } 9102 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 9103 <div><small>@infoItem.Subtitle</small></div> 9104 } 9105 </td> 9106 9107 columnCount++; 9108 } 9109 </tr> 9110 <tr> 9111 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 9112 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 9113 @foreach (ButtonBase action in listItem.GetActions()) 9114 { 9115 action.ButtonLayout = ButtonLayout.LinkClean; 9116 action.CssClass += " data-list__action-button link"; 9117 9118 @Render(action) 9119 } 9120 </div> 9121 </td> 9122 </tr> 9123 </tbody> 9124 } 9125 </table> 9126 } 9127 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9128 9129 @using System 9130 @using System.Web 9131 @using System.Collections.Generic 9132 @using Dynamicweb.Rapido.Blocks.Extensibility 9133 @using Dynamicweb.Rapido.Blocks 9134 9135 @{ 9136 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 9137 9138 Block primaryBottomSnippets = new Block() 9139 { 9140 Id = "MasterJavascriptInitializers", 9141 SortId = 100, 9142 Template = RenderPrimaryBottomSnippets() 9143 }; 9144 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 9145 } 9146 9147 @helper RenderPrimaryBottomSnippets() 9148 { 9149 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 9150 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 9151 9152 if (isWireframeMode) 9153 { 9154 <script> 9155 Wireframe.Init(true); 9156 </script> 9157 } 9158 9159 9160 if (useGoogleTagManager) 9161 { 9162 <script> 9163 document.addEventListener('addToCart', function(event) { 9164 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9165 if (typeof googleImpression == "string") { 9166 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9167 } 9168 dataLayer.push({ 9169 'event': 'addToCart', 9170 'ecommerce': { 9171 'currencyCode': googleImpression.currency, 9172 'add': { 9173 'products': [{ 9174 'name': googleImpression.name, 9175 'id': googleImpression.id, 9176 'price': googleImpression.price, 9177 'brand': googleImpression.brand, 9178 'category': googleImpression.category, 9179 'variant': googleImpression.variant, 9180 'quantity': event.detail.quantity 9181 }] 9182 } 9183 } 9184 }); 9185 }); 9186 </script> 9187 } 9188 9189 //if digitalwarehouse 9190 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 9191 { 9192 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 9193 9194 if (string.IsNullOrEmpty(cartContextId)) 9195 { 9196 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 9197 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 9198 cartContextId = cartSettings.OrderContextID; 9199 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 9200 } 9201 9202 <script> 9203 let downloadCart = new DownloadCart({ 9204 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 9205 contextId: "@cartContextId", 9206 addButtonText: "@Translate("Add")", 9207 removeButtonText: "@Translate("Remove")" 9208 }); 9209 </script> 9210 } 9211 9212 <!--$$Javascripts--> 9213 } 9214 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9215 @using System 9216 @using System.Web 9217 @using System.Collections.Generic 9218 @using Dynamicweb.Ecommerce.WebAPI.Controllers 9219 @using Dynamicweb.Ecommerce.Frontend 9220 @using Dynamicweb.Rapido.Blocks 9221 @using Degree.Kraemer.Rma.Infrastructure.Authentication 9222 9223 @functions{ 9224 9225 public string ReturnCustomFieldValue(string customFieldSystemName) 9226 { 9227 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 9228 9229 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9230 { 9231 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9232 } 9233 else if (Model.CurrentUser != null && Model.CurrentUser.ID > 0) 9234 { 9235 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9236 } 9237 var currentUserLocation = ""; 9238 9239 if (userCustomFields != null) 9240 { 9241 foreach (var field in userCustomFields) 9242 { 9243 if (field.CustomField.SystemName == customFieldSystemName) 9244 { 9245 currentUserLocation = field.Value.ToString(); 9246 } 9247 } 9248 } 9249 else 9250 { 9251 currentUserLocation = "test"; 9252 } 9253 9254 return currentUserLocation; 9255 } 9256 9257 public bool getPromptForAccount() 9258 { 9259 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.CurrentSecondaryUser; 9260 var user = secondaryUser != null ? secondaryUser : Dynamicweb.Security.UserManagement.User.get_Current(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend); 9261 // bool userIsMain = Model.CurrentSecondaryUser.ID == 0; 9262 var promptForAccount = user != null ? user.CustomFieldValues.First(f => f.CustomField.SystemName == "AccessUser_PromptForAccount").Value.ToString() == "True" : false; 9263 9264 return promptForAccount; 9265 } 9266 9267 } 9268 9269 @{ 9270 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 9271 } 9272 9273 @{ 9274 Block SideNavigation = new Block() 9275 { 9276 Id = "SideNavigation", 9277 SortId = 5, 9278 Template = RenderSideNavigation(), 9279 SkipRenderBlocksList = true 9280 }; 9281 Block userLocationModal = new Block() 9282 { 9283 Id = "UserLocationsModal", 9284 SortId = 10, 9285 Template = RenderUserLocations(), 9286 SkipRenderBlocksList = true 9287 }; 9288 masterCustomBlocksPage.Add(userLocationModal); 9289 9290 Block newRMAModal = new Block() 9291 { 9292 Id = "newRmaModal", 9293 SortId = 109, 9294 Template = RenderNewRmaForm(), 9295 SkipRenderBlocksList = true 9296 }; 9297 9298 masterCustomBlocksPage.Add(newRMAModal); 9299 Block viewRMADetails = new Block() 9300 { 9301 Id = "newRmaModal", 9302 SortId = 108, 9303 Template = RenderNewRmaViewDetails(), 9304 SkipRenderBlocksList = true 9305 }; 9306 9307 masterCustomBlocksPage.Add(viewRMADetails); 9308 Block viewRMAFullOrderDetails = new Block() 9309 { 9310 Id = "newRmaModalFullOrder", 9311 SortId = 107, 9312 Template = RenderNewRmaViewFullOrderDetails(), 9313 SkipRenderBlocksList = true 9314 }; 9315 9316 masterCustomBlocksPage.Add(viewRMAFullOrderDetails); 9317 Block RmaViewDetailsEditableBlock = new Block() 9318 { 9319 Id = "DraftRmaModal", 9320 SortId = 105, 9321 Template = RenderNewRmaViewDetailsEditable(), 9322 SkipRenderBlocksList = true 9323 }; 9324 9325 masterCustomBlocksPage.Add(RmaViewDetailsEditableBlock); 9326 Block viewOrderDetails = new Block() 9327 { 9328 Id = "newOrderHistoryDetailsModal", 9329 SortId = 106, 9330 Template = RenderNewOrderHistoryViewDetails(), 9331 SkipRenderBlocksList = true 9332 }; 9333 9334 masterCustomBlocksPage.Add(viewOrderDetails); 9335 Block newCartModal = new Block() 9336 { 9337 Id = "NewCartModal", 9338 SortId = 20, 9339 Template = RenderNewCartModal(), 9340 SkipRenderBlocksList = true 9341 }; 9342 masterCustomBlocksPage.Add(newCartModal); 9343 9344 Block newCartNameModal = new Block() 9345 { 9346 Id = "CartNameModal", 9347 SortId = 50, 9348 Template = RenderNewCartNameModal(), 9349 SkipRenderBlocksList = true 9350 }; 9351 masterCustomBlocksPage.Add(newCartNameModal); 9352 9353 if (Model.HasSecondaryUsers) 9354 { 9355 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9356 { 9357 Block impersonationListModal = new Block() 9358 { 9359 Id = "ImpersonationListModal", 9360 SortId = 30, 9361 Template = RenderImpersonationModal(), 9362 SkipRenderBlocksList = true 9363 }; 9364 9365 masterCustomBlocksPage.Add(impersonationListModal); 9366 } 9367 else 9368 { 9369 Block impersonationListModal = new Block() 9370 { 9371 Id = "ImpersonationListModal", 9372 SortId = 30, 9373 Template = RenderImpersonationModal(), 9374 SkipRenderBlocksList = true 9375 }; 9376 9377 masterCustomBlocksPage.Add(impersonationListModal); 9378 } 9379 9380 Block impersonationTemplate = new Block() 9381 { 9382 Id = "ImpersonationTemplate", 9383 SortId = 40, 9384 Template = RenderImpersonationListSelect() 9385 }; 9386 masterCustomBlocksPage.Add("MasterHeader", impersonationTemplate); 9387 } 9388 Block quickViewModal = new Block() 9389 { 9390 Id = "QuickViewModal", 9391 SortId = 60, 9392 Template = RenderQuickViewModal(), 9393 SkipRenderBlocksList = true 9394 }; 9395 9396 masterCustomBlocksPage.Add(quickViewModal); 9397 // masterCustomBlocksPage.Add(MasterBlockId.MasterMain, UserLocationModal); 9398 9399 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 9400 { 9401 Id = "CartListScript", 9402 Template = RenderCartsListSelect() 9403 }); 9404 9405 if (Model.CurrentUser.ID > 0) 9406 { 9407 Modal stopImpersonation = new Modal 9408 { 9409 Id = "StopImpersonation", 9410 Heading = new Heading 9411 { 9412 Level = 2, 9413 Title = Translate("Sign out"), 9414 Icon = new Icon 9415 { 9416 Name = "fa-sign-out", 9417 Prefix = "fas", 9418 LabelPosition = IconLabelPosition.After 9419 } 9420 }, 9421 Width = ModalWidth.Md, 9422 BodyTemplate = RenderStopImpersonationForm() 9423 }; 9424 9425 Block stopCustomImpersonation = new Block 9426 { 9427 Id = "StopImpersonationBlock", 9428 SortId = 10, 9429 Component = stopImpersonation 9430 }; 9431 masterCustomBlocksPage.RemoveBlockById("StopImpersonationBlock"); 9432 masterCustomBlocksPage.Add(stopCustomImpersonation); 9433 } 9434 Block emptyCartModal = new Block() 9435 { 9436 Id = "EmptyCartModal", 9437 SortId = 80, 9438 Template = RenderEmptyCartModal(), 9439 SkipRenderBlocksList = true 9440 }; 9441 9442 masterCustomBlocksPage.Add(emptyCartModal); 9443 9444 Block stepQuantityErrorModal = new Block() 9445 { 9446 Id = "StepQuantityErrorModal", 9447 SortId = 90, 9448 Template = RenderStepQuantityErrorModal() 9449 }; 9450 9451 masterCustomBlocksPage.Add(stepQuantityErrorModal); 9452 9453 } 9454 @{ 9455 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9456 9457 } 9458 9459 @helper RenderSideNavigation() 9460 {<p>test</p>} 9461 9462 @helper RenderUserLocations() 9463 { 9464 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 9465 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 9466 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9467 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9468 Modal getLocations = new Modal 9469 { 9470 Id = "UserLocationModal", 9471 Heading = new Heading 9472 { 9473 Level = 2, 9474 Title = Translate("Select a location") 9475 }, 9476 Width = ModalWidth.Md, 9477 BodyTemplate = RenderUserLocationsContentModal() 9478 }; 9479 if (userExists && !string.IsNullOrEmpty(customerNumber)) 9480 { 9481 <div data-location="@currentUserLocation" data-location-list="@locationList"></div> 9482 9483 if (currentUserLocation == "") 9484 { 9485 <div> @Render(getLocations) </div> 9486 } 9487 } 9488 } 9489 9490 @helper RenderUserLocationsContentModal() 9491 { 9492 <div> 9493 @RenderLocationsSelect() 9494 @Render(new Button 9495 { 9496 Title = Translate("Set location"), 9497 ButtonType = ButtonType.Button, 9498 ButtonLayout = ButtonLayout.Primary, 9499 CssClass = "u-no-margin", 9500 OnClick = "addLocation(document.querySelector('#UserLocationModalModal #LocationsSelect'))" 9501 }) 9502 </div> 9503 } 9504 9505 @helper RenderLocationsSelect() 9506 { 9507 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9508 List<string> locations = locationList.ToString().Split(',').ToList(); 9509 SelectField selectField = new SelectField 9510 { 9511 Id = "LocationsSelect", 9512 Label = Translate("Select a location"), 9513 CssClass = "u-margin-bottom", 9514 Required = true 9515 }; 9516 9517 foreach (var loc in locations) 9518 { 9519 string label; 9520 string code; 9521 string askoCode; 9522 string[] parts = loc.Split('|'); 9523 if (parts.Length >= 3) 9524 { 9525 label = parts[0].Trim(); 9526 code = parts[1].Trim(); 9527 askoCode = parts[2].Trim(); 9528 } 9529 else 9530 { 9531 label = parts[0].Trim(); 9532 code = parts[1].Trim(); 9533 } 9534 selectField.Options.Add(new SelectFieldOption { Label = label, Value = code }); 9535 } 9536 @Render(selectField) 9537 } 9538 9539 @helper RenderNewCartModal() 9540 { 9541 var newCartModal = new Modal 9542 { 9543 Id = "NewCart", 9544 Heading = new Heading { Title = Translate("Create New Cart") }, 9545 Width = ModalWidth.Md, 9546 BodyTemplate = RenderNewCartContentModal() 9547 }; 9548 9549 <div>@Render(newCartModal) </div> 9550 } 9551 9552 @helper RenderNewCartContentModal() 9553 { 9554 var baseurl = HttpContext.Current.Request.Url.ToString(); 9555 string currentUserId = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUserId().ToString(); 9556 var newCartURL = baseurl.Contains("?") ? baseurl + "&redirect=false&cartcmd=createnew&CartUserId=" + currentUserId + "&CartName=" : baseurl + "?cartcmd=createnew&redirect=false&CartUserId=" + currentUserId + "&CartName="; 9557 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9558 var cartsListFeedPageId = "/Default.aspx?ID=" + GetPageIdByNavigationTag("CartsListFeed"); 9559 9560 <div> 9561 <form method="post" id="NewCartForm" data-submit-url="@newCartURL" data-carts-url="@cartsListFeedPageId" data-change-cart-url="@setCartURL"> 9562 @Render(new HiddenField { Id = "CartUserId", Name = "CartUserId", Value = currentUserId }) 9563 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "createnew" }) 9564 @Render(new TextField { Id = "CartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Cart Name"), Required = true }) 9565 @*@Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Create") })*@ 9566 <button type="button" id="CreateNewCartButton" class="btn btn--primary dw-mod">@Translate("Create")</button> 9567 </form> 9568 </div> 9569 } 9570 9571 @helper RenderNewCartNameModal() 9572 { 9573 var newCartNameModal = new Modal 9574 { 9575 Id = "NewCartName", 9576 Heading = new Heading { Title = Translate("ChangeCartName") }, 9577 Width = ModalWidth.Md, 9578 BodyTemplate = RenderNewCartNameContentModal() 9579 }; 9580 9581 <div>@Render(newCartNameModal) </div> 9582 } 9583 9584 @helper RenderNewCartNameContentModal() 9585 { 9586 <form method="post"> 9587 @Render(new HiddenField { Id = "CartID", Name = "CartID", Value = "" }) 9588 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "setname" }) 9589 @Render(new TextField { Id = "NewCartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Enter New Name"), Required = true }) 9590 @Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Endre navn") }) 9591 </form> 9592 } 9593 9594 @helper RenderImpersonationModal() 9595 { 9596 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 9597 var promptForAccount = getPromptForAccount(); 9598 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9599 string headerMessage = isImpersonating ? Translate("Change account") : Translate("Secondary Users"); 9600 Modal secondaryUsers = new Modal 9601 { 9602 9603 Id = "SecondarUsersModal", 9604 Heading = new Heading 9605 { 9606 Level = 2, 9607 Title = headerMessage 9608 }, 9609 9610 Width = ModalWidth.Md, 9611 BodyTemplate = RenderImpersonationContentModal() 9612 }; 9613 <div data-prompt-account="@promptForAccount">@Render(secondaryUsers)</div> 9614 } 9615 9616 @helper RenderImpersonationContentModal() 9617 { 9618 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9619 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9620 string buttonTitle = isImpersonating ? Translate("Choose user") : Translate("Set user"); 9621 9622 <div class="u-margin-right u-margin-bottom">@Translate("Choose user to impersonate:")</div> 9623 <div class="impersonation-container"> 9624 <input type="checkbox" id="ImpersonationSelect_modal" class="dropdown-trigger" /> 9625 <div class="dropdown variants-filters dw-mod"> 9626 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_modal">@Translate("Choose user")</label> 9627 <div class="dropdown__content u-padding dw-mod"> 9628 <div class="dropdown__item__filter"> 9629 <input type="text" data-container-id="impersonationListModal" data-view-type="modal" placeholder="@Translate("Search")"> 9630 </div> 9631 <div class="js-handlebars-root dw-mod u-margin-bottom" id="impersonationListModal" data-template="ImpersonationListContent" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9632 </div> 9633 <label class="dropdown-trigger-off" for="ImpersonationSelect_modal"></label> 9634 </div> 9635 </div> 9636 @Render(new Button 9637 { 9638 Title = buttonTitle, 9639 ButtonType = ButtonType.Button, 9640 ButtonLayout = ButtonLayout.Primary, 9641 CssClass = "u-no-margin u-margin-top", 9642 ExtraAttributes = new Dictionary<string, string> 9643 { 9644 { "data-role", "impersonate-submit" } 9645 } 9646 // OnClick = "sessionStorage.setItem('impersonationModalOpen', 'true'); sessionStorage.setItem('recentlyLoggedIn', 'true'); localStorage.removeItem('userLocation'); document.getElementById(document.querySelector('#SecondarUsersModalModal .dropdown__header').getAttribute('data-value')).submit();" 9647 }) 9648 } 9649 9650 @helper RenderImpersonationListSelect() 9651 { 9652 bool promtForAccount = getPromptForAccount(); 9653 9654 if (promtForAccount) 9655 { 9656 <script id="ImpersonationListContent" data-test="1" type="text/x-template"> 9657 9658 {{#.}} 9659 {{#Users}} 9660 {{#if main}} 9661 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9662 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9663 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9664 </form> 9665 {{else}} 9666 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9667 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9668 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9669 </form> 9670 {{/if}} 9671 {{/Users}} 9672 {{/.}} 9673 </script> 9674 } 9675 else 9676 { 9677 <script id="ImpersonationListContent" data-test="2" type="text/x-template"> 9678 9679 {{#.}} 9680 {{#ifCond totalUsers "!==" "2"}} 9681 9682 {{#Users}} 9683 {{#if main}} 9684 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9685 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9686 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9687 </form> 9688 {{else}} 9689 9690 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'false');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9691 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9692 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9693 </form> 9694 {{/if}} 9695 {{/Users}} 9696 9697 {{/ifCond}} 9698 {{/.}} 9699 </script> 9700 } 9701 9702 <script id="ImpersonationListContentHeader" type="text/x-template"> 9703 {{#.}} 9704 {{#Users}} 9705 {{#if main}} 9706 {{#if secondaryUser}} 9707 {{#unless hideSelf}} 9708 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9709 {{/unless}} 9710 {{else}} 9711 {{#unless hideSelf}} 9712 {{#ifCond ../totalUsers "!==" 2}} 9713 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'true');logOutCurrentUser()" tabindex="0">{{name}}</div> 9714 {{else}} 9715 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9716 {{/ifCond}} 9717 {{/unless}} 9718 {{/if}} 9719 9720 {{else}} 9721 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span><span>{{formatCustomerNumber customerNumber}}<span></div> 9722 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9723 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9724 </form> 9725 {{/if}} 9726 {{/Users}} 9727 9728 {{/.}} 9729 </script> 9730 } 9731 9732 @helper RenderQuickViewModal() 9733 { 9734 <div class="quick-view-modal"> 9735 @Render(new Modal 9736 { 9737 Id = "ProductDetailQuickView", 9738 Heading = new Heading 9739 { 9740 Level = 3, 9741 Title = "", 9742 CssClass = "bs-margin-bottom-0 bs-border-none" 9743 }, 9744 Width = ModalWidth.Full, 9745 Height = ModalHeight.Full, 9746 BodyText = "" 9747 }) 9748 </div> 9749 } 9750 9751 @helper RenderCartsListSelect() 9752 { 9753 var baseurl = HttpContext.Current.Request.Url.ToString(); 9754 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9755 9756 <script id="CartsListContent" type="text/x-template"> 9757 {{#.}} 9758 <select id="CartsSelect" class="u-full-width u-margin-bottom" data-url="@setCartURL"> 9759 @*<option>@Translate("Change Cart")</option>*@ 9760 {{#Carts}} 9761 <option value="{{id}}" data-active="{{isCartActive}}" {{selected}}>{{name}}</option> 9762 {{/Carts}} 9763 </select> 9764 {{/.}} 9765 </script> 9766 } 9767 9768 @helper RenderEmptyCartModal() 9769 { 9770 @Render(new Modal 9771 { 9772 Id = "EmptyCartModal", 9773 Heading = new Heading 9774 { 9775 Level = 3, 9776 Title = Translate("cartEmptyDisclaimer"), 9777 CssClass = "u-margin-bottom" 9778 }, 9779 Width = ModalWidth.Md, 9780 BodyTemplate = RenderEmptyCartModalBody() 9781 }) 9782 } 9783 9784 @helper RenderEmptyCartModalBody() 9785 { 9786 <div class="u-flex grid--justify-space-between"> 9787 <button type="button" title="@Translate("Yes")" class="btn empty-cart btn--primary dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event); document.getElementById('EmptyCartModalModalTrigger').checked = false; sessionStorage.setItem('minicartState', 'closed'); getContentFirstCart();">@Translate("Yes")</button> 9788 <button type="button" title="@Translate("No")" class="btn empty-cart btn--secondary dw-mod u-no-margin u-margin-bottom" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = false;">@Translate("No")</button> 9789 </div> 9790 } 9791 9792 @helper RenderStepQuantityErrorModal() 9793 { 9794 Modal stepQuantityError = new Modal 9795 { 9796 Id = "StepQuantityError", 9797 Heading = new Heading { Title = Translate("Quantity error") }, 9798 Width = ModalWidth.Md, 9799 BodyTemplate = RenderErrorModalContent() 9800 }; 9801 9802 <div>@Render(stepQuantityError)</div> 9803 } 9804 9805 @helper RenderErrorModalContent() 9806 { 9807 <div class="u-padding"> 9808 <h5 class="u-margin-bottom"> 9809 <span class="product-name"></span> 9810 </h5> 9811 <h5 class="quantity-change-error-text-multiple"> 9812 @Translate("add multi quantity") 9813 <span class="product-quantity"></span> 9814 </h5> 9815 <h5 class="quantity-change-error-text-zero u-hidden"> 9816 @Translate("Please insert the minimum quantity") 9817 <span class="product-quantity"></span> 9818 </h5> 9819 </div> 9820 } 9821 9822 @helper RenderNewRmaViewDetails() 9823 { 9824 Modal rmaViewDetails = new Modal 9825 { 9826 Id = "rmaViewDetails", 9827 Heading = new Heading { Title = Translate("AVVIK") }, 9828 BodyTemplate = RmaViewDetails() 9829 }; 9830 <div data-ref="rmaViewDetails">@Render(rmaViewDetails)</div> 9831 } 9832 @helper RenderNewOrderHistoryViewDetails() 9833 { 9834 Modal orderHistoryDetails = new Modal 9835 { 9836 Id = "rmaViewDetails2", 9837 Heading = new Heading { Title = Translate("ORDREBEKREFTELSE") }, 9838 BodyTemplate = ViewOrderDetails2() 9839 }; 9840 <div data-ref="orderHistoryDetails">@Render(orderHistoryDetails)</div> 9841 } 9842 @helper RenderNewRmaForm() 9843 { 9844 Modal newRmaForm = new Modal 9845 { 9846 Id = "rmaForm", 9847 Heading = new Heading { Title = Translate("AVVIK") }, 9848 BodyTemplate = RmaFormContent() 9849 }; 9850 <div data-ref="newRMA">@Render(newRmaForm)</div> 9851 } 9852 9853 @helper RenderNewRmaViewFullOrderDetails() 9854 { 9855 Modal rmaViewDetailsFullOrder = new Modal 9856 { 9857 Id = "rmaViewDetailsFullOrder", 9858 Heading = new Heading { Title = Translate("AVVIK") }, 9859 BodyTemplate = RmaViewDetailsFullOrder() 9860 }; 9861 <div>@Render(rmaViewDetailsFullOrder)</div> 9862 } 9863 9864 @helper RenderNewRmaViewDetailsEditable() 9865 { 9866 Modal rmaViewDetailsEditable = new Modal 9867 { 9868 Id = "rmaViewDetailsEditable", 9869 Heading = new Heading { Title = Translate("AVVIK") }, 9870 BodyTemplate = RmaViewDetailsEditable() 9871 }; 9872 <div>@Render(rmaViewDetailsEditable)</div> 9873 } 9874 9875 @helper RmaFormContent() 9876 { 9877 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9878 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 9879 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 9880 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 9881 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 9882 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 9883 var company = Model.CurrentUser.Company; 9884 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 9885 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9886 @*<h1>@userID</h1> 9887 <h1>@token</h1>*@ 9888 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 9889 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 9890 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 9891 <div class="u-hidden" id="CurrentUserCompany" data-customer-company="@isCompanyKraemer"></div> 9892 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 9893 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 9894 9895 <div class="rma-modal__container"> 9896 9897 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-container" data-template="rma-form-hidden-inputs" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 9898 9899 <header class="bs-d-flex bs-flex-column bs-flex-xl-row bs-flex-wrap bs-gap-3 bs-gap-lg-5 rma-modal__header"> 9900 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 9901 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 9902 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 9903 @*<h1 class="mb-0">@Model.SecondaryUsers.Count</h1>*@ 9904 <div class="bs-d-flex bs-flex-column bs-flex-md-row bs-gap-3"> 9905 @if (Model.HasSecondaryUsers) 9906 { 9907 <div class="modal__select-rma impersonation-container-filter-rma create-rma-modal"> 9908 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 9909 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9910 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose user")</label> 9911 <div class="dropdown__content u-padding dw-mod"> 9912 <div class="dropdown__item__filter"> 9913 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9914 </div> 9915 <div class=" js-handlebars-root dw-mod" id="impersonationListFilterCreateRmaModal" data-template="ImpersonationListContentFilterCreateRmaModal" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9916 </div> 9917 </div> 9918 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 9919 </div> 9920 } 9921 9922 <div class="modal__select-rma"> 9923 <div class="order-container-filter create-rma-modal"> 9924 <input type="checkbox" id="OrderSelect" class="dropdown-trigger" /> 9925 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9926 <label class="dropdown__header dropdown__btn dw-mod" for="OrderSelect" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose an order")</label> 9927 <div class="dropdown__content u-padding dw-mod"> 9928 <div class="dropdown__item__filter"> 9929 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9930 </div> 9931 <div class=" js-handlebars-root dw-mod" id="RMA-Order-Select-container" data-template="RMA-Order-Select" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"> 9932 </div> 9933 </div> 9934 <label class="dropdown-trigger-off" for="OrderSelect"></label> 9935 </div> 9936 </div> 9937 </div> 9938 </div> 9939 </header> 9940 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9941 <div class="bs-d-flex"> 9942 <div class="toast-body"> 9943 @Translate("Please fill all required fields") 9944 </div> 9945 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9946 </div> 9947 </div> 9948 <div class="rma-modal__selected-order orderline-form"> 9949 9950 @* Switch between full order rma and orderline RMA *@ 9951 <div class="rma-modal-container bs-px-3 form-orderline"> 9952 <div class="modal-container__content u-hidden"> 9953 <div class="bs-grid rma-modal-container bs-mt-5"> 9954 <div class="g-col-md-1 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9955 <div class="g-col-md-5 g-col-12 d-flex u-flex--row bs-align-items-center bs-justify-content-center bs-position-relative"> 9956 <input type="text" id="SearchOrderlinesInput" name="search-rma" placeholder="@Translate("Søk etter produkt...")" class="mb-0 form-control search-ahead__input"> 9957 <button type="button" id="SearchOrderlinesButton" class="search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9958 <i class="far fa-search bs-px-2"></i> 9959 </button> 9960 <button type="button" id="RemoveSearchOrderlinesButton" class=" u-hidden search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9961 <i class="far fa-times bs-px-2"></i> 9962 </button> 9963 </div> 9964 <div class="g-col-md-3 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9965 <div class="g-col-md-3 g-col-12 bs-d-grid"> 9966 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-w-100 bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1" style="justify-self:end;">@Translate("Hel order")</button> 9967 </div> 9968 </div> 9969 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 9970 <div class="u-border-bottom rma-page__header-grid-container rma-header"> 9971 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 9972 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 9973 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksårsak")</div> 9974 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert")</div> 9975 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksantall")</div> 9976 @* <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert Antall")</div>*@ 9977 </div> 9978 </div> 9979 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9980 <div class="bs-d-flex"> 9981 <div class="toast-body"> 9982 @Translate("Please fill all required fields") 9983 </div> 9984 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9985 </div> 9986 </div> 9987 </div> 9988 @* products loop *@ 9989 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-orderlines-container" data-template="rma-form-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 9990 </div> 9991 </div> 9992 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 9993 <div class="rma-modal-container"> 9994 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9995 <div class="bs-d-flex"> 9996 <div class="toast-body"> 9997 @Translate("Please fill all required fields") 9998 </div> 9999 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10000 </div> 10001 </div> 10002 <div class="d-flex bs-flex-wrap bs-gap-3 bs-flex-row bs-justify-content-between bs-mt-5 bs-mb-2 rma-options-container"> 10003 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 10004 <option value="0">@Translate("Avviksårsak")</option> 10005 <option value="1">@Translate("Faktura")</option> 10006 <option value="3">@Translate("Kvalitet")</option> 10007 <option value="2">@Translate("Pakking")</option> 10008 <option value="4">@Translate("Vedlikehold")</option> 10009 <option value="5">@Translate("Feil Levert")</option> 10010 <option value="6">@Translate("Multiple")</option> 10011 </select> 10012 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 10013 </div> 10014 <div class="inputComment bs-w-100 bs-mt-5"> 10015 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 10016 @* 10017 <label for="FullOrderComment">@Translate("Avvikskommentar")</label> 10018 *@ 10019 </div> 10020 <div class="inputComment bs-w-100 bs-mt-3"> 10021 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 10022 </div> 10023 <input class="create-rma-form-input form-control create-rma-Attachment-input bs-mt-3" id="CreateRmaFormAttachmentFull" name="FullOrderAttachment" type="file" multiple="multiple" /> 10024 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 10025 </div> 10026 <div class="bs-mt-5 bs-w-50 bs-mb-5"> 10027 <div class="orderInfo d-flex bs-justify-content-between"> 10028 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Antall produktlinjer")</p> 10029 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-orderlines">7</p> 10030 </div> 10031 <div class="orderInfo d-flex bs-justify-content-between"> 10032 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Totalt antall produkter")</p> 10033 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-quantity">289</p> 10034 </div> 10035 <div class="orderInfo d-flex bs-justify-content-between"> 10036 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Ordretotal eks. MVA")</p> 10037 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-amount">35 897,18 kr </p> 10038 </div> 10039 </div> 10040 </div> 10041 </div> 10042 10043 <footer class="modal__rma-footer"> 10044 <div class="footer-button-container"> 10045 <button class="submit-rma-button disabled submit-rma-button bs-btn bs-btn-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,true,this)">@Translate("Opprett Avvik")</button> 10046 </div> 10047 <div class="modal__rma-footer-icon-buttons"> 10048 </div> 10049 </footer> 10050 </div> 10051 <script id="ImpersonationListContentFilterCreateRmaModal" type="text/x-template"> 10052 {{#.}} 10053 {{#Users}} 10054 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 10055 {{/Users}} 10056 {{/.}} 10057 </script> 10058 10059 <script id="rma-form-hidden-inputs" type="text/x-template"> 10060 {{#.}} 10061 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 10062 <input name="deviationId" value="0" type="text" class="u-hidden" /> 10063 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 10064 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 10065 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 10066 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 10067 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 10068 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 10069 {{/.}} 10070 </script> 10071 10072 <script id="rma-form-orderlines" type="text/x-template"> 10073 {{#.}} 10074 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" data-product-name="{{orderLineProductName}}" data-product-number="{{orderLineProductNumber}}" style="border-color: #597CCA;"> 10075 <input type="hidden" name="productId" value="{{orderLineProductId}}" /> 10076 <input name="deviationId" value="{{orderId}}" type="text" class="u-hidden" /> 10077 <input name="deviationOrderLineId" value="{{orderId}}" type="text" class="u-hidden" /> 10078 <input name="deviationLineId" value="0" type="text" class="u-hidden" /> 10079 10080 <input type="hidden" name="productNumber" value="{{orderLineProductNumber}}" /> 10081 <input type="hidden" name="productName" value="{{orderLineProductName}}" /> 10082 <input type="hidden" name="productImage" value="{{#if orderLineProductImage}}{{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 10083 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10084 <input type="hidden" name="supplierName" value="{{orderLineSupplierName}}" /> 10085 <div class="rma-form-grid-item rma-table-item"> 10086 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10087 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10088 </div> 10089 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row bs-align-items-center"> 10090 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10091 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="rma-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 10092 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}" data-test="44444">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 10093 </div> 10094 </div> 10095 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10096 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10097 <option value="0">@Translate("Avviksårsak")</option> 10098 <option value="1">@Translate("Faktura")</option> 10099 <option value="3">@Translate("Kvalitet")</option> 10100 <option value="2">@Translate("Pakking")</option> 10101 <option value="4">@Translate("Vedlikehold")</option> 10102 <option value="5">@Translate("Feil Levert")</option> 10103 <option value="6">@Translate("Multiple")</option> 10104 </select> 10105 </div> 10106 10107 <div class=" rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 10108 <input type="hidden" name="deliveredQuantity" value="{{orderLineQuantity}}" /> 10109 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{orderLineUnitPrice}}" /> 10110 <input type="hidden" name="Total-Test-orderLineUnitPrice" value="{{orderLineTotalPrice}}" /> 10111 10112 <div class="fw-700 rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10113 <input class="create-rma-form-input create-rma-quantity-input disabled" data-delivered-quantity="{{orderLineQuantity}}" @*value="{{orderLineQuantity}}"*@ value="0" name="deviationQuantity" type="number" min="0" step="1" oninput="showAdditionalOrderlineFields(this, this.value)" max="{{orderLineQuantity}}" /> 10114 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 u-hidden removeOrderlineButton" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10115 <i class="far fa-times bs-text-danger bs-px-2"></i> 10116 </button> 10117 </div> 10118 </div> 10119 <div class="grid u-hidden additional-rma-orderline-fields additional-fields-rma"> 10120 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10121 </div> 10122 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10123 <input type="text" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10124 </div> 10125 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10126 <input class="create-rma-form-input create-rma-expected-result" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10127 </div> 10128 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10129 <input class="create-rma-form-input form-control create-rma-Attachment-input" id="CreateRmaFormAttachment_{{orderLineProductId}}" name="attachment" type="file" /> 10130 <div class="u-hidden emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10131 </div> 10132 </div> 10133 </form> 10134 {{/.}} 10135 </script> 10136 10137 <script id="RMA-Order-Select" type="text/x-template"> 10138 10139 {{#.}} 10140 {{#ifCond orderId "!==" "No"}} 10141 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10142 {{/ifCond}} 10143 {{/.}} 10144 </script> 10145 10146 } 10147 @helper DelayTranslations(string word) 10148 { 10149 <p>@Translate(word)</p> 10150 } 10151 @helper RmaViewDetailsEditable() 10152 { 10153 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 10154 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 10155 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 10156 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 10157 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 10158 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 10159 10160 if (string.IsNullOrEmpty(token)) 10161 { 10162 token = Degree.Kraemer.Ecommerce.Infrastructure.Authentication.AuthenticationManager.GetToken(userID.ToString()); 10163 } 10164 10165 string favoriteUserToken = ""; 10166 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10167 10168 if (currentUserAccess != null) 10169 { 10170 favoriteUserToken = JwtService.GetToken(currentUserAccess, 86400); 10171 } 10172 10173 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 10174 10175 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 10176 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 10177 <input type="hidden" id="FavoriteUserToken" value="@favoriteUserToken" /> 10178 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 10179 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 10180 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 10181 10182 <div class="rma-modal__container"> 10183 10184 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-draft-container" data-template="rma-form-hidden-inputs-draft" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 10185 10186 <header class="u-flex u-flex--row rma-modal__header" bs-d-flex bs-flex-wrap> 10187 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10188 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 10189 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 10190 <div class="fs-4 fw-bold text-primary" id="SelectedCustomerName"></div> 10191 <div class="fs-4 fw-bold text-primary" id="SelectedOrderId"></div> 10192 <div class="fs-4 fw-bold text-primary" id="SelectedDeviationId"></div> 10193 </header> 10194 <div class=""> 10195 <div class=""> 10196 <div class="rma-modal__selected-order orderline-form"> 10197 10198 <div class="bs-grid rma-modal-container bs-mt-md-5"> 10199 <div class="g-col-12 g-col-md-1 d-flex u-flex--row align-items-center justify-content-center"></div> 10200 <div class="g-col-12 g-col-md-5 d-flex u-flex--row align-items-center justify-content-center position-relative"> 10201 </div> 10202 <div class="g-col-12 g-col-md-3 d-flex u-flex--row align-items-center justify-content-center"></div> 10203 <div class="g-col-12 g-col-md-3 bs-d-flex bs-justify-content-center"> 10204 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1 toFullOrderDraftButton">@Translate("Hel order")</button> 10205 </div> 10206 </div> 10207 @* Switch between full order rma and orderline RMA *@ 10208 <div class="rma-modal-container bs-px-3 form-orderline"> 10209 <div class="d-flex"> 10210 </div> 10211 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 10212 <div class="u-border-bottom rma-page__header-grid-container"> 10213 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 10214 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 10215 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center justify-content-center">@Translate("Avviksårsak")</div> 10216 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert")</div> 10217 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Avviksantall")</div> 10218 <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert Antall")</div> 10219 </div> 10220 </div> 10221 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10222 <div class="bs-d-flex"> 10223 <div class="toast-body"> 10224 @Translate("Please fill all required fields") 10225 </div> 10226 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10227 </div> 10228 </div> 10229 10230 @* products loop *@ 10231 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-draft-orderlines-container" data-template="rma-form-draft-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 10232 @*<div class="bs-d-flex bs-align-items-center bs-justify-content-start bs-my-5"> 10233 <input id="DeviationAgreementDraftFormOrderline" class="bs-me-3 " onclick="enableSubmitButton(this)" type="checkbox" style="width: 27px;height: 27px;" /> 10234 <label class="mb-0" for="DeviationAgreementDraftFormOrderline"> 10235 <span class=""></span>@Translate("Ja, jeg er kjent med retningslinjene for avvik og mener at dette er et avvik. ") 10236 </label> 10237 </div>*@ 10238 </div> 10239 </div> 10240 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 10241 <div class="rma-modal-container"> 10242 <div class="d-flex bs-justify-content-between bs-mt-5 bs-mb-2"> 10243 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 10244 <option value="0">@Translate("Avviksårsak")</option> 10245 <option value="1">@Translate("Faktura")</option> 10246 <option value="3">@Translate("Kvalitet")</option> 10247 <option value="2">@Translate("Pakking")</option> 10248 <option value="4">@Translate("Vedlikehold")</option> 10249 <option value="5">@Translate("Feil Levert")</option> 10250 <option value="6">@Translate("Multiple")</option> 10251 </select> 10252 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 10253 </div> 10254 <div class="inputComment bs-w-100 bs-mt-5"> 10255 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 10256 </div> 10257 <div class="inputComment bs-w-100 bs-mt-3"> 10258 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 10259 </div> 10260 <input class="create-rma-form-input form-control create-rma-Attachment-input" name="FullOrderAttachment" type="file" multiple="multiple" /> 10261 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 10262 </div> 10263 </div> 10264 </div> 10265 </div> 10266 </div> 10267 <footer class="modal__rma-footer"> 10268 <div class="footer-button-container"> 10269 <button class="submit-rma-button bs-btn bs-btn-primary " type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,false)">@Translate("Opprett Avvik")</button> 10270 <button class="submit-rma-button bs-bg-white bs-btn bs-btn-outline-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),1,false)">@Translate("Save as draft")</button> 10271 </div> 10272 <div class="modal__rma-footer-icon-buttons"> 10273 </div> 10274 </footer> 10275 </div> 10276 <script id="ImpersonationListContentFilterCreateRmaDraftModal" type="text/x-template"> 10277 @{ 10278 string title = @Translate("Choose user"); 10279 } 10280 {{#.}} 10281 <div class="impersonation-container-filter-rma create-rma-modal"> 10282 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 10283 <div class="dropdown variants-filters bs-w-100 dw-mod"> 10284 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@title</label> 10285 <div class="dropdown__content u-padding dw-mod"> 10286 <div class="dropdown__item__filter"> 10287 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 10288 </div> 10289 10290 {{>ImpersonationListContentFilterSelectCreateRmaDraftModal}} 10291 </div> 10292 </div> 10293 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 10294 </div> 10295 10296 {{/.}} 10297 </script> 10298 <script id="ImpersonationListContentFilterSelectCreateRmaDraftModal" type="text/x-template"> 10299 {{#.}} 10300 {{#Users}} 10301 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 10302 {{/Users}} 10303 {{/.}} 10304 </script> 10305 10306 <script id="rma-form-hidden-inputs-draft" type="text/x-template"> 10307 {{#.}} 10308 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 10309 <input name="deviationId" id="HiddenInputsDeviationId" value="0" type="text" class="u-hidden" /> 10310 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 10311 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 10312 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 10313 @* 10314 <input name="userId" value="@Model.CurrentUser.ID" type="text" class="u-hidden" /> 10315 *@ 10316 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 10317 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 10318 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 10319 @*<input name="isFullDeviation" value="false" type="text" class="u-hidden">*@ 10320 {{/.}} 10321 </script> 10322 10323 <script id="rma-form-draft-orderlines" type="text/x-template"> 10324 {{#.}} 10325 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" style="border-color: #597CCA;"> 10326 <input type="hidden" name="productId" value="{{productId}}" /> 10327 <input name="deviationId" id="HiddenInputsDeviationId" value="{{deviationId}}" type="text" class="u-hidden" /> 10328 <input name="deviationOrderLineId" value="{{deviationOrderLineId}}" type="text" class="u-hidden" /> 10329 <input name="deviationLineId" value="{{deviationLineId}}" type="text" class="u-hidden" /> 10330 10331 <input type="hidden" name="productNumber" value="{{productNumber}}" /> 10332 <input type="hidden" name="productName" value="{{productName}}" /> 10333 <input type="hidden" name="productImage" value="{{#if productImage}}{{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 10334 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10335 <input type="hidden" name="supplierName" value="{{supplierName}}" /> 10336 <div class="rma-form-grid-item"> 10337 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10338 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10339 </div> 10340 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row align-items-center"> 10341 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10342 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{deviationOrderLineId}}" style="flex-wrap: wrap"><span>{{productNumber}}</span>{{#ifCond productNumber '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateFirst20 productName}}</span></div> 10343 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineMeasurementUnit '!==' ''}}bs-mt-2{{/ifCond}}"><span>{{truncateLast16 supplierName}}</span>{{#ifCond orderLineMeasurementUnit '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10344 </div> 10345 </div> 10346 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10347 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" value={{reason}} name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10348 <option {{#ifCond reason '===' 0}} selected {{/ifCond}} value="0">@Translate("Avviksårsak")</option> 10349 <option {{#ifCond reason '===' 1}} selected {{/ifCond}} value="1">@Translate("Faktura")</option> 10350 <option {{#ifCond reason '===' 3}} selected {{/ifCond}} value="3">@Translate("Kvalitet")</option> 10351 <option {{#ifCond reason '===' 2}} selected {{/ifCond}} value="2">@Translate("Pakking")</option> 10352 <option {{#ifCond reason '===' 4}} selected {{/ifCond}} value="4">@Translate("Vedlikehold")</option> 10353 <option {{#ifCond reason '===' 5}} selected {{/ifCond}} value="5">@Translate("Feil Levert")</option> 10354 <option {{#ifCond reason '===' 6}} selected {{/ifCond}} value="6">@Translate("Multiple")</option> 10355 </select> 10356 </div> 10357 <div class="rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10358 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10359 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{deviationOrderLineTotalPrice}}" /> 10360 <div class=" rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10361 <input class="create-rma-form-input create-rma-quantity-input {{#ifCond deviationQuantity '===' 0}} disabled {{/ifCond}}" value="{{deviationQuantity}}" oninput="showAdditionalOrderlineFields(this, this.value)" data-delivered-quantity="{{deliveredQuantity}}" name="deviationQuantity" type="number" min="0" step="1" max="{{deliveredQuantity}}" /> 10362 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 removeOrderlineButton {{#ifCond deviationQuantity '===' 0}} u-hidden {{/ifCond}}" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10363 <i class="far fa-times bs-text-danger bs-px-2"></i> 10364 </button> 10365 </div> 10366 </div> 10367 <div class="grid {{#ifCond reason '===' 0}} u-hidden {{/ifCond}} additional-rma-orderline-fields"> 10368 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10369 </div> 10370 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10371 <input type="text" value="{{#each messages}}{{message}}{{/each}}" data-message-id="{{#each messages}}{{messageId}}{{/each}}" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10372 </div> 10373 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10374 <input class="create-rma-form-input create-rma-expected-result" value="{{requestedOutcome}}" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10375 </div> 10376 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10377 <input class="create-rma-form-input form-control create-rma-Attachment-input" data-image-path="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" value="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" id="CreateRmaFormAttachment_{{productId}}" name="attachment" type="file" /> 10378 <div class="{{#ifCond messageFile '!==' null}} u-hidden {{/ifCond}}emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10379 </div> 10380 </div> 10381 </form> 10382 {{/.}} 10383 </script> 10384 10385 <script id="RMA-Order-Select" type="text/x-template"> 10386 10387 {{#.}} 10388 {{#ifCond orderId "!==" "No"}} 10389 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10390 {{/ifCond}} 10391 {{/.}} 10392 </script> 10393 10394 } 10395 10396 @helper RmaViewDetails() 10397 { 10398 var company = Model.CurrentUser.Company; 10399 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10400 10401 <form class="rma-modal__container"> 10402 <header class="u-flex u-flex--row rma-modal__header bs-px-3 bs-d-flex bs-flex-wrap"> 10403 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10404 <div class="rma-order-number rma-view-details__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10405 </header> 10406 <input type="hidden" id="SelectedDeviationId" value="" /> 10407 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10408 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10409 <div class="js-handlebars-root bs-px-3 bs-mb-5 dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10410 10411 <div class="bs-px-3"> 10412 <div class="rma-modal-container"> 10413 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg u-border-bottom"> 10414 <div class="rma-details-page__header-grid-container"> 10415 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block"></div> 10416 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Produkt")</div> 10417 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksårsak")</div> 10418 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Levert")</div> 10419 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksantall")</div> 10420 <div class="fw-700 rma-page__grid-table-cell">@Translate("Pris")</div> 10421 </div> 10422 </div> 10423 @*// products loop *@ 10424 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-handlebars-container" data-template="Rma-Details-handlebars" data-json-feed="" data-preloader="overlay" data-init-onload="true"></div> 10425 </div> 10426 </div> 10427 @*End of Products Loop *@ 10428 <div class="modal__content bs-px-3 rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10429 @*Start of the Messaging Loop*@ 10430 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10431 <div class="rma-page__write-comment"> 10432 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10433 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10434 @*<label for="file-input"> 10435 <img width="19" height="38" src="/Files/Images/attachment.svg" /> 10436 </label>*@ 10437 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10438 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10439 <span id="file-input-error" style="display:none">@Translate("Wrong file")</span> 10440 </div> 10441 </div> 10442 <footer class="modal__rma-footer"> 10443 <div class="footer__buttons"> 10444 @if (isCompanyKraemer) 10445 { 10446 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10447 @*<option value="1">@Translate("STATUS_1")</option>*@ 10448 <option value="2" default selected>@Translate("STATUS_2")</option> 10449 <option value="3">@Translate("STATUS_3")</option> 10450 <option value="4">@Translate("STATUS_4")</option> 10451 </select> 10452 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10453 } 10454 else 10455 { 10456 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenRmaModal">@Translate("Re-open Deviation")</button> 10457 <div class="bs-modal bs-fade" id="reopenRmaModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10458 <div class="modal-dialog bs-mt-4"> 10459 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10460 <div class="modal-body bs-pb-0 bs-text-center"> 10461 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10462 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10463 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10464 </div> 10465 </div> 10466 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10467 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10468 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10469 </div> 10470 </div> 10471 </div> 10472 </div> 10473 10474 } 10475 </div> 10476 <div class="modal__rma-footer-icon-buttons"> 10477 </div> 10478 </footer> 10479 </form> 10480 <script> 10481 let applyReasonTranslation = ()=>{ 10482 document.querySelectorAll(".reasonTranslation").forEach(el =>{ 10483 let reason = el.innerHTML; 10484 switch (reason){ 10485 10486 case "REASON_0": 10487 el.innerHTML = `@Translate("REASON_0")`; 10488 break; 10489 case "REASON_1": 10490 el.innerHTML = `@Translate("REASON_1")`; 10491 break; 10492 case "REASON_2": 10493 console.log("REASON_2") 10494 el.innerHTML = `@Translate("REASON_2")`; 10495 break; 10496 case "REASON_3": 10497 el.innerHTML = `@Translate("REASON_3")`; 10498 break; 10499 case "REASON_4": 10500 console.log("REASON_4") 10501 el.innerHTML = `@Translate("REASON_4")`; 10502 break; 10503 case "REASON_5": 10504 el.innerHTML = `@Translate("REASON_5")`; 10505 break; 10506 case "REASON_6": 10507 el.innerHTML = `@Translate("REASON_6")`; 10508 break; 10509 } 10510 }) 10511 } 10512 let applyStatusTranslation = ()=>{ 10513 document.querySelectorAll(".statusTranslation").forEach(el =>{ 10514 let status = el.innerHTML; 10515 switch (status){ 10516 case "STATUS_0": 10517 el.innerHTML = `@Translate("STATUS_0")`; 10518 break; 10519 case "STATUS_1": 10520 el.innerHTML = `@Translate("STATUS_1")`; 10521 break; 10522 case "STATUS_2": 10523 console.log("STATUS_2") 10524 el.innerHTML = `@Translate("STATUS_2")`; 10525 break; 10526 case "STATUS_3": 10527 el.innerHTML = `@Translate("STATUS_3")`; 10528 break; 10529 case "STATUS_4": 10530 console.log("STATUS_4") 10531 el.innerHTML = `@Translate("STATUS_4")`; 10532 break; 10533 case "STATUS_5": 10534 el.innerHTML = `@Translate("STATUS_5")`; 10535 break; 10536 case "STATUS_6": 10537 el.innerHTML = `@Translate("STATUS_6")`; 10538 break; 10539 } 10540 }) 10541 } 10542 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10543 applyReasonTranslation(); 10544 }) 10545 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10546 applyReasonTranslation(); 10547 }) 10548 document.getElementById("Rma-Order-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10549 applyStatusTranslation(); 10550 }) 10551 document.getElementById("Rma-Order-Details-handlebars-container-first-row").addEventListener('contentLoaded', function (e) { 10552 applyStatusTranslation(); 10553 }) 10554 document.getElementById("Rma-Order-Details-handlebars-container-second-row").addEventListener('contentLoaded', function (e) { 10555 applyStatusTranslation(); 10556 applyReasonTranslation(); 10557 }) 10558 </script> 10559 <script id="Rma-Details-handlebars" type="text/x-template"> 10560 10561 {{#.}} 10562 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10563 <div class="rma-products-list bs-border-bottom"> 10564 <div class="rma-details-page__header-grid-container"> 10565 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10566 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10567 </div> 10568 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row align-items-center"> 10569 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10570 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10571 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="1111111">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10572 </div> 10573 </div> 10574 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10575 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10576 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10577 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationOrderLineTotalPrice}}</div> 10578 </div> 10579 10580 <div class="grid"> 10581 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10582 </div> 10583 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10584 <div class="rma-product-info-container"> 10585 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10586 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10587 {{#each messages}} 10588 {{message}} 10589 {{/each}} 10590 </div> 10591 </div> 10592 </div> 10593 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row bs-align-items-start"> 10594 <div class="rma-product-info-container"> 10595 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10596 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10597 </div> 10598 </div> 10599 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center"></div> 10600 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10601 <div class="rma-product-info-container"> 10602 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10603 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10604 {{#each messages}} 10605 {{#each messageFiles}} 10606 @* 10607 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10608 *@ <a href="{{messageFile}}" target="_blank"> 10609 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10610 </a> 10611 {{/each}} 10612 {{/each}} 10613 </div> 10614 </div> 10615 </div> 10616 </div> 10617 </div> 10618 {{/.}} 10619 </script> 10620 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10621 {{#.}} 10622 <div class="d-grid"> 10623 {{#if isCustomer}} 10624 <div class="rma-page__user-message"> 10625 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10626 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10627 <div class="rma-page__message-date ">{{messageDate}}</div> 10628 </div> 10629 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10630 <div class="rma-page__attachment-footer"> 10631 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10632 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10633 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10634 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10635 </a> {{/each}} 10636 </a> 10637 </div> 10638 </div> 10639 {{else}} 10640 <div class="rma-page__admin-message"> 10641 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10642 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10643 <div class="rma-page__message-date ">{{messageDate}}</div> 10644 </div> 10645 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10646 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10647 10648 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10649 {{#each messageFiles}} 10650 <a href="{{messageFile}}" target="_blank"> 10651 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10652 </a> 10653 {{/each}} 10654 </div> 10655 </div> 10656 {{/if}} 10657 </div> 10658 10659 {{/.}} 10660 </script> 10661 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10662 {{#.}} 10663 <div class="rma-selected-order-info-data bs-mt-3 bs-px-5 bs-grid"> 10664 <div class="cell g-col-6 g-col-md-3"> 10665 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10666 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}} " class="bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10667 </div> 10668 <div class="cell g-col-6 g-col-md-3"> 10669 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10670 <div class="">{{formatDate createdDate}}</div> 10671 </div> 10672 <div class="cell g-col-6 g-col-md-3"> 10673 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10674 <div class=" statusTranslation">STATUS_{{status}}</div> 10675 </div> 10676 <div class="cell g-col-6 g-col-md-3"> 10677 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10678 <div class="">{{formatDate updatedDate}}</div> 10679 </div> 10680 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10681 <div class="bs-d-flex"> 10682 <div class="toast-body"> 10683 @Translate("You can only view your own orders") 10684 </div> 10685 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10686 </div> 10687 </div> 10688 </div> 10689 10690 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10691 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10692 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10693 <input type="hidden" id="SelectedStatus" value="{{status}}" /> 10694 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10695 {{/.}} 10696 </script> 10697 } 10698 10699 @helper RmaViewDetailsFullOrder() 10700 { 10701 var company = Model.CurrentUser.Company; 10702 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10703 10704 <form class="rma-modal__container"> 10705 10706 <header class="u-flex u-flex--row rma-modal__header bs-d-flex bs-flex-wrap"> 10707 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10708 <div class="rma-order-number rma-view-details-full-order__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10709 </header> 10710 <input type="hidden" id="SelectedDeviationId" value="" /> 10711 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10712 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10713 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-first-row" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10714 10715 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-second-row" data-template="Rma-Order-Details-handlebars-second-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10716 10717 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-third-row" data-template="Rma-Order-Details-handlebars-third-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10718 <div class="bs-grid"> 10719 <div class="rma-selected-order-info g-col-12 g-col-md-6 bs-my-5 bs-px-2 bs-px-md-6"> 10720 <div class="bs-mb-3 bs-fs-5 fw-700">@Translate("Ordredetaljer")</div> 10721 <div class="orderInfo d-flex bs-justify-content-between"> 10722 <p class="bs-mb-2 bs-fs-5 fw-bold">@Translate("Antall produktlinjer")</p> 10723 <p class="bs-mb-2 bs-fs-5 rma-form-total-orderlines">7</p> 10724 </div> 10725 <div class="orderInfo d-flex bs-justify-content-between"> 10726 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Totalt antall produkter")</p> 10727 <p class="bs-mb-2 bs-fs-5 rma-form-total-quantity">289</p> 10728 </div> 10729 <div class="orderInfo d-flex bs-justify-content-between"> 10730 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Ordretotal eks. MVA")</p> 10731 <p class="bs-mb-2 bs-fs-5 rma-form-total-amount">7324,54 kr</p> 10732 </div> 10733 </div> 10734 </div> 10735 <div class="modal__content rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10736 @*Start of the Messaging Loop*@ 10737 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container-full-order" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10738 <div class="rma-page__write-comment"> 10739 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10740 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10741 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10742 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10743 <span id="file-input-error2" style="display:none">@Translate("Wrong file")</span> 10744 </div> 10745 </div> 10746 <footer class="modal__rma-footer"> 10747 <div class="footer__buttons"> 10748 @if (isCompanyKraemer) 10749 { 10750 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10751 @*<option value="1">@Translate("STATUS_1")</option>*@ 10752 <option value="2" default selected>@Translate("STATUS_2")</option> 10753 <option value="3">@Translate("STATUS_3")</option> 10754 <option value="4">@Translate("STATUS_4")</option> 10755 </select> 10756 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10757 } 10758 else 10759 { 10760 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenFullOrder">@Translate("Re-open Deviation")</button> 10761 @* 10762 <button class="submit-deviation-state bs-btn bs-btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal" >@Translate("Modal Test")</button> 10763 *@ 10764 <div class="bs-modal bs-fade" id="reopenFullOrder" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10765 <div class="modal-dialog bs-mt-4"> 10766 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10767 <div class="modal-body bs-pb-0 bs-text-center"> 10768 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10769 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10770 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10771 </div> 10772 </div> 10773 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10774 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10775 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10776 </div> 10777 </div> 10778 </div> 10779 </div> 10780 } 10781 </div> 10782 <div class="modal__rma-footer-icon-buttons"> 10783 </div> 10784 </footer> 10785 </form> 10786 10787 <script id="Rma-Details-handlebars" type="text/x-template"> 10788 10789 {{#.}} 10790 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10791 <div class="rma-products-list bs-border-bottom"> 10792 <div class="rma-details-page__header-grid-container"> 10793 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"> 10794 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10795 </div> 10796 <div class=" rma-page__grid-table-cell rma-details__name vertical-align-center d-flex u-flex--row align-items-center"> 10797 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10798 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10799 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="222222222">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10800 </div> 10801 </div> 10802 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10803 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10804 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10805 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{deviationOrderLineTotalPrice}}</div> 10806 </div> 10807 <div class="rma-details-page__header-grid-container"> 10808 <div class="rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"></div> 10809 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10810 <div class="rma-product-info-container"> 10811 <div class="fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10812 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10813 {{#each messages}} 10814 {{message}} 10815 {{/each}} 10816 </div> 10817 </div> 10818 </div> 10819 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10820 <div class="rma-product-info-container"> 10821 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10822 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10823 </div> 10824 </div> 10825 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center"></div> 10826 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10827 <div class="rma-product-info-container"> 10828 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10829 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10830 {{#each messages}} 10831 {{#each messageFiles}} 10832 @* 10833 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10834 *@ <a href="{{messageFile}}" target="_blank"> 10835 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10836 </a> 10837 {{/each}} 10838 {{/each}} 10839 </div> 10840 </div> 10841 </div> 10842 </div> 10843 </div> 10844 {{/.}} 10845 </script> 10846 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10847 {{#.}} 10848 <div class="d-grid"> 10849 {{#if isCustomer}} 10850 <div class="rma-page__user-message"> 10851 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10852 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10853 <div class="rma-page__message-date ">{{messageDate}}</div> 10854 </div> 10855 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10856 <div class="rma-page__attachment-footer"> 10857 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10858 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10859 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10860 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10861 </a> {{/each}} 10862 </a> 10863 </div> 10864 </div> 10865 {{else}} 10866 <div class="rma-page__admin-message"> 10867 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10868 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10869 <div class="rma-page__message-date ">{{messageDate}}</div> 10870 </div> 10871 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10872 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10873 10874 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10875 {{#each messageFiles}} 10876 <a href="{{messageFile}}" target="_blank"> 10877 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10878 </a> 10879 {{/each}} 10880 </div> 10881 </div> 10882 10883 {{/if}} 10884 </div> 10885 10886 {{/.}} 10887 </script> 10888 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10889 {{#.}} 10890 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10891 <input type="hidden" id="OrderLocation" value="{{orderLocation}}" /> 10892 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10893 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10894 <div class="cell g-col-6 g-col-md-3"> 10895 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10896 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}}" data-customer-number="{{customerNumber}}" class="rma-order-header-info bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10897 </div> 10898 <div class="cell g-col-6 g-col-md-3"> 10899 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10900 <div class="">{{formatDate createdDate}}</div> 10901 </div> 10902 <div class="cell g-col-6 g-col-md-3"> 10903 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10904 <div class=" statusTranslation">STATUS_{{status}}</div> 10905 </div> 10906 <div class="cell g-col-6 g-col-md-3"> 10907 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10908 <div class="">{{formatDate updatedDate}}</div> 10909 </div> 10910 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10911 <div class="bs-d-flex"> 10912 <div class="toast-body"> 10913 @Translate("You can only view your own orders") 10914 </div> 10915 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10916 </div> 10917 </div> 10918 </div> 10919 10920 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10921 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10922 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10923 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10924 {{/.}} 10925 </script> 10926 10927 <script id="Rma-Order-Details-handlebars-second-row" type="text/x-template"> 10928 {{#.}} 10929 10930 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10931 <div class="cell g-col-6 g-col-md-3"> 10932 <div class="bs-fw-bold bs-mb-3">@Translate("Avviksårsak")</div> 10933 <div class="reasonTranslation">REASON_{{reason}}</div> 10934 </div> 10935 <div class="cell g-col-6 g-col-md-3"> 10936 <div class="bs-fw-bold bs-mb-3">@Translate("S/O")</div> 10937 <div class="">{{orderShopReference}}</div> 10938 </div> 10939 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}"> 10940 </div> 10941 {{/.}} 10942 </script> 10943 10944 <script id="Rma-Order-Details-handlebars-third-row" type="text/x-template"> 10945 {{#.}} 10946 <div class="rma-selected-order-info bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10947 <div class="cell g-col-12 g-col-md-6"> 10948 <div class="bs-fw-bold bs-mb-3">@Translate("Vedlegg")</div> 10949 <div class="bs-d-flex bs-flex-row bs-flex-wrap bs-gap-3"> 10950 {{#each messages}}{{#each messageFiles}} 10951 <a href="{{messageFile}}" target="_blank"> 10952 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10953 </a> 10954 {{/each}}{{/each}} 10955 </div> 10956 </div> 10957 10958 <div class="cell g-col-6 g-col-md-3"> 10959 <div class="bs-fw-bold bs-mb-3">@Translate("Kommentar")</div> 10960 <div class="">{{#each messages}}{{message}}{{/each}}</div> 10961 </div> 10962 <div class="cell g-col-6 g-col-md-3"> 10963 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket utfall")</div> 10964 <div class="">{{requestedOutcome}}</div> 10965 </div> 10966 </div> 10967 {{/.}} 10968 </script> 10969 10970 } 10971 10972 @helper ViewOrderDetails2() 10973 { 10974 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10975 var cartPageId = GetPageIdByNavigationTag("CartPage"); 10976 string dwAPIToken = ""; 10977 if (currentUserAccess != null) 10978 { 10979 dwAPIToken = JwtService.GetToken(currentUserAccess, 86400); 10980 } 10981 <form class="rma-modal__container"> 10982 <header class="modal-header bs-bg-sand-light bs-justify-content-start"> 10983 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" alt="Kraemer logo" /> 10984 <div class="rma-order-number">@Translate("TAKK FOR DIN ORDRE!")</div> 10985 </header> 10986 10987 <div class="js-handlebars-root modal-body" id="Order-Header-Details-handlebars-container" data-template="Order-Header-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10988 10989 <div class="modal-body bs-pt-0"> 10990 <div class="modal__content rma-page_table-header bs-mt-3 bs-my-lg-3"> 10991 <div class="order-history-header bs-fw-bold bs-border-bottom bs-border-primary-dark"> 10992 <div class="cell bs-d-none bs-d-lg-block"></div> 10993 <div class="cell">@Translate("Produkt")</div> 10994 <div class="cell bs-d-none bs-d-lg-block">@Translate("Kommentar")</div> 10995 <div class="cell">@Translate("Antall")</div> 10996 <div class="cell">@Translate("Pris")</div> 10997 <div class="cell">@Translate("Total Eks. MVA")</div> 10998 </div> 10999 </div> 11000 @*// products loop *@ 11001 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Order-Details-handlebars-container" data-template="Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 11002 </div> 11003 <div data-message="error-order-does-not-exist" data-bs-delay="1800" class="toast bs-align-items-center bs-px-3 bs-mx-auto bs-bg-danger bs-text-light bs-border-0 bs-w-75 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 11004 <div class="bs-d-flex"> 11005 <div class="toast-body"> 11006 @Translate("This order is not yet available to create a RMA.") 11007 </div> 11008 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 11009 </div> 11010 </div> 11011 <footer class="modal__rma-footer bs-py-4 bs-justify-content-end orderHistory-footer"> 11012 @*<button class="submit-rma-button" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'))">@Translate("Opprett Avvik")</button>*@ 11013 <div class="modal__rma-footer-icon-buttons"> 11014 <a class="rma-page__icon-buttons bs-mx-2 openRmaModalButton bs-ms-0" title="@Translate("HOVER_StartDeviation")" onclick="openRMAModal('OrderSelected')"> 11015 <img height="26" width="26" src="/Files/Images/UnionRMA-icon.svg" /> 11016 </a> 11017 @*<a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button 11018 open-full-favorite-list-button" data-token="@dwAPIToken" onclick="showFavoriteListsForFullOrder(this, 11019 true)" title="@Translate("HOVER_FavouriteList")"> 11020 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" /> 11021 </a>*@ 11022 @*<div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 11023 .classList.add('u-hidden');this.classList.add('bs-d-none');"></div> 11024 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border 11025 bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;z-index:1;"> 11026 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 11027 </div> 11028 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 11029 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 11030 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 11031 </div> 11032 </div>*@ 11033 <a class="rma-page__icon-buttons bs-mx-2" title="@Translate("HOVER_Download")"> 11034 <img height="26" width="26" onclick="PrintElem(this.closest('form'))" src="/Files/Images/print-icon.svg" /> 11035 </a> 11036 </div> 11037 </footer> 11038 </form> 11039 <script id="Order-Header-Details-handlebars" type="text/x-template"> 11040 11041 <div class="bs-grid"> 11042 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderId '===' null}} invisible {{else}} {{#ifCond orderId '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11043 <div class="bs-fw-bold bs-mb-3">@Translate("Ordre-ID")</div> 11044 <div class="" id="ModalOpenedOrderId" data-order-id="{{orderId}}">{{orderId}}</div> 11045 <input type="hidden" id="ModalOpenedUserId" value="@Model.CurrentUser.ID"> 11046 </div> 11047 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDate '===' null}} invisible {{else}} {{#ifCond orderDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11048 <div class="bs-fw-bold bs-mb-3">@Translate("Bestillingsdato")</div> 11049 <div class="">{{formatDate orderDate}}</div> 11050 </div> 11051 11052 <div class="cell g-col-6 g-col-md-3 {{#ifCond theListName '===' null}} invisible {{else}} {{#ifCond theListName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11053 <div class="bs-fw-bold bs-mb-3">@Translate("Handlekurv navn")</div> 11054 <div class="">{{orderCartName}}</div> 11055 </div> 11056 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderLocation '===' null}} invisible {{else}} {{#ifCond orderLocation '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11057 <div class="bs-fw-bold bs-mb-3">@Translate("Ordrelokasjon")</div> 11058 <div class="">{{orderLocation}}</div> 11059 </div> 11060 </div> 11061 11062 <div class="bs-grid"> 11063 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPoNumber '===' null}} invisible {{else}} {{#ifCond orderPoNumber '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11064 <div class="bs-fw-bold bs-mb-3">@Translate("P.O. Nummer")</div> 11065 <div class="">{{orderPoNumber}}</div> 11066 </div> 11067 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDesiredDeliveryDate '===' null}} invisible {{else}} {{#ifCond orderDesiredDeliveryDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11068 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket leveringsdag")</div> 11069 <div class="">{{formatDate orderDesiredDeliveryDate}}</div> 11070 </div> 11071 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPurchaserName '===' null}} invisible {{else}} {{#ifCond orderPurchaserName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11072 <div class="bs-fw-bold bs-mb-3">@Translate("Navn på kjøper")</div> 11073 <div class="">{{orderPurchaserName}}</div> 11074 </div> 11075 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDeliveryPlace '===' null}} invisible {{else}} {{#ifCond orderDeliveryPlace '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11076 <div class="bs-fw-bold bs-mb-3">@Translate("Leveringssted")</div> 11077 <div class="">{{orderDeliveryPlace}}</div> 11078 </div> 11079 </div> 11080 </script> 11081 11082 <script id="Order-Details-handlebars" type="text/x-template"> 11083 {{#.}} 11084 <div class="order-history-item-container"> 11085 <div class="order-history-item bs-py-2 {{#ifCond orderLineDiscontinued '!==' false}} disabled {{/ifCond}} bs-py-lg-0"> 11086 <div class="cell bs-d-none bs-d-lg-block"> 11087 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" class="img-fluid" alt="{{orderLineProductName}}" /> 11088 </div> 11089 <div class="cell order-history-detail__name bs-justify-self"> 11090 <div class="rma-product-info-container"> 11091 <div class="bs-fw-bold bs-d-flex bs-align-items-center order-history-product-info" data-quantity="{{orderLineQuantity}}" data-product-number="{{orderLineProductNumber}}" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="order-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 11092 <div class="bs-d-none bs-d-lg-block {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 11093 <div class="bs-text-danger order-history-product-unavailable">{{#ifCond orderLineDiscontinued '!==' false}}@Translate("Denne varen er ikke lenger tilgjengelig"){{/ifCond}}</div> 11094 </div> 11095 </div> 11096 <div class="cell order-history-detail__comment bs-d-none bs-d-lg-block">{{orderLineComment}}</div> 11097 <div class="cell order-history-quantity-field" data-quantity={{orderLineQuantity}}>{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 11098 <div class="cell order-history-price">{{orderLinePricePerMeasurementUnit}}</div> 11099 <div class="cell">{{orderLineTotalPrice}} @*{{orderLinePriceUnit}}*@</div> 11100 <div class="cell bs-d-flex bs-flex-row" style="position: relative;"> 11101 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" 11102 onclick="showFavoriteListsForProduct(this)" 11103 data-product-number="{{orderLineProductNumber}}" 11104 data-quantity="1" 11105 title="@Translate("HOVER_FavouriteList")"> 11106 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" class="popup-toggle" data-product-number="{{orderLineProductNumber}}" /> 11107 </a> 11108 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 11109 .classList.add('u-hidden');"></div> 11110 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content; right: 38px; top: 7%; height: 200px; z-index: 99999999;"> 11111 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 11112 @*<div class="bs-fs-5 favorite-list-item bs-list-group-item bs-list-group-item-action" data-list-id="ListID" onclick="addToShoppingList(this)">Example1</div>*@ 11113 </div> 11114 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 11115 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 11116 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 11117 </div> 11118 </div> 11119 </div> 11120 </div> 11121 </div> 11122 {{/.}} 11123 </script> 11124 } 11125 11126 11127 @functions { 11128 public class ManifestIcon 11129 { 11130 public string src { get; set; } 11131 public string type { get; set; } 11132 public string sizes { get; set; } 11133 } 11134 11135 public class Manifest 11136 { 11137 public string name { get; set; } 11138 public string short_name { get; set; } 11139 public string start_url { get; set; } 11140 public string display { get; set; } 11141 public string background_color { get; set; } 11142 public string theme_color { get; set; } 11143 public List<ManifestIcon> icons { get; set; } 11144 } 11145 } 11146 11147 <!DOCTYPE html> 11148 11149 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 11150 11151 11152 11153 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 11154 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 11155 11156 11157 11158 @helper RenderMasterHead() { 11159 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 11160 11161 <head> 11162 <!-- Rapido version 3.3 --> 11163 11164 @RenderBlockList(subBlocks) 11165 </head> 11166 } 11167 11168 @helper RenderMasterMetadata() { 11169 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 11170 var brandColors = swatches.GetColorSwatch(1); 11171 string brandColorOne = brandColors.Palette["BrandColor1"]; 11172 11173 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 11174 Manifest manifest = new Manifest 11175 { 11176 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 11177 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"), 11178 start_url = "/", 11179 display = "standalone", 11180 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 11181 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 11182 }; 11183 11184 manifest.icons = new List<ManifestIcon> { 11185 new ManifestIcon { 11186 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11187 sizes = "192x192", 11188 type = "image/png" 11189 }, 11190 new ManifestIcon { 11191 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11192 sizes = "512x512", 11193 type = "image/png" 11194 }, 11195 new ManifestIcon { 11196 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11197 sizes = "1024x1024", 11198 type = "image/png" 11199 } 11200 }; 11201 11202 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 11203 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 11204 string currentManifest = File.ReadAllText(manifestFilePath); 11205 11206 if (manifestJSON != currentManifest) 11207 { 11208 File.WriteAllText(manifestFilePath, manifestJSON); 11209 } 11210 } 11211 11212 <meta charset="utf-8" /> 11213 <title>@Model.Title</title> 11214 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> 11215 <meta name="robots" content="index, follow"> 11216 <meta name="theme-color" content="@brandColorOne" /> 11217 11218 if (!Model.MetaTags.Contains("og:image")) { 11219 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage"))); 11220 } 11221 11222 if (!Model.MetaTags.Contains("og:description")) { 11223 Pageview.Meta.AddTag("og:description", Model.Description); 11224 } 11225 11226 Pageview.Meta.AddTag("og:title", Model.Title); 11227 Pageview.Meta.AddTag("og:site_name", Model.Name); 11228 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 11229 Pageview.Meta.AddTag("og:type", "Website"); 11230 Pageview.Meta.AddTag("fb:page_id", Model.ID.ToString()); 11231 11232 @Model.MetaTags 11233 } 11234 11235 @helper RenderMasterCss() { 11236 var fonts = new string[] { 11237 getFontFamily("Layout", "HeaderFont"), 11238 getFontFamily("Layout", "SubheaderFont"), 11239 getFontFamily("Layout", "TertiaryHeaderFont"), 11240 getFontFamily("Layout", "BodyText"), 11241 getFontFamily("Layout", "Header", "ToolsFont"), 11242 getFontFamily("Layout", "Header", "NavigationFont"), 11243 getFontFamily("Layout", "MobileNavigation", "Font"), 11244 getFontFamily("ProductList", "Facets", "HeaderFont"), 11245 getFontFamily("ProductPage", "PriceFontDesign"), 11246 getFontFamily("Ecommerce", "SaleSticker", "Font"), 11247 getFontFamily("Ecommerce", "NewSticker", "Font"), 11248 getFontFamily("Ecommerce", "CustomSticker", "Font") 11249 }; 11250 11251 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 11252 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 11253 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 11254 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 11255 if (useFontAwesomePro) 11256 { 11257 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 11258 } 11259 11260 bool movetoproduction = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("movetoproduction")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("movetoproduction")) : false; 11261 11262 //Favicon 11263 <link href="@favicon" rel="icon" type="image/png"> 11264 11265 //Base (Default, wireframe) styles 11266 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 11267 11268 //Rapido Css from Website Settings 11269 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 11270 11271 //Ignite Css (Custom site specific styles) 11272 //<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=25"> 11273 11274 /*TODO remove and compile css*/ 11275 @* <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/custom.css?v=22"> *@ 11276 //Font awesome 11277 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 11278 11279 //Flag icon 11280 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 11281 11282 //Google fonts 11283 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x))); 11284 11285 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 11286 bool featureFlagCSSFramework = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("feature")) && HttpContext.Current.Request.QueryString.Get("feature") == "cssframework"; 11287 /*if (featureFlagCSSFramework) 11288 {*/ 11289 11290 var cssStyleFileInfo = new System.IO.FileInfo(Dynamicweb.Core.SystemInformation.MapPath("/Files/Templates/Designs/Rapido/dist/app.bundle.css")); 11291 // <link rel="stylesheet" type="text/css" href="@autoCssBundleLink"> 11292 <link href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?@cssStyleFileInfo.LastWriteTime.Ticks" rel="stylesheet" media="all" type="text/css"> 11293 @*} 11294 else 11295 { 11296 <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css"> 11297 11298 }*@ 11299 } 11300 11301 @helper RenderMasterManifest() { 11302 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 11303 { 11304 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 11305 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 11306 } 11307 } 11308 11309 @helper RenderMasterBody() { 11310 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 11311 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 11312 if (!String.IsNullOrEmpty(designLayout)) { 11313 designLayout = "class=\"" + designLayout + "\""; 11314 } 11315 11316 List<int> pages = new List<int>(); 11317 pages.Add(GetPageIdByNavigationTag("RecipeBank")); 11318 pages.Add(GetPageIdByNavigationTag("DeviationsHistoryPage")); 11319 pages.Add(GetPageIdByNavigationTag("MenuView")); 11320 pages.Add(GetPageIdByNavigationTag("MenuCalendarView")); 11321 pages.Add(GetPageIdByNavigationTag("ShoppingList")); 11322 pages.Add(GetPageIdByNavigationTag("CustomerOrders")); 11323 pages.Add(GetPageIdByNavigationTag("MenuCreationView")); 11324 List<int> availablePages = pages.Where(x=>x!=0).ToList(); 11325 11326 int currentPage = Pageview?.ID ?? 0; 11327 bool pageHasWhiteBackground = availablePages.Contains(currentPage); 11328 11329 <body @designLayout OnKeyPress="return disableEnterKey(event)" data-preloader-text='@Translate("loader reordering")' data-test="@Dynamicweb.Ecommerce.Common.Context.LanguageID" style="--comm-background: @(pageHasWhiteBackground ? "#FFF" : "#F9F7F6")"> 11330 @RenderBlockList(subBlocks) 11331 </body> 11332 } 11333 11334 @helper RenderMasterHeader() 11335 { 11336 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 11337 //bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11338 bool isNavigationStickyMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11339 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 11340 11341 <header class="top-container @stickyTop dw-mod u-no-print" id="Top"> 11342 @RenderBlockList(subBlocks) 11343 </header> 11344 } 11345 11346 @helper RenderMain() 11347 { 11348 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 11349 11350 <main class="site dw-mod"> 11351 @RenderBlockList(subBlocks) 11352 </main> 11353 } 11354 11355 @helper RenderPageContent() 11356 { 11357 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11358 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 11359 var cartPageUrl = GetPageIdByNavigationTag("CartPage"); 11360 11361 <div id="Page" class="page @pagePos" data-cart-url="@cartPageUrl"> 11362 <div id="content"> 11363 @RenderSnippet("Content") 11364 </div> 11365 </div> 11366 } 11367 11368 @* Hack to support nested helpers *@ 11369 @SnippetStart("Content") 11370 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 11371 @using WebApp.Singleton; 11372 11373 @{ 11374 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 11375 var shipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner").Value; 11376 var onlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse").Value.ToString(); 11377 var mode = HttpContext.Current.Request["mode"]; 11378 var languageId = Dynamicweb.Ecommerce.Common.Context.LanguageID; 11379 11380 11381 var serverDataJson = mode == "quicksearch" 11382 ? Newtonsoft.Json.JsonConvert.SerializeObject(new 11383 { 11384 RootGroupId = "", 11385 RootGroupName = "" 11386 }) 11387 : 11388 Newtonsoft.Json.JsonConvert.SerializeObject(new 11389 { 11390 RootGroupId = HttpContext.Current.Request["GroupId"], 11391 RootGroupName = string.IsNullOrWhiteSpace(HttpContext.Current.Request["GroupName"]) 11392 ? new Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService().GetById(HttpContext.Current.Request["GroupId"], languageId, shipOwner?.ToString() == "26300").Name 11393 : HttpContext.Current.Request["GroupName"], 11394 }); 11395 } 11396 11397 11398 11399 @*needed for proper navigation translationds*@ 11400 @if (shipOwner?.ToString() == "26300") 11401 { 11402 <input type="hidden" id="shipOwnerValue" value="" /> 11403 } 11404 11405 @if (onlySeeDiverse?.ToString() == "True") 11406 { 11407 <input type="hidden" id="OnlySeeDiverse" value="" /> 11408 } 11409 11410 <div class="content-container" > 11411 <div 11412 id="productListApp" 11413 style="padding-top: 30px;" data-server='@serverDataJson' 11414 class="content-row content-row--full content-row--column-gap-xl content-row--center content-row--height-auto content-row--spacing-none"> 11415 </div> 11416 </div> 11417 11418 @SnippetEnd("Content") 11419 11420 @helper RenderIosTabletFix() { 11421 11422 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 11423 { 11424 <script> 11425 var cartPageUrl = document.querySelector("#Page").getAttribute("data-cart-url"); 11426 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 11427 if (isIpadIOS) { 11428 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 11429 var isCheckout = (window.location.href.indexOf(cartPageUrl) > -1) ? true : false; 11430 if(isCheckout) { 11431 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios&CartV2.GotoStep1=true"; 11432 } else { 11433 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 11434 } 11435 } 11436 </script> 11437 } 11438 } 11439 11440 </html> 11441 11442 <script> 11443 function disableEnterKey(e) 11444 { 11445 var key; 11446 if(window.event) 11447 key = window.event.keyCode; //IE 11448 else 11449 key = e.which; //firefox 11450 11451 return (key != 13); 11452 } 11453 </script>