HedeDanmark-elever på intens talent-lejr

Fem af HedeDanmarks anlægsgartnerelever var med i uge 7, da fire sjællandske erhvervsskoler for andet år i træk arrangerede Talent Camp i Nykøbing Falster. Det blev en uge, hvor de sidste detaljer kunne trænes inden fire af anlægsgartner-eleverne skal til svendeprøve.

Udgivet den 18. februar 2020

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.

Sten, pladevibrator, jordbund, dræningsbrønd, permeable og non-permeable underlag samt regnvandsmængderne.

Ja, der er nok at holde styr på som anlægsgartner i mødet med et belægningsprojekt. Det fik fem af HedeDanmarks egne anlægsgartner-elever mulighed for at opleve i praksis, da de i hele uge syv deltog på den årlige Talent Camp, som fire erhvervsskoler afholdt på CELF (Center for Erhvervsrettede uddannelser Lolland Falster) i Nykøbing Falster for andet år i træk.

I alt deltog 90 elever inden for en række håndværk i ugen, som ifølge arrangørerne er elevernes mulighed for at udvikle sig inden for deres fag og få afprøvet deres evner forud for svendeprøven med kyndig vejledning fra en række faglærere, der også deltager i ugen. 

Samarbejde på prøve

Alle deltagere på årets Talent Camp fik hver en opgave, der passede til deres niveau, og som de i løbet af ugen skulle løse med hjælp fra erhvervsskolernes faglærere. Undervejs var der også både faglige foredrag og knap så faglig underholdning.

To af de anlægsgartner-elever fra HedeDanmark, der deltog i ugen, er 22-årige Jakob H. Andersen og 26-årige Max Andersen. De skal begge til svendeprøve i maj – ovenikøbet med hinanden som partnere. 

- Det var en god anledning til at afprøve samarbejdet imellem os og en god træning til svendeprøven, Max Andersen, anlægsgartnerelev

Jakob H. Andersen (tv.) og Max Andersen foran deres anlægsprojekt. De to skal sammen til svendeprøve i maj-måned.

Sortering af brosten

Anlægsgartnergruppens eneste kvinde – 27-årige Charlotte Johansson –skal til svendeprøve i oktober og benyttede derfor Talent Camp til at fordybe sig i noget af det, hun ikke har stor erfaring med – særligt fordi hun efter 3. hovedforløb valgte at fokusere på anlægsteknik fremfor plejeteknik.

"Talent Camp var en god mulighed for at få trænet belægning - blandt andet at sortere stenene, så de ikke varierer for meget i størrelse og at flække stenene på den bedst mulige måde. Som elev bliver der taget godt hånd om os og vores elevansvarlige hjælper os med at træne teknikker og terpe forskellige planter. Vi bliver heller ikke bare sat til at rydde op på pladserne, hvis der ikke er noget at lave. Vi har fået en stor sandkasse, hvor vi kan træne forskellige anlægsøvelser, hvis der ikke lige er noget fagligt relevant at lave på andre projekter. Vores mentor og elevansvarlige tager meget ansvar for, at vi lærer det, vi skal.

Charlotte Johansson

Anlægsgartnerelev

Martin Poulsen og Charlotte Johansson samarbejdede under Talent Camp med belægning. Begge skal til svendeprøve i oktober – dog med andre partnere.

Til glæde for andre

De tre anlægsgartnere in spe har alle forskellige grunde til, hvorfor det netop er anlægsgartner-hylden, de er endt på.

For Jakob H. Andersen handler det dels om at sætte et blivende aftryk på verden:

- Det er fedt at være med til at skabe projekter, som bliver en del af folks omgivelser længe, og som de får glæde af. Samtidig kan man presse sin krop på en anden måde end, hvis man arbejder på et kontor.

Han suppleres af Max Andersen:

- Det er tilfredsstillende at se projekter tage form under mine hænder og vide, at det kommer til at være der længe.

Charlotte Johansson fortæller, at hun håber på at videreuddanne sig til Have- og Parkingeniør, når hun har arbejdet et par år som anlægsgartner:

- Min onkel arbejder også inden for branchen, så på den måde er glæden ved faget gået i arv fra ham til mig.

Ricki Larsen er endnu ikke så langt i sit elevforløb, at han behøver bekymre sig om sin svendeprøve endnu. Han benyttede alligevel Talent Camp til at træne belægningsarbejdet.

Udover Jakob H. Andersen, Max Andersen og Charlotte Johansson var også Ricki Larsen og Martin Poulsen fra HedeDanmark med til Talent Camp.

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

No products in cart