HedeDanmark bidrager til forskning i bedre vandløb
Forskere fra Aarhus Universitet (AU) vil finde den bedste måde at lede vand i små vandløb væk fra markerne og samtidig sikre et godt vandmiljø. Assens Kommune er initiativtager til projektet og samarbejder med AU, HedeDanmark og Orbicon om et 4-årigt forskningsprojekt.
Kurt Beck
Den 1. oktober 2024 skiftede alle forretningsenheder under Hedeselskabet navn til Dalgas. Det gælder således HedeDanmark, HD 2412, HD NordicTrees, HD Silva, HD BioRec, HD Forest, HD Forest Germany, HD Seed og HD LogSystems.
Vandløb i Assens Kommune vil blive fulgt tæt i de kommende år. Promilleafgiftsfonden for Landbrug har netop givet tilsagn om støtte til et nyt forskningsprojekt med en samlet økonomi på 7 millioner kroner. Projektet er banebrydende, fordi det vil skaffe databaseret viden om forskellige grødeskæringsmetoders virkning på både evnen til at lede vand bort og på miljøtilstanden i små vandløb. En viden, som myndigheder og landbruget har efterspurgt i mange år.
Små vandløb udgør cirka 75 procent af alle danske vandløb, og skæring af grøde spiller en meget vigtig rolle for både afvanding af landbrugsarealer og for vandløbenes økologiske tilstand. Forsøgene omfatter bl.a. forskellige metoder og tidspunkter for grødeskæring. Målet er at undersøge, hvordan vandet bedst bliver ledt væk fra omgivende landbrugsarealer på en måde, så også vandløbets samlede miljøtilstand kan forbedres.
"Vi glæder os til det spændende samarbejde. Forskningsprojektet med forsøg med grødeskæring i Assens Kommune er unikt. Med projektet får vi videnskabelig dokumentation for grødeskæringens effekter gennem kontinuert overvågning af vandføringsevne og vandstand i vandløbene. Vi får også en systematisk dokumentation af, hvordan forskellige metoder og tidspunkter for grødeskæring påvirker den økologiske tilstand i små vandløb – både på kort og på langt sigt,” forklarer Annette Baattrup-Pedersen, seniorforsker ved Aarhus Universitet, Institut for Bioscience – Sektion for Vandløbs- og ådalsøkologi.
Forskere og praktikere går sammen i vandløb
Annette Baattrup-Pedersen er en del af projektgruppen, som også tæller vandløbskonsulent Jannik Seslef fra Assens Kommune, biolog Bjarne Moeslund fra Orbicon og landskabskonsulent Kurt Beck fra HedeDanmark.
”Vi er overbevist om, at der er gode muligheder for at forbedre vandmiljøet i åer og vandløb, samtidig med at vi kan sikre afvanding fra landmændenes marker. Vi glæder os til, at der kommer øget viden på området. Selvfølgelig til gavn for miljøet, men også fordi solidt og vidensbaseret fagligt belæg er med til at give os en faglig glæde for os praktikere,” siger landskabskonsulent Kurt Beck fra HedeDanmark.
Økonomisk er projektet ud over tilsagnet fra Promilleafgiftsfonden også støttet af HedeDanmark, Havørred Fyn og Assens Kommune.
Viden efterspørges i vandløb
Projektgruppen forventer, at forsøgene med grødeskæring allerede i løbet af de første par år vil bidrage med viden. Resultaterne af forsøgene kommer til at omfatte videnskabelige målinger af vandføringsevnen – vandstand og vandføring og målinger af vandløbets økologiske tilstand, herunder planter, smådyr og fisk, for hvilke der er fastsat bestemte miljømål.
Nu går Assens Kommune i gang med at finde egnede vandløb til forsøgene i en tæt dialog med de lokale landboforeninger, landmænd og øvrige lodsejere.
Fakta – grødeskæring
Grøde er planter, der gror i vandløb. Grødeskæring foretages for at sænke vandstanden og til at forbedre vandløbenes evne til at bortlede overskydende vand, først og fremmest fra landbrugsarealer, men også fra andre typer af arealer.
Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Dalgas_Featured_Lists.cshtml" System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at Dalgas.Custom.Services.ContentRelationService.GetRelatedPagesByUrlAndParameters(String url, List`1 parameters, Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 81 at Dalgas.Custom.Services.ContentRelationService.GetNewsByCurrentPage(Int32 pageSize, Boolean onlyFromCurrentArea, List`1 parameters) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 775 at CompiledRazorTemplates.Dynamic.RazorEngine_13c977aa494d477ab7ef547f37a1462e.Execute() in D:\solutions\dalgas-production\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Featured_Lists.cshtml:line 250 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.GridRowViewModel> 2 @using System 3 @using System.Collections.Generic 4 @using System.Linq 5 @using System.Text.RegularExpressions 6 @using Dalgas.Custom.Constants 7 @using Dalgas.Custom.Models.Content 8 @using Dalgas.Custom.Services 9 @using Dalgas.Custom.ViewModels.UI 10 @using Dynamicweb.Content 11 @using Dynamicweb.Core.Encoders 12 @using Dynamicweb.Frontend 13 @using Dynamicweb.Ecommerce.ProductCatalog 14 @using Page = Dynamicweb.Content.Page 15 @using System 16 @using System.Collections.Generic 17 @using System.Linq 18 @using Dalgas.Custom.ViewModels.UI 19 @using Dynamicweb.Content 20 @using Dynamicweb.Ecommerce.ProductCatalog 21 @using Dynamicweb.Frontend 22 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 23 24 @*TODO: Move these functions onto the model *@ 25 26 @functions 27 { 28 29 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 30 { 31 var returnValues = new List<string> 32 { 33 $"item_{model.Item.SystemName.ToLower()}" 34 }; 35 36 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 37 { 38 returnValues.Add("dalgas-section-first-on-page"); 39 } 40 41 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 42 43 if (!string.IsNullOrEmpty(overwriteTheme)) 44 { 45 sectionBackgroundTheme = overwriteTheme; 46 } 47 48 // Add theme class if it exists 49 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 50 { 51 if (sectionBackgroundTheme.Contains("default")) 52 { 53 returnValues.Add("theme theme-light"); 54 } 55 else 56 { 57 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 58 } 59 } 60 61 // Determine if top padding should be removed 62 63 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 64 65 returnValues.Add("pb-6"); 66 if (removeTopPadding != "enable") 67 { 68 returnValues.Add("pt-6"); 69 } 70 71 return string.Join(" ", returnValues); 72 } 73 74 } 75 76 77 @{ 78 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 79 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 80 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 81 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 82 83 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 84 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 85 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 86 bool hasHeading = headings.Any(); 87 bool hasButton = buttons.Any(); 88 89 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 90 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 91 92 var sectionClassList = GetSectionClassList(Model); 93 94 var image = string.Empty; 95 var imageParameters = new Dictionary<string, object>(); 96 97 string layout = string.Empty; 98 Boolean enableFifthElement = false; 99 if (Model?.Item != null) 100 { 101 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 102 103 if (paragraphLayout != null) 104 { 105 layout = paragraphLayout.GetString("Layout"); 106 107 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 108 } 109 } 110 111 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 112 { 113 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 114 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 115 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 116 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 117 string cssPosition = $"{xPos}% {yPos}%"; 118 imageParameters.Add("style", "object-position:" + cssPosition); 119 } 120 121 LinkViewModel imageLink = new LinkViewModel(); 122 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 123 { 124 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 125 } 126 127 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 128 } 129 130 131 @{ 132 ClassList rowWidthClasslist = new ClassList("col-12"); 133 ClassList colClasslist = new ClassList("js-content-container content-container col-12 mb-4 dalgas-list-card"); 134 ClassList cardClasslist = new ClassList("pt-3"); 135 string imageAspectRatio = string.Empty; 136 string newsModolusClasslist = string.Empty; 137 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 138 139 FileViewModel featuredListImage = new FileViewModel(); 140 List<FileViewModel> imageList = new List<FileViewModel>(); // List to hold images for the modal 141 IList<ItemViewModel> featureListItems = Model.Item?.GetItem("Content")?.GetItems("PageSelector") ?? Enumerable.Empty<ItemViewModel>().ToList(); 142 bool hasFeatureListItems = featureListItems.Any(); 143 144 int.TryParse(Dynamicweb.Context.Current.Request["PageSize"], out int pageSize); 145 string showAllUrl = $"{Pageview.SearchFriendlyUrl}?PageSize=999"; 146 147 bool showAll = Model.Item.GetItem("Content").GetBoolean("ShowAll"); 148 bool showFacets = Model.Item.GetItem("Content").GetBoolean("ShowFacets"); 149 bool showSearch = Model.Item.GetItem("Content").GetBoolean("ShowSearch"); 150 bool allowAllQueryItems = showFacets || showSearch; 151 showAll = allowAllQueryItems || showAll; 152 int numberOfItemsToShow = 999; 153 int rowsPerPage = 3; 154 155 156 List<FacetOption> selectedFacetOptions = new List<FacetOption>(); 157 if (hasFeatureListItems) 158 { 159 allowAllQueryItems = false; 160 } 161 162 QueryResult queryResult = new QueryResult(); 163 string contentType = Model.Item.GetItem("Content").GetString("FeatureOptions"); 164 int totaleCount = 0; 165 166 switch (contentType) 167 { 168 case "articles": 169 numberOfItemsToShow = 4; 170 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 171 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 172 173 if (!hasFeatureListItems) 174 { 175 queryResult = showAll ? ContentRelationService.Instance.GetAllKnowledge(numberOfItemsToShow) : ContentRelationService.Instance.GetKnowledgeByCurrentPage(numberOfItemsToShow); 176 } 177 178 imageAspectRatio = "ratio-4x3"; 179 colClasslist.Add("col-md-3"); 180 break; 181 case "events": 182 numberOfItemsToShow = 3; 183 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 184 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 185 if (!hasFeatureListItems) 186 { 187 queryResult = showAll ? ContentRelationService.Instance.GetAllEvents(numberOfItemsToShow) : ContentRelationService.Instance.GetEventsByCurrentPage(numberOfItemsToShow); 188 } 189 190 imageAspectRatio = "ratio-16x9"; 191 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 192 colClasslist.Add("col-md-4 d-flex flex-column"); 193 break; 194 case "cases": 195 numberOfItemsToShow = 3; 196 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 197 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 198 if (!hasFeatureListItems) 199 { 200 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 201 { 202 queryResult = ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentFunding(numberOfItemsToShow); 203 } 204 else 205 { 206 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseCustomerStoriesByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentPage(numberOfItemsToShow); 207 } 208 } 209 210 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 211 imageAspectRatio = "ratio-16x9"; 212 colClasslist.Add("col-md-4 d-flex flex-column"); 213 break; 214 case "news": 215 numberOfItemsToShow = 3; 216 numberOfItemsToShow = showAll ? numberOfItemsToShow * (rowsPerPage * 2) : numberOfItemsToShow; 217 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 218 if (!hasFeatureListItems) 219 { 220 if (Pageview.Area.Item["Custom_Website_Styling"].ToString().Contains("shop") && string.IsNullOrEmpty(Pageview.Area.Item["NewsFromOtherSites"].ToString()) == false) 221 { 222 // Initialize the list of parameters for the content query 223 var parameters = new List<KeyValuePair<string, string>>(); 224 225 // Get the "NewsFromOtherSites" field value from the current area 226 var newsFromOtherSites = Pageview.Area.Item["NewsFromOtherSites"]?.ToString(); 227 228 // Start building the list of area IDs, including the current page's area ID 229 var areaIds = new List<string> 230 { 231 PageView.Current()?.Area?.ID.ToString() 232 }; 233 234 // If "NewsFromOtherSites" has any values, split by comma and add them to the areaIds list 235 if (!string.IsNullOrEmpty(newsFromOtherSites)) 236 { 237 areaIds.AddRange(newsFromOtherSites.Split(',').Select(x => x.Trim())); 238 } 239 240 // Create a key-value pair for the content query, joining all area IDs with a comma 241 var keyValue = new KeyValuePair<string, string>( 242 ContentKeys.DW_INDEXING_CONTENT_FIELD_AREA_IDS, 243 string.Join(", ", areaIds.Where(id => !string.IsNullOrEmpty(id))) 244 ); 245 246 // Add the key-value pair to the parameters list 247 parameters.Add(keyValue); 248 249 // Execute the query to get news items 250 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow, parameters) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow, false, parameters); 251 } 252 else 253 { 254 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow); 255 } 256 } 257 258 rowWidthClasslist.Add("col-lg-11 ms-auto"); 259 colClasslist.Add("mb-5"); 260 break; 261 case "projects": 262 numberOfItemsToShow = 3; 263 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 264 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 265 if (!hasFeatureListItems) 266 { 267 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 268 { 269 queryResult = ContentRelationService.Instance.GetCaseProjectsByCurrentFunding(numberOfItemsToShow); 270 } 271 else 272 { 273 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseProjectsByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseProjectsByCurrentPage(numberOfItemsToShow); 274 } 275 } 276 277 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 278 imageAspectRatio = "ratio-16x9"; 279 colClasslist.Add("col-md-4 d-flex flex-column"); 280 break; 281 case "related-services": 282 numberOfItemsToShow = 6; 283 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 284 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 285 if (!hasFeatureListItems) 286 { 287 queryResult = ContentRelationService.Instance.GetRelatedServicesByCurrentPage(numberOfItemsToShow); 288 } 289 290 cardClasslist.Add("theme theme-mud p-4 pt-5 h-100"); 291 imageAspectRatio = "ratio-16x9"; 292 colClasslist.Add("col-md-4 d-flex flex-column"); 293 break; 294 } 295 296 int pageNum = int.TryParse(Dynamicweb.Context.Current.Request["PageNum"], out int result) ? result : 1; 297 string searchTerm = Dynamicweb.Context.Current.Request["q"]; 298 299 List<string> pageIds = new List<string>(); 300 if (hasFeatureListItems) 301 { 302 pageIds.AddRange(featureListItems.Select(fli => fli.Fields.FirstOrDefault(f => f.Name == "Page")?.GetLink().PageId.ToString())); 303 } 304 else if (queryResult.Results.Any()) 305 { 306 pageIds.AddRange(queryResult.Results.Select(qrr => qrr["PageId"].ToString())); 307 } 308 309 string strTitle = string.Empty; 310 string strLink = string.Empty; 311 string strSummary = string.Empty; 312 string strImage = string.Empty; 313 string strType = string.Empty; 314 string badgeTheme = string.Empty; 315 DateTime strDate = new DateTime(); 316 } 317 318 @if ((queryResult.FacetGroups.Any() && allowAllQueryItems) || (queryResult.Results.Any() && !allowAllQueryItems) || featureListItems.Any()) 319 { 320 int loopCounter = 1; // Initialize loop counter for each group 321 322 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 323 <div class="container-xl"> 324 <div class="row justify-content-center"> 325 <div class="@rowWidthClasslist"> 326 <div class="js-dalgas-queryresult-container dalgas-queryresult-container" 327 id="@($"query-result-{Model.Id}")"> 328 329 @if (hasLead || hasText || hasHeading) 330 { 331 <div class="js-content-container content-container col-12 mb-3"> 332 333 <div class="col-lg-6"> 334 <span> 335 @string.Join("", headings.Select(h => h.ToString())) 336 </span> 337 338 @if (!string.IsNullOrEmpty(lead)) 339 { 340 <p class="lead">@lead</p> 341 } 342 343 @text 344 345 </div> 346 </div> 347 } 348 349 @{ 350 ButtonViewModel btnViewResult = new ButtonViewModel 351 { 352 Text = Translate("View more"), 353 Type = ButtonType.Link, 354 DisplayType = ButtonDisplayType.Link 355 }; 356 357 if (showAll) 358 { 359 totaleCount = queryResult.TotalCount; 360 } 361 362 <a href="@showAllUrl" class="d-none">show all</a> 363 <form method="post" action="@Pageview.SearchFriendlyUrl" 364 data-response-target-element="content" tabindex="-1" aria-hidden="false" 365 class="d-flex js-dalgas-facets-form dalgas-facets-form" 366 data-total-count="@totaleCount" data-page-size="@numberOfItemsToShow"> 367 <input type="hidden" name="LayoutTemplate" 368 value="Designs/Swift/Swift_PageClean.cshtml"/> 369 <input type="hidden" name="PageNum" value="@pageNum"/> 370 <input type="hidden" name="PageSize" value="@numberOfItemsToShow"/> 371 @if (allowAllQueryItems) 372 { 373 if (showFacets) 374 { 375 foreach (FacetGroup facetGroup in queryResult.FacetGroups) 376 { 377 foreach (Facet facet in facetGroup.Facets) 378 { 379 string showClass = " show"; 380 string ariaExpanded = "true"; 381 string facetGroupId = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", string.Empty, RegexOptions.None, TimeSpan.FromMilliseconds(5000)); 382 383 384 if (facet.Options.Any()) 385 { 386 int selectedFacetsInGroup = 0; 387 388 foreach (FacetOption option in facet.Options) 389 { 390 if (option.Selected) 391 { 392 selectedFacetsInGroup++; 393 } 394 } 395 396 string label = selectedFacetsInGroup > 0 ? Translate(facet.Name) + "<span style=\"padding: 0.3em 0.6em\" class=\"badge badge ms-2\">" + selectedFacetsInGroup + "</span>" : Translate(facet.Name); 397 398 <div class="dropdown js-facets-selector"> 399 <button class="btn dropdown-toggle" type="button" 400 id="FacetGroup_@facetGroupId" data-bs-toggle="dropdown" 401 aria-expanded="false"> 402 @label 403 </button> 404 <div data-lenis-prevent class="dropdown-menu p-3" 405 aria-labelledby="FacetGroup_@facetGroupId" 406 style="min-width: 280px"> 407 @foreach (FacetOption facetOption in facet.Options.OrderBy(fo => fo.Label)) 408 { 409 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 410 string disabled = facetOption.Count <= 0 ? "disabled" : string.Empty; 411 string selected = facetOption.Selected ? "checked" : string.Empty; 412 string facetValue = Uri.UnescapeDataString(facetOption.Value); 413 string optionValue = $"[{facetValue}]"; 414 415 facetLabel = facetLabel.ToLower() == "true" ? facetLabel = Translate("Yes") : facetLabel; 416 facetLabel = facetLabel.ToLower() == "false" ? facetLabel = Translate("No") : facetLabel; 417 418 <label class="form-check mt-1" @disabled> 419 <input type="checkbox" 420 onclick="custom.QueryResult.update(event)" 421 class="form-check-input" 422 name="@facet.QueryParameter" 423 value="@optionValue" 424 data-filter-value="@facetLabel" @selected> 425 <span 426 class="form-check-label d-flex align-items-center"> 427 <span class="flex-fill">@facetLabel </span> 428 <small 429 class="opacity-85">@facetOption.Count</small> 430 </span> 431 </label> 432 433 if (facetOption.Selected) 434 { 435 FacetOption selectFacetOption = facetOption; 436 selectFacetOption.Name = facet.QueryParameter; 437 selectedFacetOptions.Add(selectFacetOption); 438 } 439 } 440 </div> 441 </div> 442 } 443 } 444 } 445 446 if (!string.IsNullOrEmpty(searchTerm)) 447 { 448 selectedFacetOptions.Add(new FacetOption() 449 { 450 Count = 1, 451 Label = searchTerm, 452 Name = "q", 453 Selected = true, 454 Value = searchTerm 455 }); 456 } 457 } 458 459 if (showSearch) 460 { 461 <div class="type-ahead-dropdown"> 462 <div class="position-relative suggest-form"> 463 <span 464 class="position-absolute top-0 end-0 icon-3 px-3 d-flex align-items-center h-100 search-icon"> 465 @ReadFile(iconPath + "search.svg") 466 </span> 467 468 <input id="searchField_@Model.Id" 469 class="form-control custom-header-searchbar js-custom-facets-search-field pe-5 ps-3 js-" 470 type="search" 471 placeholder="@Translate("Search here")" 472 autocomplete="off" 473 maxlength="255" 474 name="q" 475 value="@searchTerm" 476 data-original="@searchTerm"> 477 478 <button type="button" 479 onclick="custom.QueryResult.clearSearchField(event)" 480 class="btn h-100 icon-2 reset-search" 481 aria-label="@Translate("Clear search")" 482 style="opacity: 0; position: absolute; top: 0; right: 0; visibility: hidden;"> 483 @ReadFile(iconPath + "x.svg") 484 </button> 485 </div> 486 </div> 487 <input type="submit" onclick="custom.QueryResult.update(event)" 488 class="btn btn-primary" value="@Translate("Search", "Search")"> 489 } 490 } 491 </form> 492 493 if (showFacets && selectedFacetOptions.Any()) 494 { 495 <div 496 class="js-dalgas-queryresult-selectedfacets-container dalgas-queryresult-selectedfacets-container mt-3"> 497 @foreach (FacetOption facetOption in selectedFacetOptions) 498 { 499 string facetValue = Uri.UnescapeDataString(facetOption.Value); 500 string optionValue = $"[{facetValue}]"; 501 <input class="visually-hidden" 502 id="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)" 503 name="@facetOption.Name" 504 onclick="custom.QueryResult.deselectFacetOption(event)" type="checkbox" 505 value="@optionValue" title="@facetOption.Label" checked> 506 <label class="badge theme border border-dark text-nowrap" 507 for="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)"> 508 <span class="text-nowrap">@(facetOption.Label)</span> 509 <span class="icon-2 ms-2"> 510 @ReadFile(iconPath + "x.svg") 511 </span> 512 </label> 513 } 514 515 @if (selectedFacetOptions.Count >= 3) 516 { 517 <input class="visually-hidden" id="ClearAll" name="ClearAll" 518 onclick="custom.QueryResult.clearAll(event)" type="checkbox" value="" 519 title="" checked> 520 <label class="badge theme border border-dark dalgas-btn-clear-all" 521 for="ClearAll"> 522 <span class="text-nowrap">@Translate("Clear all")</span> 523 <span class="icon-2 ms-2"> 524 @ReadFile(iconPath + "x.svg") 525 </span> 526 </label> 527 } 528 </div> 529 }} 530 531 @if (pageIds.Any() == false) 532 { 533 <div class="mt-4">@Translate("Your search returned no results...")</div> 534 } 535 536 <div 537 class="row @(!showAll ? "dalgas-featured-list-mobile-horizontal-scroll" : "mt-5") js-dalgas-queryresult-itemlist dalgas-queryresult-itemlist mt-2"> 538 @foreach (string pageId in pageIds) 539 { 540 if (!int.TryParse(pageId, out int intPageId)) 541 { 542 continue; 543 } 544 545 Page page = Services.Pages.GetPage(intPageId); 546 547 if (page == null) 548 { 549 continue; 550 } 551 552 @* Renders articles from another website language *@ 553 554 string resolvedPageId = pageId; 555 if (PageView.Current().Page.AreaId != page.AreaId) 556 { 557 resolvedPageId = GetPageIdByNavigationTag("ArticlePageFromOtherSite") + "&render-article-id=" + pageId; 558 } 559 560 string articleUrl = SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + resolvedPageId); 561 562 strTitle = page.Item["Title"]?.ToString(); 563 strSummary = page.Item["Summary"]?.ToString(); 564 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 565 btnViewResult.Id = "pageId_" + page.ID; 566 btnViewResult.Url = !string.IsNullOrEmpty(articleUrl) ? articleUrl : "/Default.aspx?ID=" + resolvedPageId; 567 if (page.Item["Date"] != null) 568 { 569 strDate = (DateTime) page.Item["Date"]; 570 } 571 572 int jpgIndex = strImage.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase); 573 if (jpgIndex != -1) 574 { 575 strImage = strImage.Substring(0, jpgIndex + 4); 576 } 577 578 featuredListImage = ViewModelFactory.CreateFieldFileValueView(strImage); 579 imageList.Add(featuredListImage); 580 581 if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 582 { 583 badgeTheme = ""; 584 if (loopCounter % 6 == 2 || loopCounter % 6 == 4) 585 { 586 newsModolusClasslist = "col-lg-5"; 587 imageAspectRatio = "ratio-16x9"; 588 if (showAll) 589 { 590 imageAspectRatio = "ratio-3x4 ratio-custom-news"; 591 } 592 } 593 else 594 { 595 newsModolusClasslist = "col-lg-3"; 596 imageAspectRatio = "ratio-16x9 ratio-lg-3x4"; 597 if (showAll) 598 { 599 imageAspectRatio = "ratio-3x4"; 600 } 601 } 602 603 loopCounter++; 604 } 605 606 607 <div class="@colClasslist @newsModolusClasslist"> 608 609 @if (!string.IsNullOrEmpty(featuredListImage.Path)) 610 { 611 <a href="@btnViewResult.Url"> 612 <figure class="ratio @imageAspectRatio mb-0"> 613 @RenderPartial("Components/Image.cshtml", featuredListImage ?? new FileViewModel()) 614 </figure> 615 </a> 616 } 617 618 <div class="@cardClasslist"> 619 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events") 620 { 621 badgeTheme = "mb-5"; 622 } 623 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 624 { 625 if (strDate != null) 626 { 627 var date = strDate; 628 var formattedDate = date.ToLongDateString(); 629 if (date.TimeOfDay.ToString() != "00:00:00") 630 { 631 formattedDate = formattedDate + " - " + date.ToShortTimeString(); 632 } 633 634 <div class="badge mb-3 @badgeTheme"> 635 @formattedDate 636 </div> 637 } 638 } 639 640 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "cases" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "projects") 641 { 642 var selectedValues = page.Item["Type"].ToString(); 643 <div class="badge mb-5 mr-3 @badgeTheme"> 644 @ContentService.Instance.GetLabelForCaseType(selectedValues) 645 </div> 646 } 647 648 @{ 649 var badgeParms = new Dictionary<string, object>(); 650 badgeParms.Add("pageId", page.ID); 651 } 652 @RenderPartial("UserInterfaceModels/badge.cshtml", Model, badgeParms) 653 654 <h4> 655 <a href="@btnViewResult.Url" class="text-decoration-none"> 656 @strTitle 657 </a> 658 </h4> 659 @if (strSummary != null) 660 { 661 <span class="small">@strSummary</span> 662 } 663 664 <div class="mt-2"> 665 @RenderModel(btnViewResult) 666 </div> 667 </div> 668 </div> 669 } 670 </div> 671 672 @if (showAll && totaleCount > numberOfItemsToShow) 673 { 674 <div class="row"> 675 <div class="col-12 text-center"> 676 <button onclick="custom.QueryResult.getNextPage(event)" 677 class="btn btn-primary">@Translate("Vis flere")</button> 678 </div> 679 </div> 680 } 681 682 @if (hasButton) 683 { 684 <div class="js-content-container content-container col-12"> 685 686 <div class="d-flex flex-wrap gap-3"> 687 @foreach (ButtonViewModel button in buttons) 688 { 689 @button 690 } 691 </div> 692 693 </div> 694 } 695 696 </div> 697 </div> 698 </div> 699 </div> 700 @if (enableFifthElement) 701 { 702 <div class="fifth-element-section-container"> 703 <div class="fifth-element size-2 bottom-0 ob-50 right-0 @fifthElementTheme"> 704 @ReadFile(fifthElementIconPath + "sun.svg") 705 </div> 706 </div> 707 } 708 </section> 709 } 710 else 711 { 712 if (Pageview.IsVisualEditorMode) 713 { 714 <div class="container-xl alert alert-danger" role="alert"> 715 This <strong>@Model.Item.SystemName</strong> is empty 716 </div> 717 } 718 } 719
Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Dalgas_Featured_Lists.cshtml" System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at Dalgas.Custom.Services.ContentRelationService.GetRelatedPagesByUrlAndParameters(String url, List`1 parameters, Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 81 at Dalgas.Custom.Services.ContentRelationService.GetKnowledgeByCurrentPage(Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 735 at CompiledRazorTemplates.Dynamic.RazorEngine_13c977aa494d477ab7ef547f37a1462e.Execute() in D:\solutions\dalgas-production\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Featured_Lists.cshtml:line 175 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.GridRowViewModel> 2 @using System 3 @using System.Collections.Generic 4 @using System.Linq 5 @using System.Text.RegularExpressions 6 @using Dalgas.Custom.Constants 7 @using Dalgas.Custom.Models.Content 8 @using Dalgas.Custom.Services 9 @using Dalgas.Custom.ViewModels.UI 10 @using Dynamicweb.Content 11 @using Dynamicweb.Core.Encoders 12 @using Dynamicweb.Frontend 13 @using Dynamicweb.Ecommerce.ProductCatalog 14 @using Page = Dynamicweb.Content.Page 15 @using System 16 @using System.Collections.Generic 17 @using System.Linq 18 @using Dalgas.Custom.ViewModels.UI 19 @using Dynamicweb.Content 20 @using Dynamicweb.Ecommerce.ProductCatalog 21 @using Dynamicweb.Frontend 22 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 23 24 @*TODO: Move these functions onto the model *@ 25 26 @functions 27 { 28 29 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 30 { 31 var returnValues = new List<string> 32 { 33 $"item_{model.Item.SystemName.ToLower()}" 34 }; 35 36 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 37 { 38 returnValues.Add("dalgas-section-first-on-page"); 39 } 40 41 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 42 43 if (!string.IsNullOrEmpty(overwriteTheme)) 44 { 45 sectionBackgroundTheme = overwriteTheme; 46 } 47 48 // Add theme class if it exists 49 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 50 { 51 if (sectionBackgroundTheme.Contains("default")) 52 { 53 returnValues.Add("theme theme-light"); 54 } 55 else 56 { 57 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 58 } 59 } 60 61 // Determine if top padding should be removed 62 63 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 64 65 returnValues.Add("pb-6"); 66 if (removeTopPadding != "enable") 67 { 68 returnValues.Add("pt-6"); 69 } 70 71 return string.Join(" ", returnValues); 72 } 73 74 } 75 76 77 @{ 78 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 79 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 80 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 81 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 82 83 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 84 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 85 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 86 bool hasHeading = headings.Any(); 87 bool hasButton = buttons.Any(); 88 89 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 90 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 91 92 var sectionClassList = GetSectionClassList(Model); 93 94 var image = string.Empty; 95 var imageParameters = new Dictionary<string, object>(); 96 97 string layout = string.Empty; 98 Boolean enableFifthElement = false; 99 if (Model?.Item != null) 100 { 101 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 102 103 if (paragraphLayout != null) 104 { 105 layout = paragraphLayout.GetString("Layout"); 106 107 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 108 } 109 } 110 111 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 112 { 113 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 114 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 115 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 116 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 117 string cssPosition = $"{xPos}% {yPos}%"; 118 imageParameters.Add("style", "object-position:" + cssPosition); 119 } 120 121 LinkViewModel imageLink = new LinkViewModel(); 122 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 123 { 124 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 125 } 126 127 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 128 } 129 130 131 @{ 132 ClassList rowWidthClasslist = new ClassList("col-12"); 133 ClassList colClasslist = new ClassList("js-content-container content-container col-12 mb-4 dalgas-list-card"); 134 ClassList cardClasslist = new ClassList("pt-3"); 135 string imageAspectRatio = string.Empty; 136 string newsModolusClasslist = string.Empty; 137 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 138 139 FileViewModel featuredListImage = new FileViewModel(); 140 List<FileViewModel> imageList = new List<FileViewModel>(); // List to hold images for the modal 141 IList<ItemViewModel> featureListItems = Model.Item?.GetItem("Content")?.GetItems("PageSelector") ?? Enumerable.Empty<ItemViewModel>().ToList(); 142 bool hasFeatureListItems = featureListItems.Any(); 143 144 int.TryParse(Dynamicweb.Context.Current.Request["PageSize"], out int pageSize); 145 string showAllUrl = $"{Pageview.SearchFriendlyUrl}?PageSize=999"; 146 147 bool showAll = Model.Item.GetItem("Content").GetBoolean("ShowAll"); 148 bool showFacets = Model.Item.GetItem("Content").GetBoolean("ShowFacets"); 149 bool showSearch = Model.Item.GetItem("Content").GetBoolean("ShowSearch"); 150 bool allowAllQueryItems = showFacets || showSearch; 151 showAll = allowAllQueryItems || showAll; 152 int numberOfItemsToShow = 999; 153 int rowsPerPage = 3; 154 155 156 List<FacetOption> selectedFacetOptions = new List<FacetOption>(); 157 if (hasFeatureListItems) 158 { 159 allowAllQueryItems = false; 160 } 161 162 QueryResult queryResult = new QueryResult(); 163 string contentType = Model.Item.GetItem("Content").GetString("FeatureOptions"); 164 int totaleCount = 0; 165 166 switch (contentType) 167 { 168 case "articles": 169 numberOfItemsToShow = 4; 170 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 171 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 172 173 if (!hasFeatureListItems) 174 { 175 queryResult = showAll ? ContentRelationService.Instance.GetAllKnowledge(numberOfItemsToShow) : ContentRelationService.Instance.GetKnowledgeByCurrentPage(numberOfItemsToShow); 176 } 177 178 imageAspectRatio = "ratio-4x3"; 179 colClasslist.Add("col-md-3"); 180 break; 181 case "events": 182 numberOfItemsToShow = 3; 183 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 184 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 185 if (!hasFeatureListItems) 186 { 187 queryResult = showAll ? ContentRelationService.Instance.GetAllEvents(numberOfItemsToShow) : ContentRelationService.Instance.GetEventsByCurrentPage(numberOfItemsToShow); 188 } 189 190 imageAspectRatio = "ratio-16x9"; 191 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 192 colClasslist.Add("col-md-4 d-flex flex-column"); 193 break; 194 case "cases": 195 numberOfItemsToShow = 3; 196 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 197 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 198 if (!hasFeatureListItems) 199 { 200 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 201 { 202 queryResult = ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentFunding(numberOfItemsToShow); 203 } 204 else 205 { 206 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseCustomerStoriesByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentPage(numberOfItemsToShow); 207 } 208 } 209 210 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 211 imageAspectRatio = "ratio-16x9"; 212 colClasslist.Add("col-md-4 d-flex flex-column"); 213 break; 214 case "news": 215 numberOfItemsToShow = 3; 216 numberOfItemsToShow = showAll ? numberOfItemsToShow * (rowsPerPage * 2) : numberOfItemsToShow; 217 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 218 if (!hasFeatureListItems) 219 { 220 if (Pageview.Area.Item["Custom_Website_Styling"].ToString().Contains("shop") && string.IsNullOrEmpty(Pageview.Area.Item["NewsFromOtherSites"].ToString()) == false) 221 { 222 // Initialize the list of parameters for the content query 223 var parameters = new List<KeyValuePair<string, string>>(); 224 225 // Get the "NewsFromOtherSites" field value from the current area 226 var newsFromOtherSites = Pageview.Area.Item["NewsFromOtherSites"]?.ToString(); 227 228 // Start building the list of area IDs, including the current page's area ID 229 var areaIds = new List<string> 230 { 231 PageView.Current()?.Area?.ID.ToString() 232 }; 233 234 // If "NewsFromOtherSites" has any values, split by comma and add them to the areaIds list 235 if (!string.IsNullOrEmpty(newsFromOtherSites)) 236 { 237 areaIds.AddRange(newsFromOtherSites.Split(',').Select(x => x.Trim())); 238 } 239 240 // Create a key-value pair for the content query, joining all area IDs with a comma 241 var keyValue = new KeyValuePair<string, string>( 242 ContentKeys.DW_INDEXING_CONTENT_FIELD_AREA_IDS, 243 string.Join(", ", areaIds.Where(id => !string.IsNullOrEmpty(id))) 244 ); 245 246 // Add the key-value pair to the parameters list 247 parameters.Add(keyValue); 248 249 // Execute the query to get news items 250 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow, parameters) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow, false, parameters); 251 } 252 else 253 { 254 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow); 255 } 256 } 257 258 rowWidthClasslist.Add("col-lg-11 ms-auto"); 259 colClasslist.Add("mb-5"); 260 break; 261 case "projects": 262 numberOfItemsToShow = 3; 263 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 264 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 265 if (!hasFeatureListItems) 266 { 267 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 268 { 269 queryResult = ContentRelationService.Instance.GetCaseProjectsByCurrentFunding(numberOfItemsToShow); 270 } 271 else 272 { 273 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseProjectsByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseProjectsByCurrentPage(numberOfItemsToShow); 274 } 275 } 276 277 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 278 imageAspectRatio = "ratio-16x9"; 279 colClasslist.Add("col-md-4 d-flex flex-column"); 280 break; 281 case "related-services": 282 numberOfItemsToShow = 6; 283 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 284 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 285 if (!hasFeatureListItems) 286 { 287 queryResult = ContentRelationService.Instance.GetRelatedServicesByCurrentPage(numberOfItemsToShow); 288 } 289 290 cardClasslist.Add("theme theme-mud p-4 pt-5 h-100"); 291 imageAspectRatio = "ratio-16x9"; 292 colClasslist.Add("col-md-4 d-flex flex-column"); 293 break; 294 } 295 296 int pageNum = int.TryParse(Dynamicweb.Context.Current.Request["PageNum"], out int result) ? result : 1; 297 string searchTerm = Dynamicweb.Context.Current.Request["q"]; 298 299 List<string> pageIds = new List<string>(); 300 if (hasFeatureListItems) 301 { 302 pageIds.AddRange(featureListItems.Select(fli => fli.Fields.FirstOrDefault(f => f.Name == "Page")?.GetLink().PageId.ToString())); 303 } 304 else if (queryResult.Results.Any()) 305 { 306 pageIds.AddRange(queryResult.Results.Select(qrr => qrr["PageId"].ToString())); 307 } 308 309 string strTitle = string.Empty; 310 string strLink = string.Empty; 311 string strSummary = string.Empty; 312 string strImage = string.Empty; 313 string strType = string.Empty; 314 string badgeTheme = string.Empty; 315 DateTime strDate = new DateTime(); 316 } 317 318 @if ((queryResult.FacetGroups.Any() && allowAllQueryItems) || (queryResult.Results.Any() && !allowAllQueryItems) || featureListItems.Any()) 319 { 320 int loopCounter = 1; // Initialize loop counter for each group 321 322 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 323 <div class="container-xl"> 324 <div class="row justify-content-center"> 325 <div class="@rowWidthClasslist"> 326 <div class="js-dalgas-queryresult-container dalgas-queryresult-container" 327 id="@($"query-result-{Model.Id}")"> 328 329 @if (hasLead || hasText || hasHeading) 330 { 331 <div class="js-content-container content-container col-12 mb-3"> 332 333 <div class="col-lg-6"> 334 <span> 335 @string.Join("", headings.Select(h => h.ToString())) 336 </span> 337 338 @if (!string.IsNullOrEmpty(lead)) 339 { 340 <p class="lead">@lead</p> 341 } 342 343 @text 344 345 </div> 346 </div> 347 } 348 349 @{ 350 ButtonViewModel btnViewResult = new ButtonViewModel 351 { 352 Text = Translate("View more"), 353 Type = ButtonType.Link, 354 DisplayType = ButtonDisplayType.Link 355 }; 356 357 if (showAll) 358 { 359 totaleCount = queryResult.TotalCount; 360 } 361 362 <a href="@showAllUrl" class="d-none">show all</a> 363 <form method="post" action="@Pageview.SearchFriendlyUrl" 364 data-response-target-element="content" tabindex="-1" aria-hidden="false" 365 class="d-flex js-dalgas-facets-form dalgas-facets-form" 366 data-total-count="@totaleCount" data-page-size="@numberOfItemsToShow"> 367 <input type="hidden" name="LayoutTemplate" 368 value="Designs/Swift/Swift_PageClean.cshtml"/> 369 <input type="hidden" name="PageNum" value="@pageNum"/> 370 <input type="hidden" name="PageSize" value="@numberOfItemsToShow"/> 371 @if (allowAllQueryItems) 372 { 373 if (showFacets) 374 { 375 foreach (FacetGroup facetGroup in queryResult.FacetGroups) 376 { 377 foreach (Facet facet in facetGroup.Facets) 378 { 379 string showClass = " show"; 380 string ariaExpanded = "true"; 381 string facetGroupId = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", string.Empty, RegexOptions.None, TimeSpan.FromMilliseconds(5000)); 382 383 384 if (facet.Options.Any()) 385 { 386 int selectedFacetsInGroup = 0; 387 388 foreach (FacetOption option in facet.Options) 389 { 390 if (option.Selected) 391 { 392 selectedFacetsInGroup++; 393 } 394 } 395 396 string label = selectedFacetsInGroup > 0 ? Translate(facet.Name) + "<span style=\"padding: 0.3em 0.6em\" class=\"badge badge ms-2\">" + selectedFacetsInGroup + "</span>" : Translate(facet.Name); 397 398 <div class="dropdown js-facets-selector"> 399 <button class="btn dropdown-toggle" type="button" 400 id="FacetGroup_@facetGroupId" data-bs-toggle="dropdown" 401 aria-expanded="false"> 402 @label 403 </button> 404 <div data-lenis-prevent class="dropdown-menu p-3" 405 aria-labelledby="FacetGroup_@facetGroupId" 406 style="min-width: 280px"> 407 @foreach (FacetOption facetOption in facet.Options.OrderBy(fo => fo.Label)) 408 { 409 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 410 string disabled = facetOption.Count <= 0 ? "disabled" : string.Empty; 411 string selected = facetOption.Selected ? "checked" : string.Empty; 412 string facetValue = Uri.UnescapeDataString(facetOption.Value); 413 string optionValue = $"[{facetValue}]"; 414 415 facetLabel = facetLabel.ToLower() == "true" ? facetLabel = Translate("Yes") : facetLabel; 416 facetLabel = facetLabel.ToLower() == "false" ? facetLabel = Translate("No") : facetLabel; 417 418 <label class="form-check mt-1" @disabled> 419 <input type="checkbox" 420 onclick="custom.QueryResult.update(event)" 421 class="form-check-input" 422 name="@facet.QueryParameter" 423 value="@optionValue" 424 data-filter-value="@facetLabel" @selected> 425 <span 426 class="form-check-label d-flex align-items-center"> 427 <span class="flex-fill">@facetLabel </span> 428 <small 429 class="opacity-85">@facetOption.Count</small> 430 </span> 431 </label> 432 433 if (facetOption.Selected) 434 { 435 FacetOption selectFacetOption = facetOption; 436 selectFacetOption.Name = facet.QueryParameter; 437 selectedFacetOptions.Add(selectFacetOption); 438 } 439 } 440 </div> 441 </div> 442 } 443 } 444 } 445 446 if (!string.IsNullOrEmpty(searchTerm)) 447 { 448 selectedFacetOptions.Add(new FacetOption() 449 { 450 Count = 1, 451 Label = searchTerm, 452 Name = "q", 453 Selected = true, 454 Value = searchTerm 455 }); 456 } 457 } 458 459 if (showSearch) 460 { 461 <div class="type-ahead-dropdown"> 462 <div class="position-relative suggest-form"> 463 <span 464 class="position-absolute top-0 end-0 icon-3 px-3 d-flex align-items-center h-100 search-icon"> 465 @ReadFile(iconPath + "search.svg") 466 </span> 467 468 <input id="searchField_@Model.Id" 469 class="form-control custom-header-searchbar js-custom-facets-search-field pe-5 ps-3 js-" 470 type="search" 471 placeholder="@Translate("Search here")" 472 autocomplete="off" 473 maxlength="255" 474 name="q" 475 value="@searchTerm" 476 data-original="@searchTerm"> 477 478 <button type="button" 479 onclick="custom.QueryResult.clearSearchField(event)" 480 class="btn h-100 icon-2 reset-search" 481 aria-label="@Translate("Clear search")" 482 style="opacity: 0; position: absolute; top: 0; right: 0; visibility: hidden;"> 483 @ReadFile(iconPath + "x.svg") 484 </button> 485 </div> 486 </div> 487 <input type="submit" onclick="custom.QueryResult.update(event)" 488 class="btn btn-primary" value="@Translate("Search", "Search")"> 489 } 490 } 491 </form> 492 493 if (showFacets && selectedFacetOptions.Any()) 494 { 495 <div 496 class="js-dalgas-queryresult-selectedfacets-container dalgas-queryresult-selectedfacets-container mt-3"> 497 @foreach (FacetOption facetOption in selectedFacetOptions) 498 { 499 string facetValue = Uri.UnescapeDataString(facetOption.Value); 500 string optionValue = $"[{facetValue}]"; 501 <input class="visually-hidden" 502 id="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)" 503 name="@facetOption.Name" 504 onclick="custom.QueryResult.deselectFacetOption(event)" type="checkbox" 505 value="@optionValue" title="@facetOption.Label" checked> 506 <label class="badge theme border border-dark text-nowrap" 507 for="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)"> 508 <span class="text-nowrap">@(facetOption.Label)</span> 509 <span class="icon-2 ms-2"> 510 @ReadFile(iconPath + "x.svg") 511 </span> 512 </label> 513 } 514 515 @if (selectedFacetOptions.Count >= 3) 516 { 517 <input class="visually-hidden" id="ClearAll" name="ClearAll" 518 onclick="custom.QueryResult.clearAll(event)" type="checkbox" value="" 519 title="" checked> 520 <label class="badge theme border border-dark dalgas-btn-clear-all" 521 for="ClearAll"> 522 <span class="text-nowrap">@Translate("Clear all")</span> 523 <span class="icon-2 ms-2"> 524 @ReadFile(iconPath + "x.svg") 525 </span> 526 </label> 527 } 528 </div> 529 }} 530 531 @if (pageIds.Any() == false) 532 { 533 <div class="mt-4">@Translate("Your search returned no results...")</div> 534 } 535 536 <div 537 class="row @(!showAll ? "dalgas-featured-list-mobile-horizontal-scroll" : "mt-5") js-dalgas-queryresult-itemlist dalgas-queryresult-itemlist mt-2"> 538 @foreach (string pageId in pageIds) 539 { 540 if (!int.TryParse(pageId, out int intPageId)) 541 { 542 continue; 543 } 544 545 Page page = Services.Pages.GetPage(intPageId); 546 547 if (page == null) 548 { 549 continue; 550 } 551 552 @* Renders articles from another website language *@ 553 554 string resolvedPageId = pageId; 555 if (PageView.Current().Page.AreaId != page.AreaId) 556 { 557 resolvedPageId = GetPageIdByNavigationTag("ArticlePageFromOtherSite") + "&render-article-id=" + pageId; 558 } 559 560 string articleUrl = SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + resolvedPageId); 561 562 strTitle = page.Item["Title"]?.ToString(); 563 strSummary = page.Item["Summary"]?.ToString(); 564 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 565 btnViewResult.Id = "pageId_" + page.ID; 566 btnViewResult.Url = !string.IsNullOrEmpty(articleUrl) ? articleUrl : "/Default.aspx?ID=" + resolvedPageId; 567 if (page.Item["Date"] != null) 568 { 569 strDate = (DateTime) page.Item["Date"]; 570 } 571 572 int jpgIndex = strImage.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase); 573 if (jpgIndex != -1) 574 { 575 strImage = strImage.Substring(0, jpgIndex + 4); 576 } 577 578 featuredListImage = ViewModelFactory.CreateFieldFileValueView(strImage); 579 imageList.Add(featuredListImage); 580 581 if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 582 { 583 badgeTheme = ""; 584 if (loopCounter % 6 == 2 || loopCounter % 6 == 4) 585 { 586 newsModolusClasslist = "col-lg-5"; 587 imageAspectRatio = "ratio-16x9"; 588 if (showAll) 589 { 590 imageAspectRatio = "ratio-3x4 ratio-custom-news"; 591 } 592 } 593 else 594 { 595 newsModolusClasslist = "col-lg-3"; 596 imageAspectRatio = "ratio-16x9 ratio-lg-3x4"; 597 if (showAll) 598 { 599 imageAspectRatio = "ratio-3x4"; 600 } 601 } 602 603 loopCounter++; 604 } 605 606 607 <div class="@colClasslist @newsModolusClasslist"> 608 609 @if (!string.IsNullOrEmpty(featuredListImage.Path)) 610 { 611 <a href="@btnViewResult.Url"> 612 <figure class="ratio @imageAspectRatio mb-0"> 613 @RenderPartial("Components/Image.cshtml", featuredListImage ?? new FileViewModel()) 614 </figure> 615 </a> 616 } 617 618 <div class="@cardClasslist"> 619 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events") 620 { 621 badgeTheme = "mb-5"; 622 } 623 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 624 { 625 if (strDate != null) 626 { 627 var date = strDate; 628 var formattedDate = date.ToLongDateString(); 629 if (date.TimeOfDay.ToString() != "00:00:00") 630 { 631 formattedDate = formattedDate + " - " + date.ToShortTimeString(); 632 } 633 634 <div class="badge mb-3 @badgeTheme"> 635 @formattedDate 636 </div> 637 } 638 } 639 640 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "cases" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "projects") 641 { 642 var selectedValues = page.Item["Type"].ToString(); 643 <div class="badge mb-5 mr-3 @badgeTheme"> 644 @ContentService.Instance.GetLabelForCaseType(selectedValues) 645 </div> 646 } 647 648 @{ 649 var badgeParms = new Dictionary<string, object>(); 650 badgeParms.Add("pageId", page.ID); 651 } 652 @RenderPartial("UserInterfaceModels/badge.cshtml", Model, badgeParms) 653 654 <h4> 655 <a href="@btnViewResult.Url" class="text-decoration-none"> 656 @strTitle 657 </a> 658 </h4> 659 @if (strSummary != null) 660 { 661 <span class="small">@strSummary</span> 662 } 663 664 <div class="mt-2"> 665 @RenderModel(btnViewResult) 666 </div> 667 </div> 668 </div> 669 } 670 </div> 671 672 @if (showAll && totaleCount > numberOfItemsToShow) 673 { 674 <div class="row"> 675 <div class="col-12 text-center"> 676 <button onclick="custom.QueryResult.getNextPage(event)" 677 class="btn btn-primary">@Translate("Vis flere")</button> 678 </div> 679 </div> 680 } 681 682 @if (hasButton) 683 { 684 <div class="js-content-container content-container col-12"> 685 686 <div class="d-flex flex-wrap gap-3"> 687 @foreach (ButtonViewModel button in buttons) 688 { 689 @button 690 } 691 </div> 692 693 </div> 694 } 695 696 </div> 697 </div> 698 </div> 699 </div> 700 @if (enableFifthElement) 701 { 702 <div class="fifth-element-section-container"> 703 <div class="fifth-element size-2 bottom-0 ob-50 right-0 @fifthElementTheme"> 704 @ReadFile(fifthElementIconPath + "sun.svg") 705 </div> 706 </div> 707 } 708 </section> 709 } 710 else 711 { 712 if (Pageview.IsVisualEditorMode) 713 { 714 <div class="container-xl alert alert-danger" role="alert"> 715 This <strong>@Model.Item.SystemName</strong> is empty 716 </div> 717 } 718 } 719