Error executing template "Designs/Rapido/_parsed/Kraemer_ProductList.parsed.cshtml"
System.InvalidOperationException: Invalid attempt to read when no data is present.
   at System.Data.SqlClient.SqlDataReader.CheckDataIsReady(Int32 columnIndex, Boolean allowPartiallyReadColumn, Boolean permitAsync, String methodName)
   at System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn)
   at System.Data.SqlClient.SqlDataReader.GetString(Int32 i)
   at Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService.GetById(String groupId, String languageId)
   at CompiledRazorTemplates.Dynamic.RazorEngine_7f14ab9388c749fb898e79d90abcc7b0.Execute() in D:\dynamicweb.net\Solutions\Degree\kraemer.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\_parsed\Kraemer_ProductList.parsed.cshtml:line 11330
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 3 @using System.Web; 4 @using Dynamicweb.Frontend 5 @using Dynamicweb.Frontend.Devices 6 @using Dynamicweb.Extensibility 7 @using Dynamicweb.Content 8 @using Dynamicweb.Security 9 @using Dynamicweb.Core 10 @using System 11 @using System.Web 12 @using System.IO 13 @using Dynamicweb.Rapido.Blocks 14 @using System.Net 15 16 17 @functions { 18 BlocksPage masterPage = BlocksPage.GetBlockPage("Master"); 19 20 string getFontFamily(params string[] items) 21 { 22 var itemParent = Pageview.AreaSettings; 23 foreach (var item in items) 24 { 25 itemParent = itemParent.GetItem(item); 26 if (itemParent == null) 27 { 28 return null; 29 } 30 } 31 32 var googleFont = itemParent.GetGoogleFont("FontFamily"); 33 if (googleFont == null) 34 { 35 return null; 36 } 37 return googleFont.Family.Replace(" ", "+"); 38 } 39 } 40 41 @{ 42 Block root = new Block 43 { 44 Id = "Root", 45 SortId = 10, 46 BlocksList = new List<Block> 47 { 48 new Block { 49 Id = "Head", 50 SortId = 10, 51 SkipRenderBlocksList = true, 52 Template = RenderMasterHead(), 53 BlocksList = new List<Block> 54 { 55 new Block { 56 Id = "HeadMetadata", 57 SortId = 10, 58 Template = RenderMasterMetadata(), 59 }, 60 new Block { 61 Id = "HeadCss", 62 SortId = 20, 63 Template = RenderMasterCss(), 64 }, 65 new Block { 66 Id = "HeadManifest", 67 SortId = 30, 68 Template = RenderMasterManifest(), 69 } 70 } 71 }, 72 new Block { 73 Id = "Body", 74 SortId = 20, 75 SkipRenderBlocksList = true, 76 Template = RenderMasterBody(), 77 BlocksList = new List<Block> 78 { 79 new Block() 80 { 81 Id = "Master", 82 SortId = 10, 83 BlocksList = new List<Block> { 84 new Block { 85 Id = "MasterTopSnippets", 86 SortId = 10 87 }, 88 new Block { 89 Id = "MasterMain", 90 SortId = 20, 91 Template = RenderMain(), 92 SkipRenderBlocksList = true, 93 BlocksList = new List<Block> { 94 new Block { 95 Id = "MasterHeader", 96 SortId = 10, 97 Template = RenderMasterHeader(), 98 SkipRenderBlocksList = true 99 }, 100 new Block { 101 Id = "MasterPageContent", 102 SortId = 20, 103 Template = RenderPageContent() 104 } 105 } 106 }, 107 new Block { 108 Id = "MasterFooter", 109 SortId = 30 110 }, 111 new Block { 112 Id = "MasterReferences", 113 SortId = 40 114 }, 115 new Block { 116 Id = "MasterBottomSnippets", 117 SortId = 50, 118 BlocksList = new List<Block> { 119 new Block { 120 Id = "iOsTabletFix", 121 SortId = 90, 122 Template = RenderIosTabletFix() 123 } 124 } 125 } 126 } 127 } 128 } 129 } 130 } 131 }; 132 133 masterPage.Add(root); 134 } 135 136 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 137 @using System.Text.RegularExpressions 138 @using System.Collections.Generic 139 @using System.Reflection 140 @using System.Web 141 @using System.Web.UI.HtmlControls 142 @using Dynamicweb.Rapido.Blocks.Components 143 @using Dynamicweb.Rapido.Blocks.Components.Articles 144 @using Dynamicweb.Rapido.Blocks.Components.Documentation 145 @using Dynamicweb.Rapido.Blocks 146 147 148 @*--- START: Base block renderers ---*@ 149 150 @helper RenderBlockList(List<Block> blocks) 151 { 152 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 153 blocks = blocks.OrderBy(item => item.SortId).ToList(); 154 155 foreach (Block item in blocks) 156 { 157 if (debug) 158 { 159 <!-- Block START: @item.Id --> 160 } 161 162 if (item.Design == null) 163 { 164 @RenderBlock(item) 165 } 166 else if (item.Design.RenderType == RenderType.None) 167 { 168 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 169 170 <div class="@cssClass dw-mod"> 171 @RenderBlock(item) 172 </div> 173 } 174 else if (item.Design.RenderType != RenderType.Hide) 175 { 176 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 177 178 if (!item.SkipRenderBlocksList) 179 { 180 if (item.Design.RenderType == RenderType.Row) 181 { 182 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 183 @RenderBlock(item) 184 </div> 185 } 186 187 if (item.Design.RenderType == RenderType.Column) 188 { 189 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 190 string size = item.Design.Size ?? "12"; 191 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 192 193 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id"> 194 @RenderBlock(item) 195 </div> 196 } 197 198 if (item.Design.RenderType == RenderType.Table) 199 { 200 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 201 @RenderBlock(item) 202 </table> 203 } 204 205 if (item.Design.RenderType == RenderType.TableRow) 206 { 207 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 208 @RenderBlock(item) 209 </tr> 210 } 211 212 if (item.Design.RenderType == RenderType.TableColumn) 213 { 214 <td class="@cssClass dw-mod" id="Block__@item.Id"> 215 @RenderBlock(item) 216 </td> 217 } 218 219 if (item.Design.RenderType == RenderType.CardHeader) 220 { 221 <div class="card-header @cssClass dw-mod"> 222 @RenderBlock(item) 223 </div> 224 } 225 226 if (item.Design.RenderType == RenderType.CardBody) 227 { 228 <div class="card @cssClass dw-mod"> 229 @RenderBlock(item) 230 </div> 231 } 232 233 if (item.Design.RenderType == RenderType.CardFooter) 234 { 235 <div class="card-footer @cssClass dw-mod"> 236 @RenderBlock(item) 237 </div> 238 } 239 } 240 else 241 { 242 @RenderBlock(item) 243 } 244 } 245 246 if (debug) 247 { 248 <!-- Block END: @item.Id --> 249 } 250 } 251 } 252 253 @helper RenderBlock(Block item) 254 { 255 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 256 257 if (item.Template != null) 258 { 259 @BlocksPage.RenderTemplate(item.Template) 260 } 261 262 if (item.Component != null) 263 { 264 string customSufix = "Custom"; 265 string methodName = item.Component.HelperName; 266 267 ComponentBase[] methodParameters = new ComponentBase[1]; 268 methodParameters[0] = item.Component; 269 Type methodType = this.GetType(); 270 271 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 272 MethodInfo generalMethod = methodType.GetMethod(methodName); 273 274 try 275 { 276 if (debug) 277 { 278 <!-- Component: @methodName.Replace("Render", "") --> 279 } 280 if (customMethod != null) 281 { 282 @customMethod.Invoke(this, methodParameters).ToString(); 283 } 284 else 285 { 286 @generalMethod.Invoke(this, methodParameters).ToString(); 287 } 288 } 289 catch 290 { 291 try 292 { 293 @generalMethod.Invoke(this, methodParameters).ToString(); 294 } 295 catch (Exception ex) 296 { 297 throw new Exception(item.Component.GetType().Name + " method '" + methodName + "' could not be invoked", ex); 298 } 299 } 300 } 301 302 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 303 { 304 @RenderBlockList(item.BlocksList) 305 } 306 } 307 308 @*--- END: Base block renderers ---*@ 309 310 311 @* Include the components *@ 312 @using Dynamicweb.Rapido.Blocks.Components 313 @using Dynamicweb.Rapido.Blocks.Components.General 314 @using Dynamicweb.Rapido.Blocks 315 @using System.IO 316 317 @* Required *@ 318 @using Dynamicweb.Rapido.Blocks.Components 319 @using Dynamicweb.Rapido.Blocks.Components.General 320 @using Dynamicweb.Rapido.Blocks 321 322 323 @helper Render(ComponentBase component) 324 { 325 if (component != null) 326 { 327 @component.Render(this) 328 } 329 } 330 331 @* Components *@ 332 @using System.Reflection 333 @using Dynamicweb.Rapido.Blocks.Components.General 334 335 336 @* Component *@ 337 338 @helper RenderIcon(Icon settings) 339 { 340 if (settings != null) 341 { 342 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 343 344 if (settings.Name != null) 345 { 346 if (settings.Prefix == "svg" || settings.Name.Contains(".svg")) 347 { 348 349 <span class="u-flex u-flex--row " style="align-items: center;gap: 10px;justify-content: center"> <img width="18" height="18" src="@settings.Name"/> @settings.Label </span> 350 }else{ 351 if (string.IsNullOrEmpty(settings.Label)) 352 { 353 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 354 } 355 else 356 { 357 if (settings.LabelPosition == IconLabelPosition.Before) 358 { 359 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span> 360 } 361 else 362 { 363 <span><i class="@settings.Prefix @settings.Name u-margin-right--lg @settings.CssClass u-w20px" @color></i>@settings.Label</span> 364 } 365 } 366 } 367 } 368 else if (!string.IsNullOrEmpty(settings.Label)) 369 { 370 @settings.Label 371 } 372 } 373 } 374 @using System.Reflection 375 @using Dynamicweb.Rapido.Blocks.Components.General 376 @using Dynamicweb.Rapido.Blocks.Components 377 @using Dynamicweb.Core 378 379 @* Component *@ 380 381 @helper RenderButton(Button settings) 382 { 383 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 384 { 385 Dictionary<string, string> attributes = new Dictionary<string, string>(); 386 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 387 if (settings.Disabled) { 388 attributes.Add("disabled", "true"); 389 classList.Add("disabled"); 390 } 391 392 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 393 { 394 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 395 @RenderConfirmDialog(settings); 396 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 397 } 398 399 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 400 /*if (!string.IsNullOrEmpty(settings.Image)) { attributes.Add("image", settings.Image); }*/ 401 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 402 if (!string.IsNullOrEmpty(settings.AltText)) 403 { 404 attributes.Add("title", settings.AltText); 405 } 406 else if (!string.IsNullOrEmpty(settings.Title)) 407 { 408 attributes.Add("title", settings.Title); 409 } 410 411 var onClickEvents = new List<string>(); 412 if (!string.IsNullOrEmpty(settings.OnClick)) 413 { 414 onClickEvents.Add(settings.OnClick); 415 } 416 if (!string.IsNullOrEmpty(settings.Href)) 417 { 418 onClickEvents.Add("location.href='" + settings.Href + "'"); 419 } 420 if (onClickEvents.Count > 0) 421 { 422 attributes.Add("onClick", string.Join(";", onClickEvents)); 423 } 424 425 if (settings.ButtonLayout != ButtonLayout.None) 426 { 427 classList.Add("btn"); 428 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 429 if (btnLayout == "linkclean") 430 { 431 btnLayout = "link-clean"; //fix 432 } 433 classList.Add("btn--" + btnLayout); 434 } 435 436 if (settings.Icon == null) 437 { 438 settings.Icon = new Icon(); 439 } 440 settings.Icon.Label = settings.Title; 441 442 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 443 444 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 445 } 446 } 447 448 @helper RenderConfirmDialog(Button settings) 449 { 450 Modal confirmDialog = new Modal { 451 Id = settings.Id, 452 Width = ModalWidth.Sm, 453 Heading = new Heading 454 { 455 Level = 2, 456 Title = settings.ConfirmTitle 457 }, 458 BodyText = settings.ConfirmText 459 }; 460 461 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 462 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 463 464 @Render(confirmDialog) 465 } 466 @using Dynamicweb.Rapido.Blocks.Components.General 467 @using Dynamicweb.Rapido.Blocks.Components 468 @using Dynamicweb.Core 469 470 @helper RenderDashboard(Dashboard settings) 471 { 472 var widgets = settings.GetWidgets(); 473 474 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 475 { 476 //set bg color for them 477 478 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 479 int r = Convert.ToInt16(color.R); 480 int g = Convert.ToInt16(color.G); 481 int b = Convert.ToInt16(color.B); 482 483 var count = widgets.Length; 484 var max = Math.Max(r, Math.Max(g, b)); 485 double step = 255.0 / (max * count); 486 var i = 0; 487 foreach (var widget in widgets) 488 { 489 i++; 490 491 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 492 widget.BackgroundColor = shade; 493 } 494 } 495 496 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 497 @foreach (var widget in widgets) 498 { 499 <div class="dashboard__widget"> 500 @Render(widget) 501 </div> 502 } 503 </div> 504 } 505 @using Dynamicweb.Rapido.Blocks.Components.General 506 @using Dynamicweb.Rapido.Blocks.Components 507 508 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 509 { 510 if (!string.IsNullOrEmpty(settings.Link)) 511 { 512 var backgroundStyles = ""; 513 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 514 { 515 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 516 } 517 518 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 519 <div class="u-center-middle u-color-light"> 520 @if (settings.Icon != null) 521 { 522 settings.Icon.CssClass += "widget__icon"; 523 @Render(settings.Icon) 524 } 525 <div class="widget__title">@settings.Title</div> 526 </div> 527 </a> 528 } 529 } 530 @using Dynamicweb.Rapido.Blocks.Components.General 531 @using Dynamicweb.Rapido.Blocks.Components 532 533 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 534 { 535 var backgroundStyles = ""; 536 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 537 { 538 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 539 } 540 541 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 542 <div class="u-center-middle u-color-light"> 543 @if (settings.Icon != null) 544 { 545 settings.Icon.CssClass += "widget__icon"; 546 @Render(settings.Icon) 547 } 548 <div class="widget__counter">@settings.Count</div> 549 <div class="widget__title">@settings.Title</div> 550 </div> 551 </div> 552 } 553 @using System.Reflection 554 @using Dynamicweb.Rapido.Blocks.Components.General 555 @using Dynamicweb.Rapido.Blocks.Components 556 @using Dynamicweb.Core 557 558 @* Component *@ 559 560 @helper RenderLink(Link settings) 561 { 562 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 563 { 564 Dictionary<string, string> attributes = new Dictionary<string, string>(); 565 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 566 if (settings.Disabled) 567 { 568 attributes.Add("disabled", "true"); 569 classList.Add("disabled"); 570 } 571 572 if (!string.IsNullOrEmpty(settings.AltText)) 573 { 574 attributes.Add("title", settings.AltText); 575 } 576 else if (!string.IsNullOrEmpty(settings.Title)) 577 { 578 attributes.Add("title", settings.Title); 579 } 580 581 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 582 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 583 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 584 attributes.Add("href", settings.Href); 585 586 if (settings.ButtonLayout != ButtonLayout.None) 587 { 588 classList.Add("btn"); 589 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 590 if (btnLayout == "linkclean") 591 { 592 btnLayout = "link-clean"; //fix 593 } 594 classList.Add("btn--" + btnLayout); 595 } 596 597 if (settings.Icon == null) 598 { 599 settings.Icon = new Icon(); 600 } 601 settings.Icon.Label = settings.Title; 602 603 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 604 { 605 settings.Rel = LinkRelType.Noopener; 606 } 607 if (settings.Target != LinkTargetType.None) 608 { 609 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 610 } 611 if (settings.Download) 612 { 613 attributes.Add("download", "true"); 614 } 615 if (settings.Rel != LinkRelType.None) 616 { 617 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 618 } 619 620 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 621 } 622 } 623 @using System.Reflection 624 @using Dynamicweb.Rapido.Blocks.Components 625 @using Dynamicweb.Rapido.Blocks.Components.General 626 @using Dynamicweb.Rapido.Blocks 627 628 629 @* Component *@ 630 631 @helper RenderRating(Rating settings) 632 { 633 if (settings.Score > 0) 634 { 635 int rating = settings.Score; 636 string iconType = "fa-star"; 637 638 switch (settings.Type.ToString()) { 639 case "Stars": 640 iconType = "fa-star"; 641 break; 642 case "Hearts": 643 iconType = "fa-heart"; 644 break; 645 case "Lemons": 646 iconType = "fa-lemon"; 647 break; 648 case "Bombs": 649 iconType = "fa-bomb"; 650 break; 651 } 652 653 <div class="u-ta-right"> 654 @for (int i = 0; i < settings.OutOf; i++) 655 { 656 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 657 } 658 </div> 659 } 660 } 661 @using System.Reflection 662 @using Dynamicweb.Rapido.Blocks.Components.General 663 @using Dynamicweb.Rapido.Blocks.Components 664 665 666 @* Component *@ 667 668 @helper RenderSelectFieldOption(SelectFieldOption settings) 669 { 670 Dictionary<string, string> attributes = new Dictionary<string, string>(); 671 if (settings.Checked) { attributes.Add("selected", "true"); } 672 if (settings.Disabled) { attributes.Add("disabled", "true"); } 673 if (settings.Value != null) { attributes.Add("value", settings.Value); } 674 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 675 676 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 677 } 678 @using System.Reflection 679 @using Dynamicweb.Rapido.Blocks.Components.General 680 @using Dynamicweb.Rapido.Blocks.Components 681 682 683 @* Component *@ 684 685 @helper RenderNavigation(Navigation settings) { 686 @RenderNavigation(new 687 { 688 id = settings.Id, 689 cssclass = settings.CssClass, 690 startLevel = settings.StartLevel, 691 endlevel = settings.EndLevel, 692 expandmode = settings.Expandmode, 693 sitemapmode = settings.SitemapMode, 694 template = settings.Template 695 }) 696 } 697 @using Dynamicweb.Rapido.Blocks.Components.General 698 @using Dynamicweb.Rapido.Blocks.Components 699 700 701 @* Component *@ 702 703 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 704 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 705 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 706 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 707 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 708 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 709 settings.SitemapMode = false; 710 711 @RenderNavigation(settings) 712 } 713 @using Dynamicweb.Rapido.Blocks.Components.General 714 @using Dynamicweb.Rapido.Blocks.Components 715 716 717 @* Component *@ 718 719 @helper RenderLeftNavigation(LeftNavigation settings) { 720 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 721 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 722 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 723 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 724 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 725 726 <div class="grid__cell"> 727 @RenderNavigation(settings) 728 </div> 729 } 730 @using System.Reflection 731 @using Dynamicweb.Rapido.Blocks.Components.General 732 @using Dynamicweb.Core 733 734 @* Component *@ 735 736 @helper RenderHeading(Heading settings) 737 { 738 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 739 { 740 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 741 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 742 743 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 744 if (!string.IsNullOrEmpty(settings.Link)) 745 { 746 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 747 } 748 else 749 { 750 if (settings.Icon == null) 751 { 752 settings.Icon = new Icon(); 753 } 754 settings.Icon.Label = settings.Title; 755 @Render(settings.Icon) 756 } 757 @("</" + tagName + ">"); 758 } 759 } 760 @using Dynamicweb.Rapido.Blocks.Components 761 @using Dynamicweb.Rapido.Blocks.Components.General 762 @using Dynamicweb.Rapido.Blocks 763 764 765 @* Component *@ 766 767 @helper RenderImage(Image settings) 768 { 769 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 770 { 771 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 772 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 773 774 if (settings.Caption != null) 775 { 776 @:<div> 777 } 778 779 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 780 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 781 782 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 783 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 784 @if (settings.Link != null) 785 { 786 <a href="@settings.Link"> 787 @RenderTheImage(settings) 788 </a> 789 } 790 else 791 { 792 @RenderTheImage(settings) 793 } 794 </div> 795 </div> 796 797 if (settings.Caption != null) 798 { 799 <span class="image-caption dw-mod">@settings.Caption</span> 800 @:</div> 801 } 802 } 803 else 804 { 805 if (settings.Caption != null) 806 { 807 @:<div> 808 } 809 if (!string.IsNullOrEmpty(settings.Link)) 810 { 811 <a href="@settings.Link"> 812 @RenderTheImage(settings) 813 </a> 814 } 815 else 816 { 817 @RenderTheImage(settings) 818 } 819 820 if (settings.Caption != null) 821 { 822 <span class="image-caption dw-mod">@settings.Caption</span> 823 @:</div> 824 } 825 } 826 } 827 828 @helper RenderTheImage(Image settings) 829 { 830 if (settings != null) 831 { 832 string placeholderImage = "/Files/Images/placeholder.gif"; 833 string imageEngine = "/Admin/Public/GetImage.ashx?"; 834 string alternativeImage = "/Images/Kraemer/RapidoProducts/missing-image.jpg"; 835 836 string imageStyle = ""; 837 838 switch (settings.Style) 839 { 840 case ImageStyle.Ball: 841 imageStyle = "grid__cell-img--ball"; 842 break; 843 844 case ImageStyle.Triangle: 845 imageStyle = "grid__cell-img--triangle"; 846 break; 847 } 848 849 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 850 { 851 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 852 853 if (settings.ImageDefault != null) 854 { 855 settings.ImageDefault.Height = settings.ImageDefault.Width; 856 } 857 if (settings.ImageMedium != null) 858 { 859 settings.ImageMedium.Height = settings.ImageMedium.Width; 860 } 861 if (settings.ImageSmall != null) 862 { 863 settings.ImageSmall.Height = settings.ImageSmall.Width; 864 } 865 } 866 867 string defaultImage = imageEngine; 868 string imageSmall = ""; 869 string imageMedium = ""; 870 871 if (settings.DisableImageEngine) 872 { 873 defaultImage = settings.Path; 874 } 875 else 876 { 877 if (settings.ImageDefault != null) 878 { 879 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 880 881 if (settings.Path.GetType() != typeof(string)) 882 { 883 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 884 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 885 } 886 else 887 { 888 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 889 } 890 defaultImage += "&altFmImage_path=" + alternativeImage; 891 } 892 893 if (settings.ImageSmall != null) 894 { 895 imageSmall = "data-src-small=\"" + imageEngine; 896 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 897 898 if (settings.Path.GetType() != typeof(string)) 899 { 900 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 901 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 902 } 903 else 904 { 905 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 906 } 907 908 imageSmall += "\""; 909 } 910 911 if (settings.ImageMedium != null) 912 { 913 imageMedium = "data-src-medium=\"" + imageEngine; 914 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 915 916 if (settings.Path.GetType() != typeof(string)) 917 { 918 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 919 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 920 } 921 else 922 { 923 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 924 } 925 926 imageMedium += "\""; 927 } 928 } 929 930 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 931 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 932 if (!string.IsNullOrEmpty(settings.Title)) 933 { 934 optionalAttributes.Add("alt", settings.Title); 935 optionalAttributes.Add("title", settings.Title); 936 } 937 938 if (settings.DisableLazyLoad) 939 { 940 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 941 } 942 else 943 { 944 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 945 } 946 } 947 } 948 @using System.Reflection 949 @using Dynamicweb.Rapido.Blocks.Components.General 950 @using Dynamicweb.Rapido.Blocks.Components 951 952 @* Component *@ 953 954 @helper RenderFileField(FileField settings) 955 { 956 var attributes = new Dictionary<string, string>(); 957 if (string.IsNullOrEmpty(settings.Id)) 958 { 959 settings.Id = Guid.NewGuid().ToString("N"); 960 } 961 962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 963 if (settings.Disabled) { attributes.Add("disabled", "true"); } 964 if (settings.Required) { attributes.Add("required", "true"); } 965 if (settings.Multiple) { attributes.Add("multiple", "true"); } 966 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 967 if (string.IsNullOrEmpty(settings.ChooseFileText)) 968 { 969 settings.ChooseFileText = Translate("Choose file"); 970 } 971 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 972 { 973 settings.NoFilesChosenText = Translate("No files chosen..."); 974 } 975 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 976 977 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 978 979 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 980 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 981 982 attributes.Add("type", "file"); 983 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 984 settings.CssClass = "u-full-width " + settings.CssClass; 985 986 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 987 988 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 989 @if (!string.IsNullOrEmpty(settings.Label)) 990 { 991 <label for="@settings.Id">@settings.Label</label> 992 } 993 @if (!string.IsNullOrEmpty(settings.HelpText)) 994 { 995 <small class="form__help-text">@settings.HelpText</small> 996 } 997 998 <div class="form__field-combi file-input u-no-margin dw-mod"> 999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 1002 @if (settings.UploadButton != null) 1003 { 1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 1005 @Render(settings.UploadButton) 1006 } 1007 </div> 1008 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1009 </div> 1010 } 1011 @using System.Reflection 1012 @using Dynamicweb.Rapido.Blocks.Components.General 1013 @using Dynamicweb.Rapido.Blocks.Components 1014 @using Dynamicweb.Core 1015 @using System.Linq 1016 1017 @* Component *@ 1018 1019 @helper RenderDateTimeField(DateTimeField settings) 1020 { 1021 if (string.IsNullOrEmpty(settings.Id)) 1022 { 1023 settings.Id = Guid.NewGuid().ToString("N"); 1024 } 1025 1026 var textField = new TextField { 1027 Name = settings.Name, 1028 Id = settings.Id, 1029 Label = settings.Label, 1030 HelpText = settings.HelpText, 1031 Value = settings.Value, 1032 Disabled = settings.Disabled, 1033 Required = settings.Required, 1034 ErrorMessage = settings.ErrorMessage, 1035 CssClass = settings.CssClass, 1036 WrapperCssClass = settings.WrapperCssClass, 1037 OnChange = settings.OnChange, 1038 OnClick = settings.OnClick, 1039 ExtraAttributes = settings.ExtraAttributes, 1040 // 1041 Placeholder = settings.Placeholder 1042 }; 1043 1044 @Render(textField) 1045 1046 List<string> jsAttributes = new List<string>(); 1047 1048 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1049 1050 if (!string.IsNullOrEmpty(settings.DateFormat)) 1051 { 1052 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1053 } 1054 if (!string.IsNullOrEmpty(settings.MinDate)) 1055 { 1056 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1057 } 1058 if (!string.IsNullOrEmpty(settings.MaxDate)) 1059 { 1060 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1061 } 1062 if (settings.IsInline) 1063 { 1064 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1065 } 1066 if (settings.EnableTime) 1067 { 1068 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1069 } 1070 if (settings.EnableWeekNumbers) 1071 { 1072 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1073 } 1074 1075 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1076 1077 <script> 1078 document.addEventListener("DOMContentLoaded", function () { 1079 flatpickr("#@textField.Id", { 1080 @string.Join(",", jsAttributes) 1081 }); 1082 }); 1083 </script> 1084 } 1085 @using System.Reflection 1086 @using Dynamicweb.Rapido.Blocks.Components.General 1087 @using Dynamicweb.Rapido.Blocks.Components 1088 1089 @* Component *@ 1090 1091 @helper RenderTextField(TextField settings) 1092 { 1093 var attributes = new Dictionary<string, string>(); 1094 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1095 { 1096 settings.Id = Guid.NewGuid().ToString("N"); 1097 } 1098 1099 /*base settings*/ 1100 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1101 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1102 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1103 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1104 if (settings.Required) { attributes.Add("required", "true"); } 1105 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1106 /*end*/ 1107 1108 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1109 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1110 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1111 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1112 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1113 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1114 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1115 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1116 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1117 settings.CssClass = "u-full-width " + settings.CssClass; 1118 1119 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1120 1121 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1122 1123 string noMargin = "u-no-margin"; 1124 if (!settings.ReadOnly) { 1125 noMargin = ""; 1126 } 1127 1128 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1129 @if (!string.IsNullOrEmpty(settings.Label)) 1130 { 1131 <label for="@settings.Id">@settings.Label</label> 1132 } 1133 @if (!string.IsNullOrEmpty(settings.HelpText)) 1134 { 1135 <small class="form__help-text">@settings.HelpText</small> 1136 } 1137 1138 @if (settings.ActionButton != null) 1139 { 1140 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1141 <div class="form__field-combi u-no-margin dw-mod"> 1142 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1143 @Render(settings.ActionButton) 1144 </div> 1145 } 1146 else 1147 { 1148 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1149 } 1150 1151 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1152 </div> 1153 } 1154 @using System.Reflection 1155 @using Dynamicweb.Rapido.Blocks.Components.General 1156 @using Dynamicweb.Rapido.Blocks.Components 1157 1158 @* Component *@ 1159 1160 @helper RenderNumberField(NumberField settings) 1161 { 1162 var attributes = new Dictionary<string, string>(); 1163 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1164 { 1165 settings.Id = Guid.NewGuid().ToString("N"); 1166 } 1167 1168 /*base settings*/ 1169 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1170 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1171 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1172 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1173 if (settings.Required) { attributes.Add("required", "true"); } 1174 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1175 /*end*/ 1176 1177 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1178 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1179 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1180 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1181 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1182 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1183 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1184 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1185 attributes.Add("type", "number"); 1186 1187 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1188 1189 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1190 @if (!string.IsNullOrEmpty(settings.Label)) 1191 { 1192 <label for="@settings.Id">@settings.Label</label> 1193 } 1194 @if (!string.IsNullOrEmpty(settings.HelpText)) 1195 { 1196 <small class="form__help-text">@settings.HelpText</small> 1197 } 1198 1199 @if (settings.ActionButton != null) 1200 { 1201 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1202 <div class="form__field-combi u-no-margin dw-mod"> 1203 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1204 @Render(settings.ActionButton) 1205 </div> 1206 } 1207 else 1208 { 1209 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1210 } 1211 1212 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1213 </div> 1214 } 1215 @using System.Reflection 1216 @using Dynamicweb.Rapido.Blocks.Components.General 1217 @using Dynamicweb.Rapido.Blocks.Components 1218 1219 1220 @* Component *@ 1221 1222 @helper RenderTextareaField(TextareaField settings) 1223 { 1224 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1225 string id = settings.Id; 1226 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1227 { 1228 id = Guid.NewGuid().ToString("N"); 1229 } 1230 1231 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1232 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1233 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1234 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1235 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1236 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1237 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1238 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1239 if (settings.Required) { attributes.Add("required", "true"); } 1240 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1241 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1242 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1243 attributes.Add("name", settings.Name); 1244 1245 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1246 1247 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1248 @if (!string.IsNullOrEmpty(settings.Label)) 1249 { 1250 <label for="@id">@settings.Label</label> 1251 } 1252 @if (!string.IsNullOrEmpty(settings.HelpText)) 1253 { 1254 <small class="form__help-text">@settings.HelpText</small> 1255 } 1256 1257 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1258 1259 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1260 </div> 1261 } 1262 @using System.Reflection 1263 @using Dynamicweb.Rapido.Blocks.Components.General 1264 @using Dynamicweb.Rapido.Blocks.Components 1265 1266 1267 @* Component *@ 1268 1269 @helper RenderHiddenField(HiddenField settings) { 1270 var attributes = new Dictionary<string, string>(); 1271 attributes.Add("type", "hidden"); 1272 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1273 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1274 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1275 1276 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1277 } 1278 @using System.Reflection 1279 @using Dynamicweb.Rapido.Blocks.Components.General 1280 @using Dynamicweb.Rapido.Blocks.Components 1281 1282 @* Component *@ 1283 1284 @helper RenderCheckboxField(CheckboxField settings) 1285 { 1286 var attributes = new Dictionary<string, string>(); 1287 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1288 { 1289 settings.Id = Guid.NewGuid().ToString("N"); 1290 } 1291 1292 /*base settings*/ 1293 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1294 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1295 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1296 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1297 if (settings.Required) { attributes.Add("required", "true"); } 1298 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1299 /*end*/ 1300 1301 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1302 1303 attributes.Add("type", "checkbox"); 1304 if (settings.Checked) { attributes.Add("checked", "true"); } 1305 settings.CssClass = "form__control " + settings.CssClass; 1306 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1307 1308 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1309 1310 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1311 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1312 @if (!string.IsNullOrEmpty(settings.Label)) 1313 { 1314 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1315 } 1316 @if (!string.IsNullOrEmpty(settings.HelpText)) 1317 { 1318 <small class="form__help-text">@settings.HelpText</small> 1319 } 1320 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1321 </div> 1322 } 1323 @using System.Reflection 1324 @using Dynamicweb.Rapido.Blocks.Components.General 1325 @using Dynamicweb.Rapido.Blocks.Components 1326 1327 1328 @* Component *@ 1329 1330 @helper RenderCheckboxListField(CheckboxListField settings) 1331 { 1332 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1333 @if (!string.IsNullOrEmpty(settings.Label)) 1334 { 1335 <label>@settings.Label</label> 1336 } 1337 @if (!string.IsNullOrEmpty(settings.HelpText)) 1338 { 1339 <small class="form__help-text">@settings.HelpText</small> 1340 } 1341 1342 @foreach (var item in settings.Options) 1343 { 1344 if (settings.Required) 1345 { 1346 item.Required = true; 1347 } 1348 if (settings.Disabled) 1349 { 1350 item.Disabled = true; 1351 } 1352 if (!string.IsNullOrEmpty(settings.Name)) 1353 { 1354 item.Name = settings.Name; 1355 } 1356 if (!string.IsNullOrEmpty(settings.CssClass)) 1357 { 1358 item.CssClass += settings.CssClass; 1359 } 1360 1361 /* value is not supported */ 1362 1363 if (!string.IsNullOrEmpty(settings.OnClick)) 1364 { 1365 item.OnClick += settings.OnClick; 1366 } 1367 if (!string.IsNullOrEmpty(settings.OnChange)) 1368 { 1369 item.OnChange += settings.OnChange; 1370 } 1371 @Render(item) 1372 } 1373 1374 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1375 </div> 1376 } 1377 @using Dynamicweb.Rapido.Blocks.Components.General 1378 1379 @* Component *@ 1380 1381 @helper RenderSearch(Search settings) 1382 { 1383 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1384 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1385 1386 if (string.IsNullOrEmpty(settings.Id)) 1387 { 1388 settings.Id = Guid.NewGuid().ToString("N"); 1389 } 1390 1391 var resultAttributes = new Dictionary<string, string>(); 1392 1393 if (settings.PageSize != 0) 1394 { 1395 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1396 } 1397 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1398 { 1399 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1400 if (!string.IsNullOrEmpty(groupValue)) 1401 { 1402 resultAttributes.Add("data-selected-group", groupValue); 1403 } 1404 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1405 { 1406 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1407 } 1408 } 1409 resultAttributes.Add("data-force-init", "true"); 1410 if (settings.GoToFirstSearchResultOnEnter) 1411 { 1412 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1413 } 1414 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1415 { 1416 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1417 } 1418 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1419 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1420 1421 if (settings.SecondSearchData != null) 1422 { 1423 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1424 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1425 } 1426 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1427 { 1428 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1429 } 1430 1431 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1432 1433 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1434 1435 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1436 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1437 { 1438 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1439 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1440 } 1441 1442 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1443 1444 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1445 @if (settings.SecondSearchData != null) 1446 { 1447 <div class="search__column search__column--products dw-mod"> 1448 <div class="search__column-header dw-mod">@Translate("Products")</div> 1449 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1450 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1451 { 1452 @Render(new Link { 1453 Title = Translate("View all"), 1454 CssClass = "js-view-all-button u-margin", 1455 Href = settings.SearchData.ResultsPageUrl 1456 }); 1457 } 1458 </div> 1459 <div class="search__column search__column--pages dw-mod"> 1460 <div class="search__column-header">@Translate("Pages")</div> 1461 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1462 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1463 { 1464 @Render(new Link 1465 { 1466 Title = Translate("View all"), 1467 CssClass = "js-view-all-button u-margin", 1468 Href = settings.SecondSearchData.ResultsPageUrl 1469 }); 1470 } 1471 </div> 1472 } 1473 else 1474 { 1475 <div class="search__column search__column--only dw-mod"> 1476 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1477 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1478 { 1479 @Render(new Link { 1480 Title = Translate("View all"), 1481 CssClass = "js-view-all-button u-margin", 1482 Href = settings.SearchData.ResultsPageUrl 1483 }); 1484 } 1485 </div> 1486 } 1487 </div> 1488 1489 @if (settings.SearchButton != null) 1490 { 1491 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1492 if (settings.RenderDefaultSearchIcon) 1493 { 1494 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1495 } 1496 @Render(settings.SearchButton); 1497 } 1498 </div> 1499 } 1500 @using System.Reflection 1501 @using Dynamicweb.Rapido.Blocks.Components.General 1502 @using Dynamicweb.Rapido.Blocks.Components 1503 1504 1505 @* Component *@ 1506 1507 @helper RenderSelectField(SelectField settings) 1508 { 1509 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1510 { 1511 settings.Id = Guid.NewGuid().ToString("N"); 1512 } 1513 1514 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1515 @if (!string.IsNullOrEmpty(settings.Label)) 1516 { 1517 <label for="@settings.Id">@settings.Label</label> 1518 } 1519 @if (!string.IsNullOrEmpty(settings.HelpText)) 1520 { 1521 <small class="form__help-text">@settings.HelpText</small> 1522 } 1523 1524 @if (settings.ActionButton != null) 1525 { 1526 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1527 <div class="form__field-combi u-no-margin dw-mod"> 1528 @RenderSelectBase(settings) 1529 @Render(settings.ActionButton) 1530 </div> 1531 } 1532 else 1533 { 1534 @RenderSelectBase(settings) 1535 } 1536 1537 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1538 </div> 1539 } 1540 1541 @helper RenderSelectBase(SelectField settings) 1542 { 1543 var attributes = new Dictionary<string, string>(); 1544 1545 /*base settings*/ 1546 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1547 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1548 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1549 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1550 if (settings.Required) { attributes.Add("required", "true"); } 1551 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1552 /*end*/ 1553 1554 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1555 1556 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1557 @if (settings.Default != null) 1558 { 1559 @Render(settings.Default) 1560 } 1561 1562 @foreach (var item in settings.Options) 1563 { 1564 if (!string.IsNullOrEmpty(settings.Value)) { 1565 item.Checked = item.Value == settings.Value; 1566 } 1567 @Render(item) 1568 } 1569 </select> 1570 } 1571 @using System.Reflection 1572 @using Dynamicweb.Rapido.Blocks.Components.General 1573 @using Dynamicweb.Rapido.Blocks.Components 1574 1575 @* Component *@ 1576 1577 @helper RenderRadioButtonField(RadioButtonField settings) 1578 { 1579 var attributes = new Dictionary<string, string>(); 1580 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1581 { 1582 settings.Id = Guid.NewGuid().ToString("N"); 1583 } 1584 1585 /*base settings*/ 1586 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1587 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1588 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1589 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1590 if (settings.Required) { attributes.Add("required", "true"); } 1591 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1592 /*end*/ 1593 1594 attributes.Add("type", "radio"); 1595 if (settings.Checked) { attributes.Add("checked", "true"); } 1596 settings.CssClass = "form__control " + settings.CssClass; 1597 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1598 1599 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1600 1601 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1602 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1603 @if (!string.IsNullOrEmpty(settings.Label)) 1604 { 1605 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1606 } 1607 @if (!string.IsNullOrEmpty(settings.HelpText)) 1608 { 1609 <small class="form__help-text">@settings.HelpText</small> 1610 } 1611 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1612 </div> 1613 } 1614 @using System.Reflection 1615 @using Dynamicweb.Rapido.Blocks.Components.General 1616 @using Dynamicweb.Rapido.Blocks.Components 1617 1618 1619 @* Component *@ 1620 1621 @helper RenderRadioButtonListField(RadioButtonListField settings) 1622 { 1623 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1624 1625 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1626 @if (!string.IsNullOrEmpty(settings.Label)) 1627 { 1628 <label>@settings.Label</label> 1629 } 1630 @if (!string.IsNullOrEmpty(settings.HelpText)) 1631 { 1632 <small class="form__help-text">@settings.HelpText</small> 1633 } 1634 1635 @foreach (var item in settings.Options) 1636 { 1637 if (settings.Required) 1638 { 1639 item.Required = true; 1640 } 1641 if (settings.Disabled) 1642 { 1643 item.Disabled = true; 1644 } 1645 if (!string.IsNullOrEmpty(settings.Name)) 1646 { 1647 item.Name = settings.Name; 1648 } 1649 if (!string.IsNullOrEmpty(settings.Value) && settings.Value == item.Value) 1650 { 1651 item.Checked = true; 1652 } 1653 if (!string.IsNullOrEmpty(settings.OnClick)) 1654 { 1655 item.OnClick += settings.OnClick; 1656 } 1657 if (!string.IsNullOrEmpty(settings.OnChange)) 1658 { 1659 item.OnChange += settings.OnChange; 1660 } 1661 if (!string.IsNullOrEmpty(settings.CssClass)) 1662 { 1663 item.CssClass += settings.CssClass; 1664 } 1665 @Render(item) 1666 } 1667 1668 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1669 </div> 1670 } 1671 @using System.Reflection 1672 @using Dynamicweb.Rapido.Blocks.Components.General 1673 @using Dynamicweb.Rapido.Blocks.Components 1674 1675 1676 @* Component *@ 1677 1678 @helper RenderNotificationMessage(NotificationMessage settings) 1679 { 1680 if (!string.IsNullOrEmpty(settings.Message)) 1681 { 1682 var attributes = new Dictionary<string, string>(); 1683 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1684 1685 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1686 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>@settings.Message</div> 1687 } 1688 } 1689 @using Dynamicweb.Rapido.Blocks.Components.General 1690 1691 1692 @* Component *@ 1693 1694 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1695 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1696 1697 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender> 1698 @if (settings.SubBlocks != null) { 1699 @RenderBlockList(settings.SubBlocks) 1700 } 1701 </div> 1702 } 1703 @using System.Reflection 1704 @using Dynamicweb.Rapido.Blocks.Components.General 1705 @using Dynamicweb.Rapido.Blocks.Components 1706 @using System.Text.RegularExpressions 1707 1708 1709 @* Component *@ 1710 1711 @helper RenderSticker(Sticker settings) { 1712 if (!String.IsNullOrEmpty(settings.Title)) { 1713 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1714 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1715 1716 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1717 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1718 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1719 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1720 optionalAttributes.Add("style", styleTag); 1721 } 1722 1723 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1724 } 1725 } 1726 1727 @using System.Reflection 1728 @using Dynamicweb.Rapido.Blocks.Components.General 1729 @using Dynamicweb.Rapido.Blocks.Components 1730 1731 1732 @* Component *@ 1733 1734 @helper RenderStickersCollection(StickersCollection settings) 1735 { 1736 if (settings.Stickers.Count > 0) 1737 { 1738 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1739 1740 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1741 @foreach (Sticker sticker in settings.Stickers) 1742 { 1743 @Render(sticker) 1744 } 1745 </div> 1746 } 1747 } 1748 1749 @using Dynamicweb.Rapido.Blocks.Components.General 1750 1751 1752 @* Component *@ 1753 1754 @helper RenderForm(Form settings) { 1755 if (settings != null) 1756 { 1757 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1758 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1759 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1760 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1761 var enctypes = new Dictionary<string, string> 1762 { 1763 { "multipart", "multipart/form-data" }, 1764 { "text", "text/plain" }, 1765 { "application", "application/x-www-form-urlencoded" } 1766 }; 1767 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1768 optionalAttributes.Add("method", settings.Method.ToString()); 1769 1770 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1771 { 1772 @settings.FormStartMarkup 1773 } 1774 else 1775 { 1776 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1777 } 1778 1779 foreach (var field in settings.GetFields()) 1780 { 1781 @Render(field) 1782 } 1783 1784 @:</form> 1785 } 1786 } 1787 @using System.Reflection 1788 @using Dynamicweb.Rapido.Blocks.Components.General 1789 @using Dynamicweb.Rapido.Blocks.Components 1790 1791 1792 @* Component *@ 1793 1794 @helper RenderText(Text settings) 1795 { 1796 @settings.Content 1797 } 1798 @using System.Reflection 1799 @using Dynamicweb.Rapido.Blocks.Components.General 1800 @using Dynamicweb.Rapido.Blocks.Components 1801 1802 1803 @* Component *@ 1804 1805 @helper RenderContentModule(ContentModule settings) { 1806 if (!string.IsNullOrEmpty(settings.Content)) 1807 { 1808 @settings.Content 1809 } 1810 } 1811 @using System.Reflection 1812 @using Dynamicweb.Rapido.Blocks.Components.General 1813 @using Dynamicweb.Rapido.Blocks.Components 1814 1815 1816 @* Component *@ 1817 1818 @helper RenderModal(Modal settings) { 1819 if (settings != null) 1820 { 1821 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1822 1823 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1824 1825 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1826 1827 <div class="modal-container u-no-print"> 1828 @if (!settings.DisableDarkOverlay) 1829 { 1830 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1831 } 1832 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1833 @if (settings.Heading != null) 1834 { 1835 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1836 { 1837 <div class="modal__header modal-header bs-border-bottom"> 1838 @Render(settings.Heading) 1839 <label for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1840 </div> 1841 }else 1842 { 1843 <div class="modal__header modal-header bs-py-2"> 1844 <div class="bs-visibility-hidden"></div> 1845 <label class="bs-m-0" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1846 </div> 1847 } 1848 } 1849 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1850 @if (!string.IsNullOrEmpty(settings.BodyText)) 1851 { 1852 @settings.BodyText 1853 } 1854 @if (settings.BodyTemplate != null) 1855 { 1856 @settings.BodyTemplate 1857 } 1858 @{ 1859 var actions = settings.GetActions(); 1860 } 1861 </div> 1862 @if (actions.Length > 0) 1863 { 1864 <div class="modal__footer"> 1865 @foreach (var action in actions) 1866 { 1867 action.CssClass += " u-no-margin"; 1868 @Render(action) 1869 } 1870 </div> 1871 } 1872 @* <label class="new-modal__close-btn" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> *@ 1873 </div> 1874 </div> 1875 } 1876 } 1877 @using Dynamicweb.Rapido.Blocks.Components.General 1878 1879 @* Component *@ 1880 1881 @helper RenderMediaListItem(MediaListItem settings) 1882 { 1883 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1884 @if (!string.IsNullOrEmpty(settings.Label)) 1885 { 1886 if (!string.IsNullOrEmpty(settings.Link)) 1887 { 1888 @Render(new Link 1889 { 1890 Href = settings.Link, 1891 CssClass = "media-list-item__sticker dw-mod", 1892 ButtonLayout = ButtonLayout.None, 1893 Title = settings.Label, 1894 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1895 }) 1896 } 1897 else if (!string.IsNullOrEmpty(settings.OnClick)) 1898 { 1899 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1900 <span class="u-uppercase">@settings.Label</span> 1901 </span> 1902 } 1903 else 1904 { 1905 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1906 <span class="u-uppercase">@settings.Label</span> 1907 </span> 1908 } 1909 } 1910 <div class="media-list-item__wrap"> 1911 <div class="media-list-item__info dw-mod"> 1912 <div class="media-list-item__header dw-mod"> 1913 @if (!string.IsNullOrEmpty(settings.Title)) 1914 { 1915 if (!string.IsNullOrEmpty(settings.Link)) 1916 { 1917 @Render(new Link 1918 { 1919 Href = settings.Link, 1920 CssClass = "media-list-item__name dw-mod", 1921 ButtonLayout = ButtonLayout.None, 1922 Title = settings.Title, 1923 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1924 }) 1925 } 1926 else if (!string.IsNullOrEmpty(settings.OnClick)) 1927 { 1928 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1929 } 1930 else 1931 { 1932 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1933 } 1934 } 1935 1936 @if (!string.IsNullOrEmpty(settings.Status)) 1937 { 1938 <div class="media-list-item__state dw-mod">@settings.Status</div> 1939 } 1940 </div> 1941 @{ 1942 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1943 } 1944 1945 @Render(settings.InfoTable) 1946 </div> 1947 <div class="media-list-item__actions dw-mod"> 1948 <div class="media-list-item__actions-list dw-mod"> 1949 @{ 1950 var actions = settings.GetActions(); 1951 1952 foreach (ButtonBase action in actions) 1953 { 1954 action.ButtonLayout = ButtonLayout.None; 1955 action.CssClass += " media-list-item__action link"; 1956 1957 @Render(action) 1958 } 1959 } 1960 </div> 1961 1962 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 1963 { 1964 settings.SelectButton.CssClass += " u-no-margin"; 1965 1966 <div class="media-list-item__action-button"> 1967 @Render(settings.SelectButton) 1968 </div> 1969 } 1970 </div> 1971 </div> 1972 </div> 1973 } 1974 @using Dynamicweb.Rapido.Blocks.Components.General 1975 @using Dynamicweb.Rapido.Blocks.Components 1976 1977 @helper RenderTable(Table settings) 1978 { 1979 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1980 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1981 1982 var enumToClasses = new Dictionary<TableDesign, string> 1983 { 1984 { TableDesign.Clean, "table--clean" }, 1985 { TableDesign.Bordered, "table--bordered" }, 1986 { TableDesign.Striped, "table--striped" }, 1987 { TableDesign.Hover, "table--hover" }, 1988 { TableDesign.Compact, "table--compact" }, 1989 { TableDesign.Condensed, "table--condensed" }, 1990 { TableDesign.NoTopBorder, "table--no-top-border" } 1991 }; 1992 string tableDesignClass = ""; 1993 if (settings.Design != TableDesign.None) 1994 { 1995 tableDesignClass = enumToClasses[settings.Design]; 1996 } 1997 1998 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 1999 2000 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2001 2002 <table @ComponentMethods.AddAttributes(resultAttributes)> 2003 @if (settings.Header != null) 2004 { 2005 <thead> 2006 @Render(settings.Header) 2007 </thead> 2008 } 2009 <tbody> 2010 @foreach (var row in settings.Rows) 2011 { 2012 @Render(row) 2013 } 2014 </tbody> 2015 @if (settings.Footer != null) 2016 { 2017 <tfoot> 2018 @Render(settings.Footer) 2019 </tfoot> 2020 } 2021 </table> 2022 } 2023 @using Dynamicweb.Rapido.Blocks.Components.General 2024 @using Dynamicweb.Rapido.Blocks.Components 2025 2026 @helper RenderTableRow(TableRow settings) 2027 { 2028 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2029 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2030 2031 var enumToClasses = new Dictionary<TableRowDesign, string> 2032 { 2033 { TableRowDesign.NoBorder, "table__row--no-border" }, 2034 { TableRowDesign.Border, "table__row--border" }, 2035 { TableRowDesign.TopBorder, "table__row--top-line" }, 2036 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2037 { TableRowDesign.Solid, "table__row--solid" } 2038 }; 2039 2040 string tableRowDesignClass = ""; 2041 if (settings.Design != TableRowDesign.None) 2042 { 2043 tableRowDesignClass = enumToClasses[settings.Design]; 2044 } 2045 2046 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2047 2048 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2049 2050 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2051 @foreach (var cell in settings.Cells) 2052 { 2053 if (settings.IsHeaderRow) 2054 { 2055 cell.IsHeader = true; 2056 } 2057 @Render(cell) 2058 } 2059 </tr> 2060 } 2061 @using Dynamicweb.Rapido.Blocks.Components.General 2062 @using Dynamicweb.Rapido.Blocks.Components 2063 @using Dynamicweb.Core 2064 2065 @helper RenderTableCell(TableCell settings) 2066 { 2067 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2068 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2069 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2070 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2071 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2072 2073 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2074 2075 string tagName = settings.IsHeader ? "th" : "td"; 2076 2077 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2078 @settings.Content 2079 @("</" + tagName + ">"); 2080 } 2081 @using System.Linq 2082 @using Dynamicweb.Rapido.Blocks.Components.General 2083 2084 @* Component *@ 2085 2086 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2087 { 2088 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2089 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2090 2091 if (settings.NumberOfPages > 1) 2092 { 2093 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2094 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2095 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2096 2097 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2098 @if (settings.ShowPagingInfo) 2099 { 2100 <div class="pager__info dw-mod"> 2101 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2102 </div> 2103 } 2104 <ul class="pager__list dw-mod"> 2105 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2106 { 2107 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2108 } 2109 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2110 { 2111 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2112 } 2113 @if (settings.GetPages().Any()) 2114 { 2115 foreach (var page in settings.GetPages()) 2116 { 2117 @Render(page) 2118 } 2119 } 2120 else 2121 { 2122 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2123 { 2124 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2125 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2126 } 2127 } 2128 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2129 { 2130 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2131 } 2132 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2133 { 2134 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2135 } 2136 </ul> 2137 </div> 2138 } 2139 } 2140 2141 @helper RenderPaginationItem(PaginationItem settings) 2142 { 2143 if (settings.Icon == null) 2144 { 2145 settings.Icon = new Icon(); 2146 } 2147 2148 settings.Icon.Label = settings.Label; 2149 <li class="pager__btn dw-mod"> 2150 @if (settings.IsActive) 2151 { 2152 <span class="pager__num pager__num--current dw-mod"> 2153 @Render(settings.Icon) 2154 </span> 2155 } 2156 else 2157 { 2158 <a href="@settings.Link" class="pager__num dw-mod"> 2159 @Render(settings.Icon) 2160 </a> 2161 } 2162 </li> 2163 } 2164 2165 2166 @using Dynamicweb.Rapido.Blocks.Components.General 2167 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2168 2169 2170 @using Dynamicweb.Frontend 2171 @using System.Reflection 2172 @using Dynamicweb.Content.Items 2173 @using System.Web.UI.HtmlControls 2174 @using Dynamicweb.Rapido.Blocks.Components 2175 @using Dynamicweb.Rapido.Blocks 2176 @using Dynamicweb.Rapido.Blocks.Components.Articles 2177 2178 @* Components for the articles *@ 2179 @using System.Reflection 2180 @using Dynamicweb.Rapido.Blocks.Components.Articles 2181 2182 2183 @* Component for the articles *@ 2184 2185 @helper RenderArticleBanner(dynamic settings) { 2186 string filterClasses = "image-filter image-filter--darken"; 2187 settings.Layout = ArticleHeaderLayout.Banner; 2188 2189 if (settings.Image != null) 2190 { 2191 if (settings.Image.Path != null) 2192 { 2193 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2194 <div class="background-image @filterClasses dw-mod"> 2195 <div class="background-image__wrapper @filterClasses dw-mod"> 2196 @{ 2197 settings.Image.CssClass += "background-image__cover dw-mod"; 2198 } 2199 @Render(settings.Image) 2200 </div> 2201 </div> 2202 <div class="center-container dw-mod"> 2203 <div class="grid"> 2204 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg"> 2205 <div class="u-left-middle"> 2206 <div> 2207 @if (!String.IsNullOrEmpty(settings.Heading)) 2208 { 2209 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2210 } 2211 @if (!String.IsNullOrEmpty(settings.Subheading)) 2212 { 2213 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2214 } 2215 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2216 { 2217 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2218 } 2219 @if (!String.IsNullOrEmpty(settings.Link)) { 2220 <div class="grid__cell"> 2221 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2222 </div> 2223 } 2224 </div> 2225 </div> 2226 </div> 2227 @if (settings.ExternalParagraphId != 0) 2228 { 2229 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod"> 2230 <div class="u-color-light-gray--bg u-color-dark dw-mod"> 2231 @RenderParagraphContent(settings.ExternalParagraphId) 2232 </div> 2233 </div> 2234 } 2235 2236 </div> 2237 </div> 2238 </section> 2239 if (!String.IsNullOrEmpty(settings.Image.Caption)) { 2240 <div class="image-caption dw-mod">@settings.Image.Caption</div> 2241 } 2242 } 2243 else 2244 { 2245 settings.Layout = ArticleHeaderLayout.Clean; 2246 @RenderArticleCleanHeader(settings); 2247 } 2248 } 2249 else 2250 { 2251 settings.Layout = ArticleHeaderLayout.Clean; 2252 @RenderArticleCleanHeader(settings); 2253 } 2254 } 2255 @using System.Reflection 2256 @using Dynamicweb.Rapido.Blocks.Components 2257 @using Dynamicweb.Rapido.Blocks.Components.General 2258 @using Dynamicweb.Rapido.Blocks.Components.Articles 2259 @using Dynamicweb.Rapido.Blocks 2260 2261 2262 @* Component for the articles *@ 2263 2264 @helper RenderArticleHeader(ArticleHeader settings) { 2265 dynamic[] methodParameters = new dynamic[1]; 2266 methodParameters[0] = settings; 2267 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom"); 2268 2269 if (customMethod != null) 2270 { 2271 @customMethod.Invoke(this, methodParameters).ToString(); 2272 } else { 2273 switch (settings.Layout) 2274 { 2275 case ArticleHeaderLayout.Clean: 2276 @RenderArticleCleanHeader(settings); 2277 break; 2278 case ArticleHeaderLayout.Split: 2279 @RenderArticleSplitHeader(settings); 2280 break; 2281 case ArticleHeaderLayout.Banner: 2282 @RenderArticleBannerHeader(settings); 2283 break; 2284 case ArticleHeaderLayout.Overlay: 2285 @RenderArticleOverlayHeader(settings); 2286 break; 2287 default: 2288 @RenderArticleCleanHeader(settings); 2289 break; 2290 } 2291 } 2292 } 2293 2294 @helper RenderArticleCleanHeader(ArticleHeader settings) { 2295 dynamic[] methodParameters = new dynamic[1]; 2296 methodParameters[0] = settings; 2297 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom"); 2298 2299 if (customMethod != null) 2300 { 2301 @customMethod.Invoke(this, methodParameters).ToString(); 2302 } 2303 else 2304 { 2305 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2306 2307 <div class="grid grid--align-content-start grid--justify-start"> 2308 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod"> 2309 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0) 2310 { 2311 <div class="u-border-bottom u-padding-bottom"> 2312 @if (!String.IsNullOrEmpty(settings.Category)) 2313 { 2314 <div class="u-pull--left"> 2315 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2316 </div> 2317 } 2318 <div class="u-pull--right"> 2319 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2320 { 2321 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small> 2322 } 2323 @if (settings.RatingOutOf != 0) 2324 { 2325 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2326 } 2327 </div> 2328 </div> 2329 } 2330 2331 <div class="grid__cell"> 2332 @if (!String.IsNullOrEmpty(settings.Heading)) 2333 { 2334 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2335 } 2336 @if (settings.Image != null) 2337 { 2338 if (settings.Image.Path != null) 2339 { 2340 <div class="u-padding-bottom--lg"> 2341 @Render(settings.Image) 2342 </div> 2343 } 2344 } 2345 @if (!String.IsNullOrEmpty(settings.Subheading)) 2346 { 2347 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2348 } 2349 @if (!String.IsNullOrEmpty(settings.Link)) 2350 { 2351 <div class="grid__cell"> 2352 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2353 </div> 2354 } 2355 </div> 2356 </div> 2357 @if (settings.ExternalParagraphId != 0) 2358 { 2359 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod"> 2360 @RenderParagraphContent(settings.ExternalParagraphId) 2361 </div> 2362 } 2363 </div> 2364 } 2365 } 2366 2367 @helper RenderArticleSplitHeader(ArticleHeader settings) { 2368 dynamic[] methodParameters = new dynamic[1]; 2369 methodParameters[0] = settings; 2370 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom"); 2371 2372 if (customMethod != null) 2373 { 2374 @customMethod.Invoke(this, methodParameters).ToString(); 2375 } 2376 else 2377 { 2378 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6"; 2379 2380 if (settings.Image != null) 2381 { 2382 if (settings.Image.Path != null) 2383 { 2384 <section class="multiple-paragraphs-container paragraph-container--full-width"> 2385 <div class="grid"> 2386 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2387 <div class="u-left-middle u-padding--lg"> 2388 <div> 2389 @if (!String.IsNullOrEmpty(settings.Category)) 2390 { 2391 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2392 } 2393 @if (!String.IsNullOrEmpty(settings.Heading)) 2394 { 2395 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2396 } 2397 @if (!String.IsNullOrEmpty(settings.Subheading)) 2398 { 2399 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2400 } 2401 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2402 { 2403 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small> 2404 } 2405 @if (settings.RatingOutOf != 0) 2406 { 2407 <div class="u-pull--right"> 2408 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2409 </div> 2410 } 2411 @if (!String.IsNullOrEmpty(settings.Link)) { 2412 <div class="u-full-width u-pull--left u-margin-top"> 2413 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2414 </div> 2415 } 2416 </div> 2417 </div> 2418 </div> 2419 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&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 4476 @helper RenderMobileNavigationOldWebshop() 4477 { 4478 <li class="menu-mobile__item"> 4479 <a href="https://ssoprovider.kraemer.no/users/sign_in" class="menu-mobile__link dw-mod menu-mobile__link--highlighted" onclick="RememberState.SetCookie('useAnotherAddress', false)" target="_blank"> 4480 <i class="fas fa-shopping-basket u-margin-right"></i> @Translate("Old Webshop") 4481 </a> 4482 </li> 4483 } 4484 4485 @helper RenderMobileNavigationCreateAccountAction() 4486 { 4487 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4488 4489 <li class="menu-mobile__item"> 4490 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a> 4491 </li> 4492 } 4493 4494 @helper RenderMobileNavigationProfileAction() 4495 { 4496 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4497 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4498 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4499 string myProfilePageLink = linkStart + myProfilePageId; 4500 4501 <li class="menu-mobile__item"> 4502 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4503 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @Translate("My Profile") 4504 </a> 4505 </li> 4506 } 4507 4508 @helper RenderMobileNavigationOrdersAction() 4509 { 4510 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4511 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4512 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4513 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 4514 int deviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 4515 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 4516 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 4517 int foodCalendarPageId = GetPageIdByNavigationTag("MenuView"); 4518 int foodCalendarAdminPageId = GetPageIdByNavigationTag("MenuCalendarView"); 4519 string announcementPageLink = linkStart + announcementPageId; 4520 string myOrdersPageLink = linkStart + myOrdersPageId; 4521 string myReportsPageLink = linkStart + myReportsPageId; 4522 string myDeviationsPageLink = linkStart + deviationsPageId; 4523 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4524 string foodCalendarPageLink = linkStart + foodCalendarPageId; 4525 string foodCalendarAdminPageLink = linkStart + foodCalendarAdminPageId; 4526 //string ordersIcon = "fas fa-list"; 4527 var user = Pageview.User; 4528 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 4529 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 4530 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 4531 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 4532 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 4533 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 4534 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 4535 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 4536 4537 <li class="menu-mobile__item"> 4538 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4539 <img width="20" height="20" src="/Files/Images/favorite-list-svg.svg"> @Translate("My Favorites") 4540 </a> 4541 </li> 4542 <li class="menu-mobile__item"> 4543 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4544 <img width="20" height="20" src="/Files/Images/order-history-svg.svg"> @Translate("My Orders") 4545 </a> 4546 </li> 4547 if (hasAccessToAnnouncements) 4548 { 4549 <li class="menu-mobile__item"> 4550 <a href="@announcementPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod u-brand-color-two bs-position-relative bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 4551 <img width="22" height="22" src="/Files/Images/notifications.svg"> 4552 <svg class="announcement_notification-dot bs-position-absolute @announcementNotificationDotClass" style="top: 45%; left: 25px;height: 13px;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 4553 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30"/> 4554 </svg> 4555 @Translate("Announcements") 4556 </a> 4557 </li> 4558 } 4559 if (hasAccessToFoodCalendar) 4560 { 4561 <li class="menu-mobile__item"> 4562 <a href="@foodCalendarPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4563 <img width="20" height="20" src="/Files/Images/food-calendar.svg"> @Translate("Matretter") 4564 </a> 4565 </li> 4566 } 4567 4568 if (isFoodCalendarAdmin) 4569 { 4570 <li class="menu-mobile__item"> 4571 <a href="@foodCalendarAdminPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4572 <img width="20" height="20" src="/Files/Images/food-calendar-menu-calendar.svg"> @Translate("Kalendervisning") 4573 </a> 4574 </li> 4575 } 4576 4577 <li class="menu-mobile__item"> 4578 <a href="@myDeviationsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4579 <img width="20" height="20" src="/Files/Images/UnionRMA-icon.svg"> @Translate("My Deviations") 4580 </a> 4581 </li> 4582 4583 if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 4584 { 4585 <li class="menu-mobile__item"> 4586 <a href="@myReportsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4587 <img width="20" height="20" src="/Files/Images/IconPowerBi.svg"> @Translate("My reports") 4588 </a> 4589 </li> 4590 } 4591 4592 4593 } 4594 4595 4596 @helper RenderMobileNavigationSavedCardsAction() 4597 { 4598 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4599 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4600 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4601 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4602 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card"; 4603 4604 <li class="menu-mobile__item"> 4605 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a> 4606 </li> 4607 } 4608 4609 @helper RenderMobileNavigationSignOutAction() 4610 { 4611 int pageId = Model.TopPage.ID; 4612 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt"; 4613 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 4614 bool promptForAccount = false; 4615 4616 if(userCustomFields != null) { 4617 foreach (var field in userCustomFields) 4618 { 4619 if (field.CustomField.SystemName == "AccessUser_PromptForAccount") 4620 { 4621 promptForAccount = field.Value.ToString() == "True"; 4622 } 4623 } 4624 } 4625 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 4626 { 4627 <li class="menu-mobile__item"> 4628 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4629 </li> 4630 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 4631 { 4632 if(promptForAccount) { 4633 <li class="menu-mobile__item"> 4634 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4635 </li> 4636 } else { 4637 <li class="menu-mobile__item"> 4638 <a href="/" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4639 </li> 4640 } 4641 4642 } else { 4643 <li class="menu-mobile__item"> 4644 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4645 </li> 4646 } 4647 @* <li class="menu-mobile__item"> 4648 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a> 4649 </li>*@ 4650 } 4651 4652 @helper RenderMobileNavigationLanguagesAction() 4653 { 4654 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4655 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 4656 string selectedLanguage = ""; 4657 foreach (var lang in Model.Languages) 4658 { 4659 var language = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4660 var languageTitle = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(language.ToLower()); 4661 4662 if (lang.IsCurrent) 4663 { 4664 selectedLanguage = languageTitle; 4665 } 4666 } 4667 4668 <li class="menu-mobile__item dw-mod"> 4669 @if (isSlidesDesign) 4670 { 4671 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4672 } 4673 else 4674 { 4675 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4676 } 4677 <div class="menu-mobile__link__wrap"> 4678 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"><img width="20" height="20" src="/Files/Images/language-selector-svg.svg"> @selectedLanguage</label> 4679 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4680 </div> 4681 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4682 @if (isSlidesDesign) 4683 { 4684 <li class="menu-mobile__item dw-mod"> 4685 <div class="menu-mobile__link__wrap"> 4686 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4687 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4688 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4689 </div> 4690 </li> 4691 } 4692 @*foreach (var lang in Model.Languages) 4693 { 4694 <li class="menu-mobile__item dw-mod"> 4695 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4696 </li> 4697 }*@ 4698 4699 @foreach (var lang in Model.Languages) 4700 { 4701 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower(); 4702 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 4703 string cultureName = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4704 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4705 var language = Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName.Split('(')[0].Trim(); 4706 4707 4708 if (languageViewType == "flag-culture") 4709 { 4710 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 4711 } 4712 4713 if (languageViewType == "flag") 4714 { 4715 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 4716 } 4717 4718 if (languageViewType == "name") 4719 { 4720 langInfo = lang.Name; 4721 } 4722 4723 if (languageViewType == "culture") 4724 { 4725 langInfo = cultureName; 4726 } 4727 4728 <li class="menu-mobile__item dw-mod"> 4729 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@langInfo</a> 4730 </li> 4731 } 4732 </ul> 4733 </li> 4734 } 4735 4736 4737 4738 4739 @helper RenderCustomSelectCartsAndImpersonation() 4740 { 4741 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 4742 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4743 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 4744 4745 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4746 string userName = userExists ? getUserName(Pageview.User) : ""; 4747 int secondaryUsersCount = Model.SecondaryUsers.Count; 4748 4749 @*if (userExists) 4750 { 4751 <div class="u-max-w260px u-margin-left--lg u-margin-top--lg u-margin-bottom--lg"> 4752 <span>@Translate("Handlekurv")</span> 4753 <div class="dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 4754 <div class="dw-mod"> 4755 @Render(new Button 4756 { 4757 Title = Translate("Change Cart Name"), 4758 ButtonType = ButtonType.Button, 4759 ButtonLayout = ButtonLayout.None, 4760 CssClass = "u-margin-bottom change-cart-name", 4761 OnClick = "changeCartName()" 4762 }) 4763 @Render(new Button 4764 { 4765 Title = Translate("Create New Cart"), 4766 ButtonType = ButtonType.Button, 4767 ButtonLayout = ButtonLayout.Primary, 4768 CssClass = "u-full-width", 4769 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 4770 }) 4771 </div> 4772 </div> 4773 }*@ 4774 <div class="u-max-w260px u-margin-left--lg"> 4775 @if (secondaryUsersCount > 0) 4776 { 4777 @RenderDesktopToolsTextMobile() 4778 } 4779 </div> 4780 } 4781 4782 4783 @helper RenderDesktopToolsTextMobile() 4784 { 4785 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 4786 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4787 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 4788 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4789 string userName = userExists ? getUserName(Pageview.User) : ""; 4790 int secondaryUsersCount = Model.SecondaryUsers.Count; 4791 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 4792 bool promptForAccount = getPromptForAccount(); 4793 4794 <div class="" style="min-height: 30px"> 4795 @if (userExists) 4796 { 4797 <div class="u-margin-bottom--lg u-margin-top--lg u-border-top u-border-bottom u-padding-top u-padding-bottom"> 4798 @if (secondaryUsersCount > 0) 4799 { 4800 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4801 { 4802 <div class="u-margin-right u-margin-bottom" data-prompt-account="@promptForAccount" >@userName</div> 4803 4804 if(secondaryUsersCount> 1 || promptForAccount) { 4805 @RenderImpersonationDropdownMobile(impersonationListFeedPageId) 4806 } 4807 } 4808 else 4809 { 4810 <div class="u-margin-bottom">@Translate("Choose user to impersonate:") </div> 4811 @RenderImpersonationDropdownMobile( impersonationListFeedPageId) 4812 } 4813 4814 4815 } 4816 4817 </div> 4818 if(!string.IsNullOrEmpty(customerNumber)) { 4819 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 4820 { 4821 <div>@Translate("currentLocation") <div class="location-space u-margin-bottom"></div> 4822 4823 @Render(new Button 4824 { 4825 ButtonType = ButtonType.Button, 4826 ButtonLayout = ButtonLayout.None, 4827 Title = Translate("Change Location"), 4828 CssClass = "u-no-margin btn btn--primary dw-mod", 4829 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true, document.querySelector('#MobileNavTrigger').checked = false" 4830 }) 4831 </div> 4832 } 4833 4834 } 4835 } 4836 4837 4838 </div> 4839 } 4840 4841 @helper RenderImpersonationDropdownMobile(string impersonationListFeedPageId) { 4842 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 4843 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 4844 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-test="test1"> 4845 <input type="hidden" name="DwExtranetRemoveSecondaryUser"> 4846 </form> 4847 <div class="impersonation-container"> 4848 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/> 4849 <div class="dropdown variants-filters dw-mod"> 4850 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 4851 <div class="dropdown__content u-padding dw-mod"> 4852 <div class="dropdown__item__filter"> 4853 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 4854 </div> 4855 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 4856 </div> 4857 </div> 4858 </div> 4859 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 4860 </div> 4861 4862 4863 }</text> 4864 } 4865 else 4866 { 4867 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4868 4869 @using System 4870 @using System.Web 4871 @using System.Collections.Generic 4872 @using Dynamicweb.Rapido.Blocks.Extensibility 4873 @using Dynamicweb.Rapido.Blocks 4874 4875 @functions { 4876 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4877 4878 } 4879 4880 @{ 4881 Block masterTools = new Block() 4882 { 4883 Id = "MasterDesktopTools", 4884 SortId = 10, 4885 Template = RenderDesktopTools(), 4886 SkipRenderBlocksList = true, 4887 BlocksList = new List<Block> 4888 { 4889 new Block 4890 { 4891 Id = "MasterDesktopToolsText", 4892 SortId = 10, 4893 Template = RenderDesktopToolsText(), 4894 Design = new Design 4895 { 4896 Size = "auto", 4897 HidePadding = true, 4898 RenderType = RenderType.Column 4899 } 4900 }, 4901 new Block 4902 { 4903 Id = "MasterDesktopToolsNavigation", 4904 SortId = 20, 4905 Template = RenderDesktopToolsNavigation(), 4906 Design = new Design 4907 { 4908 Size = "auto-width", 4909 HidePadding = true, 4910 RenderType = RenderType.Column 4911 } 4912 } 4913 } 4914 }; 4915 headerBlocksPage.Add("MasterHeader", masterTools); 4916 4917 Block masterDesktopExtra = new Block() 4918 { 4919 Id = "MasterDesktopExtra", 4920 SortId = 10, 4921 Template = RenderDesktopExtra(), 4922 SkipRenderBlocksList = true 4923 }; 4924 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4925 4926 Block masterDesktopNavigation = new Block() 4927 { 4928 Id = "MasterDesktopNavigation", 4929 SortId = 20, 4930 Template = RenderDesktopNavigation(), 4931 SkipRenderBlocksList = true 4932 }; 4933 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4934 4935 if (Model.CurrentUser.ID > 0) 4936 { 4937 Modal stopImpersonation = new Modal 4938 { 4939 Id = "StopImpersonation", 4940 Heading = new Heading 4941 { 4942 Level = 2, 4943 Title = Translate("Sign out"), 4944 Icon = new Icon 4945 { 4946 Name = "fa-sign-out", 4947 Prefix = "fas", 4948 LabelPosition = IconLabelPosition.After 4949 } 4950 }, 4951 Width = ModalWidth.Md, 4952 BodyTemplate = RenderStopImpersonationForm() 4953 }; 4954 4955 Block stopImpersonationBlock = new Block 4956 { 4957 Id = "StopImpersonationBlock", 4958 SortId = 10, 4959 Component = stopImpersonation 4960 }; 4961 headerBlocksPage.Add("MasterHeader", stopImpersonationBlock); 4962 } 4963 4964 } 4965 4966 @* Include the Blocks for the page *@ 4967 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4968 4969 @using System 4970 @using System.Web 4971 @using Dynamicweb.Rapido.Blocks.Extensibility 4972 @using Dynamicweb.Rapido.Blocks 4973 4974 @{ 4975 Block masterDesktopLogo = new Block 4976 { 4977 Id = "MasterDesktopLogo", 4978 SortId = 10, 4979 Template = RenderDesktopLogo(), 4980 Design = new Design 4981 { 4982 Size = "auto-width", 4983 HidePadding = true, 4984 RenderType = RenderType.Column, 4985 CssClass = "grid--align-self-center" 4986 } 4987 }; 4988 4989 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4990 } 4991 4992 4993 @helper RenderDesktopLogo() 4994 { 4995 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4996 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4997 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4998 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4999 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 5000 if (Path.GetExtension(logo).ToLower() != ".svg") 5001 { 5002 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 5003 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 5004 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 5005 } 5006 else 5007 { 5008 logo = HttpUtility.UrlDecode(logo); 5009 } 5010 5011 <div class="logo @alignClass dw-mod"> 5012 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 5013 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 5014 </a> 5015 </div> 5016 } 5017 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5018 5019 @using System 5020 @using System.Web 5021 @using Dynamicweb.Rapido.Blocks.Extensibility 5022 @using Dynamicweb.Rapido.Blocks 5023 5024 @functions { 5025 bool isMegaMenu; 5026 } 5027 5028 @{ 5029 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 5030 Block masterDesktopMenu = new Block 5031 { 5032 Id = "MasterDesktopMenu", 5033 SortId = 10, 5034 Template = RenderDesktopMenu(), 5035 Design = new Design 5036 { 5037 Size = "auto", 5038 HidePadding = true, 5039 RenderType = RenderType.Column 5040 } 5041 }; 5042 5043 if (isMegaMenu) 5044 { 5045 masterDesktopMenu.Design.CssClass = "u-reset-position"; 5046 } 5047 5048 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 5049 } 5050 5051 @helper RenderDesktopMenu() 5052 { 5053 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5054 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 5055 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 5056 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 5057 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5058 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 5059 int startLevel = renderPagesInToolBar ? 1 : 0; 5060 5061 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 5062 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 5063 5064 bool isSlapp = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Slapp", StringComparison.OrdinalIgnoreCase)).Value.ToString() == "True" : false; 5065 5066 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 5067 @if (!isMegaMenu) 5068 { 5069 if (isSlapp) 5070 { 5071 @RenderNavigation(new 5072 { 5073 id = "topnavigation", 5074 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5075 startLevel = startLevel, 5076 ecomStartLevel = startLevel + 1, 5077 endlevel = 5, 5078 expandmode = "all", 5079 template = "BaseMenuWithDropdown-nocategory.xslt" 5080 }); 5081 5082 } 5083 else 5084 { 5085 @RenderNavigation(new 5086 { 5087 id = "topnavigation", 5088 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5089 startLevel = startLevel, 5090 ecomStartLevel = startLevel + 1, 5091 endlevel = 5, 5092 expandmode = "all", 5093 template = "BaseMenuWithDropdown.xslt" 5094 }); 5095 } 5096 5097 } 5098 else 5099 { 5100 @RenderNavigation(new 5101 { 5102 id = "topnavigation", 5103 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5104 startLevel = startLevel, 5105 ecomStartLevel = startLevel + 1, 5106 endlevel = 5, 5107 promotionImage = megamenuPromotionImage, 5108 promotionLink = promotionLink, 5109 expandmode = "all", 5110 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 5111 template = "BaseMegaMenu.xslt" 5112 }); 5113 } 5114 </div> 5115 } 5116 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5117 5118 @using System 5119 @using System.Web 5120 @using Dynamicweb.Rapido.Blocks.Extensibility 5121 @using Dynamicweb.Rapido.Blocks 5122 5123 @{ 5124 Block masterDesktopActionsMenu = new Block 5125 { 5126 Id = "MasterDesktopActionsMenu", 5127 SortId = 10, 5128 Template = RenderDesktopActionsMenu(), 5129 Design = new Design 5130 { 5131 CssClass = "u-flex" 5132 }, 5133 SkipRenderBlocksList = true 5134 5135 }; 5136 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 5137 5138 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 5139 { 5140 Block masterDesktopActionsHeaderButton = new Block 5141 { 5142 Id = "MasterDesktopActionsHeaderButton", 5143 SortId = 60, 5144 Template = RenderHeaderButton() 5145 }; 5146 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 5147 } 5148 } 5149 5150 @helper RenderDesktopActionsMenu() 5151 { 5152 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 5153 5154 <ul class="menu u-flex dw-mod"> 5155 @RenderBlockList(subBlocks) 5156 </ul> 5157 } 5158 5159 @helper RenderHeaderButton() 5160 { 5161 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 5162 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 5163 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 5164 5165 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 5166 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a> 5167 </li> 5168 } 5169 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5170 5171 @using System 5172 @using System.Security.Cryptography 5173 @using System.Web 5174 @using Dynamicweb.Core; 5175 @using System.Text.RegularExpressions 5176 @using Dynamicweb.Rapido.Blocks.Extensibility 5177 @using Dynamicweb.Rapido.Blocks 5178 5179 @{ 5180 Block masterDesktopActionsMenuLanguageSelector = new Block 5181 { 5182 Id = "MasterDesktopActionsMenuLanguageSelector", 5183 SortId = 90, 5184 Template = RenderLanguageSelector() 5185 }; 5186 5187 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 5188 } 5189 5190 @helper RenderLanguageSelector() 5191 { 5192 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5193 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5194 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5195 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 5196 string currentLanguage = Pageview.Area.Culture.Replace("nb","").Replace("en","").ToLower(); 5197 string currentLangInfo = "<span class=\"flag-icon flag-icon" + currentLanguage + " u-margin-right\"></span>"; 5198 5199 5200 if (Model.Languages.Count > 1) 5201 { 5202 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 5203 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 5204 @currentLangInfo 5205 </div> 5206 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 5207 @foreach (var lang in Model.Languages) 5208 { 5209 string widthClass = "menu__item--fixed-width"; 5210 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower(); 5211 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 5212 string cultureName = Regex.Replace(Dynamicweb.Content.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 5213 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 5214 5215 5216 if (languageViewType == "flag-culture") 5217 { 5218 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 5219 } 5220 5221 if (languageViewType == "flag") 5222 { 5223 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 5224 widthClass = ""; 5225 } 5226 5227 if (languageViewType == "name") 5228 { 5229 langInfo = lang.Name; 5230 } 5231 5232 if (languageViewType == "culture") 5233 { 5234 langInfo = cultureName; 5235 widthClass = ""; 5236 } 5237 5238 <div class="menu__item dw-mod @widthClass"> 5239 <a href="/Default.aspx?AreaID=@Dynamicweb.Content.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a> 5240 </div> 5241 } 5242 </div> 5243 </li> 5244 } 5245 } 5246 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5247 5248 @using System 5249 @using System.Web 5250 @using Dynamicweb.Rapido.Blocks.Extensibility 5251 @using Dynamicweb.Rapido.Blocks 5252 5253 @{ 5254 Block masterDesktopActionsMenuSignIn = new Block 5255 { 5256 Id = "MasterDesktopActionsMenuSignIn", 5257 SortId = 20, 5258 Template = RenderSignIn() 5259 }; 5260 5261 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 5262 } 5263 5264 @helper RenderSignIn() 5265 { 5266 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 5267 string userInitials = ""; 5268 int pageId = Model.TopPage.ID; 5269 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 5270 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 5271 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 5272 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 5273 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5274 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 5275 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 5276 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 5277 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 5278 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 5279 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 5280 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 5281 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 5282 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 5283 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 5284 5285 string linkStart = "/Default.aspx?ID="; 5286 if (Model.CurrentUser.ID <= 0) 5287 { 5288 linkStart += signInProfilePageId + "&RedirectPageId="; 5289 } 5290 5291 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 5292 string myProfilePageLink = linkStart + myProfilePageId; 5293 string myOrdersPageLink = linkStart + myOrdersPageId; 5294 string myFavoritesPageLink = linkStart + myFavoritesPageId; 5295 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 5296 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 5297 5298 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 5299 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 5300 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5301 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 5302 5303 if (Model.CurrentUser.ID != 0) 5304 { 5305 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 5306 } 5307 5308 if (!navigationItemsHideSignIn) 5309 { 5310 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5311 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 5312 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5313 5314 5315 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass u-margin-right-header-menu is-dropdown--no-icon dw-mod"> 5316 <div class="@menuLinkClass dw-mod" > 5317 @if (Model.CurrentUser.ID <= 0) 5318 { 5319 <i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i> 5320 } 5321 else 5322 { 5323 <div class="user-menu u-flex"> 5324 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5325 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5326 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon) 5327 5328 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5329 { 5330 <div class="u-margin-right"> 5331 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></div> 5332 </div> 5333 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5334 { 5335 <div class="u-margin-right"> 5336 <a href="/" class="u-color-inherit" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></a> 5337 </div> 5338 } else { 5339 @RenderMenuIcon("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"), "far fa-sign-out-alt") 5340 } 5341 5342 </div> 5343 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 5344 } 5345 </div> 5346 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 5347 <ul class="list list--clean dw-mod"> 5348 @if (Model.CurrentUser.ID <= 0) 5349 { 5350 <li> 5351 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 5352 </li> 5353 5354 if (!hideCreateAccountLink) 5355 { 5356 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 5357 } 5358 if (!hideForgotPasswordLink) 5359 { 5360 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 5361 } 5362 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5363 { 5364 @RenderSeparator() 5365 } 5366 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true ) 5367 } 5368 else 5369 { 5370 if (!hideMyProfileLink) 5371 { 5372 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 5373 } 5374 if (!hideMyOrdersLink) 5375 { 5376 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5377 } 5378 if (!hideMyFavoritesLink) 5379 { 5380 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5381 } 5382 if (!hideMySavedCardsLink) 5383 { 5384 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 5385 } 5386 if (!hideMyOrderDraftsLink) 5387 { 5388 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 5389 } 5390 } 5391 5392 @if (Model.CurrentUser.ID > 0) 5393 { 5394 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5395 { 5396 @RenderSeparator() 5397 } 5398 5399 //Check if impersonation is on 5400 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5401 { 5402 <li> 5403 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 5404 @Translate("Sign out") 5405 </div> 5406 </li> 5407 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5408 { 5409 <li> 5410 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 5411 @Translate("Sign out") 5412 </a> 5413 </li> 5414 } else { 5415 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 5416 } 5417 } 5418 </ul> 5419 </div> 5420 </li> 5421 } 5422 } 5423 5424 @helper RenderListItem(string link, string text, string icon = null, bool target = false) { 5425 string targetBlank = target == true ? "target='_blank'" : ""; 5426 <li> 5427 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)" @targetBlank> 5428 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5429 </a> 5430 </li> 5431 } 5432 5433 @helper RenderSeparator() 5434 { 5435 <li class="list__seperator dw-mod"></li> 5436 } 5437 5438 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5439 5440 @using System 5441 @using System.Web 5442 @using Dynamicweb.Rapido.Blocks.Extensibility 5443 @using Dynamicweb.Rapido.Blocks 5444 5445 @{ 5446 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5447 5448 Block masterDesktopActionsMenuFavorites = new Block 5449 { 5450 Id = "MasterDesktopActionsMenuFavorites", 5451 SortId = 30, 5452 Template = RenderFavorites() 5453 }; 5454 5455 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5456 { 5457 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5458 } 5459 } 5460 5461 @helper RenderFavorites() 5462 { 5463 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5464 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5465 5466 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5467 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5468 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5469 5470 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5471 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5472 @* 5473 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5474 *@ 5475 <img src="/Files/Images/favorite-list-svg.svg"/> 5476 </a> 5477 </li> 5478 } 5479 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5480 @using Dynamicweb.Rapido.Blocks 5481 5482 @{ 5483 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5484 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5485 5486 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5487 { 5488 Block masterDesktopActionsMenuMiniCart = new Block 5489 { 5490 Id = "MasterDesktopActionsMenuMiniCart", 5491 SortId = 40, 5492 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5493 SkipRenderBlocksList = true, 5494 BlocksList = new List<Block>() 5495 }; 5496 5497 Block miniCartCounterScriptTemplate = new Block 5498 { 5499 Id = "MiniCartCounterScriptTemplate", 5500 Template = RenderMiniCartCounterContent() 5501 }; 5502 5503 //dropdown layout is default 5504 RazorEngine.Templating.TemplateWriter layoutTemplate; 5505 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5506 5507 switch (miniCartLayout) 5508 { 5509 case "dropdown": 5510 layoutTemplate = RenderMiniCartDropdownLayout(); 5511 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5512 break; 5513 case "panel": 5514 layoutTemplate = RenderMiniCartPanelLayout(); 5515 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5516 break; 5517 case "modal": 5518 layoutTemplate = RenderMiniCartModalLayout(); 5519 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5520 break; 5521 case "none": 5522 default: 5523 layoutTemplate = RenderNoLayoutMiniCart(); 5524 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5525 break; 5526 } 5527 5528 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5529 { 5530 Id = "MiniCartTrigger", 5531 SortId = 40, 5532 Template = miniCartTriggerTemplate 5533 }); 5534 5535 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5536 { 5537 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5538 { 5539 Id = "MiniCartLayout", 5540 SortId = 40, 5541 Template = layoutTemplate 5542 }); 5543 } 5544 5545 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5546 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5547 } 5548 5549 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5550 { 5551 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 5552 { 5553 Id = "CartInitialization", 5554 Template = RenderNoLayoutMiniCart() 5555 }); 5556 } 5557 5558 } 5559 5560 @helper RenderMiniCart(bool hasMouseEnterEvent) 5561 { 5562 @*List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5563 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5564 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5565 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5566 string mouseEvent = ""; 5567 string id = "MiniCart"; 5568 if (hasMouseEnterEvent) 5569 { 5570 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5571 id = "miniCartTrigger"; 5572 } 5573 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5574 @RenderBlockList(subBlocks) 5575 </li>*@ 5576 var checkoutPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5577 5578 <li style="display: flex; align-items: center; margin-top: 19px;"> 5579 <div id="cartMiniApp"></div> 5580 </li> 5581 5582 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 5583 var serverDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(new 5584 { 5585 //user data 5586 CountryCode = !string.IsNullOrWhiteSpace(user.CountryCode) ? user.CountryCode : "NO", 5587 CurrencyCode = !string.IsNullOrWhiteSpace(user.Currency) ? user.Currency : "NOK", 5588 UserId = user?.ID, 5589 CustomerNumber = user?.CustomerNumber, 5590 5591 ShowNumberOfCartons = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName.Trim() == "AccessUser_Number_of_Cartons").Value.ToString() == "True", 5592 SendShipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner")?.Value?.ToString() == "26300", 5593 SendOnlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse")?.Value?.ToString() == "True", 5594 5595 //site settings 5596 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 5597 Culture = Dynamicweb.Environment.ExecutingContext.GetCulture().Name, 5598 CartPageUrl = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPageV2"), 5599 CheckoutPageUrl = checkoutPageUrl, //yes, the checkout page is actually the same as old cart page 5600 MinicartAvailable = !HttpContext.Current.Request.Url.PathAndQuery.EndsWith(checkoutPageUrl) 5601 }); 5602 //this app is responsible for fetching all the user details required by all our vue.js apps to run 5603 <div id="currentUserApp" style="visibility: hidden" data-server='@serverDataJson'></div> 5604 5605 //this app is responsible for handling events sent from legacy JS components, like food calendar 5606 <div id="legacyEventHandler" style="visibility: hidden" ></div> 5607 } 5608 5609 @helper RenderNoLayoutMiniCart() 5610 { 5611 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5612 <script> 5613 window.cartId = "@miniCartFeedPageId"; 5614 </script> 5615 } 5616 5617 @helper RenderMiniCartTriggerLabel() 5618 { 5619 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5620 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5621 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5622 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5623 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5624 5625 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="location.href = document.querySelector('[data-cart-page-link]').getAttribute('data-cart-page-link')" title="@Translate("Cart")"> 5626 <div class="u-inline u-position-relative"> 5627 <img src="/Files/Images/cart-svg.svg" /> 5628 @RenderMiniCartCounter() 5629 </div> 5630 </div> 5631 } 5632 5633 @helper RenderMiniCartTriggerLink() 5634 { 5635 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5636 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5637 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5638 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5639 5640 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5641 <span class="u-inline u-position-relative"> 5642 <i class="@cartIcon fa-1_5x"></i> 5643 @RenderMiniCartCounter() 5644 </span> 5645 </a> 5646 } 5647 5648 @helper RenderMiniCartCounter() 5649 { 5650 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5651 string cartProductsCount = Model.Cart.OrderlinesCount.ToString(); 5652 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5653 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5654 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5655 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5656 5657 if (showPrice && counterPosition == "right") 5658 { 5659 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5660 } 5661 5662 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5663 <span class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 5664 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.OrderlinesCount.ToString()"> 5665 @cartProductsCount @cartProductsTotalPrice 5666 </span> 5667 </span> 5668 </span> 5669 } 5670 5671 @helper RenderMiniCartCounterContent() 5672 { 5673 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5674 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5675 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5676 5677 <script id="MiniCartCounterContent" type="text/x-template"> 5678 {{#.}} 5679 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}"> 5680 @if (showPriceInMiniCartCounter) 5681 { 5682 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5683 } 5684 else 5685 { 5686 <text>{{numberoforderlines}}</text> 5687 } 5688 </span> 5689 {{/.}} 5690 </script> 5691 } 5692 5693 @helper RenderMiniCartDropdownLayout() 5694 { 5695 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5696 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5697 5698 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink"> 5699 <div class="mini-cart-dropdown__inner dw-mod"> 5700 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5701 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5702 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5703 </div> 5704 </div> 5705 </div> 5706 } 5707 5708 @helper RenderMiniCartPanelLayout() 5709 { 5710 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5711 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart"); 5712 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 5713 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5714 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 5715 var hideOnCartPageClass = GetPageIdByNavigationTag("CartPage") == Model.ID ? "u-hidden" : ""; 5716 var preventLoadOnProductList = GetPageIdByNavigationTag("ProductsPage") == Model.ID ? "data-init-onload=\"false\"" : ""; 5717 5718 <div class="mini-cart grid__cell dw-mod"> 5719 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5720 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-add-to-cart-id="@WebAPIAddToCartPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5721 <label for="miniCartTrigger" class="panel__close-btn u-hidden" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5722 <div class="panel__content u-full-width dw-mod"> 5723 <div class="panel_toggle_button @hideOnCartPageClass"> 5724 <button class="toggle-minicart btn btn--primary dw-mod" onclick="toggleMinicart(this)"> 5725 <i class="fas fa-arrow-alt-circle-left"></i> 5726 </button> 5727 </div> 5728 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart list")</h3> 5729 <div class=""> 5730 <div class="u-full-width dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 5731 <div class="dw-mod"> 5732 @Render(new Button 5733 { 5734 Title = Translate("Change Cart Name"), 5735 ButtonType = ButtonType.Button, 5736 ButtonLayout = ButtonLayout.None, 5737 CssClass = "u-margin-bottom change-cart-name", 5738 OnClick = "changeCartName()" 5739 }) 5740 @Render(new Button 5741 { 5742 Title = Translate("Create New Cart"), 5743 ButtonType = ButtonType.Button, 5744 ButtonLayout = ButtonLayout.Primary, 5745 CssClass = "u-full-width", 5746 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 5747 }) 5748 </div> 5749 </div> 5750 <div class="panel__content-body panel__content-body--cart dw-mod"> 5751 <div class="minicart-preloader-overlay" id="MiniCartOverlay"><div class="preloader-overlay__icon dw-mod" style="top: 0px;"></div></div> 5752 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" @preventLoadOnProductList></div> 5753 </div> 5754 </div> 5755 </div> 5756 </div> 5757 } 5758 5759 @helper RenderMiniCartModalLayout() 5760 { 5761 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5762 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5763 5764 <div class="mini-cart grid__cell dw-mod"> 5765 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5766 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5767 <label for="miniCartTrigger" class="modal-overlay"></label> 5768 <div class="modal modal--md modal--top-right dw-mod"> 5769 <div class="modal__body u-flex grid--direction-column dw-mod"> 5770 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5771 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5772 </div> 5773 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5774 </div> 5775 </div> 5776 </div> 5777 } 5778 5779 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5780 5781 @using System 5782 @using System.Web 5783 @using Dynamicweb.Rapido.Blocks.Extensibility 5784 @using Dynamicweb.Rapido.Blocks 5785 5786 @{ 5787 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5788 5789 Block masterDesktopActionsMenuOrderDraft = new Block 5790 { 5791 Id = "MasterDesktopActionsMenuOrderDraft", 5792 SortId = 40, 5793 Template = RenderOrderDraft() 5794 }; 5795 5796 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5797 { 5798 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5799 } 5800 } 5801 5802 @helper RenderOrderDraft() 5803 { 5804 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5805 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5806 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5807 5808 5809 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5810 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5811 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5812 5813 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5814 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5815 <span class="u-inline u-position-relative"> 5816 <i class="@draftIcon fa-1_5x"></i> 5817 </span> 5818 </a> 5819 </li> 5820 } 5821 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5822 5823 @using System 5824 @using System.Web 5825 @using Dynamicweb.Rapido.Blocks.Extensibility 5826 @using Dynamicweb.Rapido.Blocks 5827 5828 @{ 5829 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5830 5831 Block masterDesktopActionsMenuDownloadCart = new Block 5832 { 5833 Id = "MasterDesktopActionsMenuDownloadCart", 5834 SortId = 50, 5835 Template = RenderDownloadCart() 5836 }; 5837 5838 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5839 { 5840 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5841 } 5842 } 5843 5844 @helper RenderDownloadCart() 5845 { 5846 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5847 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5848 5849 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5850 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5851 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5852 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5853 5854 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5855 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5856 <span class="u-inline u-position-relative"> 5857 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5858 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5859 </span> 5860 </a> 5861 </li> 5862 } 5863 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5864 5865 @using System 5866 @using System.Web 5867 @using Dynamicweb.Rapido.Blocks.Extensibility 5868 @using Dynamicweb.Rapido.Blocks 5869 5870 @functions { 5871 public class SearchConfiguration 5872 { 5873 public string searchFeedId { get; set; } 5874 public string searchSecondFeedId { get; set; } 5875 public int groupsFeedId { get; set; } 5876 public string resultPageLink { get; set; } 5877 public string searchPlaceholder { get; set; } 5878 public string searchType { get; set; } 5879 public string searchTemplate { get; set; } 5880 public string searchContentTemplate { get; set; } 5881 public string searchValue { get; set; } 5882 public bool showGroups { get; set; } 5883 5884 public SearchConfiguration() 5885 { 5886 searchFeedId = ""; 5887 searchSecondFeedId = ""; 5888 searchType = "product-search"; 5889 searchContentTemplate = ""; 5890 showGroups = true; 5891 } 5892 } 5893 } 5894 @{ 5895 Block masterSearchBar = new Block 5896 { 5897 Id = "MasterSearchBar", 5898 SortId = 40, 5899 Template = RenderSearch("bar"), 5900 Design = new Design 5901 { 5902 Size = "auto", 5903 HidePadding = true, 5904 RenderType = RenderType.Column 5905 } 5906 }; 5907 5908 Block masterSearchAction = new Block 5909 { 5910 Id = "MasterDesktopActionsMenuSearch", 5911 SortId = 10, 5912 Template = RenderSearch() 5913 }; 5914 5915 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5916 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5917 } 5918 5919 @helper RenderSearch(string type = "mini-search") 5920 { 5921 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5922 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 5923 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5924 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5925 5926 SearchConfiguration searchConfiguration = null; 5927 5928 switch (searchType) { 5929 case "contentSearch": 5930 searchConfiguration = new SearchConfiguration() { 5931 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5932 resultPageLink = contentSearchPageLink, 5933 searchPlaceholder = Translate("Search page"), 5934 groupsFeedId = 0, 5935 searchType = "content-search", 5936 searchTemplate = "SearchPagesTemplate", 5937 showGroups = false 5938 }; 5939 break; 5940 case "combinedSearch": 5941 searchConfiguration = new SearchConfiguration() { 5942 searchFeedId = productsPageId + "&feed=true", 5943 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5944 resultPageLink = Converter.ToString(productsPageId), 5945 searchPlaceholder = Translate("Search products or pages"), 5946 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5947 searchType = "combined-search", 5948 searchTemplate = "SearchProductsTemplateWrap", 5949 searchContentTemplate = "SearchPagesTemplateWrap", 5950 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5951 }; 5952 break; 5953 default: //productSearch 5954 searchConfiguration = new SearchConfiguration() { 5955 resultPageLink = Converter.ToString(productsPageId), 5956 searchFeedId = searchPageId + "&feed=true", 5957 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5958 searchPlaceholder = Translate("Search products"), 5959 searchTemplate = "SearchProductsTemplate", 5960 searchType = "product-search", 5961 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5962 }; 5963 break; 5964 } 5965 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5966 5967 if (type == "mini-search") { 5968 @RenderMiniSearch(searchConfiguration) 5969 } else { 5970 @RenderSearchBar(searchConfiguration) 5971 } 5972 } 5973 5974 @helper RenderSearchBar(SearchConfiguration options) 5975 { 5976 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5977 data-page-size="7" 5978 data-search-feed-id="@options.searchFeedId" 5979 data-search-second-feed-id="@options.searchSecondFeedId" 5980 data-result-page-id="@options.resultPageLink" 5981 data-groups-page-id="@options.groupsFeedId" 5982 data-search-type="@options.searchType"> 5983 @if (options.showGroups) 5984 { 5985 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button> 5986 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul> 5987 } 5988 <div class="typeahead-search-field"> 5989 <input type="text" class="u-no-margin u-full-width search-ahead__input js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5990 @* 5991 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"><i class="fas fa-times"></i></button> 5992 *@ 5993 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5994 { 5995 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 5996 } 5997 else 5998 { 5999 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 6000 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div> 6001 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div> 6002 </div> 6003 } 6004 </div> 6005 <button type="button" class="search-icon-desktop js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 6006 </div> 6007 } 6008 6009 @helper RenderMiniSearch(SearchConfiguration options) 6010 { 6011 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6012 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 6013 6014 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon"> 6015 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 6016 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 6017 </div> 6018 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 6019 <div class="typeahead js-typeahead" id="ProductSearchBar" 6020 data-page-size="7" 6021 data-search-feed-id="@options.searchFeedId" 6022 data-search-second-feed-id="@options.searchSecondFeedId" 6023 data-result-page-id="@options.resultPageLink" 6024 data-search-type="@options.searchType"> 6025 <div class="typeahead-search-field"> 6026 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 6027 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 6028 { 6029 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 6030 } 6031 else 6032 { 6033 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 6034 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></div> 6035 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div> 6036 </div> 6037 } 6038 </div> 6039 </div> 6040 </div> 6041 </li> 6042 } 6043 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6044 6045 @using System 6046 @using System.Web 6047 @using Dynamicweb.Rapido.Blocks.Extensibility 6048 @using Dynamicweb.Rapido.Blocks 6049 6050 @{ 6051 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6052 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 6053 6054 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 6055 6056 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 6057 headerConfigurationPage.RemoveBlock(configDesktopLogo); 6058 6059 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 6060 headerConfigurationPage.RemoveBlock(configDesktopMenu); 6061 6062 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 6063 headerConfigurationPage.RemoveBlock(configSearchBar); 6064 6065 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 6066 headerConfigurationPage.RemoveBlock(configSearchAction); 6067 6068 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 6069 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 6070 6071 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 6072 6073 switch (headerConfigurationTopLayout) 6074 { 6075 case "condensed": //2 6076 configDesktopLogo.Design.Size = "auto-width"; 6077 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6078 6079 configDesktopMenu.SortId = 20; 6080 configDesktopMenu.Design.Size = "auto"; 6081 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6082 6083 configDesktopActionsMenu.SortId = 30; 6084 configDesktopActionsMenu.Design.Size = "auto-width"; 6085 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6086 6087 if (!headerConfigurationHideSearch) 6088 { 6089 configSearchBar.SortId = 40; 6090 configSearchBar.Design.Size = "12"; 6091 configDesktopExtra.SortId = 50; 6092 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6093 } 6094 break; 6095 case "splitted": //3 6096 configDesktopLogo.Design.Size = "auto"; 6097 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6098 6099 if (!headerConfigurationHideSearch) 6100 { 6101 configSearchBar.SortId = 20; 6102 configSearchBar.Design.Size = "auto"; 6103 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6104 } 6105 6106 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6107 6108 configDesktopActionsMenu.SortId = 20; 6109 configDesktopActionsMenu.Design.Size = "auto-width"; 6110 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6111 break; 6112 case "splitted-center": //4 6113 configDesktopLogo.Design.Size = "auto"; 6114 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6115 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6116 6117 configDesktopActionsMenu.SortId = 30; 6118 configDesktopActionsMenu.Design.Size = "auto-width"; 6119 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6120 6121 if (!headerConfigurationHideSearch) 6122 { 6123 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6124 } 6125 break; 6126 case "minimal": //5 6127 configDesktopLogo.Design.Size = "auto-width"; 6128 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6129 6130 configDesktopMenu.Design.Size = "auto"; 6131 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6132 6133 configDesktopActionsMenu.SortId = 20; 6134 configDesktopActionsMenu.Design.Size = "auto-width"; 6135 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6136 6137 if (!headerConfigurationHideSearch) 6138 { 6139 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6140 } 6141 break; 6142 case "minimal-center": //6 6143 configDesktopLogo.Design.Size = "auto-width"; 6144 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6145 6146 configDesktopMenu.Design.Size = "auto"; 6147 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6148 6149 configDesktopActionsMenu.SortId = 20; 6150 configDesktopActionsMenu.Design.Size = "auto-width"; 6151 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6152 6153 if (!headerConfigurationHideSearch) 6154 { 6155 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6156 } 6157 break; 6158 case "minimal-right": //7 6159 configDesktopLogo.Design.Size = "auto-width"; 6160 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6161 6162 configDesktopMenu.Design.Size = "auto"; 6163 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6164 6165 configDesktopActionsMenu.SortId = 20; 6166 configDesktopActionsMenu.Design.Size = "auto-width"; 6167 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6168 6169 if (!headerConfigurationHideSearch) 6170 { 6171 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6172 } 6173 break; 6174 case "two-lines": //8 6175 configDesktopLogo.Design.Size = "auto"; 6176 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6177 6178 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6179 6180 configDesktopActionsMenu.SortId = 20; 6181 configDesktopActionsMenu.Design.Size = "auto-width"; 6182 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6183 6184 if (!headerConfigurationHideSearch) 6185 { 6186 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6187 } 6188 break; 6189 case "two-lines-centered": //9 6190 configDesktopLogo.Design.Size = "auto"; 6191 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6192 6193 configDesktopMenu.Design.Size = "auto-width"; 6194 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6195 6196 configDesktopActionsMenu.SortId = 20; 6197 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6198 6199 if (!headerConfigurationHideSearch) 6200 { 6201 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6202 } 6203 break; 6204 case "normal": //1 6205 default: 6206 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6207 6208 if (!headerConfigurationHideSearch) 6209 { 6210 configSearchBar.SortId = 20; 6211 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6212 } 6213 6214 configDesktopActionsMenu.SortId = 30; 6215 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6216 6217 configDesktopActionsMenu.Design.Size = "auto-width"; 6218 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6219 break; 6220 } 6221 } 6222 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6223 6224 @using System 6225 @using System.Web 6226 @using Dynamicweb.Rapido.Blocks.Extensibility 6227 @using Dynamicweb.Rapido.Blocks 6228 6229 @{ 6230 Block masterCustomDesktopActionsMenuSignIn = new Block 6231 { 6232 Id = "MasterDesktopActionsMenuSignIn", 6233 SortId = 20, 6234 Template = RenderCustomSignIn() 6235 }; 6236 6237 BlocksPage.GetBlockPage("Master").ReplaceBlock(masterCustomDesktopActionsMenuSignIn); 6238 } 6239 6240 @helper RenderCustomSignIn() 6241 { 6242 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 6243 string userInitials = ""; 6244 int pageId = GetPageIdByNavigationTag("SignInPage"); 6245 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 6246 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 6247 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 6248 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 6249 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 6250 int myDeviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 6251 int myDeviationsAdminPageId = GetPageIdByNavigationTag("DeviationsAdminHistoryPage"); 6252 //int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 6253 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 6254 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 6255 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 6256 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 6257 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 6258 int recipeBankPageId = GetPageIdByNavigationTag("MenuView"); 6259 int menuCalendarPageId = GetPageIdByNavigationTag("MenuCalendarView"); 6260 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 6261 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 6262 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 6263 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 6264 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 6265 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 6266 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 6267 6268 string linkStart = "/Default.aspx?ID="; 6269 if (Model.CurrentUser.ID <= 0) 6270 { 6271 linkStart += signInProfilePageId + "&RedirectPageId="; 6272 } 6273 6274 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 6275 string myProfilePageLink = linkStart + myProfilePageId; 6276 string myOrdersPageLink = linkStart + myOrdersPageId; 6277 string announcementPageLink = linkStart + announcementPageId; 6278 string myDeviationsPageLink = linkStart + myDeviationsPageId; 6279 string myReportsPageLink = linkStart + myReportsPageId; 6280 string myDeviationsAdminPageLink = linkStart + myDeviationsAdminPageId; 6281 string myFavoritesPageLink = linkStart + myFavoritesPageId + "&loadLists=true"; 6282 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 6283 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 6284 string recipeBankPageLink = linkStart + recipeBankPageId; 6285 string menuCalendarPageLink = linkStart + menuCalendarPageId; 6286 6287 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 6288 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "far fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 6289 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 6290 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 6291 6292 if (Model.CurrentUser.ID != 0) 6293 { 6294 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 6295 } 6296 6297 if (!navigationItemsHideSignIn) 6298 { 6299 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6300 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 6301 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 6302 bool promptForAccount = getPromptForAccount(); 6303 string createPageId = GetPageIdByNavigationTag("CreateAccount").ToString(); 6304 string createPageUrl = "/Default.aspx?Id=" + createPageId; 6305 bool isUserAnonymous = string.IsNullOrWhiteSpace(Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser()?.UserName.ToString()); 6306 var user = Pageview.User; 6307 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 6308 var userCompany = Model.CurrentUser.Company; 6309 bool isRmaAdmin = userCompany != null && userCompany.ToLower() == "kraemer"; 6310 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 6311 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 6312 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 6313 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 6314 6315 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 6316 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 6317 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 6318 6319 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6320 <div class="@menuLinkClass dw-mod"> 6321 @if (Model.CurrentUser.ID <= 0) 6322 { 6323 @*<i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>*@ 6324 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 6325 } 6326 else 6327 { 6328 <div class="user-menu u-flex headerIcons" data-user-type-food-calendar="@isFoodCalendarAdmin"> 6329 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon, "/Files/Images/favorite-list-svg.svg") 6330 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list", "/Files/Images/order-history-svg.svg") 6331 @if (hasAccessToAnnouncements) 6332 { 6333 @* 6334 @RenderMenuIcon(announcementPageLink, Translate("Announcements"), "fas fa-list", "/Files/Images/notifications.svg") 6335 *@ 6336 <div class="u-margin-right--lg"> 6337 <a href="@announcementPageLink" class="u-brand-color-two bs-position-relative" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 6338 <img src="/Files/Images/notifications.svg"> 6339 <svg class="announcement_notification-dot bs-position-absolute bs-bottom-0 bs-end-0 @announcementNotificationDotClass" style="top: 45%;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 6340 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30"/> 6341 </svg> 6342 </a> 6343 </div> 6344 } 6345 @if (hasAccessToFoodCalendar) 6346 { 6347 @RenderMenuIcon(recipeBankPageLink, Translate("Matretter"), "fas fa-list", "/Files/Images/food-calendar.svg") 6348 } 6349 @if (isFoodCalendarAdmin) 6350 { 6351 @RenderMenuIcon(menuCalendarPageLink, Translate("Kalendervisning"), "fas fa-list", "/Files/Images/food-calendar-menu-calendar.svg") 6352 } 6353 6354 @if (isRmaAdmin) 6355 { 6356 @RenderMenuIcon(myDeviationsAdminPageLink, Translate("Admin RMA"), "fas fa-list", "/Files/Images/unionRMA-Admin-icon.svg") 6357 } 6358 else 6359 { 6360 @RenderMenuIcon(myDeviationsPageLink, Translate("My Deviations"), "fas fa-list", "/Files/Images/UnionRMA-icon.svg") 6361 } 6362 @if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 6363 { 6364 @RenderMenuIcon(myReportsPageLink, Translate("My report"), "fas fa-list", "/Files/Images/IconPowerBi.svg") 6365 } 6366 6367 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon, "/Files/Images/my-account-svg.svg") 6368 6369 @*@if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6370 { 6371 <div class="u-margin-right"> 6372 <a href="/" class="u-color-inherit" testc onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"> 6373 <img src="/Files/Images/log-out-svg.svg"/> 6374 </a> 6375 </div> 6376 } 6377 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6378 { 6379 6380 <div class="u-margin-right"> 6381 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"> 6382 <img src="/Files/Images/log-out-svg.svg"/> 6383 </div> 6384 </div> 6385 6386 } 6387 else 6388 {*@ 6389 <div class="u-margin-right--lg" testd> 6390 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="logOutPrimaryUser(event, this);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')" class="u-brand-color-two" title="@Translate("Sign out")"> 6391 <img src="/Files/Images/log-out-svg.svg" alt="sign out"> 6392 </a> 6393 </div> 6394 @*}*@ 6395 6396 </div> 6397 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 6398 } 6399 </div> 6400 <div class="menu menu--dropdown menu--dropdown-right menu--dropdown-right--custom menu--sign-in grid__cell dw-mod"> 6401 <ul class="list list--clean dw-mod"> 6402 @if (Model.CurrentUser.ID <= 0) 6403 { 6404 if (!hideCreateAccountLink) 6405 { 6406 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")) 6407 ; 6408 } 6409 if (!hideForgotPasswordLink) 6410 { 6411 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 6412 } 6413 @*if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6414 { 6415 @RenderSeparator() 6416 }*@ 6417 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true) 6418 } 6419 else 6420 { 6421 if (!hideMyProfileLink) 6422 { 6423 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 6424 } 6425 if (!hideMyOrdersLink) 6426 { 6427 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 6428 } 6429 if (!hideMyFavoritesLink) 6430 { 6431 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 6432 } 6433 if (!hideMySavedCardsLink) 6434 { 6435 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 6436 } 6437 if (!hideMyOrderDraftsLink) 6438 { 6439 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 6440 } 6441 } 6442 6443 @if (Model.CurrentUser.ID > 0) 6444 { 6445 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6446 { 6447 @RenderSeparator() 6448 } 6449 6450 //Check if impersonation is on 6451 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6452 { 6453 <li> 6454 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 6455 @Translate("Sign out") 6456 </div> 6457 </li> 6458 } 6459 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6460 { 6461 <li> 6462 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 6463 @Translate("Sign out") 6464 </a> 6465 </li> 6466 } 6467 else 6468 { 6469 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 6470 } 6471 } 6472 </ul> 6473 </div> 6474 </li> 6475 if (isUserAnonymous) 6476 { 6477 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6478 <a class="btn btn--primary btn--full u-no-margin create-account__button" href="@createPageUrl">@Translate("Bli kunde")</a> 6479 </li> 6480 } 6481 } 6482 } 6483 6484 @helper RenderMenuIcon(string link, string title, string icon = null, string iconSource = null) 6485 { 6486 <div class="u-margin-right--lg"> 6487 <a href="@link" class="u-brand-color-two" title="@title"> 6488 <img src="@iconSource"> 6489 </a> 6490 </div> 6491 } 6492 6493 6494 6495 6496 @helper RenderDesktopTools() 6497 { 6498 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 6499 6500 <div class="tools-navigation dw-mod"> 6501 <div class="center-container grid top-container__center-container dw-mod"> 6502 @RenderBlockList(subBlocks) 6503 </div> 6504 </div> 6505 } 6506 6507 @helper RenderDesktopToolsText() 6508 { 6509 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 6510 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 6511 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 6512 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 6513 string userName = userExists ? getUserName(Pageview.User) : ""; 6514 int secondaryUsersCount = Model.SecondaryUsers.Count; 6515 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 6516 bool promptForAccount = getPromptForAccount(); 6517 <div class="u-flex u-flex--align-center u-justify-between" style="min-height: 30px"> 6518 @if (userExists) 6519 { 6520 <div class="u-margin-top u-margin-bottom u-flex u-flex--align-center"> 6521 @if (secondaryUsersCount > 0) 6522 { 6523 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6524 { 6525 <div class="u-margin-right" data-prompt-account="@promptForAccount">@userName</div> 6526 @*if (secondaryUsersCount > 1) { 6527 @Render(new Button 6528 { 6529 ButtonType = ButtonType.Button, 6530 ButtonLayout = ButtonLayout.LinkClean, 6531 Title = Translate("Bytt konto"), 6532 Icon = new Icon { 6533 Name = "fa-sign-out", 6534 Prefix = "fal", 6535 LabelPosition = IconLabelPosition.Before 6536 }, 6537 OnClick = "renderImpersonationList(true)", 6538 CssClass = "u-no-margin" 6539 }) 6540 }*@ 6541 // if (secondaryUsersCount > 1) 6542 // { 6543 @RenderImpersonationDropdown(impersonationListFeedPageId) 6544 // } 6545 } 6546 else 6547 { 6548 <div class="u-margin-right" style="text-transform: uppercase"><span>@Model.CurrentUser.Name</span></div> 6549 @RenderImpersonationDropdown(impersonationListFeedPageId) 6550 } 6551 } 6552 6553 </div> 6554 if (!string.IsNullOrEmpty(customerNumber)) 6555 { 6556 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 6557 { 6558 <div> 6559 @Translate("currentLocation") <span class="location-space"></span> 6560 @Render(new Button 6561 { 6562 ButtonType = ButtonType.Button, 6563 ButtonLayout = ButtonLayout.None, 6564 Title = Translate("Change Location"), 6565 CssClass = "u-no-margin", 6566 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true" 6567 }) 6568 </div> 6569 } 6570 } 6571 } 6572 6573 6574 </div> 6575 } 6576 6577 @helper RenderImpersonationDropdown(string impersonationListFeedPageId) 6578 { 6579 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 6580 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 6581 var hideSelfOption = ReturnCustomFieldValue("AccessUser_HideSelf"); 6582 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-primary-user="@Model.CurrentUser.Name" data-secondary-user="@Model.CurrentSecondaryUser.Name"> 6583 <input type="hidden" name="DwExtranetRemoveSecondaryUser"/> 6584 </form> 6585 6586 <div class="impersonation-container"> 6587 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/> 6588 <div class="dropdown variants-filters dw-mod"> 6589 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 6590 <div class="dropdown__content u-padding dw-mod"> 6591 <div class="dropdown__item__filter"> 6592 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 6593 </div> 6594 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 6595 </div> 6596 </div> 6597 </div> 6598 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 6599 </div> 6600 6601 6602 6603 } 6604 6605 @helper RenderDesktopToolsNavigation() 6606 { 6607 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 6608 6609 if (renderPagesInToolBar) 6610 { 6611 @RenderNavigation(new 6612 { 6613 id = "topToolsNavigation", 6614 cssclass = "menu menu-tools dw-mod dwnavigation", 6615 template = "TopMenu.xslt" 6616 }) 6617 } 6618 } 6619 6620 @helper RenderDesktopNavigation() 6621 { 6622 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 6623 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6624 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 6625 <nav class="main-navigation dw-mod"> 6626 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 6627 @RenderBlockList(subBlocks) 6628 </div> 6629 </nav> 6630 } 6631 6632 @helper RenderDesktopExtra() 6633 { 6634 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 6635 6636 if (subBlocks.Count > 0) 6637 { 6638 <div class="header header-top dw-mod"> 6639 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 6640 @RenderBlockList(subBlocks) 6641 </div> 6642 </div> 6643 } 6644 }</text> 6645 } 6646 6647 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6648 6649 @using System 6650 @using System.Web 6651 @using Dynamicweb.Rapido.Blocks.Extensibility 6652 @using Dynamicweb.Rapido.Blocks 6653 @using Dynamicweb.Rapido.Blocks.Components.General 6654 @using Dynamicweb.Frontend 6655 6656 @functions { 6657 int impersonationPageId; 6658 string impersonationLayout; 6659 int impersonationFeed; 6660 Block impersonationBar; 6661 6662 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 6663 { 6664 string username = ""; 6665 6666 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 6667 { 6668 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 6669 } 6670 else if (!string.IsNullOrEmpty(name)) 6671 { 6672 username = name; 6673 } 6674 else if (!string.IsNullOrEmpty(email)) 6675 { 6676 username = email; 6677 } 6678 else 6679 { 6680 username = userName; 6681 } 6682 return username; 6683 } 6684 6685 string getUserName(UserViewModel user) 6686 { 6687 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6688 } 6689 6690 string getUserName(Dynamicweb.Security.UserManagement.User user) 6691 { 6692 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6693 } 6694 } 6695 6696 @{ 6697 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 6698 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 6699 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 6700 6701 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0 && 2==1) 6702 { 6703 impersonationBar = new Block 6704 { 6705 Id = "ImpersonationBar", 6706 SortId = 50, 6707 Template = RenderImpersonation(), 6708 SkipRenderBlocksList = true, 6709 Design = new Design 6710 { 6711 Size = "auto-width", 6712 HidePadding = true, 6713 RenderType = RenderType.Column 6714 } 6715 }; 6716 6717 if (impersonationLayout == "top-bar") { 6718 impersonationBar.SortId = 9; 6719 } 6720 6721 Block impersonationContent = new Block 6722 { 6723 Id = "ImpersonationContent", 6724 SortId = 20 6725 }; 6726 6727 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6728 { 6729 //Render stop impersonation view 6730 impersonationContent.Template = RenderStopImpersonationView(); 6731 6732 6733 Modal stopImpersonation = new Modal 6734 { 6735 Id = "StopImpersonation", 6736 Heading = new Heading { 6737 Level = 2, 6738 Title = Translate("Sign out"), 6739 Icon = new Icon { 6740 Name = "fa-sign-out", 6741 Prefix = "fas", 6742 LabelPosition = IconLabelPosition.After 6743 } 6744 }, 6745 Width = ModalWidth.Sm, 6746 BodyTemplate = RenderStopImpersonationForm() 6747 }; 6748 6749 Block stopImpersonationBlock = new Block 6750 { 6751 Id = "StopImpersonationBlock", 6752 SortId = 10, 6753 Component = stopImpersonation 6754 }; 6755 impersonationBar.BlocksList.Add(stopImpersonationBlock); 6756 } 6757 else 6758 { 6759 //Render main view 6760 switch (impersonationLayout) 6761 { 6762 case "right-lower-box": 6763 impersonationContent.BlocksList.Add( 6764 new Block { 6765 Id = "RightLowerBoxHeader", 6766 SortId = 10, 6767 Component = new Heading { 6768 Level = 5, 6769 Title = Translate("View the list of users you can sign in as"), 6770 CssClass = "impersonation-text" 6771 } 6772 } 6773 ); 6774 impersonationContent.BlocksList.Add( 6775 new Block { 6776 Id = "RightLowerBoxContent", 6777 SortId = 20, 6778 Template = RenderImpersonationControls() 6779 } 6780 ); 6781 break; 6782 case "right-lower-bar": 6783 impersonationContent.BlocksList.Add( 6784 new Block { 6785 Id = "RightLowerBarContent", 6786 SortId = 10, 6787 Template = RenderImpersonationControls() 6788 } 6789 ); 6790 break; 6791 case "bar": 6792 default: 6793 impersonationContent.BlocksList.Add( 6794 new Block { 6795 Id = "ViewListLink", 6796 SortId = 20, 6797 Template = RenderViewListLink() 6798 } 6799 ); 6800 impersonationContent.BlocksList.Add( 6801 new Block { 6802 Id = "BarTypeaheadSearch", 6803 SortId = 30, 6804 Template = RenderTypeaheadSearch() 6805 } 6806 ); 6807 break; 6808 } 6809 } 6810 impersonationBar.BlocksList.Add(impersonationContent); 6811 6812 impersonationBar.BlocksList.Add( 6813 new Block 6814 { 6815 Id = "ImpersonationSearchTemplates", 6816 SortId = 30, 6817 Template = RenderSearchResultTemplate() 6818 } 6819 ); 6820 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 6821 { 6822 impersonationBar.BlocksList.Add( 6823 new Block 6824 { 6825 Id = "ImpersonationSearchScripts", 6826 SortId = 40, 6827 Template = RenderSearchScripts() 6828 } 6829 ); 6830 } 6831 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6832 } 6833 } 6834 6835 @helper RenderImpersonation() 6836 { 6837 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6838 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6839 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6840 @if (impersonationLayout == "right-lower-box") 6841 { 6842 @RenderRightLowerBoxHeader() 6843 } 6844 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6845 @*Impersonation*@ 6846 @RenderBlockList(subBlocks) 6847 </div> 6848 </div> 6849 } 6850 6851 @helper RenderRightLowerBoxHeader() 6852 { 6853 <div class="impersonation__header dw-mod"> 6854 <div class="impersonation__title">@Translate("Impersonation")</div> 6855 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6856 @Render(new Icon 6857 { 6858 Prefix = "fas", 6859 Name = "fa-window-minimize" 6860 }) 6861 </label> 6862 </div> 6863 } 6864 6865 @helper RenderStopImpersonationView() 6866 { 6867 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6868 string userName = getUserName(Pageview.User); 6869 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> "; 6870 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText; 6871 6872 if (impersonationLayout == "right-lower-box") 6873 { 6874 <div class="u-margin-bottom--lg u-ta-center"> 6875 @impersonationText 6876 </div> 6877 <div class="u-margin-bottom--lg u-ta-center"> 6878 @RenderSwitchAccountButton() 6879 </div> 6880 @RenderStopImpersonationButton() 6881 } 6882 else 6883 { 6884 <div class="grid grid--align-center impersonation__stop-wrap"> 6885 <div class="impersonation-bar-item dw-mod"> 6886 @impersonationText 6887 </div> 6888 <div class="impersonation-bar-item dw-mod"> 6889 @RenderSwitchAccountButton() 6890 </div> 6891 <div class="impersonation-bar-item dw-mod"> 6892 @RenderStopImpersonationButton() 6893 </div> 6894 </div> 6895 } 6896 } 6897 6898 @helper RenderSwitchAccountButton() { 6899 @Render(new Button 6900 { 6901 Href = "/Default.aspx?ID=" + impersonationPageId, 6902 ButtonLayout = ButtonLayout.LinkClean, 6903 Title = Translate("Switch account"), 6904 Icon = new Icon { 6905 Name = "fa-users", 6906 Prefix = "fal", 6907 LabelPosition = IconLabelPosition.After 6908 }, 6909 CssClass = "u-no-margin u-color-inherit" 6910 }) 6911 } 6912 6913 @helper RenderStopImpersonationForm() 6914 { 6915 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6916 string userName = getUserName(Pageview.User); 6917 int pageId = Model.TopPage.ID; 6918 6919 <form method="post" class="u-no-margin"> 6920 @Render(new Button 6921 { 6922 ButtonType = ButtonType.Submit, 6923 ButtonLayout = ButtonLayout.Primary, 6924 Title = Translate("Sign out as") + " " + userName, 6925 OnClick = "logOutImpersonationActions();location.href='/';", 6926 CssClass = "btn--full", 6927 Name = "DwExtranetRemoveSecondaryUser", 6928 }) 6929 </form> 6930 @Render(new Button 6931 { 6932 ButtonType = ButtonType.Button, 6933 ButtonLayout = ButtonLayout.Primary, 6934 Title = Translate("Sign out as") + " " + secondaryUserName, 6935 CssClass = "btn--full", 6936 OnClick = "logOutPrimaryUser(event, this)" 6937 }) 6938 6939 } 6940 6941 @helper RenderStopImpersonationButton() { 6942 @Render(new Button 6943 { 6944 ButtonType = ButtonType.Button, 6945 ButtonLayout = ButtonLayout.LinkClean, 6946 Title = Translate("Sign out"), 6947 Icon = new Icon { 6948 Name = "fa-sign-out", 6949 Prefix = "fal", 6950 LabelPosition = IconLabelPosition.After 6951 }, 6952 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6953 CssClass = "u-no-margin" 6954 }) 6955 } 6956 6957 @helper RenderImpersonationControls() 6958 { 6959 <div class="impersonation__controls"> 6960 @RenderViewListLink() 6961 @RenderSearchBox() 6962 </div> 6963 @RenderResultsList() 6964 } 6965 6966 @helper RenderViewListLink() 6967 { 6968 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6969 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6970 6971 @Render(new Link { 6972 ButtonLayout = ButtonLayout.None, 6973 Title = title, 6974 Href = "/Default.aspx?ID=" + impersonationPageId, 6975 CssClass = buttonClasses 6976 }) 6977 } 6978 6979 @helper RenderSearchBox() 6980 { 6981 <div class="impersonation__search-wrap"> 6982 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6983 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6984 <i class="fal fa-search"></i> 6985 </div> 6986 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6987 <i class="fal fa-times"></i> 6988 </div> 6989 </div> 6990 } 6991 6992 @helper RenderTypeaheadSearch() 6993 { 6994 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6995 data-page-size="5" 6996 data-search-feed-id="@impersonationFeed" 6997 data-result-page-id="@impersonationPageId" 6998 data-search-type="user-search" 6999 data-search-parameter-name="q"> 7000 7001 <div class="typeahead-search-field"> 7002 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 7003 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul> 7004 </div> 7005 </div> 7006 } 7007 7008 @helper RenderResultsList() 7009 { 7010 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul> 7011 } 7012 7013 @helper RenderSearchResultTemplate() 7014 { 7015 <script id="ImpersonationSearchResult" type="text/x-template"> 7016 {{#.}} 7017 {{#Users}} 7018 <li class="impersonation__search-results-item impersonation-user"> 7019 <form method="post" class="impersonation-user__form" name="account{{id}}"> 7020 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 7021 <div class="impersonation-user__info"> 7022 <div class="impersonation-user__name">{{userName}}</div> 7023 <div class="impersonation-user__number">{{customerNumber}}</div> 7024 </div> 7025 @Render(new Button 7026 { 7027 ButtonType = ButtonType.Submit, 7028 ButtonLayout = ButtonLayout.Secondary, 7029 Title = Translate("Sign in as"), 7030 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 7031 }) 7032 </form> 7033 </li> 7034 {{/Users}} 7035 {{#unless Users}} 7036 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 7037 @Translate("Your search gave 0 results") 7038 </li> 7039 {{/unless}} 7040 {{/.}} 7041 </script> 7042 } 7043 7044 @helper RenderSearchScripts() 7045 { 7046 <script> 7047 let inputDelayTimer; 7048 function searchKeyUpHandler(e) { 7049 clearTimeout(inputDelayTimer); 7050 let value = e.target.value; 7051 if (value != "") { 7052 inputDelayTimer = setTimeout(function () { 7053 updateResults(value); 7054 }, 500); 7055 } else { 7056 clearResults(); 7057 } 7058 }; 7059 7060 function updateResults(value) { 7061 if (value == "") { 7062 return null; 7063 } 7064 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 7065 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 7066 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 7067 } 7068 7069 function clearResults() { 7070 document.getElementById("ImpersonationBoxSearchField").value = ""; 7071 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 7072 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 7073 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 7074 } 7075 </script> 7076 } 7077 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7078 7079 @using System 7080 @using System.Web 7081 @using System.Collections.Generic 7082 @using Dynamicweb.Rapido.Blocks.Extensibility 7083 @using Dynamicweb.Rapido.Blocks 7084 7085 @{ 7086 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 7087 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 7088 7089 Block orderLines = new Block 7090 { 7091 Id = "MiniCartOrderLines", 7092 SkipRenderBlocksList = true, 7093 BlocksList = new List<Block> 7094 { 7095 new Block { 7096 Id = "MiniCartOrderLinesList", 7097 SortId = 20, 7098 Template = RenderMiniCartOrderLinesList() 7099 } 7100 } 7101 }; 7102 7103 Block orderlinesScriptTemplates = new Block 7104 { 7105 Id = "OrderlinesScriptTemplates" 7106 }; 7107 7108 if (orderlinesView == "table") 7109 { 7110 orderLines.Template = RenderMiniCartOrderLinesTable(); 7111 orderLines.BlocksList.Add( 7112 new Block 7113 { 7114 Id = "MiniCartOrderlinesTableHeader", 7115 SortId = 10, 7116 Template = RenderMiniCartOrderLinesHeader() 7117 } 7118 ); 7119 7120 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 7121 } 7122 else 7123 { 7124 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 7125 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 7126 } 7127 7128 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 7129 7130 Block miniCartScriptTemplates = new Block() 7131 { 7132 Id = "MasterMiniCartTemplates", 7133 SortId = 1, 7134 Template = RenderMiniCartScriptTemplates(), 7135 SkipRenderBlocksList = true, 7136 BlocksList = new List<Block> 7137 { 7138 orderLines, 7139 new Block { 7140 Id = "MiniCartFooter", 7141 Template = RenderMiniCartFooter(), 7142 SortId = 50, 7143 SkipRenderBlocksList = true, 7144 BlocksList = new List<Block> 7145 { 7146 new Block { 7147 Id = "MiniCartSubTotal", 7148 Template = RenderMiniCartSubTotal(), 7149 SortId = 30 7150 }, 7151 new Block { 7152 Id = "MiniCartFees", 7153 Template = RenderMiniCartFees(), 7154 SortId = 40 7155 }, 7156 new Block { 7157 Id = "MiniCartPoints", 7158 Template = RenderMiniCartPoints(), 7159 SortId = 50 7160 }, 7161 new Block { 7162 Id = "MiniCartTotal", 7163 Template = RenderMiniCartTotal(), 7164 SortId = 60 7165 }, 7166 new Block { 7167 Id = "MiniCartDisclaimer", 7168 Template = RenderMiniCartDisclaimer(), 7169 SortId = 70 7170 }, 7171 new Block { 7172 Id = "MiniCartActions", 7173 Template = RenderMiniCartActions(), 7174 SortId = 80 7175 } 7176 } 7177 } 7178 } 7179 }; 7180 7181 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 7182 } 7183 7184 @helper RenderMiniCartScriptsTableTemplates() 7185 { 7186 string cartPageId = GetPageIdByNavigationTag("MiniCartFeed").ToString(); 7187 <script id="MiniCartOrderline" type="text/x-template"> 7188 {{#unless isEmpty}} 7189 <tr> 7190 <td class="u-ta-right u-va-middle mini-cart-orderline__quantity {{isDiscontinuedClass}}"> 7191 <div class="u-flex u-flex--align-center grid--direction-column"> 7192 @*@Render(new Button { 7193 Icon = new Icon { Prefix = "fas", Name = "fa-caret-up", LabelPosition = IconLabelPosition.After }, 7194 CssClass = "value-button u-no-margin", 7195 ButtonType = ButtonType.Button, 7196 ButtonLayout = ButtonLayout.None, 7197 ExtraAttributes = new Dictionary<string, string> 7198 { 7199 { "data-operation", "increase"}, 7200 } 7201 })*@ 7202 <input type="text" value="{{quantityRaw}}" class="quantity bs-fw-bold mini-cart-quantity-orderline" data-step="{{ProductQuantityPerPurchaseUnit}}" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7203 <input type="text" value="{{ProductBaseUnit}}" class="quantity" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7204 @*@Render(new Button { 7205 Icon = new Icon { Prefix = "fas", Name = "fa-caret-down", LabelPosition = IconLabelPosition.After }, 7206 CssClass = "value-button u-no-margin", 7207 ButtonType = ButtonType.Button, 7208 ButtonLayout = ButtonLayout.None, 7209 ExtraAttributes = new Dictionary<string, string> 7210 { 7211 { "data-operation", "decrease"}, 7212 } 7213 })*@ 7214 </div> 7215 </td> 7216 <td class="mini-cart-orderline__image u-va-middle {{isDiscontinuedClass}}"> 7217 <a href="{{link}}" class="{{hideimage}} quick-view" data-load-page="{{link}}"><img loading="lazy" width="40" height="40" src="/Admin/Public/GetImage.ashx?width=40&height=40&crop=5&Compression=75&image={{image}}&altFmImage_path=/Images/Kraemer/RapidoProducts/missing-image.jpg" alt="{{name}}" title="{{name}}" style="aspect-ratio: 40 / 40; object-fit: contain;"></a> 7218 </td> 7219 <td class="u-va-middle {{isDiscontinuedClass}}"> 7220 <a href="{{link}}" class="u-padding-top mini-cart-orderline__name quick-view" data-load-page="{{link}}" title="{{name}}">{{name}}</a> 7221 <div class="u-padding-bottom">{{productnumber}}</div> 7222 {{#if variantname}} 7223 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 7224 {{/if}} 7225 {{#if unitname}} 7226 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 7227 {{/if}} 7228 </td> 7229 {{#unless hidePricesOrderline}} 7230 <td class="u-ta-right u-va-middle mini-cart-orderline__price test mini-cart-orderline__price_{{orderLineId}} {{isDiscontinuedClass}}"> 7231 {{#if pointsTotal}} 7232 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7233 {{else}} 7234 {{totalprice}} 7235 {{/if}} 7236 </td> 7237 {{/unless}} 7238 <td class="u-ta-right u-va-middle mini-cart-orderline__delete {{#ifCond isDiscontinuedClass '!==' ""}} u-hidden-border-bottom {{/ifCond}}"> 7239 @Render(new Button 7240 { 7241 OnClick = "deleteOrderline('" + cartPageId + "', '{{id}}', '{{orderLineId}}')", 7242 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After }, 7243 CssClass = "u-no-margin", 7244 ButtonType = ButtonType.Button, 7245 ButtonLayout = ButtonLayout.None 7246 }) 7247 </td> 7248 </tr> 7249 {{#if discontinued}} 7250 <tr class="disabled"> 7251 <td class="discontinued-text" style="border-top: 0;" colspan="5">{{discontinuedText}}</td> 7252 </tr> 7253 {{/if}} 7254 {{/unless}} 7255 7256 </script> 7257 7258 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7259 {{#unless isEmpty}} 7260 <tr class="table__row--no-border"> 7261 <td class="u-w60px">&nbsp;</td> 7262 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 7263 <td class="u-ta-right">&nbsp;</td> 7264 {{#unless hidePrices}} 7265 <td class="u-ta-right">{{totalprice}}</td> 7266 {{/unless}} 7267 </tr> 7268 {{/unless}} 7269 </script> 7270 } 7271 7272 @helper RenderMiniCartScriptsListTemplates() 7273 { 7274 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7275 7276 <script id="MiniCartOrderline" type="text/x-template"> 7277 {{#unless isEmpty}} 7278 <div class="mini-cart-orderline grid dw-mod"> 7279 <div class="grid__col-4"> 7280 <a href="{{link}}" class="{{hideimage}}"> 7281 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"> 7282 </a> 7283 </div> 7284 <div class="grid__col-8"> 7285 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a> 7286 {{#if variantname}} 7287 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 7288 {{/if}} 7289 {{#if unitname}} 7290 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 7291 {{/if}} 7292 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 7293 7294 <div class="grid__cell-footer"> 7295 <div class="grid__cell"> 7296 {{#unless hidePrices}} 7297 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 7298 {{#if pointsTotal}} 7299 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7300 {{else}} 7301 {{totalprice}} 7302 {{/if}} 7303 </div> 7304 {{/unless}} 7305 <button type="button" 7306 title="@Translate("Remove orderline")" 7307 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 7308 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 7309 </div> 7310 </div> 7311 </div> 7312 </div> 7313 {{/unless}} 7314 </script> 7315 7316 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7317 {{#unless isEmpty}} 7318 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 7319 <div class="grid__col-4"> 7320 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 7321 </div> 7322 {{#unless hidePrices}} 7323 <div class="grid__col-8">{{totalprice}}</div> 7324 {{/unless}} 7325 </div> 7326 {{/unless}} 7327 </script> 7328 } 7329 7330 @helper RenderMiniCartScriptTemplates() 7331 { 7332 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 7333 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7334 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 7335 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7336 7337 <script id="MiniCartContent" type="text/x-template"> 7338 {{#.}} 7339 {{#unless isEmpty}} 7340 @if (miniCartUseGoogleTagManager) 7341 { 7342 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 7343 } 7344 @RenderBlockList(subBlocks) 7345 {{/unless}} 7346 {{/.}} 7347 </script> 7348 } 7349 7350 @helper RenderMiniCartOrderLinesTable() 7351 { 7352 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7353 7354 <div class="u-overflow-auto"> 7355 <table class="table mini-cart-table dw-mod" data-test="true"> 7356 7357 @RenderBlockList(subBlocks) 7358 </table> 7359 </div> 7360 } 7361 7362 @helper RenderMiniCartOrderLinesBlocks() 7363 { 7364 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7365 7366 <div class="u-overflow-auto"> 7367 @RenderBlockList(subBlocks) 7368 </div> 7369 } 7370 7371 @helper RenderMiniCartOrderLinesHeader() 7372 { 7373 @*<thead> 7374 <tr> 7375 <td>&nbsp;</td> 7376 <td>@Translate("Product")</td> 7377 <td class="u-ta-right">@Translate("Qty")</td> 7378 <td class="u-ta-right">@Translate("Price")</td> 7379 </tr> 7380 </thead>*@ 7381 } 7382 7383 @helper RenderMiniCartOrderLinesList() 7384 { 7385 <text> 7386 {{#OrderLines}} 7387 {{#ifCond template "===" "CartOrderline"}} 7388 {{>MiniCartOrderline}} 7389 {{/ifCond}} 7390 {{#ifCond template "===" "CartOrderlineMobile"}} 7391 {{>MiniCartOrderline}} 7392 {{/ifCond}} 7393 {{#ifCond template "===" "CartOrderlineDiscount"}} 7394 {{>MiniCartOrderlineDiscount}} 7395 {{/ifCond}} 7396 {{/OrderLines}} 7397 </text> 7398 } 7399 7400 @helper RenderMiniCartFees() 7401 { 7402 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7403 if (!pointShop) 7404 { 7405 <text> 7406 {{#unless hidePaymentfee}} 7407 <div class="grid"> 7408 <div class="grid__col-6 grid__col--bleed-y"> 7409 {{paymentmethod}} 7410 </div> 7411 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 7412 </div> 7413 {{/unless}} 7414 </text> 7415 } 7416 <text> 7417 {{#unless hideShippingfee}} 7418 <div class="grid"> 7419 <div class="grid__col-6 grid__col--bleed-y"> 7420 {{shippingmethod}} 7421 </div> 7422 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 7423 </div> 7424 {{/unless}} 7425 </text> 7426 <text> 7427 {{#if hasTaxSettings}} 7428 <div class="grid"> 7429 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 7430 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 7431 </div> 7432 {{/if}} 7433 </text> 7434 } 7435 7436 @helper RenderMiniCartFooter() 7437 { 7438 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 7439 7440 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 7441 @RenderBlockList(subBlocks) 7442 </div> 7443 } 7444 7445 @helper RenderMiniCartActions() 7446 { 7447 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7448 7449 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom bs-mb-2" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = true">@Translate("Empty cart")</button> 7450 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Proceed to cart")</a> 7451 } 7452 7453 @helper RenderMiniCartPoints() 7454 { 7455 <text> 7456 {{#if earnings}} 7457 <div class="grid"> 7458 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 7459 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7460 <div> 7461 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 7462 </div> 7463 </div> 7464 </div> 7465 {{/if}} 7466 </text> 7467 } 7468 7469 @helper RenderMiniCartSubTotal() 7470 { 7471 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 7472 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7473 if (!pointShop) 7474 { 7475 @*<text> 7476 {{#unless hideSubTotal}} 7477 <div class="grid dw-mod u-bold"> 7478 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 7479 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7480 @if (hasTaxSettings) 7481 { 7482 <text>{{subtotalpricewithouttaxes}}</text> 7483 } 7484 else 7485 { 7486 <text>{{subtotalprice}}</text> 7487 } 7488 </div> 7489 </div> 7490 {{/unless}} 7491 </text>*@ 7492 } 7493 } 7494 7495 @helper RenderMiniCartTotal() 7496 { 7497 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7498 <text> 7499 {{#unless hidePrices}} 7500 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 7501 <div class="grid__col-6">@Translate("Total")</div> 7502 <div class="grid__col-6 grid--align-end"> 7503 <div> 7504 @if (pointShop) 7505 { 7506 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 7507 } 7508 else 7509 { 7510 <text>{{totalprice}}</text> 7511 } 7512 </div> 7513 </div> 7514 </div> 7515 {{/unless}} 7516 </text> 7517 } 7518 7519 @helper RenderMiniCartDisclaimer() 7520 { 7521 <text> 7522 {{#if showCheckoutDisclaimer}} 7523 <div class="grid u-margin-bottom u-ta-right"> 7524 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 7525 </div> 7526 {{/if}} 7527 </text> 7528 } 7529 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7530 7531 @using Dynamicweb.Rapido.Blocks.Extensibility 7532 @using Dynamicweb.Rapido.Blocks 7533 @using Dynamicweb.Rapido.Blocks.Components.General 7534 @using Dynamicweb.Rapido.Blocks.Components 7535 @using Dynamicweb.Rapido.Services 7536 7537 @{ 7538 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 7539 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 7540 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 7541 7542 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 7543 { 7544 if (addToCartNotificationType == "modal") 7545 { 7546 Block addToCartNotificationModal = new Block 7547 { 7548 Id = "AddToCartNotificationModal", 7549 Template = RenderAddToCartNotificationModal() 7550 }; 7551 7552 Block addToCartNotificationScript = new Block 7553 { 7554 Id = "AddToCartNotificationScript", 7555 Template = RenderAddToCartNotificationModalScript() 7556 }; 7557 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 7558 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7559 } 7560 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 7561 { 7562 Block addToCartNotificationScript = new Block 7563 { 7564 Id = "AddToCartNotificationScript", 7565 Template = RenderAddToCartNotificationToggleScript() 7566 }; 7567 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7568 } 7569 } 7570 } 7571 7572 @helper RenderAddToCartNotificationModal() 7573 { 7574 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 7575 } 7576 7577 @helper RenderAddToCartNotificationModalScript() 7578 { 7579 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7580 7581 <script id="LastAddedProductTemplate" type="text/x-template"> 7582 @{ 7583 7584 Modal lastAddedProduct = new Modal 7585 { 7586 Id = "LastAddedProduct", 7587 Heading = new Heading 7588 { 7589 Level = 2, 7590 Title = Translate("Product is added to the cart") 7591 }, 7592 Width = ModalWidth.Md, 7593 BodyTemplate = RenderModalContent() 7594 }; 7595 7596 lastAddedProduct.AddActions( 7597 new Button 7598 { 7599 ButtonType = ButtonType.Button, 7600 ButtonLayout = ButtonLayout.Secondary, 7601 Title = Translate("Continue shopping"), 7602 CssClass = "u-pull--left u-no-margin btn--sm", 7603 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 7604 }, 7605 new Link 7606 { 7607 Href = "/Default.aspx?ID=" + cartPageId, 7608 ButtonLayout = ButtonLayout.Secondary, 7609 CssClass = "u-pull--right u-no-margin btn--sm", 7610 Title = Translate("Proceed to checkout") 7611 } 7612 ); 7613 7614 @Render(lastAddedProduct) 7615 } 7616 </script> 7617 7618 } 7619 7620 @helper RenderModalContent() 7621 { 7622 <div class="grid"> 7623 <div class="grid__col-2"> 7624 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 7625 </div> 7626 <div class="u-padding grid--align-self-center"> 7627 <span>{{quantity}}</span> x 7628 </div> 7629 <div class="grid__col-auto grid--align-self-center"> 7630 <div>{{productInfo.name}}</div> 7631 {{#if productInfo.variantName}} 7632 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 7633 {{/if}} 7634 {{#if productInfo.unitName}} 7635 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 7636 {{/if}} 7637 </div> 7638 </div> 7639 } 7640 7641 @helper RenderAddToCartNotificationToggleScript() 7642 { 7643 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7644 7645 <script> 7646 document.addEventListener('addToCart', function () { 7647 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 7648 }); 7649 </script> 7650 } 7651 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7652 7653 @using System 7654 @using System.Web 7655 @using System.Collections.Generic 7656 @using Dynamicweb.Rapido.Blocks.Extensibility 7657 @using Dynamicweb.Rapido.Blocks 7658 @using Dynamicweb.Rapido.Blocks.Components.General 7659 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Math 7660 7661 @functions { 7662 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 7663 } 7664 7665 @{ 7666 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 7667 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 7668 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 7669 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 7670 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 7671 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 7672 7673 Block masterFooterContent = new Block() 7674 { 7675 Id = "MasterFooterContent", 7676 SortId = 10, 7677 Template = RenderFooter(), 7678 SkipRenderBlocksList = true 7679 }; 7680 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 7681 7682 /*if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 7683 { 7684 Block masterFooterColumnOne = new Block 7685 { 7686 Id = "MasterFooterColumnOne", 7687 SortId = 10, 7688 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 7689 Design = new Design 7690 { 7691 Size = "auto", 7692 RenderType = RenderType.Column 7693 } 7694 }; 7695 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 7696 } 7697 7698 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 7699 { 7700 Block masterFooterColumnTwo = new Block 7701 { 7702 Id = "MasterFooterColumnTwo", 7703 SortId = 20, 7704 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 7705 Design = new Design 7706 { 7707 Size = "auto", 7708 RenderType = RenderType.Column 7709 } 7710 }; 7711 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 7712 } 7713 7714 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 7715 { 7716 Block masterFooterColumnThree = new Block 7717 { 7718 Id = "MasterFooterColumnThree", 7719 SortId = 30, 7720 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 7721 Design = new Design 7722 { 7723 Size = "auto", 7724 RenderType = RenderType.Column 7725 } 7726 }; 7727 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 7728 }*/ 7729 7730 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 7731 { 7732 Block masterFooterNewsletterSignUp = new Block 7733 { 7734 Id = "MasterFooterNewsletterSignUp", 7735 SortId = 40, 7736 Template = RenderFooterNewsletterSignUp(), 7737 Design = new Design 7738 { 7739 Size = "auto", 7740 RenderType = RenderType.Column 7741 } 7742 }; 7743 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 7744 } 7745 7746 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 7747 { 7748 Block masterFooterSocialLinks = new Block 7749 { 7750 Id = "MasterFooterSocialLinks", 7751 SortId = 50, 7752 Template = RenderFooterSocialLinks(), 7753 Design = new Design 7754 { 7755 Size = "auto", 7756 RenderType = RenderType.Column 7757 } 7758 }; 7759 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 7760 } 7761 7762 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 7763 { 7764 Block masterFooterPayments = new Block 7765 { 7766 Id = "MasterFooterPayments", 7767 SortId = 60, 7768 Template = RenderFooterPayments(), 7769 Design = new Design 7770 { 7771 Size = "12", 7772 RenderType = RenderType.Column 7773 } 7774 }; 7775 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 7776 } 7777 7778 Block masterFooterCopyright = new Block 7779 { 7780 Id = "MasterFooterCopyright", 7781 SortId = 70, 7782 Template = RenderFooterCopyright(), 7783 Design = new Design 7784 { 7785 CssClass = "u-full-width" 7786 } 7787 }; 7788 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 7789 } 7790 7791 @helper RenderFooter() 7792 { 7793 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 7794 var imageSource = "/Files/Images/FooterWave.svg"; 7795 List<int> pages = new List<int>(); 7796 pages.Add(6953); 7797 var test = 0; 7798 var newCartPageId = GetPageIdByNavigationTag("CartPageV2"); 7799 bool isNewCartPage = Pageview.Page.ID == newCartPageId; 7800 string centerBackgroundClass = isNewCartPage ? "background-color: #F9F7F6 !important" : ""; 7801 7802 if (Model.Item != null) 7803 { 7804 test = Int32.Parse(Model?.Item?.PageID.ToString()); 7805 } 7806 var footerBackgroundColor = ""; 7807 if (test != 0) 7808 { 7809 footerBackgroundColor = pages.Contains(Model.Item.PageID) ? "bg-beige" : ""; 7810 7811 <footer class="footer dw-mod @footerBackgroundColor" id="@Model.Item.PageID" style="position: relative;"> 7812 <div class="backdrop"> 7813 @{ 7814 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7815 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7816 } 7817 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7818 </div> 7819 <div class="footer__content"> 7820 <div class="content-container"> 7821 <div class="content-row"> 7822 @RenderBlockList(subBlocks) 7823 </div> 7824 </div> 7825 </div> 7826 </footer> 7827 }else 7828 { 7829 <footer class="footer dw-mod " style="position: relative; @centerBackgroundClass"> 7830 <div class="backdrop"> 7831 @{ 7832 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7833 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7834 } 7835 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7836 </div> 7837 <div class="footer__content"> 7838 <div class="content-container"> 7839 <div class="content-row"> 7840 @RenderBlockList(subBlocks) 7841 </div> 7842 </div> 7843 </div> 7844 </footer> 7845 } 7846 } 7847 7848 @helper RenderFooterColumn(string header, string content) 7849 { 7850 <h3 class="footer__heading dw-mod">@header</h3> 7851 <div class="footer__content dw-mod"> 7852 @content 7853 </div> 7854 } 7855 7856 @helper RenderFooterNewsletterSignUp() 7857 { 7858 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 7859 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 7860 7861 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 7862 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 7863 form.Add(new TextField 7864 { 7865 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 7866 Type = TextFieldType.Email, 7867 ActionButton = new Button 7868 { 7869 ButtonType = ButtonType.Submit, Id = "Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 7870 } 7871 }); 7872 7873 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 7874 <div class="footer__content dw-mod"> 7875 @Render(form) 7876 </div> 7877 } 7878 7879 @helper RenderFooterSocialLinks() 7880 { 7881 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 7882 <div class="footer__content dw-mod"> 7883 <div class="collection dw-mod"> 7884 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 7885 { 7886 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 7887 string socialIconClass = socialIcon.SelectedValue; 7888 string socialIconTitle = socialIcon.SelectedName; 7889 string socialLink = socialitem.GetString("Link"); 7890 7891 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"> 7892 <i class="@socialIconClass fa-2x"></i> 7893 </a> 7894 } 7895 </div> 7896 </div> 7897 } 7898 7899 @helper RenderFooterPayments() 7900 { 7901 <div class="footer__content dw-mod"> 7902 <div class="collection dw-mod"> 7903 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 7904 { 7905 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 7906 string paymentImage = null; 7907 string paymentTitle = paymentItem.SelectedName; 7908 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 7909 if (selected != null) 7910 { 7911 paymentImage = selected.Icon; 7912 } 7913 7914 <div class="footer__card-type"> 7915 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle"/> 7916 </div> 7917 } 7918 </div> 7919 </div> 7920 } 7921 7922 @helper RenderFooterCopyright() 7923 { 7924 <div class="footer__copyright u-position-relative"> 7925 <div class="footer__copyright-logo"> 7926 <img loadin="lazy" src="/Files/Images/dnv-good-fit.png" width="129" height="122" alt="footer-icon"/> 7927 </div> 7928 <p class="footer__copyright-text">&copy; @DateTime.Now.Year @Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 7929 7930 7931 </div> 7932 } 7933 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7934 7935 @using System 7936 @using System.Web 7937 @using System.Collections.Generic 7938 @using Dynamicweb.Rapido.Blocks.Extensibility 7939 @using Dynamicweb.Rapido.Blocks 7940 @using Dynamicweb.Ecommerce.Common 7941 @using WebApp.Singleton 7942 7943 @{ 7944 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 7945 7946 Block masterScriptReferences = new Block() 7947 { 7948 Id = "MasterScriptReferences", 7949 SortId = 1, 7950 Template = RenderMasterScriptReferences() 7951 }; 7952 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 7953 } 7954 7955 @helper RenderMasterScriptReferences() 7956 { 7957 var customJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/js/custom.js")); 7958 var appJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/app.bundle.js")); 7959 var foodCalendarJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js")); 7960 var shoppingListJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js")); 7961 var customGeneralJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js")); 7962 var foodCalendarExtensionJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendarExtension.bundle.js")); 7963 7964 var buildNumber = WebAppConfiguration.BuildNumber; 7965 string customJsSrc = $"/Files/Templates/Designs/Rapido/js/custom.js?buildNumber={buildNumber}"; 7966 string appJsSrc = $"/Files/Templates/Designs/Rapido/dist/app.bundle.js?buildNumber={buildNumber}"; 7967 string foodCalendarJsSrc = $"/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js?buildNumber={buildNumber}"; 7968 string shoppingListJsSrc = $"/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js?buildNumber={buildNumber}"; 7969 string customGeneralJsSrc = $"/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js?buildNumber={buildNumber}"; 7970 var masterGeneralJsSrc = $"/Files/Templates/Designs/Rapido/js/master.js?buildNumber={buildNumber}"; 7971 7972 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js" defer></script> 7973 <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js" defer></script> 7974 <script src="https://unpkg.com/@("@reduxjs")/toolkit@1.9.7/dist/redux-toolkit.umd.js" defer></script> 7975 <script src="/Files/Templates/Designs/Rapido/js/master.js?v=5" defer></script> 7976 7977 //vue referrences 7978 <script src="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.js?x=@buildNumber" defer type="module"></script> 7979 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/vue/vue.apps.bundle.css?x=@buildNumber"> 7980 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?x=@buildNumber"> 7981 7982 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 7983 { 7984 <script src="/Files/Templates/Designs/Rapido/js/axios.js" defer></script> 7985 7986 <script src="@customJsSrc" defer></script> 7987 <script src="@appJsSrc" type="module"></script> 7988 <script src="@foodCalendarJsSrc" type="module"></script> 7989 <script src="@shoppingListJsSrc" type="module"></script> 7990 <script src="@customGeneralJsSrc" type="module"></script> 7991 7992 7993 PushPromise("/Files/Templates/Designs/Rapido/js/axios.js"); 7994 PushPromise(customJsSrc); 7995 PushPromise(foodCalendarJsSrc); 7996 PushPromise(shoppingListJsSrc); 7997 PushPromise(customGeneralJsSrc); 7998 } 7999 8000 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 8001 PushPromise("/Files/Templates/Designs/Rapido/js/master.js?v=5"); 8002 } 8003 8004 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 8005 8006 @using System 8007 @using System.Web 8008 @using System.Collections.Generic 8009 @using Dynamicweb.Rapido.Blocks.Extensibility 8010 @using Dynamicweb.Rapido.Blocks 8011 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8012 @using Dynamicweb.Rapido.Services 8013 @using Dynamicweb.Ecommerce.ProductCatalog 8014 8015 @{ 8016 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 8017 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 8018 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 8019 8020 if (!navigationItemsHideSearch || isFavoriteList) 8021 { 8022 Block masterSearchScriptTemplates = new Block() 8023 { 8024 Id = "MasterSearchScriptTemplates", 8025 SortId = 1, 8026 Template = RenderSearchScriptTemplates() 8027 }; 8028 8029 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 8030 } 8031 } 8032 8033 @helper RenderSearchScriptTemplates() 8034 { 8035 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 8036 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 8037 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 8038 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 8039 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 8040 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 8041 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 8042 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 8043 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 8044 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star"; 8045 string favoriteIcon = "fas fa-" + selectedFavoriteIcon; 8046 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon; 8047 8048 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID"); 8049 string classMaxWidth = Pageview.Device.ToString() != "Mobile" ? "u-max-w260px" : ""; 8050 string searchParameter = HttpContext.Current.Request.QueryString.Get("Search"); 8051 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 8052 var showCartons = currentUser?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString(); 8053 8054 8055 <script id="SearchGroupsTemplate" type="text/x-template"> 8056 {{#.}} 8057 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 8058 {{/.}} 8059 </script> 8060 8061 <script id="SearchProductsTemplate" type="text/x-template"> 8062 <div style="padding-top:15px; padding-left: 15px; padding-right: 15px;" class="dropdown__item--seperator bs-mb-4 bs-border-secondary dw-mod ">{{label}} 8063 8064 {{#each .}} 8065 {{#each FacetGroups}} 8066 <h4 class="bs-mb-3 u-color-inherit">@Translate("Kategorier")</h4> 8067 <div class="display-grid--two-columns bs-pb-4 "> 8068 {{#FacetOptions}} 8069 {{#ifCond queryParameter "===" "Category"}} 8070 <span class="u-color-inherit" 8071 style="font-weight: 600; cursor: pointer;" 8072 onclick="searchInCategoryButton(@productsPageId, {{ name }})"> 8073 {{label}} ({{count}}) 8074 </span> 8075 {{/ifCond}} 8076 {{/FacetOptions}} 8077 </div> 8078 {{/each}} 8079 {{/each}} 8080 8081 </div> 8082 {{#each .}} 8083 {{#each ProductsContainer}} 8084 {{#Product}} 8085 {{#ifCond template "!==" "SearchMore"}} 8086 {{#ifCond isDiscontinuedClass "!==" "disabled"}} 8087 <li class="dropdown__item test dropdown__item--seperator dw-mod"> 8088 @if (useFacebookPixel) 8089 { 8090 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 8091 } 8092 @if (useGoogleTagManager) 8093 { 8094 <text>{{{googleEnchantImpression googleImpression}}}</text> 8095 } 8096 <div class="search__product-wrapper grid--align-center"> 8097 <div class="search__product-wrapper-infos"> 8098 <a href="{{link}}" 8099 class="js-typeahead-link quick-view u-color-inherit u-pull--left bs-d-flex" data-load-page="{{link}}" 8100 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 8101 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 8102 <div class="u-margin-right {{noimage}}" style="width: 50px"><img src="/Files/Images/Kraemer/RapidoProducts/{{number}}.jpg" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}" class="search-img" onerror="this.src='/Files/Images/Kraemer/RapidoProducts/missing-image.jpg';"></div> 8103 <div class="u-pull--left"> 8104 <div class="u-bold u-truncate-text js-typeahead-name u-flex grid--align-center"> 8105 <span class="u-padding-right">{{productId}}</span> 8106 <span class="u-flex grid--align-center u-padding-right"> 8107 <i class="fas fa-circle cart-circle"></i> 8108 </span> 8109 <span class="search__product-name u-truncate-text u-inline-block bs-d-flex bs-align-items-center bs-gap-1" style="max-width: 200px"> 8110 {{name}}{{#if variantName}}, {{variantName}}{{/if}} 8111 {{#ifCond ProductCountryManufacturerCode '===' "NO"}} 8112 <div class="product-country"> 8113 <img height="18px" src='@("/Admin/Images/Flags/flag_" + "no" +".png")' title="@Translate("Norway")" alt='@Translate("Norway flag")'> 8114 </div> 8115 {{/ifCond}} 8116 </span> 8117 </div> 8118 <div class="u-flex grid--align-center u-truncate-text product-search-description"> 8119 {{#if transit}} 8120 <span class="cart-table__product-name-infos-transit"> 8121 <div class="transit-container u-margin-right" title="@Translate("Transittvare")"> 8122 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8123 <circle cx="10" cy="10" r="10" fill="#0052A0" /> 8124 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white" /> 8125 </svg> 8126 <div class="tooltip">@Translate("Transittvare")</div> 8127 </div> 8128 </span> 8129 {{/if}} 8130 {{#if showBreakableIcon}} 8131 <span class="cart-table__product-name-infos-showbreakableicon"> 8132 <div class="transit-container u-margin-right" title="@Translate("Anbrekksvare")"> 8133 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8134 <circle cx="10" cy="10" r="10" fill="#0052A0" /> 8135 <path d="M11.7979 12.9492H8.20215L7.51855 15H5.33789L9.04297 5.04688H10.9434L14.6689 15H12.4883L11.7979 12.9492ZM8.75586 11.2881H11.2441L9.99316 7.5625L8.75586 11.2881Z" fill="white" /> 8136 </svg> 8137 <div class="tooltip">@Translate("Anbrekksvare")</div> 8138 </div> 8139 </span> 8140 {{/if}} 8141 <span class="js-typeahead-name u-padding-right u-flex grid--align-center search__manufacture-name"> {{ManufacturerName}}</span> 8142 <span class="u-flex grid--align-center u-padding-right"><i class="fas fa-circle cart-circle"></i></span> 8143 <span class="package-contents search__product-package u-truncate-text">{{truncateFirst20 ProductPackageContents}}</span> 8144 8145 8146 {{#ifCond StorageAvailableInSessionLocation '!==' true}} 8147 {{#ifCond warehouseDescription '!==' ""}} 8148 {{#ifCond warehouseDescription '!==' null}} 8149 8150 @if (Pageview.User != null) 8151 { 8152 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #f1ff80" title="@Translate("Central warehouse - longer lead time")">{{warehouseDescription}}</div> 8153 } 8154 8155 {{/ifCond}} 8156 {{/ifCond}} 8157 8158 8159 {{#ifCond stockDescriptiontext '!==' ""}} 8160 {{#ifCond stockDescriptiontext '!==' null}} 8161 {{#ifCond stockDescriptiontext '!==' "Lagerført"}} 8162 8163 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Limited")"}} 8164 8165 @if (Pageview.User != null) 8166 { 8167 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Limited")">{{stockDescriptiontext}}</div> 8168 } 8169 8170 {{/ifCond}} 8171 8172 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Unavailable")"}} 8173 8174 @if (Pageview.User != null) 8175 { 8176 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Unavailable")">{{stockDescriptiontext}}</div> 8177 } 8178 8179 {{/ifCond}} 8180 8181 {{/ifCond}} 8182 {{/ifCond}} 8183 {{/ifCond}} 8184 {{/ifCond}} 8185 </div> 8186 @* @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 8187 { 8188 if (pointShopOnly) 8189 { 8190 <text> 8191 {{#if havePointPrice}} 8192 <div> 8193 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 8194 </div> 8195 {{else}} 8196 <small class="help-text u-no-margin">@Translate("Not available")</small> 8197 {{/if}} 8198 {{#unless canBePurchasedWithPoints}} 8199 {{#if havePointPrice}} 8200 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 8201 {{/if}} 8202 {{/unless}} 8203 </text> 8204 } 8205 else 8206 { 8207 <div>{{price}}</div> 8208 } 8209 }*@ 8210 </div> 8211 </a> 8212 </div> 8213 <div class="u-flex search__product-wrapper-price"> 8214 <div class="u-margin-left"> 8215 @{ 8216 var viewBtn = new Link 8217 { 8218 Href = "{{link}}", 8219 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 8220 ButtonLayout = ButtonLayout.Secondary, 8221 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside u-hidden", 8222 Title = Translate("View") 8223 }; 8224 } 8225 8226 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 8227 { 8228 <text>{{#if hideAddToCartButton}}</text> 8229 @Render(viewBtn) 8230 <text>{{else}}</text> 8231 <div class="u-flex grid--align-center grid--wrap"> 8232 <div class="price price--product-list price--micro u-margin-right dw-mod">{{price}} / {{ProductBaseUnit}} 8233 @*<span class="purchase-unit-details dw-mod u-color-dark u-margin-left--lg">{{ProductQuantityPerPurchaseUnit}} x</span>*@ 8234 </div> 8235 <div class="add-quantity-container u-flex u-flex--align"> 8236 8237 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 8238 { <div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8239 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')">-</button> 8240 @Render(new NumberField 8241 { 8242 Id = "SearchQuantity{{productId}}", 8243 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8244 Value = "", 8245 ExtraAttributes = new Dictionary<string, string> 8246 { 8247 {"data-breakable", "{{Breakable}}"}, 8248 {"data-prev-value", "0"}, 8249 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8250 {"data-product-id", "{{productId}}"}, 8251 {"tabindex", "0"}, 8252 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8253 { "step", "{{ProductQuantityPerPurchaseUnit}}"}, 8254 { "data-type", "Search" }, 8255 { "data-name", "{{name}}"}, 8256 } 8257 }) 8258 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); input.dispatchEvent(new Event('change')); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')">+</button> 8259 </div> 8260 @Render(new Button { 8261 OnClick = "enableField(this)", 8262 Id = "SearchQuantityBtn{{productId}}", 8263 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8264 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8265 ButtonType = ButtonType.Button, 8266 ButtonLayout = ButtonLayout.Primary, 8267 ExtraAttributes = new Dictionary<string, string> 8268 { 8269 { "data-type", "Search"}, 8270 { "data-breakable", "{{Breakable}}"}, 8271 { "data-product-info", "{{productInfo}}" }, 8272 { "data-unit-id", "{{unitId}}" }, 8273 { "data-variant-id", "{{variantid}}" }, 8274 { "data-product-id", "{{productId}}" }, 8275 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8276 { "data-unit-price","{{priceDouble}}" }, 8277 { "data-link","{{link}}" }, 8278 { "data-unit-base","{{ProductBaseUnit}}"}, 8279 { "{{disableButton}}", ""} 8280 } 8281 8282 }) 8283 8284 if (showCartons == "True") 8285 { 8286 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8287 } 8288 } 8289 else 8290 {<div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8291 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'decrease')" style="min-width: unset!important;">-</button> 8292 @Render(new NumberField { 8293 Id = "SearchQuantity{{productId}}", 8294 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8295 Value = "", 8296 ExtraAttributes = new Dictionary<string, string> 8297 { 8298 {"data-breakable", "{{Breakable}}"}, 8299 {"data-prev-value", "0"}, 8300 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8301 {"data-product-id", "{{productId}}"}, 8302 {"tabindex", "0"}, 8303 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8304 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8305 {"data-type", "Search"}, 8306 { "data-name", "{{name}}"}, 8307 {"style","width: 40px !important;height:2ch!important;"} 8308 } 8309 }) 8310 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); updateQuantityVue(input.getAttribute('data-product-id'), input, 'increase')" style="min-width: unset!important;">+</button> 8311 </div> 8312 @Render(new Button { 8313 OnClick = "enableField(this)", 8314 Id = "SearchQuantityBtn{{productId}}", 8315 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8316 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8317 ButtonType = ButtonType.Button, 8318 ButtonLayout = ButtonLayout.Primary, 8319 ExtraAttributes = new Dictionary<string, string> 8320 { 8321 { "data-type", "Search"}, 8322 { "data-breakable", "{{Breakable}}"}, 8323 { "data-product-info", "{{productInfo}}" }, 8324 { "data-unit-id", "{{unitId}}" }, 8325 { "data-variant-id", "{{variantid}}" }, 8326 { "data-product-id", "{{productId}}" }, 8327 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8328 { "data-unit-price","{{priceDouble}}" }, 8329 { "data-link","{{link}}" }, 8330 { "data-unit-base","{{ProductBaseUnit}}"}, 8331 { "{{disableButton}}", ""} 8332 } 8333 8334 }) 8335 if (showCartons == "True") 8336 { 8337 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8338 } 8339 8340 } 8341 8342 <div class="loader-container u-hidden"> 8343 <i class="fas fa-circle-notch fa-spin preloader"></i> 8344 </div> 8345 8346 </div> 8347 </div> 8348 8349 <text>{{/if}}</text> 8350 } 8351 else if (showViewButton) 8352 { 8353 @Render(viewBtn) 8354 } 8355 @if (showAddToDownloadButton) 8356 { 8357 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 8358 <i class="fas fa-plus js-button-icon"></i> 8359 </button> 8360 } 8361 </div> 8362 8363 @if (currentUser != null) 8364 { 8365 <div class="favorites product-list__details-favorites"> 8366 <div class="favorites product-list__details-favorites bs-d-flex bs-align-items-center bs-justify-content-center" style="position: relative;"> 8367 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{number}}" data-quantity="{{ProductQuantityPerPurchaseUnit}}" title="@Translate("HOVER_FavouriteList")"> 8368 <img class="popup-toggle" data-product-number="{{number}}" height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/> 8369 </a> 8370 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;top: 100%;z-index: 99999999999999; height: 200px;"> 8371 </div> 8372 </div> 8373 </div> 8374 } 8375 8376 </div> 8377 </div> 8378 </li> 8379 {{/ifCond}} 8380 {{/ifCond}} 8381 8382 @*{{#ifCond template "===" "SearchMore"}} 8383 {{>SearchMoreProducts}} 8384 {{/ifCond}}*@ 8385 {{/Product}} 8386 {{else}} 8387 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8388 @Translate("Your search gave 0 results") 8389 </li> 8390 {{/each}} 8391 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod js-typeahead"> 8392 <button type="button" @* href="/Default.aspx?ID=@productsPageId&Search=@searchParameter&GroupID={{groupId}}"*@ class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-viewAll" onclick="searchAllButton()"> 8393 @Translate("View all") 8394 </button> 8395 </li> 8396 {{/each}} 8397 </script> 8398 8399 <script id="SearchMoreProducts" type="text/x-template"> 8400 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8401 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8402 @Translate("View all") 8403 </a> 8404 </li> 8405 </script> 8406 8407 <script id="SearchMorePages" type="text/x-template"> 8408 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8409 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8410 @Translate("View all") 8411 </a> 8412 </li> 8413 </script> 8414 8415 <script id="SearchPagesTemplate" type="text/x-template"> 8416 {{#each .}} 8417 {{#ifCond template "!==" "SearchMore"}} 8418 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 8419 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 8420 <div class="u-margin-right"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 8421 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div> 8422 </a> 8423 </li> 8424 {{/ifCond}} 8425 {{#ifCond template "===" "SearchMore"}} 8426 {{>SearchMorePages}} 8427 {{/ifCond}} 8428 {{else}} 8429 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8430 @Translate("Your search gave 0 results") 8431 </li> 8432 {{/each}} 8433 </script> 8434 8435 <script id="SearchPagesTemplateWrap" type="text/x-template"> 8436 <div class="dropdown__column-header">@Translate("Pages")</div> 8437 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8438 {{>SearchPagesTemplate}} 8439 </ul> 8440 </script> 8441 8442 <script id="SearchProductsTemplateWrap" type="text/x-template"> 8443 <div class="dropdown__column-header">@Translate("Products")</div> 8444 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8445 {{>SearchProductsTemplate}} 8446 </ul> 8447 </script> 8448 8449 8450 <script> 8451 @if (!string.IsNullOrEmpty(currentFavoriteListId)) 8452 { 8453 <text> 8454 window.currentFavoriteListId = "@currentFavoriteListId"; 8455 </text> 8456 } 8457 function toggleFavAction(button, event) { 8458 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 8459 Scroll.SavePosition(event); 8460 @if (useFacebookPixel) 8461 { 8462 <text> 8463 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8464 </text> 8465 } 8466 location.href = button.getAttribute('data-add-link'); 8467 return; 8468 } 8469 let isAdd = button.getAttribute('data-is-in-list') == "false"; 8470 Request.Fetch().get( 8471 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 8472 function (result) { 8473 console.log({button}) 8474 button.querySelector('img').src = isAdd ? "/Files/Images/trash-icon-outline.svg" : "/Files/Images/favorite-list-svg.svg"; 8475 button.setAttribute('data-is-in-list', isAdd); 8476 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name')) 8477 let favList = button.closest('.js-favorites-list'); 8478 let favBtn = favList.querySelector('.js-favorite-btn img'); 8479 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 8480 if (isInAnyFavoriteList) { 8481 favBtn.src = "/Files/Images/favorite-list-Filled.svg"; 8482 } else { 8483 favBtn.src = "/Files/Images/favorite-list-svg.svg"; 8484 } 8485 document.getElementById(favList.getAttribute('data-close-overlay')).checked = false; 8486 @if (useFacebookPixel) 8487 { 8488 <text> 8489 if (isAdd) { 8490 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8491 } 8492 </text> 8493 } 8494 if (window.currentFavoriteListId != null) { //if this page is favorite list 8495 let listId = button.getAttribute("data-list-id"); 8496 if (listId == window.currentFavoriteListId && !isAdd) { 8497 location.reload(); 8498 } 8499 } 8500 }, 8501 function () { 8502 console.error("FavoriteLists: Error in ToggleFavAction request"); 8503 }, 8504 false 8505 ); 8506 } 8507 </script> 8508 } 8509 8510 @using Dynamicweb.Rapido.Blocks.Components 8511 @using Dynamicweb.Rapido.Blocks.Components.General 8512 @using Dynamicweb.Rapido.Blocks 8513 @using System.IO 8514 8515 8516 @using Dynamicweb.Rapido.Blocks.Components.General 8517 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8518 8519 8520 @* Component *@ 8521 8522 @helper RenderVariantMatrix(VariantMatrix settings) { 8523 if (settings != null) 8524 { 8525 int productLoopCounter = 0; 8526 int groupCount = 0; 8527 List<VariantOption> firstDimension = new List<VariantOption>(); 8528 List<VariantOption> secondDimension = new List<VariantOption>(); 8529 List<VariantOption> thirdDimension = new List<VariantOption>(); 8530 8531 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 8532 { 8533 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 8534 { 8535 if (groupCount == 0) { 8536 firstDimension.Add(variantOptions); 8537 } 8538 if (groupCount == 1) 8539 { 8540 secondDimension.Add(variantOptions); 8541 } 8542 if (groupCount == 2) 8543 { 8544 thirdDimension.Add(variantOptions); 8545 } 8546 } 8547 groupCount++; 8548 } 8549 8550 int rowCount = 0; 8551 int columnCount = 0; 8552 8553 <script> 8554 var variantsCollection = []; 8555 </script> 8556 8557 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 8558 @if (groupCount == 1) 8559 { 8560 <tbody> 8561 @foreach (VariantOption firstVariantOption in firstDimension) 8562 { 8563 var variantId = firstVariantOption.Id; 8564 <tr> 8565 <td class="u-bold"> 8566 @firstVariantOption.Name 8567 </td> 8568 <td> 8569 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8570 </td> 8571 </tr> 8572 productLoopCounter++; 8573 } 8574 8575 <tr> 8576 <td>&nbsp;</td> 8577 <td> 8578 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8579 </td> 8580 </tr> 8581 </tbody> 8582 } 8583 @if (groupCount == 2) 8584 { 8585 <thead> 8586 <tr> 8587 <td>&nbsp;</td> 8588 @foreach (VariantOption variant in secondDimension) 8589 { 8590 <td>@variant.Name</td> 8591 } 8592 </tr> 8593 </thead> 8594 <tbody> 8595 @foreach (VariantOption firstVariantOption in firstDimension) 8596 { 8597 string variantId = ""; 8598 columnCount = 0; 8599 8600 <tr> 8601 <td class="u-min-w120px">@firstVariantOption.Name</td> 8602 8603 @foreach (VariantOption secondVariantOption in secondDimension) 8604 { 8605 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 8606 <td> 8607 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8608 </td> 8609 8610 columnCount++; 8611 8612 productLoopCounter++; 8613 } 8614 8615 <td> 8616 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8617 </td> 8618 </tr> 8619 8620 rowCount++; 8621 } 8622 8623 @{ 8624 columnCount = 0; 8625 } 8626 8627 <tr> 8628 <td>&nbsp;</td> 8629 @foreach (VariantOption secondVariantOption in secondDimension) 8630 { 8631 <td> 8632 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8633 </td> 8634 8635 columnCount++; 8636 } 8637 <td>&nbsp;</td> 8638 </tr> 8639 </tbody> 8640 } 8641 @if (groupCount == 3) 8642 { 8643 <thead> 8644 <tr> 8645 <td>&nbsp;</td> 8646 @foreach (VariantOption thirdVariantOption in thirdDimension) 8647 { 8648 <td>@thirdVariantOption.Name</td> 8649 } 8650 </tr> 8651 </thead> 8652 <tbody> 8653 @foreach (VariantOption firstVariantOption in firstDimension) 8654 { 8655 int colspan = (thirdDimension.Count + 1); 8656 8657 <tr> 8658 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 8659 </tr> 8660 8661 foreach (VariantOption secondVariantOption in secondDimension) 8662 { 8663 string variantId = ""; 8664 columnCount = 0; 8665 8666 <tr> 8667 <td class="u-min-w120px">@secondVariantOption.Name</td> 8668 8669 @foreach (VariantOption thirdVariantOption in thirdDimension) 8670 { 8671 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 8672 8673 <td> 8674 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8675 </td> 8676 8677 columnCount++; 8678 productLoopCounter++; 8679 } 8680 8681 <td> 8682 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8683 </td> 8684 </tr> 8685 rowCount++; 8686 } 8687 } 8688 8689 @{ 8690 columnCount = 0; 8691 } 8692 8693 <tr> 8694 <td>&nbsp;</td> 8695 @foreach (VariantOption thirdVariantOption in thirdDimension) 8696 { 8697 <td> 8698 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8699 </td> 8700 8701 columnCount++; 8702 } 8703 <td>&nbsp;</td> 8704 </tr> 8705 </tbody> 8706 } 8707 </table> 8708 8709 <script> 8710 document.addEventListener("DOMContentLoaded", function (event) { 8711 MatrixUpdateQuantity("@settings.ProductId"); 8712 }); 8713 8714 MatrixUpdateQuantity = function (productId) { 8715 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 8716 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 8717 8718 var qtyRowArr = []; 8719 var qtyColumnArr = []; 8720 8721 var totalQty = 0; 8722 8723 for (var i = 0; i < allQtyFields.length; i++) { 8724 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 8725 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 8726 } 8727 8728 for (var i = 0; i < allQtyFields.length; i++) { 8729 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 8730 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 8731 totalQty += parseFloat(allQtyFields[i].value); 8732 } 8733 8734 //Update row counters 8735 for (var i = 0; i < qtyRowArr.length; i++) { 8736 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8737 8738 if (qtyRowArr[i] != undefined && qtyCounter != null) { 8739 var currentCount = qtyCounter.innerHTML; 8740 qtyCounter.innerHTML = qtyRowArr[i]; 8741 8742 if (currentCount != qtyCounter.innerHTML) { 8743 qtyCounter.classList.add("qty-field--active"); 8744 } 8745 } 8746 8747 } 8748 8749 //Update column counters 8750 for (var i = 0; i < qtyColumnArr.length; i++) { 8751 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8752 8753 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 8754 var currentCount = qtyCounter.innerHTML; 8755 qtyCounter.innerHTML = qtyColumnArr[i]; 8756 8757 if (currentCount != qtyCounter.innerHTML) { 8758 qtyCounter.classList.add("qty-field--active"); 8759 } 8760 } 8761 } 8762 8763 if (document.getElementById("TotalQtyCount_" + productId)) { 8764 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 8765 } 8766 8767 //Clean up animations 8768 setTimeout(function () { 8769 for (var i = 0; i < qtyRowArr.length; i++) { 8770 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8771 if (qtyCounter != null) { 8772 qtyCounter.classList.remove("qty-field--active"); 8773 } 8774 } 8775 for (var i = 0; i < qtyColumnArr.length; i++) { 8776 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8777 if (qtyCounter != null) { 8778 qtyCounter.classList.remove("qty-field--active"); 8779 } 8780 } 8781 }, 1000); 8782 } 8783 </script> 8784 } 8785 } 8786 8787 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 8788 { 8789 string loopCount = productLoopCounter.ToString(); 8790 8791 bool combinationFound = false; 8792 double stock = 0; 8793 double quantityValue = 0; 8794 string note = ""; 8795 8796 VariantProduct variantProduct = null; 8797 8798 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 8799 { 8800 stock = variantProduct.Stock; 8801 quantityValue = variantProduct.Quantity; 8802 combinationFound = true; 8803 } 8804 8805 if (combinationFound) 8806 { 8807 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 8808 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 8809 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 8810 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 8811 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 8812 8813 if (stock != 0) 8814 { 8815 <small>@Translate("Stock") @stock</small> 8816 } 8817 8818 <script> 8819 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 8820 variantsCollection.push(variants); 8821 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 8822 </script> 8823 } 8824 else 8825 { 8826 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 8827 } 8828 } 8829 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8830 8831 @* Component *@ 8832 8833 @helper RenderAddToCart(AddToCart settings) 8834 { 8835 //set Id for quantity selector to get it's value from button 8836 if (settings.QuantitySelector != null) 8837 { 8838 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 8839 { 8840 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 8841 } 8842 8843 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 8844 8845 if (settings.Disabled) 8846 { 8847 settings.QuantitySelector.Disabled = true; 8848 } 8849 8850 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 8851 { 8852 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 8853 } 8854 } 8855 8856 if (settings.Disabled) 8857 { 8858 settings.AddButton.Disabled = true; 8859 } 8860 8861 settings.AddButton.CssClass += " btn--condensed"; 8862 8863 //unitsSelector 8864 if (settings.UnitSelector != null) 8865 { 8866 if (settings.Disabled) 8867 { 8868 settings.QuantitySelector.Disabled = true; 8869 } 8870 } 8871 8872 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8873 @if (settings.UnitSelector != null) 8874 { 8875 @Render(settings.UnitSelector) 8876 } 8877 @if (settings.QuantitySelector != null) 8878 { 8879 @Render(settings.QuantitySelector) 8880 } 8881 @Render(settings.AddButton) 8882 </div> 8883 } 8884 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8885 8886 @* Component *@ 8887 8888 @helper RenderAddToCartButton(AddToCartButton settings) 8889 { 8890 if (!settings.HideTitle) 8891 { 8892 if (string.IsNullOrEmpty(settings.Title)) 8893 { 8894 if (settings.BuyForPoints) 8895 { 8896 settings.Title = Translate("Buy with points"); 8897 } 8898 else 8899 { 8900 settings.Title = Translate("Add to cart"); 8901 } 8902 } 8903 } 8904 else 8905 { 8906 settings.Title = ""; 8907 } 8908 8909 if (settings.Icon == null) 8910 { 8911 settings.Icon = new Icon(); 8912 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 8913 } 8914 8915 if (string.IsNullOrEmpty(settings.Icon.Name)) 8916 { 8917 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 8918 } 8919 8920 settings.OnClick = "Cart.AddToCart(event, { " + 8921 "id: '" + settings.ProductId + "'," + 8922 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 8923 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 8924 (settings.BuyForPoints ? "buyForPoints: true," : "") + 8925 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 8926 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 8927 "});" + settings.OnClick; 8928 8929 @RenderButton(settings) 8930 } 8931 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8932 8933 @* Component *@ 8934 8935 @helper RenderUnitSelector(UnitSelector settings) 8936 { 8937 if (string.IsNullOrEmpty(settings.Id)) 8938 { 8939 settings.Id = Guid.NewGuid().ToString("N"); 8940 } 8941 var disabledClass = settings.Disabled ? "disabled" : ""; 8942 8943 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 8944 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8945 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 8946 <div class="dropdown__content dw-mod"> 8947 @settings.OptionsContent 8948 </div> 8949 <label class="dropdown-trigger-off" for="@settings.Id"></label> 8950 </div> 8951 } 8952 @using System.Reflection 8953 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8954 8955 @* Component *@ 8956 8957 @helper RenderQuantitySelector(QuantitySelector settings) 8958 { 8959 var attributes = new Dictionary<string, string>(); 8960 8961 /*base settings*/ 8962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 8963 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 8964 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 8965 if (settings.Disabled) { attributes.Add("disabled", "true"); } 8966 if (settings.Required) { attributes.Add("required", "true"); } 8967 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 8968 /*end*/ 8969 8970 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 8971 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 8972 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 8973 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 8974 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 8975 if (settings.Min == null) { settings.Min = 1; } 8976 attributes.Add("min", settings.Min.ToString()); 8977 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 8978 if (settings.Value == null) { settings.Value = 1; } 8979 attributes.Add("value", settings.Value.ToString()); 8980 attributes.Add("type", "number"); 8981 8982 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8983 8984 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 8985 } 8986 @using Dynamicweb.Rapido.Blocks.Components 8987 8988 @using Dynamicweb.Frontend 8989 @using Dynamicweb.Frontend.Devices 8990 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8991 @using Dynamicweb.Rapido.Blocks.Components.General 8992 @using System.Collections.Generic; 8993 8994 @* Component *@ 8995 8996 @helper RenderCustomerCenterList(CustomerCenterList settings) 8997 { 8998 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 8999 string hideActions = isTouchDevice ? "u-block" : ""; 9000 9001 <table class="table data-list dw-mod"> 9002 @if (settings.GetHeaders().Length > 0) { 9003 <thead> 9004 <tr class="u-bold"> 9005 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 9006 { 9007 var attributes = new Dictionary<string, string>(); 9008 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 9009 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 9010 attributes.Add("align", header.Align.ToString()); 9011 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9012 9013 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 9014 } 9015 </tr> 9016 </thead> 9017 } 9018 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 9019 { 9020 int columnCount = 0; 9021 int totalColumns = listItem.GetInfoItems().Length; 9022 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-acions" : ""; 9023 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 9024 9025 var attributes = new Dictionary<string, string>(); 9026 var width = Pageview.Device.ToString() != "Mobile" ? "150" : "100"; 9027 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 9028 9029 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9030 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 9031 <tr> 9032 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 9033 <td onclick="@listItem.OnClick" class="data-list__main-item dw-mod" width="@width"> 9034 @if (!string.IsNullOrEmpty(listItem.Title)) { 9035 <div class="u-bold">@listItem.Title</div> 9036 } 9037 @if (!string.IsNullOrEmpty(listItem.Description)) { 9038 <div>@listItem.Description</div> 9039 } 9040 </td> 9041 } 9042 9043 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 9044 { 9045 var infoAttributes = new Dictionary<string, string>(); 9046 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 9047 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 9048 infoAttributes.Add("align", infoItem.Align.ToString()); 9049 9050 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9051 string columnClick = columnCount < (totalColumns-2) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 9052 9053 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 9054 @if (!string.IsNullOrEmpty(infoItem.Title)) { 9055 <div>@infoItem.Title</div> 9056 } 9057 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 9058 <div><small>@infoItem.Subtitle</small></div> 9059 } 9060 </td> 9061 9062 columnCount++; 9063 } 9064 </tr> 9065 <tr> 9066 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 9067 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 9068 @foreach (ButtonBase action in listItem.GetActions()) 9069 { 9070 action.ButtonLayout = ButtonLayout.LinkClean; 9071 action.CssClass += " data-list__action-button link"; 9072 9073 @Render(action) 9074 } 9075 </div> 9076 </td> 9077 </tr> 9078 </tbody> 9079 } 9080 </table> 9081 } 9082 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9083 9084 @using System 9085 @using System.Web 9086 @using System.Collections.Generic 9087 @using Dynamicweb.Rapido.Blocks.Extensibility 9088 @using Dynamicweb.Rapido.Blocks 9089 9090 @{ 9091 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 9092 9093 Block primaryBottomSnippets = new Block() 9094 { 9095 Id = "MasterJavascriptInitializers", 9096 SortId = 100, 9097 Template = RenderPrimaryBottomSnippets() 9098 }; 9099 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 9100 } 9101 9102 @helper RenderPrimaryBottomSnippets() 9103 { 9104 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 9105 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 9106 9107 if (isWireframeMode) 9108 { 9109 <script> 9110 Wireframe.Init(true); 9111 </script> 9112 } 9113 9114 9115 if (useGoogleTagManager) 9116 { 9117 <script> 9118 document.addEventListener('addToCart', function(event) { 9119 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9120 if (typeof googleImpression == "string") { 9121 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9122 } 9123 dataLayer.push({ 9124 'event': 'addToCart', 9125 'ecommerce': { 9126 'currencyCode': googleImpression.currency, 9127 'add': { 9128 'products': [{ 9129 'name': googleImpression.name, 9130 'id': googleImpression.id, 9131 'price': googleImpression.price, 9132 'brand': googleImpression.brand, 9133 'category': googleImpression.category, 9134 'variant': googleImpression.variant, 9135 'quantity': event.detail.quantity 9136 }] 9137 } 9138 } 9139 }); 9140 }); 9141 </script> 9142 } 9143 9144 //if digitalwarehouse 9145 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 9146 { 9147 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 9148 9149 if (string.IsNullOrEmpty(cartContextId)) 9150 { 9151 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 9152 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 9153 cartContextId = cartSettings.OrderContextID; 9154 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 9155 } 9156 9157 <script> 9158 let downloadCart = new DownloadCart({ 9159 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 9160 contextId: "@cartContextId", 9161 addButtonText: "@Translate("Add")", 9162 removeButtonText: "@Translate("Remove")" 9163 }); 9164 </script> 9165 } 9166 9167 <!--$$Javascripts--> 9168 } 9169 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9170 @using System 9171 @using System.Web 9172 @using System.Collections.Generic 9173 @using Dynamicweb.Ecommerce.WebAPI.Controllers 9174 @using Dynamicweb.Ecommerce.Frontend 9175 @using Dynamicweb.Rapido.Blocks 9176 @using Degree.Kraemer.Rma.Infrastructure.Authentication 9177 9178 @functions{ 9179 9180 public string ReturnCustomFieldValue(string customFieldSystemName) 9181 { 9182 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 9183 9184 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9185 { 9186 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9187 } 9188 else if (Model.CurrentUser != null && Model.CurrentUser.ID > 0) 9189 { 9190 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9191 } 9192 var currentUserLocation = ""; 9193 9194 if (userCustomFields != null) 9195 { 9196 foreach (var field in userCustomFields) 9197 { 9198 if (field.CustomField.SystemName == customFieldSystemName) 9199 { 9200 currentUserLocation = field.Value.ToString(); 9201 } 9202 } 9203 } 9204 else 9205 { 9206 currentUserLocation = "test"; 9207 } 9208 9209 return currentUserLocation; 9210 } 9211 9212 public bool getPromptForAccount() 9213 { 9214 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.CurrentSecondaryUser; 9215 var user = secondaryUser != null ? secondaryUser : Dynamicweb.Security.UserManagement.User.get_Current(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend); 9216 // bool userIsMain = Model.CurrentSecondaryUser.ID == 0; 9217 var promptForAccount = user != null ? user.CustomFieldValues.First(f => f.CustomField.SystemName == "AccessUser_PromptForAccount").Value.ToString() == "True" : false; 9218 9219 return promptForAccount; 9220 } 9221 9222 } 9223 9224 @{ 9225 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 9226 } 9227 9228 @{ 9229 Block SideNavigation = new Block() 9230 { 9231 Id = "SideNavigation", 9232 SortId = 5, 9233 Template = RenderSideNavigation(), 9234 SkipRenderBlocksList = true 9235 }; 9236 Block userLocationModal = new Block() 9237 { 9238 Id = "UserLocationsModal", 9239 SortId = 10, 9240 Template = RenderUserLocations(), 9241 SkipRenderBlocksList = true 9242 }; 9243 masterCustomBlocksPage.Add(userLocationModal); 9244 9245 Block newRMAModal = new Block() 9246 { 9247 Id = "newRmaModal", 9248 SortId = 109, 9249 Template = RenderNewRmaForm(), 9250 SkipRenderBlocksList = true 9251 }; 9252 9253 masterCustomBlocksPage.Add(newRMAModal); 9254 Block viewRMADetails = new Block() 9255 { 9256 Id = "newRmaModal", 9257 SortId = 108, 9258 Template = RenderNewRmaViewDetails(), 9259 SkipRenderBlocksList = true 9260 }; 9261 9262 masterCustomBlocksPage.Add(viewRMADetails); 9263 Block viewRMAFullOrderDetails = new Block() 9264 { 9265 Id = "newRmaModalFullOrder", 9266 SortId = 107, 9267 Template = RenderNewRmaViewFullOrderDetails(), 9268 SkipRenderBlocksList = true 9269 }; 9270 9271 masterCustomBlocksPage.Add(viewRMAFullOrderDetails); 9272 Block RmaViewDetailsEditableBlock = new Block() 9273 { 9274 Id = "DraftRmaModal", 9275 SortId = 105, 9276 Template = RenderNewRmaViewDetailsEditable(), 9277 SkipRenderBlocksList = true 9278 }; 9279 9280 masterCustomBlocksPage.Add(RmaViewDetailsEditableBlock); 9281 Block viewOrderDetails = new Block() 9282 { 9283 Id = "newOrderHistoryDetailsModal", 9284 SortId = 106, 9285 Template = RenderNewOrderHistoryViewDetails(), 9286 SkipRenderBlocksList = true 9287 }; 9288 9289 masterCustomBlocksPage.Add(viewOrderDetails); 9290 Block newCartModal = new Block() 9291 { 9292 Id = "NewCartModal", 9293 SortId = 20, 9294 Template = RenderNewCartModal(), 9295 SkipRenderBlocksList = true 9296 }; 9297 masterCustomBlocksPage.Add(newCartModal); 9298 9299 Block newCartNameModal = new Block() 9300 { 9301 Id = "CartNameModal", 9302 SortId = 50, 9303 Template = RenderNewCartNameModal(), 9304 SkipRenderBlocksList = true 9305 }; 9306 masterCustomBlocksPage.Add(newCartNameModal); 9307 9308 if (Model.HasSecondaryUsers) 9309 { 9310 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9311 { 9312 Block impersonationListModal = new Block() 9313 { 9314 Id = "ImpersonationListModal", 9315 SortId = 30, 9316 Template = RenderImpersonationModal(), 9317 SkipRenderBlocksList = true 9318 }; 9319 9320 masterCustomBlocksPage.Add(impersonationListModal); 9321 } 9322 else 9323 { 9324 Block impersonationListModal = new Block() 9325 { 9326 Id = "ImpersonationListModal", 9327 SortId = 30, 9328 Template = RenderImpersonationModal(), 9329 SkipRenderBlocksList = true 9330 }; 9331 9332 masterCustomBlocksPage.Add(impersonationListModal); 9333 } 9334 9335 Block impersonationTemplate = new Block() 9336 { 9337 Id = "ImpersonationTemplate", 9338 SortId = 40, 9339 Template = RenderImpersonationListSelect() 9340 }; 9341 masterCustomBlocksPage.Add("MasterHeader", impersonationTemplate); 9342 } 9343 Block quickViewModal = new Block() 9344 { 9345 Id = "QuickViewModal", 9346 SortId = 60, 9347 Template = RenderQuickViewModal(), 9348 SkipRenderBlocksList = true 9349 }; 9350 9351 masterCustomBlocksPage.Add(quickViewModal); 9352 // masterCustomBlocksPage.Add(MasterBlockId.MasterMain, UserLocationModal); 9353 9354 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 9355 { 9356 Id = "CartListScript", 9357 Template = RenderCartsListSelect() 9358 }); 9359 9360 if (Model.CurrentUser.ID > 0) 9361 { 9362 Modal stopImpersonation = new Modal 9363 { 9364 Id = "StopImpersonation", 9365 Heading = new Heading 9366 { 9367 Level = 2, 9368 Title = Translate("Sign out"), 9369 Icon = new Icon 9370 { 9371 Name = "fa-sign-out", 9372 Prefix = "fas", 9373 LabelPosition = IconLabelPosition.After 9374 } 9375 }, 9376 Width = ModalWidth.Md, 9377 BodyTemplate = RenderStopImpersonationForm() 9378 }; 9379 9380 Block stopCustomImpersonation = new Block 9381 { 9382 Id = "StopImpersonationBlock", 9383 SortId = 10, 9384 Component = stopImpersonation 9385 }; 9386 masterCustomBlocksPage.RemoveBlockById("StopImpersonationBlock"); 9387 masterCustomBlocksPage.Add(stopCustomImpersonation); 9388 } 9389 Block emptyCartModal = new Block() 9390 { 9391 Id = "EmptyCartModal", 9392 SortId = 80, 9393 Template = RenderEmptyCartModal(), 9394 SkipRenderBlocksList = true 9395 }; 9396 9397 masterCustomBlocksPage.Add(emptyCartModal); 9398 9399 Block stepQuantityErrorModal = new Block() 9400 { 9401 Id = "StepQuantityErrorModal", 9402 SortId = 90, 9403 Template = RenderStepQuantityErrorModal() 9404 }; 9405 9406 masterCustomBlocksPage.Add(stepQuantityErrorModal); 9407 9408 } 9409 @{ 9410 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9411 9412 } 9413 9414 @helper RenderSideNavigation() 9415 {<p>test</p>} 9416 9417 @helper RenderUserLocations() 9418 { 9419 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 9420 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 9421 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9422 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9423 Modal getLocations = new Modal 9424 { 9425 Id = "UserLocationModal", 9426 Heading = new Heading 9427 { 9428 Level = 2, 9429 Title = Translate("Select a location") 9430 }, 9431 Width = ModalWidth.Md, 9432 BodyTemplate = RenderUserLocationsContentModal() 9433 }; 9434 if (userExists && !string.IsNullOrEmpty(customerNumber)) 9435 { 9436 <div data-location="@currentUserLocation" data-location-list="@locationList"></div> 9437 9438 if (currentUserLocation == "") 9439 { 9440 <div> @Render(getLocations) </div> 9441 } 9442 } 9443 } 9444 9445 @helper RenderUserLocationsContentModal() 9446 { 9447 <div> 9448 @RenderLocationsSelect() 9449 @Render(new Button 9450 { 9451 Title = Translate("Set location"), 9452 ButtonType = ButtonType.Button, 9453 ButtonLayout = ButtonLayout.Primary, 9454 CssClass = "u-no-margin", 9455 OnClick = "addLocation(document.querySelector('#UserLocationModalModal #LocationsSelect'))" 9456 }) 9457 </div> 9458 } 9459 9460 @helper RenderLocationsSelect() 9461 { 9462 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9463 List<string> locations = locationList.ToString().Split(',').ToList(); 9464 SelectField selectField = new SelectField 9465 { 9466 Id = "LocationsSelect", 9467 Label = Translate("Select a location"), 9468 CssClass = "u-margin-bottom", 9469 Required = true 9470 }; 9471 9472 foreach (var loc in locations) 9473 { 9474 string label; 9475 string code; 9476 string askoCode; 9477 string[] parts = loc.Split('|'); 9478 if (parts.Length >= 3) 9479 { 9480 label = parts[0].Trim(); 9481 code = parts[1].Trim(); 9482 askoCode = parts[2].Trim(); 9483 } 9484 else 9485 { 9486 label = parts[0].Trim(); 9487 code = parts[1].Trim(); 9488 } 9489 selectField.Options.Add(new SelectFieldOption { Label = label, Value = code }); 9490 } 9491 @Render(selectField) 9492 } 9493 9494 @helper RenderNewCartModal() 9495 { 9496 var newCartModal = new Modal 9497 { 9498 Id = "NewCart", 9499 Heading = new Heading { Title = Translate("Create New Cart") }, 9500 Width = ModalWidth.Md, 9501 BodyTemplate = RenderNewCartContentModal() 9502 }; 9503 9504 <div>@Render(newCartModal) </div> 9505 } 9506 9507 @helper RenderNewCartContentModal() 9508 { 9509 var baseurl = HttpContext.Current.Request.Url.ToString(); 9510 string currentUserId = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUserId().ToString(); 9511 var newCartURL = baseurl.Contains("?") ? baseurl + "&redirect=false&cartcmd=createnew&CartUserId=" + currentUserId + "&CartName=" : baseurl + "?cartcmd=createnew&redirect=false&CartUserId=" + currentUserId + "&CartName="; 9512 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9513 var cartsListFeedPageId = "/Default.aspx?ID=" + GetPageIdByNavigationTag("CartsListFeed"); 9514 9515 <div> 9516 <form method="post" id="NewCartForm" data-submit-url="@newCartURL" data-carts-url="@cartsListFeedPageId" data-change-cart-url="@setCartURL"> 9517 @Render(new HiddenField { Id = "CartUserId", Name = "CartUserId", Value = currentUserId }) 9518 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "createnew" }) 9519 @Render(new TextField { Id = "CartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Cart Name"), Required = true }) 9520 @*@Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Create") })*@ 9521 <button type="button" id="CreateNewCartButton" class="btn btn--primary dw-mod">@Translate("Create")</button> 9522 </form> 9523 </div> 9524 } 9525 9526 @helper RenderNewCartNameModal() 9527 { 9528 var newCartNameModal = new Modal 9529 { 9530 Id = "NewCartName", 9531 Heading = new Heading { Title = Translate("ChangeCartName") }, 9532 Width = ModalWidth.Md, 9533 BodyTemplate = RenderNewCartNameContentModal() 9534 }; 9535 9536 <div>@Render(newCartNameModal) </div> 9537 } 9538 9539 @helper RenderNewCartNameContentModal() 9540 { 9541 <form method="post"> 9542 @Render(new HiddenField { Id = "CartID", Name = "CartID", Value = "" }) 9543 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "setname" }) 9544 @Render(new TextField { Id = "NewCartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Enter New Name"), Required = true }) 9545 @Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Endre navn") }) 9546 </form> 9547 } 9548 9549 @helper RenderImpersonationModal() 9550 { 9551 bool userExists = Model.CurrentUser?.ID != null && Model.CurrentUser.ID > 0; 9552 var promptForAccount = getPromptForAccount(); 9553 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9554 string headerMessage = isImpersonating ? Translate("Change account") : Translate("Secondary Users"); 9555 Modal secondaryUsers = new Modal 9556 { 9557 9558 Id = "SecondarUsersModal", 9559 Heading = new Heading 9560 { 9561 Level = 2, 9562 Title = headerMessage 9563 }, 9564 9565 Width = ModalWidth.Md, 9566 BodyTemplate = RenderImpersonationContentModal() 9567 }; 9568 <div data-prompt-account="@promptForAccount">@Render(secondaryUsers)</div> 9569 } 9570 9571 @helper RenderImpersonationContentModal() 9572 { 9573 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9574 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9575 string buttonTitle = isImpersonating ? Translate("Choose user") : Translate("Set user"); 9576 9577 <div class="u-margin-right u-margin-bottom">@Translate("Choose user to impersonate:")</div> 9578 <div class="impersonation-container"> 9579 <input type="checkbox" id="ImpersonationSelect_modal" class="dropdown-trigger" /> 9580 <div class="dropdown variants-filters dw-mod"> 9581 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_modal">@Translate("Choose user")</label> 9582 <div class="dropdown__content u-padding dw-mod"> 9583 <div class="dropdown__item__filter"> 9584 <input type="text" data-container-id="impersonationListModal" data-view-type="modal" placeholder="@Translate("Search")"> 9585 </div> 9586 <div class="js-handlebars-root dw-mod u-margin-bottom" id="impersonationListModal" data-template="ImpersonationListContent" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9587 </div> 9588 <label class="dropdown-trigger-off" for="ImpersonationSelect_modal"></label> 9589 </div> 9590 </div> 9591 @Render(new Button 9592 { 9593 Title = buttonTitle, 9594 ButtonType = ButtonType.Button, 9595 ButtonLayout = ButtonLayout.Primary, 9596 CssClass = "u-no-margin u-margin-top", 9597 ExtraAttributes = new Dictionary<string, string> 9598 { 9599 { "data-role", "impersonate-submit" } 9600 } 9601 // OnClick = "sessionStorage.setItem('impersonationModalOpen', 'true'); sessionStorage.setItem('recentlyLoggedIn', 'true'); localStorage.removeItem('userLocation'); document.getElementById(document.querySelector('#SecondarUsersModalModal .dropdown__header').getAttribute('data-value')).submit();" 9602 }) 9603 } 9604 9605 @helper RenderImpersonationListSelect() 9606 { 9607 bool promtForAccount = getPromptForAccount(); 9608 9609 if (promtForAccount) 9610 { 9611 <script id="ImpersonationListContent" data-test="1" type="text/x-template"> 9612 9613 {{#.}} 9614 {{#Users}} 9615 {{#if main}} 9616 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9617 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9618 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9619 </form> 9620 {{else}} 9621 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9622 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9623 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9624 </form> 9625 {{/if}} 9626 {{/Users}} 9627 {{/.}} 9628 </script> 9629 } 9630 else 9631 { 9632 <script id="ImpersonationListContent" data-test="2" type="text/x-template"> 9633 9634 {{#.}} 9635 {{#ifCond totalUsers "!==" "2"}} 9636 9637 {{#Users}} 9638 {{#if main}} 9639 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9640 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9641 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9642 </form> 9643 {{else}} 9644 9645 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'false');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9646 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9647 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9648 </form> 9649 {{/if}} 9650 {{/Users}} 9651 9652 {{/ifCond}} 9653 {{/.}} 9654 </script> 9655 } 9656 9657 <script id="ImpersonationListContentHeader" type="text/x-template"> 9658 {{#.}} 9659 {{#Users}} 9660 {{#if main}} 9661 {{#if secondaryUser}} 9662 {{#unless hideSelf}} 9663 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9664 {{/unless}} 9665 {{else}} 9666 {{#unless hideSelf}} 9667 {{#ifCond ../totalUsers "!==" 2}} 9668 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'true');logOutCurrentUser()" tabindex="0">{{name}}</div> 9669 {{else}} 9670 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9671 {{/ifCond}} 9672 {{/unless}} 9673 {{/if}} 9674 9675 {{else}} 9676 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span><span>{{formatCustomerNumber customerNumber}}<span></div> 9677 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9678 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9679 </form> 9680 {{/if}} 9681 {{/Users}} 9682 9683 {{/.}} 9684 </script> 9685 } 9686 9687 @helper RenderQuickViewModal() 9688 { 9689 <div class="quick-view-modal"> 9690 @Render(new Modal 9691 { 9692 Id = "ProductDetailQuickView", 9693 Heading = new Heading 9694 { 9695 Level = 3, 9696 Title = "", 9697 CssClass = "bs-margin-bottom-0 bs-border-none" 9698 }, 9699 Width = ModalWidth.Full, 9700 Height = ModalHeight.Full, 9701 BodyText = "" 9702 }) 9703 </div> 9704 } 9705 9706 @helper RenderCartsListSelect() 9707 { 9708 var baseurl = HttpContext.Current.Request.Url.ToString(); 9709 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9710 9711 <script id="CartsListContent" type="text/x-template"> 9712 {{#.}} 9713 <select id="CartsSelect" class="u-full-width u-margin-bottom" data-url="@setCartURL"> 9714 @*<option>@Translate("Change Cart")</option>*@ 9715 {{#Carts}} 9716 <option value="{{id}}" data-active="{{isCartActive}}" {{selected}}>{{name}}</option> 9717 {{/Carts}} 9718 </select> 9719 {{/.}} 9720 </script> 9721 } 9722 9723 @helper RenderEmptyCartModal() 9724 { 9725 @Render(new Modal 9726 { 9727 Id = "EmptyCartModal", 9728 Heading = new Heading 9729 { 9730 Level = 3, 9731 Title = Translate("cartEmptyDisclaimer"), 9732 CssClass = "u-margin-bottom" 9733 }, 9734 Width = ModalWidth.Md, 9735 BodyTemplate = RenderEmptyCartModalBody() 9736 }) 9737 } 9738 9739 @helper RenderEmptyCartModalBody() 9740 { 9741 <div class="u-flex grid--justify-space-between"> 9742 <button type="button" title="@Translate("Yes")" class="btn empty-cart btn--primary dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event); document.getElementById('EmptyCartModalModalTrigger').checked = false; sessionStorage.setItem('minicartState', 'closed'); getContentFirstCart();">@Translate("Yes")</button> 9743 <button type="button" title="@Translate("No")" class="btn empty-cart btn--secondary dw-mod u-no-margin u-margin-bottom" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = false;">@Translate("No")</button> 9744 </div> 9745 } 9746 9747 @helper RenderStepQuantityErrorModal() 9748 { 9749 Modal stepQuantityError = new Modal 9750 { 9751 Id = "StepQuantityError", 9752 Heading = new Heading { Title = Translate("Quantity error") }, 9753 Width = ModalWidth.Md, 9754 BodyTemplate = RenderErrorModalContent() 9755 }; 9756 9757 <div>@Render(stepQuantityError)</div> 9758 } 9759 9760 @helper RenderErrorModalContent() 9761 { 9762 <div class="u-padding"> 9763 <h5 class="u-margin-bottom"> 9764 <span class="product-name"></span> 9765 </h5> 9766 <h5 class="quantity-change-error-text-multiple"> 9767 @Translate("add multi quantity") 9768 <span class="product-quantity"></span> 9769 </h5> 9770 <h5 class="quantity-change-error-text-zero u-hidden"> 9771 @Translate("Please insert the minimum quantity") 9772 <span class="product-quantity"></span> 9773 </h5> 9774 </div> 9775 } 9776 9777 @helper RenderNewRmaViewDetails() 9778 { 9779 Modal rmaViewDetails = new Modal 9780 { 9781 Id = "rmaViewDetails", 9782 Heading = new Heading { Title = Translate("AVVIK") }, 9783 BodyTemplate = RmaViewDetails() 9784 }; 9785 <div data-ref="rmaViewDetails">@Render(rmaViewDetails)</div> 9786 } 9787 @helper RenderNewOrderHistoryViewDetails() 9788 { 9789 Modal orderHistoryDetails = new Modal 9790 { 9791 Id = "rmaViewDetails2", 9792 Heading = new Heading { Title = Translate("ORDREBEKREFTELSE") }, 9793 BodyTemplate = ViewOrderDetails2() 9794 }; 9795 <div data-ref="orderHistoryDetails">@Render(orderHistoryDetails)</div> 9796 } 9797 @helper RenderNewRmaForm() 9798 { 9799 Modal newRmaForm = new Modal 9800 { 9801 Id = "rmaForm", 9802 Heading = new Heading { Title = Translate("AVVIK") }, 9803 BodyTemplate = RmaFormContent() 9804 }; 9805 <div data-ref="newRMA">@Render(newRmaForm)</div> 9806 } 9807 9808 @helper RenderNewRmaViewFullOrderDetails() 9809 { 9810 Modal rmaViewDetailsFullOrder = new Modal 9811 { 9812 Id = "rmaViewDetailsFullOrder", 9813 Heading = new Heading { Title = Translate("AVVIK") }, 9814 BodyTemplate = RmaViewDetailsFullOrder() 9815 }; 9816 <div>@Render(rmaViewDetailsFullOrder)</div> 9817 } 9818 9819 @helper RenderNewRmaViewDetailsEditable() 9820 { 9821 Modal rmaViewDetailsEditable = new Modal 9822 { 9823 Id = "rmaViewDetailsEditable", 9824 Heading = new Heading { Title = Translate("AVVIK") }, 9825 BodyTemplate = RmaViewDetailsEditable() 9826 }; 9827 <div>@Render(rmaViewDetailsEditable)</div> 9828 } 9829 9830 @helper RmaFormContent() 9831 { 9832 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9833 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 9834 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 9835 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 9836 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 9837 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 9838 var company = Model.CurrentUser.Company; 9839 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 9840 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9841 @*<h1>@userID</h1> 9842 <h1>@token</h1>*@ 9843 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 9844 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 9845 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 9846 <div class="u-hidden" id="CurrentUserCompany" data-customer-company="@isCompanyKraemer"></div> 9847 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 9848 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 9849 9850 <div class="rma-modal__container"> 9851 9852 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-container" data-template="rma-form-hidden-inputs" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 9853 9854 <header class="bs-d-flex bs-flex-column bs-flex-xl-row bs-flex-wrap bs-gap-3 bs-gap-lg-5 rma-modal__header"> 9855 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 9856 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 9857 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 9858 @*<h1 class="mb-0">@Model.SecondaryUsers.Count</h1>*@ 9859 <div class="bs-d-flex bs-flex-column bs-flex-md-row bs-gap-3"> 9860 @if (Model.HasSecondaryUsers) 9861 { 9862 <div class="modal__select-rma impersonation-container-filter-rma create-rma-modal"> 9863 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 9864 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9865 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose user")</label> 9866 <div class="dropdown__content u-padding dw-mod"> 9867 <div class="dropdown__item__filter"> 9868 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9869 </div> 9870 <div class=" js-handlebars-root dw-mod" id="impersonationListFilterCreateRmaModal" data-template="ImpersonationListContentFilterCreateRmaModal" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9871 </div> 9872 </div> 9873 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 9874 </div> 9875 } 9876 9877 <div class="modal__select-rma"> 9878 <div class="order-container-filter create-rma-modal"> 9879 <input type="checkbox" id="OrderSelect" class="dropdown-trigger" /> 9880 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9881 <label class="dropdown__header dropdown__btn dw-mod" for="OrderSelect" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose an order")</label> 9882 <div class="dropdown__content u-padding dw-mod"> 9883 <div class="dropdown__item__filter"> 9884 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9885 </div> 9886 <div class=" js-handlebars-root dw-mod" id="RMA-Order-Select-container" data-template="RMA-Order-Select" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"> 9887 </div> 9888 </div> 9889 <label class="dropdown-trigger-off" for="OrderSelect"></label> 9890 </div> 9891 </div> 9892 </div> 9893 </div> 9894 </header> 9895 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9896 <div class="bs-d-flex"> 9897 <div class="toast-body"> 9898 @Translate("Please fill all required fields") 9899 </div> 9900 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9901 </div> 9902 </div> 9903 <div class="rma-modal__selected-order orderline-form"> 9904 9905 @* Switch between full order rma and orderline RMA *@ 9906 <div class="rma-modal-container bs-px-3 form-orderline"> 9907 <div class="modal-container__content u-hidden"> 9908 <div class="bs-grid rma-modal-container bs-mt-5"> 9909 <div class="g-col-md-1 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9910 <div class="g-col-md-5 g-col-12 d-flex u-flex--row bs-align-items-center bs-justify-content-center bs-position-relative"> 9911 <input type="text" id="SearchOrderlinesInput" name="search-rma" placeholder="@Translate("Søk etter produkt...")" class="mb-0 form-control search-ahead__input"> 9912 <button type="button" id="SearchOrderlinesButton" class="search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9913 <i class="far fa-search bs-px-2"></i> 9914 </button> 9915 <button type="button" id="RemoveSearchOrderlinesButton" class=" u-hidden search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9916 <i class="far fa-times bs-px-2"></i> 9917 </button> 9918 </div> 9919 <div class="g-col-md-3 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9920 <div class="g-col-md-3 g-col-12 bs-d-grid"> 9921 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-w-100 bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1" style="justify-self:end;">@Translate("Hel order")</button> 9922 </div> 9923 </div> 9924 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 9925 <div class="u-border-bottom rma-page__header-grid-container rma-header"> 9926 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 9927 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 9928 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksårsak")</div> 9929 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert")</div> 9930 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksantall")</div> 9931 @* <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert Antall")</div>*@ 9932 </div> 9933 </div> 9934 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9935 <div class="bs-d-flex"> 9936 <div class="toast-body"> 9937 @Translate("Please fill all required fields") 9938 </div> 9939 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9940 </div> 9941 </div> 9942 </div> 9943 @* products loop *@ 9944 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-orderlines-container" data-template="rma-form-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 9945 </div> 9946 </div> 9947 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 9948 <div class="rma-modal-container"> 9949 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9950 <div class="bs-d-flex"> 9951 <div class="toast-body"> 9952 @Translate("Please fill all required fields") 9953 </div> 9954 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9955 </div> 9956 </div> 9957 <div class="d-flex bs-flex-wrap bs-gap-3 bs-flex-row bs-justify-content-between bs-mt-5 bs-mb-2 rma-options-container"> 9958 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 9959 <option value="0">@Translate("Avviksårsak")</option> 9960 <option value="1">@Translate("Faktura")</option> 9961 <option value="3">@Translate("Kvalitet")</option> 9962 <option value="2">@Translate("Pakking")</option> 9963 <option value="4">@Translate("Vedlikehold")</option> 9964 <option value="5">@Translate("Feil Levert")</option> 9965 <option value="6">@Translate("Multiple")</option> 9966 </select> 9967 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 9968 </div> 9969 <div class="inputComment bs-w-100 bs-mt-5"> 9970 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 9971 @* 9972 <label for="FullOrderComment">@Translate("Avvikskommentar")</label> 9973 *@ 9974 </div> 9975 <div class="inputComment bs-w-100 bs-mt-3"> 9976 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 9977 </div> 9978 <input class="create-rma-form-input form-control create-rma-Attachment-input bs-mt-3" id="CreateRmaFormAttachmentFull" name="FullOrderAttachment" type="file" multiple="multiple" /> 9979 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 9980 </div> 9981 <div class="bs-mt-5 bs-w-50 bs-mb-5"> 9982 <div class="orderInfo d-flex bs-justify-content-between"> 9983 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Antall produktlinjer")</p> 9984 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-orderlines">7</p> 9985 </div> 9986 <div class="orderInfo d-flex bs-justify-content-between"> 9987 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Totalt antall produkter")</p> 9988 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-quantity">289</p> 9989 </div> 9990 <div class="orderInfo d-flex bs-justify-content-between"> 9991 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Ordretotal eks. MVA")</p> 9992 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-amount">35 897,18 kr </p> 9993 </div> 9994 </div> 9995 </div> 9996 </div> 9997 9998 <footer class="modal__rma-footer"> 9999 <div class="footer-button-container"> 10000 <button class="submit-rma-button disabled submit-rma-button bs-btn bs-btn-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,true)">@Translate("Opprett Avvik")</button> 10001 </div> 10002 <div class="modal__rma-footer-icon-buttons"> 10003 </div> 10004 </footer> 10005 </div> 10006 <script id="ImpersonationListContentFilterCreateRmaModal" type="text/x-template"> 10007 {{#.}} 10008 {{#Users}} 10009 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 10010 {{/Users}} 10011 {{/.}} 10012 </script> 10013 10014 <script id="rma-form-hidden-inputs" type="text/x-template"> 10015 {{#.}} 10016 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 10017 <input name="deviationId" value="0" type="text" class="u-hidden" /> 10018 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 10019 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 10020 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 10021 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 10022 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 10023 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 10024 {{/.}} 10025 </script> 10026 10027 <script id="rma-form-orderlines" type="text/x-template"> 10028 {{#.}} 10029 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" data-product-name="{{orderLineProductName}}" data-product-number="{{orderLineProductNumber}}" style="border-color: #597CCA;"> 10030 <input type="hidden" name="productId" value="{{orderLineProductId}}" /> 10031 <input name="deviationId" value="{{orderId}}" type="text" class="u-hidden" /> 10032 <input name="deviationOrderLineId" value="{{orderId}}" type="text" class="u-hidden" /> 10033 <input name="deviationLineId" value="0" type="text" class="u-hidden" /> 10034 10035 <input type="hidden" name="productNumber" value="{{orderLineProductNumber}}" /> 10036 <input type="hidden" name="productName" value="{{orderLineProductName}}" /> 10037 <input type="hidden" name="productImage" value="{{#if orderLineProductImage}}{{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 10038 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10039 <input type="hidden" name="supplierName" value="{{orderLineSupplierName}}" /> 10040 <div class="rma-form-grid-item rma-table-item"> 10041 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10042 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10043 </div> 10044 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row bs-align-items-center"> 10045 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10046 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="rma-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 10047 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}" data-test="44444">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 10048 </div> 10049 </div> 10050 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10051 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10052 <option value="0">@Translate("Avviksårsak")</option> 10053 <option value="1">@Translate("Faktura")</option> 10054 <option value="3">@Translate("Kvalitet")</option> 10055 <option value="2">@Translate("Pakking")</option> 10056 <option value="4">@Translate("Vedlikehold")</option> 10057 <option value="5">@Translate("Feil Levert")</option> 10058 <option value="6">@Translate("Multiple")</option> 10059 </select> 10060 </div> 10061 10062 <div class=" rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 10063 <input type="hidden" name="deliveredQuantity" value="{{orderLineQuantity}}" /> 10064 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{orderLineUnitPrice}}" /> 10065 <input type="hidden" name="Total-Test-orderLineUnitPrice" value="{{orderLineTotalPrice}}" /> 10066 10067 <div class="fw-700 rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10068 <input class="create-rma-form-input create-rma-quantity-input disabled" data-delivered-quantity="{{orderLineQuantity}}" @*value="{{orderLineQuantity}}"*@ value="0" name="deviationQuantity" type="number" min="0" step="1" oninput="showAdditionalOrderlineFields(this, this.value)" max="{{orderLineQuantity}}" /> 10069 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 u-hidden removeOrderlineButton" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10070 <i class="far fa-times bs-text-danger bs-px-2"></i> 10071 </button> 10072 </div> 10073 </div> 10074 <div class="grid u-hidden additional-rma-orderline-fields additional-fields-rma"> 10075 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10076 </div> 10077 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10078 <input type="text" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10079 </div> 10080 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10081 <input class="create-rma-form-input create-rma-expected-result" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10082 </div> 10083 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10084 <input class="create-rma-form-input form-control create-rma-Attachment-input" id="CreateRmaFormAttachment_{{orderLineProductId}}" name="attachment" type="file" /> 10085 <div class="u-hidden emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10086 </div> 10087 </div> 10088 </form> 10089 {{/.}} 10090 </script> 10091 10092 <script id="RMA-Order-Select" type="text/x-template"> 10093 10094 {{#.}} 10095 {{#ifCond orderId "!==" "No"}} 10096 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10097 {{/ifCond}} 10098 {{/.}} 10099 </script> 10100 10101 } 10102 @helper DelayTranslations(string word) 10103 { 10104 <p>@Translate(word)</p> 10105 } 10106 @helper RmaViewDetailsEditable() 10107 { 10108 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 10109 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 10110 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 10111 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 10112 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 10113 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 10114 string favoriteUserToken = ""; 10115 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10116 10117 if (currentUserAccess != null) 10118 { 10119 favoriteUserToken = JwtService.GetToken(currentUserAccess, 86400); 10120 } 10121 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 10122 10123 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 10124 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 10125 <input type="hidden" id="FavoriteUserToken" value="@favoriteUserToken" /> 10126 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 10127 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 10128 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 10129 10130 <div class="rma-modal__container"> 10131 10132 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-draft-container" data-template="rma-form-hidden-inputs-draft" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 10133 10134 <header class="u-flex u-flex--row rma-modal__header" bs-d-flex bs-flex-wrap> 10135 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10136 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 10137 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 10138 <div class="fs-4 fw-bold text-primary" id="SelectedCustomerName"></div> 10139 <div class="fs-4 fw-bold text-primary" id="SelectedOrderId"></div> 10140 <div class="fs-4 fw-bold text-primary" id="SelectedDeviationId"></div> 10141 </header> 10142 <div class=""> 10143 <div class=""> 10144 <div class="rma-modal__selected-order orderline-form"> 10145 10146 <div class="bs-grid rma-modal-container bs-mt-md-5"> 10147 <div class="g-col-12 g-col-md-1 d-flex u-flex--row align-items-center justify-content-center"></div> 10148 <div class="g-col-12 g-col-md-5 d-flex u-flex--row align-items-center justify-content-center position-relative"> 10149 </div> 10150 <div class="g-col-12 g-col-md-3 d-flex u-flex--row align-items-center justify-content-center"></div> 10151 <div class="g-col-12 g-col-md-3 bs-d-flex bs-justify-content-center"> 10152 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1 toFullOrderDraftButton">@Translate("Hel order")</button> 10153 </div> 10154 </div> 10155 @* Switch between full order rma and orderline RMA *@ 10156 <div class="rma-modal-container bs-px-3 form-orderline"> 10157 <div class="d-flex"> 10158 </div> 10159 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 10160 <div class="u-border-bottom rma-page__header-grid-container"> 10161 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 10162 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 10163 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center justify-content-center">@Translate("Avviksårsak")</div> 10164 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert")</div> 10165 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Avviksantall")</div> 10166 <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert Antall")</div> 10167 </div> 10168 </div> 10169 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10170 <div class="bs-d-flex"> 10171 <div class="toast-body"> 10172 @Translate("Please fill all required fields") 10173 </div> 10174 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10175 </div> 10176 </div> 10177 10178 @* products loop *@ 10179 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-draft-orderlines-container" data-template="rma-form-draft-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 10180 @*<div class="bs-d-flex bs-align-items-center bs-justify-content-start bs-my-5"> 10181 <input id="DeviationAgreementDraftFormOrderline" class="bs-me-3 " onclick="enableSubmitButton(this)" type="checkbox" style="width: 27px;height: 27px;" /> 10182 <label class="mb-0" for="DeviationAgreementDraftFormOrderline"> 10183 <span class=""></span>@Translate("Ja, jeg er kjent med retningslinjene for avvik og mener at dette er et avvik. ") 10184 </label> 10185 </div>*@ 10186 </div> 10187 </div> 10188 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 10189 <div class="rma-modal-container"> 10190 <div class="d-flex bs-justify-content-between bs-mt-5 bs-mb-2"> 10191 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 10192 <option value="0">@Translate("Avviksårsak")</option> 10193 <option value="1">@Translate("Faktura")</option> 10194 <option value="3">@Translate("Kvalitet")</option> 10195 <option value="2">@Translate("Pakking")</option> 10196 <option value="4">@Translate("Vedlikehold")</option> 10197 <option value="5">@Translate("Feil Levert")</option> 10198 <option value="6">@Translate("Multiple")</option> 10199 </select> 10200 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 10201 </div> 10202 <div class="inputComment bs-w-100 bs-mt-5"> 10203 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 10204 </div> 10205 <div class="inputComment bs-w-100 bs-mt-3"> 10206 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 10207 </div> 10208 <input class="create-rma-form-input form-control create-rma-Attachment-input" name="FullOrderAttachment" type="file" multiple="multiple" /> 10209 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 10210 </div> 10211 </div> 10212 </div> 10213 </div> 10214 </div> 10215 <footer class="modal__rma-footer"> 10216 <div class="footer-button-container"> 10217 <button class="submit-rma-button bs-btn bs-btn-primary " type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,false)">@Translate("Opprett Avvik")</button> 10218 <button class="submit-rma-button bs-bg-white bs-btn bs-btn-outline-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),1,false)">@Translate("Save as draft")</button> 10219 </div> 10220 <div class="modal__rma-footer-icon-buttons"> 10221 </div> 10222 </footer> 10223 </div> 10224 <script id="ImpersonationListContentFilterCreateRmaDraftModal" type="text/x-template"> 10225 @{ 10226 string title = @Translate("Choose user"); 10227 } 10228 {{#.}} 10229 <div class="impersonation-container-filter-rma create-rma-modal"> 10230 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 10231 <div class="dropdown variants-filters bs-w-100 dw-mod"> 10232 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@title</label> 10233 <div class="dropdown__content u-padding dw-mod"> 10234 <div class="dropdown__item__filter"> 10235 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 10236 </div> 10237 10238 {{>ImpersonationListContentFilterSelectCreateRmaDraftModal}} 10239 </div> 10240 </div> 10241 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 10242 </div> 10243 10244 {{/.}} 10245 </script> 10246 <script id="ImpersonationListContentFilterSelectCreateRmaDraftModal" type="text/x-template"> 10247 {{#.}} 10248 {{#Users}} 10249 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 10250 {{/Users}} 10251 {{/.}} 10252 </script> 10253 10254 <script id="rma-form-hidden-inputs-draft" type="text/x-template"> 10255 {{#.}} 10256 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 10257 <input name="deviationId" id="HiddenInputsDeviationId" value="0" type="text" class="u-hidden" /> 10258 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 10259 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 10260 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 10261 @* 10262 <input name="userId" value="@Model.CurrentUser.ID" type="text" class="u-hidden" /> 10263 *@ 10264 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 10265 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 10266 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 10267 @*<input name="isFullDeviation" value="false" type="text" class="u-hidden">*@ 10268 {{/.}} 10269 </script> 10270 10271 <script id="rma-form-draft-orderlines" type="text/x-template"> 10272 {{#.}} 10273 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" style="border-color: #597CCA;"> 10274 <input type="hidden" name="productId" value="{{productId}}" /> 10275 <input name="deviationId" id="HiddenInputsDeviationId" value="{{deviationId}}" type="text" class="u-hidden" /> 10276 <input name="deviationOrderLineId" value="{{deviationOrderLineId}}" type="text" class="u-hidden" /> 10277 <input name="deviationLineId" value="{{deviationLineId}}" type="text" class="u-hidden" /> 10278 10279 <input type="hidden" name="productNumber" value="{{productNumber}}" /> 10280 <input type="hidden" name="productName" value="{{productName}}" /> 10281 <input type="hidden" name="productImage" value="{{#if productImage}}{{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 10282 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10283 <input type="hidden" name="supplierName" value="{{supplierName}}" /> 10284 <div class="rma-form-grid-item"> 10285 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10286 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10287 </div> 10288 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row align-items-center"> 10289 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10290 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{deviationOrderLineId}}" style="flex-wrap: wrap"><span>{{productNumber}}</span>{{#ifCond productNumber '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateFirst20 productName}}</span></div> 10291 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineMeasurementUnit '!==' ''}}bs-mt-2{{/ifCond}}"><span>{{truncateLast16 supplierName}}</span>{{#ifCond orderLineMeasurementUnit '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10292 </div> 10293 </div> 10294 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10295 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" value={{reason}} name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10296 <option {{#ifCond reason '===' 0}} selected {{/ifCond}} value="0">@Translate("Avviksårsak")</option> 10297 <option {{#ifCond reason '===' 1}} selected {{/ifCond}} value="1">@Translate("Faktura")</option> 10298 <option {{#ifCond reason '===' 3}} selected {{/ifCond}} value="3">@Translate("Kvalitet")</option> 10299 <option {{#ifCond reason '===' 2}} selected {{/ifCond}} value="2">@Translate("Pakking")</option> 10300 <option {{#ifCond reason '===' 4}} selected {{/ifCond}} value="4">@Translate("Vedlikehold")</option> 10301 <option {{#ifCond reason '===' 5}} selected {{/ifCond}} value="5">@Translate("Feil Levert")</option> 10302 <option {{#ifCond reason '===' 6}} selected {{/ifCond}} value="6">@Translate("Multiple")</option> 10303 </select> 10304 </div> 10305 <div class="rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10306 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10307 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{deviationOrderLineTotalPrice}}" /> 10308 <div class=" rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10309 <input class="create-rma-form-input create-rma-quantity-input {{#ifCond deviationQuantity '===' 0}} disabled {{/ifCond}}" value="{{deviationQuantity}}" oninput="showAdditionalOrderlineFields(this, this.value)" data-delivered-quantity="{{deliveredQuantity}}" name="deviationQuantity" type="number" min="0" step="1" max="{{deliveredQuantity}}" /> 10310 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 removeOrderlineButton {{#ifCond deviationQuantity '===' 0}} u-hidden {{/ifCond}}" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10311 <i class="far fa-times bs-text-danger bs-px-2"></i> 10312 </button> 10313 </div> 10314 </div> 10315 <div class="grid {{#ifCond reason '===' 0}} u-hidden {{/ifCond}} additional-rma-orderline-fields"> 10316 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10317 </div> 10318 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10319 <input type="text" value="{{#each messages}}{{message}}{{/each}}" data-message-id="{{#each messages}}{{messageId}}{{/each}}" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10320 </div> 10321 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10322 <input class="create-rma-form-input create-rma-expected-result" value="{{requestedOutcome}}" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10323 </div> 10324 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10325 <input class="create-rma-form-input form-control create-rma-Attachment-input" data-image-path="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" value="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" id="CreateRmaFormAttachment_{{productId}}" name="attachment" type="file" /> 10326 <div class="{{#ifCond messageFile '!==' null}} u-hidden {{/ifCond}}emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10327 </div> 10328 </div> 10329 </form> 10330 {{/.}} 10331 </script> 10332 10333 <script id="RMA-Order-Select" type="text/x-template"> 10334 10335 {{#.}} 10336 {{#ifCond orderId "!==" "No"}} 10337 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10338 {{/ifCond}} 10339 {{/.}} 10340 </script> 10341 10342 } 10343 10344 @helper RmaViewDetails() 10345 { 10346 var company = Model.CurrentUser.Company; 10347 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10348 10349 <form class="rma-modal__container"> 10350 <header class="u-flex u-flex--row rma-modal__header bs-px-3 bs-d-flex bs-flex-wrap"> 10351 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10352 <div class="rma-order-number rma-view-details__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10353 </header> 10354 <input type="hidden" id="SelectedDeviationId" value="" /> 10355 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10356 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10357 <div class="js-handlebars-root bs-px-3 bs-mb-5 dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10358 10359 <div class="bs-px-3"> 10360 <div class="rma-modal-container"> 10361 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg u-border-bottom"> 10362 <div class="rma-details-page__header-grid-container"> 10363 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block"></div> 10364 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Produkt")</div> 10365 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksårsak")</div> 10366 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Levert")</div> 10367 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksantall")</div> 10368 <div class="fw-700 rma-page__grid-table-cell">@Translate("Pris")</div> 10369 </div> 10370 </div> 10371 @*// products loop *@ 10372 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-handlebars-container" data-template="Rma-Details-handlebars" data-json-feed="" data-preloader="overlay" data-init-onload="true"></div> 10373 </div> 10374 </div> 10375 @*End of Products Loop *@ 10376 <div class="modal__content bs-px-3 rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10377 @*Start of the Messaging Loop*@ 10378 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10379 <div class="rma-page__write-comment"> 10380 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10381 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10382 @*<label for="file-input"> 10383 <img width="19" height="38" src="/Files/Images/attachment.svg" /> 10384 </label>*@ 10385 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10386 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10387 <span id="file-input-error" style="display:none">@Translate("Wrong file")</span> 10388 </div> 10389 </div> 10390 <footer class="modal__rma-footer"> 10391 <div class="footer__buttons"> 10392 @if (isCompanyKraemer) 10393 { 10394 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10395 @*<option value="1">@Translate("STATUS_1")</option>*@ 10396 <option value="2" default selected>@Translate("STATUS_2")</option> 10397 <option value="3">@Translate("STATUS_3")</option> 10398 <option value="4">@Translate("STATUS_4")</option> 10399 </select> 10400 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10401 } 10402 else 10403 { 10404 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenRmaModal">@Translate("Re-open Deviation")</button> 10405 <div class="bs-modal bs-fade" id="reopenRmaModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10406 <div class="modal-dialog bs-mt-4"> 10407 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10408 <div class="modal-body bs-pb-0 bs-text-center"> 10409 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10410 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10411 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10412 </div> 10413 </div> 10414 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10415 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10416 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10417 </div> 10418 </div> 10419 </div> 10420 </div> 10421 10422 } 10423 </div> 10424 <div class="modal__rma-footer-icon-buttons"> 10425 </div> 10426 </footer> 10427 </form> 10428 <script> 10429 let applyReasonTranslation = ()=>{ 10430 document.querySelectorAll(".reasonTranslation").forEach(el =>{ 10431 let reason = el.innerHTML; 10432 switch (reason){ 10433 10434 case "REASON_0": 10435 el.innerHTML = `@Translate("REASON_0")`; 10436 break; 10437 case "REASON_1": 10438 el.innerHTML = `@Translate("REASON_1")`; 10439 break; 10440 case "REASON_2": 10441 console.log("REASON_2") 10442 el.innerHTML = `@Translate("REASON_2")`; 10443 break; 10444 case "REASON_3": 10445 el.innerHTML = `@Translate("REASON_3")`; 10446 break; 10447 case "REASON_4": 10448 console.log("REASON_4") 10449 el.innerHTML = `@Translate("REASON_4")`; 10450 break; 10451 case "REASON_5": 10452 el.innerHTML = `@Translate("REASON_5")`; 10453 break; 10454 case "REASON_6": 10455 el.innerHTML = `@Translate("REASON_6")`; 10456 break; 10457 } 10458 }) 10459 } 10460 let applyStatusTranslation = ()=>{ 10461 document.querySelectorAll(".statusTranslation").forEach(el =>{ 10462 let status = el.innerHTML; 10463 switch (status){ 10464 case "STATUS_0": 10465 el.innerHTML = `@Translate("STATUS_0")`; 10466 break; 10467 case "STATUS_1": 10468 el.innerHTML = `@Translate("STATUS_1")`; 10469 break; 10470 case "STATUS_2": 10471 console.log("STATUS_2") 10472 el.innerHTML = `@Translate("STATUS_2")`; 10473 break; 10474 case "STATUS_3": 10475 el.innerHTML = `@Translate("STATUS_3")`; 10476 break; 10477 case "STATUS_4": 10478 console.log("STATUS_4") 10479 el.innerHTML = `@Translate("STATUS_4")`; 10480 break; 10481 case "STATUS_5": 10482 el.innerHTML = `@Translate("STATUS_5")`; 10483 break; 10484 case "STATUS_6": 10485 el.innerHTML = `@Translate("STATUS_6")`; 10486 break; 10487 } 10488 }) 10489 } 10490 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10491 applyReasonTranslation(); 10492 }) 10493 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10494 applyReasonTranslation(); 10495 }) 10496 document.getElementById("Rma-Order-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10497 applyStatusTranslation(); 10498 }) 10499 document.getElementById("Rma-Order-Details-handlebars-container-first-row").addEventListener('contentLoaded', function (e) { 10500 applyStatusTranslation(); 10501 }) 10502 document.getElementById("Rma-Order-Details-handlebars-container-second-row").addEventListener('contentLoaded', function (e) { 10503 applyStatusTranslation(); 10504 applyReasonTranslation(); 10505 }) 10506 </script> 10507 <script id="Rma-Details-handlebars" type="text/x-template"> 10508 10509 {{#.}} 10510 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10511 <div class="rma-products-list bs-border-bottom"> 10512 <div class="rma-details-page__header-grid-container"> 10513 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10514 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10515 </div> 10516 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row align-items-center"> 10517 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10518 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10519 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="1111111">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10520 </div> 10521 </div> 10522 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10523 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10524 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10525 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationOrderLineTotalPrice}}</div> 10526 </div> 10527 10528 <div class="grid"> 10529 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10530 </div> 10531 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10532 <div class="rma-product-info-container"> 10533 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10534 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10535 {{#each messages}} 10536 {{message}} 10537 {{/each}} 10538 </div> 10539 </div> 10540 </div> 10541 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row bs-align-items-start"> 10542 <div class="rma-product-info-container"> 10543 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10544 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10545 </div> 10546 </div> 10547 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center"></div> 10548 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10549 <div class="rma-product-info-container"> 10550 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10551 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10552 {{#each messages}} 10553 {{#each messageFiles}} 10554 @* 10555 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10556 *@ <a href="{{messageFile}}" target="_blank"> 10557 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10558 </a> 10559 {{/each}} 10560 {{/each}} 10561 </div> 10562 </div> 10563 </div> 10564 </div> 10565 </div> 10566 {{/.}} 10567 </script> 10568 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10569 {{#.}} 10570 <div class="d-grid"> 10571 {{#if isCustomer}} 10572 <div class="rma-page__user-message"> 10573 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10574 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10575 <div class="rma-page__message-date ">{{messageDate}}</div> 10576 </div> 10577 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10578 <div class="rma-page__attachment-footer"> 10579 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10580 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10581 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10582 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10583 </a> {{/each}} 10584 </a> 10585 </div> 10586 </div> 10587 {{else}} 10588 <div class="rma-page__admin-message"> 10589 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10590 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10591 <div class="rma-page__message-date ">{{messageDate}}</div> 10592 </div> 10593 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10594 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10595 10596 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10597 {{#each messageFiles}} 10598 <a href="{{messageFile}}" target="_blank"> 10599 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10600 </a> 10601 {{/each}} 10602 </div> 10603 </div> 10604 {{/if}} 10605 </div> 10606 10607 {{/.}} 10608 </script> 10609 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10610 {{#.}} 10611 <div class="rma-selected-order-info-data bs-mt-3 bs-px-5 bs-grid"> 10612 <div class="cell g-col-6 g-col-md-3"> 10613 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10614 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}} " class="bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10615 </div> 10616 <div class="cell g-col-6 g-col-md-3"> 10617 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10618 <div class="">{{formatDate createdDate}}</div> 10619 </div> 10620 <div class="cell g-col-6 g-col-md-3"> 10621 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10622 <div class=" statusTranslation">STATUS_{{status}}</div> 10623 </div> 10624 <div class="cell g-col-6 g-col-md-3"> 10625 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10626 <div class="">{{formatDate updatedDate}}</div> 10627 </div> 10628 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10629 <div class="bs-d-flex"> 10630 <div class="toast-body"> 10631 @Translate("You can only view your own orders") 10632 </div> 10633 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10634 </div> 10635 </div> 10636 </div> 10637 10638 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10639 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10640 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10641 <input type="hidden" id="SelectedStatus" value="{{status}}" /> 10642 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10643 {{/.}} 10644 </script> 10645 } 10646 10647 @helper RmaViewDetailsFullOrder() 10648 { 10649 var company = Model.CurrentUser.Company; 10650 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10651 10652 <form class="rma-modal__container"> 10653 10654 <header class="u-flex u-flex--row rma-modal__header bs-d-flex bs-flex-wrap"> 10655 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10656 <div class="rma-order-number rma-view-details-full-order__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10657 </header> 10658 <input type="hidden" id="SelectedDeviationId" value="" /> 10659 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10660 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10661 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-first-row" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10662 10663 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-second-row" data-template="Rma-Order-Details-handlebars-second-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10664 10665 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-third-row" data-template="Rma-Order-Details-handlebars-third-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10666 <div class="bs-grid"> 10667 <div class="rma-selected-order-info g-col-12 g-col-md-6 bs-my-5 bs-px-2 bs-px-md-6"> 10668 <div class="bs-mb-3 bs-fs-5 fw-700">@Translate("Ordredetaljer")</div> 10669 <div class="orderInfo d-flex bs-justify-content-between"> 10670 <p class="bs-mb-2 bs-fs-5 fw-bold">@Translate("Antall produktlinjer")</p> 10671 <p class="bs-mb-2 bs-fs-5 rma-form-total-orderlines">7</p> 10672 </div> 10673 <div class="orderInfo d-flex bs-justify-content-between"> 10674 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Totalt antall produkter")</p> 10675 <p class="bs-mb-2 bs-fs-5 rma-form-total-quantity">289</p> 10676 </div> 10677 <div class="orderInfo d-flex bs-justify-content-between"> 10678 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Ordretotal eks. MVA")</p> 10679 <p class="bs-mb-2 bs-fs-5 rma-form-total-amount">7324,54 kr</p> 10680 </div> 10681 </div> 10682 </div> 10683 <div class="modal__content rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10684 @*Start of the Messaging Loop*@ 10685 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container-full-order" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10686 <div class="rma-page__write-comment"> 10687 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10688 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10689 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10690 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10691 <span id="file-input-error2" style="display:none">@Translate("Wrong file")</span> 10692 </div> 10693 </div> 10694 <footer class="modal__rma-footer"> 10695 <div class="footer__buttons"> 10696 @if (isCompanyKraemer) 10697 { 10698 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10699 @*<option value="1">@Translate("STATUS_1")</option>*@ 10700 <option value="2" default selected>@Translate("STATUS_2")</option> 10701 <option value="3">@Translate("STATUS_3")</option> 10702 <option value="4">@Translate("STATUS_4")</option> 10703 </select> 10704 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10705 } 10706 else 10707 { 10708 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenFullOrder">@Translate("Re-open Deviation")</button> 10709 @* 10710 <button class="submit-deviation-state bs-btn bs-btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal" >@Translate("Modal Test")</button> 10711 *@ 10712 <div class="bs-modal bs-fade" id="reopenFullOrder" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10713 <div class="modal-dialog bs-mt-4"> 10714 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10715 <div class="modal-body bs-pb-0 bs-text-center"> 10716 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10717 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10718 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10719 </div> 10720 </div> 10721 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10722 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10723 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10724 </div> 10725 </div> 10726 </div> 10727 </div> 10728 } 10729 </div> 10730 <div class="modal__rma-footer-icon-buttons"> 10731 </div> 10732 </footer> 10733 </form> 10734 10735 <script id="Rma-Details-handlebars" type="text/x-template"> 10736 10737 {{#.}} 10738 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10739 <div class="rma-products-list bs-border-bottom"> 10740 <div class="rma-details-page__header-grid-container"> 10741 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"> 10742 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10743 </div> 10744 <div class=" rma-page__grid-table-cell rma-details__name vertical-align-center d-flex u-flex--row align-items-center"> 10745 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10746 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10747 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="222222222">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10748 </div> 10749 </div> 10750 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10751 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10752 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10753 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{deviationOrderLineTotalPrice}}</div> 10754 </div> 10755 <div class="rma-details-page__header-grid-container"> 10756 <div class="rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"></div> 10757 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10758 <div class="rma-product-info-container"> 10759 <div class="fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10760 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10761 {{#each messages}} 10762 {{message}} 10763 {{/each}} 10764 </div> 10765 </div> 10766 </div> 10767 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10768 <div class="rma-product-info-container"> 10769 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10770 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10771 </div> 10772 </div> 10773 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center"></div> 10774 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10775 <div class="rma-product-info-container"> 10776 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10777 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10778 {{#each messages}} 10779 {{#each messageFiles}} 10780 @* 10781 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10782 *@ <a href="{{messageFile}}" target="_blank"> 10783 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10784 </a> 10785 {{/each}} 10786 {{/each}} 10787 </div> 10788 </div> 10789 </div> 10790 </div> 10791 </div> 10792 {{/.}} 10793 </script> 10794 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10795 {{#.}} 10796 <div class="d-grid"> 10797 {{#if isCustomer}} 10798 <div class="rma-page__user-message"> 10799 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10800 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10801 <div class="rma-page__message-date ">{{messageDate}}</div> 10802 </div> 10803 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10804 <div class="rma-page__attachment-footer"> 10805 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10806 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10807 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10808 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10809 </a> {{/each}} 10810 </a> 10811 </div> 10812 </div> 10813 {{else}} 10814 <div class="rma-page__admin-message"> 10815 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10816 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10817 <div class="rma-page__message-date ">{{messageDate}}</div> 10818 </div> 10819 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10820 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10821 10822 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10823 {{#each messageFiles}} 10824 <a href="{{messageFile}}" target="_blank"> 10825 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10826 </a> 10827 {{/each}} 10828 </div> 10829 </div> 10830 10831 {{/if}} 10832 </div> 10833 10834 {{/.}} 10835 </script> 10836 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10837 {{#.}} 10838 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10839 <input type="hidden" id="OrderLocation" value="{{orderLocation}}" /> 10840 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10841 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10842 <div class="cell g-col-6 g-col-md-3"> 10843 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10844 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}}" data-customer-number="{{customerNumber}}" class="rma-order-header-info bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10845 </div> 10846 <div class="cell g-col-6 g-col-md-3"> 10847 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10848 <div class="">{{formatDate createdDate}}</div> 10849 </div> 10850 <div class="cell g-col-6 g-col-md-3"> 10851 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10852 <div class=" statusTranslation">STATUS_{{status}}</div> 10853 </div> 10854 <div class="cell g-col-6 g-col-md-3"> 10855 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10856 <div class="">{{formatDate updatedDate}}</div> 10857 </div> 10858 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10859 <div class="bs-d-flex"> 10860 <div class="toast-body"> 10861 @Translate("You can only view your own orders") 10862 </div> 10863 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10864 </div> 10865 </div> 10866 </div> 10867 10868 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10869 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10870 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10871 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10872 {{/.}} 10873 </script> 10874 10875 <script id="Rma-Order-Details-handlebars-second-row" type="text/x-template"> 10876 {{#.}} 10877 10878 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10879 <div class="cell g-col-6 g-col-md-3"> 10880 <div class="bs-fw-bold bs-mb-3">@Translate("Avviksårsak")</div> 10881 <div class="reasonTranslation">REASON_{{reason}}</div> 10882 </div> 10883 <div class="cell g-col-6 g-col-md-3"> 10884 <div class="bs-fw-bold bs-mb-3">@Translate("S/O")</div> 10885 <div class="">{{orderShopReference}}</div> 10886 </div> 10887 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}"> 10888 </div> 10889 {{/.}} 10890 </script> 10891 10892 <script id="Rma-Order-Details-handlebars-third-row" type="text/x-template"> 10893 {{#.}} 10894 <div class="rma-selected-order-info bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10895 <div class="cell g-col-12 g-col-md-6"> 10896 <div class="bs-fw-bold bs-mb-3">@Translate("Vedlegg")</div> 10897 <div class="bs-d-flex bs-flex-row bs-flex-wrap bs-gap-3"> 10898 {{#each messages}}{{#each messageFiles}} 10899 <a href="{{messageFile}}" target="_blank"> 10900 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10901 </a> 10902 {{/each}}{{/each}} 10903 </div> 10904 </div> 10905 10906 <div class="cell g-col-6 g-col-md-3"> 10907 <div class="bs-fw-bold bs-mb-3">@Translate("Kommentar")</div> 10908 <div class="">{{#each messages}}{{message}}{{/each}}</div> 10909 </div> 10910 <div class="cell g-col-6 g-col-md-3"> 10911 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket utfall")</div> 10912 <div class="">{{requestedOutcome}}</div> 10913 </div> 10914 </div> 10915 {{/.}} 10916 </script> 10917 10918 } 10919 10920 @helper ViewOrderDetails2() 10921 { 10922 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10923 var cartPageId = GetPageIdByNavigationTag("CartPage"); 10924 string dwAPIToken = ""; 10925 if (currentUserAccess != null) 10926 { 10927 dwAPIToken = JwtService.GetToken(currentUserAccess, 86400); 10928 } 10929 <form class="rma-modal__container"> 10930 <header class="modal-header bs-bg-sand-light bs-justify-content-start"> 10931 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" alt="Kraemer logo" /> 10932 <div class="rma-order-number">@Translate("TAKK FOR DIN ORDRE!")</div> 10933 </header> 10934 10935 <div class="js-handlebars-root modal-body" id="Order-Header-Details-handlebars-container" data-template="Order-Header-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10936 10937 <div class="modal-body bs-pt-0"> 10938 <div class="modal__content rma-page_table-header bs-mt-3 bs-my-lg-3"> 10939 <div class="order-history-header bs-fw-bold bs-border-bottom bs-border-primary-dark"> 10940 <div class="cell bs-d-none bs-d-lg-block"></div> 10941 <div class="cell">@Translate("Produkt")</div> 10942 <div class="cell bs-d-none bs-d-lg-block">@Translate("Kommentar")</div> 10943 <div class="cell">@Translate("Antall")</div> 10944 <div class="cell">@Translate("Pris")</div> 10945 <div class="cell">@Translate("Total Eks. MVA")</div> 10946 </div> 10947 </div> 10948 @*// products loop *@ 10949 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Order-Details-handlebars-container" data-template="Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10950 </div> 10951 <div data-message="error-order-does-not-exist" data-bs-delay="1800" class="toast bs-align-items-center bs-px-3 bs-mx-auto bs-bg-danger bs-text-light bs-border-0 bs-w-75 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10952 <div class="bs-d-flex"> 10953 <div class="toast-body"> 10954 @Translate("This order is not yet available to create a RMA.") 10955 </div> 10956 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10957 </div> 10958 </div> 10959 <footer class="modal__rma-footer bs-py-4 bs-justify-content-end orderHistory-footer"> 10960 @*<button class="submit-rma-button" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'))">@Translate("Opprett Avvik")</button>*@ 10961 <div class="modal__rma-footer-icon-buttons"> 10962 <a class="rma-page__icon-buttons bs-mx-2 openRmaModalButton bs-ms-0" title="@Translate("HOVER_StartDeviation")" onclick="openRMAModal('OrderSelected')"> 10963 <img height="26" width="26" src="/Files/Images/UnionRMA-icon.svg" /> 10964 </a> 10965 @*<a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button 10966 open-full-favorite-list-button" data-token="@dwAPIToken" onclick="showFavoriteListsForFullOrder(this, 10967 true)" title="@Translate("HOVER_FavouriteList")"> 10968 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" /> 10969 </a>*@ 10970 @*<div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 10971 .classList.add('u-hidden');this.classList.add('bs-d-none');"></div> 10972 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border 10973 bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;z-index:1;"> 10974 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 10975 </div> 10976 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 10977 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 10978 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 10979 </div> 10980 </div>*@ 10981 <a class="rma-page__icon-buttons bs-mx-2" title="@Translate("HOVER_Download")"> 10982 <img height="26" width="26" onclick="PrintElem(this.closest('form'))" src="/Files/Images/print-icon.svg" /> 10983 </a> 10984 </div> 10985 </footer> 10986 </form> 10987 <script id="Order-Header-Details-handlebars" type="text/x-template"> 10988 10989 <div class="bs-grid"> 10990 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderId '===' null}} invisible {{else}} {{#ifCond orderId '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10991 <div class="bs-fw-bold bs-mb-3">@Translate("Ordre-ID")</div> 10992 <div class="" id="ModalOpenedOrderId" data-order-id="{{orderId}}">{{orderId}}</div> 10993 <input type="hidden" id="ModalOpenedUserId" value="@Model.CurrentUser.ID"> 10994 </div> 10995 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDate '===' null}} invisible {{else}} {{#ifCond orderDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10996 <div class="bs-fw-bold bs-mb-3">@Translate("Bestillingsdato")</div> 10997 <div class="">{{formatDate orderDate}}</div> 10998 </div> 10999 11000 <div class="cell g-col-6 g-col-md-3 {{#ifCond theListName '===' null}} invisible {{else}} {{#ifCond theListName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11001 <div class="bs-fw-bold bs-mb-3">@Translate("Handlekurv navn")</div> 11002 <div class="">{{orderCartName}}</div> 11003 </div> 11004 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderLocation '===' null}} invisible {{else}} {{#ifCond orderLocation '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11005 <div class="bs-fw-bold bs-mb-3">@Translate("Ordrelokasjon")</div> 11006 <div class="">{{orderLocation}}</div> 11007 </div> 11008 </div> 11009 11010 <div class="bs-grid"> 11011 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPoNumber '===' null}} invisible {{else}} {{#ifCond orderPoNumber '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11012 <div class="bs-fw-bold bs-mb-3">@Translate("P.O. Nummer")</div> 11013 <div class="">{{orderPoNumber}}</div> 11014 </div> 11015 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDesiredDeliveryDate '===' null}} invisible {{else}} {{#ifCond orderDesiredDeliveryDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11016 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket leveringsdag")</div> 11017 <div class="">{{formatDate orderDesiredDeliveryDate}}</div> 11018 </div> 11019 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPurchaserName '===' null}} invisible {{else}} {{#ifCond orderPurchaserName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11020 <div class="bs-fw-bold bs-mb-3">@Translate("Navn på kjøper")</div> 11021 <div class="">{{orderPurchaserName}}</div> 11022 </div> 11023 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDeliveryPlace '===' null}} invisible {{else}} {{#ifCond orderDeliveryPlace '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 11024 <div class="bs-fw-bold bs-mb-3">@Translate("Leveringssted")</div> 11025 <div class="">{{orderDeliveryPlace}}</div> 11026 </div> 11027 </div> 11028 </script> 11029 11030 <script id="Order-Details-handlebars" type="text/x-template"> 11031 {{#.}} 11032 <div class="order-history-item-container"> 11033 <div class="order-history-item bs-py-2 {{#ifCond orderLineDiscontinued '!==' false}} disabled {{/ifCond}} bs-py-lg-0"> 11034 <div class="cell bs-d-none bs-d-lg-block"> 11035 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" class="img-fluid" alt="{{orderLineProductName}}" /> 11036 </div> 11037 <div class="cell order-history-detail__name bs-justify-self"> 11038 <div class="rma-product-info-container"> 11039 <div class="bs-fw-bold bs-d-flex bs-align-items-center order-history-product-info" data-quantity="{{orderLineQuantity}}" data-product-number="{{orderLineProductNumber}}" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="order-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 11040 <div class="bs-d-none bs-d-lg-block {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 11041 <div class="bs-text-danger order-history-product-unavailable">{{#ifCond orderLineDiscontinued '!==' false}}@Translate("Denne varen er ikke lenger tilgjengelig"){{/ifCond}}</div> 11042 </div> 11043 </div> 11044 <div class="cell order-history-detail__comment bs-d-none bs-d-lg-block">{{orderLineComment}}</div> 11045 <div class="cell order-history-quantity-field" data-quantity={{orderLineQuantity}}>{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 11046 <div class="cell order-history-price">{{orderLinePricePerMeasurementUnit}}</div> 11047 <div class="cell">{{orderLineTotalPrice}} @*{{orderLinePriceUnit}}*@</div> 11048 <div class="cell bs-d-flex bs-flex-row"> 11049 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{orderLineProductNumber}}" title="@Translate("HOVER_FavouriteList")"> 11050 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" /> 11051 </a> 11052 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 11053 .classList.add('u-hidden');"></div> 11054 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px"> 11055 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 11056 @*<div class="bs-fs-5 favorite-list-item bs-list-group-item bs-list-group-item-action" data-list-id="ListID" onclick="addToShoppingList(this)">Example1</div>*@ 11057 </div> 11058 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 11059 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 11060 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 11061 </div> 11062 </div> 11063 </div> 11064 </div> 11065 </div> 11066 {{/.}} 11067 </script> 11068 } 11069 11070 11071 @functions { 11072 public class ManifestIcon 11073 { 11074 public string src { get; set; } 11075 public string type { get; set; } 11076 public string sizes { get; set; } 11077 } 11078 11079 public class Manifest 11080 { 11081 public string name { get; set; } 11082 public string short_name { get; set; } 11083 public string start_url { get; set; } 11084 public string display { get; set; } 11085 public string background_color { get; set; } 11086 public string theme_color { get; set; } 11087 public List<ManifestIcon> icons { get; set; } 11088 } 11089 } 11090 11091 <!DOCTYPE html> 11092 11093 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 11094 11095 11096 11097 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 11098 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 11099 11100 11101 11102 @helper RenderMasterHead() { 11103 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 11104 11105 <head> 11106 <!-- Rapido version 3.3 --> 11107 11108 @RenderBlockList(subBlocks) 11109 </head> 11110 } 11111 11112 @helper RenderMasterMetadata() { 11113 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 11114 var brandColors = swatches.GetColorSwatch(1); 11115 string brandColorOne = brandColors.Palette["BrandColor1"]; 11116 11117 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 11118 Manifest manifest = new Manifest 11119 { 11120 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 11121 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"), 11122 start_url = "/", 11123 display = "standalone", 11124 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 11125 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 11126 }; 11127 11128 manifest.icons = new List<ManifestIcon> { 11129 new ManifestIcon { 11130 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11131 sizes = "192x192", 11132 type = "image/png" 11133 }, 11134 new ManifestIcon { 11135 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11136 sizes = "512x512", 11137 type = "image/png" 11138 }, 11139 new ManifestIcon { 11140 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11141 sizes = "1024x1024", 11142 type = "image/png" 11143 } 11144 }; 11145 11146 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 11147 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 11148 string currentManifest = File.ReadAllText(manifestFilePath); 11149 11150 if (manifestJSON != currentManifest) 11151 { 11152 File.WriteAllText(manifestFilePath, manifestJSON); 11153 } 11154 } 11155 11156 <meta charset="utf-8" /> 11157 <title>@Model.Title</title> 11158 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> 11159 <meta name="robots" content="index, follow"> 11160 <meta name="theme-color" content="@brandColorOne" /> 11161 11162 if (!Model.MetaTags.Contains("og:image")) { 11163 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage"))); 11164 } 11165 11166 if (!Model.MetaTags.Contains("og:description")) { 11167 Pageview.Meta.AddTag("og:description", Model.Description); 11168 } 11169 11170 Pageview.Meta.AddTag("og:title", Model.Title); 11171 Pageview.Meta.AddTag("og:site_name", Model.Name); 11172 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 11173 Pageview.Meta.AddTag("og:type", "Website"); 11174 Pageview.Meta.AddTag("fb:page_id", Model.ID.ToString()); 11175 11176 @Model.MetaTags 11177 } 11178 11179 @helper RenderMasterCss() { 11180 var fonts = new string[] { 11181 getFontFamily("Layout", "HeaderFont"), 11182 getFontFamily("Layout", "SubheaderFont"), 11183 getFontFamily("Layout", "TertiaryHeaderFont"), 11184 getFontFamily("Layout", "BodyText"), 11185 getFontFamily("Layout", "Header", "ToolsFont"), 11186 getFontFamily("Layout", "Header", "NavigationFont"), 11187 getFontFamily("Layout", "MobileNavigation", "Font"), 11188 getFontFamily("ProductList", "Facets", "HeaderFont"), 11189 getFontFamily("ProductPage", "PriceFontDesign"), 11190 getFontFamily("Ecommerce", "SaleSticker", "Font"), 11191 getFontFamily("Ecommerce", "NewSticker", "Font"), 11192 getFontFamily("Ecommerce", "CustomSticker", "Font") 11193 }; 11194 11195 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 11196 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 11197 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 11198 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 11199 if (useFontAwesomePro) 11200 { 11201 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 11202 } 11203 11204 bool movetoproduction = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("movetoproduction")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("movetoproduction")) : false; 11205 11206 //Favicon 11207 <link href="@favicon" rel="icon" type="image/png"> 11208 11209 //Base (Default, wireframe) styles 11210 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 11211 11212 //Rapido Css from Website Settings 11213 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 11214 11215 //Ignite Css (Custom site specific styles) 11216 //<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=25"> 11217 11218 /*TODO remove and compile css*/ 11219 @* <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/custom.css?v=22"> *@ 11220 //Font awesome 11221 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 11222 11223 //Flag icon 11224 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 11225 11226 //Google fonts 11227 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x))); 11228 11229 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 11230 bool featureFlagCSSFramework = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("feature")) && HttpContext.Current.Request.QueryString.Get("feature") == "cssframework"; 11231 /*if (featureFlagCSSFramework) 11232 {*/ 11233 11234 var cssStyleFileInfo = new System.IO.FileInfo(Dynamicweb.Core.SystemInformation.MapPath("/Files/Templates/Designs/Rapido/dist/app.bundle.css")); 11235 // <link rel="stylesheet" type="text/css" href="@autoCssBundleLink"> 11236 <link href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?@cssStyleFileInfo.LastWriteTime.Ticks" rel="stylesheet" media="all" type="text/css"> 11237 @*} 11238 else 11239 { 11240 <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css"> 11241 11242 }*@ 11243 PushPromise(favicon); 11244 PushPromise(fontAwesomeCssLink); 11245 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 11246 PushPromise(autoCssLink); 11247 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 11248 PushPromise("/Files/Images/placeholder.gif"); 11249 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 11250 } 11251 11252 @helper RenderMasterManifest() { 11253 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 11254 { 11255 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 11256 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 11257 } 11258 } 11259 11260 @helper RenderMasterBody() { 11261 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 11262 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 11263 if (!String.IsNullOrEmpty(designLayout)) { 11264 designLayout = "class=\"" + designLayout + "\""; 11265 } 11266 11267 List<int> pages = new List<int>(); 11268 pages.Add(GetPageIdByNavigationTag("RecipeBank")); 11269 pages.Add(GetPageIdByNavigationTag("DeviationsHistoryPage")); 11270 pages.Add(GetPageIdByNavigationTag("MenuView")); 11271 pages.Add(GetPageIdByNavigationTag("MenuCalendarView")); 11272 pages.Add(GetPageIdByNavigationTag("ShoppingList")); 11273 pages.Add(GetPageIdByNavigationTag("CustomerOrders")); 11274 pages.Add(GetPageIdByNavigationTag("MenuCreationView")); 11275 List<int> availablePages = pages.Where(x=>x!=0).ToList(); 11276 11277 int currentPage = Pageview?.ID ?? 0; 11278 bool pageHasWhiteBackground = availablePages.Contains(currentPage); 11279 11280 <body @designLayout OnKeyPress="return disableEnterKey(event)" data-preloader-text='@Translate("loader reordering")' data-test="@Dynamicweb.Ecommerce.Common.Context.LanguageID" style="--comm-background: @(pageHasWhiteBackground ? "#FFF" : "#F9F7F6")"> 11281 @RenderBlockList(subBlocks) 11282 </body> 11283 } 11284 11285 @helper RenderMasterHeader() 11286 { 11287 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 11288 //bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11289 bool isNavigationStickyMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11290 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 11291 11292 <header class="top-container @stickyTop dw-mod u-no-print" id="Top"> 11293 @RenderBlockList(subBlocks) 11294 </header> 11295 } 11296 11297 @helper RenderMain() 11298 { 11299 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 11300 11301 <main class="site dw-mod"> 11302 @RenderBlockList(subBlocks) 11303 </main> 11304 } 11305 11306 @helper RenderPageContent() 11307 { 11308 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11309 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 11310 var cartPageUrl = GetPageIdByNavigationTag("CartPage"); 11311 11312 <div id="Page" class="page @pagePos" data-cart-url="@cartPageUrl"> 11313 <div id="content"> 11314 @RenderSnippet("Content") 11315 </div> 11316 </div> 11317 } 11318 11319 @* Hack to support nested helpers *@ 11320 @SnippetStart("Content") 11321 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 11322 @using WebApp.Singleton; 11323 11324 @{ 11325 var user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 11326 var shipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner").Value; 11327 var onlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse").Value.ToString(); 11328 var mode = HttpContext.Current.Request["mode"]; 11329 11330 var serverDataJson = mode == "quicksearch" 11331 ? Newtonsoft.Json.JsonConvert.SerializeObject(new 11332 { 11333 RootGroupId = "", 11334 RootGroupName = "" 11335 }) 11336 : 11337 Newtonsoft.Json.JsonConvert.SerializeObject(new 11338 { 11339 RootGroupId = HttpContext.Current.Request["GroupId"], 11340 RootGroupName = string.IsNullOrWhiteSpace(HttpContext.Current.Request["GroupName"]) 11341 ? new Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService().GetById(HttpContext.Current.Request["GroupId"], "LANG17").Name 11342 : HttpContext.Current.Request["GroupName"], 11343 }); 11344 } 11345 11346 11347 11348 @*needed for proper navigation translationds*@ 11349 @if (shipOwner?.ToString() == "26300") 11350 { 11351 <input type="hidden" id="shipOwnerValue" value="" /> 11352 } 11353 11354 @if (onlySeeDiverse?.ToString() == "True") 11355 { 11356 <input type="hidden" id="OnlySeeDiverse" value="" /> 11357 } 11358 11359 <div class="content-container" > 11360 <div 11361 id="productListApp" 11362 style="padding-top: 30px;" data-server='@serverDataJson' 11363 class="content-row content-row--full content-row--column-gap-xl content-row--center content-row--height-auto content-row--spacing-none"> 11364 </div> 11365 </div> 11366 11367 @SnippetEnd("Content") 11368 11369 @helper RenderIosTabletFix() { 11370 11371 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 11372 { 11373 <script> 11374 var cartPageUrl = document.querySelector("#Page").getAttribute("data-cart-url"); 11375 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 11376 if (isIpadIOS) { 11377 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 11378 var isCheckout = (window.location.href.indexOf(cartPageUrl) > -1) ? true : false; 11379 if(isCheckout) { 11380 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios&CartV2.GotoStep1=true"; 11381 } else { 11382 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 11383 } 11384 } 11385 </script> 11386 } 11387 } 11388 11389 </html> 11390 11391 <script> 11392 function disableEnterKey(e) 11393 { 11394 var key; 11395 if(window.event) 11396 key = window.event.keyCode; //IE 11397 else 11398 key = e.which; //firefox 11399 11400 return (key != 13); 11401 } 11402 </script>