Error executing template "Designs/Rapido/Paragraph/ParagraphContainer.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_1d53f92527fc4c1cbd7e653544483950.Execute() in E:\Dynamicweb.net\Solutions\FlexMedia\sensor.dw9.dynamicweb-cms.com\Files\Templates\Designs\Rapido\Paragraph\ParagraphContainer.cshtml:line 2736
   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.ParagraphViewModel> 2 @using System.Collections.Generic 3 @using System 4 @using System.Text.RegularExpressions 5 @using Dynamicweb.Core 6 @using Dynamicweb.Rapido.Blocks.Components.General 7 @using Dynamicweb.Rapido.Blocks.Components 8 @using Dynamicweb.Environment 9 10 @functions { 11 public string GenerateRgba(string color, double opacity) 12 { 13 color = color.Replace("#", ""); 14 if (color.Length == 6) { 15 return "rgba(" + Convert.ToInt32(color.Substring(0, 2), 16) + ", " + Convert.ToInt32(color.Substring(2, 2), 16) + ", " + Convert.ToInt32(color.Substring(4, 2), 16) + ", " + opacity + ");"; 16 } else { 17 return Convert.ToInt16(color).ToString(); 18 } 19 } 20 } 21 22 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@ 23 @using System.Text.RegularExpressions 24 @using System.Collections.Generic 25 @using System.Reflection 26 @using System.Web 27 @using System.Web.UI.HtmlControls 28 @using Dynamicweb.Rapido.Blocks.Components 29 @using Dynamicweb.Rapido.Blocks.Components.Articles 30 @using Dynamicweb.Rapido.Blocks.Components.Documentation 31 @using Dynamicweb.Rapido.Blocks 32 33 34 @*--- START: Base block renderers ---*@ 35 36 @helper RenderBlockList(List<Block> blocks) 37 { 38 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 39 blocks = blocks.OrderBy(item => item.SortId).ToList(); 40 41 foreach (Block item in blocks) 42 { 43 if (debug) { 44 <!-- Block START: @item.Id --> 45 } 46 47 if (item.Design == null) 48 { 49 @RenderBlock(item) 50 } 51 else if (item.Design.RenderType == RenderType.None) { 52 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 53 54 <div class="@cssClass dw-mod"> 55 @RenderBlock(item) 56 </div> 57 } 58 else if (item.Design.RenderType != RenderType.Hide) 59 { 60 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 61 62 if (!item.SkipRenderBlocksList) { 63 if (item.Design.RenderType == RenderType.Row) 64 { 65 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 66 @RenderBlock(item) 67 </div> 68 } 69 70 if (item.Design.RenderType == RenderType.Column) 71 { 72 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 73 string size = item.Design.Size ?? "12"; 74 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 75 76 <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"> 77 @RenderBlock(item) 78 </div> 79 } 80 81 if (item.Design.RenderType == RenderType.Table) 82 { 83 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 84 @RenderBlock(item) 85 </table> 86 } 87 88 if (item.Design.RenderType == RenderType.TableRow) 89 { 90 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 91 @RenderBlock(item) 92 </tr> 93 } 94 95 if (item.Design.RenderType == RenderType.TableColumn) 96 { 97 <td class="@cssClass dw-mod" id="Block__@item.Id"> 98 @RenderBlock(item) 99 </td> 100 } 101 102 if (item.Design.RenderType == RenderType.CardHeader) 103 { 104 <div class="card-header @cssClass dw-mod"> 105 @RenderBlock(item) 106 </div> 107 } 108 109 if (item.Design.RenderType == RenderType.CardBody) 110 { 111 <div class="card @cssClass dw-mod"> 112 @RenderBlock(item) 113 </div> 114 } 115 116 if (item.Design.RenderType == RenderType.CardFooter) 117 { 118 <div class="card-footer @cssClass dw-mod"> 119 @RenderBlock(item) 120 </div> 121 } 122 } 123 else 124 { 125 @RenderBlock(item) 126 } 127 } 128 129 if (debug) { 130 <!-- Block END: @item.Id --> 131 } 132 } 133 } 134 135 @helper RenderBlock(Block item) 136 { 137 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 138 139 if (item.Template != null) 140 { 141 @BlocksPage.RenderTemplate(item.Template) 142 } 143 144 if (item.Component != null) 145 { 146 string customSufix = "Custom"; 147 string methodName = item.Component.HelperName; 148 149 ComponentBase[] methodParameters = new ComponentBase[1]; 150 methodParameters[0] = item.Component; 151 Type methodType = this.GetType(); 152 153 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 154 155 try { 156 if (debug) { 157 <!-- Component: @methodName.Replace("Render", "") --> 158 } 159 if(customMethod != null) { 160 @customMethod.Invoke(this, methodParameters).ToString(); 161 } else { 162 MethodInfo generalMethod = methodType.GetMethod(methodName); 163 @generalMethod.Invoke(this, methodParameters).ToString(); 164 } 165 } catch { 166 try { 167 MethodInfo generalMethod = methodType.GetMethod(methodName); 168 @generalMethod.Invoke(this, methodParameters).ToString(); 169 } catch(Exception ex) { 170 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 171 } 172 } 173 } 174 175 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 176 { 177 @RenderBlockList(item.BlocksList) 178 } 179 } 180 181 @*--- END: Base block renderers ---*@ 182 183 184 @* Include the components *@ 185 @using Dynamicweb.Rapido.Blocks.Components 186 @using Dynamicweb.Rapido.Blocks.Components.General 187 @using Dynamicweb.Rapido.Blocks 188 @using System.IO 189 190 @* Required *@ 191 @using Dynamicweb.Rapido.Blocks.Components 192 @using Dynamicweb.Rapido.Blocks.Components.General 193 @using Dynamicweb.Rapido.Blocks 194 195 196 @helper Render(ComponentBase component) 197 { 198 if (component != null) 199 { 200 @component.Render(this) 201 } 202 } 203 204 @* Components *@ 205 @using System.Reflection 206 @using Dynamicweb.Rapido.Blocks.Components.General 207 208 209 @* Component *@ 210 211 @helper RenderIcon(Icon settings) 212 { 213 if (settings != null) 214 { 215 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 216 217 if (settings.Name != null) 218 { 219 if (string.IsNullOrEmpty(settings.Label)) 220 { 221 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 222 } 223 else 224 { 225 if (settings.LabelPosition == IconLabelPosition.Before) 226 { 227 <div class="u-flex u-flex--align-items-center @settings.CssClass">@settings.Label <i class="@settings.Prefix @settings.Name u-margin-left" @color></i></div> 228 } 229 else 230 { 231 <div class="u-flex u-flex--align-items-center @settings.CssClass"><i class="@settings.Prefix @settings.Name u-margin-right--lg u-w20px" @color></i>@settings.Label</div> 232 } 233 } 234 } 235 else if (!string.IsNullOrEmpty(settings.Label)) 236 { 237 @settings.Label 238 } 239 } 240 } 241 @using System.Reflection 242 @using Dynamicweb.Rapido.Blocks.Components.General 243 @using Dynamicweb.Rapido.Blocks.Components 244 @using Dynamicweb.Core 245 246 @* Component *@ 247 248 @helper RenderButton(Button settings) 249 { 250 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 251 { 252 Dictionary<string, string> attributes = new Dictionary<string, string>(); 253 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 254 if (settings.Disabled) { 255 attributes.Add("disabled", "true"); 256 classList.Add("disabled"); 257 } 258 259 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 260 { 261 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 262 @RenderConfirmDialog(settings); 263 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 264 } 265 266 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 267 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 268 if (!string.IsNullOrEmpty(settings.AltText)) 269 { 270 attributes.Add("title", settings.AltText); 271 } 272 else if (!string.IsNullOrEmpty(settings.Title)) 273 { 274 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty); 275 cleanTitle = cleanTitle.Replace("&nbsp;", " "); 276 attributes.Add("title", cleanTitle); 277 } 278 279 var onClickEvents = new List<string>(); 280 if (!string.IsNullOrEmpty(settings.OnClick)) 281 { 282 onClickEvents.Add(settings.OnClick); 283 } 284 if (!string.IsNullOrEmpty(settings.Href)) 285 { 286 onClickEvents.Add("location.href='" + settings.Href + "'"); 287 } 288 if (onClickEvents.Count > 0) 289 { 290 attributes.Add("onClick", string.Join(";", onClickEvents)); 291 } 292 293 if (settings.ButtonLayout != ButtonLayout.None) 294 { 295 classList.Add("btn"); 296 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 297 if (btnLayout == "linkclean") 298 { 299 btnLayout = "link-clean"; //fix 300 } 301 classList.Add("btn--" + btnLayout); 302 } 303 304 if (settings.Icon == null) 305 { 306 settings.Icon = new Icon(); 307 } 308 309 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : ""; 310 settings.Icon.Label = settings.Title; 311 312 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 313 314 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 315 } 316 } 317 318 @helper RenderConfirmDialog(Button settings) 319 { 320 Modal confirmDialog = new Modal { 321 Id = settings.Id, 322 Width = ModalWidth.Sm, 323 Heading = new Heading 324 { 325 Level = 2, 326 Title = settings.ConfirmTitle 327 }, 328 BodyText = settings.ConfirmText 329 }; 330 331 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 332 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 333 334 @Render(confirmDialog) 335 } 336 @using Dynamicweb.Rapido.Blocks.Components.General 337 @using Dynamicweb.Rapido.Blocks.Components 338 @using Dynamicweb.Core 339 340 @helper RenderDashboard(Dashboard settings) 341 { 342 var widgets = settings.GetWidgets(); 343 344 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 345 { 346 //set bg color for them 347 348 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 349 int r = Convert.ToInt16(color.R); 350 int g = Convert.ToInt16(color.G); 351 int b = Convert.ToInt16(color.B); 352 353 var count = widgets.Length; 354 var max = Math.Max(r, Math.Max(g, b)); 355 double step = 255.0 / (max * count); 356 var i = 0; 357 foreach (var widget in widgets) 358 { 359 i++; 360 361 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 362 widget.BackgroundColor = shade; 363 } 364 } 365 366 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 367 @foreach (var widget in widgets) 368 { 369 <div class="dashboard__widget"> 370 @Render(widget) 371 </div> 372 } 373 </div> 374 } 375 @using Dynamicweb.Rapido.Blocks.Components.General 376 @using Dynamicweb.Rapido.Blocks.Components 377 378 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 379 { 380 if (!string.IsNullOrEmpty(settings.Link)) 381 { 382 var backgroundStyles = ""; 383 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 384 { 385 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 386 } 387 388 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 389 <div class="u-center-middle u-color-light"> 390 @if (settings.Icon != null) 391 { 392 settings.Icon.CssClass += "widget__icon"; 393 @Render(settings.Icon) 394 } 395 <div class="widget__title">@settings.Title</div> 396 </div> 397 </a> 398 } 399 } 400 @using Dynamicweb.Rapido.Blocks.Components.General 401 @using Dynamicweb.Rapido.Blocks.Components 402 403 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 404 { 405 var backgroundStyles = ""; 406 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 407 { 408 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 409 } 410 411 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 412 <div class="u-center-middle u-color-light"> 413 @if (settings.Icon != null) 414 { 415 settings.Icon.CssClass += "widget__icon"; 416 @Render(settings.Icon) 417 } 418 <div class="widget__counter">@settings.Count</div> 419 <div class="widget__title">@settings.Title</div> 420 </div> 421 </div> 422 } 423 @using System.Reflection 424 @using Dynamicweb.Rapido.Blocks.Components.General 425 @using Dynamicweb.Rapido.Blocks.Components 426 @using Dynamicweb.Core 427 428 @* Component *@ 429 430 @helper RenderLink(Link settings) 431 { 432 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 433 { 434 Dictionary<string, string> attributes = new Dictionary<string, string>(); 435 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 436 if (settings.Disabled) 437 { 438 attributes.Add("disabled", "true"); 439 classList.Add("disabled"); 440 } 441 442 if (!string.IsNullOrEmpty(settings.AltText)) 443 { 444 attributes.Add("title", settings.AltText); 445 } 446 else if (!string.IsNullOrEmpty(settings.Title)) 447 { 448 attributes.Add("title", settings.Title); 449 } 450 451 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 452 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 453 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 454 attributes.Add("href", settings.Href); 455 456 if (settings.ButtonLayout != ButtonLayout.None) 457 { 458 classList.Add("btn"); 459 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 460 if (btnLayout == "linkclean") 461 { 462 btnLayout = "link-clean"; //fix 463 } 464 classList.Add("btn--" + btnLayout); 465 } 466 467 if (settings.Icon == null) 468 { 469 settings.Icon = new Icon(); 470 } 471 settings.Icon.Label = settings.Title; 472 473 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 474 { 475 settings.Rel = LinkRelType.Noopener; 476 } 477 if (settings.Target != LinkTargetType.None) 478 { 479 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 480 } 481 if (settings.Download) 482 { 483 attributes.Add("download", "true"); 484 } 485 if (settings.Rel != LinkRelType.None) 486 { 487 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 488 } 489 490 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 491 } 492 } 493 @using System.Reflection 494 @using Dynamicweb.Rapido.Blocks.Components 495 @using Dynamicweb.Rapido.Blocks.Components.General 496 @using Dynamicweb.Rapido.Blocks 497 498 499 @* Component *@ 500 501 @helper RenderRating(Rating settings) 502 { 503 if (settings.Score > 0) 504 { 505 int rating = settings.Score; 506 string iconType = "fa-star"; 507 508 switch (settings.Type.ToString()) { 509 case "Stars": 510 iconType = "fa-star"; 511 break; 512 case "Hearts": 513 iconType = "fa-heart"; 514 break; 515 case "Lemons": 516 iconType = "fa-lemon"; 517 break; 518 case "Bombs": 519 iconType = "fa-bomb"; 520 break; 521 } 522 523 <div class="u-ta-right"> 524 @for (int i = 0; i < settings.OutOf; i++) 525 { 526 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 527 } 528 </div> 529 } 530 } 531 @using System.Reflection 532 @using Dynamicweb.Rapido.Blocks.Components.General 533 @using Dynamicweb.Rapido.Blocks.Components 534 535 536 @* Component *@ 537 538 @helper RenderSelectFieldOption(SelectFieldOption settings) 539 { 540 Dictionary<string, string> attributes = new Dictionary<string, string>(); 541 if (settings.Checked) { attributes.Add("selected", "true"); } 542 if (settings.Disabled) { attributes.Add("disabled", "true"); } 543 if (settings.Value != null) { attributes.Add("value", settings.Value); } 544 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 545 546 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 547 } 548 @using System.Reflection 549 @using Dynamicweb.Rapido.Blocks.Components.General 550 @using Dynamicweb.Rapido.Blocks.Components 551 552 553 @* Component *@ 554 555 @helper RenderNavigation(Navigation settings) { 556 @RenderNavigation(new 557 { 558 id = settings.Id, 559 cssclass = settings.CssClass, 560 startLevel = settings.StartLevel, 561 endlevel = settings.EndLevel, 562 expandmode = settings.Expandmode, 563 sitemapmode = settings.SitemapMode, 564 template = settings.Template 565 }) 566 } 567 @using Dynamicweb.Rapido.Blocks.Components.General 568 @using Dynamicweb.Rapido.Blocks.Components 569 570 571 @* Component *@ 572 573 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 574 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 575 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 576 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 577 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 578 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 579 settings.SitemapMode = false; 580 581 @RenderNavigation(settings) 582 } 583 @using Dynamicweb.Rapido.Blocks.Components.General 584 @using Dynamicweb.Rapido.Blocks.Components 585 586 587 @* Component *@ 588 589 @helper RenderLeftNavigation(LeftNavigation settings) { 590 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 591 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 592 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 593 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 594 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 595 596 <div class="grid__cell"> 597 @RenderNavigation(settings) 598 </div> 599 } 600 @using System.Reflection 601 @using Dynamicweb.Rapido.Blocks.Components.General 602 @using Dynamicweb.Core 603 604 @* Component *@ 605 606 @helper RenderHeading(Heading settings) 607 { 608 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 609 { 610 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 611 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 612 613 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 614 if (!string.IsNullOrEmpty(settings.Link)) 615 { 616 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 617 } 618 else 619 { 620 if (settings.Icon == null) 621 { 622 settings.Icon = new Icon(); 623 } 624 settings.Icon.Label = settings.Title; 625 @Render(settings.Icon) 626 } 627 @("</" + tagName + ">"); 628 } 629 } 630 @using Dynamicweb.Rapido.Blocks.Components 631 @using Dynamicweb.Rapido.Blocks.Components.General 632 @using Dynamicweb.Rapido.Blocks 633 634 635 @* Component *@ 636 637 @helper RenderImage(Image settings) 638 { 639 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 640 { 641 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 642 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 643 644 if (settings.Caption != null) 645 { 646 @:<div> 647 } 648 649 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 650 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 651 652 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 653 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 654 @if (settings.Link != null) 655 { 656 <a href="@settings.Link"> 657 @RenderTheImage(settings) 658 </a> 659 } 660 else 661 { 662 @RenderTheImage(settings) 663 } 664 </div> 665 </div> 666 667 if (settings.Caption != null) 668 { 669 <span class="image-caption dw-mod">@settings.Caption</span> 670 @:</div> 671 } 672 } 673 else 674 { 675 if (settings.Caption != null) 676 { 677 @:<div> 678 } 679 if (!string.IsNullOrEmpty(settings.Link)) 680 { 681 <a href="@settings.Link"> 682 @RenderTheImage(settings) 683 </a> 684 } 685 else 686 { 687 @RenderTheImage(settings) 688 } 689 690 if (settings.Caption != null) 691 { 692 <span class="image-caption dw-mod">@settings.Caption</span> 693 @:</div> 694 } 695 } 696 } 697 698 @helper RenderTheImage(Image settings) 699 { 700 if (settings != null) 701 { 702 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg"; 703 string placeholderImage = "/Files/Images/placeholder.gif"; 704 string imageEngine = "/Admin/Public/GetImage.ashx?"; 705 706 string imageStyle = ""; 707 708 switch (settings.Style) 709 { 710 case ImageStyle.Ball: 711 imageStyle = "grid__cell-img--ball"; 712 break; 713 714 case ImageStyle.Triangle: 715 imageStyle = "grid__cell-img--triangle"; 716 break; 717 } 718 719 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 720 { 721 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 722 723 if (settings.ImageDefault != null) 724 { 725 settings.ImageDefault.Height = settings.ImageDefault.Width; 726 } 727 if (settings.ImageMedium != null) 728 { 729 settings.ImageMedium.Height = settings.ImageMedium.Width; 730 } 731 if (settings.ImageSmall != null) 732 { 733 settings.ImageSmall.Height = settings.ImageSmall.Width; 734 } 735 736 settings.ImageDefault.DoNotUpscale = false; 737 } 738 739 if (settings.ImageDefault.Width == 620){ 740 //settings.ImageDefault.FillCanvas = true; 741 } 742 743 string defaultImage = imageEngine; 744 string imageSmall = ""; 745 string imageMedium = ""; 746 747 748 if (settings.DisableImageEngine) 749 { 750 defaultImage = settings.Path; 751 } 752 else 753 { 754 if (settings.ImageDefault != null) 755 { 756 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 757 758 759 760 if (settings.Path.GetType() != typeof(string)) 761 { 762 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 763 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 764 } 765 else 766 { 767 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 768 } 769 770 defaultImage += "&AlternativeImage=" + alternativeImage; 771 772 } 773 774 if (settings.ImageSmall != null) 775 { 776 imageSmall = "data-src-small=\"" + imageEngine; 777 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 778 779 if (settings.Path.GetType() != typeof(string)) 780 { 781 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 782 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 783 } 784 else 785 { 786 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 787 } 788 789 imageSmall += "&alternativeImage=" + alternativeImage; 790 791 imageSmall += "\""; 792 } 793 794 if (settings.ImageMedium != null) 795 { 796 imageMedium = "data-src-medium=\"" + imageEngine; 797 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 798 799 if (settings.Path.GetType() != typeof(string)) 800 { 801 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 802 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 803 } 804 else 805 { 806 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 807 } 808 809 imageMedium += "&alternativeImage=" + alternativeImage; 810 811 imageMedium += "\""; 812 } 813 } 814 815 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 816 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 817 if (!string.IsNullOrEmpty(settings.Title)) 818 { 819 optionalAttributes.Add("alt", settings.Title); 820 optionalAttributes.Add("title", settings.Title); 821 } 822 823 if (settings.DisableLazyLoad) 824 { 825 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 826 } 827 else 828 { 829 <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) /> 830 } 831 } 832 } 833 @using System.Reflection 834 @using Dynamicweb.Rapido.Blocks.Components.General 835 @using Dynamicweb.Rapido.Blocks.Components 836 837 @* Component *@ 838 839 @helper RenderFileField(FileField settings) 840 { 841 var attributes = new Dictionary<string, string>(); 842 if (string.IsNullOrEmpty(settings.Id)) 843 { 844 settings.Id = Guid.NewGuid().ToString("N"); 845 } 846 847 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 848 if (settings.Disabled) { attributes.Add("disabled", "true"); } 849 if (settings.Required) { attributes.Add("required", "true"); } 850 if (settings.Multiple) { attributes.Add("multiple", "true"); } 851 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 852 if (string.IsNullOrEmpty(settings.ChooseFileText)) 853 { 854 settings.ChooseFileText = Translate("Choose file"); 855 } 856 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 857 { 858 settings.NoFilesChosenText = Translate("No files chosen..."); 859 } 860 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 861 862 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 863 864 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 865 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 866 867 attributes.Add("type", "file"); 868 if (settings.Value != null) { attributes.Add("value", settings.Value); } 869 settings.CssClass = "u-full-width " + settings.CssClass; 870 871 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 872 873 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 874 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 875 { 876 <div class="u-full-width"> 877 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 878 @if (settings.Link != null) { 879 <div class="u-pull--right"> 880 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 881 @Render(settings.Link) 882 </div> 883 } 884 </div> 885 886 } 887 888 @if (!string.IsNullOrEmpty(settings.HelpText)) 889 { 890 <small class="form__help-text">@settings.HelpText</small> 891 } 892 893 <div class="form__field-combi file-input u-no-margin dw-mod"> 894 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 895 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 896 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 897 @if (settings.UploadButton != null) 898 { 899 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 900 @Render(settings.UploadButton) 901 } 902 </div> 903 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 904 </div> 905 } 906 @using System.Reflection 907 @using Dynamicweb.Rapido.Blocks.Components.General 908 @using Dynamicweb.Rapido.Blocks.Components 909 @using Dynamicweb.Core 910 @using System.Linq 911 912 @* Component *@ 913 914 @helper RenderDateTimeField(DateTimeField settings) 915 { 916 if (string.IsNullOrEmpty(settings.Id)) 917 { 918 settings.Id = Guid.NewGuid().ToString("N"); 919 } 920 921 var textField = new TextField { 922 Name = settings.Name, 923 Id = settings.Id, 924 Label = settings.Label, 925 HelpText = settings.HelpText, 926 Value = settings.Value, 927 Disabled = settings.Disabled, 928 Required = settings.Required, 929 ErrorMessage = settings.ErrorMessage, 930 CssClass = settings.CssClass, 931 WrapperCssClass = settings.WrapperCssClass, 932 OnChange = settings.OnChange, 933 OnClick = settings.OnClick, 934 Link = settings.Link, 935 ExtraAttributes = settings.ExtraAttributes, 936 // 937 Placeholder = settings.Placeholder 938 }; 939 940 @Render(textField) 941 942 List<string> jsAttributes = new List<string>(); 943 944 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 945 946 if (!string.IsNullOrEmpty(settings.DateFormat)) 947 { 948 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 949 } 950 if (!string.IsNullOrEmpty(settings.MinDate)) 951 { 952 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 953 } 954 if (!string.IsNullOrEmpty(settings.MaxDate)) 955 { 956 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 957 } 958 if (settings.IsInline) 959 { 960 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 961 } 962 if (settings.EnableTime) 963 { 964 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 965 } 966 if (settings.EnableWeekNumbers) 967 { 968 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 969 } 970 971 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 972 973 <script> 974 document.addEventListener("DOMContentLoaded", function () { 975 flatpickr("#@textField.Id", { 976 @string.Join(",", jsAttributes) 977 }); 978 }); 979 </script> 980 } 981 @using System.Reflection 982 @using Dynamicweb.Rapido.Blocks.Components.General 983 @using Dynamicweb.Rapido.Blocks.Components 984 985 @* Component *@ 986 987 @helper RenderTextField(TextField settings) 988 { 989 var attributes = new Dictionary<string, string>(); 990 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 991 { 992 settings.Id = Guid.NewGuid().ToString("N"); 993 } 994 995 /*base settings*/ 996 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 997 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 998 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 999 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1000 if (settings.Required) { attributes.Add("required", "true"); } 1001 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1002 /*end*/ 1003 1004 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1005 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1006 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1007 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1008 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1009 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1010 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1011 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1012 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1013 1014 settings.CssClass = "u-full-width " + settings.CssClass; 1015 1016 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1017 1018 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1019 1020 string noMargin = "u-no-margin"; 1021 if (!settings.ReadOnly) { 1022 noMargin = ""; 1023 } 1024 1025 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1026 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1027 { 1028 <div class="u-full-width"> 1029 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1030 @if (settings.Link != null) { 1031 settings.Link.ButtonLayout = ButtonLayout.LinkClean; 1032 1033 <div class="u-pull--right"> 1034 @Render(settings.Link) 1035 </div> 1036 } 1037 </div> 1038 1039 } 1040 1041 @if (!string.IsNullOrEmpty(settings.HelpText)) 1042 { 1043 <small class="form__help-text">@settings.HelpText</small> 1044 } 1045 1046 @if (settings.ActionButton != null) 1047 { 1048 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1049 <div class="form__field-combi u-no-margin dw-mod"> 1050 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1051 @Render(settings.ActionButton) 1052 </div> 1053 } 1054 else 1055 { 1056 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1057 } 1058 1059 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1060 </div> 1061 } 1062 @using System.Reflection 1063 @using Dynamicweb.Rapido.Blocks.Components.General 1064 @using Dynamicweb.Rapido.Blocks.Components 1065 1066 @* Component *@ 1067 1068 @helper RenderNumberField(NumberField settings) 1069 { 1070 var attributes = new Dictionary<string, string>(); 1071 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1072 { 1073 settings.Id = Guid.NewGuid().ToString("N"); 1074 } 1075 1076 /*base settings*/ 1077 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1078 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1079 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1080 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1081 if (settings.Required) { attributes.Add("required", "true"); } 1082 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1083 /*end*/ 1084 1085 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1086 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1087 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1088 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1089 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1090 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1091 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1092 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1093 attributes.Add("type", "number"); 1094 1095 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1096 1097 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1098 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1099 { 1100 <div class="u-full-width"> 1101 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1102 @if (settings.Link != null) { 1103 <div class="u-pull--right"> 1104 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1105 @Render(settings.Link) 1106 </div> 1107 } 1108 </div> 1109 1110 } 1111 1112 @if (!string.IsNullOrEmpty(settings.HelpText)) 1113 { 1114 <small class="form__help-text">@settings.HelpText</small> 1115 } 1116 1117 @if (settings.ActionButton != null) 1118 { 1119 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1120 <div class="form__field-combi u-no-margin dw-mod"> 1121 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1122 @Render(settings.ActionButton) 1123 </div> 1124 } 1125 else 1126 { 1127 <div class="form__field-combi u-no-margin dw-mod"> 1128 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1129 </div> 1130 } 1131 1132 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1133 </div> 1134 } 1135 @using System.Reflection 1136 @using Dynamicweb.Rapido.Blocks.Components.General 1137 @using Dynamicweb.Rapido.Blocks.Components 1138 1139 1140 @* Component *@ 1141 1142 @helper RenderTextareaField(TextareaField settings) 1143 { 1144 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1145 string id = settings.Id; 1146 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1147 { 1148 id = Guid.NewGuid().ToString("N"); 1149 } 1150 1151 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1152 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1153 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1154 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1155 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1156 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1157 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1158 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1159 if (settings.Required) { attributes.Add("required", "true"); } 1160 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1161 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1162 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1163 attributes.Add("name", settings.Name); 1164 1165 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1166 1167 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1168 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1169 { 1170 <div class="u-full-width"> 1171 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1172 @if (settings.Link != null) { 1173 <div class="u-pull--right"> 1174 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1175 @Render(settings.Link) 1176 </div> 1177 } 1178 </div> 1179 } 1180 1181 @if (!string.IsNullOrEmpty(settings.HelpText)) 1182 { 1183 <small class="form__help-text">@settings.HelpText</small> 1184 } 1185 1186 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1187 1188 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1189 </div> 1190 } 1191 @using System.Reflection 1192 @using Dynamicweb.Rapido.Blocks.Components.General 1193 @using Dynamicweb.Rapido.Blocks.Components 1194 1195 1196 @* Component *@ 1197 1198 @helper RenderHiddenField(HiddenField settings) { 1199 var attributes = new Dictionary<string, string>(); 1200 attributes.Add("type", "hidden"); 1201 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1202 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1203 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1204 1205 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1206 } 1207 @using System.Reflection 1208 @using Dynamicweb.Rapido.Blocks.Components.General 1209 @using Dynamicweb.Rapido.Blocks.Components 1210 1211 @* Component *@ 1212 1213 @helper RenderCheckboxField(CheckboxField settings) 1214 { 1215 var attributes = new Dictionary<string, string>(); 1216 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1217 { 1218 settings.Id = Guid.NewGuid().ToString("N"); 1219 } 1220 1221 /*base settings*/ 1222 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1223 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1224 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1225 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1226 if (settings.Required) { attributes.Add("required", "true"); } 1227 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1228 /*end*/ 1229 1230 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1231 1232 attributes.Add("type", "checkbox"); 1233 if (settings.Checked) { attributes.Add("checked", "true"); } 1234 settings.CssClass = "form__control " + settings.CssClass; 1235 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1236 1237 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1238 1239 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1240 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1241 @if (!string.IsNullOrEmpty(settings.Label)) 1242 { 1243 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1244 } 1245 1246 @if (settings.Link != null) { 1247 <span> 1248 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1249 @Render(settings.Link) 1250 </span> 1251 } 1252 1253 @if (!string.IsNullOrEmpty(settings.HelpText)) 1254 { 1255 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small> 1256 } 1257 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1258 </div> 1259 } 1260 @using System.Reflection 1261 @using Dynamicweb.Rapido.Blocks.Components.General 1262 @using Dynamicweb.Rapido.Blocks.Components 1263 1264 1265 @* Component *@ 1266 1267 @helper RenderCheckboxListField(CheckboxListField settings) 1268 { 1269 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1270 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1271 { 1272 <div class="u-full-width"> 1273 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1274 @if (settings.Link != null) { 1275 <div class="u-pull--right"> 1276 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1277 @Render(settings.Link) 1278 </div> 1279 } 1280 </div> 1281 1282 } 1283 1284 <div class="u-pull--left"> 1285 @if (!string.IsNullOrEmpty(settings.HelpText)) 1286 { 1287 <small class="form__help-text">@settings.HelpText</small> 1288 } 1289 1290 @foreach (var item in settings.Options) 1291 { 1292 if (settings.Required) 1293 { 1294 item.Required = true; 1295 } 1296 if (settings.Disabled) 1297 { 1298 item.Disabled = true; 1299 } 1300 if (!string.IsNullOrEmpty(settings.Name)) 1301 { 1302 item.Name = settings.Name; 1303 } 1304 if (!string.IsNullOrEmpty(settings.CssClass)) 1305 { 1306 item.CssClass += settings.CssClass; 1307 } 1308 1309 /* value is not supported */ 1310 1311 if (!string.IsNullOrEmpty(settings.OnClick)) 1312 { 1313 item.OnClick += settings.OnClick; 1314 } 1315 if (!string.IsNullOrEmpty(settings.OnChange)) 1316 { 1317 item.OnChange += settings.OnChange; 1318 } 1319 @Render(item) 1320 } 1321 1322 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1323 </div> 1324 1325 </div> 1326 } 1327 @using Dynamicweb.Rapido.Blocks.Components.General 1328 1329 @* Component *@ 1330 1331 @helper RenderSearch(Search settings) 1332 { 1333 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1334 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1335 1336 if (string.IsNullOrEmpty(settings.Id)) 1337 { 1338 settings.Id = Guid.NewGuid().ToString("N"); 1339 } 1340 1341 var resultAttributes = new Dictionary<string, string>(); 1342 1343 if (settings.PageSize != 0) 1344 { 1345 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1346 } 1347 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1348 { 1349 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1350 if (!string.IsNullOrEmpty(groupValue)) 1351 { 1352 resultAttributes.Add("data-selected-group", groupValue); 1353 } 1354 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1355 { 1356 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1357 } 1358 } 1359 resultAttributes.Add("data-force-init", "true"); 1360 if (settings.GoToFirstSearchResultOnEnter) 1361 { 1362 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1363 } 1364 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1365 { 1366 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1367 } 1368 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1369 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1370 1371 if (settings.SecondSearchData != null) 1372 { 1373 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1374 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1375 } 1376 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1377 { 1378 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1379 } 1380 1381 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1382 1383 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1384 1385 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1386 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1387 { 1388 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1389 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1390 } 1391 1392 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1393 1394 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1395 @if (settings.SecondSearchData != null) 1396 { 1397 <div class="search__column search__column--products dw-mod"> 1398 <div class="search__column-header dw-mod">@Translate("Products")</div> 1399 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1400 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1401 { 1402 @Render(new Link { 1403 Title = Translate("View all"), 1404 CssClass = "js-view-all-button u-margin", 1405 Href = settings.SearchData.ResultsPageUrl 1406 }); 1407 } 1408 </div> 1409 <div class="search__column search__column--pages dw-mod"> 1410 <div class="search__column-header">@Translate("Pages")</div> 1411 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1412 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1413 { 1414 @Render(new Link 1415 { 1416 Title = Translate("View all"), 1417 CssClass = "js-view-all-button u-margin", 1418 Href = settings.SecondSearchData.ResultsPageUrl 1419 }); 1420 } 1421 </div> 1422 } 1423 else 1424 { 1425 <div class="search__column search__column--only dw-mod"> 1426 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1427 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1428 { 1429 @Render(new Link { 1430 Title = Translate("View all"), 1431 CssClass = "js-view-all-button u-margin", 1432 Href = settings.SearchData.ResultsPageUrl 1433 }); 1434 } 1435 </div> 1436 } 1437 </div> 1438 1439 @if (settings.SearchButton != null) 1440 { 1441 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1442 if (settings.RenderDefaultSearchIcon) 1443 { 1444 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1445 } 1446 @Render(settings.SearchButton); 1447 } 1448 </div> 1449 } 1450 @using System.Reflection 1451 @using Dynamicweb.Rapido.Blocks.Components.General 1452 @using Dynamicweb.Rapido.Blocks.Components 1453 1454 1455 @* Component *@ 1456 1457 @helper RenderSelectField(SelectField settings) 1458 { 1459 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1460 { 1461 settings.Id = Guid.NewGuid().ToString("N"); 1462 } 1463 1464 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1465 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1466 { 1467 <div class="u-full-width"> 1468 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1469 @if (settings.Link != null) { 1470 <div class="u-pull--right"> 1471 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1472 @Render(settings.Link) 1473 </div> 1474 } 1475 </div> 1476 } 1477 1478 @if (!string.IsNullOrEmpty(settings.HelpText)) 1479 { 1480 <small class="form__help-text">@settings.HelpText</small> 1481 } 1482 1483 @if (settings.ActionButton != null) 1484 { 1485 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1486 <div class="form__field-combi u-no-margin dw-mod"> 1487 @RenderSelectBase(settings) 1488 @Render(settings.ActionButton) 1489 </div> 1490 } 1491 else 1492 { 1493 @RenderSelectBase(settings) 1494 } 1495 1496 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1497 </div> 1498 } 1499 1500 @helper RenderSelectBase(SelectField settings) 1501 { 1502 var attributes = new Dictionary<string, string>(); 1503 1504 /*base settings*/ 1505 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1506 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1507 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1508 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1509 if (settings.Required) { attributes.Add("required", "true"); } 1510 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1511 /*end*/ 1512 1513 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1514 1515 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1516 @if (settings.Default != null) 1517 { 1518 @Render(settings.Default) 1519 } 1520 1521 @foreach (var item in settings.Options) 1522 { 1523 if (settings.Value != null) { 1524 item.Checked = item.Value == settings.Value; 1525 } 1526 @Render(item) 1527 } 1528 </select> 1529 } 1530 @using System.Reflection 1531 @using Dynamicweb.Rapido.Blocks.Components.General 1532 @using Dynamicweb.Rapido.Blocks.Components 1533 1534 @* Component *@ 1535 1536 @helper RenderRadioButtonField(RadioButtonField settings) 1537 { 1538 var attributes = new Dictionary<string, string>(); 1539 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1540 { 1541 settings.Id = Guid.NewGuid().ToString("N"); 1542 } 1543 1544 /*base settings*/ 1545 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1546 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1547 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1548 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1549 if (settings.Required) { attributes.Add("required", "true"); } 1550 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1551 /*end*/ 1552 1553 attributes.Add("type", "radio"); 1554 if (settings.Checked) { attributes.Add("checked", "true"); } 1555 settings.CssClass = "form__control " + settings.CssClass; 1556 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1557 1558 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1559 1560 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1561 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1562 @if (!string.IsNullOrEmpty(settings.Label)) 1563 { 1564 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1565 } 1566 @if (!string.IsNullOrEmpty(settings.HelpText)) 1567 { 1568 <small class="form__help-text">@settings.HelpText</small> 1569 } 1570 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1571 </div> 1572 } 1573 @using System.Reflection 1574 @using Dynamicweb.Rapido.Blocks.Components.General 1575 @using Dynamicweb.Rapido.Blocks.Components 1576 1577 1578 @* Component *@ 1579 1580 @helper RenderRadioButtonListField(RadioButtonListField settings) 1581 { 1582 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1583 1584 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1585 @if (!string.IsNullOrEmpty(settings.Label)) 1586 { 1587 <label>@settings.Label</label> 1588 } 1589 @if (!string.IsNullOrEmpty(settings.HelpText)) 1590 { 1591 <small class="form__help-text">@settings.HelpText</small> 1592 } 1593 1594 @foreach (var item in settings.Options) 1595 { 1596 if (settings.Required) 1597 { 1598 item.Required = true; 1599 } 1600 if (settings.Disabled) 1601 { 1602 item.Disabled = true; 1603 } 1604 if (!string.IsNullOrEmpty(settings.Name)) 1605 { 1606 item.Name = settings.Name; 1607 } 1608 if (settings.Value != null && settings.Value == item.Value) 1609 { 1610 item.Checked = true; 1611 } 1612 if (!string.IsNullOrEmpty(settings.OnClick)) 1613 { 1614 item.OnClick += settings.OnClick; 1615 } 1616 if (!string.IsNullOrEmpty(settings.OnChange)) 1617 { 1618 item.OnChange += settings.OnChange; 1619 } 1620 if (!string.IsNullOrEmpty(settings.CssClass)) 1621 { 1622 item.CssClass += settings.CssClass; 1623 } 1624 @Render(item) 1625 } 1626 1627 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1628 </div> 1629 } 1630 @using System.Reflection 1631 @using Dynamicweb.Rapido.Blocks.Components.General 1632 @using Dynamicweb.Rapido.Blocks.Components 1633 1634 1635 @* Component *@ 1636 1637 @helper RenderNotificationMessage(NotificationMessage settings) 1638 { 1639 if (!string.IsNullOrEmpty(settings.Message)) 1640 { 1641 var attributes = new Dictionary<string, string>(); 1642 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1643 1644 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 1645 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower(); 1646 string minHeightClass = settings.Icon != null ? "u-min-h70px" : ""; 1647 1648 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)> 1649 @if (settings.Icon != null) { 1650 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message; 1651 @Render(settings.Icon) 1652 } else { 1653 @settings.Message 1654 } 1655 </div> 1656 } 1657 } 1658 @using Dynamicweb.Rapido.Blocks.Components.General 1659 1660 1661 @* Component *@ 1662 1663 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 1664 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 1665 1666 <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> 1667 @if (settings.SubBlocks != null) { 1668 @RenderBlockList(settings.SubBlocks) 1669 } 1670 </div> 1671 } 1672 @using System.Reflection 1673 @using Dynamicweb.Rapido.Blocks.Components.General 1674 @using Dynamicweb.Rapido.Blocks.Components 1675 @using System.Text.RegularExpressions 1676 1677 1678 @* Component *@ 1679 1680 @helper RenderSticker(Sticker settings) { 1681 if (!String.IsNullOrEmpty(settings.Title)) { 1682 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 1683 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 1684 1685 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 1686 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 1687 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 1688 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 1689 optionalAttributes.Add("style", styleTag); 1690 } 1691 1692 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 1693 } 1694 } 1695 1696 @using System.Reflection 1697 @using Dynamicweb.Rapido.Blocks.Components.General 1698 @using Dynamicweb.Rapido.Blocks.Components 1699 1700 1701 @* Component *@ 1702 1703 @helper RenderStickersCollection(StickersCollection settings) 1704 { 1705 if (settings.Stickers.Count > 0) 1706 { 1707 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 1708 1709 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1710 @foreach (Sticker sticker in settings.Stickers) 1711 { 1712 @Render(sticker) 1713 } 1714 </div> 1715 } 1716 } 1717 1718 @using Dynamicweb.Rapido.Blocks.Components.General 1719 1720 1721 @* Component *@ 1722 1723 @helper RenderForm(Form settings) { 1724 if (settings != null) 1725 { 1726 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1727 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 1728 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 1729 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 1730 var enctypes = new Dictionary<string, string> 1731 { 1732 { "multipart", "multipart/form-data" }, 1733 { "text", "text/plain" }, 1734 { "application", "application/x-www-form-urlencoded" } 1735 }; 1736 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 1737 optionalAttributes.Add("method", settings.Method.ToString()); 1738 1739 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 1740 { 1741 @settings.FormStartMarkup 1742 } 1743 else 1744 { 1745 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1746 } 1747 1748 foreach (var field in settings.GetFields()) 1749 { 1750 @Render(field) 1751 } 1752 1753 @:</form> 1754 } 1755 } 1756 @using System.Reflection 1757 @using Dynamicweb.Rapido.Blocks.Components.General 1758 @using Dynamicweb.Rapido.Blocks.Components 1759 1760 1761 @* Component *@ 1762 1763 @helper RenderText(Text settings) 1764 { 1765 @settings.Content 1766 } 1767 @using System.Reflection 1768 @using Dynamicweb.Rapido.Blocks.Components.General 1769 @using Dynamicweb.Rapido.Blocks.Components 1770 1771 1772 @* Component *@ 1773 1774 @helper RenderContentModule(ContentModule settings) { 1775 if (!string.IsNullOrEmpty(settings.Content)) 1776 { 1777 @settings.Content 1778 } 1779 } 1780 @using System.Reflection 1781 @using Dynamicweb.Rapido.Blocks.Components.General 1782 @using Dynamicweb.Rapido.Blocks.Components 1783 1784 1785 @* Component *@ 1786 1787 @helper RenderModal(Modal settings) { 1788 if (settings != null) 1789 { 1790 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 1791 1792 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 1793 1794 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 1795 1796 <div class="modal-container"> 1797 @if (!settings.DisableDarkOverlay) 1798 { 1799 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 1800 } 1801 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 1802 @if (settings.Heading != null) 1803 { 1804 if (!string.IsNullOrEmpty(settings.Heading.Title)) 1805 { 1806 <div class="modal__header"> 1807 @Render(settings.Heading) 1808 </div> 1809 } 1810 } 1811 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 1812 @if (!string.IsNullOrEmpty(settings.BodyText)) 1813 { 1814 @settings.BodyText 1815 } 1816 @if (settings.BodyTemplate != null) 1817 { 1818 @settings.BodyTemplate 1819 } 1820 @{ 1821 var actions = settings.GetActions(); 1822 } 1823 </div> 1824 @if (actions.Length > 0) 1825 { 1826 <div class="modal__footer"> 1827 @foreach (var action in actions) 1828 { 1829 if (Pageview.Device.ToString() != "Mobile") { 1830 action.CssClass += " u-no-margin"; 1831 } else { 1832 action.CssClass += " u-full-width u-margin-bottom"; 1833 } 1834 1835 @Render(action) 1836 } 1837 </div> 1838 } 1839 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 1840 </div> 1841 </div> 1842 } 1843 } 1844 @using Dynamicweb.Rapido.Blocks.Components.General 1845 1846 @* Component *@ 1847 1848 @helper RenderMediaListItem(MediaListItem settings) 1849 { 1850 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 1851 @if (!string.IsNullOrEmpty(settings.Label)) 1852 { 1853 if (!string.IsNullOrEmpty(settings.Link)) 1854 { 1855 @Render(new Link 1856 { 1857 Href = settings.Link, 1858 CssClass = "media-list-item__sticker dw-mod", 1859 ButtonLayout = ButtonLayout.None, 1860 Title = settings.Label, 1861 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1862 }) 1863 } 1864 else if (!string.IsNullOrEmpty(settings.OnClick)) 1865 { 1866 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 1867 <span class="u-uppercase">@settings.Label</span> 1868 </span> 1869 } 1870 else 1871 { 1872 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 1873 <span class="u-uppercase">@settings.Label</span> 1874 </span> 1875 } 1876 } 1877 <div class="media-list-item__wrap"> 1878 <div class="media-list-item__info dw-mod"> 1879 <div class="media-list-item__header dw-mod"> 1880 @if (!string.IsNullOrEmpty(settings.Title)) 1881 { 1882 if (!string.IsNullOrEmpty(settings.Link)) 1883 { 1884 @Render(new Link 1885 { 1886 Href = settings.Link, 1887 CssClass = "media-list-item__name dw-mod", 1888 ButtonLayout = ButtonLayout.None, 1889 Title = settings.Title, 1890 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 1891 }) 1892 } 1893 else if (!string.IsNullOrEmpty(settings.OnClick)) 1894 { 1895 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 1896 } 1897 else 1898 { 1899 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 1900 } 1901 } 1902 1903 @if (!string.IsNullOrEmpty(settings.Status)) 1904 { 1905 <div class="media-list-item__state dw-mod">@settings.Status</div> 1906 } 1907 </div> 1908 @{ 1909 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 1910 } 1911 1912 @Render(settings.InfoTable) 1913 </div> 1914 <div class="media-list-item__actions dw-mod"> 1915 <div class="media-list-item__actions-list dw-mod"> 1916 @{ 1917 var actions = settings.GetActions(); 1918 1919 foreach (ButtonBase action in actions) 1920 { 1921 action.ButtonLayout = ButtonLayout.None; 1922 action.CssClass += " media-list-item__action link"; 1923 1924 @Render(action) 1925 } 1926 } 1927 </div> 1928 1929 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 1930 { 1931 settings.SelectButton.CssClass += " u-no-margin"; 1932 1933 <div class="media-list-item__action-button"> 1934 @Render(settings.SelectButton) 1935 </div> 1936 } 1937 </div> 1938 </div> 1939 </div> 1940 } 1941 @using Dynamicweb.Rapido.Blocks.Components.General 1942 @using Dynamicweb.Rapido.Blocks.Components 1943 1944 @helper RenderTable(Table settings) 1945 { 1946 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1947 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1948 1949 var enumToClasses = new Dictionary<TableDesign, string> 1950 { 1951 { TableDesign.Clean, "table--clean" }, 1952 { TableDesign.Bordered, "table--bordered" }, 1953 { TableDesign.Striped, "table--striped" }, 1954 { TableDesign.Hover, "table--hover" }, 1955 { TableDesign.Compact, "table--compact" }, 1956 { TableDesign.Condensed, "table--condensed" }, 1957 { TableDesign.NoTopBorder, "table--no-top-border" } 1958 }; 1959 string tableDesignClass = ""; 1960 if (settings.Design != TableDesign.None) 1961 { 1962 tableDesignClass = enumToClasses[settings.Design]; 1963 } 1964 1965 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 1966 1967 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 1968 1969 <table @ComponentMethods.AddAttributes(resultAttributes)> 1970 @if (settings.Header != null) 1971 { 1972 <thead> 1973 @Render(settings.Header) 1974 </thead> 1975 } 1976 <tbody> 1977 @foreach (var row in settings.Rows) 1978 { 1979 @Render(row) 1980 } 1981 </tbody> 1982 @if (settings.Footer != null) 1983 { 1984 <tfoot> 1985 @Render(settings.Footer) 1986 </tfoot> 1987 } 1988 </table> 1989 } 1990 @using Dynamicweb.Rapido.Blocks.Components.General 1991 @using Dynamicweb.Rapido.Blocks.Components 1992 1993 @helper RenderTableRow(TableRow settings) 1994 { 1995 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1996 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1997 1998 var enumToClasses = new Dictionary<TableRowDesign, string> 1999 { 2000 { TableRowDesign.NoBorder, "table__row--no-border" }, 2001 { TableRowDesign.Border, "table__row--border" }, 2002 { TableRowDesign.TopBorder, "table__row--top-line" }, 2003 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2004 { TableRowDesign.Solid, "table__row--solid" } 2005 }; 2006 2007 string tableRowDesignClass = ""; 2008 if (settings.Design != TableRowDesign.None) 2009 { 2010 tableRowDesignClass = enumToClasses[settings.Design]; 2011 } 2012 2013 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2014 2015 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2016 2017 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2018 @foreach (var cell in settings.Cells) 2019 { 2020 if (settings.IsHeaderRow) 2021 { 2022 cell.IsHeader = true; 2023 } 2024 @Render(cell) 2025 } 2026 </tr> 2027 } 2028 @using Dynamicweb.Rapido.Blocks.Components.General 2029 @using Dynamicweb.Rapido.Blocks.Components 2030 @using Dynamicweb.Core 2031 2032 @helper RenderTableCell(TableCell settings) 2033 { 2034 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2035 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2036 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2037 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2038 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2039 2040 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2041 2042 string tagName = settings.IsHeader ? "th" : "td"; 2043 2044 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2045 @settings.Content 2046 @("</" + tagName + ">"); 2047 } 2048 @using System.Linq 2049 @using Dynamicweb.Rapido.Blocks.Components.General 2050 2051 @* Component *@ 2052 2053 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2054 { 2055 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2056 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2057 2058 if (settings.NumberOfPages > 1) 2059 { 2060 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2061 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2062 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2063 2064 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2065 @if (settings.ShowPagingInfo) 2066 { 2067 <div class="pager__info dw-mod"> 2068 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2069 </div> 2070 } 2071 <ul class="pager__list dw-mod"> 2072 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2073 { 2074 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2075 } 2076 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2077 { 2078 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2079 } 2080 @if (settings.GetPages().Any()) 2081 { 2082 foreach (var page in settings.GetPages()) 2083 { 2084 @Render(page) 2085 } 2086 } 2087 else 2088 { 2089 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2090 { 2091 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2092 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2093 } 2094 } 2095 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2096 { 2097 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2098 } 2099 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2100 { 2101 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2102 } 2103 </ul> 2104 </div> 2105 } 2106 } 2107 2108 @helper RenderPaginationItem(PaginationItem settings) 2109 { 2110 if (settings.Icon == null) 2111 { 2112 settings.Icon = new Icon(); 2113 } 2114 2115 settings.Icon.Label = settings.Label; 2116 <li class="pager__btn dw-mod"> 2117 @if (settings.IsActive) 2118 { 2119 <span class="pager__num pager__num--current dw-mod"> 2120 @Render(settings.Icon) 2121 </span> 2122 } 2123 else 2124 { 2125 <a href="@settings.Link" class="pager__num dw-mod"> 2126 @Render(settings.Icon) 2127 </a> 2128 } 2129 </li> 2130 } 2131 2132 2133 @using Dynamicweb.Rapido.Blocks.Components.General 2134 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2135 2136 2137 2138 @* Include the basic, re-used, paragraph initializer *@ 2139 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2140 @using Dynamicweb.Frontend 2141 @using Dynamicweb.Rapido.Blocks.Components.General 2142 @using Dynamicweb.Rapido.Blocks.Components 2143 2144 @functions { 2145 public class ContentParagraph 2146 { 2147 public string Title { get; set; } 2148 public Image Image { get; set; } 2149 public string Text { get; set; } 2150 public string Link { get; set; } 2151 public bool SetImageAsBackground { get; set; } 2152 public bool HideOuterPadding { get; set; } 2153 public string InnerPaddingCss { get; set; } 2154 public string CardCss { get; set; } 2155 public string ButtonWrapperCss { get; set; } 2156 public string Layout { get; set; } 2157 public string Module { get; set; } 2158 public Link ButtonPrimary { get; set; } 2159 public Link ButtonSecondary { get; set; } 2160 } 2161 } 2162 2163 @helper RenderParagraph(ItemViewModel item, bool renderModule = true) 2164 { 2165 if (item != null) { 2166 string layout = item.GetList("ContentPositions").SelectedValue; 2167 2168 string paragraphClasses = ""; 2169 string paragraphWidth = !String.IsNullOrEmpty(item.GetString("Width")) ? item.GetList("Width").SelectedValue : "12"; 2170 paragraphClasses += " grid__col-lg-" + paragraphWidth + " grid__col-md-" + paragraphWidth + " grid__col-sm-" + paragraphWidth; 2171 if (item.GetList("WidthMobile").SelectedValue == "hide") 2172 { 2173 paragraphClasses += " u-hidden-xs"; 2174 } 2175 else 2176 { 2177 paragraphClasses += " grid__col-xs-" + item.GetList("WidthMobile").SelectedValue; 2178 } 2179 paragraphClasses += item.GetBoolean("HidePadding") ? " paragraph-container--no-padding" : ""; 2180 paragraphClasses += layout == "middle-center" || layout == "middle-left" ? " u-middle-horizontal grid--justify-center" : ""; 2181 2182 //Alternative Design Layout 2183 var designLayout = Model.Item.GetItem("CustomSettings") != null ? Model.Item.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.Item.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 2184 paragraphClasses += !String.IsNullOrEmpty(designLayout) ? designLayout : ""; 2185 2186 string title = item.GetBoolean("ShowTitle") ? item.GetString("Title") : ""; 2187 string alt = !String.IsNullOrEmpty(item.GetString("Title")) ? item.GetString("Title") : ""; 2188 2189 if (!String.IsNullOrEmpty(item.GetString("AltText"))){ 2190 alt = item.GetString("AltText"); 2191 } 2192 2193 string cardClass = item.GetBoolean("ShowAsCard") ? "paragraph-card" : ""; 2194 string buttonSpacing = ""; 2195 string buttonAlignment = layout == "all-centered" || layout == "middle-center" ? "grid--justify-center" : ""; 2196 2197 2198 string image = item.GetFile("Image") != null ? item.GetFile("Image").ToString().Replace("&","%26") + "&" + item.GetFile("Image").GetFocalPointParameters() : ""; 2199 2200 2201 int cropMode = !String.IsNullOrEmpty(Converter.ToString(item.GetList("ImageCrop"))) ? Convert.ToInt32(item.GetList("ImageCrop").SelectedValue) : 0; 2202 ImageStyle imageStyle = item.GetList("ImageStyle").SelectedValue == "ball" ? ImageStyle.Ball : ImageStyle.None; 2203 ButtonLayout primaryButtonLayout = !String.IsNullOrEmpty(item.GetList("ButtonDesign").SelectedValue) ? (ButtonLayout)System.Enum.Parse(typeof(ButtonLayout), char.ToUpper(item.GetList("ButtonDesign").SelectedValue[0]) + item.GetList("ButtonDesign").SelectedValue.Substring(1)) : ButtonLayout.Primary; 2204 if (primaryButtonLayout == ButtonLayout.Link) 2205 { 2206 primaryButtonLayout = ButtonLayout.LinkClean; 2207 } 2208 ButtonLayout secondaryButtonLayout = !String.IsNullOrEmpty(item.GetList("SecondaryButtonDesign").SelectedValue) ? (ButtonLayout)System.Enum.Parse(typeof(ButtonLayout), char.ToUpper(item.GetList("SecondaryButtonDesign").SelectedValue[0]) + item.GetList("SecondaryButtonDesign").SelectedValue.Substring(1)) : ButtonLayout.Secondary; 2209 if (secondaryButtonLayout == ButtonLayout.Link) 2210 { 2211 secondaryButtonLayout = ButtonLayout.LinkClean; 2212 } 2213 ImageFilter primaryImageFilter = !string.IsNullOrEmpty(item.GetList("ImageFilterPrimary").SelectedValue) ? (ImageFilter) Enum.Parse(typeof(ImageFilter), item.GetList("ImageFilterPrimary").SelectedValue.Replace("-", ""), true) : ImageFilter.None; 2214 ImageFilter secondaryImageFilter = !string.IsNullOrEmpty(item.GetList("ImageFilterSecondary").SelectedValue) ? (ImageFilter) Enum.Parse(typeof(ImageFilter), item.GetList("ImageFilterSecondary").SelectedValue.Replace("-", ""), true) : ImageFilter.None; 2215 string imageFilterColorCode = item.GetString("ColorForTheFilter").StartsWith("#") && primaryImageFilter == ImageFilter.Colorize ? GenerateRgba(item.GetString("ColorForTheFilter"), 0.3) : ""; 2216 bool setImageAsBackground = item.GetList("ImageStyle").SelectedValue.ToLower() == "background" ? true : false; 2217 2218 bool fillCanvas = item.GetBoolean("FillCanvas"); 2219 2220 2221 var imageWidthCustom = 1240; 2222 var imageHeightCustom = 950; 2223 2224 if (item.GetList("Width").SelectedValue != "auto") { 2225 //imageWidthCustom = Int32.Parse(item.GetList("Width").SelectedValue) < 8 ? 620 : 1240; 2226 //imageHeightCustom = Int32.Parse(item.GetList("Width").SelectedValue) < 8 ? 496 : 950; 2227 } 2228 2229 Image paragraphImage = null; 2230 2231 2232 if (!String.IsNullOrEmpty(image)) 2233 { 2234 paragraphImage = new Image 2235 { 2236 Path = image, 2237 Title = alt, 2238 Link = item.GetString("Link"), 2239 FilterPrimary = primaryImageFilter, 2240 FilterSecondary = secondaryImageFilter, 2241 FilterColor = imageFilterColorCode, 2242 Style = imageStyle, 2243 ImageDefault = new ImageSettings 2244 { 2245 Crop = cropMode, 2246 Height = imageHeightCustom, 2247 Width = imageWidthCustom, 2248 FillCanvas = fillCanvas 2249 }, 2250 ImageMedium = new ImageSettings 2251 { 2252 Crop = cropMode, 2253 Height = 450, 2254 Width = 1024 2255 }, 2256 ImageSmall = new ImageSettings 2257 { 2258 Crop = cropMode, 2259 Height = 544, 2260 Width = 640 2261 } 2262 }; 2263 } 2264 2265 ContentParagraph paragraph = new ContentParagraph 2266 { 2267 Title = title, 2268 Text = item.GetString("Text"), 2269 Image = paragraphImage, 2270 Link = item.GetString("Link"), 2271 Module = !String.IsNullOrEmpty(Model.GetModuleOutput()) && renderModule ? Model.GetModuleOutput() : "", 2272 InnerPaddingCss = item.GetList("InnerPadding") != null ? "paragraph-container__body--padding-" + item.GetList("InnerPadding").SelectedValue : "", 2273 CardCss = cardClass, 2274 HideOuterPadding = item.GetBoolean("HidePadding"), 2275 SetImageAsBackground = item.GetList("ImageStyle").SelectedValue.ToLower() == "background" ? true : false, 2276 ButtonWrapperCss = buttonSpacing + buttonAlignment, 2277 Layout = layout 2278 }; 2279 2280 if (!String.IsNullOrEmpty(item.GetString("Link"))) 2281 { 2282 paragraph.ButtonPrimary = new Link 2283 { 2284 Href = item.GetString("Link"), 2285 Title = item.GetString("LinkText"), 2286 ButtonLayout = primaryButtonLayout, 2287 CssClass = "u-no-margin" 2288 }; 2289 2290 if (!String.IsNullOrEmpty(item.GetString("SecondaryLink"))) { 2291 paragraph.ButtonPrimary.CssClass = ""; 2292 } 2293 } 2294 2295 if (!String.IsNullOrEmpty(item.GetString("SecondaryLink"))) 2296 { 2297 if (!String.IsNullOrEmpty(item.GetString("Link"))) 2298 { 2299 paragraph.ButtonPrimary.CssClass += " u-margin-right--lg"; 2300 } 2301 2302 paragraph.ButtonSecondary = new Link 2303 { 2304 Href = item.GetString("SecondaryLink"), 2305 Title = item.GetString("SecondaryLinkText"), 2306 ButtonLayout = secondaryButtonLayout 2307 }; 2308 } 2309 2310 <div class="paragraph-container @paragraphClasses dw-mod"> 2311 @if (setImageAsBackground == true && paragraphImage != null) 2312 { 2313 paragraphImage.CssClass = "background-image__cover"; 2314 2315 <div class="background-image dw-mod"> 2316 <div class="background-image__wrapper dw-mod"> 2317 @Render(paragraphImage) 2318 </div> 2319 </div> 2320 } 2321 @{ 2322 switch (layout) 2323 { 2324 case "title-top": 2325 @RenderLayoutTitleTop(paragraph) 2326 break; 2327 case "image-left": 2328 @RenderLayoutImageLeft(paragraph) 2329 break; 2330 case "image-right": 2331 @RenderLayoutImageRight(paragraph) 2332 break; 2333 case "image-centered": 2334 @RenderLayoutImageCentered(paragraph) 2335 break; 2336 case "all-centered": 2337 @RenderLayoutAllCentered(paragraph) 2338 break; 2339 case "middle-center": 2340 case "middle-left": 2341 @RenderLayoutMiddle(paragraph) 2342 break; 2343 default: 2344 @RenderLayoutImageTop(paragraph) 2345 break; 2346 } 2347 } 2348 </div> 2349 } 2350 } 2351 2352 2353 @helper RenderLayoutTitleTop(ContentParagraph settings) 2354 { 2355 <div class="grid__cell @settings.CardCss @settings.InnerPaddingCss dw-mod"> 2356 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2357 @if (!settings.SetImageAsBackground && settings.Image != null) 2358 { 2359 <div class="u-margin-bottom--lg"> 2360 @Render(settings.Image) 2361 </div> 2362 } 2363 @Render(new Text { Content = settings.Text}) 2364 @Render(new ContentModule { Content = settings.Module }) 2365 2366 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2367 { 2368 <div class="grid__cell"> 2369 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2370 @Render(settings.ButtonPrimary) 2371 @Render(settings.ButtonSecondary) 2372 </div> 2373 </div> 2374 } 2375 </div> 2376 } 2377 2378 @helper RenderLayoutImageLeft(ContentParagraph settings) 2379 { 2380 <div class="grid__cell @settings.CardCss @settings.InnerPaddingCss dw-mod"> 2381 <div class="grid grid--external-bleed"> 2382 @if (!settings.SetImageAsBackground && settings.Image != null) 2383 { 2384 <div class="grid__col-3"> 2385 @Render(settings.Image) 2386 </div> 2387 } 2388 <div class="grid__col-9 @settings.InnerPaddingCss dw-mod"> 2389 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2390 @Render(new Text { Content = settings.Text }) 2391 @Render(new ContentModule { Content = settings.Module }) 2392 2393 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2394 { 2395 <div class="grid__cell"> 2396 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2397 @Render(settings.ButtonPrimary) 2398 @Render(settings.ButtonSecondary) 2399 </div> 2400 </div> 2401 } 2402 </div> 2403 </div> 2404 </div> 2405 } 2406 2407 @helper RenderLayoutImageRight(ContentParagraph settings) 2408 { 2409 <div class="grid__cell @settings.CardCss"> 2410 <div class="grid grid--external-bleed"> 2411 <div class="grid__col-9 @settings.InnerPaddingCss dw-mod"> 2412 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2413 @Render(new Text { Content = settings.Text }) 2414 @Render(new ContentModule { Content = settings.Module }) 2415 2416 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2417 { 2418 <div class="grid__cell"> 2419 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2420 @Render(settings.ButtonPrimary) 2421 @Render(settings.ButtonSecondary) 2422 </div> 2423 </div> 2424 } 2425 </div> 2426 @if (!settings.SetImageAsBackground && settings.Image != null) 2427 { 2428 <div class="grid__col-3"> 2429 @Render(settings.Image) 2430 </div> 2431 } 2432 </div> 2433 </div> 2434 } 2435 2436 @helper RenderLayoutImageCentered(ContentParagraph settings) 2437 { 2438 <div class="grid__cell @settings.CardCss @settings.InnerPaddingCss dw-mod"> 2439 2440 <div class="u-ta-center"> 2441 @if (!settings.SetImageAsBackground && settings.Image != null) 2442 { 2443 <div class="u-margin-bottom--lg u-inline-block"> 2444 @Render(settings.Image) 2445 </div> 2446 } 2447 </div> 2448 2449 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2450 @Render(new Text { Content = settings.Text }) 2451 @Render(new ContentModule { Content = settings.Module }) 2452 2453 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2454 { 2455 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2456 @Render(settings.ButtonPrimary) 2457 @Render(settings.ButtonSecondary) 2458 </div> 2459 } 2460 </div> 2461 } 2462 2463 @helper RenderLayoutAllCentered(ContentParagraph settings) 2464 { 2465 <div class="grid__cell @settings.CardCss @settings.InnerPaddingCss dw-mod"> 2466 2467 <div class="u-ta-center"> 2468 @if (!settings.SetImageAsBackground && settings.Image != null) 2469 { 2470 <div class="u-margin-bottom--lg u-inline-block"> 2471 @Render(settings.Image) 2472 </div> 2473 } 2474 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2475 @Render(new Text { Content = settings.Text }) 2476 @Render(new ContentModule { Content = settings.Module }) 2477 </div> 2478 2479 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2480 { 2481 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2482 @Render(settings.ButtonPrimary) 2483 @Render(settings.ButtonSecondary) 2484 </div> 2485 } 2486 </div> 2487 } 2488 2489 @helper RenderLayoutMiddle(ContentParagraph settings) 2490 { 2491 <div> 2492 <div class="grid__cell @settings.CardCss @settings.InnerPaddingCss dw-mod"> 2493 2494 <div class="@(settings.Layout == "middle-center" ? "u-ta-center" : "")"> 2495 @if (!settings.SetImageAsBackground && settings.Image != null) 2496 { 2497 <div class="u-margin-bottom--lg u-inline-block"> 2498 @Render(settings.Image) 2499 </div> 2500 } 2501 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2502 @Render(new Text { Content = settings.Text }) 2503 @Render(new ContentModule { Content = settings.Module }) 2504 </div> 2505 2506 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2507 { 2508 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2509 @Render(settings.ButtonPrimary) 2510 @Render(settings.ButtonSecondary) 2511 </div> 2512 } 2513 </div> 2514 </div> 2515 } 2516 2517 @helper RenderLayoutImageTop(ContentParagraph settings) 2518 { 2519 <div class="grid__cell @settings.CardCss"> 2520 @if (!settings.SetImageAsBackground && settings.Image != null) 2521 { 2522 <div class="u-margin-bottom--lg"> 2523 @Render(settings.Image) 2524 </div> 2525 } 2526 2527 <div class="@settings.InnerPaddingCss dw-mod"> 2528 @Render(new Heading { Level = 2, Title = settings.Title, Link = settings.Link }) 2529 @Render(new Text { Content = settings.Text }) 2530 @Render(new ContentModule { Content = settings.Module }) 2531 2532 @if (settings.ButtonPrimary != null || settings.ButtonSecondary != null) 2533 { 2534 <div class="paragraph-container__button @settings.ButtonWrapperCss dw-mod"> 2535 @Render(settings.ButtonPrimary) 2536 @Render(settings.ButtonSecondary) 2537 </div> 2538 } 2539 </div> 2540 </div> 2541 } 2542 2543 2544 @{ 2545 2546 var cookieList = CookieManager.GetCookieOptInCategories(); 2547 string cookieLevel = CookieManager.GetCookieOptInLevel().ToString(); 2548 bool CookieStat = false; 2549 bool CookiePref = false; 2550 bool CookieTek = false; 2551 bool CookieMark = false; 2552 foreach (var cookie in cookieList){ 2553 if(cookie=="Statistik" || cookieLevel=="All"){CookieStat = true;} 2554 if(cookie=="Praeferencer" || cookieLevel=="All"){CookiePref = true;} 2555 if(cookie=="Noedvendige" || cookieLevel=="All"){CookieTek = true;} 2556 if(cookie=="Marketing" || cookieLevel=="All"){CookieMark = true;} 2557 } 2558 2559 // <small>@cookieLevel @CookieTek @CookiePref @CookieStat @CookieMark</small> 2560 2561 bool allowCookies = CookieManager.GetCookieOptInLevel() == 0 || !CookieManager.CookieOptInLevelExists ? false : true; 2562 // All Functional 2563 2564 string fontColor = !string.IsNullOrEmpty(Model.Item.GetString("FontColor")) && !Model.Item.GetString("FontColor").StartsWith("#") ? "u-" + Model.Item.GetString("FontColor").Replace(" ", "-").ToLower() : ""; 2565 string backgroundColor = !string.IsNullOrEmpty(Model.Item.GetString("BackgroundColor")) && !Model.Item.GetString("BackgroundColor").StartsWith("#") ? "u-" + Model.Item.GetString("BackgroundColor").Replace(" ", "-").ToLower() + "--bg" : ""; 2566 string colorSettings = Model.Item.GetString("FontColor").StartsWith("#") || Model.Item.GetString("BackgroundColor").StartsWith("#") ? "style=\"" : ""; 2567 string fontColorHex = Model.Item.GetString("FontColor").StartsWith("#") ? "color: " + Model.Item.GetString("FontColor") + ";" : ""; 2568 string backgroundColorHex = Model.Item.GetString("BackgroundColor").StartsWith("#") ? "background-color: " + Model.Item.GetString("BackgroundColor") + ";" : ""; 2569 colorSettings += fontColorHex; 2570 colorSettings += backgroundColorHex; 2571 colorSettings += Model.Item.GetString("FontColor").StartsWith("#") || Model.Item.GetString("BackgroundColor").StartsWith("#") ? "\"" : ""; 2572 2573 string paragraphContainerClasses = ""; 2574 string containerClasses = ""; 2575 string gridClasses = ""; 2576 2577 string spacingSize = Model.Item.GetList("Spacing") != null && Model.Item.GetList("Spacing").SelectedValue != "" ? Model.Item.GetList("Spacing").SelectedValue : "lg"; 2578 2579 2580 2581 switch (Model.Item.GetList("Width").SelectedValue) 2582 { 2583 case "center": 2584 containerClasses += "center-container paragraph-container "; 2585 paragraphContainerClasses += " " + fontColor + " " + backgroundColor; 2586 break; 2587 case "full": 2588 containerClasses += fontColor + " " + backgroundColor + " "; 2589 paragraphContainerClasses += "paragraph-container--full-width "; 2590 break; 2591 case "combi": 2592 paragraphContainerClasses += "paragraph-container--full-width " + fontColor + " " + backgroundColor + " "; 2593 containerClasses += "center-container paragraph-container "; 2594 break; 2595 default: 2596 paragraphContainerClasses += "center-container "; 2597 break; 2598 } 2599 2600 if (Model.Item.GetBoolean("RemoveInnerPadding")){ 2601 containerClasses += " no-padding"; 2602 } 2603 2604 2605 2606 //Background 2607 string focalPointParameters = Model.Item.GetFile("BackgroundImage") != null ? "&" + Model.Item.GetFile("BackgroundImage").GetFocalPointParameters() : ""; 2608 2609 string containerBackgroundImageFilterColor = Model.Item.GetList("ColorForTheFilter") != null ? Model.Item.GetString("ColorForTheFilter").Replace(" ", "-").ToLower() : "none"; 2610 string containerBackgroundImageFilterPrimary = Model.Item.GetList("ImageFilterPrimary") != null ? Model.Item.GetList("ImageFilterPrimary").SelectedValue : "none"; 2611 string containerBackgroundImageFilterSecondary = Model.Item.GetList("ImageFilterSecondary") != null ? Model.Item.GetList("ImageFilterSecondary").SelectedValue : "none"; 2612 string containerBackgroundImageFilterColorCode = Model.Item.GetString("ColorForTheFilter").StartsWith("#") && containerBackgroundImageFilterPrimary == "colorize" ? "style=\"background-color: " + GenerateRgba(Model.Item.GetString("ColorForTheFilter"), 0.3) + "\"" : ""; 2613 2614 if (containerBackgroundImageFilterPrimary == "colorize" && !containerBackgroundImageFilterPrimary.StartsWith("#")) 2615 { 2616 containerBackgroundImageFilterPrimary = containerBackgroundImageFilterColor; 2617 } 2618 2619 if (Model.Item.GetFile("BackgroundImage") == null) { 2620 backgroundColor = "u-color-light--bg"; 2621 } 2622 2623 //Separation line 2624 bool hasSeparationLine = Model.Item.GetBoolean("SeperationLineAfter"); 2625 if (hasSeparationLine && Model.Item.GetList("Width").SelectedValue != "center") 2626 { 2627 paragraphContainerClasses += "multiple-paragraphs-container--seperation-line-after "; 2628 } 2629 else if (hasSeparationLine) 2630 { 2631 containerClasses += "multiple-paragraphs-container--seperation-line-after "; 2632 } 2633 2634 //Alternative Design Layout 2635 var designLayout = Model.Item.GetItem("CustomSettings") != null ? Model.Item.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.Item.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : ""; 2636 paragraphContainerClasses += !String.IsNullOrEmpty(designLayout) ? designLayout : ""; 2637 2638 var paragraphHeight = Model.Item.GetList("Height").SelectedValue; 2639 //Height 2640 if (!string.IsNullOrEmpty(paragraphHeight)) 2641 { 2642 gridClasses += "paragraph-container--height-" + paragraphHeight + " " + (paragraphHeight == "screen" ? "screen-height " : ""); 2643 } 2644 2645 if (Model.Item.GetString("MakeParagraphsCenterAligned") != null && Model.Item.GetBoolean("MakeParagraphsCenterAligned")) 2646 { 2647 gridClasses += "grid--justify-center "; 2648 } 2649 2650 //Set as carousel 2651 if (Model.Item.GetBoolean("EnableCarousel")) 2652 { 2653 containerClasses.Replace(" paragraph-container ", ""); 2654 } 2655 2656 //getting video ID from youtube URL 2657 string videoCode = Model.Item.GetString("VideoURL"); 2658 string videoClass = Model.Item.GetBoolean("FixedAR") ? "fixed-16-9" : ""; 2659 Regex regex = new Regex(@".be\/(.[^?]*)"); 2660 Match match = regex.Match(videoCode); 2661 string videoId = ""; 2662 if (match.Success) 2663 { 2664 videoId = match.Groups[1].Value; 2665 } 2666 else 2667 { 2668 regex = new Regex(@"v=([^&]+)"); 2669 match = regex.Match(videoCode); 2670 if (match.Success) 2671 { 2672 videoId = match.Groups[1].Value; 2673 } 2674 } 2675 } 2676 2677 <div class="grid__col-md-12 grid__col--bleed"> 2678 <section class="multiple-paragraphs-container @paragraphContainerClasses @videoClass multiple-paragraphs-container--spacing-@spacingSize dw-mod" @colorSettings> 2679 <div class="background-image image-filter image-filter--@containerBackgroundImageFilterPrimary dw-mod" @containerBackgroundImageFilterColorCode> 2680 <div class="background-image__wrapper image-filter image-filter--@containerBackgroundImageFilterSecondary dw-mod"> 2681 @if (!String.IsNullOrEmpty(Model.Item.GetString("BackgroundImage"))) { 2682 @Render(new Image { 2683 Path = Model.Item.GetFile("BackgroundImage").PathUrlEncoded + focalPointParameters, 2684 CssClass = "background-image__cover", 2685 ImageDefault = new ImageSettings { 2686 Width = 1920, 2687 Height = 845, 2688 Crop = 0, 2689 FillCanvas = true 2690 }, 2691 ImageMedium = new ImageSettings 2692 { 2693 Width = 1024, 2694 Height = 450, 2695 Crop = 0, 2696 FillCanvas = true 2697 }, 2698 ImageSmall = new ImageSettings 2699 { 2700 Width = 640, 2701 Height = 544, 2702 Crop = 0, 2703 FillCanvas = true 2704 } 2705 }) 2706 } 2707 2708 @if (!string.IsNullOrEmpty(videoId)) 2709 { 2710 2711 if(CookieStat || CookieMark){ 2712 <div class="video-background"> 2713 <div class="video-background__container" c=1> 2714 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Model.ID)"></div> 2715 </div> 2716 </div> 2717 } 2718 if(!CookieStat && !CookieMark){ 2719 <div class="video-background"> 2720 <div class="video-background__container" c=0> 2721 <a href="https://youtu.be/@(videoId)" target="_blank" title="@Translate("Se video på YouTube")"> 2722 <img src="https://i.ytimg.com/vi/@(videoId)/hqdefault.jpg" alt="@Translate("Se video på YouTube")" style="object-fit: cover; width: 100%; height: 100%; aspect-ratio: 16 / 9;"> 2723 </a> 2724 </div> 2725 </div> 2726 } 2727 2728 } 2729 </div> 2730 </div> 2731 2732 @if (!Model.Item.GetBoolean("EnableCarousel")) 2733 { 2734 <div class="@containerClasses dw-mod"> 2735 <div class="grid @gridClasses dw-mod"> 2736 @foreach (var paragraph in Model.Item.GetItems("Paragraph")) 2737 { 2738 @RenderParagraph(paragraph, false) 2739 } 2740 @if (!String.IsNullOrEmpty(Model.GetModuleOutput())) { 2741 <div class="paragraph-container grid__col-12 dw-mod"> 2742 @Render(new ContentModule { Content = Model.GetModuleOutput() }) 2743 </div> 2744 } 2745 </div> 2746 </div> 2747 } 2748 else 2749 { 2750 var slides = new List<List<Dynamicweb.Frontend.ItemViewModel>>(); 2751 int tempColumnsCount = 0; 2752 var paragraphs = Model.Item.GetItems("Paragraph"); 2753 bool hasAtLeastOneVisibleParagraph = false; 2754 if (paragraphs.Count > 0) 2755 { 2756 slides.Add(new List<Dynamicweb.Frontend.ItemViewModel>()); 2757 } 2758 2759 foreach (var paragraph in paragraphs) 2760 { 2761 int columnWidth = 0; 2762 if (Pageview.Device.ToString() == "Mobile" && paragraph.GetList("WidthMobile").SelectedValue == "hide") 2763 { 2764 continue; 2765 } 2766 hasAtLeastOneVisibleParagraph = true; 2767 if (paragraph.GetList("Width").SelectedValue != "auto") 2768 { 2769 columnWidth = Pageview.Device.ToString() != "Mobile" ? Int32.Parse(paragraph.GetList("Width").SelectedValue) : Int32.Parse(paragraph.GetList("WidthMobile").SelectedValue); 2770 } 2771 else 2772 { 2773 columnWidth = 1; 2774 } 2775 2776 if (tempColumnsCount + columnWidth > 12) 2777 { 2778 slides.Add(new List<Dynamicweb.Frontend.ItemViewModel>()); 2779 tempColumnsCount = 0; 2780 } 2781 2782 slides[slides.Count - 1].Add(paragraph); 2783 tempColumnsCount += columnWidth; 2784 } 2785 2786 if (hasAtLeastOneVisibleParagraph) 2787 { 2788 <div class="@containerClasses dw-mod"> 2789 <div class="carousel dw-mod" id="Paragraph_@(Model.ID)"> 2790 <div class="carousel__container js-carousel-slides dw-mod"> 2791 @foreach (var slide in slides) 2792 { 2793 <div class="carousel__slide dw-mod"> 2794 <div class="grid @gridClasses dw-mod"> 2795 @foreach (var paragraph in slide) 2796 { 2797 @RenderParagraph(paragraph, false) 2798 } 2799 </div> 2800 </div> 2801 } 2802 </div> 2803 </div> 2804 </div> 2805 } 2806 2807 if (slides.Count > 1) 2808 { 2809 bool enableDots = Model.Item.GetBoolean("ShowDots"); 2810 2811 <script> 2812 document.addEventListener("DOMContentLoaded", function () { 2813 new CarouselModule("#Paragraph_@(Model.ID)", { 2814 slideTime: @Model.Item.GetString("SlideTime"), 2815 dots: @(Model.Item.GetBoolean("ShowDots").ToString().ToLower()) 2816 }); 2817 }) 2818 </script> 2819 } 2820 } 2821 </section> 2822 </div> 2823

Selvbetjening

Selvbetjeningsløsninger til udfordrende miljøer er værktøjer og systemer, der giver brugerne mulighed for at betjene sig selv og udføre forskellige opgaver eller transaktioner i miljøer, der kan være komplekse eller vanskelige. Disse løsninger er designet til at lette processen og forbedre effektiviteten i situationer, hvor der kan være begrænset adgang til personlig assistance eller hvor der er specifikke udfordringer, der skal overvindes.

Nogle eksempler på selvbetjeningsløsninger til udfordrende miljøer inkluderer:

Selvbetjeningskiosker: Disse er fysiske terminaler, der er placeret i offentlige rum eller specifikke miljøer og giver brugerne mulighed for at udføre forskellige opgaver. For eksempel kan selvbetjeningskiosker findes i lufthavne, hvor rejsende kan checke ind, udskrive boardingpas og foretage ændringer i deres reservationer uden at skulle interagere med personale.

Mobilapps: Mobilapplikationer kan være en effektiv selvbetjeningsløsning til udfordrende miljøer. For eksempel kan mobilapps bruges i områder med dårlig internetforbindelse eller i fjerntliggende områder, hvor brugerne kan udføre transaktioner eller få adgang til oplysninger offline.

Online selvbetjening: Online-platforme og websteder giver brugerne mulighed for at udføre forskellige opgaver eller transaktioner uden behov for fysisk tilstedeværelse. For eksempel kan online selvbetjeningsløsninger anvendes til at administrere bankkonti, betale regninger, planlægge rejser og foretage indkøb.

Automatiserede betalingsløsninger: I udfordrende miljøer kan selvbetjeningsløsninger til betaling være særligt nyttige. Dette kan omfatte betalingsautomater, kontaktløse betalingssystemer eller mobile betalingsløsninger, der giver brugerne mulighed for at foretage betalinger uden at skulle interagere med en person.

Selvbetjening i sundhedssektoren: I sundhedssektoren kan selvbetjeningsløsninger være gavnlige i udfordrende miljøer som hospitaler eller klinikker. Dette kan omfatte selvbetjeningsregistrering, online tidsbestillingssystemer, elektronisk patientjournaladgang og selvtestningsudstyr.

Selvbetjeningsløsninger til udfordrende miljøer er designet til at forbedre effektiviteten, spare tid og give brugerne en mere fleksibel og bekvem oplevelse. Ved at implementere sådanne løsninger kan organisationer forbedre deres service og tilgængelighed i miljøer, hvor der kan være begrænsninger eller udfordringer ved traditionelle betjeningsmetoder.

Denne hjemmeside bruger cookies

Dette website bruger cookies til at følge din adfærd og for at forbedre brugeroplevelsen på sitet.

Du kan altid slette gemte cookies i dine browserinstillinger

Show details