Error executing template "Designs/Rapido/ContentPage/Paragraph/Job.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_96ec4db67faf48e48c696d9442b5301f.Execute() in D:\dynamicweb.net\Solutions\danishagro-various.cloud.dynamicweb-cms.com\Files\Templates\Designs\Rapido\ContentPage\Paragraph\Job.cshtml:line 52 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 3 @using System.Web 4 @using DanishagroBrandingMaster.JobsApi 5 @using Dynamicweb.Rapido.Blocks.Components.General 6 @using HtmlAgilityPack 7 @using Dynamicweb.Frontend.Devices 8 9 10 @functions 11 { 12 dynamic GetEnumSetting(dynamic enumSetting, string name = null) 13 { 14 string enumName = name == null ? enumSetting.GetType().Name : name; 15 enumSetting = HttpContext.Current.Request.QueryString.Get(enumName) != null ? System.Enum.Parse(enumSetting.GetType(), HttpContext.Current.Request.QueryString.Get(enumName)) : enumSetting; 16 return enumSetting; 17 } 18 19 string jobUrl = string.Empty; 20 string address = ""; 21 Dynamicweb.Content.ParagraphService paragraphService = new Dynamicweb.Content.ParagraphService(); 22 bool isMobileOrTablet; 23 string colorSetting; 24 25 } 26 27 @{ 28 isMobileOrTablet = Pageview.Device == DeviceType.Mobile || Pageview.Device == DeviceType.Tablet; 29 int jobId; 30 DanishagroBrandingMaster.JobsApi.Content contentList; 31 colorSetting = Pageview.AreaSettings?.GetItem("Layout")?.GetString("DropdownActiveColor") ?? ""; //Tag DropdownActiveColor fra layout 32 colorSetting = colorSetting != "" ? colorSetting : "#849938"; 33 34 HttpContext context = HttpContext.Current; 35 var customerAlias = Model.Item.GetString("CustomerAliasJob"); 36 jobUrl = "/Default.aspx?ID=" + GetPageIdByNavigationTag("InactiveJobRedirect"); 37 38 if (context.Session["JobId"] == null || context.Session["Positions"] == null) 39 { 40 jobId = Convert.ToInt32(context.Request.QueryString["jobId"]); ; 41 42 IService service = new Service(); 43 contentList = service.CreateObject(customerAlias); 44 } 45 else 46 { 47 jobId = (int)(context.Session["jobId"]); 48 contentList = (DanishagroBrandingMaster.JobsApi.Content)(context.Session["Positions"]); 49 } 50 51 52 Item3 item = contentList.PositionList.Items.FirstOrDefault(x => x.Id == jobId); 53 if (item != null) 54 { 55 Users users = item.Users; 56 57 IService service = new Service(); 58 string advertisementUrl = service.GetAdvertisementUrl(item.AdvertisementUrl); 59 60 HtmlDocument doc = new HtmlDocument(); 61 doc.LoadHtml(advertisementUrl); 62 63 advertisementUrl = doc.GetElementbyId("AdvertisementInnerContent").OuterHtml; 64 address = service.GetAddressByCoordinates(item.WorkPlaceCoordinates); 65 66 @RenderJobPage(advertisementUrl, item, users, contentList, context); 67 } 68 else 69 { 70 @Render404() 71 } 72 } 73 74 @helper RenderJobPage(string advertisementUrl, Item3 item, Users users, DanishagroBrandingMaster.JobsApi.Content contentList, HttpContext context) 75 { 76 var advertisementImage = item.Advertisements?.FirstOrDefault()?.ImageUrlSecure; 77 if (!string.IsNullOrEmpty(advertisementImage)) 78 { 79 if (isMobileOrTablet) 80 { 81 <div class="background-image-container-job"> 82 <img class="" src="@advertisementImage"> 83 </div> 84 } 85 else 86 { 87 <div></div> 88 <div class="image-cover-job" style="background-image: url(@advertisementImage);"></div> 89 90 } 91 } 92 93 <div class="grid content-row--spacing-xl"> 94 <div class="grid__col-lg-8 content-text"> 95 <header> 96 <h1> 97 @item.Name 98 </h1> 99 </header> 100 @advertisementUrl 101 </div> 102 <div class="grid__col-lg-4 padding-none" style="margin-top: 15px;"> 103 <div class="content-row__item rowItemContent-12903 dw-mod u-flex--column"> 104 105 <div class="u-full-width u-align-left u-align-self-start dw-mod content--background-and-color" style="background-color:@colorSetting;" id="jobInformationBox"> 106 <div class="u-full-height"> 107 <div class="content-row__item__body padding-size-md padding-position-around dw-mod"> 108 <div class="u-margin-bottom--md"> 109 @{ 110 var headline = Model.Item.GetString("JobinfoBox_Headline"); 111 if (string.IsNullOrEmpty(headline)) 112 { 113 headline = "Job info"; 114 } 115 <h3 class="u-margin-bottom--md-custom" style="color:white">@headline</h3> 116 } 117 118 @if (!string.IsNullOrWhiteSpace(address)) 119 { 120 <p> 121 <strong>@Translate("Workplace")</strong><br> 122 @{ 123 string mapsUrl = "https://www.google.com/maps/place/" + address; 124 var city = item.Department?.City ?? Translate("Ingen by fundet"); 125 @item.Department.Name 126 <br /> 127 @address <br /> 128 <a style="color:white;text-decoration:underline" href="@mapsUrl" target="_blank">@Translate("View map location") </a> 129 } 130 </p> 131 } 132 133 134 <p> 135 <strong>@Translate("Application due")</strong><br> 136 @if (item.ApplicationDue != DateTime.MinValue) 137 { 138 @item.ApplicationDue.ToShortDateString() 139 } 140 else 141 { 142 @Translate("As soon as possible") 143 } 144 </p> 145 <p> 146 @if (item.StartDate != DateTime.MinValue && !item.StartDateASAP) 147 { 148 <strong>@Translate("Start date")</strong><br> 149 @item.StartDate.ToShortDateString() 150 } 151 else 152 { 153 <strong>@Translate("Start date")</strong><br> 154 @Translate("As soon as possible") 155 } 156 </p> 157 158 @{ 159 ButtonLayout ButtonLayoutJobAgent; 160 try 161 { 162 ButtonLayoutJobAgent = (ButtonLayout)System.Enum.Parse(typeof(ButtonLayout), char.ToUpper(Model.Item.GetItem("Apply_Job_Button").GetList("Layout").SelectedValue[0]) + Model.Item.GetItem("Apply_Job_Button").GetList("Layout").SelectedValue.Substring(1)); 163 } 164 catch 165 { 166 ButtonLayoutJobAgent = ButtonLayout.Tertiary; 167 } 168 169 170 string ButtonTitleJobAgent = Model?.Item?.GetItem("Apply_Job_Button")?.GetString("Title") ?? Translate("JobAgentTitle"); 171 var applyJobButton = new Button 172 { 173 Id = "ApplyJob", 174 ButtonLayout = GetEnumSetting(ButtonLayoutJobAgent), 175 Title = ButtonTitleJobAgent, 176 CssClass = "u-margin-bottom--lg-custom", 177 //Icon = new Icon { Prefix = "fas", Name = "fa-plus", LabelPosition = IconLabelPosition.After }, 178 OnClick = $"window.location.href='{item.ApplicationFormUrl}';", 179 }; 180 if ((Model?.Item?.GetItem("Apply_Job_Button")?.GetBoolean("OpenInNewTab") ?? false) == true) 181 { 182 applyJobButton.OnClick = $"window.open('{item.ApplicationFormUrl}','_blank')"; 183 } 184 185 186 @Render(applyJobButton) 187 } 188 </div> 189 190 <div> 191 @{ 192 object ogImagePath = new object(); 193 var ogImageExists = Pageview.Page.PropertyItem.TryGetValue("OpenGraphImage", out ogImagePath); 194 HtmlDocument doc = new HtmlDocument(); 195 doc.LoadHtml(advertisementUrl); 196 var description = doc.DocumentNode.SelectSingleNode(".//p").InnerText; 197 } 198 @RenderSocialMediaShareIcons(new DanishagroBrandingMaster.Files.Files.Templates.Designs.Rapido.Components.Custom.SocialMediaShareIcon(Pageview) 199 { 200 EnableFacebook = Pageview.AreaSettings.GetItem("Danish_Agro_Branding").GetBoolean("Enable_Facebook"), 201 EnableTwitter = Pageview.AreaSettings.GetItem("Danish_Agro_Branding").GetBoolean("Enable_Twitter"), 202 EnableLinkedin = Pageview.AreaSettings.GetItem("Danish_Agro_Branding").GetBoolean("Enable_Linkedin"), 203 EnableMail = Pageview.AreaSettings.GetItem("Danish_Agro_Branding").GetBoolean("Enable_Mail"), 204 MetaTitle = Pageview.Page.MetaTitle, 205 OpengraphImage = !string.IsNullOrEmpty(advertisementImage) ? advertisementImage : ogImagePath.ToString(), 206 isExternal = !string.IsNullOrEmpty(advertisementImage) ? true : false, 207 OpengraphTitle = item.Name, 208 OpengraphDescription = description 209 }) 210 </div> 211 </div> 212 </div> 213 </div> 214 215 <div class="u-full-width u-align-left u-align-self-start dw-mod content--background-and-color" style="background-color: #B1B1B1; margin-top: 47px;" id="jobInformationBox"> 216 <div class="u-full-height"> 217 <div class="content-row__item__body padding-size-md padding-position-around dw-mod"> 218 <div class=""> 219 <div class="buttons-collection flex-start u-block dw-mod u-flex grid--direction-column"> 220 @{var jobagentBoxTitle = Model.Item.GetString("Headline"); 221 var jobagentBoxText = Model.Item.GetString("JobagentText"); 222 } 223 <h3 style="color: white; @(isMobileOrTablet? "margin-bottom: 0px;" : "")" class="">@jobagentBoxTitle</h3> 224 <div style="color: white;" class=""> 225 @jobagentBoxText 226 </div> 227 @{ 228 ButtonLayout ButtonLayoutApplyJob; 229 try 230 { 231 ButtonLayoutApplyJob = (ButtonLayout)System.Enum.Parse(typeof(ButtonLayout), char.ToUpper(Model.Item.GetItem("Job_Agent_Button").GetList("Layout").SelectedValue[0]) + Model.Item.GetItem("Job_Agent_Button").GetList("Layout").SelectedValue.Substring(1)); 232 } 233 catch 234 { 235 ButtonLayoutApplyJob = ButtonLayout.Tertiary; 236 } 237 238 string ButtonTitleApplyJob = Model?.Item?.GetItem("Job_Agent_Button")?.GetString("Title") ?? Translate("JobagentButtonTitle"); 239 var jobButton = new Button 240 { 241 Id = "JobAgent", 242 ButtonLayout = GetEnumSetting(ButtonLayoutApplyJob), 243 Title = ButtonTitleApplyJob, 244 OnClick = $"window.location.href='https://candidate.hr-manager.net/Agent/Subscription.aspx?customer={contentList.CustomerAlias}';" 245 }; 246 if ((Model?.Item?.GetItem("Job_Agent_Button")?.GetBoolean("OpenInNewTab") ?? false) == true) 247 { 248 jobButton.OnClick = "window.open('https://candidate.hr-manager.net/Agent/Subscription.aspx?customer=" + contentList.CustomerAlias + "','_blank')"; 249 } 250 251 @Render(jobButton) 252 } 253 </div> 254 </div> 255 </div> 256 </div> 257 </div> 258 </div> 259 </div> 260 </div> 261 if (users.ProjectLeader != null || users.ProjectParticipants != null) 262 { 263 if (!isMobileOrTablet) 264 { 265 <div class="grid"> 266 <div class="grid__col-lg-12 content-text" style="padding-top: 0px; padding-bottom: 0px; padding-right: 0px; height: 0px;"> 267 <div class="content-container dw-mod"> 268 <div class="content-row content-row--full content-row--column-gap-lg content-row--center content-row--height-auto content-row--spacing-xl content-row--spacing-position-bottom dw-mod"> 269 <div class="content-row__item rowItemContent-32508 dw-mod"> 270 <div class="u-full-width u-align-center dw-mod"> 271 <div class="separation-line-container separation-line-container--align-center dw-mod"> 272 <div class="separation-line separation-line--weight-xs separation-line--width-full dw-mod" style="border-color: #B1B1B1"></div> 273 </div> 274 </div> 275 </div> 276 </div> 277 </div> 278 </div> 279 </div> 280 } 281 282 <div class="grid"> 283 <div class="grid__col-lg-12 content-text"> 284 <div class="content-row content-row--full content-row--column-gap-lg content-row--center content-row--height-auto content-row--spacing-xl content-row--spacing-position-top dw-mod" style="margin-top: 0px;"> 285 <div class="content-row__item rowItemContent-12905 dw-mod"> 286 <div class="u-full-width u-align-left u-align-self-start dw-mod"> 287 <div class="u-full-height"> 288 <div class="content-row__item__body padding-size-none padding-position-around dw-mod"> 289 <div class="u-margin-bottom--lg"> 290 <h2>@Translate("Yderligere info")</h2> 291 <p>@Translate("Har du spørgsmål til stillingen, er du velkommen til at kontakte")</p> 292 </div> 293 </div> 294 </div> 295 </div> 296 </div> 297 </div> 298 </div> 299 <div class="grid__col-lg-12"> 300 <div class="content-row content-row--4col content-row--column-gap-none content-row--center content-row--height-auto content-row--spacing-xl content-row--spacing-position-bottom dw-mod"> 301 @{ 302 if (users.ProjectLeader != null) 303 { 304 <div class="content-row__item rowItemContent-12915 dw-mod @(isMobileOrTablet ? "job-margin-top" : "")"> 305 <div class="content-row__item__body padding-size-none padding-position-around u-align-left u-align-self-start dw-mod"> 306 <img class="b-lazy grid__cell-img--ball dw-mod b-loaded jobProfileImage" src="@users.ProjectLeader.ImageUrl?Width=130&Height=130&Crop=0&BackgroundColor=&DoNotUpscale=True&FillCanvas=False&Image=&AlternativeImage=/Images/missing_image.jpg"> 307 <div class="u-full-width u-padding-top dw-mod"> 308 <div class="u-margin-bottom--lg"> 309 310 @if (users.ProjectLeader.FirstName != String.Empty) 311 { 312 <p class="content-p-margin">@users.ProjectLeader.FirstName @users.ProjectLeader.LastName</p> 313 } 314 @if (users.ProjectLeader.Title != String.Empty) 315 { 316 <p class="content-p-margin"> @users.ProjectLeader.Title</p> 317 } 318 @if (users.ProjectLeader.Phone != String.Empty || users.ProjectLeader.PhoneMobile != String.Empty) 319 { 320 var phone = !string.IsNullOrWhiteSpace(users.ProjectLeader.PhoneMobile) ? users.ProjectLeader.PhoneMobile : users.ProjectLeader.Phone; 321 <p class="content-p-margin"> @phone</p> 322 } 323 @if (users.ProjectLeader.Email != String.Empty) 324 { 325 <p class="content-p-margin"> <a href="mailto:@users.ProjectLeader.Email?subject=Vedr. @item.Name ">@users.ProjectLeader.Email</a></p> 326 } 327 </div> 328 </div> 329 </div> 330 </div> 331 } 332 if (users.ProjectParticipants != null) 333 { 334 foreach (var usersProjectParticipant in users.ProjectParticipants) 335 { 336 <div class="content-row__item rowItemContent-12915 dw-mod"> 337 <div class="content-row__item__body padding-size-none padding-position-around u-align-left u-align-self-start dw-mod"> 338 <img class="b-lazy grid__cell-img--ball dw-mod b-loaded jobProfileImage @(isMobileOrTablet ? "job-margin-top" : "")" src="@usersProjectParticipant.ImageUrl?Width=130&Height=130&Crop=0&BackgroundColor=&DoNotUpscale=True&FillCanvas=False&Image=&AlternativeImage=/Images/missing_image.jpg"> 339 <div class="u-full-width u-padding-top dw-mod"> 340 <div class="u-margin-bottom--lg"> 341 @if (usersProjectParticipant.FirstName != String.Empty) 342 { 343 <p class="content-p-margin">@usersProjectParticipant.FirstName @usersProjectParticipant.LastName </p> 344 } 345 @if (usersProjectParticipant.Title != String.Empty) 346 { 347 <p class="content-p-margin">@usersProjectParticipant.Title </p> 348 } 349 @if (usersProjectParticipant.Phone != String.Empty || usersProjectParticipant.PhoneMobile != String.Empty) 350 { 351 var phone = !string.IsNullOrWhiteSpace(usersProjectParticipant.PhoneMobile) ? usersProjectParticipant.PhoneMobile : usersProjectParticipant.Phone; 352 <p class="content-p-margin"> @phone </p> 353 } 354 @if (usersProjectParticipant.Email != String.Empty) 355 { 356 <p class="content-p-margin"> <a href="mailto:@usersProjectParticipant.Email?subject=Vedr. @item.Name ">@usersProjectParticipant.Email</a> </p> 357 } 358 </div> 359 </div> 360 </div> 361 </div> 362 } 363 } 364 } 365 <div class="content-row__item dw-mod"> 366 <div class="content-row__item__body dw-mod"> 367 </div> 368 </div> 369 </div> 370 </div> 371 </div>} 372 373 <script> 374 document.addEventListener('DOMContentLoaded', () => { 375 var el = createBreadcrumbItem(); 376 var lastBreadcrumb = makePreviousLastBCrumbClickable(); 377 if (lastBreadcrumb) { 378 insertAfter(lastBreadcrumb, el); 379 } 380 }); 381 382 function createBreadcrumbItem() { 383 var el = document.createElement("li"); 384 el.innerHTML = `<span class="dw-mod">@item.Name</span>`; 385 el.classList.add("breadcrumb__item"); 386 return el; 387 } 388 389 function makePreviousLastBCrumbClickable() { 390 var breadcrumbItems = document.getElementsByClassName("breadcrumb__item"); 391 if (breadcrumbItems.length > 0) { 392 var lastBreadcrumb = breadcrumbItems[breadcrumbItems.length - 1]; 393 var breadcrumbLinkElement = lastBreadcrumb.firstElementChild; 394 var originalInnerHTML = breadcrumbLinkElement.innerHTML; 395 breadcrumbLinkElement.innerHTML = "<a href='" + breadcrumbLinkElement.getAttribute("data-link") + "'>" + originalInnerHTML + "</a>"; 396 return lastBreadcrumb; 397 } 398 return null; 399 400 } 401 402 function insertAfter(referenceNode, newNode) { 403 referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); 404 } 405 </script> 406 } 407 408 @helper Render404() 409 { 410 <script> 411 window.location.replace("@jobUrl"); 412 </script> 413 } 414 415 @using System.Text.RegularExpressions 416 @using System.Collections.Generic 417 @using System.Reflection 418 @using System.Web 419 @using System.Web.UI.HtmlControls 420 @using Dynamicweb.Rapido.Blocks.Components 421 @using Dynamicweb.Rapido.Blocks.Components.Articles 422 @using Dynamicweb.Rapido.Blocks.Components.Documentation 423 @using Dynamicweb.Rapido.Blocks 424 425 426 @*--- START: Base block renderers ---*@ 427 428 @helper RenderBlockList(List<Block> blocks) 429 { 430 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 431 blocks = blocks.OrderBy(item => item.SortId).ToList(); 432 433 foreach (Block item in blocks) 434 { 435 if (debug) { 436 <!-- Block START: @item.Id --> 437 } 438 439 if (item.Design == null) 440 { 441 @RenderBlock(item) 442 } 443 else if (item.Design.RenderType == RenderType.None) { 444 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 445 446 <div class="@cssClass dw-mod"> 447 @RenderBlock(item) 448 </div> 449 } 450 else if (item.Design.RenderType != RenderType.Hide) 451 { 452 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : ""; 453 454 if (!item.SkipRenderBlocksList) { 455 if (item.Design.RenderType == RenderType.Row) 456 { 457 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id"> 458 @RenderBlock(item) 459 </div> 460 } 461 462 if (item.Design.RenderType == RenderType.Column) 463 { 464 string hidePadding = item.Design.HidePadding ? "u-no-padding" : ""; 465 string size = item.Design.Size ?? "12"; 466 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size; 467 468 <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"> 469 @RenderBlock(item) 470 </div> 471 } 472 473 if (item.Design.RenderType == RenderType.Table) 474 { 475 <table class="table @cssClass dw-mod" id="Block__@item.Id"> 476 @RenderBlock(item) 477 </table> 478 } 479 480 if (item.Design.RenderType == RenderType.TableRow) 481 { 482 <tr class="@cssClass dw-mod" id="Block__@item.Id"> 483 @RenderBlock(item) 484 </tr> 485 } 486 487 if (item.Design.RenderType == RenderType.TableColumn) 488 { 489 <td class="@cssClass dw-mod" id="Block__@item.Id"> 490 @RenderBlock(item) 491 </td> 492 } 493 494 if (item.Design.RenderType == RenderType.CardHeader) 495 { 496 <div class="card-header @cssClass dw-mod"> 497 @RenderBlock(item) 498 </div> 499 } 500 501 if (item.Design.RenderType == RenderType.CardBody) 502 { 503 <div class="card @cssClass dw-mod"> 504 @RenderBlock(item) 505 </div> 506 } 507 508 if (item.Design.RenderType == RenderType.CardFooter) 509 { 510 <div class="card-footer @cssClass dw-mod"> 511 @RenderBlock(item) 512 </div> 513 } 514 } 515 else 516 { 517 @RenderBlock(item) 518 } 519 } 520 521 if (debug) { 522 <!-- Block END: @item.Id --> 523 } 524 } 525 } 526 527 @helper RenderBlock(Block item) 528 { 529 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false; 530 531 if (item.Template != null) 532 { 533 @BlocksPage.RenderTemplate(item.Template) 534 } 535 536 if (item.Component != null) 537 { 538 string customSufix = "Custom"; 539 string methodName = item.Component.HelperName; 540 541 ComponentBase[] methodParameters = new ComponentBase[1]; 542 methodParameters[0] = item.Component; 543 Type methodType = this.GetType(); 544 545 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix); 546 547 try { 548 if (debug) { 549 <!-- Component: @methodName.Replace("Render", "") --> 550 } 551 if(customMethod != null) { 552 @customMethod.Invoke(this, methodParameters).ToString(); 553 } else { 554 MethodInfo generalMethod = methodType.GetMethod(methodName); 555 @generalMethod.Invoke(this, methodParameters).ToString(); 556 } 557 } catch { 558 try { 559 MethodInfo generalMethod = methodType.GetMethod(methodName); 560 @generalMethod.Invoke(this, methodParameters).ToString(); 561 } catch(Exception ex) { 562 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex); 563 } 564 } 565 } 566 567 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList) 568 { 569 @RenderBlockList(item.BlocksList) 570 } 571 } 572 573 @*--- END: Base block renderers ---*@ 574 575 @using Dynamicweb.Rapido.Blocks.Components 576 @using Dynamicweb.Rapido.Blocks.Components.General 577 @using Dynamicweb.Rapido.Blocks 578 @using System.IO 579 580 @* Required *@ 581 @using Dynamicweb.Rapido.Blocks.Components 582 @using Dynamicweb.Rapido.Blocks.Components.General 583 @using Dynamicweb.Rapido.Blocks 584 585 586 @helper Render(ComponentBase component) 587 { 588 if (component != null) 589 { 590 @component.Render(this) 591 } 592 } 593 594 @* Components *@ 595 @using System.Reflection 596 @using Dynamicweb.Rapido.Blocks.Components.General 597 598 599 @* Component *@ 600 601 @helper RenderIcon(Icon settings) 602 { 603 if (settings != null) 604 { 605 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 606 607 if (settings.Name != null) 608 { 609 if (string.IsNullOrEmpty(settings.Label)) 610 { 611 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> 612 } 613 else 614 { 615 if (settings.LabelPosition == IconLabelPosition.Before) 616 { 617 <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> 618 } 619 else 620 { 621 <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> 622 } 623 } 624 } 625 else if (!string.IsNullOrEmpty(settings.Label)) 626 { 627 @settings.Label 628 } 629 } 630 } 631 @using System.Reflection 632 @using Dynamicweb.Rapido.Blocks.Components.General 633 @using Dynamicweb.Rapido.Blocks.Components 634 @using Dynamicweb.Core 635 636 @* Component *@ 637 638 @helper RenderButton(Button settings) 639 { 640 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 641 { 642 Dictionary<string, string> attributes = new Dictionary<string, string>(); 643 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 644 if (settings.Disabled) { 645 attributes.Add("disabled", "true"); 646 classList.Add("disabled"); 647 } 648 649 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle)) 650 { 651 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 652 @RenderConfirmDialog(settings); 653 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true"; 654 } 655 656 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 657 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 658 if (!string.IsNullOrEmpty(settings.AltText)) 659 { 660 attributes.Add("title", settings.AltText); 661 } 662 else if (!string.IsNullOrEmpty(settings.Title)) 663 { 664 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty); 665 cleanTitle = cleanTitle.Replace(" ", " "); 666 attributes.Add("title", cleanTitle); 667 } 668 669 var onClickEvents = new List<string>(); 670 if (!string.IsNullOrEmpty(settings.OnClick)) 671 { 672 onClickEvents.Add(settings.OnClick); 673 } 674 if (!string.IsNullOrEmpty(settings.Href)) 675 { 676 onClickEvents.Add("location.href='" + settings.Href + "'"); 677 } 678 if (onClickEvents.Count > 0) 679 { 680 attributes.Add("onClick", string.Join(";", onClickEvents)); 681 } 682 683 if (settings.ButtonLayout != ButtonLayout.None) 684 { 685 classList.Add("btn"); 686 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 687 if (btnLayout == "linkclean") 688 { 689 btnLayout = "link-clean"; //fix 690 } 691 classList.Add("btn--" + btnLayout); 692 } 693 694 if (settings.Icon == null) 695 { 696 settings.Icon = new Icon(); 697 } 698 699 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : ""; 700 settings.Icon.Label = settings.Title; 701 702 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower()); 703 704 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button> 705 } 706 } 707 708 @helper RenderConfirmDialog(Button settings) 709 { 710 Modal confirmDialog = new Modal { 711 Id = settings.Id, 712 Width = ModalWidth.Sm, 713 Heading = new Heading 714 { 715 Level = 2, 716 Title = settings.ConfirmTitle 717 }, 718 BodyText = settings.ConfirmText 719 }; 720 721 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"}); 722 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick }); 723 724 @Render(confirmDialog) 725 } 726 @using Dynamicweb.Rapido.Blocks.Components.General 727 @using Dynamicweb.Rapido.Blocks.Components 728 @using Dynamicweb.Core 729 730 @helper RenderDashboard(Dashboard settings) 731 { 732 var widgets = settings.GetWidgets(); 733 734 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor)) 735 { 736 //set bg color for them 737 738 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor); 739 int r = Convert.ToInt16(color.R); 740 int g = Convert.ToInt16(color.G); 741 int b = Convert.ToInt16(color.B); 742 743 var count = widgets.Length; 744 var max = Math.Max(r, Math.Max(g, b)); 745 double step = 255.0 / (max * count); 746 var i = 0; 747 foreach (var widget in widgets) 748 { 749 i++; 750 751 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")"; 752 widget.BackgroundColor = shade; 753 } 754 } 755 756 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 757 @foreach (var widget in widgets) 758 { 759 <div class="dashboard__widget"> 760 @Render(widget) 761 </div> 762 } 763 </div> 764 } 765 @using Dynamicweb.Rapido.Blocks.Components.General 766 @using Dynamicweb.Rapido.Blocks.Components 767 768 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings) 769 { 770 if (!string.IsNullOrEmpty(settings.Link)) 771 { 772 var backgroundStyles = ""; 773 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 774 { 775 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\""; 776 } 777 778 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 779 <div class="u-center-middle u-color-light"> 780 @if (settings.Icon != null) 781 { 782 settings.Icon.CssClass += "widget__icon"; 783 @Render(settings.Icon) 784 } 785 <div class="widget__title">@settings.Title</div> 786 </div> 787 </a> 788 } 789 } 790 @using Dynamicweb.Rapido.Blocks.Components.General 791 @using Dynamicweb.Rapido.Blocks.Components 792 793 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings) 794 { 795 var backgroundStyles = ""; 796 if (!string.IsNullOrEmpty(settings.BackgroundColor)) 797 { 798 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'"; 799 } 800 801 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 802 <div class="u-center-middle u-color-light"> 803 @if (settings.Icon != null) 804 { 805 settings.Icon.CssClass += "widget__icon"; 806 @Render(settings.Icon) 807 } 808 <div class="widget__counter">@settings.Count</div> 809 <div class="widget__title">@settings.Title</div> 810 </div> 811 </div> 812 } 813 @using System.Reflection 814 @using Dynamicweb.Rapido.Blocks.Components.General 815 @using Dynamicweb.Rapido.Blocks.Components 816 @using Dynamicweb.Core 817 818 @* Component *@ 819 820 @helper RenderLink(Link settings) 821 { 822 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null)) 823 { 824 Dictionary<string, string> attributes = new Dictionary<string, string>(); 825 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>(); 826 if (settings.Disabled) 827 { 828 attributes.Add("disabled", "true"); 829 classList.Add("disabled"); 830 } 831 832 if (!string.IsNullOrEmpty(settings.AltText)) 833 { 834 attributes.Add("title", settings.AltText); 835 } 836 else if (!string.IsNullOrEmpty(settings.Title)) 837 { 838 attributes.Add("title", settings.Title); 839 } 840 841 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 842 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 843 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); } 844 attributes.Add("href", settings.Href); 845 846 if (settings.ButtonLayout != ButtonLayout.None) 847 { 848 classList.Add("btn"); 849 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower(); 850 if (btnLayout == "linkclean") 851 { 852 btnLayout = "link-clean"; //fix 853 } 854 classList.Add("btn--" + btnLayout); 855 } 856 857 if (settings.Icon == null) 858 { 859 settings.Icon = new Icon(); 860 } 861 settings.Icon.Label = settings.Title; 862 863 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None) 864 { 865 settings.Rel = LinkRelType.Noopener; 866 } 867 if (settings.Target != LinkTargetType.None) 868 { 869 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower()); 870 } 871 if (settings.Download) 872 { 873 attributes.Add("download", "true"); 874 } 875 if (settings.Rel != LinkRelType.None) 876 { 877 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower()); 878 } 879 880 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a> 881 } 882 } 883 @using System.Reflection 884 @using Dynamicweb.Rapido.Blocks.Components 885 @using Dynamicweb.Rapido.Blocks.Components.General 886 @using Dynamicweb.Rapido.Blocks 887 888 889 @* Component *@ 890 891 @helper RenderRating(Rating settings) 892 { 893 if (settings.Score > 0) 894 { 895 int rating = settings.Score; 896 string iconType = "fa-star"; 897 898 switch (settings.Type.ToString()) { 899 case "Stars": 900 iconType = "fa-star"; 901 break; 902 case "Hearts": 903 iconType = "fa-heart"; 904 break; 905 case "Lemons": 906 iconType = "fa-lemon"; 907 break; 908 case "Bombs": 909 iconType = "fa-bomb"; 910 break; 911 } 912 913 <div class="u-ta-right"> 914 @for (int i = 0; i < settings.OutOf; i++) 915 { 916 <i class="@(rating > i ? "fas" : "far") @iconType"></i> 917 } 918 </div> 919 } 920 } 921 @using System.Reflection 922 @using Dynamicweb.Rapido.Blocks.Components.General 923 @using Dynamicweb.Rapido.Blocks.Components 924 925 926 @* Component *@ 927 928 @helper RenderSelectFieldOption(SelectFieldOption settings) 929 { 930 Dictionary<string, string> attributes = new Dictionary<string, string>(); 931 if (settings.Checked) { attributes.Add("selected", "true"); } 932 if (settings.Disabled) { attributes.Add("disabled", "true"); } 933 if (settings.Value != null) { attributes.Add("value", settings.Value); } 934 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 935 936 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option> 937 } 938 @using System.Reflection 939 @using Dynamicweb.Rapido.Blocks.Components.General 940 @using Dynamicweb.Rapido.Blocks.Components 941 942 943 @* Component *@ 944 945 @helper RenderNavigation(Navigation settings) { 946 @RenderNavigation(new 947 { 948 id = settings.Id, 949 cssclass = settings.CssClass, 950 startLevel = settings.StartLevel, 951 endlevel = settings.EndLevel, 952 expandmode = settings.Expandmode, 953 sitemapmode = settings.SitemapMode, 954 template = settings.Template 955 }) 956 } 957 @using Dynamicweb.Rapido.Blocks.Components.General 958 @using Dynamicweb.Rapido.Blocks.Components 959 960 961 @* Component *@ 962 963 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) { 964 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 965 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 966 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 967 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 968 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 969 settings.SitemapMode = false; 970 971 @RenderNavigation(settings) 972 } 973 @using Dynamicweb.Rapido.Blocks.Components.General 974 @using Dynamicweb.Rapido.Blocks.Components 975 976 977 @* Component *@ 978 979 @helper RenderLeftNavigation(LeftNavigation settings) { 980 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id; 981 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template; 982 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel; 983 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel; 984 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode; 985 986 <div class="grid__cell"> 987 @RenderNavigation(settings) 988 </div> 989 } 990 @using System.Reflection 991 @using Dynamicweb.Rapido.Blocks.Components.General 992 @using Dynamicweb.Core 993 994 @* Component *@ 995 996 @helper RenderHeading(Heading settings) 997 { 998 if (settings != null && !string.IsNullOrEmpty(settings.Title)) 999 { 1000 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : ""; 1001 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div"; 1002 1003 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">") 1004 if (!string.IsNullOrEmpty(settings.Link)) 1005 { 1006 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None }) 1007 } 1008 else 1009 { 1010 if (settings.Icon == null) 1011 { 1012 settings.Icon = new Icon(); 1013 } 1014 settings.Icon.Label = settings.Title; 1015 @Render(settings.Icon) 1016 } 1017 @("</" + tagName + ">"); 1018 } 1019 } 1020 @using Dynamicweb.Rapido.Blocks.Components 1021 @using Dynamicweb.Rapido.Blocks.Components.General 1022 @using Dynamicweb.Rapido.Blocks 1023 1024 1025 @* Component *@ 1026 1027 @helper RenderImage(Image settings) 1028 { 1029 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None) 1030 { 1031 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1032 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); } 1033 1034 if (settings.Caption != null) 1035 { 1036 @:<div> 1037 } 1038 1039 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower(); 1040 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower(); 1041 1042 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)> 1043 <div class="image-filter image-filter--@secondaryFilterClass dw-mod"> 1044 @if (settings.Link != null) 1045 { 1046 <a href="@settings.Link"> 1047 @RenderTheImage(settings) 1048 </a> 1049 } 1050 else 1051 { 1052 @RenderTheImage(settings) 1053 } 1054 </div> 1055 </div> 1056 1057 if (settings.Caption != null) 1058 { 1059 <span class="image-caption dw-mod">@settings.Caption</span> 1060 @:</div> 1061 } 1062 } 1063 else 1064 { 1065 if (settings.Caption != null) 1066 { 1067 @:<div> 1068 } 1069 if (!string.IsNullOrEmpty(settings.Link)) 1070 { 1071 <a href="@settings.Link"> 1072 @RenderTheImage(settings) 1073 </a> 1074 } 1075 else 1076 { 1077 @RenderTheImage(settings) 1078 } 1079 1080 if (settings.Caption != null) 1081 { 1082 <span class="image-caption dw-mod">@settings.Caption</span> 1083 @:</div> 1084 } 1085 } 1086 } 1087 1088 @helper RenderTheImage(Image settings) 1089 { 1090 if (settings != null) 1091 { 1092 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg"; 1093 string placeholderImage = "/Files/Images/placeholder.gif"; 1094 string imageEngine = "/Admin/Public/GetImage.ashx?"; 1095 1096 string imageStyle = ""; 1097 1098 switch (settings.Style) 1099 { 1100 case ImageStyle.Ball: 1101 imageStyle = "grid__cell-img--ball"; 1102 break; 1103 1104 case ImageStyle.Triangle: 1105 imageStyle = "grid__cell-img--triangle"; 1106 break; 1107 } 1108 1109 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle) 1110 { 1111 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop; 1112 1113 if (settings.ImageDefault != null) 1114 { 1115 settings.ImageDefault.Height = settings.ImageDefault.Width; 1116 } 1117 if (settings.ImageMedium != null) 1118 { 1119 settings.ImageMedium.Height = settings.ImageMedium.Width; 1120 } 1121 if (settings.ImageSmall != null) 1122 { 1123 settings.ImageSmall.Height = settings.ImageSmall.Width; 1124 } 1125 } 1126 1127 string defaultImage = imageEngine; 1128 string imageSmall = ""; 1129 string imageMedium = ""; 1130 1131 if (settings.DisableImageEngine) 1132 { 1133 defaultImage = settings.Path; 1134 } 1135 else 1136 { 1137 if (settings.ImageDefault != null) 1138 { 1139 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault); 1140 1141 if (settings.Path.GetType() != typeof(string)) 1142 { 1143 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 1144 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 1145 } 1146 else 1147 { 1148 defaultImage += settings.Path != null ? "Image=" + settings.Path : ""; 1149 } 1150 1151 defaultImage += "&AlternativeImage=" + alternativeImage; 1152 } 1153 1154 if (settings.ImageSmall != null) 1155 { 1156 imageSmall = "data-src-small=\"" + imageEngine; 1157 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall); 1158 1159 if (settings.Path.GetType() != typeof(string)) 1160 { 1161 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 1162 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 1163 } 1164 else 1165 { 1166 imageSmall += settings.Path != null ? "Image=" + settings.Path : ""; 1167 } 1168 1169 imageSmall += "&alternativeImage=" + alternativeImage; 1170 1171 imageSmall += "\""; 1172 } 1173 1174 if (settings.ImageMedium != null) 1175 { 1176 imageMedium = "data-src-medium=\"" + imageEngine; 1177 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium); 1178 1179 if (settings.Path.GetType() != typeof(string)) 1180 { 1181 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : ""; 1182 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : ""; 1183 } 1184 else 1185 { 1186 imageMedium += settings.Path != null ? "Image=" + settings.Path : ""; 1187 } 1188 1189 imageMedium += "&alternativeImage=" + alternativeImage; 1190 1191 imageMedium += "\""; 1192 } 1193 } 1194 1195 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 1196 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); } 1197 if (!string.IsNullOrEmpty(settings.Title)) 1198 { 1199 optionalAttributes.Add("alt", settings.Title); 1200 optionalAttributes.Add("title", settings.Title); 1201 } 1202 1203 if (settings.DisableLazyLoad) 1204 { 1205 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) /> 1206 } 1207 else 1208 { 1209 <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) /> 1210 } 1211 } 1212 } 1213 @using System.Reflection 1214 @using Dynamicweb.Rapido.Blocks.Components.General 1215 @using Dynamicweb.Rapido.Blocks.Components 1216 1217 @* Component *@ 1218 1219 @helper RenderFileField(FileField settings) 1220 { 1221 var attributes = new Dictionary<string, string>(); 1222 if (string.IsNullOrEmpty(settings.Id)) 1223 { 1224 settings.Id = Guid.NewGuid().ToString("N"); 1225 } 1226 1227 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1228 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1229 if (settings.Required) { attributes.Add("required", "true"); } 1230 if (settings.Multiple) { attributes.Add("multiple", "true"); } 1231 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1232 if (string.IsNullOrEmpty(settings.ChooseFileText)) 1233 { 1234 settings.ChooseFileText = Translate("Choose file"); 1235 } 1236 if (string.IsNullOrEmpty(settings.NoFilesChosenText)) 1237 { 1238 settings.NoFilesChosenText = Translate("No files chosen..."); 1239 } 1240 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1241 1242 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1243 1244 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)"; 1245 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : "")); 1246 1247 attributes.Add("type", "file"); 1248 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1249 settings.CssClass = "u-full-width " + settings.CssClass; 1250 1251 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1252 1253 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1254 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1255 { 1256 <div class="u-full-width"> 1257 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1258 @if (settings.Link != null) { 1259 <div class="u-pull--right"> 1260 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1261 @Render(settings.Link) 1262 </div> 1263 } 1264 </div> 1265 1266 } 1267 1268 @if (!string.IsNullOrEmpty(settings.HelpText)) 1269 { 1270 <small class="form__help-text">@settings.HelpText</small> 1271 } 1272 1273 <div class="form__field-combi file-input u-no-margin dw-mod"> 1274 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" /> 1275 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label> 1276 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label> 1277 @if (settings.UploadButton != null) 1278 { 1279 settings.UploadButton.CssClass += " btn--condensed u-no-margin"; 1280 @Render(settings.UploadButton) 1281 } 1282 </div> 1283 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1284 </div> 1285 } 1286 @using System.Reflection 1287 @using Dynamicweb.Rapido.Blocks.Components.General 1288 @using Dynamicweb.Rapido.Blocks.Components 1289 @using Dynamicweb.Core 1290 @using System.Linq 1291 1292 @* Component *@ 1293 1294 @helper RenderDateTimeField(DateTimeField settings) 1295 { 1296 if (string.IsNullOrEmpty(settings.Id)) 1297 { 1298 settings.Id = Guid.NewGuid().ToString("N"); 1299 } 1300 1301 var textField = new TextField { 1302 Name = settings.Name, 1303 Id = settings.Id, 1304 Label = settings.Label, 1305 HelpText = settings.HelpText, 1306 Value = settings.Value, 1307 Disabled = settings.Disabled, 1308 Required = settings.Required, 1309 ErrorMessage = settings.ErrorMessage, 1310 CssClass = settings.CssClass, 1311 WrapperCssClass = settings.WrapperCssClass, 1312 OnChange = settings.OnChange, 1313 OnClick = settings.OnClick, 1314 Link = settings.Link, 1315 ExtraAttributes = settings.ExtraAttributes, 1316 // 1317 Placeholder = settings.Placeholder 1318 }; 1319 1320 @Render(textField) 1321 1322 List<string> jsAttributes = new List<string>(); 1323 1324 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'"); 1325 1326 if (!string.IsNullOrEmpty(settings.DateFormat)) 1327 { 1328 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'"); 1329 } 1330 if (!string.IsNullOrEmpty(settings.MinDate)) 1331 { 1332 jsAttributes.Add("minDate: '" + settings.MinDate + "'"); 1333 } 1334 if (!string.IsNullOrEmpty(settings.MaxDate)) 1335 { 1336 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'"); 1337 } 1338 if (settings.IsInline) 1339 { 1340 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower()); 1341 } 1342 if (settings.EnableTime) 1343 { 1344 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower()); 1345 } 1346 if (settings.EnableWeekNumbers) 1347 { 1348 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower()); 1349 } 1350 1351 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value)); 1352 1353 <script> 1354 document.addEventListener("DOMContentLoaded", function () { 1355 flatpickr("#@textField.Id", { 1356 @string.Join(",", jsAttributes) 1357 }); 1358 }); 1359 </script> 1360 } 1361 @using System.Reflection 1362 @using Dynamicweb.Rapido.Blocks.Components.General 1363 @using Dynamicweb.Rapido.Blocks.Components 1364 1365 @* Component *@ 1366 1367 @helper RenderTextField(TextField settings) 1368 { 1369 var attributes = new Dictionary<string, string>(); 1370 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1371 { 1372 settings.Id = Guid.NewGuid().ToString("N"); 1373 } 1374 1375 /*base settings*/ 1376 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1377 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1378 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1379 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1380 if (settings.Required) { attributes.Add("required", "true"); } 1381 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1382 /*end*/ 1383 1384 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1385 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1386 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1387 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1388 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1389 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1390 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower()); 1391 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); }; 1392 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1393 1394 settings.CssClass = "u-full-width " + settings.CssClass; 1395 1396 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1397 1398 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1399 1400 string noMargin = "u-no-margin"; 1401 if (!settings.ReadOnly) { 1402 noMargin = ""; 1403 } 1404 1405 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod"> 1406 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1407 { 1408 <div class="u-full-width"> 1409 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1410 @if (settings.Link != null) { 1411 settings.Link.ButtonLayout = ButtonLayout.LinkClean; 1412 1413 <div class="u-pull--right"> 1414 @Render(settings.Link) 1415 </div> 1416 } 1417 </div> 1418 1419 } 1420 1421 @if (!string.IsNullOrEmpty(settings.HelpText)) 1422 { 1423 <small class="form__help-text">@settings.HelpText</small> 1424 } 1425 1426 @if (settings.ActionButton != null) 1427 { 1428 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1429 <div class="form__field-combi u-no-margin dw-mod"> 1430 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1431 @Render(settings.ActionButton) 1432 </div> 1433 } 1434 else 1435 { 1436 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1437 } 1438 1439 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1440 </div> 1441 } 1442 @using System.Reflection 1443 @using Dynamicweb.Rapido.Blocks.Components.General 1444 @using Dynamicweb.Rapido.Blocks.Components 1445 1446 @* Component *@ 1447 1448 @helper RenderNumberField(NumberField settings) 1449 { 1450 var attributes = new Dictionary<string, string>(); 1451 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1452 { 1453 settings.Id = Guid.NewGuid().ToString("N"); 1454 } 1455 1456 /*base settings*/ 1457 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1458 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1459 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1460 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1461 if (settings.Required) { attributes.Add("required", "true"); } 1462 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1463 /*end*/ 1464 1465 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1466 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1467 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1468 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1469 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 1470 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); } 1471 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); } 1472 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); } 1473 attributes.Add("type", "number"); 1474 1475 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1476 1477 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1478 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1479 { 1480 <div class="u-full-width"> 1481 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1482 @if (settings.Link != null) { 1483 <div class="u-pull--right"> 1484 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1485 @Render(settings.Link) 1486 </div> 1487 } 1488 </div> 1489 1490 } 1491 1492 @if (!string.IsNullOrEmpty(settings.HelpText)) 1493 { 1494 <small class="form__help-text">@settings.HelpText</small> 1495 } 1496 1497 @if (settings.ActionButton != null) 1498 { 1499 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1500 <div class="form__field-combi u-no-margin dw-mod"> 1501 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1502 @Render(settings.ActionButton) 1503 </div> 1504 } 1505 else 1506 { 1507 <div class="form__field-combi u-no-margin dw-mod"> 1508 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1509 </div> 1510 } 1511 1512 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1513 </div> 1514 } 1515 @using System.Reflection 1516 @using Dynamicweb.Rapido.Blocks.Components.General 1517 @using Dynamicweb.Rapido.Blocks.Components 1518 1519 1520 @* Component *@ 1521 1522 @helper RenderTextareaField(TextareaField settings) 1523 { 1524 Dictionary<string, string> attributes = new Dictionary<string, string>(); 1525 string id = settings.Id; 1526 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id)) 1527 { 1528 id = Guid.NewGuid().ToString("N"); 1529 } 1530 1531 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); } 1532 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1533 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 1534 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 1535 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 1536 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1537 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); } 1538 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1539 if (settings.Required) { attributes.Add("required", "true"); } 1540 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 1541 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); } 1542 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); } 1543 attributes.Add("name", settings.Name); 1544 1545 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1546 1547 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1548 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1549 { 1550 <div class="u-full-width"> 1551 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1552 @if (settings.Link != null) { 1553 <div class="u-pull--right"> 1554 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1555 @Render(settings.Link) 1556 </div> 1557 } 1558 </div> 1559 } 1560 1561 @if (!string.IsNullOrEmpty(settings.HelpText)) 1562 { 1563 <small class="form__help-text">@settings.HelpText</small> 1564 } 1565 1566 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea> 1567 1568 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1569 </div> 1570 } 1571 @using System.Reflection 1572 @using Dynamicweb.Rapido.Blocks.Components.General 1573 @using Dynamicweb.Rapido.Blocks.Components 1574 1575 1576 @* Component *@ 1577 1578 @helper RenderHiddenField(HiddenField settings) { 1579 var attributes = new Dictionary<string, string>(); 1580 attributes.Add("type", "hidden"); 1581 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1582 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1583 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1584 1585 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/> 1586 } 1587 @using System.Reflection 1588 @using Dynamicweb.Rapido.Blocks.Components.General 1589 @using Dynamicweb.Rapido.Blocks.Components 1590 1591 @* Component *@ 1592 1593 @helper RenderCheckboxField(CheckboxField settings) 1594 { 1595 var attributes = new Dictionary<string, string>(); 1596 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1597 { 1598 settings.Id = Guid.NewGuid().ToString("N"); 1599 } 1600 1601 /*base settings*/ 1602 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1603 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1604 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1605 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1606 if (settings.Required) { attributes.Add("required", "true"); } 1607 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1608 /*end*/ 1609 1610 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1611 1612 attributes.Add("type", "checkbox"); 1613 if (settings.Checked) { attributes.Add("checked", "true"); } 1614 settings.CssClass = "form__control " + settings.CssClass; 1615 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1616 1617 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1618 1619 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1620 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1621 @if (!string.IsNullOrEmpty(settings.Label)) 1622 { 1623 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1624 } 1625 1626 @if (settings.Link != null) { 1627 <span> 1628 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1629 @Render(settings.Link) 1630 </span> 1631 } 1632 1633 @if (!string.IsNullOrEmpty(settings.HelpText)) 1634 { 1635 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small> 1636 } 1637 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1638 </div> 1639 } 1640 @using System.Reflection 1641 @using Dynamicweb.Rapido.Blocks.Components.General 1642 @using Dynamicweb.Rapido.Blocks.Components 1643 1644 1645 @* Component *@ 1646 1647 @helper RenderCheckboxListField(CheckboxListField settings) 1648 { 1649 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1650 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1651 { 1652 <div class="u-full-width"> 1653 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1654 @if (settings.Link != null) { 1655 <div class="u-pull--right"> 1656 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1657 @Render(settings.Link) 1658 </div> 1659 } 1660 </div> 1661 1662 } 1663 1664 <div class="u-pull--left"> 1665 @if (!string.IsNullOrEmpty(settings.HelpText)) 1666 { 1667 <small class="form__help-text">@settings.HelpText</small> 1668 } 1669 1670 @foreach (var item in settings.Options) 1671 { 1672 if (settings.Required) 1673 { 1674 item.Required = true; 1675 } 1676 if (settings.Disabled) 1677 { 1678 item.Disabled = true; 1679 } 1680 if (!string.IsNullOrEmpty(settings.Name)) 1681 { 1682 item.Name = settings.Name; 1683 } 1684 if (!string.IsNullOrEmpty(settings.CssClass)) 1685 { 1686 item.CssClass += settings.CssClass; 1687 } 1688 1689 /* value is not supported */ 1690 1691 if (!string.IsNullOrEmpty(settings.OnClick)) 1692 { 1693 item.OnClick += settings.OnClick; 1694 } 1695 if (!string.IsNullOrEmpty(settings.OnChange)) 1696 { 1697 item.OnChange += settings.OnChange; 1698 } 1699 @Render(item) 1700 } 1701 1702 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1703 </div> 1704 1705 </div> 1706 } 1707 @using Dynamicweb.Rapido.Blocks.Components.General 1708 1709 @* Component *@ 1710 1711 @helper RenderSearch(Search settings) 1712 { 1713 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? ""; 1714 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? ""; 1715 1716 if (string.IsNullOrEmpty(settings.Id)) 1717 { 1718 settings.Id = Guid.NewGuid().ToString("N"); 1719 } 1720 1721 var resultAttributes = new Dictionary<string, string>(); 1722 1723 if (settings.PageSize != 0) 1724 { 1725 resultAttributes.Add("data-page-size", settings.PageSize.ToString()); 1726 } 1727 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1728 { 1729 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl); 1730 if (!string.IsNullOrEmpty(groupValue)) 1731 { 1732 resultAttributes.Add("data-selected-group", groupValue); 1733 } 1734 if (!string.IsNullOrEmpty(settings.GroupsParameter)) 1735 { 1736 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter); 1737 } 1738 } 1739 resultAttributes.Add("data-force-init", "true"); 1740 if (settings.GoToFirstSearchResultOnEnter) 1741 { 1742 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower()); 1743 } 1744 if (!string.IsNullOrEmpty(settings.SearchParameter)) 1745 { 1746 resultAttributes.Add("data-search-parameter", settings.SearchParameter); 1747 } 1748 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl); 1749 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId); 1750 1751 if (settings.SecondSearchData != null) 1752 { 1753 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl); 1754 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId); 1755 } 1756 if (!string.IsNullOrEmpty(settings.ResultsPageUrl)) 1757 { 1758 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl); 1759 } 1760 1761 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1762 1763 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : ""; 1764 1765 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)> 1766 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl)) 1767 { 1768 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button> 1769 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul> 1770 } 1771 1772 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue"> 1773 1774 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")"> 1775 @if (settings.SecondSearchData != null) 1776 { 1777 <div class="search__column search__column--products dw-mod"> 1778 <div class="search__column-header dw-mod">@Translate("Products")</div> 1779 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1780 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1781 { 1782 @Render(new Link { 1783 Title = Translate("View all"), 1784 CssClass = "js-view-all-button u-margin", 1785 Href = settings.SearchData.ResultsPageUrl 1786 }); 1787 } 1788 </div> 1789 <div class="search__column search__column--pages dw-mod"> 1790 <div class="search__column-header">@Translate("Pages")</div> 1791 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul> 1792 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl)) 1793 { 1794 @Render(new Link 1795 { 1796 Title = Translate("View all"), 1797 CssClass = "js-view-all-button u-margin", 1798 Href = settings.SecondSearchData.ResultsPageUrl 1799 }); 1800 } 1801 </div> 1802 } 1803 else 1804 { 1805 <div class="search__column search__column--only dw-mod"> 1806 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul> 1807 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl)) 1808 { 1809 @Render(new Link { 1810 Title = Translate("View all"), 1811 CssClass = "js-view-all-button u-margin", 1812 Href = settings.SearchData.ResultsPageUrl 1813 }); 1814 } 1815 </div> 1816 } 1817 </div> 1818 1819 @if (settings.SearchButton != null) 1820 { 1821 settings.SearchButton.CssClass += " search__btn js-search-btn"; 1822 if (settings.RenderDefaultSearchIcon) 1823 { 1824 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue }; 1825 } 1826 @Render(settings.SearchButton); 1827 } 1828 </div> 1829 } 1830 @using System.Reflection 1831 @using Dynamicweb.Rapido.Blocks.Components.General 1832 @using Dynamicweb.Rapido.Blocks.Components 1833 1834 1835 @* Component *@ 1836 1837 @helper RenderSelectField(SelectField settings) 1838 { 1839 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1840 { 1841 settings.Id = Guid.NewGuid().ToString("N"); 1842 } 1843 1844 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod"> 1845 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null ) 1846 { 1847 <div class="u-full-width"> 1848 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> } 1849 @if (settings.Link != null) { 1850 <div class="u-pull--right"> 1851 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; } 1852 @Render(settings.Link) 1853 </div> 1854 } 1855 </div> 1856 } 1857 1858 @if (!string.IsNullOrEmpty(settings.HelpText)) 1859 { 1860 <small class="form__help-text">@settings.HelpText</small> 1861 } 1862 1863 @if (settings.ActionButton != null) 1864 { 1865 settings.ActionButton.CssClass += " btn--condensed u-no-margin"; 1866 <div class="form__field-combi u-no-margin dw-mod"> 1867 @RenderSelectBase(settings) 1868 @Render(settings.ActionButton) 1869 </div> 1870 } 1871 else 1872 { 1873 @RenderSelectBase(settings) 1874 } 1875 1876 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1877 </div> 1878 } 1879 1880 @helper RenderSelectBase(SelectField settings) 1881 { 1882 var attributes = new Dictionary<string, string>(); 1883 1884 /*base settings*/ 1885 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1886 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1887 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1888 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1889 if (settings.Required) { attributes.Add("required", "true"); } 1890 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1891 /*end*/ 1892 1893 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1894 1895 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod"> 1896 @if (settings.Default != null) 1897 { 1898 @Render(settings.Default) 1899 } 1900 1901 @foreach (var item in settings.Options) 1902 { 1903 if (settings.Value != null) { 1904 item.Checked = item.Value == settings.Value; 1905 } 1906 @Render(item) 1907 } 1908 </select> 1909 } 1910 @using System.Reflection 1911 @using Dynamicweb.Rapido.Blocks.Components.General 1912 @using Dynamicweb.Rapido.Blocks.Components 1913 1914 @* Component *@ 1915 1916 @helper RenderRadioButtonField(RadioButtonField settings) 1917 { 1918 var attributes = new Dictionary<string, string>(); 1919 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id)) 1920 { 1921 settings.Id = Guid.NewGuid().ToString("N"); 1922 } 1923 1924 /*base settings*/ 1925 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 1926 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 1927 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 1928 if (settings.Disabled) { attributes.Add("disabled", "true"); } 1929 if (settings.Required) { attributes.Add("required", "true"); } 1930 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 1931 /*end*/ 1932 1933 attributes.Add("type", "radio"); 1934 if (settings.Checked) { attributes.Add("checked", "true"); } 1935 settings.CssClass = "form__control " + settings.CssClass; 1936 if (settings.Value != null) { attributes.Add("value", settings.Value); } 1937 1938 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 1939 1940 <div class="form__field-group @settings.WrapperCssClass dw-mod"> 1941 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 1942 @if (!string.IsNullOrEmpty(settings.Label)) 1943 { 1944 <label for="@settings.Id" class="dw-mod">@settings.Label</label> 1945 } 1946 @if (!string.IsNullOrEmpty(settings.HelpText)) 1947 { 1948 <small class="form__help-text">@settings.HelpText</small> 1949 } 1950 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 1951 </div> 1952 } 1953 @using System.Reflection 1954 @using Dynamicweb.Rapido.Blocks.Components.General 1955 @using Dynamicweb.Rapido.Blocks.Components 1956 1957 1958 @* Component *@ 1959 1960 @helper RenderRadioButtonListField(RadioButtonListField settings) 1961 { 1962 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; } 1963 1964 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 1965 @if (!string.IsNullOrEmpty(settings.Label)) 1966 { 1967 <label>@settings.Label</label> 1968 } 1969 @if (!string.IsNullOrEmpty(settings.HelpText)) 1970 { 1971 <small class="form__help-text">@settings.HelpText</small> 1972 } 1973 1974 @foreach (var item in settings.Options) 1975 { 1976 if (settings.Required) 1977 { 1978 item.Required = true; 1979 } 1980 if (settings.Disabled) 1981 { 1982 item.Disabled = true; 1983 } 1984 if (!string.IsNullOrEmpty(settings.Name)) 1985 { 1986 item.Name = settings.Name; 1987 } 1988 if (settings.Value != null && settings.Value == item.Value) 1989 { 1990 item.Checked = true; 1991 } 1992 if (!string.IsNullOrEmpty(settings.OnClick)) 1993 { 1994 item.OnClick += settings.OnClick; 1995 } 1996 if (!string.IsNullOrEmpty(settings.OnChange)) 1997 { 1998 item.OnChange += settings.OnChange; 1999 } 2000 if (!string.IsNullOrEmpty(settings.CssClass)) 2001 { 2002 item.CssClass += settings.CssClass; 2003 } 2004 @Render(item) 2005 } 2006 2007 @Render(new NotificationMessage { Message = settings.ErrorMessage }) 2008 </div> 2009 } 2010 @using System.Reflection 2011 @using Dynamicweb.Rapido.Blocks.Components.General 2012 @using Dynamicweb.Rapido.Blocks.Components 2013 2014 2015 @* Component *@ 2016 2017 @helper RenderNotificationMessage(NotificationMessage settings) 2018 { 2019 if (!string.IsNullOrEmpty(settings.Message)) 2020 { 2021 var attributes = new Dictionary<string, string>(); 2022 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2023 2024 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower(); 2025 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower(); 2026 string minHeightClass = settings.Icon != null ? "u-min-h70px" : ""; 2027 2028 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)> 2029 @if (settings.Icon != null) { 2030 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message; 2031 @Render(settings.Icon) 2032 } else { 2033 @settings.Message 2034 } 2035 </div> 2036 } 2037 } 2038 @using Dynamicweb.Rapido.Blocks.Components.General 2039 2040 2041 @* Component *@ 2042 2043 @helper RenderHandlebarsRoot(HandlebarsRoot settings) { 2044 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : ""; 2045 2046 <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> 2047 @if (settings.SubBlocks != null) { 2048 @RenderBlockList(settings.SubBlocks) 2049 } 2050 </div> 2051 } 2052 @using System.Reflection 2053 @using Dynamicweb.Rapido.Blocks.Components.General 2054 @using Dynamicweb.Rapido.Blocks.Components 2055 @using System.Text.RegularExpressions 2056 2057 2058 @* Component *@ 2059 2060 @helper RenderSticker(Sticker settings) { 2061 if (!String.IsNullOrEmpty(settings.Title)) { 2062 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : ""; 2063 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : ""; 2064 2065 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>(); 2066 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) { 2067 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : ""; 2068 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : ""; 2069 optionalAttributes.Add("style", styleTag); 2070 } 2071 2072 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div> 2073 } 2074 } 2075 2076 @using System.Reflection 2077 @using Dynamicweb.Rapido.Blocks.Components.General 2078 @using Dynamicweb.Rapido.Blocks.Components 2079 2080 2081 @* Component *@ 2082 2083 @helper RenderStickersCollection(StickersCollection settings) 2084 { 2085 if (settings.Stickers.Count > 0) 2086 { 2087 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); 2088 2089 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 2090 @foreach (Sticker sticker in settings.Stickers) 2091 { 2092 @Render(sticker) 2093 } 2094 </div> 2095 } 2096 } 2097 2098 @using Dynamicweb.Rapido.Blocks.Components.General 2099 2100 2101 @* Component *@ 2102 2103 @helper RenderForm(Form settings) { 2104 if (settings != null) 2105 { 2106 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>(); 2107 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); }; 2108 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); }; 2109 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); }; 2110 var enctypes = new Dictionary<string, string> 2111 { 2112 { "multipart", "multipart/form-data" }, 2113 { "text", "text/plain" }, 2114 { "application", "application/x-www-form-urlencoded" } 2115 }; 2116 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); }; 2117 optionalAttributes.Add("method", settings.Method.ToString()); 2118 2119 if (!string.IsNullOrEmpty(settings.FormStartMarkup)) 2120 { 2121 @settings.FormStartMarkup 2122 } 2123 else 2124 { 2125 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 2126 } 2127 2128 foreach (var field in settings.GetFields()) 2129 { 2130 @Render(field) 2131 } 2132 2133 @:</form> 2134 } 2135 } 2136 @using System.Reflection 2137 @using Dynamicweb.Rapido.Blocks.Components.General 2138 @using Dynamicweb.Rapido.Blocks.Components 2139 2140 2141 @* Component *@ 2142 2143 @helper RenderText(Text settings) 2144 { 2145 @settings.Content 2146 } 2147 @using System.Reflection 2148 @using Dynamicweb.Rapido.Blocks.Components.General 2149 @using Dynamicweb.Rapido.Blocks.Components 2150 2151 2152 @* Component *@ 2153 2154 @helper RenderContentModule(ContentModule settings) { 2155 if (!string.IsNullOrEmpty(settings.Content)) 2156 { 2157 @settings.Content 2158 } 2159 } 2160 @using System.Reflection 2161 @using Dynamicweb.Rapido.Blocks.Components.General 2162 @using Dynamicweb.Rapido.Blocks.Components 2163 2164 2165 @* Component *@ 2166 2167 @helper RenderModal(Modal settings) { 2168 if (settings != null) 2169 { 2170 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N"); 2171 2172 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : ""; 2173 2174 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange /> 2175 2176 <div class="modal-container"> 2177 @if (!settings.DisableDarkOverlay) 2178 { 2179 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label> 2180 } 2181 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal"> 2182 @if (settings.Heading != null) 2183 { 2184 if (!string.IsNullOrEmpty(settings.Heading.Title)) 2185 { 2186 <div class="modal__header"> 2187 @Render(settings.Heading) 2188 </div> 2189 } 2190 } 2191 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")"> 2192 @if (!string.IsNullOrEmpty(settings.BodyText)) 2193 { 2194 @settings.BodyText 2195 } 2196 @if (settings.BodyTemplate != null) 2197 { 2198 @settings.BodyTemplate 2199 } 2200 @{ 2201 var actions = settings.GetActions(); 2202 } 2203 </div> 2204 @if (actions.Length > 0) 2205 { 2206 <div class="modal__footer"> 2207 @foreach (var action in actions) 2208 { 2209 if (Pageview.Device.ToString() != "Mobile") { 2210 action.CssClass += " u-no-margin"; 2211 } else { 2212 action.CssClass += " u-full-width u-margin-bottom"; 2213 } 2214 2215 @Render(action) 2216 } 2217 </div> 2218 } 2219 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label> 2220 </div> 2221 </div> 2222 } 2223 } 2224 @using Dynamicweb.Rapido.Blocks.Components.General 2225 2226 @* Component *@ 2227 2228 @helper RenderMediaListItem(MediaListItem settings) 2229 { 2230 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")> 2231 @if (!string.IsNullOrEmpty(settings.Label)) 2232 { 2233 if (!string.IsNullOrEmpty(settings.Link)) 2234 { 2235 @Render(new Link 2236 { 2237 Href = settings.Link, 2238 CssClass = "media-list-item__sticker dw-mod", 2239 ButtonLayout = ButtonLayout.None, 2240 Title = settings.Label, 2241 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 2242 }) 2243 } 2244 else if (!string.IsNullOrEmpty(settings.OnClick)) 2245 { 2246 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)"> 2247 <span class="u-uppercase">@settings.Label</span> 2248 </span> 2249 } 2250 else 2251 { 2252 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod"> 2253 <span class="u-uppercase">@settings.Label</span> 2254 </span> 2255 } 2256 } 2257 <div class="media-list-item__wrap"> 2258 <div class="media-list-item__info dw-mod"> 2259 <div class="media-list-item__header dw-mod"> 2260 @if (!string.IsNullOrEmpty(settings.Title)) 2261 { 2262 if (!string.IsNullOrEmpty(settings.Link)) 2263 { 2264 @Render(new Link 2265 { 2266 Href = settings.Link, 2267 CssClass = "media-list-item__name dw-mod", 2268 ButtonLayout = ButtonLayout.None, 2269 Title = settings.Title, 2270 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : "" 2271 }) 2272 } 2273 else if (!string.IsNullOrEmpty(settings.OnClick)) 2274 { 2275 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span> 2276 } 2277 else 2278 { 2279 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span> 2280 } 2281 } 2282 2283 @if (!string.IsNullOrEmpty(settings.Status)) 2284 { 2285 <div class="media-list-item__state dw-mod">@settings.Status</div> 2286 } 2287 </div> 2288 @{ 2289 settings.InfoTable.CssClass += " media-list-item__parameters-table"; 2290 } 2291 2292 @Render(settings.InfoTable) 2293 </div> 2294 <div class="media-list-item__actions dw-mod"> 2295 <div class="media-list-item__actions-list dw-mod"> 2296 @{ 2297 var actions = settings.GetActions(); 2298 2299 foreach (ButtonBase action in actions) 2300 { 2301 action.ButtonLayout = ButtonLayout.None; 2302 action.CssClass += " media-list-item__action link"; 2303 2304 @Render(action) 2305 } 2306 } 2307 </div> 2308 2309 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title)) 2310 { 2311 settings.SelectButton.CssClass += " u-no-margin"; 2312 2313 <div class="media-list-item__action-button"> 2314 @Render(settings.SelectButton) 2315 </div> 2316 } 2317 </div> 2318 </div> 2319 </div> 2320 } 2321 @using Dynamicweb.Rapido.Blocks.Components.General 2322 @using Dynamicweb.Rapido.Blocks.Components 2323 2324 @helper RenderTable(Table settings) 2325 { 2326 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2327 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2328 2329 var enumToClasses = new Dictionary<TableDesign, string> 2330 { 2331 { TableDesign.Clean, "table--clean" }, 2332 { TableDesign.Bordered, "table--bordered" }, 2333 { TableDesign.Striped, "table--striped" }, 2334 { TableDesign.Hover, "table--hover" }, 2335 { TableDesign.Compact, "table--compact" }, 2336 { TableDesign.Condensed, "table--condensed" }, 2337 { TableDesign.NoTopBorder, "table--no-top-border" } 2338 }; 2339 string tableDesignClass = ""; 2340 if (settings.Design != TableDesign.None) 2341 { 2342 tableDesignClass = enumToClasses[settings.Design]; 2343 } 2344 2345 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); } 2346 2347 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2348 2349 <table @ComponentMethods.AddAttributes(resultAttributes)> 2350 @if (settings.Header != null) 2351 { 2352 <thead> 2353 @Render(settings.Header) 2354 </thead> 2355 } 2356 <tbody> 2357 @foreach (var row in settings.Rows) 2358 { 2359 @Render(row) 2360 } 2361 </tbody> 2362 @if (settings.Footer != null) 2363 { 2364 <tfoot> 2365 @Render(settings.Footer) 2366 </tfoot> 2367 } 2368 </table> 2369 } 2370 @using Dynamicweb.Rapido.Blocks.Components.General 2371 @using Dynamicweb.Rapido.Blocks.Components 2372 2373 @helper RenderTableRow(TableRow settings) 2374 { 2375 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2376 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2377 2378 var enumToClasses = new Dictionary<TableRowDesign, string> 2379 { 2380 { TableRowDesign.NoBorder, "table__row--no-border" }, 2381 { TableRowDesign.Border, "table__row--border" }, 2382 { TableRowDesign.TopBorder, "table__row--top-line" }, 2383 { TableRowDesign.BottomBorder, "table__row--bottom-line" }, 2384 { TableRowDesign.Solid, "table__row--solid" } 2385 }; 2386 2387 string tableRowDesignClass = ""; 2388 if (settings.Design != TableRowDesign.None) 2389 { 2390 tableRowDesignClass = enumToClasses[settings.Design]; 2391 } 2392 2393 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); } 2394 2395 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2396 2397 <tr @ComponentMethods.AddAttributes(resultAttributes)> 2398 @foreach (var cell in settings.Cells) 2399 { 2400 if (settings.IsHeaderRow) 2401 { 2402 cell.IsHeader = true; 2403 } 2404 @Render(cell) 2405 } 2406 </tr> 2407 } 2408 @using Dynamicweb.Rapido.Blocks.Components.General 2409 @using Dynamicweb.Rapido.Blocks.Components 2410 @using Dynamicweb.Core 2411 2412 @helper RenderTableCell(TableCell settings) 2413 { 2414 Dictionary<string, string> attributes = new Dictionary<string, string>(); 2415 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 2416 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); } 2417 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); } 2418 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); } 2419 2420 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value); 2421 2422 string tagName = settings.IsHeader ? "th" : "td"; 2423 2424 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">") 2425 @settings.Content 2426 @("</" + tagName + ">"); 2427 } 2428 @using System.Linq 2429 @using Dynamicweb.Rapido.Blocks.Components.General 2430 2431 @* Component *@ 2432 2433 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings) 2434 { 2435 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter 2436 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring 2437 2438 if (settings.NumberOfPages > 1) 2439 { 2440 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx"; 2441 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation"); 2442 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings); 2443 2444 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel"> 2445 @if (settings.ShowPagingInfo) 2446 { 2447 <div class="pager__info dw-mod"> 2448 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages 2449 </div> 2450 } 2451 <ul class="pager__list dw-mod"> 2452 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls) 2453 { 2454 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon }) 2455 } 2456 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls) 2457 { 2458 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon }) 2459 } 2460 @if (settings.GetPages().Any()) 2461 { 2462 foreach (var page in settings.GetPages()) 2463 { 2464 @Render(page) 2465 } 2466 } 2467 else 2468 { 2469 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++) 2470 { 2471 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString()); 2472 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) }); 2473 } 2474 } 2475 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls) 2476 { 2477 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon }) 2478 } 2479 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls) 2480 { 2481 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon }) 2482 } 2483 </ul> 2484 </div> 2485 } 2486 } 2487 2488 @helper RenderPaginationItem(PaginationItem settings) 2489 { 2490 if (settings.Icon == null) 2491 { 2492 settings.Icon = new Icon(); 2493 } 2494 2495 settings.Icon.Label = settings.Label; 2496 <li class="pager__btn dw-mod"> 2497 @if (settings.IsActive) 2498 { 2499 <span class="pager__num pager__num--current dw-mod"> 2500 @Render(settings.Icon) 2501 </span> 2502 } 2503 else 2504 { 2505 <a href="@settings.Link" class="pager__num dw-mod"> 2506 @Render(settings.Icon) 2507 </a> 2508 } 2509 </li> 2510 } 2511 2512 2513 @using Dynamicweb.Rapido.Blocks.Components.General 2514 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2515 2516 @using System.Web.Http.Results 2517 @using System.Web; 2518 @using Dynamicweb.Frontend 2519 @using Dynamicweb.Rapido.Blocks.Components 2520 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2521 @using Dynamicweb.Frontend.Devices 2522 @using Dynamicweb.Rapido.Blocks; 2523 @using Dynamicweb.Rapido.Blocks.Components.General 2524 @using System.Linq; 2525 @using Dynamicweb.Rendering 2526 2527 2528 @helper RenderSocialMediaShareIcons(DanishagroBrandingMaster.Files.Files.Templates.Designs.Rapido.Components.Custom.SocialMediaShareIcon settings) 2529 { 2530 string requestHttpHost = HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.RawUrl; 2531 string facebookUrl = "https://www.facebook.com/sharer/sharer.php?u=" + requestHttpHost; 2532 string twitterUrl = "https://twitter.com/intent/tweet?url=" + requestHttpHost; 2533 string linkedinUrl = "https://www.linkedin.com/sharing/share-offsite/?url=" + requestHttpHost.Replace("=", "%3D"); 2534 string mailUrl = ""; 2535 if (string.IsNullOrEmpty(settings.MetaTitle)) 2536 { 2537 mailUrl = "mailto:?body=" + requestHttpHost; 2538 } 2539 else 2540 { 2541 mailUrl = "mailto:?subject=" + settings.MetaTitle + "&body=" + requestHttpHost; 2542 } 2543 bool facebook = settings.EnableFacebook; 2544 bool twitter = settings.EnableTwitter; 2545 bool linkedin = settings.EnableLinkedin; 2546 bool mail = settings.EnableMail; 2547 var colorSetting = settings.Color != "" && settings.Color != "0" ? settings.Color : "#3D3D3C"; 2548 var ogImage = settings.OpengraphImage; 2549 2550 if (!string.IsNullOrEmpty(ogImage)) 2551 { 2552 2553 if (settings.isExternal) 2554 { 2555 System.Web.HttpContext.Current.Items["ogImageCustom"] = ogImage; 2556 } 2557 else 2558 { 2559 System.Web.HttpContext.Current.Items["ogImageCustom"] = string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, ogImage); 2560 2561 } 2562 } 2563 else 2564 { 2565 string fallbackLogo = settings.CurrentPageview?.AreaSettings?.GetItem("Settings")?.GetFile("BusinessLogo")?.Path ?? ""; 2566 System.Web.HttpContext.Current.Items["ogImageCustom"] = string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, fallbackLogo); 2567 } 2568 if (!string.IsNullOrEmpty(settings.OpengraphDescription)) 2569 { 2570 2571 System.Web.HttpContext.Current.Items["ogDescriptionCustom"] = settings.OpengraphDescription; 2572 2573 } 2574 if (!string.IsNullOrEmpty(settings.OpengraphTitle)) 2575 { 2576 System.Web.HttpContext.Current.Items["ogTitleCustom"] = settings.OpengraphTitle; 2577 } 2578 2579 <div class="u-flex u-flex--row grid--justify-start" id="socialMediaShareButtonsCustom"> 2580 @if (facebook) 2581 { 2582 <a title="@settings.MetaTitle" style="color:@(colorSetting)!important" href="@facebookUrl" target="_blank" class="fab social-media-icon fa-facebook u-margin-md-custom" onmouseover="mouseOverEffect(this)" onmouseout="mouseOutEffect(this)"></a> 2583 } 2584 @if (twitter) 2585 { 2586 <a title="@settings.MetaTitle" style="color:@(colorSetting)!important" href="@twitterUrl" target="_blank" class="fab social-media-icon fa-twitter u-margin-md-custom" onmouseover="mouseOverEffect(this)" onmouseout="mouseOutEffect(this)"></a> 2587 } 2588 @if (linkedin) 2589 { 2590 <a title="@settings.MetaTitle" style="color:@(colorSetting)!important" href="@linkedinUrl" target="_blank" class="fab social-media-icon fa-linkedin-in u-margin-md-custom" onmouseover="mouseOverEffect(this)" onmouseout="mouseOutEffect(this)"></a> 2591 } 2592 @if (mail) 2593 { 2594 <a title="@settings.MetaTitle" style="color:@(colorSetting)!important" href="@mailUrl" target="_blank" class="fas social-media-icon fa-envelope u-margin-md-custom" onmouseover="mouseOverEffect(this)" onmouseout="mouseOutEffect(this)"></a> 2595 } 2596 </div> 2597 2598 <script> 2599 function mouseOverEffect(event) { 2600 event.style.opacity = "0.7"; 2601 } 2602 2603 function mouseOutEffect(event) { 2604 event.style.opacity = "1.0"; 2605 } 2606 </script> 2607 2608 2609 2610 } 2611 2612 @using Dynamicweb.Rapido.Blocks.Components 2613 @using Dynamicweb.Rapido.Blocks.Components.General 2614 @using Dynamicweb.Rapido.Blocks 2615 @using System.IO 2616 2617 2618 @using Dynamicweb.Rapido.Blocks.Components.General 2619 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2620 2621 2622 @* Component *@ 2623 2624 @helper RenderVariantMatrix(VariantMatrix settings) { 2625 if (settings != null) 2626 { 2627 int productLoopCounter = 0; 2628 int groupCount = 0; 2629 List<VariantOption> firstDimension = new List<VariantOption>(); 2630 List<VariantOption> secondDimension = new List<VariantOption>(); 2631 List<VariantOption> thirdDimension = new List<VariantOption>(); 2632 2633 foreach (VariantGroup variantGroup in settings.GetVariantGroups()) 2634 { 2635 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions()) 2636 { 2637 if (groupCount == 0) { 2638 firstDimension.Add(variantOptions); 2639 } 2640 if (groupCount == 1) 2641 { 2642 secondDimension.Add(variantOptions); 2643 } 2644 if (groupCount == 2) 2645 { 2646 thirdDimension.Add(variantOptions); 2647 } 2648 } 2649 groupCount++; 2650 } 2651 2652 int rowCount = 0; 2653 int columnCount = 0; 2654 2655 <script> 2656 var variantsCollection = []; 2657 </script> 2658 2659 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId"> 2660 @if (groupCount == 1) 2661 { 2662 <tbody> 2663 @foreach (VariantOption firstVariantOption in firstDimension) 2664 { 2665 var variantId = firstVariantOption.Id; 2666 <tr> 2667 <td class="u-bold"> 2668 @firstVariantOption.Name 2669 </td> 2670 <td> 2671 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2672 </td> 2673 </tr> 2674 productLoopCounter++; 2675 } 2676 2677 <tr> 2678 <td> </td> 2679 <td> 2680 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2681 </td> 2682 </tr> 2683 </tbody> 2684 } 2685 @if (groupCount == 2) 2686 { 2687 <thead> 2688 <tr> 2689 <td> </td> 2690 @foreach (VariantOption variant in secondDimension) 2691 { 2692 <td>@variant.Name</td> 2693 } 2694 </tr> 2695 </thead> 2696 <tbody> 2697 @foreach (VariantOption firstVariantOption in firstDimension) 2698 { 2699 string variantId = ""; 2700 columnCount = 0; 2701 2702 <tr> 2703 <td class="u-min-w120px">@firstVariantOption.Name</td> 2704 2705 @foreach (VariantOption secondVariantOption in secondDimension) 2706 { 2707 variantId = firstVariantOption.Id + "." + secondVariantOption.Id; 2708 <td> 2709 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2710 </td> 2711 2712 columnCount++; 2713 2714 productLoopCounter++; 2715 } 2716 2717 <td> 2718 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 2719 </td> 2720 </tr> 2721 2722 rowCount++; 2723 } 2724 2725 @{ 2726 columnCount = 0; 2727 } 2728 2729 <tr> 2730 <td> </td> 2731 @foreach (VariantOption secondVariantOption in secondDimension) 2732 { 2733 <td> 2734 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2735 </td> 2736 2737 columnCount++; 2738 } 2739 <td> </td> 2740 </tr> 2741 </tbody> 2742 } 2743 @if (groupCount == 3) 2744 { 2745 <thead> 2746 <tr> 2747 <td> </td> 2748 @foreach (VariantOption thirdVariantOption in thirdDimension) 2749 { 2750 <td>@thirdVariantOption.Name</td> 2751 } 2752 </tr> 2753 </thead> 2754 <tbody> 2755 @foreach (VariantOption firstVariantOption in firstDimension) 2756 { 2757 int colspan = (thirdDimension.Count + 1); 2758 2759 <tr> 2760 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td> 2761 </tr> 2762 2763 foreach (VariantOption secondVariantOption in secondDimension) 2764 { 2765 string variantId = ""; 2766 columnCount = 0; 2767 2768 <tr> 2769 <td class="u-min-w120px">@secondVariantOption.Name</td> 2770 2771 @foreach (VariantOption thirdVariantOption in thirdDimension) 2772 { 2773 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id; 2774 2775 <td> 2776 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount) 2777 </td> 2778 2779 columnCount++; 2780 productLoopCounter++; 2781 } 2782 2783 <td> 2784 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div> 2785 </td> 2786 </tr> 2787 rowCount++; 2788 } 2789 } 2790 2791 @{ 2792 columnCount = 0; 2793 } 2794 2795 <tr> 2796 <td> </td> 2797 @foreach (VariantOption thirdVariantOption in thirdDimension) 2798 { 2799 <td> 2800 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div> 2801 </td> 2802 2803 columnCount++; 2804 } 2805 <td> </td> 2806 </tr> 2807 </tbody> 2808 } 2809 </table> 2810 2811 <script> 2812 document.addEventListener("DOMContentLoaded", function (event) { 2813 MatrixUpdateQuantity("@settings.ProductId"); 2814 }); 2815 2816 MatrixUpdateQuantity = function (productId) { 2817 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId); 2818 var allQtyFields = currentMatrix.getElementsByClassName("js-qty"); 2819 2820 var qtyRowArr = []; 2821 var qtyColumnArr = []; 2822 2823 var totalQty = 0; 2824 2825 for (var i = 0; i < allQtyFields.length; i++) { 2826 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0; 2827 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0; 2828 } 2829 2830 for (var i = 0; i < allQtyFields.length; i++) { 2831 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value); 2832 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value); 2833 totalQty += parseFloat(allQtyFields[i].value); 2834 } 2835 2836 //Update row counters 2837 for (var i = 0; i < qtyRowArr.length; i++) { 2838 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 2839 2840 if (qtyRowArr[i] != undefined && qtyCounter != null) { 2841 var currentCount = qtyCounter.innerHTML; 2842 qtyCounter.innerHTML = qtyRowArr[i]; 2843 2844 if (currentCount != qtyCounter.innerHTML) { 2845 qtyCounter.classList.add("qty-field--active"); 2846 } 2847 } 2848 2849 } 2850 2851 //Update column counters 2852 for (var i = 0; i < qtyColumnArr.length; i++) { 2853 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 2854 2855 if (qtyColumnArr[i] != undefined && qtyCounter != null) { 2856 var currentCount = qtyCounter.innerHTML; 2857 qtyCounter.innerHTML = qtyColumnArr[i]; 2858 2859 if (currentCount != qtyCounter.innerHTML) { 2860 qtyCounter.classList.add("qty-field--active"); 2861 } 2862 } 2863 } 2864 2865 if (document.getElementById("TotalQtyCount_" + productId)) { 2866 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty; 2867 } 2868 2869 //Clean up animations 2870 setTimeout(function () { 2871 for (var i = 0; i < qtyRowArr.length; i++) { 2872 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0]; 2873 if (qtyCounter != null) { 2874 qtyCounter.classList.remove("qty-field--active"); 2875 } 2876 } 2877 for (var i = 0; i < qtyColumnArr.length; i++) { 2878 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0]; 2879 if (qtyCounter != null) { 2880 qtyCounter.classList.remove("qty-field--active"); 2881 } 2882 } 2883 }, 1000); 2884 } 2885 </script> 2886 } 2887 } 2888 2889 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount) 2890 { 2891 string loopCount = productLoopCounter.ToString(); 2892 2893 bool combinationFound = false; 2894 double stock = 0; 2895 double quantityValue = 0; 2896 string note = ""; 2897 2898 VariantProduct variantProduct = null; 2899 2900 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct)) 2901 { 2902 stock = variantProduct.Stock; 2903 quantityValue = variantProduct.Quantity; 2904 combinationFound = true; 2905 } 2906 2907 if (combinationFound) 2908 { 2909 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" /> 2910 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" /> 2911 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" /> 2912 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" /> 2913 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount"> 2914 2915 if (stock != 0) 2916 { 2917 <small>@Translate("Stock") @stock</small> 2918 } 2919 2920 <script> 2921 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}'; 2922 variantsCollection.push(variants); 2923 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" ); 2924 </script> 2925 } 2926 else 2927 { 2928 <div class="use-btn-height" style="background-color: #a8a8a8"></div> 2929 } 2930 } 2931 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2932 2933 @* Component *@ 2934 2935 @helper RenderAddToCart(AddToCart settings) 2936 { 2937 //set Id for quantity selector to get it's value from button 2938 if (settings.QuantitySelector != null) 2939 { 2940 if (string.IsNullOrEmpty(settings.QuantitySelector.Id)) 2941 { 2942 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N"); 2943 } 2944 2945 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id; 2946 2947 if (settings.Disabled) 2948 { 2949 settings.QuantitySelector.Disabled = true; 2950 } 2951 2952 if (string.IsNullOrEmpty(settings.QuantitySelector.Name)) 2953 { 2954 settings.QuantitySelector.Name = settings.QuantitySelector.Id; 2955 } 2956 } 2957 2958 if (settings.Disabled) 2959 { 2960 settings.AddButton.Disabled = true; 2961 } 2962 2963 settings.AddButton.CssClass += " btn--condensed"; 2964 2965 //unitsSelector 2966 if (settings.UnitSelector != null) 2967 { 2968 if (settings.Disabled) 2969 { 2970 settings.QuantitySelector.Disabled = true; 2971 } 2972 } 2973 2974 if (Pageview.Device.ToString() == "Mobile") { 2975 if (settings.UnitSelector != null) 2976 { 2977 <div class="margin-sm margin-position-bottom"> 2978 @Render(settings.UnitSelector) 2979 </div> 2980 } 2981 } 2982 2983 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 2984 @if (Pageview.Device.ToString() != "Mobile") { 2985 if (settings.UnitSelector != null) 2986 { 2987 @Render(settings.UnitSelector) 2988 } 2989 } 2990 @if (settings.QuantitySelector != null) 2991 { 2992 @Render(settings.QuantitySelector) 2993 } 2994 @Render(settings.AddButton) 2995 </div> 2996 } 2997 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 2998 2999 @* Component *@ 3000 3001 @helper RenderAddToCartButton(AddToCartButton settings) 3002 { 3003 if (!settings.HideTitle) 3004 { 3005 if (string.IsNullOrEmpty(settings.Title)) 3006 { 3007 if (settings.BuyForPoints) 3008 { 3009 settings.Title = Translate("Buy with points"); 3010 } 3011 else 3012 { 3013 settings.Title = Translate("Add to cart"); 3014 } 3015 } 3016 } 3017 else 3018 { 3019 settings.Title = ""; 3020 } 3021 3022 if (settings.Icon == null) 3023 { 3024 settings.Icon = new Icon(); 3025 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After; 3026 } 3027 3028 if (string.IsNullOrEmpty(settings.Icon.Name)) 3029 { 3030 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue; 3031 } 3032 3033 settings.OnClick = "Cart.AddToCart(event, { " + 3034 "id: '" + settings.ProductId + "'," + 3035 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") + 3036 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") + 3037 (settings.BuyForPoints ? "buyForPoints: true," : "") + 3038 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") + 3039 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") + 3040 "});" + settings.OnClick; 3041 3042 @RenderButton(settings) 3043 } 3044 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 3045 3046 @* Component *@ 3047 3048 @helper RenderUnitSelector(UnitSelector settings) 3049 { 3050 if (string.IsNullOrEmpty(settings.Id)) 3051 { 3052 settings.Id = Guid.NewGuid().ToString("N"); 3053 } 3054 var disabledClass = settings.Disabled ? "disabled" : ""; 3055 3056 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" /> 3057 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)> 3058 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label> 3059 <div class="dropdown__content dw-mod"> 3060 @settings.OptionsContent 3061 </div> 3062 <label class="dropdown-trigger-off" for="@settings.Id"></label> 3063 </div> 3064 } 3065 @using System.Reflection 3066 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 3067 3068 @* Component *@ 3069 3070 @helper RenderQuantitySelector(QuantitySelector settings) 3071 { 3072 var attributes = new Dictionary<string, string>(); 3073 3074 /*base settings*/ 3075 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); } 3076 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); } 3077 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); } 3078 if (settings.Disabled) { attributes.Add("disabled", "true"); } 3079 if (settings.Required) { attributes.Add("required", "true"); } 3080 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); } 3081 /*end*/ 3082 3083 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); } 3084 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); } 3085 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); } 3086 if (settings.ReadOnly) { attributes.Add("readonly", "true"); } 3087 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); } 3088 if (settings.Min == null) { settings.Min = 1; } 3089 attributes.Add("min", settings.Min.ToString()); 3090 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); } 3091 if (settings.Value == null) { settings.Value = 1; } 3092 attributes.Add("value", settings.Value.ToString()); 3093 attributes.Add("type", "number"); 3094 3095 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 3096 3097 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" /> 3098 } 3099 @using Dynamicweb.Rapido.Blocks.Components 3100 3101 @using Dynamicweb.Frontend 3102 @using Dynamicweb.Frontend.Devices 3103 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce 3104 @using Dynamicweb.Rapido.Blocks.Components.General 3105 @using System.Collections.Generic; 3106 3107 @* Component *@ 3108 3109 @helper RenderCustomerCenterList(CustomerCenterList settings) 3110 { 3111 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false; 3112 string hideActions = isTouchDevice ? "u-block" : ""; 3113 3114 <table class="table data-list dw-mod"> 3115 @if (settings.GetHeaders().Length > 0) { 3116 <thead> 3117 <tr class="u-bold"> 3118 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders()) 3119 { 3120 var attributes = new Dictionary<string, string>(); 3121 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); } 3122 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); } 3123 attributes.Add("align", header.Align.ToString()); 3124 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 3125 3126 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td> 3127 } 3128 </tr> 3129 </thead> 3130 } 3131 @foreach (CustomerCenterListItem listItem in settings.GetItems()) 3132 { 3133 int columnCount = 0; 3134 int totalColumns = listItem.GetInfoItems().Length; 3135 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : ""; 3136 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N"); 3137 3138 var attributes = new Dictionary<string, string>(); 3139 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); }; 3140 3141 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 3142 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)> 3143 <tr> 3144 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) { 3145 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 3146 3147 <td rowspan="2" @onClick class="data-list__main-item dw-mod"> 3148 @if (!string.IsNullOrEmpty(listItem.Title)) { 3149 <div class="u-bold">@listItem.Title</div> 3150 } 3151 @if (!string.IsNullOrEmpty(listItem.Description)) { 3152 <div>@listItem.Description</div> 3153 } 3154 </td> 3155 } 3156 3157 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems()) 3158 { 3159 var infoAttributes = new Dictionary<string, string>(); 3160 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); }; 3161 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); }; 3162 infoAttributes.Add("align", infoItem.Align.ToString()); 3163 3164 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value); 3165 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : ""; 3166 3167 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod"> 3168 @if (!string.IsNullOrEmpty(infoItem.Title)) { 3169 <div>@infoItem.Title</div> 3170 } 3171 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) { 3172 <div><small>@infoItem.Subtitle</small></div> 3173 } 3174 </td> 3175 3176 columnCount++; 3177 } 3178 </tr> 3179 <tr> 3180 <td colspan="7" align="right" class="u-va-bottom u-no-border"> 3181 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id"> 3182 @foreach (ButtonBase action in listItem.GetActions()) 3183 { 3184 action.ButtonLayout = ButtonLayout.LinkClean; 3185 action.Icon.CssClass += " u-full-height"; 3186 action.CssClass += " data-list__action-button link"; 3187 3188 @Render(action) 3189 } 3190 </div> 3191 </td> 3192 </tr> 3193 </tbody> 3194 } 3195 </table> 3196 } 3197 3198 3199 3200 3201 3202

