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

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 3 @using System.Web; 4 @using Dynamicweb.Frontend 5 @using Dynamicweb.Frontend.Devices 6 @using Dynamicweb.Extensibility 7 @using Dynamicweb.Content 8 @using Dynamicweb.Security 9 @using Dynamicweb.Core 10 @using System 11 @using System.Web 12 @using System.IO 13 @using Dynamicweb.Rapido.Blocks 14 @using System.Net 15 16 17 @functions { 18 BlocksPage masterPage = BlocksPage.GetBlockPage("Master"); 19 20 string getFontFamily(params string[] items) 21 { 22 var itemParent = Pageview.AreaSettings; 23 foreach (var item in items) 24 { 25 itemParent = itemParent.GetItem(item); 26 if (itemParent == null) 27 { 28 return null; 29 } 30 } 31 32 var googleFont = itemParent.GetGoogleFont("FontFamily"); 33 if (googleFont == null) 34 { 35 return null; 36 } 37 return googleFont.Family.Replace(" ", "+"); 38 } 39 } 40 41 @{ 42 Block root = new Block 43 { 44 Id = "Root", 45 SortId = 10, 46 BlocksList = new List<Block> 47 { 48 new Block { 49 Id = "Head", 50 SortId = 10, 51 SkipRenderBlocksList = true, 52 Template = RenderMasterHead(), 53 BlocksList = new List<Block> 54 { 55 new Block { 56 Id = "HeadMetadata", 57 SortId = 10, 58 Template = RenderMasterMetadata(), 59 }, 60 new Block { 61 Id = "HeadCss", 62 SortId = 20, 63 Template = RenderMasterCss(), 64 }, 65 new Block { 66 Id = "HeadManifest", 67 SortId = 30, 68 Template = RenderMasterManifest(), 69 } 70 } 71 }, 72 new Block { 73 Id = "Body", 74 SortId = 20, 75 SkipRenderBlocksList = true, 76 Template = RenderMasterBody(), 77 BlocksList = new List<Block> 78 { 79 new Block() 80 { 81 Id = "Master", 82 SortId = 10, 83 BlocksList = new List<Block> { 84 new Block { 85 Id = "MasterTopSnippets", 86 SortId = 10 87 }, 88 new Block { 89 Id = "MasterMain", 90 SortId = 20, 91 Template = RenderMain(), 92 SkipRenderBlocksList = true, 93 BlocksList = new List<Block> { 94 new Block { 95 Id = "MasterHeader", 96 SortId = 10, 97 Template = RenderMasterHeader(), 98 SkipRenderBlocksList = true 99 }, 100 new Block { 101 Id = "MasterPageContent", 102 SortId = 20, 103 Template = RenderPageContent() 104 } 105 } 106 }, 107 new Block { 108 Id = "MasterFooter", 109 SortId = 30 110 }, 111 new Block { 112 Id = "MasterReferences", 113 SortId = 40 114 }, 115 new Block { 116 Id = "MasterBottomSnippets", 117 SortId = 50, 118 BlocksList = new List<Block> { 119 new Block { 120 Id = "iOsTabletFix", 121 SortId = 90, 122 Template = RenderIosTabletFix() 123 } 124 } 125 } 126 } 127 } 128 } 129 } 130 } 131 }; 132 133 masterPage.Add(root); 134 } 135 136 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 137 @using System.Text.RegularExpressions 138 @using System.Collections.Generic 139 @using System.Reflection 140 @using System.Web 141 @using System.Web.UI.HtmlControls 142 @using Dynamicweb.Rapido.Blocks.Components 143 @using Dynamicweb.Rapido.Blocks.Components.Articles 144 @using Dynamicweb.Rapido.Blocks.Components.Documentation 145 @using Dynamicweb.Rapido.Blocks 146 147 148 @*--- START: Base block renderers ---*@ 149 150 @helper RenderBlockList(List<Block> blocks) 151 { 152 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 153 blocks = blocks.OrderBy(item => item.SortId).ToList(); 154 155 foreach (Block item in blocks) 156 { 157 if (debug) 158 { 159 <!-- Block START: @item.Id --> 160 } 161 162 if (item.Design == null) 163 { 164 @RenderBlock(item) 165 } 166 else if (item.Design.RenderType == RenderType.None) 167 { 168 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 169 170 <div class="@cssClass dw-mod"> 171 @RenderBlock(item) 172 </div> 173 } 174 else if (item.Design.RenderType != RenderType.Hide) 175 { 176 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 177 178 if (!item.SkipRenderBlocksList) 179 { 180 if (item.Design.RenderType == RenderType.Row) 181 { 182 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 183 @RenderBlock(item) 184 </div> 185 } 186 187 if (item.Design.RenderType == RenderType.Column) 188 { 189 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 190 string size = item.Design.Size ?? "12"; 191 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 192 193 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id"> 194 @RenderBlock(item) 195 </div> 196 } 197 198 if (item.Design.RenderType == RenderType.Table) 199 { 200 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 201 @RenderBlock(item) 202 </table> 203 } 204 205 if (item.Design.RenderType == RenderType.TableRow) 206 { 207 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 208 @RenderBlock(item) 209 </tr> 210 } 211 212 if (item.Design.RenderType == RenderType.TableColumn) 213 { 214 <td class="@cssClass dw-mod" id="Block__@item.Id"> 215 @RenderBlock(item) 216 </td> 217 } 218 219 if (item.Design.RenderType == RenderType.CardHeader) 220 { 221 <div class="card-header @cssClass dw-mod"> 222 @RenderBlock(item) 223 </div> 224 } 225 226 if (item.Design.RenderType == RenderType.CardBody) 227 { 228 <div class="card @cssClass dw-mod"> 229 @RenderBlock(item) 230 </div> 231 } 232 233 if (item.Design.RenderType == RenderType.CardFooter) 234 { 235 <div class="card-footer @cssClass dw-mod"> 236 @RenderBlock(item) 237 </div> 238 } 239 } 240 else 241 { 242 @RenderBlock(item) 243 } 244 } 245 246 if (debug) 247 { 248 <!-- Block END: @item.Id --> 249 } 250 } 251 } 252 253 @helper RenderBlock(Block item) 254 { 255 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 256 257 if (item.Template != null) 258 { 259 @BlocksPage.RenderTemplate(item.Template) 260 } 261 262 if (item.Component != null) 263 { 264 string customSufix = "Custom"; 265 string methodName = item.Component.HelperName; 266 267 ComponentBase[] methodParameters = new ComponentBase[1]; 268 methodParameters[0] = item.Component; 269 Type methodType = this.GetType(); 270 271 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 272 MethodInfo generalMethod = methodType.GetMethod(methodName); 273 274 try 275 { 276 if (debug) 277 { 278 <!-- Component: @methodName.Replace("Render", "") --> 279 } 280 if (customMethod != null) 281 { 282 @customMethod.Invoke(this, methodParameters).ToString(); 283 } 284 else 285 { 286 @generalMethod.Invoke(this, methodParameters).ToString(); 287 } 288 } 289 catch 290 { 291 try 292 { 293 @generalMethod.Invoke(this, methodParameters).ToString(); 294 } 295 catch (Exception ex) 296 { 297 throw new Exception(item.Component.GetType().Name + " method '" + methodName + "' could not be invoked", ex); 298 } 299 } 300 } 301 302 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 303 { 304 @RenderBlockList(item.BlocksList) 305 } 306 } 307 308 @*--- END: Base block renderers ---*@ 309 310 311 @* Include the components *@ 312 @using Dynamicweb.Rapido.Blocks.Components 313 @using Dynamicweb.Rapido.Blocks.Components.General 314 @using Dynamicweb.Rapido.Blocks 315 @using System.IO 316 317 @* Required *@ 318 @using Dynamicweb.Rapido.Blocks.Components 319 @using Dynamicweb.Rapido.Blocks.Components.General 320 @using Dynamicweb.Rapido.Blocks 321 322 323 @helper Render(ComponentBase component) 324 { 325 if (component != null) 326 { 327 @component.Render(this) 328 } 329 } 330 331 @* Components *@ 332 @using System.Reflection 333 @using Dynamicweb.Rapido.Blocks.Components.General 334 335 336 @* Component *@ 337 338 @helper RenderIcon(Icon settings) 339 { 340 if (settings != null) 341 { 342 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 343 344 if (settings.Name != null) 345 { 346 if (settings.Prefix == "svg" || settings.Name.Contains(".svg")) 347 { 348 349 <span class="u-flex u-flex--row " style="align-items: center;gap: 10px;justify-content: center"> <img width="18" height="18" src="@settings.Name"/> @settings.Label </span> 350 }else{ 351 if (string.IsNullOrEmpty(settings.Label)) 352 { 353 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 354 } 355 else 356 { 357 if (settings.LabelPosition == IconLabelPosition.Before) 358 { 359 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span> 360 } 361 else 362 { 363 <span><i class="@settings.Prefix @settings.Name u-margin-right--lg @settings.CssClass u-w20px" @color></i>@settings.Label</span> 364 } 365 } 366 } 367 } 368 else if (!string.IsNullOrEmpty(settings.Label)) 369 { 370 @settings.Label 371 } 372 } 373 } 374 @using System.Reflection 375 @using Dynamicweb.Rapido.Blocks.Components.General 376 @using Dynamicweb.Rapido.Blocks.Components 377 @using Dynamicweb.Core 378 379 @* Component *@ 380 381 @helper RenderButton(Button settings) 382 { 383 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 384 { 385 Dictionary<string, string> attributes = new Dictionary<string, string>(); 386 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 387 if (settings.Disabled) { 388 attributes.Add("disabled", "true"); 389 classList.Add("disabled"); 390 } 391 392 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 393 { 394 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 395 @RenderConfirmDialog(settings); 396 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 397 } 398 399 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 400 /*if (!string.IsNullOrEmpty(settings.Image)) { attributes.Add("image", settings.Image); }*/ 401 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 402 if (!string.IsNullOrEmpty(settings.AltText)) 403 { 404 attributes.Add("title", settings.AltText); 405 } 406 else if (!string.IsNullOrEmpty(settings.Title)) 407 { 408 attributes.Add("title", settings.Title); 409 } 410 411 var onClickEvents = new List<string>(); 412 if (!string.IsNullOrEmpty(settings.OnClick)) 413 { 414 onClickEvents.Add(settings.OnClick); 415 } 416 if (!string.IsNullOrEmpty(settings.Href)) 417 { 418 onClickEvents.Add("location.href='" + settings.Href + "'"); 419 } 420 if (onClickEvents.Count > 0) 421 { 422 attributes.Add("onClick", string.Join(";", onClickEvents)); 423 } 424 425 if (settings.ButtonLayout != ButtonLayout.None) 426 { 427 classList.Add("btn"); 428 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 429 if (btnLayout == "linkclean") 430 { 431 btnLayout = "link-clean"; //fix 432 } 433 classList.Add("btn--" + btnLayout); 434 } 435 436 if (settings.Icon == null) 437 { 438 settings.Icon = new Icon(); 439 } 440 settings.Icon.Label = settings.Title; 441 442 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 443 444 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 445 } 446 } 447 448 @helper RenderConfirmDialog(Button settings) 449 { 450 Modal confirmDialog = new Modal { 451 Id = settings.Id, 452 Width = ModalWidth.Sm, 453 Heading = new Heading 454 { 455 Level = 2, 456 Title = settings.ConfirmTitle 457 }, 458 BodyText = settings.ConfirmText 459 }; 460 461 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 462 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 463 464 @Render(confirmDialog) 465 } 466 @using Dynamicweb.Rapido.Blocks.Components.General 467 @using Dynamicweb.Rapido.Blocks.Components 468 @using Dynamicweb.Core 469 470 @helper RenderDashboard(Dashboard settings) 471 { 472 var widgets = settings.GetWidgets(); 473 474 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 475 { 476 //set bg color for them 477 478 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 479 int r = Convert.ToInt16(color.R); 480 int g = Convert.ToInt16(color.G); 481 int b = Convert.ToInt16(color.B); 482 483 var count = widgets.Length; 484 var max = Math.Max(r, Math.Max(g, b)); 485 double step = 255.0 / (max * count); 486 var i = 0; 487 foreach (var widget in widgets) 488 { 489 i++; 490 491 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 492 widget.BackgroundColor = shade; 493 } 494 } 495 496 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 497 @foreach (var widget in widgets) 498 { 499 <div class="dashboard__widget"> 500 @Render(widget) 501 </div> 502 } 503 </div> 504 } 505 @using Dynamicweb.Rapido.Blocks.Components.General 506 @using Dynamicweb.Rapido.Blocks.Components 507 508 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 509 { 510 if (!string.IsNullOrEmpty(settings.Link)) 511 { 512 var backgroundStyles = ""; 513 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 514 { 515 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 516 } 517 518 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 519 <div class="u-center-middle u-color-light"> 520 @if (settings.Icon != null) 521 { 522 settings.Icon.CssClass += "widget__icon"; 523 @Render(settings.Icon) 524 } 525 <div class="widget__title">@settings.Title</div> 526 </div> 527 </a> 528 } 529 } 530 @using Dynamicweb.Rapido.Blocks.Components.General 531 @using Dynamicweb.Rapido.Blocks.Components 532 533 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 534 { 535 var backgroundStyles = ""; 536 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 537 { 538 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 539 } 540 541 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 542 <div class="u-center-middle u-color-light"> 543 @if (settings.Icon != null) 544 { 545 settings.Icon.CssClass += "widget__icon"; 546 @Render(settings.Icon) 547 } 548 <div class="widget__counter">@settings.Count</div> 549 <div class="widget__title">@settings.Title</div> 550 </div> 551 </div> 552 } 553 @using System.Reflection 554 @using Dynamicweb.Rapido.Blocks.Components.General 555 @using Dynamicweb.Rapido.Blocks.Components 556 @using Dynamicweb.Core 557 558 @* Component *@ 559 560 @helper RenderLink(Link settings) 561 { 562 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 563 { 564 Dictionary<string, string> attributes = new Dictionary<string, string>(); 565 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 566 if (settings.Disabled) 567 { 568 attributes.Add("disabled", "true"); 569 classList.Add("disabled"); 570 } 571 572 if (!string.IsNullOrEmpty(settings.AltText)) 573 { 574 attributes.Add("title", settings.AltText); 575 } 576 else if (!string.IsNullOrEmpty(settings.Title)) 577 { 578 attributes.Add("title", settings.Title); 579 } 580 581 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 582 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 583 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 584 attributes.Add("href", settings.Href); 585 586 if (settings.ButtonLayout != ButtonLayout.None) 587 { 588 classList.Add("btn"); 589 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 590 if (btnLayout == "linkclean") 591 { 592 btnLayout = "link-clean"; //fix 593 } 594 classList.Add("btn--" + btnLayout); 595 } 596 597 if (settings.Icon == null) 598 { 599 settings.Icon = new Icon(); 600 } 601 settings.Icon.Label = settings.Title; 602 603 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 604 { 605 settings.Rel = LinkRelType.Noopener; 606 } 607 if (settings.Target != LinkTargetType.None) 608 { 609 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 610 } 611 if (settings.Download) 612 { 613 attributes.Add("download", "true"); 614 } 615 if (settings.Rel != LinkRelType.None) 616 { 617 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 618 } 619 620 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 621 } 622 } 623 @using System.Reflection 624 @using Dynamicweb.Rapido.Blocks.Components 625 @using Dynamicweb.Rapido.Blocks.Components.General 626 @using Dynamicweb.Rapido.Blocks 627 628 629 @* Component *@ 630 631 @helper RenderRating(Rating settings) 632 { 633 if (settings.Score > 0) 634 { 635 int rating = settings.Score; 636 string iconType = "fa-star"; 637 638 switch (settings.Type.ToString()) { 639 case "Stars": 640 iconType = "fa-star"; 641 break; 642 case "Hearts": 643 iconType = "fa-heart"; 644 break; 645 case "Lemons": 646 iconType = "fa-lemon"; 647 break; 648 case "Bombs": 649 iconType = "fa-bomb"; 650 break; 651 } 652 653 <div class="u-ta-right"> 654 @for (int i = 0; i < settings.OutOf; i++) 655 { 656 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 657 } 658 </div> 659 } 660 } 661 @using System.Reflection 662 @using Dynamicweb.Rapido.Blocks.Components.General 663 @using Dynamicweb.Rapido.Blocks.Components 664 665 666 @* Component *@ 667 668 @helper RenderSelectFieldOption(SelectFieldOption settings) 669 { 670 Dictionary<string, string> attributes = new Dictionary<string, string>(); 671 if (settings.Checked) { attributes.Add("selected", "true"); } 672 if (settings.Disabled) { attributes.Add("disabled", "true"); } 673 if (settings.Value != null) { attributes.Add("value", settings.Value); } 674 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 675 676 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 677 } 678 @using System.Reflection 679 @using Dynamicweb.Rapido.Blocks.Components.General 680 @using Dynamicweb.Rapido.Blocks.Components 681 682 683 @* Component *@ 684 685 @helper RenderNavigation(Navigation settings) { 686 @RenderNavigation(new 687 { 688 id = settings.Id, 689 cssclass = settings.CssClass, 690 startLevel = settings.StartLevel, 691 endlevel = settings.EndLevel, 692 expandmode = settings.Expandmode, 693 sitemapmode = settings.SitemapMode, 694 template = settings.Template 695 }) 696 } 697 @using Dynamicweb.Rapido.Blocks.Components.General 698 @using Dynamicweb.Rapido.Blocks.Components 699 700 701 @* Component *@ 702 703 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 704 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 705 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 706 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 707 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 708 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 709 settings.SitemapMode = false; 710 711 @RenderNavigation(settings) 712 } 713 @using Dynamicweb.Rapido.Blocks.Components.General 714 @using Dynamicweb.Rapido.Blocks.Components 715 716 717 @* Component *@ 718 719 @helper RenderLeftNavigation(LeftNavigation settings) { 720 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 721 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 722 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 723 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 724 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 725 726 <div class="grid__cell"> 727 @RenderNavigation(settings) 728 </div> 729 } 730 @using System.Reflection 731 @using Dynamicweb.Rapido.Blocks.Components.General 732 @using Dynamicweb.Core 733 734 @* Component *@ 735 736 @helper RenderHeading(Heading settings) 737 { 738 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 739 { 740 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 741 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 742 743 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 744 if (!string.IsNullOrEmpty(settings.Link)) 745 { 746 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 747 } 748 else 749 { 750 if (settings.Icon == null) 751 { 752 settings.Icon = new Icon(); 753 } 754 settings.Icon.Label = settings.Title; 755 @Render(settings.Icon) 756 } 757 @("</" + tagName + ">"); 758 } 759 } 760 @using Dynamicweb.Rapido.Blocks.Components 761 @using Dynamicweb.Rapido.Blocks.Components.General 762 @using Dynamicweb.Rapido.Blocks 763 764 765 @* Component *@ 766 767 @helper RenderImage(Image settings) 768 { 769 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 770 { 771 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 772 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 773 774 if (settings.Caption != null) 775 { 776 @:<div> 777 } 778 779 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 780 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 781 782 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 783 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 784 @if (settings.Link != null) 785 { 786 <a href="@settings.Link"> 787 @RenderTheImage(settings) 788 </a> 789 } 790 else 791 { 792 @RenderTheImage(settings) 793 } 794 </div> 795 </div> 796 797 if (settings.Caption != null) 798 { 799 <span class="image-caption dw-mod">@settings.Caption</span> 800 @:</div> 801 } 802 } 803 else 804 { 805 if (settings.Caption != null) 806 { 807 @:<div> 808 } 809 if (!string.IsNullOrEmpty(settings.Link)) 810 { 811 <a href="@settings.Link"> 812 @RenderTheImage(settings) 813 </a> 814 } 815 else 816 { 817 @RenderTheImage(settings) 818 } 819 820 if (settings.Caption != null) 821 { 822 <span class="image-caption dw-mod">@settings.Caption</span> 823 @:</div> 824 } 825 } 826 } 827 828 @helper RenderTheImage(Image settings) 829 { 830 if (settings != null) 831 { 832 string placeholderImage = "/Files/Images/placeholder.gif"; 833 string imageEngine = "/Admin/Public/GetImage.ashx?"; 834 string alternativeImage = "/Images/Kraemer/RapidoProducts/missing-image.jpg"; 835 836 string imageStyle = ""; 837 838 switch (settings.Style) 839 { 840 case ImageStyle.Ball: 841 imageStyle = "grid__cell-img--ball"; 842 break; 843 844 case ImageStyle.Triangle: 845 imageStyle = "grid__cell-img--triangle"; 846 break; 847 } 848 849 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 850 { 851 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 852 853 if (settings.ImageDefault != null) 854 { 855 settings.ImageDefault.Height = settings.ImageDefault.Width; 856 } 857 if (settings.ImageMedium != null) 858 { 859 settings.ImageMedium.Height = settings.ImageMedium.Width; 860 } 861 if (settings.ImageSmall != null) 862 { 863 settings.ImageSmall.Height = settings.ImageSmall.Width; 864 } 865 } 866 867 string defaultImage = imageEngine; 868 string imageSmall = ""; 869 string imageMedium = ""; 870 871 if (settings.DisableImageEngine) 872 { 873 defaultImage = settings.Path; 874 } 875 else 876 { 877 if (settings.ImageDefault != null) 878 { 879 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 880 881 if (settings.Path.GetType() != typeof(string)) 882 { 883 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 884 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 885 } 886 else 887 { 888 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 889 } 890 defaultImage += "&altFmImage_path=" + alternativeImage; 891 } 892 893 if (settings.ImageSmall != null) 894 { 895 imageSmall = "data-src-small=\"" + imageEngine; 896 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 897 898 if (settings.Path.GetType() != typeof(string)) 899 { 900 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 901 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 902 } 903 else 904 { 905 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 906 } 907 908 imageSmall += "\""; 909 } 910 911 if (settings.ImageMedium != null) 912 { 913 imageMedium = "data-src-medium=\"" + imageEngine; 914 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 915 916 if (settings.Path.GetType() != typeof(string)) 917 { 918 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 919 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 920 } 921 else 922 { 923 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 924 } 925 926 imageMedium += "\""; 927 } 928 } 929 930 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 931 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 932 if (!string.IsNullOrEmpty(settings.Title)) 933 { 934 optionalAttributes.Add("alt", settings.Title); 935 optionalAttributes.Add("title", settings.Title); 936 } 937 938 if (settings.DisableLazyLoad) 939 { 940 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 941 } 942 else 943 { 944 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 945 } 946 } 947 } 948 @using System.Reflection 949 @using Dynamicweb.Rapido.Blocks.Components.General 950 @using Dynamicweb.Rapido.Blocks.Components 951 952 @* Component *@ 953 954 @helper RenderFileField(FileField settings) 955 { 956 var attributes = new Dictionary<string, string>(); 957 if (string.IsNullOrEmpty(settings.Id)) 958 { 959 settings.Id = Guid.NewGuid().ToString("N"); 960 } 961 962 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 963 if (settings.Disabled) { attributes.Add("disabled", "true"); } 964 if (settings.Required) { attributes.Add("required", "true"); } 965 if (settings.Multiple) { attributes.Add("multiple", "true"); } 966 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 967 if (string.IsNullOrEmpty(settings.ChooseFileText)) 968 { 969 settings.ChooseFileText = Translate("Choose file"); 970 } 971 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 972 { 973 settings.NoFilesChosenText = Translate("No files chosen..."); 974 } 975 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 976 977 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 978 979 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 980 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 981 982 attributes.Add("type", "file"); 983 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 984 settings.CssClass = "u-full-width " + settings.CssClass; 985 986 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 987 988 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 989 @if (!string.IsNullOrEmpty(settings.Label)) 990 { 991 <label for="@settings.Id">@settings.Label</label> 992 } 993 @if (!string.IsNullOrEmpty(settings.HelpText)) 994 { 995 <small class="form__help-text">@settings.HelpText</small> 996 } 997 998 <div class="form__field-combi file-input u-no-margin dw-mod"> 999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 1002 @if (settings.UploadButton != null) 1003 { 1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 1005 @Render(settings.UploadButton) 1006 } 1007 </div> 1008 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1009 </div> 1010 } 1011 @using System.Reflection 1012 @using Dynamicweb.Rapido.Blocks.Components.General 1013 @using Dynamicweb.Rapido.Blocks.Components 1014 @using Dynamicweb.Core 1015 @using System.Linq 1016 1017 @* Component *@ 1018 1019 @helper RenderDateTimeField(DateTimeField settings) 1020 { 1021 if (string.IsNullOrEmpty(settings.Id)) 1022 { 1023 settings.Id = Guid.NewGuid().ToString("N"); 1024 } 1025 1026 var textField = new TextField { 1027 Name = settings.Name, 1028 Id = settings.Id, 1029 Label = settings.Label, 1030 HelpText = settings.HelpText, 1031 Value = settings.Value, 1032 Disabled = settings.Disabled, 1033 Required = settings.Required, 1034 ErrorMessage = settings.ErrorMessage, 1035 CssClass = settings.CssClass, 1036 WrapperCssClass = settings.WrapperCssClass, 1037 OnChange = settings.OnChange, 1038 OnClick = settings.OnClick, 1039 ExtraAttributes = settings.ExtraAttributes, 1040 // 1041 Placeholder = settings.Placeholder 1042 }; 1043 1044 @Render(textField) 1045 1046 List<string> jsAttributes = new List<string>(); 1047 1048 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1049 1050 if (!string.IsNullOrEmpty(settings.DateFormat)) 1051 { 1052 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1053 } 1054 if (!string.IsNullOrEmpty(settings.MinDate)) 1055 { 1056 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1057 } 1058 if (!string.IsNullOrEmpty(settings.MaxDate)) 1059 { 1060 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1061 } 1062 if (settings.IsInline) 1063 { 1064 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1065 } 1066 if (settings.EnableTime) 1067 { 1068 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1069 } 1070 if (settings.EnableWeekNumbers) 1071 { 1072 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1073 } 1074 1075 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1076 1077 <script> 1078 document.addEventListener("DOMContentLoaded", function () { 1079 flatpickr("#@textField.Id", { 1080 @string.Join(",", jsAttributes) 1081 }); 1082 }); 1083 </script> 1084 } 1085 @using System.Reflection 1086 @using Dynamicweb.Rapido.Blocks.Components.General 1087 @using Dynamicweb.Rapido.Blocks.Components 1088 1089 @* Component *@ 1090 1091 @helper RenderTextField(TextField settings) 1092 { 1093 var attributes = new Dictionary<string, string>(); 1094 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1095 { 1096 settings.Id = Guid.NewGuid().ToString("N"); 1097 } 1098 1099 /*base settings*/ 1100 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1101 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1102 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1103 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1104 if (settings.Required) { attributes.Add("required", "true"); } 1105 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1106 /*end*/ 1107 1108 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1109 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1110 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1111 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1112 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1113 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1114 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1115 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1116 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1117 settings.CssClass = "u-full-width " + settings.CssClass; 1118 1119 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1120 1121 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1122 1123 string noMargin = "u-no-margin"; 1124 if (!settings.ReadOnly) { 1125 noMargin = ""; 1126 } 1127 1128 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1129 @if (!string.IsNullOrEmpty(settings.Label)) 1130 { 1131 <label for="@settings.Id">@settings.Label</label> 1132 } 1133 @if (!string.IsNullOrEmpty(settings.HelpText)) 1134 { 1135 <small class="form__help-text">@settings.HelpText</small> 1136 } 1137 1138 @if (settings.ActionButton != null) 1139 { 1140 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1141 <div class="form__field-combi u-no-margin dw-mod"> 1142 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1143 @Render(settings.ActionButton) 1144 </div> 1145 } 1146 else 1147 { 1148 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1149 } 1150 1151 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1152 </div> 1153 } 1154 @using System.Reflection 1155 @using Dynamicweb.Rapido.Blocks.Components.General 1156 @using Dynamicweb.Rapido.Blocks.Components 1157 1158 @* Component *@ 1159 1160 @helper RenderNumberField(NumberField settings) 1161 { 1162 var attributes = new Dictionary<string, string>(); 1163 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1164 { 1165 settings.Id = Guid.NewGuid().ToString("N"); 1166 } 1167 1168 /*base settings*/ 1169 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1170 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1171 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1172 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1173 if (settings.Required) { attributes.Add("required", "true"); } 1174 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1175 /*end*/ 1176 1177 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1178 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1179 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1180 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1181 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1182 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1183 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1184 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1185 attributes.Add("type", "number"); 1186 1187 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1188 1189 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1190 @if (!string.IsNullOrEmpty(settings.Label)) 1191 { 1192 <label for="@settings.Id">@settings.Label</label> 1193 } 1194 @if (!string.IsNullOrEmpty(settings.HelpText)) 1195 { 1196 <small class="form__help-text">@settings.HelpText</small> 1197 } 1198 1199 @if (settings.ActionButton != null) 1200 { 1201 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1202 <div class="form__field-combi u-no-margin dw-mod"> 1203 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1204 @Render(settings.ActionButton) 1205 </div> 1206 } 1207 else 1208 { 1209 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1210 } 1211 1212 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1213 </div> 1214 } 1215 @using System.Reflection 1216 @using Dynamicweb.Rapido.Blocks.Components.General 1217 @using Dynamicweb.Rapido.Blocks.Components 1218 1219 1220 @* Component *@ 1221 1222 @helper RenderTextareaField(TextareaField settings) 1223 { 1224 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1225 string id = settings.Id; 1226 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1227 { 1228 id = Guid.NewGuid().ToString("N"); 1229 } 1230 1231 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1232 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1233 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1234 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1235 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1236 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1237 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1238 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1239 if (settings.Required) { attributes.Add("required", "true"); } 1240 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1241 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1242 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1243 attributes.Add("name", settings.Name); 1244 1245 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1246 1247 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1248 @if (!string.IsNullOrEmpty(settings.Label)) 1249 { 1250 <label for="@id">@settings.Label</label> 1251 } 1252 @if (!string.IsNullOrEmpty(settings.HelpText)) 1253 { 1254 <small class="form__help-text">@settings.HelpText</small> 1255 } 1256 1257 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1258 1259 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1260 </div> 1261 } 1262 @using System.Reflection 1263 @using Dynamicweb.Rapido.Blocks.Components.General 1264 @using Dynamicweb.Rapido.Blocks.Components 1265 1266 1267 @* Component *@ 1268 1269 @helper RenderHiddenField(HiddenField settings) { 1270 var attributes = new Dictionary<string, string>(); 1271 attributes.Add("type", "hidden"); 1272 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1273 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1274 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1275 1276 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1277 } 1278 @using System.Reflection 1279 @using Dynamicweb.Rapido.Blocks.Components.General 1280 @using Dynamicweb.Rapido.Blocks.Components 1281 1282 @* Component *@ 1283 1284 @helper RenderCheckboxField(CheckboxField settings) 1285 { 1286 var attributes = new Dictionary<string, string>(); 1287 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1288 { 1289 settings.Id = Guid.NewGuid().ToString("N"); 1290 } 1291 1292 /*base settings*/ 1293 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1294 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1295 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1296 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1297 if (settings.Required) { attributes.Add("required", "true"); } 1298 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1299 /*end*/ 1300 1301 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1302 1303 attributes.Add("type", "checkbox"); 1304 if (settings.Checked) { attributes.Add("checked", "true"); } 1305 settings.CssClass = "form__control " + settings.CssClass; 1306 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1307 1308 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1309 1310 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1311 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1312 @if (!string.IsNullOrEmpty(settings.Label)) 1313 { 1314 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1315 } 1316 @if (!string.IsNullOrEmpty(settings.HelpText)) 1317 { 1318 <small class="form__help-text">@settings.HelpText</small> 1319 } 1320 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1321 </div> 1322 } 1323 @using System.Reflection 1324 @using Dynamicweb.Rapido.Blocks.Components.General 1325 @using Dynamicweb.Rapido.Blocks.Components 1326 1327 1328 @* Component *@ 1329 1330 @helper RenderCheckboxListField(CheckboxListField settings) 1331 { 1332 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1333 @if (!string.IsNullOrEmpty(settings.Label)) 1334 { 1335 <label>@settings.Label</label> 1336 } 1337 @if (!string.IsNullOrEmpty(settings.HelpText)) 1338 { 1339 <small class="form__help-text">@settings.HelpText</small> 1340 } 1341 1342 @foreach (var item in settings.Options) 1343 { 1344 if (settings.Required) 1345 { 1346 item.Required = true; 1347 } 1348 if (settings.Disabled) 1349 { 1350 item.Disabled = true; 1351 } 1352 if (!string.IsNullOrEmpty(settings.Name)) 1353 { 1354 item.Name = settings.Name; 1355 } 1356 if (!string.IsNullOrEmpty(settings.CssClass)) 1357 { 1358 item.CssClass += settings.CssClass; 1359 } 1360 1361 /* value is not supported */ 1362 1363 if (!string.IsNullOrEmpty(settings.OnClick)) 1364 { 1365 item.OnClick += settings.OnClick; 1366 } 1367 if (!string.IsNullOrEmpty(settings.OnChange)) 1368 { 1369 item.OnChange += settings.OnChange; 1370 } 1371 @Render(item) 1372 } 1373 1374 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1375 </div> 1376 } 1377 @using Dynamicweb.Rapido.Blocks.Components.General 1378 1379 @* Component *@ 1380 1381 @helper RenderSearch(Search settings) 1382 { 1383 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1384 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1385 1386 if (string.IsNullOrEmpty(settings.Id)) 1387 { 1388 settings.Id = Guid.NewGuid().ToString("N"); 1389 } 1390 1391 var resultAttributes = new Dictionary<string, string>(); 1392 1393 if (settings.PageSize != 0) 1394 { 1395 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1396 } 1397 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1398 { 1399 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1400 if (!string.IsNullOrEmpty(groupValue)) 1401 { 1402 resultAttributes.Add("data-selected-group", groupValue); 1403 } 1404 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1405 { 1406 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1407 } 1408 } 1409 resultAttributes.Add("data-force-init", "true"); 1410 if (settings.GoToFirstSearchResultOnEnter) 1411 { 1412 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1413 } 1414 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1415 { 1416 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1417 } 1418 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1419 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1420 1421 if (settings.SecondSearchData != null) 1422 { 1423 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1424 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1425 } 1426 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1427 { 1428 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1429 } 1430 1431 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1432 1433 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1434 1435 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1436 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1437 { 1438 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1439 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1440 } 1441 1442 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1443 1444 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1445 @if (settings.SecondSearchData != null) 1446 { 1447 <div class="search__column search__column--products dw-mod"> 1448 <div class="search__column-header dw-mod">@Translate("Products")</div> 1449 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1450 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1451 { 1452 @Render(new Link { 1453 Title = Translate("View all"), 1454 CssClass = "js-view-all-button u-margin", 1455 Href = settings.SearchData.ResultsPageUrl 1456 }); 1457 } 1458 </div> 1459 <div class="search__column search__column--pages dw-mod"> 1460 <div class="search__column-header">@Translate("Pages")</div> 1461 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1462 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1463 { 1464 @Render(new Link 1465 { 1466 Title = Translate("View all"), 1467 CssClass = "js-view-all-button u-margin", 1468 Href = settings.SecondSearchData.ResultsPageUrl 1469 }); 1470 } 1471 </div> 1472 } 1473 else 1474 { 1475 <div class="search__column search__column--only dw-mod"> 1476 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1477 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1478 { 1479 @Render(new Link { 1480 Title = Translate("View all"), 1481 CssClass = "js-view-all-button u-margin", 1482 Href = settings.SearchData.ResultsPageUrl 1483 }); 1484 } 1485 </div> 1486 } 1487 </div> 1488 1489 @if (settings.SearchButton != null) 1490 { 1491 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1492 if (settings.RenderDefaultSearchIcon) 1493 { 1494 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1495 } 1496 @Render(settings.SearchButton); 1497 } 1498 </div> 1499 } 1500 @using System.Reflection 1501 @using Dynamicweb.Rapido.Blocks.Components.General 1502 @using Dynamicweb.Rapido.Blocks.Components 1503 1504 1505 @* Component *@ 1506 1507 @helper RenderSelectField(SelectField settings) 1508 { 1509 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1510 { 1511 settings.Id = Guid.NewGuid().ToString("N"); 1512 } 1513 1514 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1515 @if (!string.IsNullOrEmpty(settings.Label)) 1516 { 1517 <label for="@settings.Id">@settings.Label</label> 1518 } 1519 @if (!string.IsNullOrEmpty(settings.HelpText)) 1520 { 1521 <small class="form__help-text">@settings.HelpText</small> 1522 } 1523 1524 @if (settings.ActionButton != null) 1525 { 1526 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1527 <div class="form__field-combi u-no-margin dw-mod"> 1528 @RenderSelectBase(settings) 1529 @Render(settings.ActionButton) 1530 </div> 1531 } 1532 else 1533 { 1534 @RenderSelectBase(settings) 1535 } 1536 1537 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1538 </div> 1539 } 1540 1541 @helper RenderSelectBase(SelectField settings) 1542 { 1543 var attributes = new Dictionary<string, string>(); 1544 1545 /*base settings*/ 1546 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1547 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1548 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1549 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1550 if (settings.Required) { attributes.Add("required", "true"); } 1551 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1552 /*end*/ 1553 1554 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1555 1556 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1557 @if (settings.Default != null) 1558 { 1559 @Render(settings.Default) 1560 } 1561 1562 @foreach (var item in settings.Options) 1563 { 1564 if (!string.IsNullOrEmpty(settings.Value)) { 1565 item.Checked = item.Value == settings.Value; 1566 } 1567 @Render(item) 1568 } 1569 </select> 1570 } 1571 @using System.Reflection 1572 @using Dynamicweb.Rapido.Blocks.Components.General 1573 @using Dynamicweb.Rapido.Blocks.Components 1574 1575 @* Component *@ 1576 1577 @helper RenderRadioButtonField(RadioButtonField settings) 1578 { 1579 var attributes = new Dictionary<string, string>(); 1580 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1581 { 1582 settings.Id = Guid.NewGuid().ToString("N"); 1583 } 1584 1585 /*base settings*/ 1586 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1587 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1588 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1589 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1590 if (settings.Required) { attributes.Add("required", "true"); } 1591 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1592 /*end*/ 1593 1594 attributes.Add("type", "radio"); 1595 if (settings.Checked) { attributes.Add("checked", "true"); } 1596 settings.CssClass = "form__control " + settings.CssClass; 1597 if (!string.IsNullOrEmpty(settings.Value)) { attributes.Add("value", settings.Value); } 1598 1599 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1600 1601 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1602 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1603 @if (!string.IsNullOrEmpty(settings.Label)) 1604 { 1605 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1606 } 1607 @if (!string.IsNullOrEmpty(settings.HelpText)) 1608 { 1609 <small class="form__help-text">@settings.HelpText</small> 1610 } 1611 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1612 </div> 1613 } 1614 @using System.Reflection 1615 @using Dynamicweb.Rapido.Blocks.Components.General 1616 @using Dynamicweb.Rapido.Blocks.Components 1617 1618 1619 @* Component *@ 1620 1621 @helper RenderRadioButtonListField(RadioButtonListField settings) 1622 { 1623 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1624 1625 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1626 @if (!string.IsNullOrEmpty(settings.Label)) 1627 { 1628 <label>@settings.Label</label> 1629 } 1630 @if (!string.IsNullOrEmpty(settings.HelpText)) 1631 { 1632 <small class="form__help-text">@settings.HelpText</small> 1633 } 1634 1635 @foreach (var item in settings.Options) 1636 { 1637 if (settings.Required) 1638 { 1639 item.Required = true; 1640 } 1641 if (settings.Disabled) 1642 { 1643 item.Disabled = true; 1644 } 1645 if (!string.IsNullOrEmpty(settings.Name)) 1646 { 1647 item.Name = settings.Name; 1648 } 1649 if (!string.IsNullOrEmpty(settings.Value) && settings.Value == item.Value) 1650 { 1651 item.Checked = true; 1652 } 1653 if (!string.IsNullOrEmpty(settings.OnClick)) 1654 { 1655 item.OnClick += settings.OnClick; 1656 } 1657 if (!string.IsNullOrEmpty(settings.OnChange)) 1658 { 1659 item.OnChange += settings.OnChange; 1660 } 1661 if (!string.IsNullOrEmpty(settings.CssClass)) 1662 { 1663 item.CssClass += settings.CssClass; 1664 } 1665 @Render(item) 1666 } 1667 1668 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1669 </div> 1670 } 1671 @using System.Reflection 1672 @using Dynamicweb.Rapido.Blocks.Components.General 1673 @using Dynamicweb.Rapido.Blocks.Components 1674 1675 1676 @* Component *@ 1677 1678 @helper RenderNotificationMessage(NotificationMessage settings) 1679 { 1680 if (!string.IsNullOrEmpty(settings.Message)) 1681 { 1682 var attributes = new Dictionary<string, string>(); 1683 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1684 1685 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1686 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>@settings.Message</div> 1687 } 1688 } 1689 @using Dynamicweb.Rapido.Blocks.Components.General 1690 1691 1692 @* Component *@ 1693 1694 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1695 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1696 1697 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender> 1698 @if (settings.SubBlocks != null) { 1699 @RenderBlockList(settings.SubBlocks) 1700 } 1701 </div> 1702 } 1703 @using System.Reflection 1704 @using Dynamicweb.Rapido.Blocks.Components.General 1705 @using Dynamicweb.Rapido.Blocks.Components 1706 @using System.Text.RegularExpressions 1707 1708 1709 @* Component *@ 1710 1711 @helper RenderSticker(Sticker settings) { 1712 if (!String.IsNullOrEmpty(settings.Title)) { 1713 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1714 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1715 1716 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1717 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1718 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1719 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1720 optionalAttributes.Add("style", styleTag); 1721 } 1722 1723 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1724 } 1725 } 1726 1727 @using System.Reflection 1728 @using Dynamicweb.Rapido.Blocks.Components.General 1729 @using Dynamicweb.Rapido.Blocks.Components 1730 1731 1732 @* Component *@ 1733 1734 @helper RenderStickersCollection(StickersCollection settings) 1735 { 1736 if (settings.Stickers.Count > 0) 1737 { 1738 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1739 1740 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1741 @foreach (Sticker sticker in settings.Stickers) 1742 { 1743 @Render(sticker) 1744 } 1745 </div> 1746 } 1747 } 1748 1749 @using Dynamicweb.Rapido.Blocks.Components.General 1750 1751 1752 @* Component *@ 1753 1754 @helper RenderForm(Form settings) { 1755 if (settings != null) 1756 { 1757 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1758 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1759 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1760 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1761 var enctypes = new Dictionary<string, string> 1762 { 1763 { "multipart", "multipart/form-data" }, 1764 { "text", "text/plain" }, 1765 { "application", "application/x-www-form-urlencoded" } 1766 }; 1767 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1768 optionalAttributes.Add("method", settings.Method.ToString()); 1769 1770 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1771 { 1772 @settings.FormStartMarkup 1773 } 1774 else 1775 { 1776 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1777 } 1778 1779 foreach (var field in settings.GetFields()) 1780 { 1781 @Render(field) 1782 } 1783 1784 @:</form> 1785 } 1786 } 1787 @using System.Reflection 1788 @using Dynamicweb.Rapido.Blocks.Components.General 1789 @using Dynamicweb.Rapido.Blocks.Components 1790 1791 1792 @* Component *@ 1793 1794 @helper RenderText(Text settings) 1795 { 1796 @settings.Content 1797 } 1798 @using System.Reflection 1799 @using Dynamicweb.Rapido.Blocks.Components.General 1800 @using Dynamicweb.Rapido.Blocks.Components 1801 1802 1803 @* Component *@ 1804 1805 @helper RenderContentModule(ContentModule settings) { 1806 if (!string.IsNullOrEmpty(settings.Content)) 1807 { 1808 @settings.Content 1809 } 1810 } 1811 @using System.Reflection 1812 @using Dynamicweb.Rapido.Blocks.Components.General 1813 @using Dynamicweb.Rapido.Blocks.Components 1814 1815 1816 @* Component *@ 1817 1818 @helper RenderModal(Modal settings) { 1819 if (settings != null) 1820 { 1821 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1822 1823 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1824 1825 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1826 1827 <div class="modal-container u-no-print"> 1828 @if (!settings.DisableDarkOverlay) 1829 { 1830 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1831 } 1832 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1833 @if (settings.Heading != null) 1834 { 1835 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1836 { 1837 <div class="modal__header modal-header bs-border-bottom"> 1838 @Render(settings.Heading) 1839 <label for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1840 </div> 1841 }else 1842 { 1843 <div class="modal__header modal-header bs-py-2"> 1844 <div class="bs-visibility-hidden"></div> 1845 <label class="bs-m-0" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> 1846 </div> 1847 } 1848 } 1849 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1850 @if (!string.IsNullOrEmpty(settings.BodyText)) 1851 { 1852 @settings.BodyText 1853 } 1854 @if (settings.BodyTemplate != null) 1855 { 1856 @settings.BodyTemplate 1857 } 1858 @{ 1859 var actions = settings.GetActions(); 1860 } 1861 </div> 1862 @if (actions.Length > 0) 1863 { 1864 <div class="modal__footer"> 1865 @foreach (var action in actions) 1866 { 1867 action.CssClass += " u-no-margin"; 1868 @Render(action) 1869 } 1870 </div> 1871 } 1872 @* <label class="new-modal__close-btn" for="@(modalId)ModalTrigger"><img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"/></label> *@ 1873 </div> 1874 </div> 1875 } 1876 } 1877 @using Dynamicweb.Rapido.Blocks.Components.General 1878 1879 @* Component *@ 1880 1881 @helper RenderMediaListItem(MediaListItem settings) 1882 { 1883 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1884 @if (!string.IsNullOrEmpty(settings.Label)) 1885 { 1886 if (!string.IsNullOrEmpty(settings.Link)) 1887 { 1888 @Render(new Link 1889 { 1890 Href = settings.Link, 1891 CssClass = "media-list-item__sticker dw-mod", 1892 ButtonLayout = ButtonLayout.None, 1893 Title = settings.Label, 1894 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1895 }) 1896 } 1897 else if (!string.IsNullOrEmpty(settings.OnClick)) 1898 { 1899 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1900 <span class="u-uppercase">@settings.Label</span> 1901 </span> 1902 } 1903 else 1904 { 1905 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1906 <span class="u-uppercase">@settings.Label</span> 1907 </span> 1908 } 1909 } 1910 <div class="media-list-item__wrap"> 1911 <div class="media-list-item__info dw-mod"> 1912 <div class="media-list-item__header dw-mod"> 1913 @if (!string.IsNullOrEmpty(settings.Title)) 1914 { 1915 if (!string.IsNullOrEmpty(settings.Link)) 1916 { 1917 @Render(new Link 1918 { 1919 Href = settings.Link, 1920 CssClass = "media-list-item__name dw-mod", 1921 ButtonLayout = ButtonLayout.None, 1922 Title = settings.Title, 1923 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1924 }) 1925 } 1926 else if (!string.IsNullOrEmpty(settings.OnClick)) 1927 { 1928 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1929 } 1930 else 1931 { 1932 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1933 } 1934 } 1935 1936 @if (!string.IsNullOrEmpty(settings.Status)) 1937 { 1938 <div class="media-list-item__state dw-mod">@settings.Status</div> 1939 } 1940 </div> 1941 @{ 1942 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1943 } 1944 1945 @Render(settings.InfoTable) 1946 </div> 1947 <div class="media-list-item__actions dw-mod"> 1948 <div class="media-list-item__actions-list dw-mod"> 1949 @{ 1950 var actions = settings.GetActions(); 1951 1952 foreach (ButtonBase action in actions) 1953 { 1954 action.ButtonLayout = ButtonLayout.None; 1955 action.CssClass += " media-list-item__action link"; 1956 1957 @Render(action) 1958 } 1959 } 1960 </div> 1961 1962 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 1963 { 1964 settings.SelectButton.CssClass += " u-no-margin"; 1965 1966 <div class="media-list-item__action-button"> 1967 @Render(settings.SelectButton) 1968 </div> 1969 } 1970 </div> 1971 </div> 1972 </div> 1973 } 1974 @using Dynamicweb.Rapido.Blocks.Components.General 1975 @using Dynamicweb.Rapido.Blocks.Components 1976 1977 @helper RenderTable(Table settings) 1978 { 1979 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1980 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1981 1982 var enumToClasses = new Dictionary<TableDesign, string> 1983 { 1984 { TableDesign.Clean, "table--clean" }, 1985 { TableDesign.Bordered, "table--bordered" }, 1986 { TableDesign.Striped, "table--striped" }, 1987 { TableDesign.Hover, "table--hover" }, 1988 { TableDesign.Compact, "table--compact" }, 1989 { TableDesign.Condensed, "table--condensed" }, 1990 { TableDesign.NoTopBorder, "table--no-top-border" } 1991 }; 1992 string tableDesignClass = ""; 1993 if (settings.Design != TableDesign.None) 1994 { 1995 tableDesignClass = enumToClasses[settings.Design]; 1996 } 1997 1998 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 1999 2000 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2001 2002 <table @ComponentMethods.AddAttributes(resultAttributes)> 2003 @if (settings.Header != null) 2004 { 2005 <thead> 2006 @Render(settings.Header) 2007 </thead> 2008 } 2009 <tbody> 2010 @foreach (var row in settings.Rows) 2011 { 2012 @Render(row) 2013 } 2014 </tbody> 2015 @if (settings.Footer != null) 2016 { 2017 <tfoot> 2018 @Render(settings.Footer) 2019 </tfoot> 2020 } 2021 </table> 2022 } 2023 @using Dynamicweb.Rapido.Blocks.Components.General 2024 @using Dynamicweb.Rapido.Blocks.Components 2025 2026 @helper RenderTableRow(TableRow settings) 2027 { 2028 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2029 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2030 2031 var enumToClasses = new Dictionary<TableRowDesign, string> 2032 { 2033 { TableRowDesign.NoBorder, "table__row--no-border" }, 2034 { TableRowDesign.Border, "table__row--border" }, 2035 { TableRowDesign.TopBorder, "table__row--top-line" }, 2036 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2037 { TableRowDesign.Solid, "table__row--solid" } 2038 }; 2039 2040 string tableRowDesignClass = ""; 2041 if (settings.Design != TableRowDesign.None) 2042 { 2043 tableRowDesignClass = enumToClasses[settings.Design]; 2044 } 2045 2046 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2047 2048 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2049 2050 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2051 @foreach (var cell in settings.Cells) 2052 { 2053 if (settings.IsHeaderRow) 2054 { 2055 cell.IsHeader = true; 2056 } 2057 @Render(cell) 2058 } 2059 </tr> 2060 } 2061 @using Dynamicweb.Rapido.Blocks.Components.General 2062 @using Dynamicweb.Rapido.Blocks.Components 2063 @using Dynamicweb.Core 2064 2065 @helper RenderTableCell(TableCell settings) 2066 { 2067 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2068 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2069 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2070 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2071 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2072 2073 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2074 2075 string tagName = settings.IsHeader ? "th" : "td"; 2076 2077 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2078 @settings.Content 2079 @("</" + tagName + ">"); 2080 } 2081 @using System.Linq 2082 @using Dynamicweb.Rapido.Blocks.Components.General 2083 2084 @* Component *@ 2085 2086 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2087 { 2088 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2089 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2090 2091 if (settings.NumberOfPages > 1) 2092 { 2093 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2094 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2095 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2096 2097 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2098 @if (settings.ShowPagingInfo) 2099 { 2100 <div class="pager__info dw-mod"> 2101 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2102 </div> 2103 } 2104 <ul class="pager__list dw-mod"> 2105 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2106 { 2107 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2108 } 2109 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2110 { 2111 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2112 } 2113 @if (settings.GetPages().Any()) 2114 { 2115 foreach (var page in settings.GetPages()) 2116 { 2117 @Render(page) 2118 } 2119 } 2120 else 2121 { 2122 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2123 { 2124 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2125 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2126 } 2127 } 2128 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2129 { 2130 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2131 } 2132 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2133 { 2134 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2135 } 2136 </ul> 2137 </div> 2138 } 2139 } 2140 2141 @helper RenderPaginationItem(PaginationItem settings) 2142 { 2143 if (settings.Icon == null) 2144 { 2145 settings.Icon = new Icon(); 2146 } 2147 2148 settings.Icon.Label = settings.Label; 2149 <li class="pager__btn dw-mod"> 2150 @if (settings.IsActive) 2151 { 2152 <span class="pager__num pager__num--current dw-mod"> 2153 @Render(settings.Icon) 2154 </span> 2155 } 2156 else 2157 { 2158 <a href="@settings.Link" class="pager__num dw-mod"> 2159 @Render(settings.Icon) 2160 </a> 2161 } 2162 </li> 2163 } 2164 2165 2166 @using Dynamicweb.Rapido.Blocks.Components.General 2167 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2168 2169 2170 @using Dynamicweb.Frontend 2171 @using System.Reflection 2172 @using Dynamicweb.Content.Items 2173 @using System.Web.UI.HtmlControls 2174 @using Dynamicweb.Rapido.Blocks.Components 2175 @using Dynamicweb.Rapido.Blocks 2176 @using Dynamicweb.Rapido.Blocks.Components.Articles 2177 2178 @* Components for the articles *@ 2179 @using System.Reflection 2180 @using Dynamicweb.Rapido.Blocks.Components.Articles 2181 2182 2183 @* Component for the articles *@ 2184 2185 @helper RenderArticleBanner(dynamic settings) { 2186 string filterClasses = "image-filter image-filter--darken"; 2187 settings.Layout = ArticleHeaderLayout.Banner; 2188 2189 if (settings.Image != null) 2190 { 2191 if (settings.Image.Path != null) 2192 { 2193 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width"> 2194 <div class="background-image @filterClasses dw-mod"> 2195 <div class="background-image__wrapper @filterClasses dw-mod"> 2196 @{ 2197 settings.Image.CssClass += "background-image__cover dw-mod"; 2198 } 2199 @Render(settings.Image) 2200 </div> 2201 </div> 2202 <div class="center-container dw-mod"> 2203 <div class="grid"> 2204 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg"> 2205 <div class="u-left-middle"> 2206 <div> 2207 @if (!String.IsNullOrEmpty(settings.Heading)) 2208 { 2209 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1> 2210 } 2211 @if (!String.IsNullOrEmpty(settings.Subheading)) 2212 { 2213 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div> 2214 } 2215 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2216 { 2217 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small> 2218 } 2219 @if (!String.IsNullOrEmpty(settings.Link)) { 2220 <div class="grid__cell"> 2221 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2222 </div> 2223 } 2224 </div> 2225 </div> 2226 </div> 2227 @if (settings.ExternalParagraphId != 0) 2228 { 2229 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod"> 2230 <div class="u-color-light-gray--bg u-color-dark dw-mod"> 2231 @RenderParagraphContent(settings.ExternalParagraphId) 2232 </div> 2233 </div> 2234 } 2235 2236 </div> 2237 </div> 2238 </section> 2239 if (!String.IsNullOrEmpty(settings.Image.Caption)) { 2240 <div class="image-caption dw-mod">@settings.Image.Caption</div> 2241 } 2242 } 2243 else 2244 { 2245 settings.Layout = ArticleHeaderLayout.Clean; 2246 @RenderArticleCleanHeader(settings); 2247 } 2248 } 2249 else 2250 { 2251 settings.Layout = ArticleHeaderLayout.Clean; 2252 @RenderArticleCleanHeader(settings); 2253 } 2254 } 2255 @using System.Reflection 2256 @using Dynamicweb.Rapido.Blocks.Components 2257 @using Dynamicweb.Rapido.Blocks.Components.General 2258 @using Dynamicweb.Rapido.Blocks.Components.Articles 2259 @using Dynamicweb.Rapido.Blocks 2260 2261 2262 @* Component for the articles *@ 2263 2264 @helper RenderArticleHeader(ArticleHeader settings) { 2265 dynamic[] methodParameters = new dynamic[1]; 2266 methodParameters[0] = settings; 2267 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom"); 2268 2269 if (customMethod != null) 2270 { 2271 @customMethod.Invoke(this, methodParameters).ToString(); 2272 } else { 2273 switch (settings.Layout) 2274 { 2275 case ArticleHeaderLayout.Clean: 2276 @RenderArticleCleanHeader(settings); 2277 break; 2278 case ArticleHeaderLayout.Split: 2279 @RenderArticleSplitHeader(settings); 2280 break; 2281 case ArticleHeaderLayout.Banner: 2282 @RenderArticleBannerHeader(settings); 2283 break; 2284 case ArticleHeaderLayout.Overlay: 2285 @RenderArticleOverlayHeader(settings); 2286 break; 2287 default: 2288 @RenderArticleCleanHeader(settings); 2289 break; 2290 } 2291 } 2292 } 2293 2294 @helper RenderArticleCleanHeader(ArticleHeader settings) { 2295 dynamic[] methodParameters = new dynamic[1]; 2296 methodParameters[0] = settings; 2297 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom"); 2298 2299 if (customMethod != null) 2300 { 2301 @customMethod.Invoke(this, methodParameters).ToString(); 2302 } 2303 else 2304 { 2305 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12"; 2306 2307 <div class="grid grid--align-content-start grid--justify-start"> 2308 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod"> 2309 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0) 2310 { 2311 <div class="u-border-bottom u-padding-bottom"> 2312 @if (!String.IsNullOrEmpty(settings.Category)) 2313 { 2314 <div class="u-pull--left"> 2315 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2316 </div> 2317 } 2318 <div class="u-pull--right"> 2319 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2320 { 2321 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small> 2322 } 2323 @if (settings.RatingOutOf != 0) 2324 { 2325 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2326 } 2327 </div> 2328 </div> 2329 } 2330 2331 <div class="grid__cell"> 2332 @if (!String.IsNullOrEmpty(settings.Heading)) 2333 { 2334 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2335 } 2336 @if (settings.Image != null) 2337 { 2338 if (settings.Image.Path != null) 2339 { 2340 <div class="u-padding-bottom--lg"> 2341 @Render(settings.Image) 2342 </div> 2343 } 2344 } 2345 @if (!String.IsNullOrEmpty(settings.Subheading)) 2346 { 2347 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2348 } 2349 @if (!String.IsNullOrEmpty(settings.Link)) 2350 { 2351 <div class="grid__cell"> 2352 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2353 </div> 2354 } 2355 </div> 2356 </div> 2357 @if (settings.ExternalParagraphId != 0) 2358 { 2359 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod"> 2360 @RenderParagraphContent(settings.ExternalParagraphId) 2361 </div> 2362 } 2363 </div> 2364 } 2365 } 2366 2367 @helper RenderArticleSplitHeader(ArticleHeader settings) { 2368 dynamic[] methodParameters = new dynamic[1]; 2369 methodParameters[0] = settings; 2370 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom"); 2371 2372 if (customMethod != null) 2373 { 2374 @customMethod.Invoke(this, methodParameters).ToString(); 2375 } 2376 else 2377 { 2378 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6"; 2379 2380 if (settings.Image != null) 2381 { 2382 if (settings.Image.Path != null) 2383 { 2384 <section class="multiple-paragraphs-container paragraph-container--full-width"> 2385 <div class="grid"> 2386 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod"> 2387 <div class="u-left-middle u-padding--lg"> 2388 <div> 2389 @if (!String.IsNullOrEmpty(settings.Category)) 2390 { 2391 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div> 2392 } 2393 @if (!String.IsNullOrEmpty(settings.Heading)) 2394 { 2395 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1> 2396 } 2397 @if (!String.IsNullOrEmpty(settings.Subheading)) 2398 { 2399 <div class="article__leadtext dw-mod">@settings.Subheading</div> 2400 } 2401 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date)) 2402 { 2403 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small> 2404 } 2405 @if (settings.RatingOutOf != 0) 2406 { 2407 <div class="u-pull--right"> 2408 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf }) 2409 </div> 2410 } 2411 @if (!String.IsNullOrEmpty(settings.Link)) { 2412 <div class="u-full-width u-pull--left u-margin-top"> 2413 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout }) 2414 </div> 2415 } 2416 </div> 2417 </div> 2418 </div> 2419 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&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 4002 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper"> 4003 <div class="mini-cart dw-mod"> 4004 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button"> 4005 <div class="u-inline u-position-relative"> 4006 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i> 4007 <div class="mini-cart__counter dw-mod"> 4008 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-cart-id="@miniCartFeedPageId" data-add-to-cart-id="@WebAPIAddToCartPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 4009 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount"> 4010 @cartProductsCount 4011 </div> 4012 </div> 4013 </div> 4014 </div> 4015 </a> 4016 </div> 4017 </li> 4018 } 4019 4020 @helper RenderMobileTopSearchBar() 4021 { 4022 string searchFeedId = ""; 4023 string searchSecondFeedId = ""; 4024 int groupsFeedId; 4025 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4026 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 4027 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4028 string resultPageLink; 4029 string searchPlaceholder; 4030 string searchType = "product-search"; 4031 string searchTemplate; 4032 string searchContentTemplate = ""; 4033 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4034 bool showGroups = true; 4035 4036 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4037 { 4038 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4039 resultPageLink = contentSearchPageLink; 4040 searchPlaceholder = Translate("Search page"); 4041 groupsFeedId = 0; 4042 searchType = "content-search"; 4043 searchTemplate = "SearchPagesTemplate"; 4044 showGroups = false; 4045 } 4046 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4047 { 4048 searchFeedId = searchPageId + "&feed=true"; 4049 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4050 resultPageLink = Converter.ToString(productsPageId); 4051 searchPlaceholder = Translate("Search products or pages"); 4052 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4053 searchType = "combined-search"; 4054 searchTemplate = "SearchProductsTemplateWrap"; 4055 searchContentTemplate = "SearchPagesTemplateWrap"; 4056 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4057 } 4058 else 4059 { 4060 resultPageLink = Converter.ToString(productsPageId); 4061 searchFeedId = searchPageId + "&feed=true"; 4062 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4063 searchPlaceholder = Translate("Search products"); 4064 searchTemplate = "SearchProductsTemplate"; 4065 searchType = "product-search"; 4066 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4067 } 4068 4069 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger"/> 4070 4071 <div class="main-navigation-mobile typeahead-mobile dw-mod"> 4072 <div class="center-container top-container__center-container dw-mod"> 4073 <div class="grid"> 4074 <div class="grid__col-auto"> 4075 <div class="typeahead-mobile__search-field dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4076 <span class="u-position-relative"> 4077 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue"> 4078 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"> 4079 <i class="fas fa-times"></i> 4080 </button> 4081 </span> 4082 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4083 { 4084 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4085 } 4086 else 4087 { 4088 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4089 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4090 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4091 </div> 4092 } 4093 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"> 4094 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i> 4095 </button> 4096 </div> 4097 </div> 4098 <div class="grid__col-auto-width"> 4099 @*<ul class="menu dw-mod"> 4100 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod"> 4101 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod"> 4102 <i class="fas fa-times fa-1_5x"></i> 4103 </label> 4104 </li> 4105 </ul>*@ 4106 </div> 4107 </div> 4108 </div> 4109 </div> 4110 } 4111 4112 @helper RenderMobileMiniCartCounterContent() 4113 { 4114 <script id="MiniCartCounterContent" type="text/x-template"> 4115 {{#.}} 4116 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}"> 4117 {{numberoforderlines}} 4118 </div> 4119 {{/.}} 4120 </script> 4121 } 4122 4123 @helper RenderCategoryMenu() 4124 { 4125 var navigationMarkup = RenderNavigation(new 4126 { 4127 id = "categorynav", 4128 cssclass = "dwnavigation menu", 4129 startLevel = 1, 4130 endlevel = 2, 4131 expandmode = "all", 4132 template = "BaseMenuWithDropdown.xslt" 4133 }); 4134 4135 string searchFeedId = ""; 4136 string searchSecondFeedId = ""; 4137 int groupsFeedId; 4138 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 4139 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 4140 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 4141 string resultPageLink; 4142 string searchPlaceholder; 4143 string searchType = "product-search"; 4144 string searchTemplate; 4145 string searchContentTemplate = ""; 4146 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 4147 bool showGroups = true; 4148 4149 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch") 4150 { 4151 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4152 resultPageLink = contentSearchPageLink; 4153 searchPlaceholder = Translate("Search page"); 4154 groupsFeedId = 0; 4155 searchType = "content-search"; 4156 searchTemplate = "SearchPagesTemplate"; 4157 showGroups = false; 4158 } 4159 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch") 4160 { 4161 searchFeedId = productsPageId + "&feed=true"; 4162 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true"; 4163 resultPageLink = Converter.ToString(productsPageId); 4164 searchPlaceholder = Translate("Search products or pages"); 4165 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4166 searchType = "combined-search"; 4167 searchTemplate = "SearchProductsTemplateWrap"; 4168 searchContentTemplate = "SearchPagesTemplateWrap"; 4169 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4170 } 4171 else 4172 { 4173 resultPageLink = Converter.ToString(productsPageId); 4174 searchFeedId = searchPageId + "&feed=true"; 4175 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"); 4176 searchPlaceholder = Translate("Search products"); 4177 searchTemplate = "SearchProductsTemplate"; 4178 searchType = "product-search"; 4179 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector"); 4180 } 4181 4182 <div class=" dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType"> 4183 <span class="search-ahead__wrapper"> 4184 <input type="text" class="search-ahead__input js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue"> 4185 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"> 4186 @*<i class="fas fa-times"></i>*@ 4187 </button> 4188 <button type="button" class="search-icon__button js-typeahead-enter-btn"> 4189 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i> 4190 </button> 4191 </span> 4192 @if (string.IsNullOrEmpty(searchSecondFeedId)) 4193 { 4194 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul> 4195 } 4196 else 4197 { 4198 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid"> 4199 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div> 4200 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div> 4201 </div> 4202 } 4203 </div> 4204 }</text> 4205 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4206 4207 @using System 4208 @using System.Web 4209 @using System.Collections.Generic 4210 @using Dynamicweb.Rapido.Blocks.Extensibility 4211 @using Dynamicweb.Rapido.Blocks 4212 4213 @functions { 4214 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master"); 4215 } 4216 4217 @{ 4218 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 4219 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 4220 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 4221 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 4222 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 4223 4224 Block mobileNavigation = new Block() 4225 { 4226 Id = "MobileNavigation", 4227 SortId = 10, 4228 Template = MobileNavigation(), 4229 SkipRenderBlocksList = true 4230 }; 4231 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation); 4232 4233 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink) 4234 { 4235 Block mobileNavigationSignIn = new Block 4236 { 4237 Id = "MobileNavigationSignIn", 4238 SortId = 10, 4239 Template = RenderMobileNavigationSignIn() 4240 }; 4241 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn); 4242 } 4243 4244 Block mobileNavigationMenu = new Block 4245 { 4246 Id = "MobileNavigationMenu", 4247 SortId = 20, 4248 Template = RenderMobileNavigationMenu() 4249 }; 4250 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu); 4251 4252 Block mobileNavigationActions = new Block 4253 { 4254 Id = "MobileNavigationActions", 4255 SortId = 30, 4256 Template = RenderMobileNavigationActions(), 4257 SkipRenderBlocksList = true 4258 }; 4259 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions); 4260 4261 if (!mobileNavigationItemsHideSignIn) 4262 { 4263 if (Model.CurrentUser.ID <= 0) 4264 { 4265 Block mobileNavigationSignInAction = new Block 4266 { 4267 Id = "MobileNavigationSignInAction", 4268 SortId = 10, 4269 Template = RenderMobileNavigationSignInAction() 4270 }; 4271 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction); 4272 4273 Block mobileNavigationOldWebshop = new Block 4274 { 4275 Id = "MobileNavigationOldWebshop", 4276 SortId = 20, 4277 Template = RenderMobileNavigationOldWebshop() 4278 }; 4279 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOldWebshop); 4280 4281 if (!mobileHideCreateAccountLink) 4282 { 4283 Block mobileNavigationCreateAccountAction = new Block 4284 { 4285 Id = "MobileNavigationCreateAccountAction", 4286 SortId = 30, 4287 Template = RenderMobileNavigationCreateAccountAction() 4288 }; 4289 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction); 4290 } 4291 } 4292 else 4293 { 4294 if (!mobileHideMyOrdersLink) 4295 { 4296 Block mobileNavigationOrdersAction = new Block 4297 { 4298 Id = "MobileNavigationOrdersAction", 4299 SortId = 20, 4300 Template = RenderMobileNavigationOrdersAction() 4301 }; 4302 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction); 4303 } 4304 4305 if (!mobileHideMySavedCardsLink) 4306 { 4307 Block mobileNavigationSavedCardsAction = new Block 4308 { 4309 Id = "MobileNavigationFavoritesAction", 4310 SortId = 30, 4311 Template = RenderMobileNavigationSavedCardsAction() 4312 }; 4313 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction); 4314 } 4315 4316 Block mobileNavigationSignOutAction = new Block 4317 { 4318 Id = "MobileNavigationSignOutAction", 4319 SortId = 40, 4320 Template = RenderMobileNavigationSignOutAction() 4321 }; 4322 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction); 4323 } 4324 } 4325 4326 if (Model.Languages.Count > 1) 4327 { 4328 Block mobileNavigationLanguagesAction = new Block 4329 { 4330 Id = "MobileNavigationLanguagesAction", 4331 SortId = 50, 4332 Template = RenderMobileNavigationLanguagesAction() 4333 }; 4334 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction); 4335 } 4336 Block cartsSelectMobile = new Block 4337 { 4338 Id = "CartsSelectMobile", 4339 SortId = 60, 4340 Template = RenderCustomSelectCartsAndImpersonation() 4341 }; 4342 mobileNavigationBlocksPage.Add("MobileNavigationActions", cartsSelectMobile); 4343 } 4344 4345 4346 @helper MobileNavigation() 4347 { 4348 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList(); 4349 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left"; 4350 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right"; 4351 4352 <!-- Trigger for mobile navigation --> 4353 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" /> 4354 4355 <!-- Mobile navigation --> 4356 <nav class="mobile-navigation mobile-navigation--@position dw-mod"> 4357 <div class="mobile-navigation__wrapper u-padding-top--lg" id="mobileNavigationWrapper"> 4358 <label class="mobile-nav-trigger-on u-margin-bottom--lg u-margin-left--lg u-brand-color-three" for="MobileNavTrigger"> 4359 <span><i class="fas fa-times-circle fa-2x"></i></span> 4360 </label> 4361 @RenderBlockList(subBlocks) 4362 </div> 4363 </nav> 4364 4365 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label> 4366 } 4367 4368 @helper RenderMobileNavigationSignIn() 4369 { 4370 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4371 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4372 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4373 string myProfilePageLink = linkStart + myProfilePageId; 4374 string userName = Model.CurrentUser.FirstName; 4375 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName)) 4376 { 4377 userName += " " + Model.CurrentUser.LastName; 4378 } 4379 if (string.IsNullOrEmpty(userName)) 4380 { 4381 userName = Model.CurrentUser.Name; 4382 } 4383 if (string.IsNullOrEmpty(userName)) 4384 { 4385 userName = Model.CurrentUser.UserName; 4386 } 4387 if (string.IsNullOrEmpty(userName)) 4388 { 4389 userName = Model.CurrentUser.Email; 4390 } 4391 4392 <ul class="menu menu-mobile"> 4393 <li class="menu-mobile__item"> 4394 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4395 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @userName 4396 </a> 4397 </li> 4398 </ul> 4399 } 4400 4401 @helper RenderMobileNavigationMenu() 4402 { 4403 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4404 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt"; 4405 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3"; 4406 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 4407 int startLevel = 0; 4408 4409 @RenderNavigation(new 4410 { 4411 id = "mobilenavigation", 4412 cssclass = "menu menu-mobile dwnavigation", 4413 startLevel = @startLevel, 4414 ecomStartLevel = @startLevel + 1, 4415 endlevel = @levels, 4416 expandmode = "all", 4417 template = @menuTemplate 4418 }) 4419 4420 if (isSlidesDesign) 4421 { 4422 <script> 4423 function goToLevel(level) { 4424 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%"; 4425 } 4426 4427 document.addEventListener('DOMContentLoaded', function () { 4428 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length); 4429 }); 4430 </script> 4431 } 4432 4433 if (renderPagesInToolBar) 4434 { 4435 @RenderNavigation(new 4436 { 4437 id = "topToolsMobileNavigation", 4438 cssclass = "menu menu-mobile dwnavigation", 4439 template = "ToolsMenuForMobile.xslt" 4440 }) 4441 } 4442 } 4443 4444 @helper RenderMobileNavigationActions() 4445 { 4446 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ; 4447 4448 <ul class="menu menu-mobile"> 4449 @RenderBlockList(subBlocks) 4450 </ul> 4451 } 4452 4453 @helper RenderMobileNavigationSignInAction() 4454 { 4455 <li class="menu-mobile__item"> 4456 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label> 4457 </li> 4458 } 4459 4460 @helper RenderMobileNavigationOldWebshop() 4461 { 4462 <li class="menu-mobile__item"> 4463 <a href="https://ssoprovider.kraemer.no/users/sign_in" class="menu-mobile__link dw-mod menu-mobile__link--highlighted" onclick="RememberState.SetCookie('useAnotherAddress', false)" target="_blank"> 4464 <i class="fas fa-shopping-basket u-margin-right"></i> @Translate("Old Webshop") 4465 </a> 4466 </li> 4467 } 4468 4469 @helper RenderMobileNavigationCreateAccountAction() 4470 { 4471 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 4472 4473 <li class="menu-mobile__item"> 4474 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a> 4475 </li> 4476 } 4477 4478 @helper RenderMobileNavigationProfileAction() 4479 { 4480 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4481 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4482 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 4483 string myProfilePageLink = linkStart + myProfilePageId; 4484 4485 <li class="menu-mobile__item"> 4486 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4487 <img width="20" height="20" src="/Files/Images/my-account-svg.svg"> @Translate("My Profile") 4488 </a> 4489 </li> 4490 } 4491 4492 @helper RenderMobileNavigationOrdersAction() 4493 { 4494 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4495 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4496 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 4497 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 4498 int deviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 4499 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 4500 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 4501 int foodCalendarPageId = GetPageIdByNavigationTag("MenuView"); 4502 int foodCalendarAdminPageId = GetPageIdByNavigationTag("MenuCalendarView"); 4503 string announcementPageLink = linkStart + announcementPageId; 4504 string myOrdersPageLink = linkStart + myOrdersPageId; 4505 string myReportsPageLink = linkStart + myReportsPageId; 4506 string myDeviationsPageLink = linkStart + deviationsPageId; 4507 string myFavoritesPageLink = linkStart + myFavoritesPageId; 4508 string foodCalendarPageLink = linkStart + foodCalendarPageId; 4509 string foodCalendarAdminPageLink = linkStart + foodCalendarAdminPageId; 4510 string ordersIcon = "fas fa-list"; 4511 var user = Pageview.User; 4512 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 4513 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 4514 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 4515 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 4516 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues?.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 4517 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 4518 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 4519 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 4520 4521 <li class="menu-mobile__item"> 4522 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4523 <img width="20" height="20" src="/Files/Images/favorite-list-svg.svg"> @Translate("My Favorites") 4524 </a> 4525 </li> 4526 <li class="menu-mobile__item"> 4527 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4528 <img width="20" height="20" src="/Files/Images/order-history-svg.svg"> @Translate("My Orders") 4529 </a> 4530 </li> 4531 if (hasAccessToAnnouncements) 4532 { 4533 <li class="menu-mobile__item"> 4534 <a href="@announcementPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod u-brand-color-two bs-position-relative bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 4535 <img width="22" height="22" src="/Files/Images/notifications.svg"> 4536 <svg class="announcement_notification-dot bs-position-absolute @announcementNotificationDotClass" style="top: 45%; left: 25px;height: 13px;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 4537 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30"/> 4538 </svg> 4539 @Translate("Announcements") 4540 </a> 4541 </li> 4542 } 4543 if (hasAccessToFoodCalendar) 4544 { 4545 <li class="menu-mobile__item"> 4546 <a href="@foodCalendarPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4547 <img width="20" height="20" src="/Files/Images/food-calendar.svg"> @Translate("Matretter") 4548 </a> 4549 </li> 4550 } 4551 4552 if (isFoodCalendarAdmin) 4553 { 4554 <li class="menu-mobile__item"> 4555 <a href="@foodCalendarAdminPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4556 <img width="20" height="20" src="/Files/Images/food-calendar-menu-calendar.svg"> @Translate("Kalendervisning") 4557 </a> 4558 </li> 4559 } 4560 4561 <li class="menu-mobile__item"> 4562 <a href="@myDeviationsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4563 <img width="20" height="20" src="/Files/Images/UnionRMA-icon.svg"> @Translate("My Deviations") 4564 </a> 4565 </li> 4566 4567 if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 4568 { 4569 <li class="menu-mobile__item"> 4570 <a href="@myReportsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"> 4571 <img width="20" height="20" src="/Files/Images/IconPowerBi.svg"> @Translate("My reports") 4572 </a> 4573 </li> 4574 } 4575 4576 4577 } 4578 4579 4580 @helper RenderMobileNavigationSavedCardsAction() 4581 { 4582 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 4583 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID="; 4584 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 4585 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 4586 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card"; 4587 4588 <li class="menu-mobile__item"> 4589 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a> 4590 </li> 4591 } 4592 4593 @helper RenderMobileNavigationSignOutAction() 4594 { 4595 int pageId = Model.TopPage.ID; 4596 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt"; 4597 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 4598 bool promptForAccount = false; 4599 4600 if(userCustomFields != null) { 4601 foreach (var field in userCustomFields) 4602 { 4603 if (field.CustomField.SystemName == "AccessUser_PromptForAccount") 4604 { 4605 promptForAccount = field.Value.ToString() == "True"; 4606 } 4607 } 4608 } 4609 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 4610 { 4611 <li class="menu-mobile__item"> 4612 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4613 </li> 4614 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 4615 { 4616 if(promptForAccount) { 4617 <li class="menu-mobile__item"> 4618 <div class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="document.getElementById('MobileNavTrigger').checked = false;document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</div> 4619 </li> 4620 } else { 4621 <li class="menu-mobile__item"> 4622 <a href="/" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4623 </li> 4624 } 4625 4626 } else { 4627 <li class="menu-mobile__item"> 4628 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')"><img width="20" height="20" src="/Files/Images/log-out-svg.svg" alt="sign out"> @Translate("Sign out")</a> 4629 </li> 4630 } 4631 @* <li class="menu-mobile__item"> 4632 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a> 4633 </li>*@ 4634 } 4635 4636 @helper RenderMobileNavigationLanguagesAction() 4637 { 4638 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides"; 4639 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 4640 string selectedLanguage = ""; 4641 foreach (var lang in Model.Languages) 4642 { 4643 var language = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4644 var languageTitle = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(language.ToLower()); 4645 4646 if (lang.IsCurrent) 4647 { 4648 selectedLanguage = languageTitle; 4649 } 4650 } 4651 4652 <li class="menu-mobile__item dw-mod"> 4653 @if (isSlidesDesign) 4654 { 4655 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);"> 4656 } 4657 else 4658 { 4659 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger"> 4660 } 4661 <div class="menu-mobile__link__wrap"> 4662 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod bs-d-flex bs-align-content-center bs-flex-row bs-gap-2"><img width="20" height="20" src="/Files/Images/language-selector-svg.svg"> @selectedLanguage</label> 4663 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label> 4664 </div> 4665 <ul class="menu-mobile menu-mobile__submenu expand-menu"> 4666 @if (isSlidesDesign) 4667 { 4668 <li class="menu-mobile__item dw-mod"> 4669 <div class="menu-mobile__link__wrap"> 4670 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" /> 4671 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label> 4672 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label> 4673 </div> 4674 </li> 4675 } 4676 @*foreach (var lang in Model.Languages) 4677 { 4678 <li class="menu-mobile__item dw-mod"> 4679 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a> 4680 </li> 4681 }*@ 4682 4683 @foreach (var lang in Model.Languages) 4684 { 4685 string widthClass = "menu__item--fixed-width"; 4686 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower(); 4687 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 4688 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 4689 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 4690 var language = Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName.Split('(')[0].Trim(); 4691 4692 4693 if (languageViewType == "flag-culture") 4694 { 4695 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 4696 } 4697 4698 if (languageViewType == "flag") 4699 { 4700 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 4701 widthClass = ""; 4702 } 4703 4704 if (languageViewType == "name") 4705 { 4706 langInfo = lang.Name; 4707 } 4708 4709 if (languageViewType == "culture") 4710 { 4711 langInfo = cultureName; 4712 widthClass = ""; 4713 } 4714 4715 <li class="menu-mobile__item dw-mod"> 4716 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@langInfo</a> 4717 </li> 4718 } 4719 </ul> 4720 </li> 4721 } 4722 4723 4724 4725 4726 @helper RenderCustomSelectCartsAndImpersonation() 4727 { 4728 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 4729 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4730 bool userExists = Model.CurrentUser.ID != null && Model.CurrentUser.ID > 0; 4731 4732 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4733 string userName = userExists ? getUserName(Pageview.User) : ""; 4734 int secondaryUsersCount = Model.SecondaryUsers.Count; 4735 4736 if (userExists) 4737 { 4738 <div class="u-max-w260px u-margin-left--lg u-margin-top--lg u-margin-bottom--lg"> 4739 <span>@Translate("Handlekurv")</span> 4740 <div class="dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 4741 <div class="dw-mod"> 4742 @Render(new Button 4743 { 4744 Title = Translate("Change Cart Name"), 4745 ButtonType = ButtonType.Button, 4746 ButtonLayout = ButtonLayout.None, 4747 CssClass = "u-margin-bottom change-cart-name", 4748 OnClick = "changeCartName()" 4749 }) 4750 @Render(new Button 4751 { 4752 Title = Translate("Create New Cart"), 4753 ButtonType = ButtonType.Button, 4754 ButtonLayout = ButtonLayout.Primary, 4755 CssClass = "u-full-width", 4756 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 4757 }) 4758 </div> 4759 </div> 4760 } 4761 <div class="u-max-w260px u-margin-left--lg"> 4762 @if (secondaryUsersCount > 0) 4763 { 4764 @RenderDesktopToolsTextMobile() 4765 } 4766 </div> 4767 } 4768 4769 4770 @helper RenderDesktopToolsTextMobile() 4771 { 4772 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 4773 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 4774 bool userExists = Model.CurrentUser.ID != null && Model.CurrentUser.ID > 0; 4775 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 4776 string userName = userExists ? getUserName(Pageview.User) : ""; 4777 int secondaryUsersCount = Model.SecondaryUsers.Count; 4778 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 4779 bool promptForAccount = getPromptForAccount(); 4780 4781 <div class="" style="min-height: 30px"> 4782 @if (userExists) 4783 { 4784 <div class="u-margin-bottom--lg u-margin-top--lg u-border-top u-border-bottom u-padding-top u-padding-bottom"> 4785 @if (secondaryUsersCount > 0) 4786 { 4787 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 4788 { 4789 <div class="u-margin-right u-margin-bottom" data-prompt-account="@promptForAccount" >@userName</div> 4790 4791 if(secondaryUsersCount> 1 || promptForAccount) { 4792 @RenderImpersonationDropdownMobile(impersonationListFeedPageId) 4793 } 4794 } 4795 else 4796 { 4797 <div class="u-margin-bottom">@Translate("Choose user to impersonate:") </div> 4798 @RenderImpersonationDropdownMobile( impersonationListFeedPageId) 4799 } 4800 4801 4802 } 4803 4804 </div> 4805 if(!string.IsNullOrEmpty(customerNumber)) { 4806 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 4807 { 4808 <div>@Translate("currentLocation") <div class="location-space u-margin-bottom"></div> 4809 4810 @Render(new Button 4811 { 4812 ButtonType = ButtonType.Button, 4813 ButtonLayout = ButtonLayout.None, 4814 Title = Translate("Change Location"), 4815 CssClass = "u-no-margin btn btn--primary dw-mod", 4816 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true, document.querySelector('#MobileNavTrigger').checked = false" 4817 }) 4818 </div> 4819 } 4820 4821 } 4822 } 4823 4824 4825 </div> 4826 } 4827 4828 @helper RenderImpersonationDropdownMobile(string impersonationListFeedPageId) { 4829 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 4830 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 4831 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-test="test1"> 4832 <input type="hidden" name="DwExtranetRemoveSecondaryUser"> 4833 </form> 4834 <div class="impersonation-container"> 4835 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/> 4836 <div class="dropdown variants-filters dw-mod"> 4837 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 4838 <div class="dropdown__content u-padding dw-mod"> 4839 <div class="dropdown__item__filter"> 4840 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 4841 </div> 4842 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 4843 </div> 4844 </div> 4845 </div> 4846 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 4847 </div> 4848 4849 4850 }</text> 4851 } 4852 else 4853 { 4854 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4855 4856 @using System 4857 @using System.Web 4858 @using System.Collections.Generic 4859 @using Dynamicweb.Rapido.Blocks.Extensibility 4860 @using Dynamicweb.Rapido.Blocks 4861 4862 @functions { 4863 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master"); 4864 4865 } 4866 4867 @{ 4868 Block masterTools = new Block() 4869 { 4870 Id = "MasterDesktopTools", 4871 SortId = 10, 4872 Template = RenderDesktopTools(), 4873 SkipRenderBlocksList = true, 4874 BlocksList = new List<Block> 4875 { 4876 new Block 4877 { 4878 Id = "MasterDesktopToolsText", 4879 SortId = 10, 4880 Template = RenderDesktopToolsText(), 4881 Design = new Design 4882 { 4883 Size = "auto", 4884 HidePadding = true, 4885 RenderType = RenderType.Column 4886 } 4887 }, 4888 new Block 4889 { 4890 Id = "MasterDesktopToolsNavigation", 4891 SortId = 20, 4892 Template = RenderDesktopToolsNavigation(), 4893 Design = new Design 4894 { 4895 Size = "auto-width", 4896 HidePadding = true, 4897 RenderType = RenderType.Column 4898 } 4899 } 4900 } 4901 }; 4902 headerBlocksPage.Add("MasterHeader", masterTools); 4903 4904 Block masterDesktopExtra = new Block() 4905 { 4906 Id = "MasterDesktopExtra", 4907 SortId = 10, 4908 Template = RenderDesktopExtra(), 4909 SkipRenderBlocksList = true 4910 }; 4911 headerBlocksPage.Add("MasterHeader", masterDesktopExtra); 4912 4913 Block masterDesktopNavigation = new Block() 4914 { 4915 Id = "MasterDesktopNavigation", 4916 SortId = 20, 4917 Template = RenderDesktopNavigation(), 4918 SkipRenderBlocksList = true 4919 }; 4920 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation); 4921 4922 if (Model.CurrentUser.ID > 0) 4923 { 4924 Modal stopImpersonation = new Modal 4925 { 4926 Id = "StopImpersonation", 4927 Heading = new Heading 4928 { 4929 Level = 2, 4930 Title = Translate("Sign out"), 4931 Icon = new Icon 4932 { 4933 Name = "fa-sign-out", 4934 Prefix = "fas", 4935 LabelPosition = IconLabelPosition.After 4936 } 4937 }, 4938 Width = ModalWidth.Md, 4939 BodyTemplate = RenderStopImpersonationForm() 4940 }; 4941 4942 Block stopImpersonationBlock = new Block 4943 { 4944 Id = "StopImpersonationBlock", 4945 SortId = 10, 4946 Component = stopImpersonation 4947 }; 4948 headerBlocksPage.Add("MasterHeader", stopImpersonationBlock); 4949 } 4950 4951 } 4952 4953 @* Include the Blocks for the page *@ 4954 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4955 4956 @using System 4957 @using System.Web 4958 @using Dynamicweb.Rapido.Blocks.Extensibility 4959 @using Dynamicweb.Rapido.Blocks 4960 4961 @{ 4962 Block masterDesktopLogo = new Block 4963 { 4964 Id = "MasterDesktopLogo", 4965 SortId = 10, 4966 Template = RenderDesktopLogo(), 4967 Design = new Design 4968 { 4969 Size = "auto-width", 4970 HidePadding = true, 4971 RenderType = RenderType.Column, 4972 CssClass = "grid--align-self-center" 4973 } 4974 }; 4975 4976 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo); 4977 } 4978 4979 4980 @helper RenderDesktopLogo() 4981 { 4982 string firstPageId = Model.Area.FirstActivePage.ID.ToString(); 4983 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 4984 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : ""; 4985 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass; 4986 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png"; 4987 if (Path.GetExtension(logo).ToLower() != ".svg") 4988 { 4989 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight"); 4990 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40; 4991 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&amp;crop=5&amp;Compression=75&amp;image=" + logo; 4992 } 4993 else 4994 { 4995 logo = HttpUtility.UrlDecode(logo); 4996 } 4997 4998 <div class="logo @alignClass dw-mod"> 4999 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block"> 5000 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" /> 5001 </a> 5002 </div> 5003 } 5004 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5005 5006 @using System 5007 @using System.Web 5008 @using Dynamicweb.Rapido.Blocks.Extensibility 5009 @using Dynamicweb.Rapido.Blocks 5010 5011 @functions { 5012 bool isMegaMenu; 5013 } 5014 5015 @{ 5016 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false; 5017 Block masterDesktopMenu = new Block 5018 { 5019 Id = "MasterDesktopMenu", 5020 SortId = 10, 5021 Template = RenderDesktopMenu(), 5022 Design = new Design 5023 { 5024 Size = "auto", 5025 HidePadding = true, 5026 RenderType = RenderType.Column 5027 } 5028 }; 5029 5030 if (isMegaMenu) 5031 { 5032 masterDesktopMenu.Design.CssClass = "u-reset-position"; 5033 } 5034 5035 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu); 5036 } 5037 5038 @helper RenderDesktopMenu() 5039 { 5040 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5041 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : ""; 5042 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout; 5043 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : ""; 5044 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 5045 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders"); 5046 int startLevel = renderPagesInToolBar ? 1 : 0; 5047 5048 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink"); 5049 var user = Dynamicweb.Security.UserManagement.User.GetCurrentUser(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend); 5050 5051 bool isSlapp = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Slapp", StringComparison.OrdinalIgnoreCase)).Value.ToString() == "True" : false; 5052 5053 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment"> 5054 @if (!isMegaMenu) 5055 { 5056 if (isSlapp) 5057 { 5058 @RenderNavigation(new 5059 { 5060 id = "topnavigation", 5061 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5062 startLevel = startLevel, 5063 ecomStartLevel = startLevel + 1, 5064 endlevel = 5, 5065 expandmode = "all", 5066 template = "BaseMenuWithDropdown-nocategory.xslt" 5067 }); 5068 5069 } 5070 else 5071 { 5072 @RenderNavigation(new 5073 { 5074 id = "topnavigation", 5075 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5076 startLevel = startLevel, 5077 ecomStartLevel = startLevel + 1, 5078 endlevel = 5, 5079 expandmode = "all", 5080 template = "BaseMenuWithDropdown.xslt" 5081 }); 5082 } 5083 5084 } 5085 else 5086 { 5087 @RenderNavigation(new 5088 { 5089 id = "topnavigation", 5090 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap", 5091 startLevel = startLevel, 5092 ecomStartLevel = startLevel + 1, 5093 endlevel = 5, 5094 promotionImage = megamenuPromotionImage, 5095 promotionLink = promotionLink, 5096 expandmode = "all", 5097 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(), 5098 template = "BaseMegaMenu.xslt" 5099 }); 5100 } 5101 </div> 5102 } 5103 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5104 5105 @using System 5106 @using System.Web 5107 @using Dynamicweb.Rapido.Blocks.Extensibility 5108 @using Dynamicweb.Rapido.Blocks 5109 5110 @{ 5111 Block masterDesktopActionsMenu = new Block 5112 { 5113 Id = "MasterDesktopActionsMenu", 5114 SortId = 10, 5115 Template = RenderDesktopActionsMenu(), 5116 Design = new Design 5117 { 5118 CssClass = "u-flex" 5119 }, 5120 SkipRenderBlocksList = true 5121 5122 }; 5123 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu); 5124 5125 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"))) 5126 { 5127 Block masterDesktopActionsHeaderButton = new Block 5128 { 5129 Id = "MasterDesktopActionsHeaderButton", 5130 SortId = 60, 5131 Template = RenderHeaderButton() 5132 }; 5133 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton); 5134 } 5135 } 5136 5137 @helper RenderDesktopActionsMenu() 5138 { 5139 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList(); 5140 5141 <ul class="menu u-flex dw-mod"> 5142 @RenderBlockList(subBlocks) 5143 </ul> 5144 } 5145 5146 @helper RenderHeaderButton() 5147 { 5148 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText"); 5149 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink"); 5150 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : ""; 5151 5152 <li class="menu__item menu__item--horizontal menu--clean dw-mod"> 5153 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-top u-margin-left" href="@headerButtonLink">@headerButtonText</a> 5154 </li> 5155 } 5156 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5157 5158 @using System 5159 @using System.Security.Cryptography 5160 @using System.Web 5161 @using Dynamicweb.Core; 5162 @using System.Text.RegularExpressions 5163 @using Dynamicweb.Rapido.Blocks.Extensibility 5164 @using Dynamicweb.Rapido.Blocks 5165 5166 @{ 5167 Block masterDesktopActionsMenuLanguageSelector = new Block 5168 { 5169 Id = "MasterDesktopActionsMenuLanguageSelector", 5170 SortId = 90, 5171 Template = RenderLanguageSelector() 5172 }; 5173 5174 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector); 5175 } 5176 5177 @helper RenderLanguageSelector() 5178 { 5179 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5180 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5181 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5182 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : ""; 5183 string currentLanguage = Pageview.Area.Culture.Replace("nb","").Replace("en","").ToLower(); 5184 string currentLangInfo = "<span class=\"flag-icon flag-icon" + currentLanguage + " u-margin-right\"></span>"; 5185 5186 5187 if (Model.Languages.Count > 1) 5188 { 5189 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod"> 5190 <div class="@menuLinkClass dw-mod" title="@Translate("Language")"> 5191 @currentLangInfo 5192 </div> 5193 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell"> 5194 @foreach (var lang in Model.Languages) 5195 { 5196 string widthClass = "menu__item--fixed-width"; 5197 string languageIcon = lang.Culture.Replace("nb","").Replace("en","").ToLower(); 5198 string langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " u-margin-right\"></span>" + lang.Name; 5199 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty); 5200 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1); 5201 5202 5203 if (languageViewType == "flag-culture") 5204 { 5205 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span> " + cultureName; 5206 } 5207 5208 if (languageViewType == "flag") 5209 { 5210 langInfo = "<span class=\"flag-icon flag-icon" + languageIcon + " \"></span>"; 5211 widthClass = ""; 5212 } 5213 5214 if (languageViewType == "name") 5215 { 5216 langInfo = lang.Name; 5217 } 5218 5219 if (languageViewType == "culture") 5220 { 5221 langInfo = cultureName; 5222 widthClass = ""; 5223 } 5224 5225 <div class="menu__item dw-mod @widthClass"> 5226 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a> 5227 </div> 5228 } 5229 </div> 5230 </li> 5231 } 5232 } 5233 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5234 5235 @using System 5236 @using System.Web 5237 @using Dynamicweb.Rapido.Blocks.Extensibility 5238 @using Dynamicweb.Rapido.Blocks 5239 5240 @{ 5241 Block masterDesktopActionsMenuSignIn = new Block 5242 { 5243 Id = "MasterDesktopActionsMenuSignIn", 5244 SortId = 20, 5245 Template = RenderSignIn() 5246 }; 5247 5248 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn); 5249 } 5250 5251 @helper RenderSignIn() 5252 { 5253 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 5254 string userInitials = ""; 5255 int pageId = Model.TopPage.ID; 5256 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 5257 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 5258 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 5259 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 5260 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5261 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 5262 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 5263 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 5264 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 5265 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 5266 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 5267 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 5268 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 5269 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 5270 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 5271 5272 string linkStart = "/Default.aspx?ID="; 5273 if (Model.CurrentUser.ID <= 0) 5274 { 5275 linkStart += signInProfilePageId + "&RedirectPageId="; 5276 } 5277 5278 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 5279 string myProfilePageLink = linkStart + myProfilePageId; 5280 string myOrdersPageLink = linkStart + myOrdersPageId; 5281 string myFavoritesPageLink = linkStart + myFavoritesPageId; 5282 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 5283 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 5284 5285 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 5286 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 5287 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5288 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 5289 5290 if (Model.CurrentUser.ID != 0) 5291 { 5292 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 5293 } 5294 5295 if (!navigationItemsHideSignIn) 5296 { 5297 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5298 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 5299 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5300 5301 5302 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass u-margin-right-header-menu is-dropdown--no-icon dw-mod"> 5303 <div class="@menuLinkClass dw-mod" > 5304 @if (Model.CurrentUser.ID <= 0) 5305 { 5306 <i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i> 5307 } 5308 else 5309 { 5310 <div class="user-menu u-flex"> 5311 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5312 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5313 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon) 5314 5315 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5316 { 5317 <div class="u-margin-right"> 5318 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></div> 5319 </div> 5320 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5321 { 5322 <div class="u-margin-right"> 5323 <a href="/" class="u-color-inherit" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"><i class="far fa-sign-out-alt fa-1_5x u-margin-right"></i></a> 5324 </div> 5325 } else { 5326 @RenderMenuIcon("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"), "far fa-sign-out-alt") 5327 } 5328 5329 </div> 5330 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 5331 } 5332 </div> 5333 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod"> 5334 <ul class="list list--clean dw-mod"> 5335 @if (Model.CurrentUser.ID <= 0) 5336 { 5337 <li> 5338 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 5339 </li> 5340 5341 if (!hideCreateAccountLink) 5342 { 5343 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")); 5344 } 5345 if (!hideForgotPasswordLink) 5346 { 5347 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 5348 } 5349 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5350 { 5351 @RenderSeparator() 5352 } 5353 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true ) 5354 } 5355 else 5356 { 5357 if (!hideMyProfileLink) 5358 { 5359 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 5360 } 5361 if (!hideMyOrdersLink) 5362 { 5363 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 5364 } 5365 if (!hideMyFavoritesLink) 5366 { 5367 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 5368 } 5369 if (!hideMySavedCardsLink) 5370 { 5371 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 5372 } 5373 if (!hideMyOrderDraftsLink) 5374 { 5375 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 5376 } 5377 } 5378 5379 @if (Model.CurrentUser.ID > 0) 5380 { 5381 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 5382 { 5383 @RenderSeparator() 5384 } 5385 5386 //Check if impersonation is on 5387 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 5388 { 5389 <li> 5390 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 5391 @Translate("Sign out") 5392 </div> 5393 </li> 5394 } else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 5395 { 5396 <li> 5397 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 5398 @Translate("Sign out") 5399 </a> 5400 </li> 5401 } else { 5402 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 5403 } 5404 } 5405 </ul> 5406 </div> 5407 </li> 5408 } 5409 } 5410 5411 @helper RenderListItem(string link, string text, string icon = null, bool target = false) { 5412 string targetBlank = target == true ? "target='_blank'" : ""; 5413 <li> 5414 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)" @targetBlank> 5415 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text 5416 </a> 5417 </li> 5418 } 5419 5420 @helper RenderSeparator() 5421 { 5422 <li class="list__seperator dw-mod"></li> 5423 } 5424 5425 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5426 5427 @using System 5428 @using System.Web 5429 @using Dynamicweb.Rapido.Blocks.Extensibility 5430 @using Dynamicweb.Rapido.Blocks 5431 5432 @{ 5433 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites"); 5434 5435 Block masterDesktopActionsMenuFavorites = new Block 5436 { 5437 Id = "MasterDesktopActionsMenuFavorites", 5438 SortId = 30, 5439 Template = RenderFavorites() 5440 }; 5441 5442 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0) 5443 { 5444 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites); 5445 } 5446 } 5447 5448 @helper RenderFavorites() 5449 { 5450 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 5451 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId; 5452 5453 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5454 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5455 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5456 5457 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5458 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")"> 5459 @* 5460 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i> 5461 *@ 5462 <img src="/Files/Images/favorite-list-svg.svg"/> 5463 </a> 5464 </li> 5465 } 5466 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5467 5468 @using System 5469 @using System.Web 5470 @using Dynamicweb.Rapido.Blocks.Extensibility 5471 @using Dynamicweb.Rapido.Blocks 5472 @using Dynamicweb.Rapido.Services 5473 5474 @{ 5475 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 5476 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 5477 5478 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart) 5479 { 5480 Block masterDesktopActionsMenuMiniCart = new Block 5481 { 5482 Id = "MasterDesktopActionsMenuMiniCart", 5483 SortId = 40, 5484 Template = RenderMiniCart(miniCartLayout == "dropdown"), 5485 SkipRenderBlocksList = true, 5486 BlocksList = new List<Block>() 5487 }; 5488 5489 Block miniCartCounterScriptTemplate = new Block 5490 { 5491 Id = "MiniCartCounterScriptTemplate", 5492 Template = RenderMiniCartCounterContent() 5493 }; 5494 5495 //dropdown layout is default 5496 RazorEngine.Templating.TemplateWriter layoutTemplate; 5497 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate; 5498 5499 switch (miniCartLayout) 5500 { 5501 case "dropdown": 5502 layoutTemplate = RenderMiniCartDropdownLayout(); 5503 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5504 break; 5505 case "panel": 5506 layoutTemplate = RenderMiniCartPanelLayout(); 5507 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5508 break; 5509 case "modal": 5510 layoutTemplate = RenderMiniCartModalLayout(); 5511 miniCartTriggerTemplate = RenderMiniCartTriggerLabel(); 5512 break; 5513 case "none": 5514 default: 5515 layoutTemplate = RenderNoLayoutMiniCart(); 5516 miniCartTriggerTemplate = RenderMiniCartTriggerLink(); 5517 break; 5518 } 5519 5520 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5521 { 5522 Id = "MiniCartTrigger", 5523 SortId = 40, 5524 Template = miniCartTriggerTemplate 5525 }); 5526 5527 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 5528 { 5529 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block 5530 { 5531 Id = "MiniCartLayout", 5532 SortId = 40, 5533 Template = layoutTemplate 5534 }); 5535 } 5536 5537 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart); 5538 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate); 5539 } 5540 5541 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 5542 { 5543 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block { 5544 Id = "CartInitialization", 5545 Template = RenderNoLayoutMiniCart() 5546 }); 5547 } 5548 5549 } 5550 5551 @helper RenderMiniCart(bool hasMouseEnterEvent) 5552 { 5553 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList(); 5554 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5555 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean"; 5556 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5557 string mouseEvent = ""; 5558 string id = "MiniCart"; 5559 if (hasMouseEnterEvent) 5560 { 5561 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\""; 5562 id = "miniCartTrigger"; 5563 } 5564 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent> 5565 @RenderBlockList(subBlocks) 5566 </li> 5567 } 5568 5569 @helper RenderNoLayoutMiniCart() 5570 { 5571 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5572 <script> 5573 window.cartId = "@miniCartFeedPageId"; 5574 </script> 5575 } 5576 5577 @helper RenderMiniCartTriggerLabel() 5578 { 5579 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5580 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5581 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5582 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5583 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5584 5585 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="location.href = document.querySelector('[data-cart-page-link]').getAttribute('data-cart-page-link')" title="@Translate("Cart")"> 5586 <div class="u-inline u-position-relative"> 5587 <img src="/Files/Images/cart-svg.svg"/> 5588 @RenderMiniCartCounter() 5589 </div> 5590 </div> 5591 } 5592 5593 @helper RenderMiniCartTriggerLink() 5594 { 5595 int cartPageId = GetPageIdByNavigationTag("CartPage"); 5596 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart"; 5597 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5598 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5599 5600 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")"> 5601 <span class="u-inline u-position-relative"> 5602 <i class="@cartIcon fa-1_5x"></i> 5603 @RenderMiniCartCounter() 5604 </span> 5605 </a> 5606 } 5607 5608 @helper RenderMiniCartCounter() 5609 { 5610 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5611 string cartProductsCount = Model.Cart.OrderlinesCount.ToString(); 5612 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5613 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5614 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : ""; 5615 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : ""; 5616 5617 if (showPrice && counterPosition == "right") 5618 { 5619 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")"; 5620 } 5621 5622 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod"> 5623 <span class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false"> 5624 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.OrderlinesCount.ToString()"> 5625 @cartProductsCount @cartProductsTotalPrice 5626 </span> 5627 </span> 5628 </span> 5629 } 5630 5631 @helper RenderMiniCartCounterContent() 5632 { 5633 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice"); 5634 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5635 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice; 5636 5637 <script id="MiniCartCounterContent" type="text/x-template"> 5638 {{#.}} 5639 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberoforderlines}}"> 5640 @if (showPriceInMiniCartCounter) 5641 { 5642 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text> 5643 } 5644 else 5645 { 5646 <text>{{numberoforderlines}}</text> 5647 } 5648 </span> 5649 {{/.}} 5650 </script> 5651 } 5652 5653 @helper RenderMiniCartDropdownLayout() 5654 { 5655 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5656 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5657 5658 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink"> 5659 <div class="mini-cart-dropdown__inner dw-mod"> 5660 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3> 5661 <div class="mini-cart-dropdown__body u-flex dw-mod"> 5662 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5663 </div> 5664 </div> 5665 </div> 5666 } 5667 5668 @helper RenderMiniCartPanelLayout() 5669 { 5670 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5671 int WebAPIAddToCartPageId = GetPageIdByNavigationTag("WebAPIAddToCart"); 5672 int cartsListFeedPageId = GetPageIdByNavigationTag("CartsListFeed"); 5673 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5674 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 5675 var hideOnCartPageClass = GetPageIdByNavigationTag("CartPage") == Model.ID ? "u-hidden" : ""; 5676 var preventLoadOnProductList = GetPageIdByNavigationTag("ProductsPage") == Model.ID ? "data-init-onload=\"false\"" : ""; 5677 5678 <div class="mini-cart grid__cell dw-mod"> 5679 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" /> 5680 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-add-to-cart-id="@WebAPIAddToCartPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5681 <label for="miniCartTrigger" class="panel__close-btn u-hidden" title="@Translate("Close panel")"><i class="fas fa-times"></i></label> 5682 <div class="panel__content u-full-width dw-mod"> 5683 <div class="panel_toggle_button @hideOnCartPageClass"> 5684 <button class="toggle-minicart btn btn--primary dw-mod" onclick="toggleMinicart(this)"> 5685 <i class="fas fa-arrow-alt-circle-left"></i> 5686 </button> 5687 </div> 5688 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart list")</h3> 5689 <div class=""> 5690 <div class="u-full-width dw-mod" id="cartsList" data-template="CartsListContent" data-json-feed="/Default.aspx?ID=@cartsListFeedPageId" data-init-onload="false"></div> 5691 <div class="dw-mod"> 5692 @Render(new Button 5693 { 5694 Title = Translate("Change Cart Name"), 5695 ButtonType = ButtonType.Button, 5696 ButtonLayout = ButtonLayout.None, 5697 CssClass = "u-margin-bottom change-cart-name", 5698 OnClick = "changeCartName()" 5699 }) 5700 @Render(new Button 5701 { 5702 Title = Translate("Create New Cart"), 5703 ButtonType = ButtonType.Button, 5704 ButtonLayout = ButtonLayout.Primary, 5705 CssClass = "u-full-width", 5706 OnClick = "document.getElementById('NewCartModalTrigger').checked = true" 5707 }) 5708 </div> 5709 </div> 5710 <div class="panel__content-body panel__content-body--cart dw-mod"> 5711 <div class="minicart-preloader-overlay" id="MiniCartOverlay"><div class="preloader-overlay__icon dw-mod" style="top: 0px;"></div></div> 5712 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" @preventLoadOnProductList></div> 5713 </div> 5714 </div> 5715 </div> 5716 </div> 5717 } 5718 5719 @helper RenderMiniCartModalLayout() 5720 { 5721 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 5722 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage"); 5723 5724 <div class="mini-cart grid__cell dw-mod"> 5725 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" /> 5726 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink"> 5727 <label for="miniCartTrigger" class="modal-overlay"></label> 5728 <div class="modal modal--md modal--top-right dw-mod"> 5729 <div class="modal__body u-flex grid--direction-column dw-mod"> 5730 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3> 5731 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div> 5732 </div> 5733 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label> 5734 </div> 5735 </div> 5736 </div> 5737 } 5738 5739 5740 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5741 5742 @using System 5743 @using System.Web 5744 @using Dynamicweb.Rapido.Blocks.Extensibility 5745 @using Dynamicweb.Rapido.Blocks 5746 5747 @{ 5748 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon"); 5749 5750 Block masterDesktopActionsMenuOrderDraft = new Block 5751 { 5752 Id = "MasterDesktopActionsMenuOrderDraft", 5753 SortId = 40, 5754 Template = RenderOrderDraft() 5755 }; 5756 5757 if (showOrderDraftLink && Model.CurrentUser.ID > 0) 5758 { 5759 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft); 5760 } 5761 } 5762 5763 @helper RenderOrderDraft() 5764 { 5765 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft"); 5766 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId; 5767 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 5768 5769 5770 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5771 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5772 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5773 5774 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5775 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")"> 5776 <span class="u-inline u-position-relative"> 5777 <i class="@draftIcon fa-1_5x"></i> 5778 </span> 5779 </a> 5780 </li> 5781 } 5782 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5783 5784 @using System 5785 @using System.Web 5786 @using Dynamicweb.Rapido.Blocks.Extensibility 5787 @using Dynamicweb.Rapido.Blocks 5788 5789 @{ 5790 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"); 5791 5792 Block masterDesktopActionsMenuDownloadCart = new Block 5793 { 5794 Id = "MasterDesktopActionsMenuDownloadCart", 5795 SortId = 50, 5796 Template = RenderDownloadCart() 5797 }; 5798 5799 if (showDownloadCartLink && Model.CurrentUser.ID > 0) 5800 { 5801 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart); 5802 } 5803 } 5804 5805 @helper RenderDownloadCart() 5806 { 5807 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart"); 5808 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId; 5809 5810 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5811 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean"; 5812 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5813 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right"; 5814 5815 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod"> 5816 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")"> 5817 <span class="u-inline u-position-relative"> 5818 <i class="fas fa-cart-arrow-down fa-1_5x"></i> 5819 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span> 5820 </span> 5821 </a> 5822 </li> 5823 } 5824 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 5825 5826 @using System 5827 @using System.Web 5828 @using Dynamicweb.Rapido.Blocks.Extensibility 5829 @using Dynamicweb.Rapido.Blocks 5830 5831 @functions { 5832 public class SearchConfiguration 5833 { 5834 public string searchFeedId { get; set; } 5835 public string searchSecondFeedId { get; set; } 5836 public int groupsFeedId { get; set; } 5837 public string resultPageLink { get; set; } 5838 public string searchPlaceholder { get; set; } 5839 public string searchType { get; set; } 5840 public string searchTemplate { get; set; } 5841 public string searchContentTemplate { get; set; } 5842 public string searchValue { get; set; } 5843 public bool showGroups { get; set; } 5844 5845 public SearchConfiguration() 5846 { 5847 searchFeedId = ""; 5848 searchSecondFeedId = ""; 5849 searchType = "product-search"; 5850 searchContentTemplate = ""; 5851 showGroups = true; 5852 } 5853 } 5854 } 5855 @{ 5856 Block masterSearchBar = new Block 5857 { 5858 Id = "MasterSearchBar", 5859 SortId = 40, 5860 Template = RenderSearch("bar"), 5861 Design = new Design 5862 { 5863 Size = "auto", 5864 HidePadding = true, 5865 RenderType = RenderType.Column 5866 } 5867 }; 5868 5869 Block masterSearchAction = new Block 5870 { 5871 Id = "MasterDesktopActionsMenuSearch", 5872 SortId = 10, 5873 Template = RenderSearch() 5874 }; 5875 5876 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar); 5877 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction); 5878 } 5879 5880 @helper RenderSearch(string type = "mini-search") 5881 { 5882 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage")); 5883 string searchPageId = Converter.ToString(GetPageIdByNavigationTag("searchPage")); 5884 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 5885 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch"; 5886 5887 SearchConfiguration searchConfiguration = null; 5888 5889 switch (searchType) { 5890 case "contentSearch": 5891 searchConfiguration = new SearchConfiguration() { 5892 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5893 resultPageLink = contentSearchPageLink, 5894 searchPlaceholder = Translate("Search page"), 5895 groupsFeedId = 0, 5896 searchType = "content-search", 5897 searchTemplate = "SearchPagesTemplate", 5898 showGroups = false 5899 }; 5900 break; 5901 case "combinedSearch": 5902 searchConfiguration = new SearchConfiguration() { 5903 searchFeedId = productsPageId + "&feed=true", 5904 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true", 5905 resultPageLink = Converter.ToString(productsPageId), 5906 searchPlaceholder = Translate("Search products or pages"), 5907 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5908 searchType = "combined-search", 5909 searchTemplate = "SearchProductsTemplateWrap", 5910 searchContentTemplate = "SearchPagesTemplateWrap", 5911 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5912 }; 5913 break; 5914 default: //productSearch 5915 searchConfiguration = new SearchConfiguration() { 5916 resultPageLink = Converter.ToString(productsPageId), 5917 searchFeedId = searchPageId + "&feed=true", 5918 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"), 5919 searchPlaceholder = Translate("Search products"), 5920 searchTemplate = "SearchProductsTemplate", 5921 searchType = "product-search", 5922 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector") 5923 }; 5924 break; 5925 } 5926 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? ""; 5927 5928 if (type == "mini-search") { 5929 @RenderMiniSearch(searchConfiguration) 5930 } else { 5931 @RenderSearchBar(searchConfiguration) 5932 } 5933 } 5934 5935 @helper RenderSearchBar(SearchConfiguration options) 5936 { 5937 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar" 5938 data-page-size="7" 5939 data-search-feed-id="@options.searchFeedId" 5940 data-search-second-feed-id="@options.searchSecondFeedId" 5941 data-result-page-id="@options.resultPageLink" 5942 data-groups-page-id="@options.groupsFeedId" 5943 data-search-type="@options.searchType"> 5944 @if (options.showGroups) 5945 { 5946 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button> 5947 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul> 5948 } 5949 <div class="typeahead-search-field"> 5950 <input type="text" class="u-no-margin u-full-width search-ahead__input js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5951 @* 5952 <button type="button" class="abort-search u-hidden" onclick="document.querySelector('.js-typeahead-search-field').value = ''; this.classList.add('u-hidden')"><i class="fas fa-times"></i></button> 5953 *@ 5954 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5955 { 5956 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 5957 } 5958 else 5959 { 5960 <div class="dropdown dropdown--absolute-position dropdown--combined grid"> 5961 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div> 5962 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div> 5963 </div> 5964 } 5965 </div> 5966 <button type="button" class="search-icon-desktop js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button> 5967 </div> 5968 } 5969 5970 @helper RenderMiniSearch(SearchConfiguration options) 5971 { 5972 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 5973 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 5974 5975 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon"> 5976 <div class="@menuLinkClass dw-mod" title="@Translate("Search")"> 5977 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i> 5978 </div> 5979 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod"> 5980 <div class="typeahead js-typeahead" id="ProductSearchBar" 5981 data-page-size="7" 5982 data-search-feed-id="@options.searchFeedId" 5983 data-search-second-feed-id="@options.searchSecondFeedId" 5984 data-result-page-id="@options.resultPageLink" 5985 data-search-type="@options.searchType"> 5986 <div class="typeahead-search-field"> 5987 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue"> 5988 @if (string.IsNullOrEmpty(options.searchSecondFeedId)) 5989 { 5990 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></ul> 5991 } 5992 else 5993 { 5994 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned"> 5995 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId" data-init-onload="false"></div> 5996 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div> 5997 </div> 5998 } 5999 </div> 6000 </div> 6001 </div> 6002 </li> 6003 } 6004 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6005 6006 @using System 6007 @using System.Web 6008 @using Dynamicweb.Rapido.Blocks.Extensibility 6009 @using Dynamicweb.Rapido.Blocks 6010 6011 @{ 6012 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6013 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 6014 6015 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master"); 6016 6017 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo"); 6018 headerConfigurationPage.RemoveBlock(configDesktopLogo); 6019 6020 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu"); 6021 headerConfigurationPage.RemoveBlock(configDesktopMenu); 6022 6023 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar"); 6024 headerConfigurationPage.RemoveBlock(configSearchBar); 6025 6026 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch"); 6027 headerConfigurationPage.RemoveBlock(configSearchAction); 6028 6029 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu"); 6030 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu); 6031 6032 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra"); 6033 6034 switch (headerConfigurationTopLayout) 6035 { 6036 case "condensed": //2 6037 configDesktopLogo.Design.Size = "auto-width"; 6038 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6039 6040 configDesktopMenu.SortId = 20; 6041 configDesktopMenu.Design.Size = "auto"; 6042 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6043 6044 configDesktopActionsMenu.SortId = 30; 6045 configDesktopActionsMenu.Design.Size = "auto-width"; 6046 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6047 6048 if (!headerConfigurationHideSearch) 6049 { 6050 configSearchBar.SortId = 40; 6051 configSearchBar.Design.Size = "12"; 6052 configDesktopExtra.SortId = 50; 6053 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6054 } 6055 break; 6056 case "splitted": //3 6057 configDesktopLogo.Design.Size = "auto"; 6058 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6059 6060 if (!headerConfigurationHideSearch) 6061 { 6062 configSearchBar.SortId = 20; 6063 configSearchBar.Design.Size = "auto"; 6064 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6065 } 6066 6067 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6068 6069 configDesktopActionsMenu.SortId = 20; 6070 configDesktopActionsMenu.Design.Size = "auto-width"; 6071 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6072 break; 6073 case "splitted-center": //4 6074 configDesktopLogo.Design.Size = "auto"; 6075 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6076 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6077 6078 configDesktopActionsMenu.SortId = 30; 6079 configDesktopActionsMenu.Design.Size = "auto-width"; 6080 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6081 6082 if (!headerConfigurationHideSearch) 6083 { 6084 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6085 } 6086 break; 6087 case "minimal": //5 6088 configDesktopLogo.Design.Size = "auto-width"; 6089 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6090 6091 configDesktopMenu.Design.Size = "auto"; 6092 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6093 6094 configDesktopActionsMenu.SortId = 20; 6095 configDesktopActionsMenu.Design.Size = "auto-width"; 6096 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6097 6098 if (!headerConfigurationHideSearch) 6099 { 6100 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6101 } 6102 break; 6103 case "minimal-center": //6 6104 configDesktopLogo.Design.Size = "auto-width"; 6105 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6106 6107 configDesktopMenu.Design.Size = "auto"; 6108 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6109 6110 configDesktopActionsMenu.SortId = 20; 6111 configDesktopActionsMenu.Design.Size = "auto-width"; 6112 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6113 6114 if (!headerConfigurationHideSearch) 6115 { 6116 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6117 } 6118 break; 6119 case "minimal-right": //7 6120 configDesktopLogo.Design.Size = "auto-width"; 6121 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo); 6122 6123 configDesktopMenu.Design.Size = "auto"; 6124 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6125 6126 configDesktopActionsMenu.SortId = 20; 6127 configDesktopActionsMenu.Design.Size = "auto-width"; 6128 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6129 6130 if (!headerConfigurationHideSearch) 6131 { 6132 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6133 } 6134 break; 6135 case "two-lines": //8 6136 configDesktopLogo.Design.Size = "auto"; 6137 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6138 6139 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6140 6141 configDesktopActionsMenu.SortId = 20; 6142 configDesktopActionsMenu.Design.Size = "auto-width"; 6143 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6144 6145 if (!headerConfigurationHideSearch) 6146 { 6147 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6148 } 6149 break; 6150 case "two-lines-centered": //9 6151 configDesktopLogo.Design.Size = "auto"; 6152 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6153 6154 configDesktopMenu.Design.Size = "auto-width"; 6155 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6156 6157 configDesktopActionsMenu.SortId = 20; 6158 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu); 6159 6160 if (!headerConfigurationHideSearch) 6161 { 6162 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction); 6163 } 6164 break; 6165 case "normal": //1 6166 default: 6167 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo); 6168 6169 if (!headerConfigurationHideSearch) 6170 { 6171 configSearchBar.SortId = 20; 6172 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar); 6173 } 6174 6175 configDesktopActionsMenu.SortId = 30; 6176 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu); 6177 6178 configDesktopActionsMenu.Design.Size = "auto-width"; 6179 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu); 6180 break; 6181 } 6182 } 6183 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6184 6185 @using System 6186 @using System.Web 6187 @using Dynamicweb.Rapido.Blocks.Extensibility 6188 @using Dynamicweb.Rapido.Blocks 6189 6190 @{ 6191 Block masterCustomDesktopActionsMenuSignIn = new Block 6192 { 6193 Id = "MasterDesktopActionsMenuSignIn", 6194 SortId = 20, 6195 Template = RenderCustomSignIn() 6196 }; 6197 6198 BlocksPage.GetBlockPage("Master").ReplaceBlock(masterCustomDesktopActionsMenuSignIn); 6199 } 6200 6201 @helper RenderCustomSignIn() 6202 { 6203 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn"); 6204 string userInitials = ""; 6205 int pageId = GetPageIdByNavigationTag("SignInPage"); 6206 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount"); 6207 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard"); 6208 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile"); 6209 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders"); 6210 int announcementPageId = GetPageIdByNavigationTag("Announcements"); 6211 int myDeviationsPageId = GetPageIdByNavigationTag("DeviationsHistoryPage"); 6212 int myDeviationsAdminPageId = GetPageIdByNavigationTag("DeviationsAdminHistoryPage"); 6213 //int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites"); 6214 int myFavoritesPageId = GetPageIdByNavigationTag("ShoppingList"); 6215 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards"); 6216 int myReportsPageId = GetPageIdByNavigationTag("MyReports"); 6217 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft"); 6218 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage"); 6219 int recipeBankPageId = GetPageIdByNavigationTag("MenuView"); 6220 int menuCalendarPageId = GetPageIdByNavigationTag("MenuCalendarView"); 6221 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount"); 6222 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile"); 6223 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders"); 6224 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards"); 6225 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts"); 6226 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites"); 6227 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink"); 6228 6229 string linkStart = "/Default.aspx?ID="; 6230 if (Model.CurrentUser.ID <= 0) 6231 { 6232 linkStart += signInProfilePageId + "&RedirectPageId="; 6233 } 6234 6235 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery"; 6236 string myProfilePageLink = linkStart + myProfilePageId; 6237 string myOrdersPageLink = linkStart + myOrdersPageId; 6238 string announcementPageLink = linkStart + announcementPageId; 6239 string myDeviationsPageLink = linkStart + myDeviationsPageId; 6240 string myReportsPageLink = linkStart + myReportsPageId; 6241 string myDeviationsAdminPageLink = linkStart + myDeviationsAdminPageId; 6242 string myFavoritesPageLink = linkStart + myFavoritesPageId; 6243 string mySavedCardsPageLink = linkStart + mySavedCardsPageId; 6244 string myOrderDraftsLink = linkStart + myOrderDraftsPageId; 6245 string recipeBankPageLink = linkStart + recipeBankPageId; 6246 string menuCalendarPageLink = linkStart + menuCalendarPageId; 6247 6248 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user"; 6249 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "far fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star"; 6250 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard"; 6251 string isDropdownClass = Model.CurrentUser.ID <= 0 ? "is-dropdown" : ""; 6252 6253 if (Model.CurrentUser.ID != 0) 6254 { 6255 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName); 6256 } 6257 6258 if (!navigationItemsHideSignIn) 6259 { 6260 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6261 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean"; 6262 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon"; 6263 bool promptForAccount = getPromptForAccount(); 6264 string createPageId = GetPageIdByNavigationTag("CreateAccount").ToString(); 6265 string createPageUrl = "/Default.aspx?Id=" + createPageId; 6266 bool isUserAnonymous = string.IsNullOrWhiteSpace(Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.UserName.ToString()); 6267 var user = Pageview.User; 6268 bool isFoodCalendarAdmin = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_FoodCalendarAdmin").Value.ToString() == "True" : false; 6269 var userCompany = Model.CurrentUser.Company; 6270 bool isRmaAdmin = userCompany != null && userCompany.ToLower() == "kraemer"; 6271 bool hasAccessToFoodCalendar = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_AccessFoodCalendar").Value.ToString() == "True" : false; 6272 bool hasAccessToAnnouncements = user != null ? user.CustomFieldValues.Find(x => x.CustomField.SystemName == "AccessUser_See_Announcements").Value.ToString() == "True" : false; 6273 string announcementCookie = HttpContext.Current.Request.Cookies["announcementNotification"] != null ? HttpContext.Current.Request.Cookies["announcementNotification"].Value : ""; 6274 string announcementNotificationDotClass = announcementCookie == "true" ? "u-hidden" : ""; 6275 6276 var powerBiReport = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Group_ID")?.Value?.ToString() ?? string.Empty; 6277 var powerBiGroup = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PowerBI_Report_ID")?.Value?.ToString() ?? string.Empty; 6278 var genericBiReport = user != null ? user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_GenericBI_Report").Value.ToString() == "True" : false; 6279 6280 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6281 <div class="@menuLinkClass dw-mod"> 6282 @if (Model.CurrentUser.ID <= 0) 6283 { 6284 @*<i class="fas fa-sign-in-alt fa-1_5x" title="@Translate("Sign in")"></i>*@ 6285 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label> 6286 } 6287 else 6288 { 6289 <div class="user-menu u-flex headerIcons" data-user-type-food-calendar="@isFoodCalendarAdmin"> 6290 @RenderMenuIcon(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon, "/Files/Images/favorite-list-svg.svg") 6291 @RenderMenuIcon(myOrdersPageLink, Translate("My Orders"), "fas fa-list", "/Files/Images/order-history-svg.svg") 6292 @if (hasAccessToAnnouncements) 6293 { 6294 @* 6295 @RenderMenuIcon(announcementPageLink, Translate("Announcements"), "fas fa-list", "/Files/Images/notifications.svg") 6296 *@ 6297 <div class="u-margin-right--lg"> 6298 <a href="@announcementPageLink" class="u-brand-color-two bs-position-relative" onclick='setCookie("announcementNotification", "true", 1/2);' title="@Translate("Announcements")"> 6299 <img src="/Files/Images/notifications.svg"> 6300 <svg class="announcement_notification-dot bs-position-absolute bs-bottom-0 bs-end-0 @announcementNotificationDotClass" style="top: 45%;" width="12" height="12" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> 6301 <path d="M18 9C18 13.9706 13.9706 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C13.9706 0 18 4.02944 18 9Z" fill="#FF3B30"/> 6302 </svg> 6303 </a> 6304 </div> 6305 } 6306 @if (hasAccessToFoodCalendar) 6307 { 6308 @RenderMenuIcon(recipeBankPageLink, Translate("Matretter"), "fas fa-list", "/Files/Images/food-calendar.svg") 6309 } 6310 @if (isFoodCalendarAdmin) 6311 { 6312 @RenderMenuIcon(menuCalendarPageLink, Translate("Kalendervisning"), "fas fa-list", "/Files/Images/food-calendar-menu-calendar.svg") 6313 } 6314 6315 @if (isRmaAdmin) 6316 { 6317 @RenderMenuIcon(myDeviationsAdminPageLink, Translate("Admin RMA"), "fas fa-list", "/Files/Images/unionRMA-Admin-icon.svg") 6318 } 6319 else 6320 { 6321 @RenderMenuIcon(myDeviationsPageLink, Translate("My Deviations"), "fas fa-list", "/Files/Images/UnionRMA-icon.svg") 6322 } 6323 @if ((powerBiReport != "" && powerBiGroup != "") || genericBiReport) 6324 { 6325 @RenderMenuIcon(myReportsPageLink, Translate("My report"), "fas fa-list", "/Files/Images/IconPowerBi.svg") 6326 } 6327 6328 @RenderMenuIcon(myProfilePageLink, Translate("My Profile"), profileIcon, "/Files/Images/my-account-svg.svg") 6329 6330 @*@if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6331 { 6332 <div class="u-margin-right"> 6333 <a href="/" class="u-color-inherit" testc onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)" title="@Translate("Sign out")"> 6334 <img src="/Files/Images/log-out-svg.svg"/> 6335 </a> 6336 </div> 6337 } 6338 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6339 { 6340 6341 <div class="u-margin-right"> 6342 <div class="u-color-inherit" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;" title="@Translate("Sign out")"> 6343 <img src="/Files/Images/log-out-svg.svg"/> 6344 </div> 6345 </div> 6346 6347 } 6348 else 6349 {*@ 6350 <div class="u-margin-right--lg" testd> 6351 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="logOutPrimaryUser(event, this);localStorage.removeItem('userLocation');sessionStorage.removeItem('impersonationModalOpen')" class="u-brand-color-two" title="@Translate("Sign out")"> 6352 <img src="/Files/Images/log-out-svg.svg" alt="sign out"> 6353 </a> 6354 </div> 6355 @*}*@ 6356 6357 </div> 6358 @* <a href="/default.aspx?ID=@myProfilePageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>*@ 6359 } 6360 </div> 6361 <div class="menu menu--dropdown menu--dropdown-right menu--dropdown-right--custom menu--sign-in grid__cell dw-mod"> 6362 <ul class="list list--clean dw-mod"> 6363 @if (Model.CurrentUser.ID <= 0) 6364 { 6365 if (!hideCreateAccountLink) 6366 { 6367 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account")) 6368 ; 6369 } 6370 if (!hideForgotPasswordLink) 6371 { 6372 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?")) 6373 } 6374 @*if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6375 { 6376 @RenderSeparator() 6377 }*@ 6378 @RenderListItem("https://ssoprovider.kraemer.no/users/sign_in", Translate("Old Webshop"), "fas fa-shopping-basket", true) 6379 } 6380 else 6381 { 6382 if (!hideMyProfileLink) 6383 { 6384 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon) 6385 } 6386 if (!hideMyOrdersLink) 6387 { 6388 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list") 6389 } 6390 if (!hideMyFavoritesLink) 6391 { 6392 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon) 6393 } 6394 if (!hideMySavedCardsLink) 6395 { 6396 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card") 6397 } 6398 if (!hideMyOrderDraftsLink) 6399 { 6400 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon) 6401 } 6402 } 6403 6404 @if (Model.CurrentUser.ID > 0) 6405 { 6406 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink) 6407 { 6408 @RenderSeparator() 6409 } 6410 6411 //Check if impersonation is on 6412 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.HasSecondaryUsers) 6413 { 6414 <li> 6415 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;"> 6416 @Translate("Sign out") 6417 </div> 6418 </li> 6419 } 6420 else if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0 && Model.SecondaryUsers.Count == 1) 6421 { 6422 <li> 6423 <a href="/" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false); logOutPrimaryUser(event, this)"> 6424 @Translate("Sign out") 6425 </a> 6426 </li> 6427 } 6428 else 6429 { 6430 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out")) 6431 } 6432 } 6433 </ul> 6434 </div> 6435 </li> 6436 if (isUserAnonymous) 6437 { 6438 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses @isDropdownClass is-dropdown--no-icon dw-mod"> 6439 <a class="btn btn--primary btn--full u-no-margin create-account__button" href="@createPageUrl">@Translate("Bli kunde")</a> 6440 </li> 6441 } 6442 } 6443 } 6444 6445 @helper RenderMenuIcon(string link, string title, string icon = null, string iconSource = null) 6446 { 6447 <div class="u-margin-right--lg"> 6448 <a href="@link" class="u-brand-color-two" title="@title"> 6449 <img src="@iconSource"> 6450 </a> 6451 </div> 6452 } 6453 6454 6455 @helper RenderDesktopTools() 6456 { 6457 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList(); 6458 6459 <div class="tools-navigation dw-mod"> 6460 <div class="center-container grid top-container__center-container dw-mod"> 6461 @RenderBlockList(subBlocks) 6462 </div> 6463 </div> 6464 } 6465 6466 @helper RenderDesktopToolsText() 6467 { 6468 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText"); 6469 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 6470 bool userExists = Model.CurrentUser.ID != null && Model.CurrentUser.ID > 0; 6471 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 6472 string userName = userExists ? getUserName(Pageview.User) : ""; 6473 int secondaryUsersCount = Model.SecondaryUsers.Count; 6474 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 6475 bool promptForAccount = getPromptForAccount(); 6476 <div class="u-flex u-flex--align-center u-justify-between" style="min-height: 30px"> 6477 @if (userExists) 6478 { 6479 <div class="u-margin-top u-margin-bottom u-flex u-flex--align-center"> 6480 @if (secondaryUsersCount > 0) 6481 { 6482 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6483 { 6484 <div class="u-margin-right" data-prompt-account="@promptForAccount">@userName</div> 6485 @*if (secondaryUsersCount > 1) { 6486 @Render(new Button 6487 { 6488 ButtonType = ButtonType.Button, 6489 ButtonLayout = ButtonLayout.LinkClean, 6490 Title = Translate("Bytt konto"), 6491 Icon = new Icon { 6492 Name = "fa-sign-out", 6493 Prefix = "fal", 6494 LabelPosition = IconLabelPosition.Before 6495 }, 6496 OnClick = "renderImpersonationList(true)", 6497 CssClass = "u-no-margin" 6498 }) 6499 }*@ 6500 // if (secondaryUsersCount > 1) 6501 // { 6502 @RenderImpersonationDropdown(impersonationListFeedPageId) 6503 // } 6504 } 6505 else 6506 { 6507 <div class="u-margin-right" style="text-transform: uppercase"><span>@Model.CurrentUser.Name</span></div> 6508 @RenderImpersonationDropdown(impersonationListFeedPageId) 6509 } 6510 } 6511 6512 </div> 6513 if (!string.IsNullOrEmpty(customerNumber)) 6514 { 6515 if (currentUserLocation.ToUpper() == "VAR" || currentUserLocation == "") 6516 { 6517 <div> 6518 @Translate("currentLocation") <span class="location-space"></span> 6519 @Render(new Button 6520 { 6521 ButtonType = ButtonType.Button, 6522 ButtonLayout = ButtonLayout.None, 6523 Title = Translate("Change Location"), 6524 CssClass = "u-no-margin", 6525 OnClick = "document.getElementById('UserLocationModalModalTrigger').checked = true" 6526 }) 6527 </div> 6528 } 6529 } 6530 } 6531 6532 6533 </div> 6534 } 6535 6536 @helper RenderImpersonationDropdown(string impersonationListFeedPageId) 6537 { 6538 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 6539 string title = isImpersonating ? Translate("Bytt konto") : @Translate("Choose user"); 6540 var hideSelfOption = ReturnCustomFieldValue("AccessUser_HideSelf"); 6541 <form method="post" class="u-hidden" id="LogOutCurrentUser" data-primary-user="@Model.CurrentUser.Name" data-secondary-user="@Model.CurrentSecondaryUser.Name"> 6542 <input type="hidden" name="DwExtranetRemoveSecondaryUser"/> 6543 </form> 6544 6545 <div class="impersonation-container"> 6546 <input type="checkbox" id="ImpersonationSelect_header" class="dropdown-trigger"/> 6547 <div class="dropdown variants-filters dw-mod"> 6548 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_header">@title</label> 6549 <div class="dropdown__content u-padding dw-mod"> 6550 <div class="dropdown__item__filter"> 6551 <input type="text" data-container-id="impersonationList" data-view-type="header" placeholder="@Translate("Search")"> 6552 </div> 6553 <div class="js-handlebars-root dw-mod" id="impersonationList" data-template="ImpersonationListContentHeader" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"> 6554 </div> 6555 </div> 6556 </div> 6557 <label class="dropdown-trigger-off" for="ImpersonationSelect_header"></label> 6558 </div> 6559 6560 6561 6562 } 6563 6564 @helper RenderDesktopToolsNavigation() 6565 { 6566 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar"); 6567 6568 if (renderPagesInToolBar) 6569 { 6570 @RenderNavigation(new 6571 { 6572 id = "topToolsNavigation", 6573 cssclass = "menu menu-tools dw-mod dwnavigation", 6574 template = "TopMenu.xslt" 6575 }) 6576 } 6577 } 6578 6579 @helper RenderDesktopNavigation() 6580 { 6581 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList(); 6582 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal"; 6583 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : ""; 6584 <nav class="main-navigation dw-mod"> 6585 <div class="center-container top-container__center-container grid @alignClass dw-mod"> 6586 @RenderBlockList(subBlocks) 6587 </div> 6588 </nav> 6589 } 6590 6591 @helper RenderDesktopExtra() 6592 { 6593 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList(); 6594 6595 if (subBlocks.Count > 0) 6596 { 6597 <div class="header header-top dw-mod"> 6598 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod"> 6599 @RenderBlockList(subBlocks) 6600 </div> 6601 </div> 6602 } 6603 }</text> 6604 } 6605 6606 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 6607 6608 @using System 6609 @using System.Web 6610 @using Dynamicweb.Rapido.Blocks.Extensibility 6611 @using Dynamicweb.Rapido.Blocks 6612 @using Dynamicweb.Rapido.Blocks.Components.General 6613 @using Dynamicweb.Frontend 6614 6615 @functions { 6616 int impersonationPageId; 6617 string impersonationLayout; 6618 int impersonationFeed; 6619 Block impersonationBar; 6620 6621 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName) 6622 { 6623 string username = ""; 6624 6625 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 6626 { 6627 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName; 6628 } 6629 else if (!string.IsNullOrEmpty(name)) 6630 { 6631 username = name; 6632 } 6633 else if (!string.IsNullOrEmpty(email)) 6634 { 6635 username = email; 6636 } 6637 else 6638 { 6639 username = userName; 6640 } 6641 return username; 6642 } 6643 6644 string getUserName(UserViewModel user) 6645 { 6646 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6647 } 6648 6649 string getUserName(Dynamicweb.Security.UserManagement.User user) 6650 { 6651 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName); 6652 } 6653 } 6654 6655 @{ 6656 impersonationPageId = GetPageIdByNavigationTag("Impersonation"); 6657 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar"; 6658 impersonationFeed = GetPageIdByNavigationTag("UsersFeed"); 6659 6660 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0 && 2==1) 6661 { 6662 impersonationBar = new Block 6663 { 6664 Id = "ImpersonationBar", 6665 SortId = 50, 6666 Template = RenderImpersonation(), 6667 SkipRenderBlocksList = true, 6668 Design = new Design 6669 { 6670 Size = "auto-width", 6671 HidePadding = true, 6672 RenderType = RenderType.Column 6673 } 6674 }; 6675 6676 if (impersonationLayout == "top-bar") { 6677 impersonationBar.SortId = 9; 6678 } 6679 6680 Block impersonationContent = new Block 6681 { 6682 Id = "ImpersonationContent", 6683 SortId = 20 6684 }; 6685 6686 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 6687 { 6688 //Render stop impersonation view 6689 impersonationContent.Template = RenderStopImpersonationView(); 6690 6691 6692 Modal stopImpersonation = new Modal 6693 { 6694 Id = "StopImpersonation", 6695 Heading = new Heading { 6696 Level = 2, 6697 Title = Translate("Sign out"), 6698 Icon = new Icon { 6699 Name = "fa-sign-out", 6700 Prefix = "fas", 6701 LabelPosition = IconLabelPosition.After 6702 } 6703 }, 6704 Width = ModalWidth.Sm, 6705 BodyTemplate = RenderStopImpersonationForm() 6706 }; 6707 6708 Block stopImpersonationBlock = new Block 6709 { 6710 Id = "StopImpersonationBlock", 6711 SortId = 10, 6712 Component = stopImpersonation 6713 }; 6714 impersonationBar.BlocksList.Add(stopImpersonationBlock); 6715 } 6716 else 6717 { 6718 //Render main view 6719 switch (impersonationLayout) 6720 { 6721 case "right-lower-box": 6722 impersonationContent.BlocksList.Add( 6723 new Block { 6724 Id = "RightLowerBoxHeader", 6725 SortId = 10, 6726 Component = new Heading { 6727 Level = 5, 6728 Title = Translate("View the list of users you can sign in as"), 6729 CssClass = "impersonation-text" 6730 } 6731 } 6732 ); 6733 impersonationContent.BlocksList.Add( 6734 new Block { 6735 Id = "RightLowerBoxContent", 6736 SortId = 20, 6737 Template = RenderImpersonationControls() 6738 } 6739 ); 6740 break; 6741 case "right-lower-bar": 6742 impersonationContent.BlocksList.Add( 6743 new Block { 6744 Id = "RightLowerBarContent", 6745 SortId = 10, 6746 Template = RenderImpersonationControls() 6747 } 6748 ); 6749 break; 6750 case "bar": 6751 default: 6752 impersonationContent.BlocksList.Add( 6753 new Block { 6754 Id = "ViewListLink", 6755 SortId = 20, 6756 Template = RenderViewListLink() 6757 } 6758 ); 6759 impersonationContent.BlocksList.Add( 6760 new Block { 6761 Id = "BarTypeaheadSearch", 6762 SortId = 30, 6763 Template = RenderTypeaheadSearch() 6764 } 6765 ); 6766 break; 6767 } 6768 } 6769 impersonationBar.BlocksList.Add(impersonationContent); 6770 6771 impersonationBar.BlocksList.Add( 6772 new Block 6773 { 6774 Id = "ImpersonationSearchTemplates", 6775 SortId = 30, 6776 Template = RenderSearchResultTemplate() 6777 } 6778 ); 6779 if (impersonationLayout != "bar" && impersonationLayout != "top-bar") 6780 { 6781 impersonationBar.BlocksList.Add( 6782 new Block 6783 { 6784 Id = "ImpersonationSearchScripts", 6785 SortId = 40, 6786 Template = RenderSearchScripts() 6787 } 6788 ); 6789 } 6790 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar); 6791 } 6792 } 6793 6794 @helper RenderImpersonation() 6795 { 6796 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList(); 6797 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" /> 6798 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation"> 6799 @if (impersonationLayout == "right-lower-box") 6800 { 6801 @RenderRightLowerBoxHeader() 6802 } 6803 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod"> 6804 @*Impersonation*@ 6805 @RenderBlockList(subBlocks) 6806 </div> 6807 </div> 6808 } 6809 6810 @helper RenderRightLowerBoxHeader() 6811 { 6812 <div class="impersonation__header dw-mod"> 6813 <div class="impersonation__title">@Translate("Impersonation")</div> 6814 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();"> 6815 @Render(new Icon 6816 { 6817 Prefix = "fas", 6818 Name = "fa-window-minimize" 6819 }) 6820 </label> 6821 </div> 6822 } 6823 6824 @helper RenderStopImpersonationView() 6825 { 6826 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6827 string userName = getUserName(Pageview.User); 6828 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> "; 6829 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText; 6830 6831 if (impersonationLayout == "right-lower-box") 6832 { 6833 <div class="u-margin-bottom--lg u-ta-center"> 6834 @impersonationText 6835 </div> 6836 <div class="u-margin-bottom--lg u-ta-center"> 6837 @RenderSwitchAccountButton() 6838 </div> 6839 @RenderStopImpersonationButton() 6840 } 6841 else 6842 { 6843 <div class="grid grid--align-center impersonation__stop-wrap"> 6844 <div class="impersonation-bar-item dw-mod"> 6845 @impersonationText 6846 </div> 6847 <div class="impersonation-bar-item dw-mod"> 6848 @RenderSwitchAccountButton() 6849 </div> 6850 <div class="impersonation-bar-item dw-mod"> 6851 @RenderStopImpersonationButton() 6852 </div> 6853 </div> 6854 } 6855 } 6856 6857 @helper RenderSwitchAccountButton() { 6858 @Render(new Button 6859 { 6860 Href = "/Default.aspx?ID=" + impersonationPageId, 6861 ButtonLayout = ButtonLayout.LinkClean, 6862 Title = Translate("Switch account"), 6863 Icon = new Icon { 6864 Name = "fa-users", 6865 Prefix = "fal", 6866 LabelPosition = IconLabelPosition.After 6867 }, 6868 CssClass = "u-no-margin u-color-inherit" 6869 }) 6870 } 6871 6872 @helper RenderStopImpersonationForm() 6873 { 6874 string secondaryUserName = getUserName(Model.CurrentSecondaryUser); 6875 string userName = getUserName(Pageview.User); 6876 int pageId = Model.TopPage.ID; 6877 6878 <form method="post" class="u-no-margin"> 6879 @Render(new Button 6880 { 6881 ButtonType = ButtonType.Submit, 6882 ButtonLayout = ButtonLayout.Primary, 6883 Title = Translate("Sign out as") + " " + userName, 6884 OnClick = "logOutImpersonationActions();location.href='/';", 6885 CssClass = "btn--full", 6886 Name = "DwExtranetRemoveSecondaryUser", 6887 }) 6888 </form> 6889 @Render(new Button 6890 { 6891 ButtonType = ButtonType.Button, 6892 ButtonLayout = ButtonLayout.Primary, 6893 Title = Translate("Sign out as") + " " + secondaryUserName, 6894 CssClass = "btn--full", 6895 OnClick = "logOutPrimaryUser(event, this)" 6896 }) 6897 6898 } 6899 6900 @helper RenderStopImpersonationButton() { 6901 @Render(new Button 6902 { 6903 ButtonType = ButtonType.Button, 6904 ButtonLayout = ButtonLayout.LinkClean, 6905 Title = Translate("Sign out"), 6906 Icon = new Icon { 6907 Name = "fa-sign-out", 6908 Prefix = "fal", 6909 LabelPosition = IconLabelPosition.After 6910 }, 6911 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true", 6912 CssClass = "u-no-margin" 6913 }) 6914 } 6915 6916 @helper RenderImpersonationControls() 6917 { 6918 <div class="impersonation__controls"> 6919 @RenderViewListLink() 6920 @RenderSearchBox() 6921 </div> 6922 @RenderResultsList() 6923 } 6924 6925 @helper RenderViewListLink() 6926 { 6927 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as"); 6928 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link"; 6929 6930 @Render(new Link { 6931 ButtonLayout = ButtonLayout.None, 6932 Title = title, 6933 Href = "/Default.aspx?ID=" + impersonationPageId, 6934 CssClass = buttonClasses 6935 }) 6936 } 6937 6938 @helper RenderSearchBox() 6939 { 6940 <div class="impersonation__search-wrap"> 6941 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField"> 6942 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)"> 6943 <i class="fal fa-search"></i> 6944 </div> 6945 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();"> 6946 <i class="fal fa-times"></i> 6947 </div> 6948 </div> 6949 } 6950 6951 @helper RenderTypeaheadSearch() 6952 { 6953 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar" 6954 data-page-size="5" 6955 data-search-feed-id="@impersonationFeed" 6956 data-result-page-id="@impersonationPageId" 6957 data-search-type="user-search" 6958 data-search-parameter-name="q"> 6959 6960 <div class="typeahead-search-field"> 6961 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")"> 6962 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul> 6963 </div> 6964 </div> 6965 } 6966 6967 @helper RenderResultsList() 6968 { 6969 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul> 6970 } 6971 6972 @helper RenderSearchResultTemplate() 6973 { 6974 <script id="ImpersonationSearchResult" type="text/x-template"> 6975 {{#.}} 6976 {{#Users}} 6977 <li class="impersonation__search-results-item impersonation-user"> 6978 <form method="post" class="impersonation-user__form" name="account{{id}}"> 6979 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}"> 6980 <div class="impersonation-user__info"> 6981 <div class="impersonation-user__name">{{userName}}</div> 6982 <div class="impersonation-user__number">{{customerNumber}}</div> 6983 </div> 6984 @Render(new Button 6985 { 6986 ButtonType = ButtonType.Submit, 6987 ButtonLayout = ButtonLayout.Secondary, 6988 Title = Translate("Sign in as"), 6989 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "") 6990 }) 6991 </form> 6992 </li> 6993 {{/Users}} 6994 {{#unless Users}} 6995 <li class="impersonation__search-results-item impersonation__search-results-item--not-found"> 6996 @Translate("Your search gave 0 results") 6997 </li> 6998 {{/unless}} 6999 {{/.}} 7000 </script> 7001 } 7002 7003 @helper RenderSearchScripts() 7004 { 7005 <script> 7006 let inputDelayTimer; 7007 function searchKeyUpHandler(e) { 7008 clearTimeout(inputDelayTimer); 7009 let value = e.target.value; 7010 if (value != "") { 7011 inputDelayTimer = setTimeout(function () { 7012 updateResults(value); 7013 }, 500); 7014 } else { 7015 clearResults(); 7016 } 7017 }; 7018 7019 function updateResults(value) { 7020 if (value == "") { 7021 return null; 7022 } 7023 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value); 7024 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden"); 7025 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden"); 7026 } 7027 7028 function clearResults() { 7029 document.getElementById("ImpersonationBoxSearchField").value = ""; 7030 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults"); 7031 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden"); 7032 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden"); 7033 } 7034 </script> 7035 } 7036 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7037 7038 @using System 7039 @using System.Web 7040 @using System.Collections.Generic 7041 @using Dynamicweb.Rapido.Blocks.Extensibility 7042 @using Dynamicweb.Rapido.Blocks 7043 7044 @{ 7045 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master"); 7046 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table"; 7047 7048 Block orderLines = new Block 7049 { 7050 Id = "MiniCartOrderLines", 7051 SkipRenderBlocksList = true, 7052 BlocksList = new List<Block> 7053 { 7054 new Block { 7055 Id = "MiniCartOrderLinesList", 7056 SortId = 20, 7057 Template = RenderMiniCartOrderLinesList() 7058 } 7059 } 7060 }; 7061 7062 Block orderlinesScriptTemplates = new Block 7063 { 7064 Id = "OrderlinesScriptTemplates" 7065 }; 7066 7067 if (orderlinesView == "table") 7068 { 7069 orderLines.Template = RenderMiniCartOrderLinesTable(); 7070 orderLines.BlocksList.Add( 7071 new Block 7072 { 7073 Id = "MiniCartOrderlinesTableHeader", 7074 SortId = 10, 7075 Template = RenderMiniCartOrderLinesHeader() 7076 } 7077 ); 7078 7079 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates(); 7080 } 7081 else 7082 { 7083 orderLines.Template = RenderMiniCartOrderLinesBlocks(); 7084 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates(); 7085 } 7086 7087 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates); 7088 7089 Block miniCartScriptTemplates = new Block() 7090 { 7091 Id = "MasterMiniCartTemplates", 7092 SortId = 1, 7093 Template = RenderMiniCartScriptTemplates(), 7094 SkipRenderBlocksList = true, 7095 BlocksList = new List<Block> 7096 { 7097 orderLines, 7098 new Block { 7099 Id = "MiniCartFooter", 7100 Template = RenderMiniCartFooter(), 7101 SortId = 50, 7102 SkipRenderBlocksList = true, 7103 BlocksList = new List<Block> 7104 { 7105 new Block { 7106 Id = "MiniCartSubTotal", 7107 Template = RenderMiniCartSubTotal(), 7108 SortId = 30 7109 }, 7110 new Block { 7111 Id = "MiniCartFees", 7112 Template = RenderMiniCartFees(), 7113 SortId = 40 7114 }, 7115 new Block { 7116 Id = "MiniCartPoints", 7117 Template = RenderMiniCartPoints(), 7118 SortId = 50 7119 }, 7120 new Block { 7121 Id = "MiniCartTotal", 7122 Template = RenderMiniCartTotal(), 7123 SortId = 60 7124 }, 7125 new Block { 7126 Id = "MiniCartDisclaimer", 7127 Template = RenderMiniCartDisclaimer(), 7128 SortId = 70 7129 }, 7130 new Block { 7131 Id = "MiniCartActions", 7132 Template = RenderMiniCartActions(), 7133 SortId = 80 7134 } 7135 } 7136 } 7137 } 7138 }; 7139 7140 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates); 7141 } 7142 7143 @helper RenderMiniCartScriptsTableTemplates() 7144 { 7145 string cartPageId = GetPageIdByNavigationTag("MiniCartFeed").ToString(); 7146 <script id="MiniCartOrderline" type="text/x-template"> 7147 {{#unless isEmpty}} 7148 <tr> 7149 <td class="u-ta-right u-va-middle mini-cart-orderline__quantity {{isDiscontinuedClass}}"> 7150 <div class="u-flex u-flex--align-center grid--direction-column"> 7151 @*@Render(new Button { 7152 Icon = new Icon { Prefix = "fas", Name = "fa-caret-up", LabelPosition = IconLabelPosition.After }, 7153 CssClass = "value-button u-no-margin", 7154 ButtonType = ButtonType.Button, 7155 ButtonLayout = ButtonLayout.None, 7156 ExtraAttributes = new Dictionary<string, string> 7157 { 7158 { "data-operation", "increase"}, 7159 } 7160 })*@ 7161 <input type="text" value="{{quantityRaw}}" class="quantity bs-fw-bold mini-cart-quantity-orderline" data-step="{{ProductQuantityPerPurchaseUnit}}" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7162 <input type="text" value="{{ProductBaseUnit}}" class="quantity" data-orderline-id="{{orderLineId}}" data-product-id="{{id}}" readonly/> 7163 @*@Render(new Button { 7164 Icon = new Icon { Prefix = "fas", Name = "fa-caret-down", LabelPosition = IconLabelPosition.After }, 7165 CssClass = "value-button u-no-margin", 7166 ButtonType = ButtonType.Button, 7167 ButtonLayout = ButtonLayout.None, 7168 ExtraAttributes = new Dictionary<string, string> 7169 { 7170 { "data-operation", "decrease"}, 7171 } 7172 })*@ 7173 </div> 7174 </td> 7175 <td class="mini-cart-orderline__image u-va-middle {{isDiscontinuedClass}}"> 7176 <a href="{{link}}" class="{{hideimage}} quick-view" data-load-page="{{link}}"><img loading="lazy" width="40" height="40" src="/Admin/Public/GetImage.ashx?width=40&height=40&crop=5&Compression=75&image={{image}}&altFmImage_path=/Images/Kraemer/RapidoProducts/missing-image.jpg" alt="{{name}}" title="{{name}}" style="aspect-ratio: 40 / 40; object-fit: contain;"></a> 7177 </td> 7178 <td class="u-va-middle {{isDiscontinuedClass}}"> 7179 <a href="{{link}}" class="u-padding-top mini-cart-orderline__name quick-view" data-load-page="{{link}}" title="{{name}}">{{name}}</a> 7180 <div class="u-padding-bottom">{{productnumber}}</div> 7181 {{#if variantname}} 7182 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a> 7183 {{/if}} 7184 {{#if unitname}} 7185 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div> 7186 {{/if}} 7187 </td> 7188 {{#unless hidePricesOrderline}} 7189 <td class="u-ta-right u-va-middle mini-cart-orderline__price test mini-cart-orderline__price_{{orderLineId}} {{isDiscontinuedClass}}"> 7190 {{#if pointsTotal}} 7191 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7192 {{else}} 7193 {{totalprice}} 7194 {{/if}} 7195 </td> 7196 {{/unless}} 7197 <td class="u-ta-right u-va-middle mini-cart-orderline__delete {{#ifCond isDiscontinuedClass '!==' ""}} u-hidden-border-bottom {{/ifCond}}"> 7198 @Render(new Button 7199 { 7200 OnClick = "deleteOrderline('" + cartPageId + "', '{{id}}', '{{orderLineId}}')", 7201 Icon = new Icon { Prefix = "fas", Name = "fa-times", LabelPosition = IconLabelPosition.After }, 7202 CssClass = "u-no-margin", 7203 ButtonType = ButtonType.Button, 7204 ButtonLayout = ButtonLayout.None 7205 }) 7206 </td> 7207 </tr> 7208 {{#if discontinued}} 7209 <tr class="disabled"> 7210 <td class="discontinued-text" style="border-top: 0;" colspan="5">{{discontinuedText}}</td> 7211 </tr> 7212 {{/if}} 7213 {{/unless}} 7214 7215 </script> 7216 7217 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7218 {{#unless isEmpty}} 7219 <tr class="table__row--no-border"> 7220 <td class="u-w60px">&nbsp;</td> 7221 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td> 7222 <td class="u-ta-right">&nbsp;</td> 7223 {{#unless hidePrices}} 7224 <td class="u-ta-right">{{totalprice}}</td> 7225 {{/unless}} 7226 </tr> 7227 {{/unless}} 7228 </script> 7229 } 7230 7231 @helper RenderMiniCartScriptsListTemplates() 7232 { 7233 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7234 7235 <script id="MiniCartOrderline" type="text/x-template"> 7236 {{#unless isEmpty}} 7237 <div class="mini-cart-orderline grid dw-mod"> 7238 <div class="grid__col-4"> 7239 <a href="{{link}}" class="{{hideimage}}"> 7240 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"> 7241 </a> 7242 </div> 7243 <div class="grid__col-8"> 7244 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a> 7245 {{#if variantname}} 7246 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div> 7247 {{/if}} 7248 {{#if unitname}} 7249 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div> 7250 {{/if}} 7251 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div> 7252 7253 <div class="grid__cell-footer"> 7254 <div class="grid__cell"> 7255 {{#unless hidePrices}} 7256 <div class="u-pull--left mini-cart-orderline__price dw-mod"> 7257 {{#if pointsTotal}} 7258 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points") 7259 {{else}} 7260 {{totalprice}} 7261 {{/if}} 7262 </div> 7263 {{/unless}} 7264 <button type="button" 7265 title="@Translate("Remove orderline")" 7266 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" 7267 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button> 7268 </div> 7269 </div> 7270 </div> 7271 </div> 7272 {{/unless}} 7273 </script> 7274 7275 <script id="MiniCartOrderlineDiscount" type="text/x-template"> 7276 {{#unless isEmpty}} 7277 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod"> 7278 <div class="grid__col-4"> 7279 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div> 7280 </div> 7281 {{#unless hidePrices}} 7282 <div class="grid__col-8">{{totalprice}}</div> 7283 {{/unless}} 7284 </div> 7285 {{/unless}} 7286 </script> 7287 } 7288 7289 @helper RenderMiniCartScriptTemplates() 7290 { 7291 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList(); 7292 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7293 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage")); 7294 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 7295 7296 <script id="MiniCartContent" type="text/x-template"> 7297 {{#.}} 7298 {{#unless isEmpty}} 7299 @if (miniCartUseGoogleTagManager) 7300 { 7301 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text> 7302 } 7303 @RenderBlockList(subBlocks) 7304 {{/unless}} 7305 {{/.}} 7306 </script> 7307 } 7308 7309 @helper RenderMiniCartOrderLinesTable() 7310 { 7311 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7312 7313 <div class="u-overflow-auto"> 7314 <table class="table mini-cart-table dw-mod" data-test="true"> 7315 7316 @RenderBlockList(subBlocks) 7317 </table> 7318 </div> 7319 } 7320 7321 @helper RenderMiniCartOrderLinesBlocks() 7322 { 7323 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList(); 7324 7325 <div class="u-overflow-auto"> 7326 @RenderBlockList(subBlocks) 7327 </div> 7328 } 7329 7330 @helper RenderMiniCartOrderLinesHeader() 7331 { 7332 @*<thead> 7333 <tr> 7334 <td>&nbsp;</td> 7335 <td>@Translate("Product")</td> 7336 <td class="u-ta-right">@Translate("Qty")</td> 7337 <td class="u-ta-right">@Translate("Price")</td> 7338 </tr> 7339 </thead>*@ 7340 } 7341 7342 @helper RenderMiniCartOrderLinesList() 7343 { 7344 <text> 7345 {{#OrderLines}} 7346 {{#ifCond template "===" "CartOrderline"}} 7347 {{>MiniCartOrderline}} 7348 {{/ifCond}} 7349 {{#ifCond template "===" "CartOrderlineMobile"}} 7350 {{>MiniCartOrderline}} 7351 {{/ifCond}} 7352 {{#ifCond template "===" "CartOrderlineDiscount"}} 7353 {{>MiniCartOrderlineDiscount}} 7354 {{/ifCond}} 7355 {{/OrderLines}} 7356 </text> 7357 } 7358 7359 @helper RenderMiniCartFees() 7360 { 7361 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7362 if (!pointShop) 7363 { 7364 <text> 7365 {{#unless hidePaymentfee}} 7366 <div class="grid"> 7367 <div class="grid__col-6 grid__col--bleed-y"> 7368 {{paymentmethod}} 7369 </div> 7370 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div> 7371 </div> 7372 {{/unless}} 7373 </text> 7374 } 7375 <text> 7376 {{#unless hideShippingfee}} 7377 <div class="grid"> 7378 <div class="grid__col-6 grid__col--bleed-y"> 7379 {{shippingmethod}} 7380 </div> 7381 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div> 7382 </div> 7383 {{/unless}} 7384 </text> 7385 <text> 7386 {{#if hasTaxSettings}} 7387 <div class="grid"> 7388 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div> 7389 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div> 7390 </div> 7391 {{/if}} 7392 </text> 7393 } 7394 7395 @helper RenderMiniCartFooter() 7396 { 7397 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList(); 7398 7399 <div class="mini-cart__footer u-border-top u-padding-top dw-mod"> 7400 @RenderBlockList(subBlocks) 7401 </div> 7402 } 7403 7404 @helper RenderMiniCartActions() 7405 { 7406 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7407 7408 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom bs-mb-2" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = true">@Translate("Empty cart")</button> 7409 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Proceed to cart")</a> 7410 } 7411 7412 @helper RenderMiniCartPoints() 7413 { 7414 <text> 7415 {{#if earnings}} 7416 <div class="grid"> 7417 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div> 7418 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7419 <div> 7420 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points") 7421 </div> 7422 </div> 7423 </div> 7424 {{/if}} 7425 </text> 7426 } 7427 7428 @helper RenderMiniCartSubTotal() 7429 { 7430 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID); 7431 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7432 if (!pointShop) 7433 { 7434 @*<text> 7435 {{#unless hideSubTotal}} 7436 <div class="grid dw-mod u-bold"> 7437 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div> 7438 <div class="grid__col-6 grid__col--bleed-y grid--align-end"> 7439 @if (hasTaxSettings) 7440 { 7441 <text>{{subtotalpricewithouttaxes}}</text> 7442 } 7443 else 7444 { 7445 <text>{{subtotalprice}}</text> 7446 } 7447 </div> 7448 </div> 7449 {{/unless}} 7450 </text>*@ 7451 } 7452 } 7453 7454 @helper RenderMiniCartTotal() 7455 { 7456 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7457 <text> 7458 {{#unless hidePrices}} 7459 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod"> 7460 <div class="grid__col-6">@Translate("Total")</div> 7461 <div class="grid__col-6 grid--align-end"> 7462 <div> 7463 @if (pointShop) 7464 { 7465 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points") 7466 } 7467 else 7468 { 7469 <text>{{totalprice}}</text> 7470 } 7471 </div> 7472 </div> 7473 </div> 7474 {{/unless}} 7475 </text> 7476 } 7477 7478 @helper RenderMiniCartDisclaimer() 7479 { 7480 <text> 7481 {{#if showCheckoutDisclaimer}} 7482 <div class="grid u-margin-bottom u-ta-right"> 7483 <small class="grid__col-12">{{checkoutDisclaimer}}</small> 7484 </div> 7485 {{/if}} 7486 </text> 7487 } 7488 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7489 7490 @using Dynamicweb.Rapido.Blocks.Extensibility 7491 @using Dynamicweb.Rapido.Blocks 7492 @using Dynamicweb.Rapido.Blocks.Components.General 7493 @using Dynamicweb.Rapido.Blocks.Components 7494 @using Dynamicweb.Rapido.Services 7495 7496 @{ 7497 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : ""; 7498 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown"; 7499 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart"); 7500 7501 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType)) 7502 { 7503 if (addToCartNotificationType == "modal") 7504 { 7505 Block addToCartNotificationModal = new Block 7506 { 7507 Id = "AddToCartNotificationModal", 7508 Template = RenderAddToCartNotificationModal() 7509 }; 7510 7511 Block addToCartNotificationScript = new Block 7512 { 7513 Id = "AddToCartNotificationScript", 7514 Template = RenderAddToCartNotificationModalScript() 7515 }; 7516 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal); 7517 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7518 } 7519 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 7520 { 7521 Block addToCartNotificationScript = new Block 7522 { 7523 Id = "AddToCartNotificationScript", 7524 Template = RenderAddToCartNotificationToggleScript() 7525 }; 7526 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript); 7527 } 7528 } 7529 } 7530 7531 @helper RenderAddToCartNotificationModal() 7532 { 7533 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div> 7534 } 7535 7536 @helper RenderAddToCartNotificationModalScript() 7537 { 7538 int cartPageId = GetPageIdByNavigationTag("CartPage"); 7539 7540 <script id="LastAddedProductTemplate" type="text/x-template"> 7541 @{ 7542 7543 Modal lastAddedProduct = new Modal 7544 { 7545 Id = "LastAddedProduct", 7546 Heading = new Heading 7547 { 7548 Level = 2, 7549 Title = Translate("Product is added to the cart") 7550 }, 7551 Width = ModalWidth.Md, 7552 BodyTemplate = RenderModalContent() 7553 }; 7554 7555 lastAddedProduct.AddActions( 7556 new Button 7557 { 7558 ButtonType = ButtonType.Button, 7559 ButtonLayout = ButtonLayout.Secondary, 7560 Title = Translate("Continue shopping"), 7561 CssClass = "u-pull--left u-no-margin btn--sm", 7562 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false" 7563 }, 7564 new Link 7565 { 7566 Href = "/Default.aspx?ID=" + cartPageId, 7567 ButtonLayout = ButtonLayout.Secondary, 7568 CssClass = "u-pull--right u-no-margin btn--sm", 7569 Title = Translate("Proceed to checkout") 7570 } 7571 ); 7572 7573 @Render(lastAddedProduct) 7574 } 7575 </script> 7576 7577 } 7578 7579 @helper RenderModalContent() 7580 { 7581 <div class="grid"> 7582 <div class="grid__col-2"> 7583 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true }) 7584 </div> 7585 <div class="u-padding grid--align-self-center"> 7586 <span>{{quantity}}</span> x 7587 </div> 7588 <div class="grid__col-auto grid--align-self-center"> 7589 <div>{{productInfo.name}}</div> 7590 {{#if productInfo.variantName}} 7591 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small> 7592 {{/if}} 7593 {{#if productInfo.unitName}} 7594 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small> 7595 {{/if}} 7596 </div> 7597 </div> 7598 } 7599 7600 @helper RenderAddToCartNotificationToggleScript() 7601 { 7602 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed"); 7603 7604 <script> 7605 document.addEventListener('addToCart', function () { 7606 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId'); 7607 }); 7608 </script> 7609 } 7610 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7611 7612 @using System 7613 @using System.Web 7614 @using System.Collections.Generic 7615 @using Dynamicweb.Rapido.Blocks.Extensibility 7616 @using Dynamicweb.Rapido.Blocks 7617 @using Dynamicweb.Rapido.Blocks.Components.General 7618 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Math 7619 7620 @functions { 7621 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master"); 7622 } 7623 7624 @{ 7625 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content"); 7626 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content"); 7627 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content"); 7628 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header"); 7629 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header"); 7630 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header"); 7631 7632 Block masterFooterContent = new Block() 7633 { 7634 Id = "MasterFooterContent", 7635 SortId = 10, 7636 Template = RenderFooter(), 7637 SkipRenderBlocksList = true 7638 }; 7639 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent); 7640 7641 /*if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader)) 7642 { 7643 Block masterFooterColumnOne = new Block 7644 { 7645 Id = "MasterFooterColumnOne", 7646 SortId = 10, 7647 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent), 7648 Design = new Design 7649 { 7650 Size = "auto", 7651 RenderType = RenderType.Column 7652 } 7653 }; 7654 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne); 7655 } 7656 7657 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader)) 7658 { 7659 Block masterFooterColumnTwo = new Block 7660 { 7661 Id = "MasterFooterColumnTwo", 7662 SortId = 20, 7663 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent), 7664 Design = new Design 7665 { 7666 Size = "auto", 7667 RenderType = RenderType.Column 7668 } 7669 }; 7670 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo); 7671 } 7672 7673 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader)) 7674 { 7675 Block masterFooterColumnThree = new Block 7676 { 7677 Id = "MasterFooterColumnThree", 7678 SortId = 30, 7679 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent), 7680 Design = new Design 7681 { 7682 Size = "auto", 7683 RenderType = RenderType.Column 7684 } 7685 }; 7686 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree); 7687 }*/ 7688 7689 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp")) 7690 { 7691 Block masterFooterNewsletterSignUp = new Block 7692 { 7693 Id = "MasterFooterNewsletterSignUp", 7694 SortId = 40, 7695 Template = RenderFooterNewsletterSignUp(), 7696 Design = new Design 7697 { 7698 Size = "auto", 7699 RenderType = RenderType.Column 7700 } 7701 }; 7702 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp); 7703 } 7704 7705 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0) 7706 { 7707 Block masterFooterSocialLinks = new Block 7708 { 7709 Id = "MasterFooterSocialLinks", 7710 SortId = 50, 7711 Template = RenderFooterSocialLinks(), 7712 Design = new Design 7713 { 7714 Size = "auto", 7715 RenderType = RenderType.Column 7716 } 7717 }; 7718 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks); 7719 } 7720 7721 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0) 7722 { 7723 Block masterFooterPayments = new Block 7724 { 7725 Id = "MasterFooterPayments", 7726 SortId = 60, 7727 Template = RenderFooterPayments(), 7728 Design = new Design 7729 { 7730 Size = "12", 7731 RenderType = RenderType.Column 7732 } 7733 }; 7734 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments); 7735 } 7736 7737 Block masterFooterCopyright = new Block 7738 { 7739 Id = "MasterFooterCopyright", 7740 SortId = 70, 7741 Template = RenderFooterCopyright(), 7742 Design = new Design 7743 { 7744 CssClass = "u-full-width" 7745 } 7746 }; 7747 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright); 7748 } 7749 7750 @helper RenderFooter() 7751 { 7752 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList(); 7753 var imageSource = "/Files/Images/FooterWave.svg"; 7754 List<int> pages = new List<int>(); 7755 pages.Add(6953); 7756 var test = 0; 7757 if (Model.Item != null) 7758 { 7759 test = Int32.Parse(Model?.Item?.PageID.ToString()); 7760 } 7761 var footerBackgroundColor = ""; 7762 if (test != 0) 7763 { 7764 footerBackgroundColor = pages.Contains(Model.Item.PageID) ? "bg-beige" : ""; 7765 7766 <footer class="footer dw-mod @footerBackgroundColor" id="@Model.Item.PageID" style="position: relative;"> 7767 <div class="backdrop"> 7768 @{ 7769 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7770 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7771 } 7772 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7773 </div> 7774 <div class="footer__content"> 7775 <div class="content-container"> 7776 <div class="content-row"> 7777 @RenderBlockList(subBlocks) 7778 </div> 7779 </div> 7780 </div> 7781 </footer> 7782 }else 7783 { 7784 <footer class="footer dw-mod " style="position: relative;"> 7785 <div class="backdrop"> 7786 @{ 7787 string bigViewportWaveImage = imageSource.Replace(".svg", "-big.svg"); 7788 string smallViewportWaveImage = imageSource.Replace(".svg", "-small.svg"); 7789 } 7790 <img loading="lazy" srcset="@smallViewportWaveImage 768w, @imageSource 1920w, @bigViewportWaveImage 2560w" src="@imageSource" style="object-fit: cover; width: 100%; margin-bottom: -2px; display: block;" sizes="100vw"/> 7791 </div> 7792 <div class="footer__content"> 7793 <div class="content-container"> 7794 <div class="content-row"> 7795 @RenderBlockList(subBlocks) 7796 </div> 7797 </div> 7798 </div> 7799 </footer> 7800 } 7801 } 7802 7803 @helper RenderFooterColumn(string header, string content) 7804 { 7805 <h3 class="footer__heading dw-mod">@header</h3> 7806 <div class="footer__content dw-mod"> 7807 @content 7808 </div> 7809 } 7810 7811 @helper RenderFooterNewsletterSignUp() 7812 { 7813 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString(); 7814 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart }; 7815 7816 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId }); 7817 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" }); 7818 form.Add(new TextField 7819 { 7820 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"), 7821 Type = TextFieldType.Email, 7822 ActionButton = new Button 7823 { 7824 ButtonType = ButtonType.Submit, Id = "Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed" 7825 } 7826 }); 7827 7828 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3> 7829 <div class="footer__content dw-mod"> 7830 @Render(form) 7831 </div> 7832 } 7833 7834 @helper RenderFooterSocialLinks() 7835 { 7836 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3> 7837 <div class="footer__content dw-mod"> 7838 <div class="collection dw-mod"> 7839 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks")) 7840 { 7841 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel; 7842 string socialIconClass = socialIcon.SelectedValue; 7843 string socialIconTitle = socialIcon.SelectedName; 7844 string socialLink = socialitem.GetString("Link"); 7845 7846 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"> 7847 <i class="@socialIconClass fa-2x"></i> 7848 </a> 7849 } 7850 </div> 7851 </div> 7852 } 7853 7854 @helper RenderFooterPayments() 7855 { 7856 <div class="footer__content dw-mod"> 7857 <div class="collection dw-mod"> 7858 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments")) 7859 { 7860 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel; 7861 string paymentImage = null; 7862 string paymentTitle = paymentItem.SelectedName; 7863 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault(); 7864 if (selected != null) 7865 { 7866 paymentImage = selected.Icon; 7867 } 7868 7869 <div class="footer__card-type"> 7870 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle"/> 7871 </div> 7872 } 7873 </div> 7874 </div> 7875 } 7876 7877 @helper RenderFooterCopyright() 7878 { 7879 <div class="footer__copyright u-position-relative"> 7880 <div class="footer__copyright-logo"> 7881 <img loadin="lazy" src="/Files/Images/dnv-good-fit.png" width="129" height="122" alt="footer-icon"/> 7882 </div> 7883 <p class="footer__copyright-text">&copy; @DateTime.Now.Year @Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p> 7884 7885 7886 </div> 7887 } 7888 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7889 7890 @using System 7891 @using System.Web 7892 @using System.Collections.Generic 7893 @using Dynamicweb.Rapido.Blocks.Extensibility 7894 @using Dynamicweb.Rapido.Blocks 7895 @using Dynamicweb.Ecommerce.Common 7896 7897 @{ 7898 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master"); 7899 7900 Block masterScriptReferences = new Block() 7901 { 7902 Id = "MasterScriptReferences", 7903 SortId = 1, 7904 Template = RenderMasterScriptReferences() 7905 }; 7906 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences); 7907 } 7908 7909 @helper RenderMasterScriptReferences() { 7910 var customJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/js/custom.js")); 7911 var appJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/app.bundle.js")); 7912 var foodCalendarJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js")); 7913 var shoppingListJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js")); 7914 var customGeneralJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js")); 7915 var foodCalendarExtensionJs = new FileInfo(Dynamicweb.Core.SystemInformation.MapPath("~/Files/Templates/Designs/Rapido/dist/foodcalendarExtension.bundle.js")); 7916 string customJsSrc = "/Files/Templates/Designs/Rapido/js/custom.js?" + appJs.LastWriteTime.Ticks; 7917 string appJsSrc = "/Files/Templates/Designs/Rapido/dist/app.bundle.js?" + appJs.LastWriteTime.Ticks; 7918 string foodCalendarJsSrc = "/Files/Templates/Designs/Rapido/dist/foodcalendar.bundle.js?" + foodCalendarJs.LastWriteTime.Ticks; 7919 string shoppingListJsSrc = "/Files/Templates/Designs/Rapido/dist/shoppingList.bundle.js?" + shoppingListJs.LastWriteTime.Ticks; 7920 string customGeneralJsSrc = "/Files/Templates/Designs/Rapido/dist/customGeneral.bundle.js?" + customGeneralJs.LastWriteTime.Ticks; 7921 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js" defer></script> 7922 <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js" defer></script> 7923 <script src="https://unpkg.com/@("@reduxjs")/toolkit@1.9.7/dist/redux-toolkit.umd.js" defer></script> 7924 <script src="/Files/Templates/Designs/Rapido/js/master.js?v=5" defer></script> 7925 7926 7927 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript")) 7928 { 7929 <script src="/Files/Templates/Designs/Rapido/js/axios.js" defer></script> 7930 <script src="@customJsSrc" defer></script> 7931 <script src="@appJsSrc" type="module"></script> 7932 <script src="@foodCalendarJsSrc" type="module"></script> 7933 <script src="@shoppingListJsSrc" type="module"></script> 7934 <script src="@customGeneralJsSrc" type="module"></script> 7935 7936 7937 PushPromise("/Files/Templates/Designs/Rapido/js/axios.js"); 7938 PushPromise(customJsSrc); 7939 PushPromise(foodCalendarJsSrc); 7940 PushPromise(shoppingListJsSrc); 7941 PushPromise(customGeneralJsSrc); 7942 } 7943 7944 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"); 7945 PushPromise("/Files/Templates/Designs/Rapido/js/master.js?v=5"); 7946 } 7947 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 7948 7949 @using System 7950 @using System.Web 7951 @using System.Collections.Generic 7952 @using Dynamicweb.Rapido.Blocks.Extensibility 7953 @using Dynamicweb.Rapido.Blocks 7954 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 7955 @using Dynamicweb.Rapido.Services 7956 @using Dynamicweb.Ecommerce.ProductCatalog 7957 7958 @{ 7959 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master"); 7960 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch"); 7961 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID")); 7962 7963 if (!navigationItemsHideSearch || isFavoriteList) 7964 { 7965 Block masterSearchScriptTemplates = new Block() 7966 { 7967 Id = "MasterSearchScriptTemplates", 7968 SortId = 1, 7969 Template = RenderSearchScriptTemplates() 7970 }; 7971 7972 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates); 7973 } 7974 } 7975 7976 @helper RenderSearchScriptTemplates() 7977 { 7978 int productsPageId = GetPageIdByNavigationTag("ProductsPage"); 7979 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID; 7980 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID")); 7981 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID")); 7982 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults"); 7983 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton"); 7984 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton"); 7985 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton"); 7986 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly"); 7987 var selectedFavoriteIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "star"; 7988 string favoriteIcon = "fas fa-" + selectedFavoriteIcon; 7989 string favoriteOutlineIcon = "fal fa-" + selectedFavoriteIcon; 7990 string trashIcon = "fas fa-trash-alt"; 7991 7992 string currentFavoriteListId = HttpContext.Current.Request.QueryString.Get("ListID"); 7993 string classMaxWidth = Pageview.Device.ToString() != "Mobile" ? "u-max-w260px" : ""; 7994 string searchParameter = HttpContext.Current.Request.QueryString.Get("Search"); 7995 var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 7996 var showCartons = currentUser?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString(); 7997 7998 7999 <script id="SearchGroupsTemplate" type="text/x-template"> 8000 {{#.}} 8001 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li> 8002 {{/.}} 8003 </script> 8004 8005 <script id="SearchProductsTemplate" type="text/x-template"> 8006 <div style="padding-top:15px; padding-left: 15px; padding-right: 15px;" class="dropdown__item--seperator bs-mb-4 bs-border-secondary dw-mod ">{{label}} 8007 8008 {{#each .}} 8009 {{#each FacetGroups}} 8010 <h4 class="bs-mb-3 u-color-inherit">@Translate("Kategorier")</h4> 8011 <div class="display-grid--two-columns bs-pb-4 "> 8012 {{#FacetOptions}} 8013 {{#ifCond queryParameter "===" "Category"}} 8014 <a class="u-color-inherit" style="font-weight: 600" href="/Default.aspx?ID=@productsPageId&GroupID={{name}}&SubcategoryLink=true">{{label}} ({{count}})</a> 8015 {{/ifCond}} 8016 {{/FacetOptions}} 8017 </div> 8018 {{/each}} 8019 {{/each}} 8020 8021 </div> 8022 {{#each .}} 8023 {{#each ProductsContainer}} 8024 {{#Product}} 8025 {{#ifCond template "!==" "SearchMore"}} 8026 {{#ifCond isDiscontinuedClass "!==" "disabled"}} 8027 <li class="dropdown__item test dropdown__item--seperator dw-mod"> 8028 @if (useFacebookPixel) 8029 { 8030 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text> 8031 } 8032 @if (useGoogleTagManager) 8033 { 8034 <text>{{{googleEnchantImpression googleImpression}}}</text> 8035 } 8036 <div class="search__product-wrapper"> 8037 <div class="search__product-wrapper-infos"> 8038 <a href="{{link}}" 8039 class="js-typeahead-link quick-view u-color-inherit u-pull--left bs-d-flex" data-load-page="{{link}}" 8040 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}" 8041 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"> 8042 <div class="u-margin-right u-pull--left bs-d-flex {{noimage}}" style="width: 50px"><img src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"></div> 8043 <div class="u-pull--left"> 8044 <div class="u-bold u-truncate-text js-typeahead-name u-flex grid--align-center"> 8045 <span class="u-padding-right">{{productId}}</span> 8046 <span class="u-flex grid--align-center u-padding-right"> 8047 <i class="fas fa-circle cart-circle"></i> 8048 </span> 8049 <span class="search__product-name u-truncate-text u-inline-block bs-d-flex bs-align-items-center bs-gap-1" style="max-width: 200px">{{name}}{{#if variantName}}, {{variantName}}{{/if}} 8050 {{#ifCond ProductCountryManufacturerCode '===' "NO"}} 8051 <div class="product-country"> 8052 <img height="18px" src='@("/Admin/Images/Flags/flag_" + "no" +".png")' title="@Translate("Norway")" alt='@Translate("Norway flag")'> 8053 </div> 8054 {{/ifCond}} 8055 </span> 8056 </div> 8057 <div class="u-flex grid--align-center u-truncate-text product-search-description"> 8058 {{#if transit}} 8059 <span class="cart-table__product-name-infos-transit"> 8060 <div class="transit-container u-margin-right" title="@Translate("Transittvare")"> 8061 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8062 <circle cx="10" cy="10" r="10" fill="#0052A0"/> 8063 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white"/> 8064 </svg> 8065 <div class="tooltip">@Translate("Transittvare")</div> 8066 </div> 8067 </span> 8068 {{/if}} 8069 {{#if showBreakableIcon}} 8070 <span class="cart-table__product-name-infos-showbreakableicon"> 8071 <div class="transit-container u-margin-right" title="@Translate("Anbrekksvare")"> 8072 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 8073 <circle cx="10" cy="10" r="10" fill="#0052A0"/> 8074 <path d="M11.7979 12.9492H8.20215L7.51855 15H5.33789L9.04297 5.04688H10.9434L14.6689 15H12.4883L11.7979 12.9492ZM8.75586 11.2881H11.2441L9.99316 7.5625L8.75586 11.2881Z" fill="white"/> 8075 </svg> 8076 <div class="tooltip">@Translate("Anbrekksvare")</div> 8077 </div> 8078 </span> 8079 {{/if}} 8080 <span class="js-typeahead-name u-padding-right u-flex grid--align-center search__manufacture-name"> {{ManufacturerName}}</span> 8081 <span class="u-flex grid--align-center u-padding-right"><i class="fas fa-circle cart-circle"></i></span> 8082 <span class="package-contents search__product-package u-truncate-text">{{truncateFirst20 ProductPackageContents}}</span> 8083 8084 8085 {{#ifCond StorageAvailableInSessionLocation '!==' true}} 8086 {{#ifCond warehouseDescription '!==' ""}} 8087 {{#ifCond warehouseDescription '!==' null}} 8088 8089 @if (Pageview.User != null) 8090 { 8091 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #f1ff80" title="@Translate("Central warehouse - longer lead time")">{{warehouseDescription}}</div> 8092 } 8093 8094 {{/ifCond}} 8095 {{/ifCond}} 8096 8097 8098 {{#ifCond stockDescriptiontext '!==' ""}} 8099 {{#ifCond stockDescriptiontext '!==' null}} 8100 {{#ifCond stockDescriptiontext '!==' "Lagerført"}} 8101 8102 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Limited")"}} 8103 8104 @if (Pageview.User != null) 8105 { 8106 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Limited")">{{stockDescriptiontext}}</div> 8107 } 8108 8109 {{/ifCond}} 8110 8111 {{#ifCond stockDescriptiontext '==' "@Translate("ASKO_S_Unavailable")"}} 8112 8113 @if (Pageview.User != null) 8114 { 8115 <div class="bs-ms-2 bs-px-2 bs-rounded-3" style="max-width: fit-content;background-color: #FFA773" title="@Translate("ASKO_Unavailable")">{{stockDescriptiontext}}</div> 8116 } 8117 8118 {{/ifCond}} 8119 8120 {{/ifCond}} 8121 {{/ifCond}} 8122 {{/ifCond}} 8123 {{/ifCond}} 8124 </div> 8125 @* @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed()) 8126 { 8127 if (pointShopOnly) 8128 { 8129 <text> 8130 {{#if havePointPrice}} 8131 <div> 8132 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points") 8133 </div> 8134 {{else}} 8135 <small class="help-text u-no-margin">@Translate("Not available")</small> 8136 {{/if}} 8137 {{#unless canBePurchasedWithPoints}} 8138 {{#if havePointPrice}} 8139 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small> 8140 {{/if}} 8141 {{/unless}} 8142 </text> 8143 } 8144 else 8145 { 8146 <div>{{price}}</div> 8147 } 8148 }*@ 8149 </div> 8150 </a> 8151 </div> 8152 <div class="u-flex search__product-wrapper-price"> 8153 <div class="u-margin-left"> 8154 @{ 8155 var viewBtn = new Link 8156 { 8157 Href = "{{link}}", 8158 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}", 8159 ButtonLayout = ButtonLayout.Secondary, 8160 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside u-hidden", 8161 Title = Translate("View") 8162 }; 8163 } 8164 8165 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed()) 8166 { 8167 <text>{{#if hideAddToCartButton}}</text> 8168 @Render(viewBtn) 8169 <text>{{else}}</text> 8170 <div class="u-flex grid--align-center grid--wrap"> 8171 <div class="price price--product-list price--micro u-margin-right dw-mod">{{price}} / {{ProductBaseUnit}} 8172 @*<span class="purchase-unit-details dw-mod u-color-dark u-margin-left--lg">{{ProductQuantityPerPurchaseUnit}} x</span>*@ 8173 </div> 8174 <div class="add-quantity-container u-flex u-flex--align"> 8175 8176 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet") 8177 { <div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8178 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="this.parentNode.querySelector('input[type=number]').stepDown()">-</button> 8179 @Render(new NumberField 8180 { 8181 Id = "SearchQuantity{{productId}}", 8182 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8183 Value = "", 8184 ExtraAttributes = new Dictionary<string, string> 8185 { 8186 {"data-breakable", "{{Breakable}}"}, 8187 {"data-prev-value", "0"}, 8188 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8189 {"data-product-id", "{{productId}}"}, 8190 {"tabindex", "0"}, 8191 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8192 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8193 { "data-type", "Search" }, 8194 { "data-name", "{{name}}"}, 8195 } 8196 }) 8197 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); input.stepUp(); input.dispatchEvent(new Event('change'));">+</button> 8198 </div> 8199 @Render(new Button { 8200 OnClick = "enableField(this)", 8201 Id = "SearchQuantityBtn{{productId}}", 8202 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8203 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8204 ButtonType = ButtonType.Button, 8205 ButtonLayout = ButtonLayout.Primary, 8206 ExtraAttributes = new Dictionary<string, string> 8207 { 8208 { "data-type", "Search"}, 8209 { "data-breakable", "{{Breakable}}"}, 8210 { "data-product-info", "{{productInfo}}" }, 8211 { "data-unit-id", "{{unitId}}" }, 8212 { "data-variant-id", "{{variantid}}" }, 8213 { "data-product-id", "{{productId}}" }, 8214 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8215 { "data-unit-price","{{priceDouble}}" }, 8216 { "data-link","{{link}}" }, 8217 { "data-unit-base","{{ProductBaseUnit}}"}, 8218 { "{{disableButton}}", ""} 8219 } 8220 8221 }) 8222 8223 if (showCartons == "True") 8224 { 8225 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8226 } 8227 } 8228 else 8229 {<div class="add-quantity-information u-hidden bs-bg-white bs-border bs-border-1 bs-border-primary bs-rounded-3" > 8230 <button type="button" class="bs-btn bs-p-0 bs-ps-2 stepper-button-product-quantity" step="{{ProductQuantityPerPurchaseUnit}}" data-role="decrease" onclick="this.parentNode.querySelector('input[type=number]').stepDown()" style="min-width: unset!important;">-</button> 8231 @Render(new NumberField { 8232 Id = "SearchQuantity{{productId}}", 8233 CssClass = "u-no-margin product-quantity detail-quantity bs-border-0 bs-p-0 {{breakableClass}} {{decimalsAllowedClass}}", 8234 Value = "", 8235 ExtraAttributes = new Dictionary<string, string> 8236 { 8237 {"data-breakable", "{{Breakable}}"}, 8238 {"data-prev-value", "0"}, 8239 {"data-per-unit", "{{ProductQuantityPerPurchaseUnit}}"}, 8240 {"data-product-id", "{{productId}}"}, 8241 {"tabindex", "0"}, 8242 {"min", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8243 { "step", "{{#ifCond Breakable '!==' true}}{{ProductQuantityPerPurchaseUnit}}{{else}}1{{/ifCond}}"}, 8244 {"data-type", "Search"}, 8245 { "data-name", "{{name}}"}, 8246 {"style","width: 40px !important;height:2ch!important;"} 8247 } 8248 }) 8249 <button type="button" class="bs-btn bs-p-0 bs-pe-2 stepper-button-product-quantity" data-role="increase" data-form-type="other" onclick="var input = this.parentNode.querySelector('input[type=number]'); input.stepUp(); input.dispatchEvent(new Event('change'));" style="min-width: unset!important;">+</button> 8250 </div> 8251 @Render(new Button { 8252 OnClick = "enableField(this)", 8253 Id = "SearchQuantityBtn{{productId}}", 8254 Icon = new Icon { Prefix = "svg", Name = "/Files/Images/cart-button-icon-svg.svg", LabelPosition = IconLabelPosition.After }, 8255 CssClass = "u-no-margin u-pull--right add-to-cart-button-mobile-class", 8256 ButtonType = ButtonType.Button, 8257 ButtonLayout = ButtonLayout.Primary, 8258 ExtraAttributes = new Dictionary<string, string> 8259 { 8260 { "data-type", "Search"}, 8261 { "data-breakable", "{{Breakable}}"}, 8262 { "data-product-info", "{{productInfo}}" }, 8263 { "data-unit-id", "{{unitId}}" }, 8264 { "data-variant-id", "{{variantid}}" }, 8265 { "data-product-id", "{{productId}}" }, 8266 { "data-quantity-to-add","{{ProductQuantityPerPurchaseUnit}}" }, 8267 { "data-unit-price","{{priceDouble}}" }, 8268 { "data-link","{{link}}" }, 8269 { "data-unit-base","{{ProductBaseUnit}}"}, 8270 { "{{disableButton}}", ""} 8271 } 8272 8273 }) 8274 if (showCartons == "True") 8275 { 8276 <div class="number-of-cases bs-fw-bold bs-ms-2 bs-color-primary u-hidden bs-d-flex bs-align-items-center"></div> 8277 } 8278 8279 } 8280 8281 <div class="loader-container u-hidden"> 8282 <i class="fas fa-circle-notch fa-spin preloader"></i> 8283 </div> 8284 8285 </div> 8286 </div> 8287 8288 <text>{{/if}}</text> 8289 } 8290 else if (showViewButton) 8291 { 8292 @Render(viewBtn) 8293 } 8294 @if (showAddToDownloadButton) 8295 { 8296 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}"> 8297 <i class="fas fa-plus js-button-icon"></i> 8298 </button> 8299 } 8300 </div> 8301 8302 @if (currentUser != null) 8303 { 8304 <div class="favorites product-list__details-favorites {{hasVariants}} dw-mod test" {{hasVariants}}> 8305 @*de aici *@ 8306 <div class="favorites product-list__details-favorites bs-d-flex bs-align-items-center bs-justify-content-center {{hasVariants}}" {{hasVariants}} data-product-number="{{number}}" data-quantity="{{ProductQuantityPerPurchaseUnit}}" style="position: relative;"> 8307 @*{{#Favorite}}*@ 8308 @*{{>FavoriteTemplate}}*@ 8309 8310 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{number}}" title="@Translate("HOVER_FavouriteList")"> 8311 @*{{#if isInAnyFavoriteList}} 8312 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/> 8313 {{else}} 8314 <img height="26" width="26" src="/Files/Images/favorite-list-Filled.svg"/> 8315 {{/if}}*@ 8316 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg"/> 8317 </a> 8318 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container').classList.add('u-hidden');"></div> 8319 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;top: 100%;z-index: 99999999999999;height: 200px;"> 8320 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-mb-3"> 8321 @*<div class="bs-fs-5 favorite-list-item bs-list-group-item bs-list-group-item-action" data-list-id="ListID" onclick="addToShoppingList(this)">Example1</div>*@ 8322 </div> 8323 @*<div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 8324 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")"/> 8325 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 8326 </div>*@ 8327 </div> 8328 @*{{/Favorite}}*@ 8329 </div> 8330 </div> 8331 } 8332 8333 </div> 8334 </div> 8335 </li> 8336 {{/ifCond}} 8337 {{/ifCond}} 8338 8339 @*{{#ifCond template "===" "SearchMore"}} 8340 {{>SearchMoreProducts}} 8341 {{/ifCond}}*@ 8342 {{/Product}} 8343 {{else}} 8344 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8345 @Translate("Your search gave 0 results") 8346 </li> 8347 {{/each}} 8348 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod js-typeahead"> 8349 <button type="button" @* href="/Default.aspx?ID=@productsPageId&Search=@searchParameter&GroupID={{groupId}}"*@ class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-viewAll" onclick="searchAllButton()"> 8350 @Translate("View all") 8351 </button> 8352 </li> 8353 {{/each}} 8354 </script> 8355 8356 <script id="SearchMoreProducts" type="text/x-template"> 8357 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8358 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8359 @Translate("View all") 8360 </a> 8361 </li> 8362 </script> 8363 8364 <script id="SearchMorePages" type="text/x-template"> 8365 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod"> 8366 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link"> 8367 @Translate("View all") 8368 </a> 8369 </li> 8370 </script> 8371 8372 <script id="SearchPagesTemplate" type="text/x-template"> 8373 {{#each .}} 8374 {{#ifCond template "!==" "SearchMore"}} 8375 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod"> 8376 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit"> 8377 <div class="u-margin-right"><i class="fa {{icon}} u-w20px u-ta-center"></i></div> 8378 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div> 8379 </a> 8380 </li> 8381 {{/ifCond}} 8382 {{#ifCond template "===" "SearchMore"}} 8383 {{>SearchMorePages}} 8384 {{/ifCond}} 8385 {{else}} 8386 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod"> 8387 @Translate("Your search gave 0 results") 8388 </li> 8389 {{/each}} 8390 </script> 8391 8392 <script id="SearchPagesTemplateWrap" type="text/x-template"> 8393 <div class="dropdown__column-header">@Translate("Pages")</div> 8394 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8395 {{>SearchPagesTemplate}} 8396 </ul> 8397 </script> 8398 8399 <script id="SearchProductsTemplateWrap" type="text/x-template"> 8400 <div class="dropdown__column-header">@Translate("Products")</div> 8401 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod"> 8402 {{>SearchProductsTemplate}} 8403 </ul> 8404 </script> 8405 8406 8407 <script> 8408 @if (!string.IsNullOrEmpty(currentFavoriteListId)) 8409 { 8410 <text> 8411 window.currentFavoriteListId = "@currentFavoriteListId"; 8412 </text> 8413 } 8414 function toggleFavAction(button, event) { 8415 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 8416 Scroll.SavePosition(event); 8417 @if (useFacebookPixel) 8418 { 8419 <text> 8420 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8421 </text> 8422 } 8423 location.href = button.getAttribute('data-add-link'); 8424 return; 8425 } 8426 let isAdd = button.getAttribute('data-is-in-list') == "false"; 8427 Request.Fetch().get( 8428 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 8429 function (result) { 8430 console.log({button}) 8431 button.querySelector('img').src = isAdd ? "/Files/Images/trash-icon-outline.svg" : "/Files/Images/favorite-list-svg.svg"; 8432 button.setAttribute('data-is-in-list', isAdd); 8433 button.setAttribute('title', (!isAdd ? '@Translate("Add to") ' : '@Translate("Remove from") ') + button.getAttribute('data-list-name')) 8434 let favList = button.closest('.js-favorites-list'); 8435 let favBtn = favList.querySelector('.js-favorite-btn img'); 8436 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 8437 if (isInAnyFavoriteList) { 8438 favBtn.src = "/Files/Images/favorite-list-Filled.svg"; 8439 } else { 8440 favBtn.src = "/Files/Images/favorite-list-svg.svg"; 8441 } 8442 document.getElementById(favList.getAttribute('data-close-overlay')).checked = false; 8443 @if (useFacebookPixel) 8444 { 8445 <text> 8446 if (isAdd) { 8447 fbq('track', 'AddToWishlist', JSON.parse(button.getAttribute('data-facebook-object'))); 8448 } 8449 </text> 8450 } 8451 if (window.currentFavoriteListId != null) { //if this page is favorite list 8452 let listId = button.getAttribute("data-list-id"); 8453 if (listId == window.currentFavoriteListId && !isAdd) { 8454 location.reload(); 8455 } 8456 } 8457 }, 8458 function () { 8459 console.error("FavoriteLists: Error in ToggleFavAction request"); 8460 }, 8461 false 8462 ); 8463 } 8464 </script> 8465 } 8466 8467 @using Dynamicweb.Rapido.Blocks.Components 8468 @using Dynamicweb.Rapido.Blocks.Components.General 8469 @using Dynamicweb.Rapido.Blocks 8470 @using System.IO 8471 8472 8473 @using Dynamicweb.Rapido.Blocks.Components.General 8474 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8475 8476 8477 @* Component *@ 8478 8479 @helper RenderVariantMatrix(VariantMatrix settings) { 8480 if (settings != null) 8481 { 8482 int productLoopCounter = 0; 8483 int groupCount = 0; 8484 List<VariantOption> firstDimension = new List<VariantOption>(); 8485 List<VariantOption> secondDimension = new List<VariantOption>(); 8486 List<VariantOption> thirdDimension = new List<VariantOption>(); 8487 8488 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 8489 { 8490 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 8491 { 8492 if (groupCount == 0) { 8493 firstDimension.Add(variantOptions); 8494 } 8495 if (groupCount == 1) 8496 { 8497 secondDimension.Add(variantOptions); 8498 } 8499 if (groupCount == 2) 8500 { 8501 thirdDimension.Add(variantOptions); 8502 } 8503 } 8504 groupCount++; 8505 } 8506 8507 int rowCount = 0; 8508 int columnCount = 0; 8509 8510 <script> 8511 var variantsCollection = []; 8512 </script> 8513 8514 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 8515 @if (groupCount == 1) 8516 { 8517 <tbody> 8518 @foreach (VariantOption firstVariantOption in firstDimension) 8519 { 8520 var variantId = firstVariantOption.Id; 8521 <tr> 8522 <td class="u-bold"> 8523 @firstVariantOption.Name 8524 </td> 8525 <td> 8526 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8527 </td> 8528 </tr> 8529 productLoopCounter++; 8530 } 8531 8532 <tr> 8533 <td>&nbsp;</td> 8534 <td> 8535 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8536 </td> 8537 </tr> 8538 </tbody> 8539 } 8540 @if (groupCount == 2) 8541 { 8542 <thead> 8543 <tr> 8544 <td>&nbsp;</td> 8545 @foreach (VariantOption variant in secondDimension) 8546 { 8547 <td>@variant.Name</td> 8548 } 8549 </tr> 8550 </thead> 8551 <tbody> 8552 @foreach (VariantOption firstVariantOption in firstDimension) 8553 { 8554 string variantId = ""; 8555 columnCount = 0; 8556 8557 <tr> 8558 <td class="u-min-w120px">@firstVariantOption.Name</td> 8559 8560 @foreach (VariantOption secondVariantOption in secondDimension) 8561 { 8562 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 8563 <td> 8564 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8565 </td> 8566 8567 columnCount++; 8568 8569 productLoopCounter++; 8570 } 8571 8572 <td> 8573 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8574 </td> 8575 </tr> 8576 8577 rowCount++; 8578 } 8579 8580 @{ 8581 columnCount = 0; 8582 } 8583 8584 <tr> 8585 <td>&nbsp;</td> 8586 @foreach (VariantOption secondVariantOption in secondDimension) 8587 { 8588 <td> 8589 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8590 </td> 8591 8592 columnCount++; 8593 } 8594 <td>&nbsp;</td> 8595 </tr> 8596 </tbody> 8597 } 8598 @if (groupCount == 3) 8599 { 8600 <thead> 8601 <tr> 8602 <td>&nbsp;</td> 8603 @foreach (VariantOption thirdVariantOption in thirdDimension) 8604 { 8605 <td>@thirdVariantOption.Name</td> 8606 } 8607 </tr> 8608 </thead> 8609 <tbody> 8610 @foreach (VariantOption firstVariantOption in firstDimension) 8611 { 8612 int colspan = (thirdDimension.Count + 1); 8613 8614 <tr> 8615 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 8616 </tr> 8617 8618 foreach (VariantOption secondVariantOption in secondDimension) 8619 { 8620 string variantId = ""; 8621 columnCount = 0; 8622 8623 <tr> 8624 <td class="u-min-w120px">@secondVariantOption.Name</td> 8625 8626 @foreach (VariantOption thirdVariantOption in thirdDimension) 8627 { 8628 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 8629 8630 <td> 8631 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 8632 </td> 8633 8634 columnCount++; 8635 productLoopCounter++; 8636 } 8637 8638 <td> 8639 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 8640 </td> 8641 </tr> 8642 rowCount++; 8643 } 8644 } 8645 8646 @{ 8647 columnCount = 0; 8648 } 8649 8650 <tr> 8651 <td>&nbsp;</td> 8652 @foreach (VariantOption thirdVariantOption in thirdDimension) 8653 { 8654 <td> 8655 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 8656 </td> 8657 8658 columnCount++; 8659 } 8660 <td>&nbsp;</td> 8661 </tr> 8662 </tbody> 8663 } 8664 </table> 8665 8666 <script> 8667 document.addEventListener("DOMContentLoaded", function (event) { 8668 MatrixUpdateQuantity("@settings.ProductId"); 8669 }); 8670 8671 MatrixUpdateQuantity = function (productId) { 8672 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 8673 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 8674 8675 var qtyRowArr = []; 8676 var qtyColumnArr = []; 8677 8678 var totalQty = 0; 8679 8680 for (var i = 0; i < allQtyFields.length; i++) { 8681 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 8682 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 8683 } 8684 8685 for (var i = 0; i < allQtyFields.length; i++) { 8686 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 8687 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 8688 totalQty += parseFloat(allQtyFields[i].value); 8689 } 8690 8691 //Update row counters 8692 for (var i = 0; i < qtyRowArr.length; i++) { 8693 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8694 8695 if (qtyRowArr[i] != undefined && qtyCounter != null) { 8696 var currentCount = qtyCounter.innerHTML; 8697 qtyCounter.innerHTML = qtyRowArr[i]; 8698 8699 if (currentCount != qtyCounter.innerHTML) { 8700 qtyCounter.classList.add("qty-field--active"); 8701 } 8702 } 8703 8704 } 8705 8706 //Update column counters 8707 for (var i = 0; i < qtyColumnArr.length; i++) { 8708 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8709 8710 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 8711 var currentCount = qtyCounter.innerHTML; 8712 qtyCounter.innerHTML = qtyColumnArr[i]; 8713 8714 if (currentCount != qtyCounter.innerHTML) { 8715 qtyCounter.classList.add("qty-field--active"); 8716 } 8717 } 8718 } 8719 8720 if (document.getElementById("TotalQtyCount_" + productId)) { 8721 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 8722 } 8723 8724 //Clean up animations 8725 setTimeout(function () { 8726 for (var i = 0; i < qtyRowArr.length; i++) { 8727 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 8728 if (qtyCounter != null) { 8729 qtyCounter.classList.remove("qty-field--active"); 8730 } 8731 } 8732 for (var i = 0; i < qtyColumnArr.length; i++) { 8733 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 8734 if (qtyCounter != null) { 8735 qtyCounter.classList.remove("qty-field--active"); 8736 } 8737 } 8738 }, 1000); 8739 } 8740 </script> 8741 } 8742 } 8743 8744 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 8745 { 8746 string loopCount = productLoopCounter.ToString(); 8747 8748 bool combinationFound = false; 8749 double stock = 0; 8750 double quantityValue = 0; 8751 string note = ""; 8752 8753 VariantProduct variantProduct = null; 8754 8755 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 8756 { 8757 stock = variantProduct.Stock; 8758 quantityValue = variantProduct.Quantity; 8759 combinationFound = true; 8760 } 8761 8762 if (combinationFound) 8763 { 8764 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 8765 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 8766 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 8767 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 8768 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 8769 8770 if (stock != 0) 8771 { 8772 <small>@Translate("Stock") @stock</small> 8773 } 8774 8775 <script> 8776 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 8777 variantsCollection.push(variants); 8778 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 8779 </script> 8780 } 8781 else 8782 { 8783 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 8784 } 8785 } 8786 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8787 8788 @* Component *@ 8789 8790 @helper RenderAddToCart(AddToCart settings) 8791 { 8792 //set Id for quantity selector to get it's value from button 8793 if (settings.QuantitySelector != null) 8794 { 8795 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 8796 { 8797 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 8798 } 8799 8800 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 8801 8802 if (settings.Disabled) 8803 { 8804 settings.QuantitySelector.Disabled = true; 8805 } 8806 8807 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 8808 { 8809 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 8810 } 8811 } 8812 8813 if (settings.Disabled) 8814 { 8815 settings.AddButton.Disabled = true; 8816 } 8817 8818 settings.AddButton.CssClass += " btn--condensed"; 8819 8820 //unitsSelector 8821 if (settings.UnitSelector != null) 8822 { 8823 if (settings.Disabled) 8824 { 8825 settings.QuantitySelector.Disabled = true; 8826 } 8827 } 8828 8829 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8830 @if (settings.UnitSelector != null) 8831 { 8832 @Render(settings.UnitSelector) 8833 } 8834 @if (settings.QuantitySelector != null) 8835 { 8836 @Render(settings.QuantitySelector) 8837 } 8838 @Render(settings.AddButton) 8839 </div> 8840 } 8841 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8842 8843 @* Component *@ 8844 8845 @helper RenderAddToCartButton(AddToCartButton settings) 8846 { 8847 if (!settings.HideTitle) 8848 { 8849 if (string.IsNullOrEmpty(settings.Title)) 8850 { 8851 if (settings.BuyForPoints) 8852 { 8853 settings.Title = Translate("Buy with points"); 8854 } 8855 else 8856 { 8857 settings.Title = Translate("Add to cart"); 8858 } 8859 } 8860 } 8861 else 8862 { 8863 settings.Title = ""; 8864 } 8865 8866 if (settings.Icon == null) 8867 { 8868 settings.Icon = new Icon(); 8869 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 8870 } 8871 8872 if (string.IsNullOrEmpty(settings.Icon.Name)) 8873 { 8874 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 8875 } 8876 8877 settings.OnClick = "Cart.AddToCart(event, { " + 8878 "id: '" + settings.ProductId + "'," + 8879 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 8880 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 8881 (settings.BuyForPoints ? "buyForPoints: true," : "") + 8882 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 8883 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 8884 "});" + settings.OnClick; 8885 8886 @RenderButton(settings) 8887 } 8888 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8889 8890 @* Component *@ 8891 8892 @helper RenderUnitSelector(UnitSelector settings) 8893 { 8894 if (string.IsNullOrEmpty(settings.Id)) 8895 { 8896 settings.Id = Guid.NewGuid().ToString("N"); 8897 } 8898 var disabledClass = settings.Disabled ? "disabled" : ""; 8899 8900 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 8901 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 8902 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 8903 <div class="dropdown__content dw-mod"> 8904 @settings.OptionsContent 8905 </div> 8906 <label class="dropdown-trigger-off" for="@settings.Id"></label> 8907 </div> 8908 } 8909 @using System.Reflection 8910 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8911 8912 @* Component *@ 8913 8914 @helper RenderQuantitySelector(QuantitySelector settings) 8915 { 8916 var attributes = new Dictionary<string, string>(); 8917 8918 /*base settings*/ 8919 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 8920 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 8921 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 8922 if (settings.Disabled) { attributes.Add("disabled", "true"); } 8923 if (settings.Required) { attributes.Add("required", "true"); } 8924 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 8925 /*end*/ 8926 8927 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 8928 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 8929 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 8930 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 8931 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 8932 if (settings.Min == null) { settings.Min = 1; } 8933 attributes.Add("min", settings.Min.ToString()); 8934 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 8935 if (settings.Value == null) { settings.Value = 1; } 8936 attributes.Add("value", settings.Value.ToString()); 8937 attributes.Add("type", "number"); 8938 8939 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8940 8941 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 8942 } 8943 @using Dynamicweb.Rapido.Blocks.Components 8944 8945 @using Dynamicweb.Frontend 8946 @using Dynamicweb.Frontend.Devices 8947 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 8948 @using Dynamicweb.Rapido.Blocks.Components.General 8949 @using System.Collections.Generic; 8950 8951 @* Component *@ 8952 8953 @helper RenderCustomerCenterList(CustomerCenterList settings) 8954 { 8955 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 8956 string hideActions = isTouchDevice ? "u-block" : ""; 8957 8958 <table class="table data-list dw-mod"> 8959 @if (settings.GetHeaders().Length > 0) { 8960 <thead> 8961 <tr class="u-bold"> 8962 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 8963 { 8964 var attributes = new Dictionary<string, string>(); 8965 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 8966 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 8967 attributes.Add("align", header.Align.ToString()); 8968 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8969 8970 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 8971 } 8972 </tr> 8973 </thead> 8974 } 8975 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 8976 { 8977 int columnCount = 0; 8978 int totalColumns = listItem.GetInfoItems().Length; 8979 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-acions" : ""; 8980 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 8981 8982 var attributes = new Dictionary<string, string>(); 8983 var width = Pageview.Device.ToString() != "Mobile" ? "150" : "100"; 8984 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 8985 8986 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 8987 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 8988 <tr> 8989 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 8990 <td onclick="@listItem.OnClick" class="data-list__main-item dw-mod" width="@width"> 8991 @if (!string.IsNullOrEmpty(listItem.Title)) { 8992 <div class="u-bold">@listItem.Title</div> 8993 } 8994 @if (!string.IsNullOrEmpty(listItem.Description)) { 8995 <div>@listItem.Description</div> 8996 } 8997 </td> 8998 } 8999 9000 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 9001 { 9002 var infoAttributes = new Dictionary<string, string>(); 9003 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 9004 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 9005 infoAttributes.Add("align", infoItem.Align.ToString()); 9006 9007 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 9008 string columnClick = columnCount < (totalColumns-2) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 9009 9010 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 9011 @if (!string.IsNullOrEmpty(infoItem.Title)) { 9012 <div>@infoItem.Title</div> 9013 } 9014 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 9015 <div><small>@infoItem.Subtitle</small></div> 9016 } 9017 </td> 9018 9019 columnCount++; 9020 } 9021 </tr> 9022 <tr> 9023 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 9024 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 9025 @foreach (ButtonBase action in listItem.GetActions()) 9026 { 9027 action.ButtonLayout = ButtonLayout.LinkClean; 9028 action.CssClass += " data-list__action-button link"; 9029 9030 @Render(action) 9031 } 9032 </div> 9033 </td> 9034 </tr> 9035 </tbody> 9036 } 9037 </table> 9038 } 9039 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9040 9041 @using System 9042 @using System.Web 9043 @using System.Collections.Generic 9044 @using Dynamicweb.Rapido.Blocks.Extensibility 9045 @using Dynamicweb.Rapido.Blocks 9046 9047 @{ 9048 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master"); 9049 9050 Block primaryBottomSnippets = new Block() 9051 { 9052 Id = "MasterJavascriptInitializers", 9053 SortId = 100, 9054 Template = RenderPrimaryBottomSnippets() 9055 }; 9056 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets); 9057 } 9058 9059 @helper RenderPrimaryBottomSnippets() 9060 { 9061 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode"); 9062 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID")); 9063 9064 if (isWireframeMode) 9065 { 9066 <script> 9067 Wireframe.Init(true); 9068 </script> 9069 } 9070 9071 9072 if (useGoogleTagManager) 9073 { 9074 <script> 9075 document.addEventListener('addToCart', function(event) { 9076 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9077 if (typeof googleImpression == "string") { 9078 googleImpression = JSON.parse(event.detail.productInfo.googleImpression); 9079 } 9080 dataLayer.push({ 9081 'event': 'addToCart', 9082 'ecommerce': { 9083 'currencyCode': googleImpression.currency, 9084 'add': { 9085 'products': [{ 9086 'name': googleImpression.name, 9087 'id': googleImpression.id, 9088 'price': googleImpression.price, 9089 'brand': googleImpression.brand, 9090 'category': googleImpression.category, 9091 'variant': googleImpression.variant, 9092 'quantity': event.detail.quantity 9093 }] 9094 } 9095 } 9096 }); 9097 }); 9098 </script> 9099 } 9100 9101 //if digitalwarehouse 9102 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart")) 9103 { 9104 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]); 9105 9106 if (string.IsNullOrEmpty(cartContextId)) 9107 { 9108 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2"); 9109 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps); 9110 cartContextId = cartSettings.OrderContextID; 9111 HttpContext.Current.Application["DownloadCartContext"] = cartContextId; 9112 } 9113 9114 <script> 9115 let downloadCart = new DownloadCart({ 9116 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"), 9117 contextId: "@cartContextId", 9118 addButtonText: "@Translate("Add")", 9119 removeButtonText: "@Translate("Remove")" 9120 }); 9121 </script> 9122 } 9123 9124 <!--$$Javascripts--> 9125 } 9126 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9127 @using System 9128 @using System.Web 9129 @using System.Collections.Generic 9130 @using Dynamicweb.Ecommerce.WebAPI.Controllers 9131 @using Dynamicweb.Ecommerce.Frontend 9132 @using Dynamicweb.Rapido.Blocks 9133 @using Degree.Kraemer.Rma.Infrastructure.Authentication 9134 9135 @functions{ 9136 9137 public string ReturnCustomFieldValue(string customFieldSystemName) 9138 { 9139 var userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID) != null ? Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentSecondaryUser.ID).CustomFieldValues : null; 9140 9141 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9142 { 9143 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9144 } 9145 else if (Model.CurrentUser != null && Model.CurrentUser.ID > 0) 9146 { 9147 userCustomFields = Dynamicweb.Security.UserManagement.User.GetUserByID(Model.CurrentUser.ID).CustomFieldValues; 9148 } 9149 var currentUserLocation = ""; 9150 9151 if (userCustomFields != null) 9152 { 9153 foreach (var field in userCustomFields) 9154 { 9155 if (field.CustomField.SystemName == customFieldSystemName) 9156 { 9157 currentUserLocation = field.Value.ToString(); 9158 } 9159 } 9160 } 9161 else 9162 { 9163 currentUserLocation = "test"; 9164 } 9165 9166 return currentUserLocation; 9167 } 9168 9169 public bool getPromptForAccount() 9170 { 9171 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser()?.CurrentSecondaryUser; 9172 var user = secondaryUser != null ? secondaryUser : Dynamicweb.Security.UserManagement.User.get_Current(Dynamicweb.Security.UserManagement.PagePermissionLevels.Frontend); 9173 // bool userIsMain = Model.CurrentSecondaryUser.ID == 0; 9174 var promptForAccount = user != null ? user.CustomFieldValues.First(f => f.CustomField.SystemName == "AccessUser_PromptForAccount").Value.ToString() == "True" : false; 9175 9176 return promptForAccount; 9177 } 9178 9179 } 9180 9181 @{ 9182 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master"); 9183 } 9184 9185 @{ 9186 Block SideNavigation = new Block() 9187 { 9188 Id = "SideNavigation", 9189 SortId = 5, 9190 Template = RenderSideNavigation(), 9191 SkipRenderBlocksList = true 9192 }; 9193 Block userLocationModal = new Block() 9194 { 9195 Id = "UserLocationsModal", 9196 SortId = 10, 9197 Template = RenderUserLocations(), 9198 SkipRenderBlocksList = true 9199 }; 9200 masterCustomBlocksPage.Add(userLocationModal); 9201 9202 Block newRMAModal = new Block() 9203 { 9204 Id = "newRmaModal", 9205 SortId = 109, 9206 Template = RenderNewRmaForm(), 9207 SkipRenderBlocksList = true 9208 }; 9209 9210 masterCustomBlocksPage.Add(newRMAModal); 9211 Block viewRMADetails = new Block() 9212 { 9213 Id = "newRmaModal", 9214 SortId = 108, 9215 Template = RenderNewRmaViewDetails(), 9216 SkipRenderBlocksList = true 9217 }; 9218 9219 masterCustomBlocksPage.Add(viewRMADetails); 9220 Block viewRMAFullOrderDetails = new Block() 9221 { 9222 Id = "newRmaModalFullOrder", 9223 SortId = 107, 9224 Template = RenderNewRmaViewFullOrderDetails(), 9225 SkipRenderBlocksList = true 9226 }; 9227 9228 masterCustomBlocksPage.Add(viewRMAFullOrderDetails); 9229 Block RmaViewDetailsEditableBlock = new Block() 9230 { 9231 Id = "DraftRmaModal", 9232 SortId = 105, 9233 Template = RenderNewRmaViewDetailsEditable(), 9234 SkipRenderBlocksList = true 9235 }; 9236 9237 masterCustomBlocksPage.Add(RmaViewDetailsEditableBlock); 9238 Block viewOrderDetails = new Block() 9239 { 9240 Id = "newOrderHistoryDetailsModal", 9241 SortId = 106, 9242 Template = RenderNewOrderHistoryViewDetails(), 9243 SkipRenderBlocksList = true 9244 }; 9245 9246 masterCustomBlocksPage.Add(viewOrderDetails); 9247 Block newCartModal = new Block() 9248 { 9249 Id = "NewCartModal", 9250 SortId = 20, 9251 Template = RenderNewCartModal(), 9252 SkipRenderBlocksList = true 9253 }; 9254 masterCustomBlocksPage.Add(newCartModal); 9255 9256 Block newCartNameModal = new Block() 9257 { 9258 Id = "CartNameModal", 9259 SortId = 50, 9260 Template = RenderNewCartNameModal(), 9261 SkipRenderBlocksList = true 9262 }; 9263 masterCustomBlocksPage.Add(newCartNameModal); 9264 9265 if (Model.HasSecondaryUsers) 9266 { 9267 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0) 9268 { 9269 Block impersonationListModal = new Block() 9270 { 9271 Id = "ImpersonationListModal", 9272 SortId = 30, 9273 Template = RenderImpersonationModal(), 9274 SkipRenderBlocksList = true 9275 }; 9276 9277 masterCustomBlocksPage.Add(impersonationListModal); 9278 } 9279 else 9280 { 9281 Block impersonationListModal = new Block() 9282 { 9283 Id = "ImpersonationListModal", 9284 SortId = 30, 9285 Template = RenderImpersonationModal(), 9286 SkipRenderBlocksList = true 9287 }; 9288 9289 masterCustomBlocksPage.Add(impersonationListModal); 9290 } 9291 9292 Block impersonationTemplate = new Block() 9293 { 9294 Id = "ImpersonationTemplate", 9295 SortId = 40, 9296 Template = RenderImpersonationListSelect() 9297 }; 9298 masterCustomBlocksPage.Add("MasterHeader", impersonationTemplate); 9299 } 9300 Block quickViewModal = new Block() 9301 { 9302 Id = "QuickViewModal", 9303 SortId = 60, 9304 Template = RenderQuickViewModal(), 9305 SkipRenderBlocksList = true 9306 }; 9307 9308 masterCustomBlocksPage.Add(quickViewModal); 9309 // masterCustomBlocksPage.Add(MasterBlockId.MasterMain, UserLocationModal); 9310 9311 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block 9312 { 9313 Id = "CartListScript", 9314 Template = RenderCartsListSelect() 9315 }); 9316 9317 if (Model.CurrentUser.ID > 0) 9318 { 9319 Modal stopImpersonation = new Modal 9320 { 9321 Id = "StopImpersonation", 9322 Heading = new Heading 9323 { 9324 Level = 2, 9325 Title = Translate("Sign out"), 9326 Icon = new Icon 9327 { 9328 Name = "fa-sign-out", 9329 Prefix = "fas", 9330 LabelPosition = IconLabelPosition.After 9331 } 9332 }, 9333 Width = ModalWidth.Md, 9334 BodyTemplate = RenderStopImpersonationForm() 9335 }; 9336 9337 Block stopCustomImpersonation = new Block 9338 { 9339 Id = "StopImpersonationBlock", 9340 SortId = 10, 9341 Component = stopImpersonation 9342 }; 9343 masterCustomBlocksPage.RemoveBlockById("StopImpersonationBlock"); 9344 masterCustomBlocksPage.Add(stopCustomImpersonation); 9345 } 9346 Block emptyCartModal = new Block() 9347 { 9348 Id = "EmptyCartModal", 9349 SortId = 80, 9350 Template = RenderEmptyCartModal(), 9351 SkipRenderBlocksList = true 9352 }; 9353 9354 masterCustomBlocksPage.Add(emptyCartModal); 9355 9356 Block stepQuantityErrorModal = new Block() 9357 { 9358 Id = "StepQuantityErrorModal", 9359 SortId = 90, 9360 Template = RenderStepQuantityErrorModal() 9361 }; 9362 9363 masterCustomBlocksPage.Add(stepQuantityErrorModal); 9364 9365 } 9366 @{ 9367 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9368 9369 } 9370 9371 @helper RenderSideNavigation() 9372 {<p>test</p>} 9373 9374 @helper RenderUserLocations() 9375 { 9376 var currentUserLocation = ReturnCustomFieldValue("AccessUser_LocationCode"); 9377 bool userExists = Model.CurrentUser.ID != null && Model.CurrentUser.ID > 0; 9378 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9379 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9380 Modal getLocations = new Modal 9381 { 9382 Id = "UserLocationModal", 9383 Heading = new Heading 9384 { 9385 Level = 2, 9386 Title = Translate("Select a location") 9387 }, 9388 Width = ModalWidth.Md, 9389 BodyTemplate = RenderUserLocationsContentModal() 9390 }; 9391 if (userExists && !string.IsNullOrEmpty(customerNumber)) 9392 { 9393 <div data-location="@currentUserLocation" data-location-list="@locationList"></div> 9394 9395 if (currentUserLocation == "") 9396 { 9397 <div> @Render(getLocations) </div> 9398 } 9399 } 9400 } 9401 9402 @helper RenderUserLocationsContentModal() 9403 { 9404 <div> 9405 @RenderLocationsSelect() 9406 @Render(new Button 9407 { 9408 Title = Translate("Set location"), 9409 ButtonType = ButtonType.Button, 9410 ButtonLayout = ButtonLayout.Primary, 9411 CssClass = "u-no-margin", 9412 OnClick = "addLocation(document.querySelector('#UserLocationModalModal #LocationsSelect'))" 9413 }) 9414 </div> 9415 } 9416 9417 @helper RenderLocationsSelect() 9418 { 9419 var locationList = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("User_Locations"); 9420 List<string> locations = locationList.ToString().Split(',').ToList(); 9421 SelectField selectField = new SelectField 9422 { 9423 Id = "LocationsSelect", 9424 Label = Translate("Select a location"), 9425 CssClass = "u-margin-bottom", 9426 Required = true 9427 }; 9428 9429 foreach (var loc in locations) 9430 { 9431 string label; 9432 string code; 9433 string askoCode; 9434 string[] parts = loc.Split('|'); 9435 if (parts.Length >= 3) 9436 { 9437 label = parts[0].Trim(); 9438 code = parts[1].Trim(); 9439 askoCode = parts[2].Trim(); 9440 } 9441 else 9442 { 9443 label = parts[0].Trim(); 9444 code = parts[1].Trim(); 9445 } 9446 selectField.Options.Add(new SelectFieldOption { Label = label, Value = code }); 9447 } 9448 @Render(selectField) 9449 } 9450 9451 @helper RenderNewCartModal() 9452 { 9453 var newCartModal = new Modal 9454 { 9455 Id = "NewCart", 9456 Heading = new Heading { Title = Translate("Create New Cart") }, 9457 Width = ModalWidth.Md, 9458 BodyTemplate = RenderNewCartContentModal() 9459 }; 9460 9461 <div>@Render(newCartModal) </div> 9462 } 9463 9464 @helper RenderNewCartContentModal() 9465 { 9466 var baseurl = HttpContext.Current.Request.Url.ToString(); 9467 string currentUserId = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUserId().ToString(); 9468 var newCartURL = baseurl.Contains("?") ? baseurl + "&redirect=false&cartcmd=createnew&CartUserId=" + currentUserId + "&CartName=" : baseurl + "?cartcmd=createnew&redirect=false&CartUserId=" + currentUserId + "&CartName="; 9469 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9470 var cartsListFeedPageId = "/Default.aspx?ID=" + GetPageIdByNavigationTag("CartsListFeed"); 9471 9472 <div> 9473 <form method="post" id="NewCartForm" data-submit-url="@newCartURL" data-carts-url="@cartsListFeedPageId" data-change-cart-url="@setCartURL"> 9474 @Render(new HiddenField { Id = "CartUserId", Name = "CartUserId", Value = currentUserId }) 9475 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "createnew" }) 9476 @Render(new TextField { Id = "CartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Cart Name"), Required = true }) 9477 @*@Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Create") })*@ 9478 <button type="button" id="CreateNewCartButton" class="btn btn--primary dw-mod">@Translate("Create")</button> 9479 </form> 9480 </div> 9481 } 9482 9483 @helper RenderNewCartNameModal() 9484 { 9485 var newCartNameModal = new Modal 9486 { 9487 Id = "NewCartName", 9488 Heading = new Heading { Title = Translate("ChangeCartName") }, 9489 Width = ModalWidth.Md, 9490 BodyTemplate = RenderNewCartNameContentModal() 9491 }; 9492 9493 <div>@Render(newCartNameModal) </div> 9494 } 9495 9496 @helper RenderNewCartNameContentModal() 9497 { 9498 <form method="post"> 9499 @Render(new HiddenField { Id = "CartID", Name = "CartID", Value = "" }) 9500 @Render(new HiddenField { Id = "CartCmd", Name = "CartCmd", Value = "setname" }) 9501 @Render(new TextField { Id = "NewCartName", Name = "CartName", Type = TextFieldType.Text, Label = Translate("Enter New Name"), Required = true }) 9502 @Render(new Button { ButtonType = ButtonType.Submit, Title = Translate("Endre navn") }) 9503 </form> 9504 } 9505 9506 @helper RenderImpersonationModal() 9507 { 9508 bool userExists = Model.CurrentUser.ID != null && Model.CurrentUser.ID > 0; 9509 var promptForAccount = getPromptForAccount(); 9510 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9511 string headerMessage = isImpersonating ? Translate("Change account") : Translate("Secondary Users"); 9512 Modal secondaryUsers = new Modal 9513 { 9514 9515 Id = "SecondarUsersModal", 9516 Heading = new Heading 9517 { 9518 Level = 2, 9519 Title = headerMessage 9520 }, 9521 9522 Width = ModalWidth.Md, 9523 BodyTemplate = RenderImpersonationContentModal() 9524 }; 9525 <div data-prompt-account="@promptForAccount">@Render(secondaryUsers)</div> 9526 } 9527 9528 @helper RenderImpersonationContentModal() 9529 { 9530 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9531 bool isImpersonating = Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0; 9532 string buttonTitle = isImpersonating ? Translate("Choose user") : Translate("Set user"); 9533 9534 <div class="u-margin-right u-margin-bottom">@Translate("Choose user to impersonate:")</div> 9535 <div class="impersonation-container"> 9536 <input type="checkbox" id="ImpersonationSelect_modal" class="dropdown-trigger" /> 9537 <div class="dropdown variants-filters dw-mod"> 9538 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_modal">@Translate("Choose user")</label> 9539 <div class="dropdown__content u-padding dw-mod"> 9540 <div class="dropdown__item__filter"> 9541 <input type="text" data-container-id="impersonationListModal" data-view-type="modal" placeholder="@Translate("Search")"> 9542 </div> 9543 <div class="js-handlebars-root dw-mod u-margin-bottom" id="impersonationListModal" data-template="ImpersonationListContent" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9544 </div> 9545 <label class="dropdown-trigger-off" for="ImpersonationSelect_modal"></label> 9546 </div> 9547 </div> 9548 @Render(new Button 9549 { 9550 Title = buttonTitle, 9551 ButtonType = ButtonType.Button, 9552 ButtonLayout = ButtonLayout.Primary, 9553 CssClass = "u-no-margin u-margin-top", 9554 ExtraAttributes = new Dictionary<string, string> 9555 { 9556 { "data-role", "impersonate-submit" } 9557 } 9558 // OnClick = "sessionStorage.setItem('impersonationModalOpen', 'true'); sessionStorage.setItem('recentlyLoggedIn', 'true'); localStorage.removeItem('userLocation'); document.getElementById(document.querySelector('#SecondarUsersModalModal .dropdown__header').getAttribute('data-value')).submit();" 9559 }) 9560 } 9561 9562 @helper RenderImpersonationListSelect() 9563 { 9564 bool promtForAccount = getPromptForAccount(); 9565 9566 if (promtForAccount) 9567 { 9568 <script id="ImpersonationListContent" data-test="1" type="text/x-template"> 9569 9570 {{#.}} 9571 {{#Users}} 9572 {{#if main}} 9573 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9574 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9575 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9576 </form> 9577 {{else}} 9578 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9579 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9580 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9581 </form> 9582 {{/if}} 9583 {{/Users}} 9584 {{/.}} 9585 </script> 9586 } 9587 else 9588 { 9589 <script id="ImpersonationListContent" data-test="2" type="text/x-template"> 9590 9591 {{#.}} 9592 {{#ifCond totalUsers "!==" "2"}} 9593 9594 {{#Users}} 9595 {{#if main}} 9596 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'false');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9597 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9598 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9599 </form> 9600 {{else}} 9601 9602 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'false');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span> <span>{{formatCustomerNumber customerNumber}}<span></div> 9603 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9604 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9605 </form> 9606 {{/if}} 9607 {{/Users}} 9608 9609 {{/ifCond}} 9610 {{/.}} 9611 </script> 9612 } 9613 9614 <script id="ImpersonationListContentHeader" type="text/x-template"> 9615 {{#.}} 9616 {{#Users}} 9617 {{#if main}} 9618 {{#if secondaryUser}} 9619 {{#unless hideSelf}} 9620 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9621 {{/unless}} 9622 {{else}} 9623 {{#unless hideSelf}} 9624 {{#ifCond ../totalUsers "!==" 2}} 9625 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'true');logOutCurrentUser()" tabindex="0">{{name}}</div> 9626 {{else}} 9627 <div class="dropdown__item primary-user dw-mod log-out-current-user" testHeader onclick="sessionStorage.setItem('impersonationModalOpen', 'false');logOutCurrentUser()" tabindex="0">{{name}}</div> 9628 {{/ifCond}} 9629 {{/unless}} 9630 {{/if}} 9631 9632 {{else}} 9633 <div class="dropdown__item dw-mod d-flex justify-content-between {{#if hideSelf}}u-hidden{{/if}}" onclick="sessionStorage.setItem('recentlyLoggedIn', 'true');localStorage.removeItem('userLocation');sessionStorage.setItem('impersonationModalOpen', 'true');onImpersonationSubmit({{id}});document.getElementById('account{{id}}').submit()" data-value="account{{id}}" id="{{formatCustomerNumber customerNumber}}" data-customer-company="{{company}}" data-user-id="{{id}}" data-customer-token="{{customerToken}}" tabindex="0"><span>{{name}}</span><span>{{formatCustomerNumber customerNumber}}<span></div> 9634 <form method="post" class="u-hidden" name="account{{id}}" id="account{{id}}"> 9635 <input type="hidden" id="DWExtranetSecondaryUserSelector" value="{{id}}" name="DWExtranetSecondaryUserSelector"> 9636 </form> 9637 {{/if}} 9638 {{/Users}} 9639 9640 {{/.}} 9641 </script> 9642 } 9643 9644 @helper RenderQuickViewModal() 9645 { 9646 <div class="quick-view-modal"> 9647 @Render(new Modal 9648 { 9649 Id = "ProductDetailQuickView", 9650 Heading = new Heading 9651 { 9652 Level = 3, 9653 Title = "", 9654 CssClass = "bs-margin-bottom-0 bs-border-none" 9655 }, 9656 Width = ModalWidth.Full, 9657 Height = ModalHeight.Full, 9658 BodyText = "" 9659 }) 9660 </div> 9661 } 9662 9663 @helper RenderCartsListSelect() 9664 { 9665 var baseurl = HttpContext.Current.Request.Url.ToString(); 9666 var setCartURL = baseurl.Contains("?") ? baseurl + "&cartcmd=setcart&CartID=" : baseurl + "?cartcmd=setcart&CartID="; 9667 9668 <script id="CartsListContent" type="text/x-template"> 9669 {{#.}} 9670 <select id="CartsSelect" class="u-full-width u-margin-bottom" data-url="@setCartURL"> 9671 @*<option>@Translate("Change Cart")</option>*@ 9672 {{#Carts}} 9673 <option value="{{id}}" data-active="{{isCartActive}}" {{selected}}>{{name}}</option> 9674 {{/Carts}} 9675 </select> 9676 {{/.}} 9677 </script> 9678 } 9679 9680 @helper RenderEmptyCartModal() 9681 { 9682 @Render(new Modal 9683 { 9684 Id = "EmptyCartModal", 9685 Heading = new Heading 9686 { 9687 Level = 3, 9688 Title = Translate("cartEmptyDisclaimer"), 9689 CssClass = "u-margin-bottom" 9690 }, 9691 Width = ModalWidth.Md, 9692 BodyTemplate = RenderEmptyCartModalBody() 9693 }) 9694 } 9695 9696 @helper RenderEmptyCartModalBody() 9697 { 9698 <div class="u-flex grid--justify-space-between"> 9699 <button type="button" title="@Translate("Yes")" class="btn empty-cart btn--primary dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event); document.getElementById('EmptyCartModalModalTrigger').checked = false; sessionStorage.setItem('minicartState', 'closed'); getContentFirstCart();">@Translate("Yes")</button> 9700 <button type="button" title="@Translate("No")" class="btn empty-cart btn--secondary dw-mod u-no-margin u-margin-bottom" onclick="document.getElementById('EmptyCartModalModalTrigger').checked = false;">@Translate("No")</button> 9701 </div> 9702 } 9703 9704 @helper RenderStepQuantityErrorModal() 9705 { 9706 Modal stepQuantityError = new Modal 9707 { 9708 Id = "StepQuantityError", 9709 Heading = new Heading { Title = Translate("Quantity error") }, 9710 Width = ModalWidth.Md, 9711 BodyTemplate = RenderErrorModalContent() 9712 }; 9713 9714 <div>@Render(stepQuantityError)</div> 9715 } 9716 9717 @helper RenderErrorModalContent() 9718 { 9719 <div class="u-padding"> 9720 <h5 class="u-margin-bottom"> 9721 <span class="product-name"></span> 9722 </h5> 9723 <h5 class="quantity-change-error-text-multiple"> 9724 @Translate("add multi quantity") 9725 <span class="product-quantity"></span> 9726 </h5> 9727 <h5 class="quantity-change-error-text-zero u-hidden"> 9728 @Translate("Please insert the minimum quantity") 9729 <span class="product-quantity"></span> 9730 </h5> 9731 </div> 9732 } 9733 9734 @helper RenderNewRmaViewDetails() 9735 { 9736 Modal rmaViewDetails = new Modal 9737 { 9738 Id = "rmaViewDetails", 9739 Heading = new Heading { Title = Translate("AVVIK") }, 9740 BodyTemplate = RmaViewDetails() 9741 }; 9742 <div data-ref="rmaViewDetails">@Render(rmaViewDetails)</div> 9743 } 9744 @helper RenderNewOrderHistoryViewDetails() 9745 { 9746 Modal orderHistoryDetails = new Modal 9747 { 9748 Id = "rmaViewDetails2", 9749 Heading = new Heading { Title = Translate("ORDREBEKREFTELSE") }, 9750 BodyTemplate = ViewOrderDetails2() 9751 }; 9752 <div data-ref="orderHistoryDetails">@Render(orderHistoryDetails)</div> 9753 } 9754 @helper RenderNewRmaForm() 9755 { 9756 Modal newRmaForm = new Modal 9757 { 9758 Id = "rmaForm", 9759 Heading = new Heading { Title = Translate("AVVIK") }, 9760 BodyTemplate = RmaFormContent() 9761 }; 9762 <div data-ref="newRMA">@Render(newRmaForm)</div> 9763 } 9764 9765 @helper RenderNewRmaViewFullOrderDetails() 9766 { 9767 Modal rmaViewDetailsFullOrder = new Modal 9768 { 9769 Id = "rmaViewDetailsFullOrder", 9770 Heading = new Heading { Title = Translate("AVVIK") }, 9771 BodyTemplate = RmaViewDetailsFullOrder() 9772 }; 9773 <div>@Render(rmaViewDetailsFullOrder)</div> 9774 } 9775 9776 @helper RenderNewRmaViewDetailsEditable() 9777 { 9778 Modal rmaViewDetailsEditable = new Modal 9779 { 9780 Id = "rmaViewDetailsEditable", 9781 Heading = new Heading { Title = Translate("AVVIK") }, 9782 BodyTemplate = RmaViewDetailsEditable() 9783 }; 9784 <div>@Render(rmaViewDetailsEditable)</div> 9785 } 9786 9787 @helper RmaFormContent() 9788 { 9789 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 9790 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 9791 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 9792 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 9793 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 9794 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 9795 var company = Model.CurrentUser.Company; 9796 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 9797 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 9798 @*<h1>@userID</h1> 9799 <h1>@token</h1>*@ 9800 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 9801 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 9802 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 9803 <div class="u-hidden" id="CurrentUserCompany" data-customer-company="@isCompanyKraemer"></div> 9804 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 9805 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 9806 9807 <div class="rma-modal__container"> 9808 9809 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-container" data-template="rma-form-hidden-inputs" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 9810 9811 <header class="bs-d-flex bs-flex-column bs-flex-xl-row bs-flex-wrap bs-gap-3 bs-gap-lg-5 rma-modal__header"> 9812 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 9813 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 9814 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 9815 @*<h1 class="mb-0">@Model.SecondaryUsers.Count</h1>*@ 9816 <div class="bs-d-flex bs-flex-column bs-flex-md-row bs-gap-3"> 9817 @if (Model.HasSecondaryUsers) 9818 { 9819 <div class="modal__select-rma impersonation-container-filter-rma create-rma-modal"> 9820 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 9821 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9822 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose user")</label> 9823 <div class="dropdown__content u-padding dw-mod"> 9824 <div class="dropdown__item__filter"> 9825 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9826 </div> 9827 <div class=" js-handlebars-root dw-mod" id="impersonationListFilterCreateRmaModal" data-template="ImpersonationListContentFilterCreateRmaModal" data-json-feed="/Default.aspx?ID=@impersonationListFeedPageId" data-init-onload="false"></div> 9828 </div> 9829 </div> 9830 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 9831 </div> 9832 } 9833 9834 <div class="modal__select-rma"> 9835 <div class="order-container-filter create-rma-modal"> 9836 <input type="checkbox" id="OrderSelect" class="dropdown-trigger" /> 9837 <div class="dropdown variants-filters bs-w-100 dw-mod"> 9838 <label class="dropdown__header dropdown__btn dw-mod" for="OrderSelect" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@Translate("Choose an order")</label> 9839 <div class="dropdown__content u-padding dw-mod"> 9840 <div class="dropdown__item__filter"> 9841 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 9842 </div> 9843 <div class=" js-handlebars-root dw-mod" id="RMA-Order-Select-container" data-template="RMA-Order-Select" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"> 9844 </div> 9845 </div> 9846 <label class="dropdown-trigger-off" for="OrderSelect"></label> 9847 </div> 9848 </div> 9849 </div> 9850 </div> 9851 </header> 9852 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9853 <div class="bs-d-flex"> 9854 <div class="toast-body"> 9855 @Translate("Please fill all required fields") 9856 </div> 9857 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9858 </div> 9859 </div> 9860 <div class="rma-modal__selected-order orderline-form"> 9861 9862 @* Switch between full order rma and orderline RMA *@ 9863 <div class="rma-modal-container bs-px-3 form-orderline"> 9864 <div class="modal-container__content u-hidden"> 9865 <div class="bs-grid rma-modal-container bs-mt-5"> 9866 <div class="g-col-md-1 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9867 <div class="g-col-md-5 g-col-12 d-flex u-flex--row bs-align-items-center bs-justify-content-center bs-position-relative"> 9868 <input type="text" id="SearchOrderlinesInput" name="search-rma" placeholder="@Translate("Søk etter produkt...")" class="mb-0 form-control search-ahead__input"> 9869 <button type="button" id="SearchOrderlinesButton" class="search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9870 <i class="far fa-search bs-px-2"></i> 9871 </button> 9872 <button type="button" id="RemoveSearchOrderlinesButton" class=" u-hidden search-icon-desktop js-typeahead-enter-btn" title="Søk"> 9873 <i class="far fa-times bs-px-2"></i> 9874 </button> 9875 </div> 9876 <div class="g-col-md-3 g-col-12 bs-d-none bs-d-md-flex d-flex u-flex--row align-items-center justify-content-center"></div> 9877 <div class="g-col-md-3 g-col-12 bs-d-grid"> 9878 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-w-100 bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1" style="justify-self:end;">@Translate("Hel order")</button> 9879 </div> 9880 </div> 9881 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 9882 <div class="u-border-bottom rma-page__header-grid-container rma-header"> 9883 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 9884 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 9885 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksårsak")</div> 9886 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert")</div> 9887 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Avviksantall")</div> 9888 @* <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row bs-align-items-center bs-justify-content-center">@Translate("Levert Antall")</div>*@ 9889 </div> 9890 </div> 9891 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9892 <div class="bs-d-flex"> 9893 <div class="toast-body"> 9894 @Translate("Please fill all required fields") 9895 </div> 9896 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9897 </div> 9898 </div> 9899 </div> 9900 @* products loop *@ 9901 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-orderlines-container" data-template="rma-form-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 9902 </div> 9903 </div> 9904 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 9905 <div class="rma-modal-container"> 9906 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 9907 <div class="bs-d-flex"> 9908 <div class="toast-body"> 9909 @Translate("Please fill all required fields") 9910 </div> 9911 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 9912 </div> 9913 </div> 9914 <div class="d-flex bs-flex-wrap bs-gap-3 bs-flex-row bs-justify-content-between bs-mt-5 bs-mb-2 rma-options-container"> 9915 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 9916 <option value="0">@Translate("Avviksårsak")</option> 9917 <option value="1">@Translate("Faktura")</option> 9918 <option value="3">@Translate("Kvalitet")</option> 9919 <option value="2">@Translate("Pakking")</option> 9920 <option value="4">@Translate("Vedlikehold")</option> 9921 <option value="5">@Translate("Feil Levert")</option> 9922 <option value="6">@Translate("Multiple")</option> 9923 </select> 9924 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 9925 </div> 9926 <div class="inputComment bs-w-100 bs-mt-5"> 9927 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 9928 @* 9929 <label for="FullOrderComment">@Translate("Avvikskommentar")</label> 9930 *@ 9931 </div> 9932 <div class="inputComment bs-w-100 bs-mt-3"> 9933 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 9934 </div> 9935 <input class="create-rma-form-input form-control create-rma-Attachment-input bs-mt-3" id="CreateRmaFormAttachmentFull" name="FullOrderAttachment" type="file" multiple="multiple" /> 9936 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 9937 </div> 9938 <div class="bs-mt-5 bs-w-50 bs-mb-5"> 9939 <div class="orderInfo d-flex bs-justify-content-between"> 9940 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Antall produktlinjer")</p> 9941 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-orderlines">7</p> 9942 </div> 9943 <div class="orderInfo d-flex bs-justify-content-between"> 9944 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Totalt antall produkter")</p> 9945 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-quantity">289</p> 9946 </div> 9947 <div class="orderInfo d-flex bs-justify-content-between"> 9948 <p class="bs-mb-2 bs-fs-5 bs-fw-bold">@Translate("Ordretotal eks. MVA")</p> 9949 <p class="bs-fs-5 bs-mb-0" id="rma-form-total-amount">35 897,18 kr </p> 9950 </div> 9951 </div> 9952 </div> 9953 </div> 9954 9955 <footer class="modal__rma-footer"> 9956 <div class="footer-button-container"> 9957 <button class="submit-rma-button disabled submit-rma-button bs-btn bs-btn-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,true)">@Translate("Opprett Avvik")</button> 9958 </div> 9959 <div class="modal__rma-footer-icon-buttons"> 9960 </div> 9961 </footer> 9962 </div> 9963 <script id="ImpersonationListContentFilterCreateRmaModal" type="text/x-template"> 9964 {{#.}} 9965 {{#Users}} 9966 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 9967 {{/Users}} 9968 {{/.}} 9969 </script> 9970 9971 <script id="rma-form-hidden-inputs" type="text/x-template"> 9972 {{#.}} 9973 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 9974 <input name="deviationId" value="0" type="text" class="u-hidden" /> 9975 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 9976 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 9977 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 9978 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 9979 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 9980 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 9981 {{/.}} 9982 </script> 9983 9984 <script id="rma-form-orderlines" type="text/x-template"> 9985 {{#.}} 9986 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" data-product-name="{{orderLineProductName}}" data-product-number="{{orderLineProductNumber}}" style="border-color: #597CCA;"> 9987 <input type="hidden" name="productId" value="{{orderLineProductId}}" /> 9988 <input name="deviationId" value="{{orderId}}" type="text" class="u-hidden" /> 9989 <input name="deviationOrderLineId" value="{{orderId}}" type="text" class="u-hidden" /> 9990 <input name="deviationLineId" value="0" type="text" class="u-hidden" /> 9991 9992 <input type="hidden" name="productNumber" value="{{orderLineProductNumber}}" /> 9993 <input type="hidden" name="productName" value="{{orderLineProductName}}" /> 9994 <input type="hidden" name="productImage" value="{{#if orderLineProductImage}}{{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 9995 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 9996 <input type="hidden" name="supplierName" value="{{orderLineSupplierName}}" /> 9997 <div class="rma-form-grid-item rma-table-item"> 9998 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 9999 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10000 </div> 10001 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row bs-align-items-center"> 10002 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10003 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="rma-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 10004 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}" data-test="44444">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 10005 </div> 10006 </div> 10007 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10008 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10009 <option value="0">@Translate("Avviksårsak")</option> 10010 <option value="1">@Translate("Faktura")</option> 10011 <option value="3">@Translate("Kvalitet")</option> 10012 <option value="2">@Translate("Pakking")</option> 10013 <option value="4">@Translate("Vedlikehold")</option> 10014 <option value="5">@Translate("Feil Levert")</option> 10015 <option value="6">@Translate("Multiple")</option> 10016 </select> 10017 </div> 10018 10019 <div class=" rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 10020 <input type="hidden" name="deliveredQuantity" value="{{orderLineQuantity}}" /> 10021 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{orderLineUnitPrice}}" /> 10022 <input type="hidden" name="Total-Test-orderLineUnitPrice" value="{{orderLineTotalPrice}}" /> 10023 10024 <div class="fw-700 rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10025 <input class="create-rma-form-input create-rma-quantity-input disabled" data-delivered-quantity="{{orderLineQuantity}}" @*value="{{orderLineQuantity}}"*@ value="0" name="deviationQuantity" type="number" min="0" step="1" oninput="showAdditionalOrderlineFields(this, this.value)" max="{{orderLineQuantity}}" /> 10026 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 u-hidden removeOrderlineButton" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10027 <i class="far fa-times bs-text-danger bs-px-2"></i> 10028 </button> 10029 </div> 10030 </div> 10031 <div class="grid u-hidden additional-rma-orderline-fields additional-fields-rma"> 10032 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10033 </div> 10034 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10035 <input type="text" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10036 </div> 10037 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10038 <input class="create-rma-form-input create-rma-expected-result" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10039 </div> 10040 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10041 <input class="create-rma-form-input form-control create-rma-Attachment-input" id="CreateRmaFormAttachment_{{orderLineProductId}}" name="attachment" type="file" /> 10042 <div class="u-hidden emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10043 </div> 10044 </div> 10045 </form> 10046 {{/.}} 10047 </script> 10048 10049 <script id="RMA-Order-Select" type="text/x-template"> 10050 10051 {{#.}} 10052 {{#ifCond orderId "!==" "No"}} 10053 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10054 {{/ifCond}} 10055 {{/.}} 10056 </script> 10057 10058 } 10059 @helper DelayTranslations(string word) 10060 { 10061 <p>@Translate(word)</p> 10062 } 10063 @helper RmaViewDetailsEditable() 10064 { 10065 string impersonationListFeedPageId = GetPageIdByNavigationTag("UsersFeed").ToString(); 10066 string deviationPageId = GetPageIdByNavigationTag("DeviationsHistoryPage").ToString(); 10067 string deviationPageUrl = "/Default.aspx?ID=" + deviationPageId; 10068 int userID = Model.CurrentUser.ID > 0 ? Model.CurrentUser.ID : 0; 10069 // var token = userID != 0 ? Auth.GetToken(userID) : "0"; 10070 var token = ReturnCustomFieldValue("AccessUser_UserToken"); 10071 string favoriteUserToken = ""; 10072 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10073 10074 if (currentUserAccess != null) 10075 { 10076 favoriteUserToken = JwtService.GetToken(currentUserAccess, 86400); 10077 } 10078 var customerNumber = Model.CurrentUser.CustomerNumber != null ? Model.CurrentUser.CustomerNumber.ToString() : ""; 10079 10080 <div class="u-hidden" id="CustomerNumber" data-customer-number="@customerNumber"></div> 10081 <input type="hidden" id="DeviationPageUrl" value="@deviationPageUrl" /> 10082 <input type="hidden" id="FavoriteUserToken" value="@favoriteUserToken" /> 10083 <div class="u-hidden" id="CustomerToken" data-customer-token="@token"></div> 10084 <input class="u-hidden" id="SelectedUserId" name="userId" value="@Model.CurrentUser.ID" /> 10085 <input name="customerNumber" value="@customerNumber" id="rmaSelectedCustomerNumber" type="text" class="u-hidden"> 10086 10087 <div class="rma-modal__container"> 10088 10089 <form class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-hidden-inputs-draft-container" data-template="rma-form-hidden-inputs-draft" data-json-feed="" data-preloader="minimal" data-init-onload="false"></form> 10090 10091 <header class="u-flex u-flex--row rma-modal__header" bs-d-flex bs-flex-wrap> 10092 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10093 <input class="u-hidden" type="hidden" id="SelectedCustomerNumber" value="@customerNumber" /> 10094 <input class="u-hidden" type="hidden" id="SelectedCustomerToken" data-customer-token="" value="@token" /> 10095 <div class="fs-4 fw-bold text-primary" id="SelectedCustomerName"></div> 10096 <div class="fs-4 fw-bold text-primary" id="SelectedOrderId"></div> 10097 <div class="fs-4 fw-bold text-primary" id="SelectedDeviationId"></div> 10098 </header> 10099 <div class=""> 10100 <div class=""> 10101 <div class="rma-modal__selected-order orderline-form"> 10102 10103 <div class="bs-grid rma-modal-container bs-mt-md-5"> 10104 <div class="g-col-12 g-col-md-1 d-flex u-flex--row align-items-center justify-content-center"></div> 10105 <div class="g-col-12 g-col-md-5 d-flex u-flex--row align-items-center justify-content-center position-relative"> 10106 </div> 10107 <div class="g-col-12 g-col-md-3 d-flex u-flex--row align-items-center justify-content-center"></div> 10108 <div class="g-col-12 g-col-md-3 bs-d-flex bs-justify-content-center"> 10109 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toFull" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-3 bs-py-1 bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1 toFullOrderDraftButton">@Translate("Hel order")</button> 10110 </div> 10111 </div> 10112 @* Switch between full order rma and orderline RMA *@ 10113 <div class="rma-modal-container bs-px-3 form-orderline"> 10114 <div class="d-flex"> 10115 </div> 10116 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg "> 10117 <div class="u-border-bottom rma-page__header-grid-container"> 10118 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center"></div> 10119 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center">@Translate("Produkt")</div> 10120 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center justify-content-center">@Translate("Avviksårsak")</div> 10121 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert")</div> 10122 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Avviksantall")</div> 10123 <div class="fw-700 rma-page__grid-table-cell bs-d-flex bs-d-lg-none d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">@Translate("Levert Antall")</div> 10124 </div> 10125 </div> 10126 <div data-message="product-fill-all-fields" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10127 <div class="bs-d-flex"> 10128 <div class="toast-body"> 10129 @Translate("Please fill all required fields") 10130 </div> 10131 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10132 </div> 10133 </div> 10134 10135 @* products loop *@ 10136 <div class="js-handlebars-root dw-mod u-margin-bottom" id="rma-form-draft-orderlines-container" data-template="rma-form-draft-orderlines" data-json-feed="/Default.aspx?ID=6310" data-preloader="minimal" data-init-onload="false"></div> 10137 @*<div class="bs-d-flex bs-align-items-center bs-justify-content-start bs-my-5"> 10138 <input id="DeviationAgreementDraftFormOrderline" class="bs-me-3 " onclick="enableSubmitButton(this)" type="checkbox" style="width: 27px;height: 27px;" /> 10139 <label class="mb-0" for="DeviationAgreementDraftFormOrderline"> 10140 <span class=""></span>@Translate("Ja, jeg er kjent med retningslinjene for avvik og mener at dette er et avvik. ") 10141 </label> 10142 </div>*@ 10143 </div> 10144 </div> 10145 <div class="rma-modal__selected-order u-hidden fullOrder-form bs-px-3"> 10146 <div class="rma-modal-container"> 10147 <div class="d-flex bs-justify-content-between bs-mt-5 bs-mb-2"> 10148 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select " name="reason" onchange="changeDeviationReason(this);enableSubmitButtons(this)"> 10149 <option value="0">@Translate("Avviksårsak")</option> 10150 <option value="1">@Translate("Faktura")</option> 10151 <option value="3">@Translate("Kvalitet")</option> 10152 <option value="2">@Translate("Pakking")</option> 10153 <option value="4">@Translate("Vedlikehold")</option> 10154 <option value="5">@Translate("Feil Levert")</option> 10155 <option value="6">@Translate("Multiple")</option> 10156 </select> 10157 <button onclick="toggleOrderlineFullOrder(this)" data-toggle-view="toOrderline" type="button" class="bs-btn bs-rounded-4 bs-mb-0 bs-px-5 bs-py-1 bs-bg-transparent bs-text-primary bs-border bs-border-primary bs-border-1">@Translate("Velg linjer")</button> 10158 </div> 10159 <div class="inputComment bs-w-100 bs-mt-5"> 10160 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderComment" id="FullOrderComment" placeholder="@Translate("Avvikskommentar *")"></textarea> 10161 </div> 10162 <div class="inputComment bs-w-100 bs-mt-3"> 10163 <textarea class="create-rma-comment-full-order bs-w-100 bs-rounded-4 border-primary-light" name="FullOrderExpectedOutput" id="FullOrderExpectedOutput" placeholder="@Translate("Ønsket utfall")"></textarea> 10164 </div> 10165 <input class="create-rma-form-input form-control create-rma-Attachment-input" name="FullOrderAttachment" type="file" multiple="multiple" /> 10166 <div class="d-flex align-items-center flex-row gap-5 text-primary bs-mt-4 bs-mb-5"> 10167 </div> 10168 </div> 10169 </div> 10170 </div> 10171 </div> 10172 <footer class="modal__rma-footer"> 10173 <div class="footer-button-container"> 10174 <button class="submit-rma-button bs-btn bs-btn-primary " type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),2,false)">@Translate("Opprett Avvik")</button> 10175 <button class="submit-rma-button bs-bg-white bs-btn bs-btn-outline-primary" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'),1,false)">@Translate("Save as draft")</button> 10176 </div> 10177 <div class="modal__rma-footer-icon-buttons"> 10178 </div> 10179 </footer> 10180 </div> 10181 <script id="ImpersonationListContentFilterCreateRmaDraftModal" type="text/x-template"> 10182 @{ 10183 string title = @Translate("Choose user"); 10184 } 10185 {{#.}} 10186 <div class="impersonation-container-filter-rma create-rma-modal"> 10187 <input type="checkbox" id="ImpersonationSelect_filterRMA" class="dropdown-trigger" /> 10188 <div class="dropdown variants-filters bs-w-100 dw-mod"> 10189 <label class="dropdown__header dropdown__btn dw-mod" for="ImpersonationSelect_filterRMA" style="background-color: #EEE8E3;border: 0;border-radius: 11px;">@title</label> 10190 <div class="dropdown__content u-padding dw-mod"> 10191 <div class="dropdown__item__filter"> 10192 <input type="text" data-container-id="impersonationListFilterCreateRmaModal" data-view-type="header" placeholder="@Translate("Search")"> 10193 </div> 10194 10195 {{>ImpersonationListContentFilterSelectCreateRmaDraftModal}} 10196 </div> 10197 </div> 10198 <label class="dropdown-trigger-off" for="ImpersonationSelect_filter"></label> 10199 </div> 10200 10201 {{/.}} 10202 </script> 10203 <script id="ImpersonationListContentFilterSelectCreateRmaDraftModal" type="text/x-template"> 10204 {{#.}} 10205 {{#Users}} 10206 <div data-facet-query-param="user" onclick="renderOrdersSelect(this)" data-customer-token="{{customerToken}}" data-customer-number="{{customerNumber}}" data-facet-user-id="{{id}}" data-facet-label="user" class="facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{name}}</div> 10207 {{/Users}} 10208 {{/.}} 10209 </script> 10210 10211 <script id="rma-form-hidden-inputs-draft" type="text/x-template"> 10212 {{#.}} 10213 <input name="orderId" id="OrderIdInput" value="{{orderId}}" type="text" class="u-hidden" /> 10214 <input name="deviationId" id="HiddenInputsDeviationId" value="0" type="text" class="u-hidden" /> 10215 <input name="orderShopReference" value="{{orderShopReference}}" type="text" class="u-hidden" /> 10216 <input name="orderLocation" value="{{orderLocation}}" type="text" class="u-hidden" /> 10217 <input name="isFullDeviation" id="EntireOrder" value="false" type="text" class="u-hidden" /> 10218 @* 10219 <input name="userId" value="@Model.CurrentUser.ID" type="text" class="u-hidden" /> 10220 *@ 10221 <input name="secondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" type="text" class="u-hidden" /> 10222 <input name="reason" id="PerOrderlineGeneralReason" value="" type="text" class="u-hidden"> 10223 <input name="status" id="PerOrderlineStatusNew" value="New" type="text" class="u-hidden"> 10224 @*<input name="isFullDeviation" value="false" type="text" class="u-hidden">*@ 10225 {{/.}} 10226 </script> 10227 10228 <script id="rma-form-draft-orderlines" type="text/x-template"> 10229 {{#.}} 10230 <form class="rma-orderline bs-border-bottom bs-border-1 border-primary-light" style="border-color: #597CCA;"> 10231 <input type="hidden" name="productId" value="{{productId}}" /> 10232 <input name="deviationId" id="HiddenInputsDeviationId" value="{{deviationId}}" type="text" class="u-hidden" /> 10233 <input name="deviationOrderLineId" value="{{deviationOrderLineId}}" type="text" class="u-hidden" /> 10234 <input name="deviationLineId" value="{{deviationLineId}}" type="text" class="u-hidden" /> 10235 10236 <input type="hidden" name="productNumber" value="{{productNumber}}" /> 10237 <input type="hidden" name="productName" value="{{productName}}" /> 10238 <input type="hidden" name="productImage" value="{{#if productImage}}{{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" /> 10239 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10240 <input type="hidden" name="supplierName" value="{{supplierName}}" /> 10241 <div class="rma-form-grid-item"> 10242 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10243 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10244 </div> 10245 <div class=" rma-page__grid-table-cell bs-order-md-1 bs-order-1 d-flex u-flex--row align-items-center"> 10246 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10247 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{deviationOrderLineId}}" style="flex-wrap: wrap"><span>{{productNumber}}</span>{{#ifCond productNumber '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateFirst20 productName}}</span></div> 10248 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond orderLineMeasurementUnit '!==' ''}}bs-mt-2{{/ifCond}}"><span>{{truncateLast16 supplierName}}</span>{{#ifCond orderLineMeasurementUnit '!==' ''}}<span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10249 </div> 10250 </div> 10251 <div class="fw-700 rma-page__grid-table-cell bs-order-md-2 bs-order-3 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10252 <select class="create-rma-form-input create-rma-form-reason-select create-rma-reason-select" value={{reason}} name="reason" onchange="showAdditionalOrderlineFields(this, this.value)"> 10253 <option {{#ifCond reason '===' 0}} selected {{/ifCond}} value="0">@Translate("Avviksårsak")</option> 10254 <option {{#ifCond reason '===' 1}} selected {{/ifCond}} value="1">@Translate("Faktura")</option> 10255 <option {{#ifCond reason '===' 3}} selected {{/ifCond}} value="3">@Translate("Kvalitet")</option> 10256 <option {{#ifCond reason '===' 2}} selected {{/ifCond}} value="2">@Translate("Pakking")</option> 10257 <option {{#ifCond reason '===' 4}} selected {{/ifCond}} value="4">@Translate("Vedlikehold")</option> 10258 <option {{#ifCond reason '===' 5}} selected {{/ifCond}} value="5">@Translate("Feil Levert")</option> 10259 <option {{#ifCond reason '===' 6}} selected {{/ifCond}} value="6">@Translate("Multiple")</option> 10260 </select> 10261 </div> 10262 <div class="rma-page__grid-table-cell bs-order-md-3 bs-order-2 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;">{{deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10263 <input type="hidden" name="deliveredQuantity" value="{{deliveredQuantity}}" /> 10264 <input type="hidden" name="deviationOrderLineTotalPrice" value="{{deviationOrderLineTotalPrice}}" /> 10265 <div class=" rma-page__grid-table-cell bs-order-md-4 bs-order-4 d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10266 <input class="create-rma-form-input create-rma-quantity-input {{#ifCond deviationQuantity '===' 0}} disabled {{/ifCond}}" value="{{deviationQuantity}}" oninput="showAdditionalOrderlineFields(this, this.value)" data-delivered-quantity="{{deliveredQuantity}}" name="deviationQuantity" type="number" min="0" step="1" max="{{deliveredQuantity}}" /> 10267 <button type="button" id="toggle" value="0" class="bs-btn bs-btn-clean bs-px-0 removeOrderlineButton {{#ifCond deviationQuantity '===' 0}} u-hidden {{/ifCond}}" onclick="showAdditionalOrderlineFields(this, this.value)" title="RemoveOrderline"> 10268 <i class="far fa-times bs-text-danger bs-px-2"></i> 10269 </button> 10270 </div> 10271 </div> 10272 <div class="grid {{#ifCond reason '===' 0}} u-hidden {{/ifCond}} additional-rma-orderline-fields"> 10273 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10274 </div> 10275 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center;"> 10276 <input type="text" value="{{#each messages}}{{message}}{{/each}}" data-message-id="{{#each messages}}{{messageId}}{{/each}}" class="create-rma-form-input create-rma-comment" placeholder="@Translate("Avvikskommentar *")" name="comment" /> 10277 </div> 10278 <div class=" rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10279 <input class="create-rma-form-input create-rma-expected-result" value="{{requestedOutcome}}" placeholder="@Translate("Ønsket utfall")" name="requestedOutcome" type="text" /> 10280 </div> 10281 <div class="fw-700 rma-page__grid-table-cell d-flex u-flex--row align-items-center" style="align-items: center; justify-content: center;"> 10282 <input class="create-rma-form-input form-control create-rma-Attachment-input" data-image-path="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" value="{{#each messages}}{{#each messageFiles}}{{messageFile}}{{/each}}{{/each}}" id="CreateRmaFormAttachment_{{productId}}" name="attachment" type="file" /> 10283 <div class="{{#ifCond messageFile '!==' null}} u-hidden {{/ifCond}}emptyFileInputButton" onclick="emptyFileInput(this)"><i class="far text-danger fs-5 fa-times bs-px-2"></i></div> 10284 </div> 10285 </div> 10286 </form> 10287 {{/.}} 10288 </script> 10289 10290 <script id="RMA-Order-Select" type="text/x-template"> 10291 10292 {{#.}} 10293 {{#ifCond orderId "!==" "No"}} 10294 <div data-order-id="{{orderId}}" class="option-dropdown-order facet-user-label bs-border-0 bs-p-1 bs-fw-normal">{{orderId}} - {{orderDate}}</div> 10295 {{/ifCond}} 10296 {{/.}} 10297 </script> 10298 10299 } 10300 10301 @helper RmaViewDetails() 10302 { 10303 var company = Model.CurrentUser.Company; 10304 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10305 10306 <form class="rma-modal__container"> 10307 <header class="u-flex u-flex--row rma-modal__header bs-px-3 bs-d-flex bs-flex-wrap"> 10308 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10309 <div class="rma-order-number rma-view-details__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10310 </header> 10311 <input type="hidden" id="SelectedDeviationId" value="" /> 10312 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10313 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10314 <div class="js-handlebars-root bs-px-3 bs-mb-5 dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10315 10316 <div class="bs-px-3"> 10317 <div class="rma-modal-container"> 10318 <div class="modal__content rma-page_table-header u-margin-bottom--lg u-margin-top--lg u-border-bottom"> 10319 <div class="rma-details-page__header-grid-container"> 10320 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block"></div> 10321 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Produkt")</div> 10322 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksårsak")</div> 10323 <div class="fw-700 rma-page__grid-table-cell bs-d-none bs-d-lg-block">@Translate("Levert")</div> 10324 <div class="fw-700 rma-page__grid-table-cell">@Translate("Avviksantall")</div> 10325 <div class="fw-700 rma-page__grid-table-cell">@Translate("Pris")</div> 10326 </div> 10327 </div> 10328 @*// products loop *@ 10329 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-handlebars-container" data-template="Rma-Details-handlebars" data-json-feed="" data-preloader="overlay" data-init-onload="true"></div> 10330 </div> 10331 </div> 10332 @*End of Products Loop *@ 10333 <div class="modal__content bs-px-3 rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10334 @*Start of the Messaging Loop*@ 10335 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10336 <div class="rma-page__write-comment"> 10337 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10338 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10339 @*<label for="file-input"> 10340 <img width="19" height="38" src="/Files/Images/attachment.svg" /> 10341 </label>*@ 10342 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10343 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10344 <span id="file-input-error" style="display:none">@Translate("Wrong file")</span> 10345 </div> 10346 </div> 10347 <footer class="modal__rma-footer"> 10348 <div class="footer__buttons"> 10349 @if (isCompanyKraemer) 10350 { 10351 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10352 @*<option value="1">@Translate("STATUS_1")</option>*@ 10353 <option value="2" default selected>@Translate("STATUS_2")</option> 10354 <option value="3">@Translate("STATUS_3")</option> 10355 <option value="4">@Translate("STATUS_4")</option> 10356 </select> 10357 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10358 } 10359 else 10360 { 10361 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenRmaModal">@Translate("Re-open Deviation")</button> 10362 <div class="bs-modal bs-fade" id="reopenRmaModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10363 <div class="modal-dialog bs-mt-4"> 10364 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10365 <div class="modal-body bs-pb-0 bs-text-center"> 10366 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10367 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10368 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10369 </div> 10370 </div> 10371 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10372 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10373 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10374 </div> 10375 </div> 10376 </div> 10377 </div> 10378 10379 } 10380 </div> 10381 <div class="modal__rma-footer-icon-buttons"> 10382 </div> 10383 </footer> 10384 </form> 10385 <script> 10386 let applyReasonTranslation = ()=>{ 10387 document.querySelectorAll(".reasonTranslation").forEach(el =>{ 10388 let reason = el.innerHTML; 10389 switch (reason){ 10390 10391 case "REASON_0": 10392 el.innerHTML = `@Translate("REASON_0")`; 10393 break; 10394 case "REASON_1": 10395 el.innerHTML = `@Translate("REASON_1")`; 10396 break; 10397 case "REASON_2": 10398 console.log("REASON_2") 10399 el.innerHTML = `@Translate("REASON_2")`; 10400 break; 10401 case "REASON_3": 10402 el.innerHTML = `@Translate("REASON_3")`; 10403 break; 10404 case "REASON_4": 10405 console.log("REASON_4") 10406 el.innerHTML = `@Translate("REASON_4")`; 10407 break; 10408 case "REASON_5": 10409 el.innerHTML = `@Translate("REASON_5")`; 10410 break; 10411 case "REASON_6": 10412 el.innerHTML = `@Translate("REASON_6")`; 10413 break; 10414 } 10415 }) 10416 } 10417 let applyStatusTranslation = ()=>{ 10418 document.querySelectorAll(".statusTranslation").forEach(el =>{ 10419 let status = el.innerHTML; 10420 switch (status){ 10421 case "STATUS_0": 10422 el.innerHTML = `@Translate("STATUS_0")`; 10423 break; 10424 case "STATUS_1": 10425 el.innerHTML = `@Translate("STATUS_1")`; 10426 break; 10427 case "STATUS_2": 10428 console.log("STATUS_2") 10429 el.innerHTML = `@Translate("STATUS_2")`; 10430 break; 10431 case "STATUS_3": 10432 el.innerHTML = `@Translate("STATUS_3")`; 10433 break; 10434 case "STATUS_4": 10435 console.log("STATUS_4") 10436 el.innerHTML = `@Translate("STATUS_4")`; 10437 break; 10438 case "STATUS_5": 10439 el.innerHTML = `@Translate("STATUS_5")`; 10440 break; 10441 case "STATUS_6": 10442 el.innerHTML = `@Translate("STATUS_6")`; 10443 break; 10444 } 10445 }) 10446 } 10447 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10448 applyReasonTranslation(); 10449 }) 10450 document.getElementById("Rma-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10451 applyReasonTranslation(); 10452 }) 10453 document.getElementById("Rma-Order-Details-handlebars-container").addEventListener('contentLoaded', function (e) { 10454 applyStatusTranslation(); 10455 }) 10456 document.getElementById("Rma-Order-Details-handlebars-container-first-row").addEventListener('contentLoaded', function (e) { 10457 applyStatusTranslation(); 10458 }) 10459 document.getElementById("Rma-Order-Details-handlebars-container-second-row").addEventListener('contentLoaded', function (e) { 10460 applyStatusTranslation(); 10461 applyReasonTranslation(); 10462 }) 10463 </script> 10464 <script id="Rma-Details-handlebars" type="text/x-template"> 10465 10466 {{#.}} 10467 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10468 <div class="rma-products-list bs-border-bottom"> 10469 <div class="rma-details-page__header-grid-container"> 10470 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10471 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10472 </div> 10473 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row align-items-center"> 10474 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10475 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10476 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="1111111">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10477 </div> 10478 </div> 10479 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10480 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10481 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10482 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row align-items-center">{{format2Decimals deviationOrderLineTotalPrice}}</div> 10483 </div> 10484 10485 <div class="grid"> 10486 <div class=" rma-page__grid-table-cell grid__col-1-auto d-flex u-flex--row align-items-center"> 10487 </div> 10488 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10489 <div class="rma-product-info-container"> 10490 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10491 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10492 {{#each messages}} 10493 {{message}} 10494 {{/each}} 10495 </div> 10496 </div> 10497 </div> 10498 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-2-auto d-flex u-flex--row bs-align-items-start"> 10499 <div class="rma-product-info-container"> 10500 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10501 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10502 </div> 10503 </div> 10504 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-1-auto d-flex u-flex--row align-items-center"></div> 10505 <div class=" rma-page__grid-table-cell vertical-align-center grid__col-4-auto d-flex u-flex--row bs-align-items-start"> 10506 <div class="rma-product-info-container"> 10507 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10508 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10509 {{#each messages}} 10510 {{#each messageFiles}} 10511 @* 10512 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10513 *@ <a href="{{messageFile}}" target="_blank"> 10514 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10515 </a> 10516 {{/each}} 10517 {{/each}} 10518 </div> 10519 </div> 10520 </div> 10521 </div> 10522 </div> 10523 {{/.}} 10524 </script> 10525 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10526 {{#.}} 10527 <div class="d-grid"> 10528 {{#if isCustomer}} 10529 <div class="rma-page__user-message"> 10530 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10531 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10532 <div class="rma-page__message-date ">{{messageDate}}</div> 10533 </div> 10534 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10535 <div class="rma-page__attachment-footer"> 10536 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10537 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10538 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10539 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10540 </a> {{/each}} 10541 </a> 10542 </div> 10543 </div> 10544 {{else}} 10545 <div class="rma-page__admin-message"> 10546 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10547 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10548 <div class="rma-page__message-date ">{{messageDate}}</div> 10549 </div> 10550 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10551 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10552 10553 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10554 {{#each messageFiles}} 10555 <a href="{{messageFile}}" target="_blank"> 10556 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10557 </a> 10558 {{/each}} 10559 </div> 10560 </div> 10561 {{/if}} 10562 </div> 10563 10564 {{/.}} 10565 </script> 10566 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10567 {{#.}} 10568 <div class="rma-selected-order-info-data bs-mt-3 bs-px-5 bs-grid"> 10569 <div class="cell g-col-6 g-col-md-3"> 10570 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10571 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}} " class="bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10572 </div> 10573 <div class="cell g-col-6 g-col-md-3"> 10574 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10575 <div class="">{{formatDate createdDate}}</div> 10576 </div> 10577 <div class="cell g-col-6 g-col-md-3"> 10578 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10579 <div class=" statusTranslation">STATUS_{{status}}</div> 10580 </div> 10581 <div class="cell g-col-6 g-col-md-3"> 10582 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10583 <div class="">{{formatDate updatedDate}}</div> 10584 </div> 10585 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10586 <div class="bs-d-flex"> 10587 <div class="toast-body"> 10588 @Translate("You can only view your own orders") 10589 </div> 10590 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10591 </div> 10592 </div> 10593 </div> 10594 10595 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10596 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10597 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10598 <input type="hidden" id="SelectedStatus" value="{{status}}" /> 10599 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10600 {{/.}} 10601 </script> 10602 } 10603 10604 @helper RmaViewDetailsFullOrder() 10605 { 10606 var company = Model.CurrentUser.Company; 10607 bool isCompanyKraemer = company != null && company.ToLower() == "kraemer"; 10608 10609 <form class="rma-modal__container"> 10610 10611 <header class="u-flex u-flex--row rma-modal__header bs-d-flex bs-flex-wrap"> 10612 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" /> 10613 <div class="rma-order-number rma-view-details-full-order__header-deviation-number">@*@Translate("TAKK FOR DIN ORDRE!")*@</div> 10614 </header> 10615 <input type="hidden" id="SelectedDeviationId" value="" /> 10616 <input type="hidden" id="CurrentUserId" value="@Model.CurrentUser.ID.ToString()" /> 10617 <input type="hidden" id="SecondaryUserId" value="@Model.CurrentSecondaryUser.ID.ToString()" /> 10618 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-first-row" data-template="Rma-Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10619 10620 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-second-row" data-template="Rma-Order-Details-handlebars-second-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10621 10622 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Order-Details-handlebars-container-third-row" data-template="Rma-Order-Details-handlebars-third-row" data-json-feed="https://2jj4q.wiremockapi.cloud/deviations" data-preloader="overlay" data-init-onload="true"></div> 10623 <div class="bs-grid"> 10624 <div class="rma-selected-order-info g-col-12 g-col-md-6 bs-my-5 bs-px-2 bs-px-md-6"> 10625 <div class="bs-mb-3 bs-fs-5 fw-700">@Translate("Ordredetaljer")</div> 10626 <div class="orderInfo d-flex bs-justify-content-between"> 10627 <p class="bs-mb-2 bs-fs-5 fw-bold">@Translate("Antall produktlinjer")</p> 10628 <p class="bs-mb-2 bs-fs-5 rma-form-total-orderlines">7</p> 10629 </div> 10630 <div class="orderInfo d-flex bs-justify-content-between"> 10631 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Totalt antall produkter")</p> 10632 <p class="bs-mb-2 bs-fs-5 rma-form-total-quantity">289</p> 10633 </div> 10634 <div class="orderInfo d-flex bs-justify-content-between"> 10635 <p class="bs-mb-2 bs-fs-5 fw-bold ">@Translate("Ordretotal eks. MVA")</p> 10636 <p class="bs-mb-2 bs-fs-5 rma-form-total-amount">7324,54 kr</p> 10637 </div> 10638 </div> 10639 </div> 10640 <div class="modal__content rma-page_table-header bs-mx-5 bs-border-0 bs-border-bottom bs-border-primary u-margin-bottom--lg u-margin-top--lg u-border-bottom"></div> 10641 @*Start of the Messaging Loop*@ 10642 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Rma-Details-messaging-handlebars-container-full-order" data-template="Rma-Details-messaging-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10643 <div class="rma-page__write-comment"> 10644 <textarea class="comment__input-textarea bs-mt-4" id="OrderReviews_Comment" name="OrderReviews_Comment" rows="4" cols="50" placeholder="@Translate("Skriv ditt svar her")" style="width: 100%; border: none; resize: none"></textarea> 10645 <div class="rma-page__comment-buttons d-flex bs-gap-3 u-flex--row vertical-align-center"> 10646 <input id="file-input" class="messaging-file-input form-control" type="file" accept=".jpg,.png,.gif,.bmp,.jpeg,.pdf" onchange="validateFiles(this)" /> 10647 <button type="button" onclick='submitComment(this.closest(".rma-page__write-comment"))' class="bs-btn bs-btn-primary bs-w-100 submit-comment-button">@Translate("Send svar")</button> 10648 <span id="file-input-error2" style="display:none">@Translate("Wrong file")</span> 10649 </div> 10650 </div> 10651 <footer class="modal__rma-footer"> 10652 <div class="footer__buttons"> 10653 @if (isCompanyKraemer) 10654 { 10655 <select name="StatusSelect" class="select bs-mb-0 bs-me-3 " onchange="enableSubmitButton(this)" id="StatusSelect"> 10656 @*<option value="1">@Translate("STATUS_1")</option>*@ 10657 <option value="2" default selected>@Translate("STATUS_2")</option> 10658 <option value="3">@Translate("STATUS_3")</option> 10659 <option value="4">@Translate("STATUS_4")</option> 10660 </select> 10661 <button class="submit-deviation-state bs-btn bs-btn-primary disabled" type="button" onclick="changeDeviationStatus(this)">@Translate("Submit Deviation")</button> 10662 } 10663 else 10664 { 10665 <button class="submit-deviation-state bs-btn bs-btn-primary reopen-rma-button" id="ReOpenDeviation" type="button" data-bs-toggle="modal" data-bs-target="#reopenFullOrder">@Translate("Re-open Deviation")</button> 10666 @* 10667 <button class="submit-deviation-state bs-btn bs-btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal" >@Translate("Modal Test")</button> 10668 *@ 10669 <div class="bs-modal bs-fade" id="reopenFullOrder" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 10670 <div class="modal-dialog bs-mt-4"> 10671 <div class="modal-content bs-border-primary-dark bs-bg-sand-light"> 10672 <div class="modal-body bs-pb-0 bs-text-center"> 10673 <div class="bs-d-flex bs-flex-column bs-align-items-center bs-justify-content-center bs-gap-3 bs-fs-6"> 10674 <h3 class="bs-fw-bold bs-fs-4 bs-mb-2">@Translate("Er du sikker på at du ønsker å gjenåpne avviket?")</h3> 10675 <p class="bs-fs-6 bs-fw-normal">@Translate("Litt ekstra informasjon. Litt ekstra informasjonLitt ekstra informasjon")</p> 10676 </div> 10677 </div> 10678 <div class="bs-bg-sand-light bs-rounded-4 bs-p-4 bs-d-flex bs-justify-content-center bs-gap-3"> 10679 <button type="button" class="bs-btn bs-btn-primary" onclick="changeDeviationStatus(this)">@Translate("Gjenåpne avvik")</button> 10680 <button type="button" class="bs-btn bs-btn-secondary" data-bs-target="#reopenRmaModal" data-bs-dismiss="modal">@Translate("Avbryt")</button> 10681 </div> 10682 </div> 10683 </div> 10684 </div> 10685 } 10686 </div> 10687 <div class="modal__rma-footer-icon-buttons"> 10688 </div> 10689 </footer> 10690 </form> 10691 10692 <script id="Rma-Details-handlebars" type="text/x-template"> 10693 10694 {{#.}} 10695 <div class="u-hidden deviationIdDiv">{{deviationId}}</div> 10696 <div class="rma-products-list bs-border-bottom"> 10697 <div class="rma-details-page__header-grid-container"> 10698 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"> 10699 <img src="{{#if productImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{productImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" /> 10700 </div> 10701 <div class=" rma-page__grid-table-cell rma-details__name vertical-align-center d-flex u-flex--row align-items-center"> 10702 <div class="rma-product-info-container bs-d-flex bs-flex-column"> 10703 <div class=" fw-700 vertical-align-center d-flex u-flex--row align-items-center" data-product-id="{{productId}}"><span>{{productNumber}}</span><span class="spacing-ball"></span><span title="{{productName}}">{{truncateFirst20 productName}}</span></div> 10704 <div class="rma-product-details d-flex vertical-align-center u-flex--row align-items-center {{#ifCond supplierName '!==' ''}}bs-mt-2{{/ifCond}}" data-test="222222222">{{#ifCond supplierName '!==' ""}}<span>{{truncateLast16 supplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 deviationOrderLineMeasurementUnit}}</span></div> 10705 </div> 10706 </div> 10707 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center reasonTranslation">REASON_{{reason}}</div> 10708 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deliveredQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10709 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{format2Decimals deviationQuantity}} {{deviationOrderLineProductBaseUnit}}</div> 10710 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row align-items-center">{{deviationOrderLineTotalPrice}}</div> 10711 </div> 10712 <div class="rma-details-page__header-grid-container"> 10713 <div class="rma-page__grid-table-cell bs-d-none bs-d-lg-flex d-flex u-flex--row align-items-center"></div> 10714 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10715 <div class="rma-product-info-container"> 10716 <div class="fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Kommentar")</span></div> 10717 <div class="rma-product-details d-flex u-flex--row align-items-center"> 10718 {{#each messages}} 10719 {{message}} 10720 {{/each}} 10721 </div> 10722 </div> 10723 </div> 10724 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10725 <div class="rma-product-info-container"> 10726 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Ønsket utfall")</span></div> 10727 <div class="rma-product-details d-flex u-flex--row align-items-center">{{requestedOutcome}}</div> 10728 </div> 10729 </div> 10730 <div class=" rma-page__grid-table-cell bs-d-none bs-d-lg-flex vertical-align-center d-flex u-flex--row align-items-center"></div> 10731 <div class=" rma-page__grid-table-cell vertical-align-center d-flex u-flex--row bs-align-items-start"> 10732 <div class="rma-product-info-container"> 10733 <div class=" fs-14 opacity-07 rma-product-number-name d-flex u-flex--row align-items-center"><span>@Translate("Vedlegg")</span></div> 10734 <div class="bs-d-flex bs-gap-2 bs-flex-wrap"> 10735 {{#each messages}} 10736 {{#each messageFiles}} 10737 @* 10738 <div class="rma-product-details d-flex u-flex--row align-items-center"><span><img src="/Files/Images/attachment.svg" alt="attachment-icon" style="margin-right: 5px"></span><span>{{messageFile}}</span></div> 10739 *@ <a href="{{messageFile}}" target="_blank"> 10740 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10741 </a> 10742 {{/each}} 10743 {{/each}} 10744 </div> 10745 </div> 10746 </div> 10747 </div> 10748 </div> 10749 {{/.}} 10750 </script> 10751 <script id="Rma-Details-messaging-handlebars" type="text/x-template"> 10752 {{#.}} 10753 <div class="d-grid"> 10754 {{#if isCustomer}} 10755 <div class="rma-page__user-message"> 10756 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10757 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10758 <div class="rma-page__message-date ">{{messageDate}}</div> 10759 </div> 10760 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10761 <div class="rma-page__attachment-footer"> 10762 <a href=" {{#each messageFiles}}{{messageFile}}{{/each}}" target=" {{#each messageFiles}}{{messageFile}}{{/each}}" class="rma-page__attachment-footer"> 10763 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10764 {{#each messageFiles}}<a href="{{messageFile}}" target="_blank"> 10765 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10766 </a> {{/each}} 10767 </a> 10768 </div> 10769 </div> 10770 {{else}} 10771 <div class="rma-page__admin-message"> 10772 <div class="bs-d-flex bs-fw-bold bs-flex-wrap bs-justify-content-between bs-gap-md-4 bs-text-break"> 10773 <div class=" rma-page__username ">{{userName}} - <span class="rma-page__user-company">{{company}} @*- {{isCustomer}}*@</span></div> 10774 <div class="rma-page__message-date ">{{messageDate}}</div> 10775 </div> 10776 <div class="rma-page__message-content bs-text-break">{{message}}</div> 10777 <div class="bs-d-flex bs-flex-row bs-gap-3 bs-flex-wrap"> 10778 10779 @*<span><img src="/Files/Images/attachment.svg" style="margin-right: 5px" /></span>*@ 10780 {{#each messageFiles}} 10781 <a href="{{messageFile}}" target="_blank"> 10782 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10783 </a> 10784 {{/each}} 10785 </div> 10786 </div> 10787 10788 {{/if}} 10789 </div> 10790 10791 {{/.}} 10792 </script> 10793 <script id="Rma-Order-Details-handlebars" type="text/x-template"> 10794 {{#.}} 10795 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10796 <input type="hidden" id="OrderLocation" value="{{orderLocation}}" /> 10797 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10798 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10799 <div class="cell g-col-6 g-col-md-3"> 10800 <div class="bs-fw-bold bs-mb-3">@Translate("Relatert ordre")</div> 10801 <div type="button" onclick="openDetailsHistory()" data-order-id="{{orderId}}" data-customer-number="{{customerNumber}}" class="rma-order-header-info bs-cursor-pointer cursor-pointer bs-text-decoration-underline">{{orderId}}</div> 10802 </div> 10803 <div class="cell g-col-6 g-col-md-3"> 10804 <div class="bs-fw-bold bs-mb-3">@Translate("Oprettet")</div> 10805 <div class="">{{formatDate createdDate}}</div> 10806 </div> 10807 <div class="cell g-col-6 g-col-md-3"> 10808 <div class="bs-fw-bold bs-mb-3">@Translate("Status")</div> 10809 <div class=" statusTranslation">STATUS_{{status}}</div> 10810 </div> 10811 <div class="cell g-col-6 g-col-md-3"> 10812 <div class="bs-fw-bold bs-mb-3">@Translate("Sist oppdatert")</div> 10813 <div class="">{{formatDate updatedDate}}</div> 10814 </div> 10815 <div data-message="error-not-the-current-user" data-bs-delay="1800" class="toast bs-align-items-center bs-bg-danger bs-text-light bs-border-0 bs-w-100 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10816 <div class="bs-d-flex"> 10817 <div class="toast-body"> 10818 @Translate("You can only view your own orders") 10819 </div> 10820 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10821 </div> 10822 </div> 10823 </div> 10824 10825 <input type="hidden" id="SelectedOrderId" value="{{orderId}}" /> 10826 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}" /> 10827 <input type="hidden" id="SelectedReason" value="{{reason}}" /> 10828 <div class="deviationId-header u-hidden">{{deviationId}}</div> 10829 {{/.}} 10830 </script> 10831 10832 <script id="Rma-Order-Details-handlebars-second-row" type="text/x-template"> 10833 {{#.}} 10834 10835 <div class="rma-selected-order-info-data bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10836 <div class="cell g-col-6 g-col-md-3"> 10837 <div class="bs-fw-bold bs-mb-3">@Translate("Avviksårsak")</div> 10838 <div class="reasonTranslation">REASON_{{reason}}</div> 10839 </div> 10840 <div class="cell g-col-6 g-col-md-3"> 10841 <div class="bs-fw-bold bs-mb-3">@Translate("S/O")</div> 10842 <div class="">{{orderShopReference}}</div> 10843 </div> 10844 <input type="hidden" id="SelectedDeviationIsFullOrder" value="{{isFullDeviation}}"> 10845 </div> 10846 {{/.}} 10847 </script> 10848 10849 <script id="Rma-Order-Details-handlebars-third-row" type="text/x-template"> 10850 {{#.}} 10851 <div class="rma-selected-order-info bs-mt-3 bs-px-1 bs-px-md-6 bs-grid"> 10852 <div class="cell g-col-12 g-col-md-6"> 10853 <div class="bs-fw-bold bs-mb-3">@Translate("Vedlegg")</div> 10854 <div class="bs-d-flex bs-flex-row bs-flex-wrap bs-gap-3"> 10855 {{#each messages}}{{#each messageFiles}} 10856 <a href="{{messageFile}}" target="_blank"> 10857 <img src="/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{messageFile}}" width="50" height="50" alt="Product Attachment" /> 10858 </a> 10859 {{/each}}{{/each}} 10860 </div> 10861 </div> 10862 10863 <div class="cell g-col-6 g-col-md-3"> 10864 <div class="bs-fw-bold bs-mb-3">@Translate("Kommentar")</div> 10865 <div class="">{{#each messages}}{{message}}{{/each}}</div> 10866 </div> 10867 <div class="cell g-col-6 g-col-md-3"> 10868 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket utfall")</div> 10869 <div class="">{{requestedOutcome}}</div> 10870 </div> 10871 </div> 10872 {{/.}} 10873 </script> 10874 10875 } 10876 10877 @helper ViewOrderDetails2() 10878 { 10879 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); 10880 var cartPageId = GetPageIdByNavigationTag("CartPage"); 10881 string dwAPIToken = ""; 10882 if (currentUserAccess != null) 10883 { 10884 dwAPIToken = JwtService.GetToken(currentUserAccess, 86400); 10885 } 10886 <form class="rma-modal__container"> 10887 <header class="modal-header bs-bg-sand-light bs-justify-content-start"> 10888 <img width="190" height="43" class="modal-logo" src="/Files/Images/Kraemer-new-logo-Svg.svg" alt="Kraemer logo" /> 10889 <div class="rma-order-number">@Translate("TAKK FOR DIN ORDRE!")</div> 10890 </header> 10891 10892 <div class="js-handlebars-root modal-body" id="Order-Header-Details-handlebars-container" data-template="Order-Header-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10893 10894 <div class="modal-body bs-pt-0"> 10895 <div class="modal__content rma-page_table-header bs-mt-3 bs-my-lg-3"> 10896 <div class="order-history-header bs-fw-bold bs-border-bottom bs-border-primary-dark"> 10897 <div class="cell bs-d-none bs-d-lg-block"></div> 10898 <div class="cell">@Translate("Produkt")</div> 10899 <div class="cell bs-d-none bs-d-lg-block">@Translate("Kommentar")</div> 10900 <div class="cell">@Translate("Antall")</div> 10901 <div class="cell">@Translate("Pris")</div> 10902 <div class="cell">@Translate("Total Eks. MVA")</div> 10903 </div> 10904 </div> 10905 @*// products loop *@ 10906 <div class="js-handlebars-root dw-mod u-margin-bottom" id="Order-Details-handlebars-container" data-template="Order-Details-handlebars" data-json-feed="https://2jj4q.wiremockapi.cloud/orders" data-preloader="overlay" data-init-onload="true"></div> 10907 </div> 10908 <div data-message="error-order-does-not-exist" data-bs-delay="1800" class="toast bs-align-items-center bs-px-3 bs-mx-auto bs-bg-danger bs-text-light bs-border-0 bs-w-75 bs-my-3" role="alert" aria-live="assertive" aria-atomic="true"> 10909 <div class="bs-d-flex"> 10910 <div class="toast-body"> 10911 @Translate("This order is not yet available to create a RMA.") 10912 </div> 10913 <button type="button" class="btn-close btn-close-white bs-me-2 bs-m-auto" data-bs-dismiss="toast" aria-label="Close"></button> 10914 </div> 10915 </div> 10916 <footer class="modal__rma-footer bs-py-4 bs-justify-content-end orderHistory-footer"> 10917 @*<button class="submit-rma-button" type="button" onclick="submitCreateRMAForm(this.closest('.rma-modal__container'))">@Translate("Opprett Avvik")</button>*@ 10918 <div class="modal__rma-footer-icon-buttons"> 10919 <a class="rma-page__icon-buttons bs-mx-2 openRmaModalButton bs-ms-0" title="@Translate("HOVER_StartDeviation")" onclick="openRMAModal('OrderSelected')"> 10920 <img height="26" width="26" src="/Files/Images/UnionRMA-icon.svg" /> 10921 </a> 10922 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button 10923 open-full-favorite-list-button" data-token="@dwAPIToken" onclick="showFavoriteListsForFullOrder(this, 10924 true)" title="@Translate("HOVER_FavouriteList")"> 10925 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" /> 10926 </a> 10927 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 10928 .classList.add('u-hidden');this.classList.add('bs-d-none');"></div> 10929 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border 10930 bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px;z-index:1;"> 10931 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 10932 </div> 10933 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 10934 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 10935 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 10936 </div> 10937 </div> 10938 <a class="rma-page__icon-buttons bs-mx-2" title="@Translate("HOVER_Download")"> 10939 <img height="26" width="26" onclick="PrintElem(this.closest('form'))" src="/Files/Images/print-icon.svg" /> 10940 </a> 10941 </div> 10942 </footer> 10943 </form> 10944 <script id="Order-Header-Details-handlebars" type="text/x-template"> 10945 10946 <div class="bs-grid"> 10947 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderId '===' null}} invisible {{else}} {{#ifCond orderId '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10948 <div class="bs-fw-bold bs-mb-3">@Translate("Ordre-ID")</div> 10949 <div class="" id="ModalOpenedOrderId" data-order-id="{{orderId}}">{{orderId}}</div> 10950 <input type="hidden" id="ModalOpenedUserId" value="@Model.CurrentUser.ID"> 10951 </div> 10952 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDate '===' null}} invisible {{else}} {{#ifCond orderDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10953 <div class="bs-fw-bold bs-mb-3">@Translate("Bestillingsdato")</div> 10954 <div class="">{{formatDate orderDate}}</div> 10955 </div> 10956 10957 <div class="cell g-col-6 g-col-md-3 {{#ifCond theListName '===' null}} invisible {{else}} {{#ifCond theListName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10958 <div class="bs-fw-bold bs-mb-3">@Translate("Handlekurv navn")</div> 10959 <div class="">{{orderCartName}}</div> 10960 </div> 10961 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderLocation '===' null}} invisible {{else}} {{#ifCond orderLocation '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10962 <div class="bs-fw-bold bs-mb-3">@Translate("Ordrelokasjon")</div> 10963 <div class="">{{orderLocation}}</div> 10964 </div> 10965 </div> 10966 10967 <div class="bs-grid"> 10968 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPoNumber '===' null}} invisible {{else}} {{#ifCond orderPoNumber '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10969 <div class="bs-fw-bold bs-mb-3">@Translate("P.O. Nummer")</div> 10970 <div class="">{{orderPoNumber}}</div> 10971 </div> 10972 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDesiredDeliveryDate '===' null}} invisible {{else}} {{#ifCond orderDesiredDeliveryDate '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10973 <div class="bs-fw-bold bs-mb-3">@Translate("Ønsket leveringsdag")</div> 10974 <div class="">{{formatDate orderDesiredDeliveryDate}}</div> 10975 </div> 10976 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderPurchaserName '===' null}} invisible {{else}} {{#ifCond orderPurchaserName '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10977 <div class="bs-fw-bold bs-mb-3">@Translate("Navn på kjøper")</div> 10978 <div class="">{{orderPurchaserName}}</div> 10979 </div> 10980 <div class="cell g-col-6 g-col-md-3 {{#ifCond orderDeliveryPlace '===' null}} invisible {{else}} {{#ifCond orderDeliveryPlace '===' ''}} invisible {{/ifCond}} {{/ifCond}}"> 10981 <div class="bs-fw-bold bs-mb-3">@Translate("Leveringssted")</div> 10982 <div class="">{{orderDeliveryPlace}}</div> 10983 </div> 10984 </div> 10985 </script> 10986 10987 <script id="Order-Details-handlebars" type="text/x-template"> 10988 {{#.}} 10989 <div class="order-history-item-container"> 10990 <div class="order-history-item bs-py-2 {{#ifCond orderLineDiscontinued '!==' false}} disabled {{/ifCond}} bs-py-lg-0"> 10991 <div class="cell bs-d-none bs-d-lg-block"> 10992 <img src="{{#if orderLineProductImage}}/Admin/Public/GetImage.ashx?width=75&height=55&crop=5&FillCanvas=true&Compression=75&image={{orderLineProductImage}}{{else}}/Files/Images/Kraemer/RapidoProducts/missing-image.jpg{{/if}}" width="80" height="54" class="img-fluid" alt="{{orderLineProductName}}" /> 10993 </div> 10994 <div class="cell order-history-detail__name bs-justify-self"> 10995 <div class="rma-product-info-container"> 10996 <div class="bs-fw-bold bs-d-flex bs-align-items-center order-history-product-info" data-quantity="{{orderLineQuantity}}" data-product-number="{{orderLineProductNumber}}" data-product-id="{{orderLineId}}" style="flex-wrap: wrap"><span>{{orderLineProductNumber}}</span><span class="spacing-ball"></span><span class="order-item-title" title="{{orderLineProductName}}">{{truncateFirst20 orderLineProductName}}</span></div> 10997 <div class="bs-d-none bs-d-lg-block {{#ifCond orderLineSupplierName '!==' null}}bs-mt-2{{/ifCond}}">{{#ifCond orderLineSupplierName '!==' null}}<span>{{truncateLast16 orderLineSupplierName}}</span><span class="spacing-ball"></span>{{/ifCond}}<span>{{truncateLast16 orderLineMeasurementUnit}}</span></div> 10998 <div class="bs-text-danger order-history-product-unavailable">{{#ifCond orderLineDiscontinued '!==' false}}@Translate("Denne varen er ikke lenger tilgjengelig"){{/ifCond}}</div> 10999 </div> 11000 </div> 11001 <div class="cell order-history-detail__comment bs-d-none bs-d-lg-block">{{orderLineComment}}</div> 11002 <div class="cell order-history-quantity-field" data-quantity={{orderLineQuantity}}>{{format2Decimals orderLineQuantity}} {{splitMeasurementUnit orderLinePricePerMeasurementUnit}}</div> 11003 <div class="cell order-history-price">{{orderLinePricePerMeasurementUnit}}</div> 11004 <div class="cell">{{orderLineTotalPrice}} @*{{orderLinePriceUnit}}*@</div> 11005 <div class="cell bs-d-flex bs-flex-row"> 11006 <a class="rma-page__icon-buttons bs-position-relative bs-mx-2 open-favorite-list-button" onclick="showFavoriteListsForProduct(this)" data-product-number="{{orderLineProductNumber}}" title="@Translate("HOVER_FavouriteList")"> 11007 <img height="26" width="26" src="/Files/Images/favorite-list-svg.svg" /> 11008 </a> 11009 <div class="favorite-list-select-container__close-trigger bs-d-none" onclick="this.parentNode.querySelector('.favorite-list-select-container') 11010 .classList.add('u-hidden');"></div> 11011 <div class="favorite-list-select-container u-hidden bs-position-absolute bs-border-primary bs-border bs-border-1 bs-rounded-3 bs-bottom-100 bs-p-3 bs-bg-white bs-flex-column" style="width: max-content;right: 30px"> 11012 <div class="existing-favorite-list bs-d-flex bs-flex-column bs-gap-2 bs-list-group bs-border bs-border-bottom-1 bs-border-top-0 bs-border-start-0 bs-border-end-0 bs-border-secondary bs-pb-3 bs-mb-3"> 11013 @*<div class="bs-fs-5 favorite-list-item bs-list-group-item bs-list-group-item-action" data-list-id="ListID" onclick="addToShoppingList(this)">Example1</div>*@ 11014 </div> 11015 <div class="create-new-list-container bs-d-flex bs-flex-no-wrap bs-flex-row bs-border-top-1 bs-border-0 bs-border-secondary"> 11016 <input type="text" name="favorite-list-name" class="bs-form-control" placeholder="@Translate("Create new favorite list")" /> 11017 <button type="button" onclick="createNewShoppingList(this)" class="bs-btn bs-btn-primary bs-rounded-0">@Translate("Add")</button> 11018 </div> 11019 </div> 11020 </div> 11021 </div> 11022 </div> 11023 {{/.}} 11024 </script> 11025 } 11026 11027 11028 @functions { 11029 public class ManifestIcon 11030 { 11031 public string src { get; set; } 11032 public string type { get; set; } 11033 public string sizes { get; set; } 11034 } 11035 11036 public class Manifest 11037 { 11038 public string name { get; set; } 11039 public string short_name { get; set; } 11040 public string start_url { get; set; } 11041 public string display { get; set; } 11042 public string background_color { get; set; } 11043 public string theme_color { get; set; } 11044 public List<ManifestIcon> icons { get; set; } 11045 } 11046 } 11047 11048 <!DOCTYPE html> 11049 11050 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName"> 11051 11052 11053 11054 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@ 11055 @RenderBlockList(masterPage.BlocksRoot.BlocksList) 11056 11057 11058 11059 @helper RenderMasterHead() { 11060 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList(); 11061 11062 <head> 11063 <!-- Rapido version 3.3 --> 11064 11065 @RenderBlockList(subBlocks) 11066 </head> 11067 } 11068 11069 @helper RenderMasterMetadata() { 11070 var swatches = new Dynamicweb.Content.Items.ColorSwatchService(); 11071 var brandColors = swatches.GetColorSwatch(1); 11072 string brandColorOne = brandColors.Palette["BrandColor1"]; 11073 11074 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) { 11075 Manifest manifest = new Manifest 11076 { 11077 name = Model.Area.Item.GetItem("Settings").GetString("AppName"), 11078 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"), 11079 start_url = "/", 11080 display = "standalone", 11081 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"), 11082 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor") 11083 }; 11084 11085 manifest.icons = new List<ManifestIcon> { 11086 new ManifestIcon { 11087 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11088 sizes = "192x192", 11089 type = "image/png" 11090 }, 11091 new ManifestIcon { 11092 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11093 sizes = "512x512", 11094 type = "image/png" 11095 }, 11096 new ManifestIcon { 11097 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded, 11098 sizes = "1024x1024", 11099 type = "image/png" 11100 } 11101 }; 11102 11103 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json"); 11104 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest); 11105 string currentManifest = File.ReadAllText(manifestFilePath); 11106 11107 if (manifestJSON != currentManifest) 11108 { 11109 File.WriteAllText(manifestFilePath, manifestJSON); 11110 } 11111 } 11112 11113 <meta charset="utf-8" /> 11114 <title>@Model.Title</title> 11115 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> 11116 <meta name="robots" content="index, follow"> 11117 <meta name="theme-color" content="@brandColorOne" /> 11118 11119 if (!Model.MetaTags.Contains("og:image")) { 11120 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage"))); 11121 } 11122 11123 if (!Model.MetaTags.Contains("og:description")) { 11124 Pageview.Meta.AddTag("og:description", Model.Description); 11125 } 11126 11127 Pageview.Meta.AddTag("og:title", Model.Title); 11128 Pageview.Meta.AddTag("og:site_name", Model.Name); 11129 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString()); 11130 Pageview.Meta.AddTag("og:type", "Website"); 11131 Pageview.Meta.AddTag("fb:page_id", Model.ID.ToString()); 11132 11133 @Model.MetaTags 11134 } 11135 11136 @helper RenderMasterCss() { 11137 var fonts = new string[] { 11138 getFontFamily("Layout", "HeaderFont"), 11139 getFontFamily("Layout", "SubheaderFont"), 11140 getFontFamily("Layout", "TertiaryHeaderFont"), 11141 getFontFamily("Layout", "BodyText"), 11142 getFontFamily("Layout", "Header", "ToolsFont"), 11143 getFontFamily("Layout", "Header", "NavigationFont"), 11144 getFontFamily("Layout", "MobileNavigation", "Font"), 11145 getFontFamily("ProductList", "Facets", "HeaderFont"), 11146 getFontFamily("ProductPage", "PriceFontDesign"), 11147 getFontFamily("Ecommerce", "SaleSticker", "Font"), 11148 getFontFamily("Ecommerce", "NewSticker", "Font"), 11149 getFontFamily("Ecommerce", "CustomSticker", "Font") 11150 }; 11151 11152 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks; 11153 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png"; 11154 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro"); 11155 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css"; 11156 if (useFontAwesomePro) 11157 { 11158 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css"; 11159 } 11160 11161 bool movetoproduction = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("movetoproduction")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("movetoproduction")) : false; 11162 11163 //Favicon 11164 <link href="@favicon" rel="icon" type="image/png"> 11165 11166 //Base (Default, wireframe) styles 11167 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css"> 11168 11169 //Rapido Css from Website Settings 11170 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css"> 11171 11172 //Ignite Css (Custom site specific styles) 11173 //<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=25"> 11174 11175 /*TODO remove and compile css*/ 11176 @* <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/custom.css?v=22"> *@ 11177 //Font awesome 11178 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css"> 11179 11180 //Flag icon 11181 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css"> 11182 11183 //Google fonts 11184 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x))); 11185 11186 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet"> 11187 bool featureFlagCSSFramework = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("feature")) && HttpContext.Current.Request.QueryString.Get("feature") == "cssframework"; 11188 /*if (featureFlagCSSFramework) 11189 {*/ 11190 11191 var cssStyleFileInfo = new System.IO.FileInfo(Dynamicweb.Core.SystemInformation.MapPath("/Files/Templates/Designs/Rapido/dist/app.bundle.css")); 11192 // <link rel="stylesheet" type="text/css" href="@autoCssBundleLink"> 11193 <link href="/Files/Templates/Designs/Rapido/dist/app.bundle.css?@cssStyleFileInfo.LastWriteTime.Ticks" rel="stylesheet" media="all" type="text/css"> 11194 @*} 11195 else 11196 { 11197 <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Rapido/dist/app.bundle.css"> 11198 11199 }*@ 11200 PushPromise(favicon); 11201 PushPromise(fontAwesomeCssLink); 11202 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css"); 11203 PushPromise(autoCssLink); 11204 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css"); 11205 PushPromise("/Files/Images/placeholder.gif"); 11206 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css"); 11207 } 11208 11209 @helper RenderMasterManifest() { 11210 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName"))) 11211 { 11212 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json"> 11213 PushPromise("/Files/Templates/Designs/Rapido/manifest.json"); 11214 } 11215 } 11216 11217 @helper RenderMasterBody() { 11218 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList(); 11219 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 11220 if (!String.IsNullOrEmpty(designLayout)) { 11221 designLayout = "class=\"" + designLayout + "\""; 11222 } 11223 11224 List<int> pages = new List<int>(); 11225 pages.Add(GetPageIdByNavigationTag("RecipeBank")); 11226 pages.Add(GetPageIdByNavigationTag("DeviationsHistoryPage")); 11227 pages.Add(GetPageIdByNavigationTag("MenuView")); 11228 pages.Add(GetPageIdByNavigationTag("MenuCalendarView")); 11229 pages.Add(GetPageIdByNavigationTag("ShoppingList")); 11230 pages.Add(GetPageIdByNavigationTag("CustomerOrders")); 11231 pages.Add(GetPageIdByNavigationTag("MenuCreationView")); 11232 List<int> availablePages = pages.Where(x=>x!=0).ToList(); 11233 11234 int currentPage = Pageview?.ID ?? 0; 11235 bool pageHasWhiteBackground = availablePages.Contains(currentPage); 11236 11237 <body @designLayout OnKeyPress="return disableEnterKey(event)" data-preloader-text='@Translate("loader reordering")' data-test="@Dynamicweb.Ecommerce.Common.Context.LanguageID" style="--comm-background: @(pageHasWhiteBackground ? "#FFF" : "#F9F7F6")"> 11238 @RenderBlockList(subBlocks) 11239 </body> 11240 } 11241 11242 @helper RenderMasterHeader() 11243 { 11244 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList(); 11245 //bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11246 bool isNavigationStickyMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11247 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : ""; 11248 11249 <header class="top-container @stickyTop dw-mod u-no-print" id="Top"> 11250 @RenderBlockList(subBlocks) 11251 </header> 11252 } 11253 11254 @helper RenderMain() 11255 { 11256 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList(); 11257 11258 <main class="site dw-mod"> 11259 @RenderBlockList(subBlocks) 11260 </main> 11261 } 11262 11263 @helper RenderPageContent() 11264 { 11265 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop"); 11266 string pagePos = isNavigationStickyMenu ? "js-page-pos" : ""; 11267 var cartPageUrl = GetPageIdByNavigationTag("CartPage"); 11268 11269 <div id="Page" class="page @pagePos" data-cart-url="@cartPageUrl"> 11270 <div id="content"> 11271 @RenderSnippet("Content") 11272 </div> 11273 </div> 11274 } 11275 11276 @* Hack to support nested helpers *@ 11277 @SnippetStart("Content") 11278 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 11279 11280 @using Degree.Kraemer.Ecommerce 11281 11282 @{ 11283 Dynamicweb.Security.UserManagement.User user = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 11284 var secondaryUser = Dynamicweb.Security.UserManagement.User.GetCurrentSecondaryUser(); 11285 var userId = user?.ID ?? null; 11286 var customerPriceGroup = user?.GetCustomerPriceGroup() ?? ""; 11287 var sessionLocation = user?.GetSessionLocation() ?? ""; 11288 var isLocalhost = HttpContext.Current.Request.Url.Host.ToLower() == "localhost"; 11289 11290 var shipOwner = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_ShipOwner").Value; 11291 var onlySeeDiverse = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Only_show_Diverse").Value.ToString(); 11292 11293 var showPackages = user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_Number_of_Cartons").Value.ToString(); 11294 var currentUserAccess = Dynamicweb.Security.UserManagement.User.GetCurrentFrontendUser(); 11295 var currentUserLocationCookie = HttpContext.Current.Request.Cookies["userLocation"] != null ? HttpContext.Current.Request.Cookies["userLocation"].Value : ""; 11296 var defaultUserLocation = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_LocationCode", StringComparison.OrdinalIgnoreCase)).Value.ToString() : ""; 11297 11298 var currentUserLocationDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(currentUserLocationCookie); 11299 var askoLocation = user != null ? user.CustomFieldValues.First(f => string.Equals(f.CustomField.SystemName, "AccessUser_Asko_Code", StringComparison.OrdinalIgnoreCase)).Value.ToString() : ""; 11300 var locationListDictionary = Pageview.AreaSettings.GetItem("Custom").GetItem("CustomSettings").GetList("Asko_User_Locations"); 11301 var locations = locationListDictionary?.ToString()?.Split(',')?.ToList(); 11302 var showFiltersText = Translate("Show more filters"); 11303 var hideFiltersText = Translate("Hide filters"); 11304 11305 var currentUserLocation = ""; 11306 if (currentUserLocationCookie != "") 11307 { 11308 foreach (KeyValuePair<string, string> entry in currentUserLocationDictionary) 11309 { 11310 if (entry.Key == "value") 11311 { 11312 currentUserLocation = entry.Value; 11313 } 11314 } 11315 } 11316 11317 var currentCookieLocationAskoCode = ""; 11318 foreach (var loc in locations) 11319 { 11320 string lettersCode, askoCode; 11321 string[] parts = loc.Split('|'); 11322 11323 if (parts.Length >= 3) 11324 { 11325 lettersCode = parts[1].Trim(); 11326 askoCode = parts[2].Trim(); 11327 11328 if (defaultUserLocation == lettersCode) 11329 { 11330 currentCookieLocationAskoCode = askoCode; 11331 break; 11332 } 11333 11334 if (defaultUserLocation == "" && currentUserLocation == lettersCode) 11335 { 11336 currentCookieLocationAskoCode = askoCode; 11337 break; 11338 } 11339 } 11340 } 11341 11342 var finalLocation = askoLocation != "" && askoLocation != "0" 11343 ? askoLocation 11344 : currentCookieLocationAskoCode != "" 11345 ? currentCookieLocationAskoCode 11346 : ""; 11347 } 11348 11349 <script type="text/javascript"> 11350 var serverData = { 11351 languageId: '@Dynamicweb.Ecommerce.Common.Context.LanguageID', 11352 searchString: '@HttpContext.Current.Request["Search"]', 11353 subcategoryLink: '@HttpContext.Current.Request["SubcategoryLink"]', 11354 rootGroupId: '@HttpContext.Current.Request["GroupId"]', 11355 rootGroupName: '@(string.IsNullOrWhiteSpace(@HttpContext.Current.Request["Search"]) ? new Degree.Kraemer.Ecommerce.Domain.EcomGroups.EcomGroupsService().GetById(HttpContext.Current.Request["GroupId"], "LANG17").Name : "")', 11356 productDetailsPageId: '@GetPageIdByNavigationTag("ProductsPage")', 11357 cartPageId: '@GetPageIdByNavigationTag("WebAPIAddToCart")', 11358 cartFeedPageId: '@GetPageIdByNavigationTag("MiniCartFeed")', 11359 userId: '@userId', 11360 customerPriceGroup: '@customerPriceGroup', 11361 sessionLocation: '@sessionLocation', 11362 isBreakablePermitted: '@(user?.CustomFieldValues.FirstOrDefault(f => f.CustomField.SystemName == "AccessUser_PermittedBreakage")?.Value?.ToString() == "True")' == 'True', 11363 currentUserLocation: '@(currentUserLocationCookie != "" ? currentUserLocationDictionary.TryGetValue("value", out var location) ? location: "" : "")', 11364 finalLocation: '@finalLocation', 11365 translations: { 11366 true: '@Translate("True")', 11367 false: '@Translate("False")', 11368 ASKO_Limited: '@Translate("ASKO_Limited")', 11369 ASKO_Unavailable: '@Translate("ASKO_Unavailable")', 11370 ASKO_Central_Warehouse: '@Translate("ASKO_Central_Warehouse")', 11371 Transit: '@Translate("Transit")', 11372 Merkeanordning: '@Translate("Merkeanordning")', 11373 Lagringstemperatur: '@Translate("Lagringstemperatur")', 11374 NorwegianProduct: '@Translate("NorwegianProduct")', 11375 Glutenfri: '@Translate("Glutenfri")', 11376 Laktosefri: '@Translate("Laktosefri")', 11377 TemperatureIcon: '@Translate("temperatureIcon")', 11378 SearchResultsFor: '@Translate("Search result for")', 11379 InvalidQuantity: '@Translate("Quantity error")', 11380 MinimumQuantity: '@Translate("Please insert the minimum quantity")', 11381 }, 11382 }; 11383 </script> 11384 11385 <script src="/Files/Templates/Designs/Rapido/js/vue/vue.global.js"></script> 11386 <script type="module" src="~/Files/Templates/Designs/Rapido/ProductsListAsync.js?1.0.1"></script> 11387 <link href="/Files/Templates/Designs/Rapido/ProductsListAsync.css?1.0.1" rel="stylesheet" type="text/css"> 11388 11389 11390 @*needed by the quick search scripts*@ 11391 <input type="hidden" id="showNumberOfCartons" value="@user?.CustomFieldValues?.FirstOrDefault(f => f.CustomField.SystemName == " AccessUser_Number_of_Cartons").Value.ToString()" /> 11392 @if (shipOwner?.ToString() == "26300") 11393 { 11394 <input type="hidden" id="shipOwnerValue" value="" /> 11395 } 11396 11397 @if (onlySeeDiverse?.ToString() == "True") 11398 { 11399 <input type="hidden" id="OnlySeeDiverse" value="" /> 11400 } 11401 11402 <div id="products-list" 11403 data-assortments="" 11404 data-userId="@user?.ID"> 11405 <div class="content-container dw-mod" v-cloak> 11406 <div class="grid grid--align-content-start main-container bs-gap-3 bs-mx-4"> 11407 <div class="filters bs-m-2"> 11408 @*categories (crappy recursion alternative but I'm running out of time...*@ 11409 @if (string.IsNullOrWhiteSpace(HttpContext.Current.Request["Search"])) 11410 { 11411 <div class="expand-container bs-mb-4" v-bind:class="{ 'open' : vm.navigationOpen }"> 11412 <label class="expand-title" 11413 v-on:click="(e) => vm.navigationOpen = !vm.navigationOpen"> 11414 <span>@Translate("Kategorier")</span> 11415 <i class="expand-icon fas fa-chevron-down" v-bind:class="{ 'open' : vm.navigationOpen }"></i> 11416 </label> 11417 <div class="expand-content"> 11418 <div class="categories-container"> 11419 <div class="group-link bs-mb-2" v-if="vm.currentGroup"> 11420 <a v-bind:class="{ 'active' : vm.currentGroup.Id == vm.serverData?.rootGroupId }" 11421 v-on:click="onRootGroupClick">@Translate("All")</a> 11422 </div> 11423 11424 <div v-for="(group) in vm.navigation"> 11425 <div class="group-link"> 11426 <a v-bind:class="{ 'active' : group.Id == vm.currentGroup.Id }" 11427 v-on:click="e => onGroupClick(e, group, null, true, true)">{{group.Name}}</a> 11428 11429 <i v-on:click="e => onGroupClick(e, group, null, true, false)" 11430 class="expand-icon fa" 11431 v-bind:class="{ 'expanded' : group.Expanded, 'fa-plus': !group.Expanded, 'fa-minus': group.Expanded }"></i> 11432 </div> 11433 <div class="subgroups-container" v-bind:class="{ 'expanded' : group.Expanded }"> 11434 11435 <div v-for="(level2) in group.groups"> 11436 <div class="group-link"> 11437 <a class="sub-level level-2" 11438 v-bind:class="{ 'active' : level2.Id == vm.currentGroup.Id }" 11439 v-on:click="e => onGroupClick(e, level2, null, false, true)">{{level2.Name}}</a> 11440 11441 <i v-on:click="e => onGroupClick(e, level2, null, false, false)" 11442 class="expand-icon fa" 11443 v-bind:class="{ 'expanded' : level2.Expanded, 'fa-plus': !level2.Expanded, 'fa-minus': level2.Expanded }"></i> 11444 </div> 11445 11446 <div class="subgroups-container" v-bind:class="{ 'expanded' : level2.Expanded }"> 11447 11448 <div v-for="(level3) in level2.groups"> 11449 <div class="group-link"> 11450 <a class="sub-level level-3" 11451 v-bind:class="{ 'active' : level3.Id == vm.currentGroup.Id }" 11452 v-on:click="e => onGroupClick(e, level3, null, false, true)">{{level3.Name}}</a> 11453 11454 <i v-on:click="e => onGroupClick(e, level3, null, false, false)" 11455 class="expand-icon fa" 11456 v-bind:class="{ 'expanded' : level3.Expanded, 'fa-plus': !level3.Expanded, 'fa-minus': level3.Expanded }"></i> 11457 </div> 11458 11459 <div class="subgroups-container" v-bind:class="{ 'expanded' : level3.Expanded }"> 11460 11461 <div v-for="(level4) in level3.groups"> 11462 <div class="group-link"> 11463 <a class="sub-level level-4" 11464 v-bind:class="{ 'active' : level4.Id == vm.currentGroup.Id }" 11465 v-on:click="e => onGroupClick(e, level4, true, false, true)">{{level4.Name}}</a> 11466 </div> 11467 </div> 11468 </div> 11469 </div> 11470 </div> 11471 </div> 11472 </div> 11473 </div> 11474 </div> 11475 </div> 11476 </div> 11477 } 11478 11479 @*facets*@ 11480 <button class="bs-d-flex bs-mx-auto bs-d-lg-none bs-justify-content-center btn--full btn btn--primary dw-mod" v-on:click="toggleFilters"> {{ filtersAreVisible ? '@hideFiltersText' : '@showFiltersText' }}</button> 11481 11482 <div class="filter-inner-container" v-bind:class="{'bs-d-none': !filtersAreVisible, 'bs-d-block': filtersAreVisible, 'bs-d-lg-flex': true}"> 11483 <div v-if="vm.searchStatus.inProgress" class="cover-up-loader"> 11484 <i class="fa-4x fas fa-circle-notch fa-spin"></i> 11485 </div> 11486 11487 <button type="button" class="btn show-apply-filters btn--full" v-on:click="search"> 11488 @Translate("ApplyFilters") 11489 </button> 11490 11491 @*facets*@ 11492 <template v-for="f in vm.facetsLookup"> 11493 <div class="expand-container" v-bind:class="{ 'open' : f.facet.isOpen }"> 11494 <label class="expand-title" 11495 v-on:click="(e) => onFacetHeaderClick(e, f)"> 11496 <span>{{translatedFacetName(f.facet.name)}}</span> 11497 <i class="expand-icon fas fa-chevron-down" v-bind:class="{ 'open' : f.facet.isOpen }"></i> 11498 </label> 11499 <div class="expand-content"> 11500 <section v-for="[k, v] in Object.entries(f.options).sort(([, A], [, B]) => B.Count - A.Count)" class="bs-mb-2"> 11501 <input type="checkbox" 11502 v-bind:checked="vm.selectedFacets[v.id]" 11503 v-on:change="(e) => onFacetClick(e, f.facet, v)" 11504 v-bind:id=v.id 11505 v-bind:name="v.id" 11506 v-bind:value="v.Label"> 11507 <label class="label-text" v-bind:for="v.id">{{v.Label}}</label> 11508 </section> 11509 </div> 11510 </div> 11511 </template> 11512 11513 <button type="button" class="btn show-apply-filters btn--full" v-on:click="search"> 11514 @Translate("ApplyFilters") 11515 </button> 11516 </div> 11517 11518 <!-- Back to top button --> 11519 <button id="back-to-top" type="button" v-on:click="onBackToTopClick"><i class="fas fa-arrow-up"></i></button> 11520 </div> 11521 11522 <div class="results bs-m-2"> 11523 <div class="header-container bs-d-flex bs-flex-column bs-flex-md-row bs-align-items-baseline"> 11524 <h2 id="lists-header" style="margin-top: 20px">{{vm.currentGroup.Name}}</h2> 11525 11526 <div class="search-in-progress d-flex bs-flex-column bs-gap-2 bs-mb-4 bs-mb-md-0" 11527 v-bind:class="{ 'visible' : vm.searchStatus.inProgress }"> 11528 <div class="d-flex bs-flex-row bs-align-items-center bs-gap-3"> 11529 <i class="fas fa-circle-notch fa-spin"></i> 11530 11531 <div class="progress-bar-container"> 11532 <div class="progress-indicator" v-bind:style="{ 'left' : vm.searchStatus.progressPercentage }"></div> 11533 </div> 11534 </div> 11535 <span class="bs-text-start bs-text-md-end" v-if="!!vm.serverData?.userId" v-bind:class="{ 'visible' : vm.searchStatus.inProgress && !!vm.serverData?.userId }">@Translate("We are loading your assortment")</span> 11536 <span class="bs-text-start bs-text-md-end" v-else v-bind:class="{ 'visible' : vm.searchStatus.inProgress && !vm.serverData?.userId }">@Translate("Loading products")</span> 11537 </div> 11538 11539 @*<div> 11540 <div class="u-inline-block u-bold mobile-tablet-hidden">@Translate("Sort by")</div> 11541 <select v-model="vm.sortData" v-bind:disabled="vm.searchStatus.inProgress"> 11542 <option value="Name:ASC">Alfabetisk A-Å</option> 11543 <option value="Name:DESC">Alfabetisk Å-A</option> 11544 <option value="TotalSales:DESC">Mest kjøpte</option> 11545 </select> 11546 </div>*@ 11547 </div> 11548 11549 <div v-if="!vm.searchStatus.inProgress && vm.searchStatus.totalProductsFound === 0"> 11550 @*no products found message*@ 11551 <div class="no-products-found">@Translate("No products found")</div> 11552 </div> 11553 11554 @*selected facets*@ 11555 <div v-if=" Object.keys(vm.selectedFacets).length > 0" class="selected-facets-container bs-mb-4"> 11556 <div v-for="[k, v] in Object.entries(vm.selectedFacets)" class="pill d-flex bs-gap-2" v-on:click="() => onRemoveSelectedFacetClick(v)" title="Fjern filter"> 11557 <span> {{v.name}} : {{v.optionLabel}} </span> 11558 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 11559 <line x1="18" y1="6" x2="6" y2="18"></line> 11560 <line x1="6" y1="6" x2="18" y2="18"></line> 11561 </svg> 11562 </div> 11563 </div> 11564 11565 @*list of groups*@ 11566 <div v-for="(group) in vm.groups" class="group-container"> 11567 <div v-if="group.productData"> 11568 <h6 class="group-title u-color-inherit" v-on:click="e => onListHeaderClick(e, group)">{{group.Name}}</h6> 11569 11570 <div class="d-flex bs-flex-column"> 11571 <div class="products-container"> 11572 @* products list start *@ 11573 <div v-for="(product) in group.productData.Products" 11574 class="list-item d-flex bs-flex-column bs-flex-md-row bs-justify-content-between bs-align-items-center" 11575 v-bind:class="{'discontinued': product.Discontinued}"> 11576 11577 @*left column*@ 11578 <div v-on:click="openProductDetailModal(product)" 11579 class="left-column d-flex bs-flex-row bs-align-items-center bs-p-3"> 11580 <div class="lightbox"> 11581 @*images*@ 11582 @*changed image paths on localhost so we don't have to store all the product images locally so see UI that's not screwed up by missing miages*@ 11583 @if (isLocalhost) 11584 { 11585 <img class="lightbox__image" 11586 src="https://api.invena.pl/images/product_image_placeholder.png" 11587 alt="Image placeholder for local development" 11588 loading="lazy" /> 11589 <img class="b-lazy b-loaded" 11590 style="max-height: 51px;" 11591 src="https://api.invena.pl/images/product_image_placeholder.png" 11592 alt="Image placeholder for local development" 11593 loading="lazy" /> 11594 } 11595 else 11596 { 11597 <img class="lightbox__image" 11598 v-bind:src="'/Admin/Public/GetImage.ashx?width=220&height=220&crop=5&Compression=75&image=Files/Images/Kraemer/RapidoProducts/' + product.Number + '.jpg'" 11599 v-bind:alt="product.Name" 11600 loading="lazy" 11601 v-on:error="handleImageError($event, 'lightbox')" /> 11602 <img class="b-lazy b-loaded" 11603 v-bind:src="'/Admin/Public/GetImage.ashx?width=70&height=40&FillCanvas=true&Compression=75&image=Files/Images/Kraemer/RapidoProducts/' + product.Number + '.jpg'" 11604 v-bind:alt="product.Name" 11605 loading="lazy" 11606 v-on:error="handleImageError($event, 'thumbnail')" /> 11607 } 11608 </div> 11609 <div class="d-flex bs-flex-column gap-5"> 11610 <div class="d-flex bs-align-items-center gap-1 gap-5 u-bold"> 11611 <div class="prod-number">{{product.Number}}</div> 11612 <i class="fas fa-circle"></i> 11613 <div class="product-title-container bs-align-items-center"> 11614 {{product.Name}} 11615 @*Norway flag*@ 11616 <img v-if="product.ProductFields.EPD_country_of_manufacture_code?.Value == 'NO'" height="18" src="/Admin/Images/Flags/flag_no.png" title="Opprinnelsesland/Produksjonsland Norge" alt="Norway flag" class="bs-ms-1 bs-d-inline-block bs-align-middle"> 11617 11618 </div> 11619 11620 </div> 11621 <div class="d-flex bs-align-items-center gap-1 gap-5"> 11622 @*transit icon*@ 11623 <div v-if="product.Transit" title="@Translate("Transit")"> 11624 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 11625 <circle cx="10" cy="10" r="10" fill="#0052A0"></circle> 11626 <path d="M14 6.66896H10.9916V15H8.96796V6.66896H6V5H14V6.66896Z" fill="white"></path> 11627 </svg> 11628 </div> 11629 11630 @*breakable icon*@ 11631 <div v-if="product.Breakable" title="@Translate("Anbrekksvare")"> 11632 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 11633 <circle cx="10" cy="10" r="10" fill="#0052A0" /> 11634 <path d="M11.7979 12.9492H8.20215L7.51855 15H5.33789L9.04297 5.04688H10.9434L14.6689 15H12.4883L11.7979 12.9492ZM8.75586 11.2881H11.2441L9.99316 7.5625L8.75586 11.2881Z" fill="white" /> 11635 </svg> 11636 </div> 11637 11638 @*maunfacturer*@ 11639 <span class="bs-text-uppercase manufacturer">{{product.ManufacturerName}}</span> 11640 11641 @*spacer*@ 11642 <i class="fas fa-circle"></i> 11643 11644 @*package info*@ 11645 <span>{{product.ProductFields.ProductShortDescriptionNav?.Value}}</span> 11646 11647 @*temperature icon*@ 11648 <i v-if="product.TemperatureIcon" v-bind:class="product.TemperatureIcon" v-bind:title="vm.serverData.translations.TemperatureIcon" class="bs-ms-2"></i> 11649 11650 @*askoLocation labels*@ 11651 @if (user != null) 11652 { 11653 <span class="bs-px-2 bs-rounded-3" 11654 style="background-color: #f1ff80;" 11655 v-if="product.WarehouseDescriptionCode" 11656 v-bind:title="vm.serverData.translations[product.WarehouseDescriptionCode]"> 11657 {{vm.serverData.translations[product.WarehouseDescriptionCode]}} 11658 </span> 11659 11660 <span class="bs-px-2 bs-rounded-3" 11661 style="background-color: #FFA773;" 11662 v-if="product.StockDescriptionCode" 11663 v-bind:title="vm.serverData.translations[product.StockDescriptionCode]"> 11664 {{vm.serverData.translations[product.StockDescriptionCode]}} 11665 </span> 11666 } 11667 </div> 11668 </div> 11669 </div> 11670 11671 @if (userId.HasValue) 11672 { 11673 @*right column*@ 11674 <div v-if="!product.Discontinued" class="right-column d-flex bs-flex-row bs-align-items-center gap-5 bs-p-lg-3 bs-justify-content-end"> 11675 @*unit*@ 11676 <span class="u-bold">{{product.PriceFormatted}} / {{product.Unit}}</span> 11677 11678 @*row actions*@ 11679 11680 <div class="row-actions-container d-flex bs-flex-row bs-align-items-center bs-position-relative"> 11681 @*row actions spinner*@ 11682 <div v-if="vm.cart.isBusy" class="cart-action-spinner"> 11683 <i class="fas fa-circle-notch fa-spin preloader bs-p-0"></i> 11684 </div> 11685 11686 11687 <div v-if="!vm.cart.isBusy" class="d-flex bs-flex-row bs-align-items-center gap-5"> 11688 @*remove from cart*@ 11689 <button class="button remove-from-cart" 11690 v-bind:disabled="product.isBusy || !Object.hasOwn(vm.cart.items, product.Id) || isButtonBlocked(product.Id)" 11691 v-on:click="() => removeFromCart(product)"> 11692 <i style="color: #0d3692" class="fa fa-trash"></i> 11693 </button> 11694 11695 @*add to cart*@ 11696 <button v-if="!(vm.cart.items ? Object.hasOwn(vm.cart.items, product.Id) : false)" 11697 v-bind:disabled="isButtonBlocked(product.Id)" 11698 v-on:click="() => addToCart(product)" 11699 class="cart-action btn btn--primary dw-mod" 11700 type="button"> 11701 <span class="u-flex u-flex--row" style="align-items: center;gap: 10px;justify-content: center"> 11702 <img v-if="!product.isBusy" width="18" height="18" src="/Files/Images/cart-button-icon-svg.svg" /> 11703 <i v-if="product.isBusy" class="fas fa-circle-notch fa-spin preloader bs-p-0"></i> 11704 </span> 11705 </button> 11706 11707 @*quantity selector*@ 11708 <div v-if="vm.cart.items ? Object.hasOwn(vm.cart.items, product.Id) : false" 11709 class="qty-selector @(showPackages == "False" ? "custom-margin" : "") bs-border bs-border-1 bs-border-primary bs-rounded-3 bs-position-relative"> 11710 11711 <button v-bind:disabled="product.Breakable ? vm.cart.items[product.Id].quantity <= 1 : vm.cart.items[product.Id].quantity <= product.Step" 11712 type="button" 11713 class="qty-input" 11714 v-on:click="(e) => onDecreaseQuantity(e, product)"> 11715 - 11716 </button> 11717 11718 <input v-bind:value="vm.cart.items[product.Id].quantity" 11719 v-on:keydown.down="(e) => onQuantityKeyDown(e, product)" 11720 v-on:keydown.up="(e) => onQuantityKeyDown(e, product)" 11721 v-on:input="(e) => onQuantityChange(e, product)" 11722 tabindex="0" 11723 class="qty-input-textbox u-no-margin bs-border-0 bs-p-0" 11724 v-bind:id="'quantity-input-' + product.Id"> 11725 11726 <button type="button" class="qty-input" v-on:click="(e) => onIncreaseQuantity(e, product)">+</button> 11727 11728 @*spinner when product is busy*@ 11729 <div v-if="product.isBusy" class="qty-overlay-spinner"> 11730 <i class="fas fa-circle-notch fa-spin"></i> 11731 </div> 11732 <div v-if="isButtonBlocked(product.Id)" class="qty-overlay-spinner"> 11733 </div> 11734 11735 @*warning when auto updated quantity after it has been typed from keyboard*@ 11736 <div class="qty-warning bs-py-3 bs-bg-white bs-border-primary bs-border bs-border-1 bs-rounded-3" 11737 v-bind:class="{ 'open' : product.showQuantityWarning }" 11738 v-on:click="() => hideQuantityWarning(product)"> 11739 {{product.QuantityWarning}} 11740 </div> 11741 </div> 11742 11743 @*packages count*@ 11744 @if (showPackages == "True") 11745 { 11746 <div class="no-of-cases bs-fw-bold"> 11747 <span v-if="Object.hasOwn(vm.cart.items, product.Id) && vm.cart.items[product.Id]?.cases" 11748 v-bind:class="{ 'disabled' : parseInt(vm.cart.items[product.Id]?.cases ?? 0, 10) % product.QtyPerCase == 0 }"> 11749 {{vm.cart.items[product.Id]?.cases}} KS 11750 </span> 11751 </div> 11752 } 11753 </div> 11754 </div> 11755 11756 11757 @*favourites modal*@ 11758 <div class="bs-position-relative"> 11759 @*modal trigger*@ 11760 <div class="fav-list-trigger" 11761 v-bind:class="{ 'open' : product.FavOpen }" 11762 title="Legg til i favorittliste" 11763 v-on:click="() => onFavouritesIconClick(product)"> 11764 <img v-if="hasProduct(vm.productsOnFavouritesLookup, product.Id)" height="26" width="26" src="/Files/Images/favorite-list-Filled.svg"> 11765 <img v-else="hasProduct(vm.productsOnFavouritesLookup, product.Id)" height="26" width="26" src="/Files/Images/favorite-list-svg.svg"> 11766 </div> 11767 11768 @*modal content*@ 11769 <div class="fav-lists-modal bs-fs-6 bs-position-absolute bs-py-3 bs-bg-white bs-border-primary bs-border bs-border-1 bs-rounded-3 d-flex bs-flex-column gap-5" 11770 v-bind:class="{ 'open' : product.FavOpen }"> 11771 11772 <div v-for="f in vm.favourites" 11773 class="fav-list-item d-flex bs-flex-row gap-5 bs-px-3 bs-py-1 bs-position-relative" 11774 v-on:click="(e) => onListClick(e, f, product)"> 11775 <img v-if="vm.productsOnFavouritesLookup[f.Id][product.Id]" height="20" width="20" src="/Files/Images/favorite-list-Filled.svg"> 11776 <img v-else height="20" width="20" src="/Files/Images/favorite-list-svg.svg"> 11777 <div>{{f.Name}}</div> 11778 11779 @*busy indicator*@ 11780 <div class="list-busy-indicator" v-if="f.isBusy"> 11781 <i class="fas fa-circle-notch fa-spin"></i> 11782 </div> 11783 </div> 11784 </div> 11785 </div> 11786 </div> 11787 } 11788 </div> 11789 @* products list end *@ 11790 </div> 11791 11792 @* load more button *@ 11793 <button type="button" class="btn show-more" v-on:click="() => loadMoreProducts(group)" v-bind:disabled="(group?.fetching ? true : false) || (getLoadedProductsCount(group.productData) >= group.productData.TotalProductsCount)"> 11794 <span>Vis Mer ({{getLoadedProductsCount(group.productData)}} av {{group.productData.TotalProductsCount}})</span> 11795 <i v-if="group?.fetching" class="fas fa-circle-notch fa-spin" style="margin-left: 12px;"></i> 11796 </button> 11797 </div> 11798 </div> 11799 11800 </div> 11801 </div> 11802 </div> 11803 </div> 11804 11805 @* Product detail modal start *@ 11806 11807 <div v-if="showProductDetailModal" class="modal-overlay showPDPModal" v-on:click="closeModal" v-bind:class="{'bs-d-block': showProductDetailModal}" style="display:none"> 11808 <div class="modal modal--full modal-height--full"> 11809 <div class="modal-content" v-on:click.stop> 11810 <div class="modal__header modal-header bs-py-2 bs-justify-content-end"> 11811 <div class="close-btn" v-on:click="closeModal"> 11812 <img width="30" height="30" src="/Files/Images/icon-times-close.svg" title="close"> 11813 </div> 11814 </div> 11815 <div class="modal__body modal__body--full"> 11816 <section class="bs-d-flex bs-flex-column bs-flex-lg-row bs-gap-6 product__top dw-mod bs-p-4"> 11817 <div class="bs-p-3 bs-bg-white bs-rounded"> 11818 <img class="b-lazy b-loaded" 11819 v-bind:src="'/Admin/Public/GetImage.ashx?Width=350&Height=350&Crop=5&DoNotUpscale=True&FillCanvas=True&image=Files/Images/Kraemer/RapidoProducts/' + productDetail.Number + '.jpg'" 11820 v-bind:alt="productDetail.Name" 11821 v-on:error="handleImageError($event, 'detail')" 11822 loading="lazy" /> 11823 </div> 11824 <div class="bs-d-flex bs-flex-column bs-align-items-baseline bs-flex-fill"> 11825 <h1 class="product-title"> 11826 {{productDetail.Name}} 11827 <i v-if="productDetail.TemperatureIcon" v-bind:class="productDetail.TemperatureIcon" title="{{productDetail.TemperatureIconText}}" class="bs-ms-2"></i> 11828 </h1> 11829 <span class="item-number dw-mod d-inline-block">{{productDetail.Number}}</span> 11830 <span class="item-brand bs-text-uppercase">{{productDetail.ManufacturerName}}</span> 11831 11832 <img v-if="productDetail.ProductFields.EPD_country_of_manufacture_code?.Value" height="24" width="24" :src="'/Admin/Images/Flags/flag_' + productDetail.ProductFields.EPD_country_of_manufacture_code?.Value + '.png'" :title="productDetail.ProductFields.EPD_country_of_manufacture_code?.Value" alt="Norway flag" class="bs-mb-2 bs-ms-1 bs-d-inline-block bs-align-middle"> 11833 11834 <span class="bs-px-2 bs-rounded-3 bs-mb-2" 11835 style="background-color: #f1ff80;" 11836 v-if="productDetail.WarehouseDescriptionCode" 11837 v-bind:title="productDetail.WarehouseDescriptionCode"> 11838 {{vm.serverData.translations[productDetail.WarehouseDescriptionCode]}} 11839 11840 </span> 11841 11842 <span class="bs-px-2 bs-rounded-3 bs-mb-2" 11843 style="background-color: #FFA773;" 11844 v-if="productDetail.StockDescriptionCode" 11845 v-bind:title="productDetail.StockDescriptionCode"> 11846 {{vm.serverData.translations[productDetail.StockDescriptionCode]}} 11847 </span> 11848 <span class="introduction-text u-margin-top--lg">{{productDetail.ProductFields.ProductShortDescriptionNav?.Value}}</span> 11849 11850 <div class="bs-d-flex bs-justify-content-between bs-w-100 bs-mb-2"> 11851 <div class="bs-d-flex bs-gap-1"> 11852 <div v-for="icon in filteredBrandsIcons" 11853 :key="icon.name" 11854 class="product-icon"> 11855 <a :href="icon.url" target="_blank" class="bs-cursor-pointer"> 11856 <img :src="'/Files/Images/Kraemer/Icons/' + icon.name + '_bnw.png'" :alt="icon.name" /> 11857 </a> 11858 </div> 11859 </div> 11860 11861 <div class="bs-d-flex bs-gap-1 bs-align-self-end"> 11862 <div v-for="icon in filteredMarkingIcons" :key="icon.name"> 11863 <div class="product-icon"> 11864 <img :src="'/Files/Images/Kraemer/Icons/' + icon.path + '.png'" :alt="icon.name" :title="icon.name" /> 11865 </div> 11866 </div> 11867 </div> 11868 </div> 11869 11870 @if (userId.HasValue) 11871 { 11872 <span v-if="!productDetail.Discontinued" class="u-bold bs-mt-5">{{productDetail.PriceFormatted}} / {{productDetail.Unit}}</span> 11873 11874 <div v-if="!vm.cart.isBusy && !productDetail.Discontinued" class="d-flex bs-flex-row bs-align-items-center bs-gap-3 bs-py-2"> 11875 @*remove from cart*@ 11876 <button class="button remove-from-cart" 11877 v-bind:disabled="productDetail.isBusy || !Object.hasOwn(vm.cart.items, productDetail.Id)" 11878 v-on:click="() => removeFromCart(productDetail)"> 11879 <i style="color: #0d3692" class="fa fa-trash"></i> 11880 </button> 11881 11882 @*add to cart*@ 11883 <button v-if="!(vm.cart.items ? Object.hasOwn(vm.cart.items, productDetail.Id) : false)" 11884 v-on:click="() => addToCart(productDetail)" 11885 class="cart-action btn btn--primary dw-mod" 11886 type="button"> 11887 <span class="u-flex u-flex--row" style="align-items: center;gap: 10px;justify-content: center"> 11888 <img v-if="!productDetail.isBusy" width="18" height="18" src="/Files/Images/cart-button-icon-svg.svg" /> 11889 <i v-if="productDetail.isBusy" class="fas fa-circle-notch fa-spin preloader bs-p-0"></i> 11890 </span> 11891 </button> 11892 11893 @*quantity selector*@ 11894 <div v-if="vm.cart.items ? Object.hasOwn(vm.cart.items, productDetail.Id) : false" 11895 class="qty-selector @(showPackages == "False" ? "custom-margin" : "") bs-border bs-border-1 bs-border-primary bs-rounded-3 bs-position-relative"> 11896 11897 <button v-bind:disabled="productDetail.Breakable ? vm.cart.items[productDetail.Id].quantity <= 1 : vm.cart.items[productDetail.Id].quantity <= productDetail.Step" 11898 type="button" 11899 class="qty-input" 11900 v-on:click="(e) => onDecreaseQuantity(e, productDetail)"> 11901 - 11902 </button> 11903 11904 <input type="number" 11905 v-bind:value="vm.cart.items[productDetail.Id].quantity" 11906 v-on:keydown="(e) => onQuantityKeyDown(e, productDetail)" 11907 tabindex="0" min="1" step="1" 11908 class="u-no-margin bs-border-0 bs-p-0" 11909 v-bind:id="'quantity-input-' + productDetail.Id"> 11910 11911 <button type="button" class="qty-input" v-on:click="(e) => onIncreaseQuantity(e, productDetail)">+</button> 11912 11913 @*spinner when product is busy*@ 11914 <div v-if="productDetail.isBusy" class="qty-overlay-spinner"> 11915 <i class="fas fa-circle-notch fa-spin"></i> 11916 </div> 11917 </div> 11918 11919 @*packages count*@ 11920 @if (showPackages == "True") 11921 { 11922 <div class="no-of-cases bs-fw-bold"> 11923 <span v-if="Object.hasOwn(vm.cart.items, productDetail.Id) && vm.cart.items[productDetail.Id]?.cases" 11924 v-bind:class="{ 'disabled' : parseInt(vm.cart.items[productDetail.Id]?.cases ?? 0, 10) % productDetail.QtyPerCase == 0 }"> 11925 {{vm.cart.items[productDetail.Id]?.cases}} KS 11926 </span> 11927 </div> 11928 } 11929 </div> 11930 } 11931 </div> 11932 </section> 11933 11934 <section class="product__info bs-p-2"> 11935 <div class="tabs__list dw-mod"> 11936 <label v-on:click="selectedTab = 'DescriptionBlock'" :class="{ active: selectedTab === 'DescriptionBlock' }" for="DescriptionBlock" class="tabs__label dw-mod">@Translate("Varebeskrivelse")</label> 11937 <label v-on:click="selectedTab = 'DeclarationsBlock'" :class="{ active: selectedTab === 'DeclarationsBlock' }" for="DeclarationsBlock" class="tabs__label dw-mod">@Translate("Varedeklerasjon")</label> 11938 <label v-on:click="selectedTab = 'AllergensBlock'" :class="{ active: selectedTab === 'AllergensBlock' }" for="AllergensBlock" class="tabs__label dw-mod">@Translate("Allergener")</label> 11939 </div> 11940 11941 <div class="tab-content"> 11942 <div v-if="selectedTab === 'DescriptionBlock'" class="bs-p-5 tab"> 11943 <table class="table table--compact description-table tab-content-width"> 11944 <tbody> 11945 <tr><th>Varenummer</th><td>{{productDetail.Number}}</td></tr> 11946 <tr><th>Navn</th><td>{{productDetail.Name}}</td></tr> 11947 <tr><th>Produsent</th><td>{{productDetail.ManufacturerName}}</td></tr> 11948 <tr><th>Pakning</th><td>{{productDetail.PriceFormatted}} / {{productDetail.Unit}}</td></tr> 11949 </tbody> 11950 </table> 11951 </div> 11952 11953 <div v-if="selectedTab === 'DeclarationsBlock'" class="bs-p-5 tab"> 11954 <p class="tab-content-width" v-if="productDetail?.ProductFields?.EPD_Ingredients?.Value || productDetail?.ProductFields?.kr_declaration?.Value"> 11955 <span class="bs-fw-bold">@Translate("Deklarasjon"):</span> 11956 <span v-html="productDetail?.ProductFields?.EPD_Ingredients?.Value || productDetail?.ProductFields?.kr_declaration?.Value"></span> 11957 </p> <span class="bs-fw-bold">@Translate("Næringsinnhold pr 100g"):</span> 11958 <table class="table table--compact declarations-table tab-content-width"> 11959 <tbody> 11960 <tr><th>@Translate("Kilojoule")</th><td>{{productDetail.ProductFields?.kr_kilojoule?.Value || "n/a"}}</td></tr> 11961 <tr><th>@Translate("Kcal")</th><td>{{productDetail.ProductFields?.kr_kcal?.Value || "n/a"}}</td></tr> 11962 <tr><th>@Translate("Protein")</th><td>{{productDetail.ProductFields?.kr_protein?.Value || "n/a"}}</td></tr> 11963 <tr><th>@Translate("Karbohydrat")</th><td>{{productDetail.ProductFields?.kr_karbohydray?.Value || "n/a"}}</td></tr> 11964 <tr><th>@Translate("Sukker")</th><td>{{productDetail.ProductFields?.kr_sukker?.Value || "n/a"}}</td></tr> 11965 <tr><th>@Translate("Fett")</th><td>{{productDetail.ProductFields?.kr_fett?.Value || "n/a"}}</td></tr> 11966 <tr><th>@Translate("Mettede fettsyrer")</th><td>{{productDetail.ProductFields?.kr_mettede_fettsyrer?.Value || "n/a"}}</td></tr> 11967 <tr><th>@Translate("Flerumettede")</th><td>{{productDetail.ProductFields?.kr_flerumettede?.Value || "n/a"}}</td></tr> 11968 <tr><th>@Translate("Kostfiber")</th><td>{{productDetail.ProductFields?.kr_kostfiber?.Value || "n/a"}}</td></tr> 11969 <tr><th>@Translate("Natrium")</th><td>{{productDetail.ProductFields?.kr_natrium?.Value || "n/a"}}</td></tr> 11970 <tr><th>@Translate("Jern")</th><td>{{productDetail.ProductFields?.kr_jern?.Value || "n/a"}}</td></tr> 11971 <tr><th>@Translate("Kalium")</th><td>{{productDetail.ProductFields?.kr_kalium?.Value || "n/a"}}</td></tr> 11972 <tr><th>@Translate("Okologisk")</th><td> {{productDetail.ProductFields?.kr_okologisk?.Value || "n/a"}}</td></tr> 11973 <tr><th>@Translate("Genmodifisert")</th><td>{{productDetail.ProductFields?.kr_genmodifisert?.Value || "n/a"}}</td></tr> 11974 <tr><th>@Translate("Allergitestet")</th><td>{{productDetail.ProductFields?.kr_allergitestet?.Value || "n/a"}}</td></tr> 11975 </tbody> 11976 </table> 11977 </div> 11978 11979 <div v-if="selectedTab === 'AllergensBlock'" class="bs-p-5 tab"> 11980 <div class="bs-d-flex bs-flex-column bs-flex-lg-row bs-gap-6"> 11981 <div> 11982 <table class="table table--compact allergens-table"> 11983 <tbody> 11984 <tr><th>@Translate("Egg")</th><td>{{productDetail.ProductFields?.kr_egg?.Value ? (productDetail.ProductFields.kr_egg.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_egg.Value) : "n/a"}}</td></tr> 11985 <tr><th>@Translate("Fisk")</th><td>{{productDetail.ProductFields?.kr_fisk?.Value ? (productDetail.ProductFields.kr_fisk.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_fisk.Value) : "n/a"}}</td></tr> 11986 <tr><th>@Translate("Gluten")</th><td>{{productDetail.ProductFields?.kr_gluten?.Value ? (productDetail.ProductFields.kr_gluten.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_gluten.Value) : "n/a"}}</td></tr> 11987 <tr><th>@Translate("Melk")</th><td>{{productDetail.ProductFields?.kr_melk?.Value ? (productDetail.ProductFields.kr_melk.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_melk.Value) : "n/a"}}</td></tr> 11988 <tr><th>@Translate("Nøtter")</th><td>{{productDetail.ProductFields?.kr_notter?.Value ? (productDetail.ProductFields.kr_notter.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_notter.Value) : "n/a"}}</td></tr> 11989 <tr><th>@Translate("Peanøtter")</th><td>{{productDetail.ProductFields?.kr_peanotter?.Value ? (productDetail.ProductFields.kr_peanotter.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_peanotter.Value) : "n/a"}}</td></tr> 11990 <tr><th>@Translate("Selleri")</th><td>{{productDetail.ProductFields?.kr_selleri?.Value ? (productDetail.ProductFields.kr_selleri.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_selleri.Value) : "n/a"}}</td></tr> 11991 <tr><th>@Translate("Sennep")</th><td>{{productDetail.ProductFields?.kr_sennep?.Value ? (productDetail.ProductFields.kr_sennep.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_sennep.Value) : "n/a"}}</td></tr> 11992 <tr><th>@Translate("Sesam")</th><td>{{productDetail.ProductFields?.kr_sesam?.Value ? (productDetail.ProductFields.kr_sesam.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_sesam.Value) : "n/a"}}</td></tr> 11993 <tr><th>@Translate("Skalldyr")</th><td>{{productDetail.ProductFields?.kr_skalldyr?.Value ? (productDetail.ProductFields.kr_skalldyr.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_skalldyr.Value) : "n/a"}}</td></tr> 11994 <tr><th>@Translate("Soya")</th><td>{{productDetail.ProductFields?.kr_soya?.Value ? (productDetail.ProductFields.kr_soya.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_soya.Value) : "n/a"}}</td></tr> 11995 <tr><th>@Translate("Sulfitt")</th><td>{{productDetail.ProductFields?.kr_sulfitt?.Value ? (productDetail.ProductFields.kr_sulfitt.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_sulfitt.Value) : "n/a"}}</td></tr> 11996 <tr><th>@Translate("Bløtdyr")</th><td>{{productDetail.ProductFields?.kr_blotdyr?.Value ? (productDetail.ProductFields.kr_blotdyr.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_blotdyr.Value) : "n/a"}}</td></tr> 11997 <tr><th>@Translate("Lupiner")</th><td>{{productDetail.ProductFields?.kr_lupiner?.Value ? (productDetail.ProductFields.kr_lupiner.Value === "NEI" ? "FRI" : productDetail.ProductFields.kr_lupiner.Value) : "n/a"}}</td></tr> 11998 11999 </tbody> 12000 </table> 12001 </div> 12002 12003 <div> 12004 <table class="table table--compact"> 12005 <tbody> 12006 <tr><td><strong>@Translate("JA")</strong> - @Translate("Inneholder")...</td> <td><strong>@Translate("KAN")</strong> - @Translate("Kan inneholde spor av")...</td></tr> 12007 <tr><td><strong>@Translate("FRI")</strong> - @Translate("Fri for")...</td> <td><strong>@Translate("UKJ")</strong> - @Translate("Ukjent om den inneholder spor av")...</td></tr> 12008 12009 <tr><th colspan="2"><strong>n/a</strong> - @Translate("Ubehandled")</th></tr> 12010 </tbody> 12011 </table> 12012 <div class='disclaimer'> 12013 <i style='opacity:0.7'> 12014 @Translate("AllergenDisclaimer", "Merk at all allergeninformasjon må brukes med varsomhet og kun forstås som veiledende. Den som tilbereder/serverer mat til en allergiker må alltid lese varens/pakningens ingrediensliste nøye.</br> Den enkelte produsent er ansvarlig for kvalitetssikring av varedeklarasjon. Det tas forbehold om avvik; det er derfor nødvendig å sjekke forpakning g eller kontakte produsent ved behov for garanti.</br>Hvis produsent har varslet om alvorlige feil i varedeklarasjon, vil dette også bli formidlet til berørte kunder.") 12015 </i> 12016 </div> 12017 </div> 12018 </div> 12019 </div> 12020 </div> 12021 </section> 12022 </div> 12023 </div> 12024 </div> 12025 </div> 12026 @* Product detail modal end *@ 12027 </div> 12028 12029 @SnippetEnd("Content") 12030 12031 @helper RenderIosTabletFix() { 12032 12033 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios) 12034 { 12035 <script> 12036 var cartPageUrl = document.querySelector("#Page").getAttribute("data-cart-url"); 12037 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream; 12038 if (isIpadIOS) { 12039 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&"; 12040 var isCheckout = (window.location.href.indexOf(cartPageUrl) > -1) ? true : false; 12041 if(isCheckout) { 12042 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios&CartV2.GotoStep1=true"; 12043 } else { 12044 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios"; 12045 } 12046 } 12047 </script> 12048 } 12049 } 12050 12051 </html> 12052 12053 <script> 12054 function disableEnterKey(e) 12055 { 12056 var key; 12057 if(window.event) 12058 key = window.event.keyCode; //IE 12059 else 12060 key = e.which; //firefox 12061 12062 return (key != 13); 12063 } 12064 </script>