OM DANISH AGRO
Danish Agro er ejet af 8.350 danske landmænd, og vores vigtigste opgave er at være den bedst mulige samarbejdspartner for vores ejere og kunder og skabe størst mulig værditilvækst for de landmænd, vi samarbejder med.

OMFANG
Vi er en af de største og mest betydende partnere for landbruget i Østersøregionen. Koncernen beskræftiger mere end 5.000 medarbejdere fordelt i seks forretningsdivisioner og cirka 100 datterselskaber i 17 lande.

MARKEDSLEDER
Vi er blandt de førende på vores felt, også uden for Danmark, og alt, hvad vi gør, gør vi for at være den bedst mulige samarbejdspartner for landmænd, der kræver produkter, serviceydelser og medarbejdere af høj kvalitet.

CULTIVATING VALUE
Vi er med fra jord til bord, og det er vi rigtig stolte af.
Vores daglige fokus er at skabe og sikre værdi for vores ejere og kunder – vi kalder det
Cultivating Value.
Oplev Danish Agro
Se filmen og få et indblik i koncernens omfang, virke og formål.
På fem minutter får du indblik i vores grundlæggende værdier og kultur - og ikke mindst vores daglige fokus: At skabe og sikre værditilvækst for vores kunder.
Vi kalder det Cultivating Value - vi ’dyrker’ bogstaveligt talt værdi, og alle vores beslutninger tager sit afsæt i dette fokus.