Naturgenopretning i landskabet

Mennesker og virksomheder præger i den grad det landskab, vi bor, arbejder og bevæger os i. På godt og ondt. Vores påvirkning af naturen presser i mange tilfælde biodiversiteten, men det kan du gøre noget ved. Ved at skabe et naturgenopretningsprojekt i landskabet og i skoven har du mulighed for at gøre en positiv forskel for naturen og biodiversiteten. På en måde, der giver genklang i samfundet. 

Naturgenopretning skaber naturlig natur

Når vi arbejder med naturgenopretning, stræber vi efter at sætte naturen fri. Vi tager udgangspunkt i det, der var, og bringer dine arealer tilbage til den tilstand, de havde, før de blev opdyrket eller ryddet.

I det åbne landskab vil typiske naturgenopretningsprojekter være genslyngninger af åer eller etablering af søer og andre vådområder – initiativer, der mindsker udvaskningen af næringsstoffer fra marker og vandløb til havet samt giver bedre betingelser for dyrelivet. Men vi kan også rydde bevoksninger fra tilgroede moser og overdrev eller plante hjemmehørende træer – med udgangspunkt i den naturlige tilstand på dine arealer. 

Skovene rummer et enormt naturpotentiale

Langt de fleste sårbare arter i Danmark er tilknyttet økosystemer, vi forbinder med skov. Derfor er det nemmeste bidrag til biodiversiteten at give plads til naturen i skovene. 

I skoven er der næsten uanede muligheder for at skabe en ekstremt varieret og artsrig natur. Du kan lade gamle løvtræer blive endnu ældre og forfalde naturligt, fremme lysåbne skovbryn, genskabe naturlig hydrologi og meget, meget mere. 

Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Dalgas_Slider.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.GetCaseCustomerStoriesByCurrentPage(Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 631
   at CompiledRazorTemplates.Dynamic.RazorEngine_763d294069f74252964c7daaece1d669.Execute() in D:\solutions\dalgas-production\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Slider.cshtml:line 140
   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<GridRowViewModel> 2 @using System 3 @using System.Collections.Generic 4 @using System.Linq 5 @using System.Web 6 @using Dalgas.Custom.Models.Content 7 @using Dalgas.Custom.Services 8 @using Dalgas.Custom.ViewModels.UI 9 @using Dynamicweb.Content 10 @using Dynamicweb.Frontend 11 @using Dynamicweb.Ecommerce.ProductCatalog 12 @using Page = Dynamicweb.Content.Page 13 14 @using System 15 @using System.Collections.Generic 16 @using System.Linq 17 @using Dalgas.Custom.ViewModels.UI 18 @using Dynamicweb.Content 19 @using Dynamicweb.Ecommerce.ProductCatalog 20 @using Dynamicweb.Frontend 21 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 22 23 @*TODO: Move these functions onto the model *@ 24 25 @functions 26 { 27 28 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 29 { 30 var returnValues = new List<string> 31 { 32 $"item_{model.Item.SystemName.ToLower()}" 33 }; 34 35 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 36 { 37 returnValues.Add("dalgas-section-first-on-page"); 38 } 39 40 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 41 42 if (!string.IsNullOrEmpty(overwriteTheme)) 43 { 44 sectionBackgroundTheme = overwriteTheme; 45 } 46 47 // Add theme class if it exists 48 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 49 { 50 if (sectionBackgroundTheme.Contains("default")) 51 { 52 returnValues.Add("theme theme-light"); 53 } 54 else 55 { 56 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 57 } 58 } 59 60 // Determine if top padding should be removed 61 62 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 63 64 returnValues.Add("pb-6"); 65 if (removeTopPadding != "enable") 66 { 67 returnValues.Add("pt-6"); 68 } 69 70 return string.Join(" ", returnValues); 71 } 72 73 } 74 75 76 @{ 77 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 78 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 79 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 80 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 81 82 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 83 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 84 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 85 bool hasHeading = headings.Any(); 86 bool hasButton = buttons.Any(); 87 88 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 89 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 90 91 var sectionClassList = GetSectionClassList(Model); 92 93 var image = string.Empty; 94 var imageParameters = new Dictionary<string, object>(); 95 96 string layout = string.Empty; 97 Boolean enableFifthElement = false; 98 if (Model?.Item != null) 99 { 100 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 101 102 if (paragraphLayout != null) 103 { 104 layout = paragraphLayout.GetString("Layout"); 105 106 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 107 } 108 } 109 110 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 111 { 112 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 113 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 114 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 115 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 116 string cssPosition = $"{xPos}% {yPos}%"; 117 imageParameters.Add("style", "object-position:" + cssPosition); 118 } 119 120 LinkViewModel imageLink = new LinkViewModel(); 121 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 122 { 123 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 124 } 125 126 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 127 } 128 129 130 @{ 131 string strTitle = string.Empty; 132 string strSummary = string.Empty; 133 string strImage = string.Empty; 134 string strLink = string.Empty; 135 DateTime strDate = new DateTime(); 136 137 var sliderTheme = Model.Item.GetString("SliderColorScheme"); 138 Page currentPage = PageView.Current().Page; 139 140 var queryResult = ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentPage(); 141 142 var contentType = Model.Item.GetItem("Content")?.GetString("Content"); 143 144 if (contentType == "news") 145 { 146 queryResult = ContentRelationService.Instance.GetNewsByCurrentPage(); 147 } 148 149 object pageParentPageIdValue = null; 150 151 IList<ItemViewModel> sliderItems = Model.Item?.GetItem("Content")?.GetItems("Items") ?? Enumerable.Empty<ItemViewModel>().ToList(); 152 153 // Fetch PageParentPageId from queryResult 154 if (!sliderItems.Any() && queryResult != null && queryResult.Results.Any()) 155 { 156 pageParentPageIdValue = queryResult.Results.FirstOrDefault(dict => dict.ContainsKey("PageParentPageId"))?["PageParentPageId"]; 157 } 158 159 // Fetch PageParentPageId from sliderItems if it wasn't set by queryResult 160 if (pageParentPageIdValue == null && Model.Item != null && sliderItems.Any()) 161 { 162 string linkString = sliderItems?.FirstOrDefault()?.GetString("Link"); 163 164 if (!string.IsNullOrEmpty(linkString) && int.TryParse(linkString, out int sliderItemLink)) 165 { 166 int sliderItemParentPage = Services.Pages.GetPage(sliderItemLink).ParentPageId; 167 pageParentPageIdValue = sliderItemParentPage; 168 } 169 else 170 { 171 // Handle the case where linkString is not a valid integer or is null/empty 172 pageParentPageIdValue = null; // or assign a default value or handle error 173 } 174 } 175 176 ButtonViewModel btnViewModelViewAll = new ButtonViewModel 177 { 178 Id = "pageId_", 179 Url = "/Default.aspx?ID=" + pageParentPageIdValue, 180 Text = Translate("View all"), 181 Type = ButtonType.Link, 182 DisplayType = ButtonDisplayType.Secondary 183 }; 184 } 185 186 @{ 187 bool showImageOnly = true; // Assume showImageOnly is true initially 188 189 List<FileViewModel> imageList = new List<FileViewModel>(); // List to hold images for the modal 190 191 // Check if any title exists 192 var items = sliderItems.Any() ? sliderItems.Cast<object>() : queryResult.Results.Cast<object>(); 193 194 foreach (var item in items) 195 { 196 var resultDictionary = item as Dictionary<string, object>; 197 Page page = null; 198 if (resultDictionary != null && resultDictionary.TryGetValue("PageId", out object pageIdObj)) 199 { 200 if (int.TryParse(pageIdObj.ToString(), out int resultPageId)) 201 { 202 page = Services.Pages.GetPage(resultPageId); 203 } 204 } 205 206 string title = item is ItemViewModel sliderItem 207 ? sliderItem.GetString("Title") 208 : page?.Item["Title"].ToString(); 209 210 if (!string.IsNullOrEmpty(title)) 211 { 212 showImageOnly = false; 213 break; 214 } 215 } 216 217 FileViewModel sliderImage; 218 } 219 220 @if (queryResult.Results.Any() || sliderItems.Count > 0) 221 { 222 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 223 <div class="container-xl"> 224 <div class="row justify-content-center"> 225 <div class="col-12 col-lg-10"> 226 <div class="row"> 227 <div class="col-12 col-lg-6 mb-4"> 228 @if (!string.IsNullOrEmpty(Model.Item.GetItem("Content").GetString("Title"))) 229 { 230 <h2 class="mb-0 mb-lg-5">@Model.Item.GetItem("Content").GetString("Title")</h2> 231 } 232 @if (queryResult.Results.Count > 1 || sliderItems.Count > 1) 233 { 234 <div class="d-none d-lg-flex gap-3"> 235 <button type="button" title="@Translate("Previous slide")" class="dalgas-swiper-button-prev" style="z-index:1;"> 236 <span class="visually-hidden">@Translate("Previous slide")</span> 237 </button> 238 <button type="button" title="@Translate("Next slide")" class="dalgas-swiper-button-next" style="z-index:1;"> 239 <span class="visually-hidden">@Translate("Next slide")</span> 240 </button> 241 @if (showImageOnly) 242 { 243 <button type="button" class="btn btn-link no-arrow ms-2" data-bs-toggle="modal" data-bs-target="#imageOnlyModal"> 244 @Translate("View all images", "Se alle billeder") 245 </button> 246 } 247 </div> 248 } 249 </div> 250 <div class="col-12 col-lg-6 mb-4 d-inline-flex justify-content-end align-items-end d-none d-lg-flex"> 251 252 @if (sliderItems.Any() && !showImageOnly && contentType != "manual" || queryResult.Results.Any() && !showImageOnly && contentType != "manual") 253 { 254 @RenderModel(btnViewModelViewAll) 255 } 256 </div> 257 <div class="swiper-container row" data-show-image-only="@showImageOnly.ToString().ToLower()" data-normal-slider="true" data-initialized="false"> 258 <div class="swiper-wrapper"> 259 @{ 260 string slideButtonText = Translate("View the case story"); 261 if (contentType == "news") 262 { 263 slideButtonText = Translate("Read this news", "Læs nyheden"); 264 } else if (contentType == "manual") 265 { 266 slideButtonText = Translate("Read more", "Read more"); 267 } 268 269 ButtonViewModel btnViewResult = new ButtonViewModel 270 { 271 Text = slideButtonText, 272 Type = ButtonType.Link, 273 DisplayType = ButtonDisplayType.Secondary 274 }; 275 276 foreach (var result in items.Select((item, index) => new {Item = item, Index = index + 1})) 277 { 278 strTitle = string.Empty; 279 strSummary = string.Empty; 280 strImage = string.Empty; 281 strLink = string.Empty; 282 283 if (sliderItems.Any()) 284 { 285 var sliderItem = result.Item as ItemViewModel; 286 strTitle = sliderItem.GetString("Title"); 287 strSummary = sliderItem.GetString("Summary"); 288 strImage = sliderItem.GetString("Image"); 289 strLink = sliderItem.GetString("Link"); 290 btnViewResult.Id = "pageId_" + strLink; 291 if (strLink.Contains("https")) 292 { 293 btnViewResult.Url = strLink; 294 } 295 else 296 { 297 btnViewResult.Url = "/Default.aspx?ID=" + strLink; 298 } 299 } 300 else if (queryResult.Results.Any()) 301 { 302 var resultDictionary = result.Item as Dictionary<string, object>; 303 if (resultDictionary != null && resultDictionary.TryGetValue("PageId", out var pageIdObj) && int.TryParse(pageIdObj.ToString(), out int resultPageId)) 304 { 305 Page page = Services.Pages.GetPage(resultPageId); 306 strTitle = page.Item["Title"]?.ToString(); 307 strSummary = page.Item["Summary"]?.ToString(); 308 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 309 btnViewResult.Id = "pageId_" + resultPageId; 310 btnViewResult.Url = "/Default.aspx?ID=" + resultPageId; 311 if (page.Item["Date"] != null) 312 { 313 strDate = (DateTime) page.Item["Date"]; 314 } 315 } 316 } 317 318 int jpgIndex = strImage.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase); 319 if (jpgIndex != -1) 320 { 321 strImage = strImage.Substring(0, jpgIndex + 4); 322 } 323 324 sliderImage = ViewModelFactory.CreateFieldFileValueView(strImage); 325 326 imageList.Add(sliderImage); // Add image to the list for the modal 327 328 329 <div class="swiper-slide d-flex flex-column"> 330 <div class="d-flex flex-column flex-column-reverse flex-md-row h-100"> 331 @if (showImageOnly == false) 332 { 333 <div class="col-md-6 theme @sliderTheme p-4 pt-5 p-lg-5 d-flex flex-column justify-content-between h-100"> 334 335 <div class="theme"> 336 @if (Model.Item.GetItem("Content").GetString("Content") == "news") 337 { 338 if (strDate != null) 339 { 340 var date = strDate; 341 var formattedDate = date.ToLongDateString(); 342 343 <div class="badge mb-5"> 344 @formattedDate 345 </div> 346 } 347 } 348 <h3> 349 <a class="text-decoration-none" href="@btnViewResult.Url">@strTitle</a> 350 </h3> 351 <p class="small">@strSummary</p> 352 </div> 353 <div> 354 @RenderModel(btnViewResult) 355 </div> 356 </div> 357 } 358 <div class="@(showImageOnly == false ? "col-md-6" : "col-md-12")"> 359 @if (showImageOnly) 360 { 361 <a href="#" data-bs-toggle="modal" data-bs-target="#imageOnlyModal"> 362 <figure class="ratio ratio-16x9 ratio-lg-4x3 h-100"> 363 @RenderPartial("Components/Image.cshtml", sliderImage ?? new FileViewModel()) 364 </figure> 365 </a> 366 } 367 else 368 { 369 <a href="@btnViewResult.Url"> 370 <figure class="ratio ratio-16x9 ratio-lg-4x3 h-100"> 371 @RenderPartial("Components/Image.cshtml", sliderImage ?? new FileViewModel()) 372 </figure> 373 </a> 374 } 375 </div> 376 </div> 377 <div class="d-flex pagination mt-3"> 378 @result.Index/@items.Count() 379 </div> 380 </div> 381 } 382 } 383 </div> 384 </div> 385 </div> 386 </div> 387 </div> 388 </div> 389 </section> 390 } 391 else 392 { 393 if (Pageview.IsVisualEditorMode) 394 { 395 <div class="container-xl alert alert-danger" role="alert"> 396 This <strong>@Model.Item.SystemName</strong> is empty 397 </div> 398 } 399 } 400 401 @if (showImageOnly) 402 { 403 <div class="modal fade" id="imageOnlyModal" tabindex="-1" aria-labelledby="imageOnlyModalLabel" aria-hidden="true" data-lenis-prevent> 404 <div class="modal-dialog modal-fullscreen"> 405 <div class="modal-content"> 406 <div class="modal-header"> 407 <h4 class="modal-title">@PageView.Current().Item["Title"]</h4> 408 <button type="button" class="btn" data-bs-dismiss="modal" aria-label="Close"> 409 @{ 410 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/dalgas/x.svg"; 411 412 if (!iconPath.ToLower().Contains("none") && iconPath != "") 413 { 414 <span class="icon-3 pe-none"> 415 @ReadFile(iconPath) 416 </span> 417 } 418 } 419 </button> 420 </div> 421 <div class="modal-body"> 422 <div class="masonry-container"> 423 @for (int i = 0; i < imageList.Count; i++) 424 { 425 <figure class="masonry-item"> 426 @RenderPartial("Components/Image.cshtml", imageList[i]) 427 </figure> 428 } 429 </div> 430 </div> 431 </div> 432 </div> 433 </div> 434 } 435

Økosystem-genopretning påvirker flere bundlinjer

I en moderne virksomhed er der flere bundlinjer at tage hensyn til – både den økonomiske og den miljømæssige. Det er her, E’et i ESG-rapporteringen kommer i spil, og økosystemgenopretning kan have en positiv indvirkning på denne dimension. 

Ved at engagere sig i sådanne initiativer viser virksomheden en forpligtelse til bæredygtighed, hvilket kan være fordelagtigt i forhold til interessenter, investorer og kunder, der i stigende grad vægter miljømæssig ansvarlighed. 

Proces og papirarbejde? Det klarer vi!

Vi har lang erfaring – faktisk mere end 150 år – med at arbejde i og med naturen, og vi ved, hvordan opgaven løses. Derfor kan vi hjælpe fra idé til eksekveringsfasen og drift, og du skal ikke bekymre dig om lov- og dokumentationskrav og resten af listen med formalia. Det klarer vi. 

Monitorering og dokumentation

Vi sørger i hele processen for at dokumentere vores arbejde, og hvad det betyder for naturen. Inden vi går i gang, undersøger vi, hvilke arter der findes i området, som vi kan hjælpe – eller hvilke, vi gerne vil tiltrække. Med en baseline-undersøgelse af livet i området sammenligner vi, i takt med at naturforbedringen sker. Det giver troværdig økosystemgenopretning. 

I samarbejde med eksperter og højt specialiserede virksomheder i artsregistrering monitorerer vi dyre- og planteliv på jeres arealer. På den måde sikrer vi, at du får valide data, som du kan bruge som dokumentation i jeres ESG-rapportering og branding. 

Skal vi gøre en forskel sammen?

Skab naturprojekter i samarbejde med Dalgas og sæt et positivt aftryk på biodiversiteten. Vi hjælper dig med at gøre en forskel. Kontakt os for en uforpligtende snak. 

Dine kontaktpersoner

Martin Andersen

Regionschef Afdeling: Landskab Vest Kontor: Aarhus
T. +45 51 72 43 80

Niels Olin Nygaard

Markedschef Afdeling: Strategi, ESG og Marketing Kontor: Aarhus
T. +45 23 96 00 26

Skal vi kontakte dig?

Tryk på knappen og udfyld formularen – så kontakter vi dig hurtigst muligt.
Ved indsendelse af formularen giver du samtykke til, at Hedeselskabet, CVR 42344613 og dets datterselskaber må behandle dine personoplysninger jf. Hedeselskabets privatlivspolitik.
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.GetRelatedServicesByCurrentPage(Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 304
   at CompiledRazorTemplates.Dynamic.RazorEngine_8ebd2b6da91645ad9b5e5297a8dcbe5d.Execute() in D:\solutions\dalgas-production\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Featured_Lists.cshtml:line 289
   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 bool isProductPage = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["ProductId"]); 146 string separator = Pageview.SearchFriendlyUrl.Contains("?") ? "&" : "?"; 147 string showAllUrl = $"{Pageview.SearchFriendlyUrl}{separator}PageSize=999"; 148 149 bool showAll = Model.Item.GetItem("Content").GetBoolean("ShowAll"); 150 bool showFacets = Model.Item.GetItem("Content").GetBoolean("ShowFacets"); 151 bool showSearch = Model.Item.GetItem("Content").GetBoolean("ShowSearch"); 152 bool allowAllQueryItems = showFacets || showSearch; 153 showAll = allowAllQueryItems || showAll; 154 int numberOfItemsToShow = 999; 155 int rowsPerPage = 3; 156 157 158 List<FacetOption> selectedFacetOptions = new List<FacetOption>(); 159 if (hasFeatureListItems) 160 { 161 allowAllQueryItems = false; 162 } 163 164 QueryResult queryResult = new QueryResult(); 165 string contentType = Model.Item.GetItem("Content").GetString("FeatureOptions"); 166 int totaleCount = 0; 167 168 switch (contentType) 169 { 170 case "articles": 171 numberOfItemsToShow = 4; 172 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 173 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 174 175 if (!hasFeatureListItems) 176 { 177 queryResult = showAll ? ContentRelationService.Instance.GetAllKnowledge(numberOfItemsToShow) : ContentRelationService.Instance.GetKnowledgeByCurrentPage(numberOfItemsToShow); 178 } 179 180 imageAspectRatio = "ratio-4x3"; 181 colClasslist.Add("col-md-3"); 182 break; 183 case "events": 184 numberOfItemsToShow = 3; 185 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 186 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 187 if (!hasFeatureListItems) 188 { 189 queryResult = showAll ? ContentRelationService.Instance.GetAllEvents(numberOfItemsToShow) : ContentRelationService.Instance.GetEventsByCurrentPage(numberOfItemsToShow); 190 } 191 192 imageAspectRatio = "ratio-16x9"; 193 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 194 colClasslist.Add("col-md-4 d-flex flex-column"); 195 break; 196 case "cases": 197 numberOfItemsToShow = 3; 198 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 199 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 200 if (!hasFeatureListItems) 201 { 202 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 203 { 204 queryResult = ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentFunding(numberOfItemsToShow); 205 } 206 else 207 { 208 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseCustomerStoriesByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentPage(numberOfItemsToShow); 209 } 210 } 211 212 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 213 imageAspectRatio = "ratio-16x9"; 214 colClasslist.Add("col-md-4 d-flex flex-column"); 215 break; 216 case "news": 217 numberOfItemsToShow = 3; 218 numberOfItemsToShow = showAll ? numberOfItemsToShow * (rowsPerPage * 2) : numberOfItemsToShow; 219 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 220 if (!hasFeatureListItems) 221 { 222 if (Pageview.Area.Item["Custom_Website_Styling"].ToString().Contains("shop") && string.IsNullOrEmpty(Pageview.Area.Item["NewsFromOtherSites"].ToString()) == false) 223 { 224 // Initialize the list of parameters for the content query 225 var parameters = new List<KeyValuePair<string, string>>(); 226 227 // Get the "NewsFromOtherSites" field value from the current area 228 var newsFromOtherSites = Pageview.Area.Item["NewsFromOtherSites"]?.ToString(); 229 230 // Start building the list of area IDs, including the current page's area ID 231 var areaIds = new List<string> 232 { 233 PageView.Current()?.Area?.ID.ToString() 234 }; 235 236 // If "NewsFromOtherSites" has any values, split by comma and add them to the areaIds list 237 if (!string.IsNullOrEmpty(newsFromOtherSites)) 238 { 239 areaIds.AddRange(newsFromOtherSites.Split(',').Select(x => x.Trim())); 240 } 241 242 // Create a key-value pair for the content query, joining all area IDs with a comma 243 var keyValue = new KeyValuePair<string, string>( 244 ContentKeys.DW_INDEXING_CONTENT_FIELD_AREA_IDS, 245 string.Join(", ", areaIds.Where(id => !string.IsNullOrEmpty(id))) 246 ); 247 248 // Add the key-value pair to the parameters list 249 parameters.Add(keyValue); 250 251 // Execute the query to get news items 252 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow, parameters) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow, false, parameters); 253 } 254 else 255 { 256 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow); 257 } 258 } 259 260 rowWidthClasslist.Add("col-lg-11 ms-auto"); 261 colClasslist.Add("mb-5"); 262 break; 263 case "projects": 264 numberOfItemsToShow = 3; 265 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 266 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 267 if (!hasFeatureListItems) 268 { 269 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 270 { 271 queryResult = ContentRelationService.Instance.GetCaseProjectsByCurrentFunding(numberOfItemsToShow); 272 } 273 else 274 { 275 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseProjectsByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseProjectsByCurrentPage(numberOfItemsToShow); 276 } 277 } 278 279 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 280 imageAspectRatio = "ratio-16x9"; 281 colClasslist.Add("col-md-4 d-flex flex-column"); 282 break; 283 case "related-services": 284 numberOfItemsToShow = 6; 285 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 286 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 287 if (!hasFeatureListItems) 288 { 289 queryResult = ContentRelationService.Instance.GetRelatedServicesByCurrentPage(numberOfItemsToShow); 290 } 291 292 cardClasslist.Add("theme theme-mud p-4 pt-5 h-100"); 293 imageAspectRatio = "ratio-16x9"; 294 colClasslist.Add("col-md-4 d-flex flex-column"); 295 break; 296 } 297 298 int pageNum = int.TryParse(Dynamicweb.Context.Current.Request["PageNum"], out int result) ? result : 1; 299 string searchTerm = Dynamicweb.Context.Current.Request["q"]; 300 301 List<string> pageIds = new List<string>(); 302 if (hasFeatureListItems) 303 { 304 pageIds.AddRange(featureListItems.Select(fli => fli.Fields.FirstOrDefault(f => f.Name == "Page")?.GetLink().PageId.ToString())); 305 } 306 else if (queryResult.Results.Any()) 307 { 308 pageIds.AddRange(queryResult.Results.Select(qrr => qrr["PageId"].ToString())); 309 } 310 311 string strTitle = string.Empty; 312 string strLink = string.Empty; 313 string strSummary = string.Empty; 314 string strImage = string.Empty; 315 string strType = string.Empty; 316 string badgeTheme = string.Empty; 317 DateTime strDate = new DateTime(); 318 } 319 320 @if ((queryResult.FacetGroups.Any() && allowAllQueryItems) || (queryResult.Results.Any() && !allowAllQueryItems) || featureListItems.Any()) 321 { 322 int loopCounter = 1; // Initialize loop counter for each group 323 324 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 325 <div class="container-xl"> 326 <div class="row justify-content-center"> 327 <div class="@rowWidthClasslist"> 328 <div class="js-dalgas-queryresult-container dalgas-queryresult-container" 329 id="@($"query-result-{Model.Id}")"> 330 331 @if (hasLead || hasText || hasHeading) 332 { 333 <div class="js-content-container content-container col-12 mb-3"> 334 335 <div class="col-lg-6"> 336 <span> 337 @string.Join("", headings.Select(h => h.ToString())) 338 </span> 339 340 @if (!string.IsNullOrEmpty(lead)) 341 { 342 <p class="lead">@lead</p> 343 } 344 345 @text 346 347 </div> 348 </div> 349 } 350 351 @{ 352 ButtonViewModel btnViewResult = new ButtonViewModel 353 { 354 Text = Translate("View more"), 355 Type = ButtonType.Link, 356 DisplayType = ButtonDisplayType.Link 357 }; 358 359 if (showAll) 360 { 361 totaleCount = queryResult.TotalCount; 362 } 363 364 if (!isProductPage) 365 { 366 <a href="@showAllUrl" class="d-none">show all</a> 367 } 368 369 <form method="post" action="@Pageview.SearchFriendlyUrl" 370 data-response-target-element="content" tabindex="-1" aria-hidden="false" 371 class="d-flex js-dalgas-facets-form dalgas-facets-form" 372 data-total-count="@totaleCount" data-page-size="@numberOfItemsToShow"> 373 <input type="hidden" name="LayoutTemplate" 374 value="Designs/Swift/Swift_PageClean.cshtml"/> 375 <input type="hidden" name="PageNum" value="@pageNum"/> 376 <input type="hidden" name="PageSize" value="@numberOfItemsToShow"/> 377 @if (allowAllQueryItems) 378 { 379 if (showFacets) 380 { 381 foreach (FacetGroup facetGroup in queryResult.FacetGroups) 382 { 383 foreach (Facet facet in facetGroup.Facets) 384 { 385 string showClass = " show"; 386 string ariaExpanded = "true"; 387 string facetGroupId = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", string.Empty, RegexOptions.None, TimeSpan.FromMilliseconds(5000)); 388 389 390 if (facet.Options.Any()) 391 { 392 int selectedFacetsInGroup = 0; 393 394 foreach (FacetOption option in facet.Options) 395 { 396 if (option.Selected) 397 { 398 selectedFacetsInGroup++; 399 } 400 } 401 402 string label = selectedFacetsInGroup > 0 ? Translate(facet.Name) + "<span style=\"padding: 0.3em 0.6em\" class=\"badge badge ms-2\">" + selectedFacetsInGroup + "</span>" : Translate(facet.Name); 403 404 <div class="dropdown js-facets-selector"> 405 <button class="btn dropdown-toggle" type="button" 406 id="FacetGroup_@facetGroupId" data-bs-toggle="dropdown" 407 aria-expanded="false"> 408 @label 409 </button> 410 <div data-lenis-prevent class="dropdown-menu p-3" 411 aria-labelledby="FacetGroup_@facetGroupId" 412 style="min-width: 280px"> 413 @foreach (FacetOption facetOption in facet.Options.OrderBy(fo => fo.Label)) 414 { 415 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 416 string disabled = facetOption.Count <= 0 ? "disabled" : string.Empty; 417 string selected = facetOption.Selected ? "checked" : string.Empty; 418 string facetValue = Uri.UnescapeDataString(facetOption.Value); 419 string optionValue = $"[{facetValue}]"; 420 421 facetLabel = facetLabel.ToLower() == "true" ? facetLabel = Translate("Yes") : facetLabel; 422 facetLabel = facetLabel.ToLower() == "false" ? facetLabel = Translate("No") : facetLabel; 423 424 <label class="form-check mt-1" @disabled> 425 <input type="checkbox" 426 onclick="custom.QueryResult.update(event)" 427 class="form-check-input" 428 name="@facet.QueryParameter" 429 value="@optionValue" 430 data-filter-value="@facetLabel" @selected> 431 <span 432 class="form-check-label d-flex align-items-center"> 433 <span class="flex-fill">@facetLabel </span> 434 <small 435 class="opacity-85">@facetOption.Count</small> 436 </span> 437 </label> 438 439 if (facetOption.Selected) 440 { 441 FacetOption selectFacetOption = facetOption; 442 selectFacetOption.Name = facet.QueryParameter; 443 selectedFacetOptions.Add(selectFacetOption); 444 } 445 } 446 </div> 447 </div> 448 } 449 } 450 } 451 452 if (!string.IsNullOrEmpty(searchTerm)) 453 { 454 selectedFacetOptions.Add(new FacetOption() 455 { 456 Count = 1, 457 Label = searchTerm, 458 Name = "q", 459 Selected = true, 460 Value = searchTerm 461 }); 462 } 463 } 464 465 if (showSearch) 466 { 467 <div class="type-ahead-dropdown"> 468 <div class="position-relative suggest-form"> 469 <span 470 class="position-absolute top-0 end-0 icon-3 px-3 d-flex align-items-center h-100 search-icon"> 471 @ReadFile(iconPath + "search.svg") 472 </span> 473 474 <input id="searchField_@Model.Id" 475 class="form-control custom-header-searchbar js-custom-facets-search-field pe-5 ps-3 js-" 476 type="search" 477 placeholder="@Translate("Search here")" 478 autocomplete="off" 479 maxlength="255" 480 name="q" 481 value="@searchTerm" 482 data-original="@searchTerm"> 483 484 <button type="button" 485 onclick="custom.QueryResult.clearSearchField(event)" 486 class="btn h-100 icon-2 reset-search" 487 aria-label="@Translate("Clear search")" 488 style="opacity: 0; position: absolute; top: 0; right: 0; visibility: hidden;"> 489 @ReadFile(iconPath + "x.svg") 490 </button> 491 </div> 492 </div> 493 <input type="submit" onclick="custom.QueryResult.update(event)" 494 class="btn btn-primary" value="@Translate("Search", "Search")"> 495 } 496 } 497 </form> 498 499 if (showFacets && selectedFacetOptions.Any()) 500 { 501 <div 502 class="js-dalgas-queryresult-selectedfacets-container dalgas-queryresult-selectedfacets-container mt-3"> 503 @foreach (FacetOption facetOption in selectedFacetOptions) 504 { 505 string facetValue = Uri.UnescapeDataString(facetOption.Value); 506 string optionValue = $"[{facetValue}]"; 507 <input class="visually-hidden" 508 id="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)" 509 name="@facetOption.Name" 510 onclick="custom.QueryResult.deselectFacetOption(event)" type="checkbox" 511 value="@optionValue" title="@facetOption.Label" checked> 512 <label class="badge theme border border-dark text-nowrap" 513 for="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)"> 514 <span class="text-nowrap">@(facetOption.Label)</span> 515 <span class="icon-2 ms-2"> 516 @ReadFile(iconPath + "x.svg") 517 </span> 518 </label> 519 } 520 521 @if (selectedFacetOptions.Count >= 3) 522 { 523 <input class="visually-hidden" id="ClearAll" name="ClearAll" 524 onclick="custom.QueryResult.clearAll(event)" type="checkbox" value="" 525 title="" checked> 526 <label class="badge theme border border-dark dalgas-btn-clear-all" 527 for="ClearAll"> 528 <span class="text-nowrap">@Translate("Clear all")</span> 529 <span class="icon-2 ms-2"> 530 @ReadFile(iconPath + "x.svg") 531 </span> 532 </label> 533 } 534 </div> 535 }} 536 537 @if (pageIds.Any() == false) 538 { 539 <div class="mt-4">@Translate("Your search returned no results...")</div> 540 } 541 542 <div 543 class="row @(!showAll ? "dalgas-featured-list-mobile-horizontal-scroll" : "mt-5") js-dalgas-queryresult-itemlist dalgas-queryresult-itemlist mt-2"> 544 @foreach (string pageId in pageIds) 545 { 546 if (!int.TryParse(pageId, out int intPageId)) 547 { 548 continue; 549 } 550 551 Page page = Services.Pages.GetPage(intPageId); 552 553 if (page == null) 554 { 555 continue; 556 } 557 558 @* Renders articles from another website language *@ 559 560 string resolvedPageId = pageId; 561 if (PageView.Current().Page.AreaId != page.AreaId) 562 { 563 resolvedPageId = GetPageIdByNavigationTag("ArticlePageFromOtherSite") + "&render-article-id=" + pageId; 564 } 565 566 string articleUrl = SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + resolvedPageId); 567 568 strTitle = page.Item["Title"]?.ToString(); 569 strSummary = page.Item["Summary"]?.ToString(); 570 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 571 btnViewResult.Id = "pageId_" + page.ID; 572 btnViewResult.Url = !string.IsNullOrEmpty(articleUrl) ? articleUrl : "/Default.aspx?ID=" + resolvedPageId; 573 if (page.Item["Date"] != null) 574 { 575 strDate = (DateTime) page.Item["Date"]; 576 } 577 578 int jpgIndex = strImage.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase); 579 if (jpgIndex != -1) 580 { 581 strImage = strImage.Substring(0, jpgIndex + 4); 582 } 583 584 featuredListImage = ViewModelFactory.CreateFieldFileValueView(strImage); 585 imageList.Add(featuredListImage); 586 587 if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 588 { 589 badgeTheme = ""; 590 if (loopCounter % 6 == 2 || loopCounter % 6 == 4) 591 { 592 newsModolusClasslist = "col-lg-5"; 593 imageAspectRatio = "ratio-16x9"; 594 if (showAll) 595 { 596 imageAspectRatio = "ratio-3x4 ratio-custom-news"; 597 } 598 } 599 else 600 { 601 newsModolusClasslist = "col-lg-3"; 602 imageAspectRatio = "ratio-16x9 ratio-lg-3x4"; 603 if (showAll) 604 { 605 imageAspectRatio = "ratio-3x4"; 606 } 607 } 608 609 loopCounter++; 610 } 611 612 613 <div class="@colClasslist @newsModolusClasslist"> 614 615 @if (!string.IsNullOrEmpty(featuredListImage.Path)) 616 { 617 <a href="@btnViewResult.Url"> 618 <figure class="ratio @imageAspectRatio mb-0"> 619 @RenderPartial("Components/Image.cshtml", featuredListImage ?? new FileViewModel()) 620 </figure> 621 </a> 622 } 623 624 <div class="@cardClasslist"> 625 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events") 626 { 627 badgeTheme = "mb-5"; 628 } 629 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 630 { 631 if (strDate != null) 632 { 633 var date = strDate; 634 var formattedDate = date.ToLongDateString(); 635 if (date.TimeOfDay.ToString() != "00:00:00") 636 { 637 formattedDate = formattedDate + " - " + date.ToShortTimeString(); 638 } 639 640 <div class="badge mb-3 @badgeTheme"> 641 @formattedDate 642 </div> 643 } 644 } 645 646 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "cases" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "projects") 647 { 648 var selectedValues = page.Item["Type"].ToString(); 649 <div class="badge mb-5 mr-3 @badgeTheme"> 650 @ContentService.Instance.GetLabelForCaseType(selectedValues) 651 </div> 652 } 653 654 @{ 655 var badgeParms = new Dictionary<string, object>(); 656 badgeParms.Add("pageId", page.ID); 657 } 658 @RenderPartial("UserInterfaceModels/badge.cshtml", Model, badgeParms) 659 660 <h4> 661 <a href="@btnViewResult.Url" class="text-decoration-none"> 662 @strTitle 663 </a> 664 </h4> 665 @if (strSummary != null) 666 { 667 <span class="small">@strSummary</span> 668 } 669 670 <div class="mt-2"> 671 @RenderModel(btnViewResult) 672 </div> 673 </div> 674 </div> 675 } 676 </div> 677 678 @if (showAll && totaleCount > numberOfItemsToShow) 679 { 680 <div class="row"> 681 <div class="col-12 text-center"> 682 <button onclick="custom.QueryResult.getNextPage(event)" 683 class="btn btn-primary">@Translate("Vis flere")</button> 684 </div> 685 </div> 686 } 687 688 @if (hasButton) 689 { 690 <div class="js-content-container content-container col-12"> 691 692 <div class="d-flex flex-wrap gap-3"> 693 @foreach (ButtonViewModel button in buttons) 694 { 695 @button 696 } 697 </div> 698 699 </div> 700 } 701 702 </div> 703 </div> 704 </div> 705 </div> 706 @if (enableFifthElement) 707 { 708 <div class="fifth-element-section-container"> 709 <div class="fifth-element size-2 bottom-0 ob-50 right-0 @fifthElementTheme"> 710 @ReadFile(fifthElementIconPath + "sun.svg") 711 </div> 712 </div> 713 } 714 </section> 715 } 716 else 717 { 718 if (Pageview.IsVisualEditorMode) 719 { 720 <div class="container-xl alert alert-danger" role="alert"> 721 This <strong>@Model.Item.SystemName</strong> is empty 722 </div> 723 } 724 } 725

Sådan arbejder vi med naturbaserede løsninger

End-to-end løsninger til din ESG-strategi

Vores Naturbaserede Løsninger genopretter økosystemer og fremmer bæredygtighed gennem innovative handlinger. Vi udvikler skræddersyede projekter, der gavner miljøet og bidrager til din virksomheds ESG-strategi.

Med en komplet service - helt fra rådgivning til implementering og monitorering sikrer vi, at projekterne er baseret på nyeste viden og bedste praksis. Vi hjælper med at realisere ambitiøse økosystemgenopretningsprojekter, sikre compliance og skabe synlige resultater, der styrker jeres ESG-profil og brand.

Sådan arbejder vi med biodiversitet

En digital og databaseret tilgang

Hos Dalgas skaber vi levesteder, hvor forskellige arter kan trives og bidrage til et sundt og robust økosystem. Et mangfoldigt økosystem, der fremmer både naturens og menneskers trivsel. 

Vi kombinerer data, videnskabelig viden og praktisk erfaring for at sikre, at dit biodiversitetsprojekt har en positiv og varig effekt i naturen. Derfor er dokumentation og monitorering helt centrale elementer i vores arbejde. Og så kan du bruge dataene i din ESG-rapportering.

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 745
   at CompiledRazorTemplates.Dynamic.RazorEngine_8ebd2b6da91645ad9b5e5297a8dcbe5d.Execute() in D:\solutions\dalgas-production\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Featured_Lists.cshtml:line 177
   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 bool isProductPage = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["ProductId"]); 146 string separator = Pageview.SearchFriendlyUrl.Contains("?") ? "&" : "?"; 147 string showAllUrl = $"{Pageview.SearchFriendlyUrl}{separator}PageSize=999"; 148 149 bool showAll = Model.Item.GetItem("Content").GetBoolean("ShowAll"); 150 bool showFacets = Model.Item.GetItem("Content").GetBoolean("ShowFacets"); 151 bool showSearch = Model.Item.GetItem("Content").GetBoolean("ShowSearch"); 152 bool allowAllQueryItems = showFacets || showSearch; 153 showAll = allowAllQueryItems || showAll; 154 int numberOfItemsToShow = 999; 155 int rowsPerPage = 3; 156 157 158 List<FacetOption> selectedFacetOptions = new List<FacetOption>(); 159 if (hasFeatureListItems) 160 { 161 allowAllQueryItems = false; 162 } 163 164 QueryResult queryResult = new QueryResult(); 165 string contentType = Model.Item.GetItem("Content").GetString("FeatureOptions"); 166 int totaleCount = 0; 167 168 switch (contentType) 169 { 170 case "articles": 171 numberOfItemsToShow = 4; 172 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 173 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 174 175 if (!hasFeatureListItems) 176 { 177 queryResult = showAll ? ContentRelationService.Instance.GetAllKnowledge(numberOfItemsToShow) : ContentRelationService.Instance.GetKnowledgeByCurrentPage(numberOfItemsToShow); 178 } 179 180 imageAspectRatio = "ratio-4x3"; 181 colClasslist.Add("col-md-3"); 182 break; 183 case "events": 184 numberOfItemsToShow = 3; 185 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 186 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 187 if (!hasFeatureListItems) 188 { 189 queryResult = showAll ? ContentRelationService.Instance.GetAllEvents(numberOfItemsToShow) : ContentRelationService.Instance.GetEventsByCurrentPage(numberOfItemsToShow); 190 } 191 192 imageAspectRatio = "ratio-16x9"; 193 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 194 colClasslist.Add("col-md-4 d-flex flex-column"); 195 break; 196 case "cases": 197 numberOfItemsToShow = 3; 198 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 199 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 200 if (!hasFeatureListItems) 201 { 202 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 203 { 204 queryResult = ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentFunding(numberOfItemsToShow); 205 } 206 else 207 { 208 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseCustomerStoriesByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseCustomerStoriesByCurrentPage(numberOfItemsToShow); 209 } 210 } 211 212 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 213 imageAspectRatio = "ratio-16x9"; 214 colClasslist.Add("col-md-4 d-flex flex-column"); 215 break; 216 case "news": 217 numberOfItemsToShow = 3; 218 numberOfItemsToShow = showAll ? numberOfItemsToShow * (rowsPerPage * 2) : numberOfItemsToShow; 219 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 220 if (!hasFeatureListItems) 221 { 222 if (Pageview.Area.Item["Custom_Website_Styling"].ToString().Contains("shop") && string.IsNullOrEmpty(Pageview.Area.Item["NewsFromOtherSites"].ToString()) == false) 223 { 224 // Initialize the list of parameters for the content query 225 var parameters = new List<KeyValuePair<string, string>>(); 226 227 // Get the "NewsFromOtherSites" field value from the current area 228 var newsFromOtherSites = Pageview.Area.Item["NewsFromOtherSites"]?.ToString(); 229 230 // Start building the list of area IDs, including the current page's area ID 231 var areaIds = new List<string> 232 { 233 PageView.Current()?.Area?.ID.ToString() 234 }; 235 236 // If "NewsFromOtherSites" has any values, split by comma and add them to the areaIds list 237 if (!string.IsNullOrEmpty(newsFromOtherSites)) 238 { 239 areaIds.AddRange(newsFromOtherSites.Split(',').Select(x => x.Trim())); 240 } 241 242 // Create a key-value pair for the content query, joining all area IDs with a comma 243 var keyValue = new KeyValuePair<string, string>( 244 ContentKeys.DW_INDEXING_CONTENT_FIELD_AREA_IDS, 245 string.Join(", ", areaIds.Where(id => !string.IsNullOrEmpty(id))) 246 ); 247 248 // Add the key-value pair to the parameters list 249 parameters.Add(keyValue); 250 251 // Execute the query to get news items 252 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow, parameters) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow, false, parameters); 253 } 254 else 255 { 256 queryResult = showAll ? ContentRelationService.Instance.GetAllNews(numberOfItemsToShow) : ContentRelationService.Instance.GetNewsByCurrentPage(numberOfItemsToShow); 257 } 258 } 259 260 rowWidthClasslist.Add("col-lg-11 ms-auto"); 261 colClasslist.Add("mb-5"); 262 break; 263 case "projects": 264 numberOfItemsToShow = 3; 265 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 266 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 267 if (!hasFeatureListItems) 268 { 269 if (PageView.Current().Page.Item.SystemName.Contains("Funding")) 270 { 271 queryResult = ContentRelationService.Instance.GetCaseProjectsByCurrentFunding(numberOfItemsToShow); 272 } 273 else 274 { 275 queryResult = showAll ? ContentRelationService.Instance.GetAllCaseProjectsByCurrentPage(numberOfItemsToShow) : ContentRelationService.Instance.GetCaseProjectsByCurrentPage(numberOfItemsToShow); 276 } 277 } 278 279 cardClasslist.Add("theme theme-mud p-4 pt-4 h-100"); 280 imageAspectRatio = "ratio-16x9"; 281 colClasslist.Add("col-md-4 d-flex flex-column"); 282 break; 283 case "related-services": 284 numberOfItemsToShow = 6; 285 numberOfItemsToShow = showAll ? numberOfItemsToShow * rowsPerPage : numberOfItemsToShow; 286 numberOfItemsToShow = pageSize > 0 ? pageSize : numberOfItemsToShow; 287 if (!hasFeatureListItems) 288 { 289 queryResult = ContentRelationService.Instance.GetRelatedServicesByCurrentPage(numberOfItemsToShow); 290 } 291 292 cardClasslist.Add("theme theme-mud p-4 pt-5 h-100"); 293 imageAspectRatio = "ratio-16x9"; 294 colClasslist.Add("col-md-4 d-flex flex-column"); 295 break; 296 } 297 298 int pageNum = int.TryParse(Dynamicweb.Context.Current.Request["PageNum"], out int result) ? result : 1; 299 string searchTerm = Dynamicweb.Context.Current.Request["q"]; 300 301 List<string> pageIds = new List<string>(); 302 if (hasFeatureListItems) 303 { 304 pageIds.AddRange(featureListItems.Select(fli => fli.Fields.FirstOrDefault(f => f.Name == "Page")?.GetLink().PageId.ToString())); 305 } 306 else if (queryResult.Results.Any()) 307 { 308 pageIds.AddRange(queryResult.Results.Select(qrr => qrr["PageId"].ToString())); 309 } 310 311 string strTitle = string.Empty; 312 string strLink = string.Empty; 313 string strSummary = string.Empty; 314 string strImage = string.Empty; 315 string strType = string.Empty; 316 string badgeTheme = string.Empty; 317 DateTime strDate = new DateTime(); 318 } 319 320 @if ((queryResult.FacetGroups.Any() && allowAllQueryItems) || (queryResult.Results.Any() && !allowAllQueryItems) || featureListItems.Any()) 321 { 322 int loopCounter = 1; // Initialize loop counter for each group 323 324 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 325 <div class="container-xl"> 326 <div class="row justify-content-center"> 327 <div class="@rowWidthClasslist"> 328 <div class="js-dalgas-queryresult-container dalgas-queryresult-container" 329 id="@($"query-result-{Model.Id}")"> 330 331 @if (hasLead || hasText || hasHeading) 332 { 333 <div class="js-content-container content-container col-12 mb-3"> 334 335 <div class="col-lg-6"> 336 <span> 337 @string.Join("", headings.Select(h => h.ToString())) 338 </span> 339 340 @if (!string.IsNullOrEmpty(lead)) 341 { 342 <p class="lead">@lead</p> 343 } 344 345 @text 346 347 </div> 348 </div> 349 } 350 351 @{ 352 ButtonViewModel btnViewResult = new ButtonViewModel 353 { 354 Text = Translate("View more"), 355 Type = ButtonType.Link, 356 DisplayType = ButtonDisplayType.Link 357 }; 358 359 if (showAll) 360 { 361 totaleCount = queryResult.TotalCount; 362 } 363 364 if (!isProductPage) 365 { 366 <a href="@showAllUrl" class="d-none">show all</a> 367 } 368 369 <form method="post" action="@Pageview.SearchFriendlyUrl" 370 data-response-target-element="content" tabindex="-1" aria-hidden="false" 371 class="d-flex js-dalgas-facets-form dalgas-facets-form" 372 data-total-count="@totaleCount" data-page-size="@numberOfItemsToShow"> 373 <input type="hidden" name="LayoutTemplate" 374 value="Designs/Swift/Swift_PageClean.cshtml"/> 375 <input type="hidden" name="PageNum" value="@pageNum"/> 376 <input type="hidden" name="PageSize" value="@numberOfItemsToShow"/> 377 @if (allowAllQueryItems) 378 { 379 if (showFacets) 380 { 381 foreach (FacetGroup facetGroup in queryResult.FacetGroups) 382 { 383 foreach (Facet facet in facetGroup.Facets) 384 { 385 string showClass = " show"; 386 string ariaExpanded = "true"; 387 string facetGroupId = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", string.Empty, RegexOptions.None, TimeSpan.FromMilliseconds(5000)); 388 389 390 if (facet.Options.Any()) 391 { 392 int selectedFacetsInGroup = 0; 393 394 foreach (FacetOption option in facet.Options) 395 { 396 if (option.Selected) 397 { 398 selectedFacetsInGroup++; 399 } 400 } 401 402 string label = selectedFacetsInGroup > 0 ? Translate(facet.Name) + "<span style=\"padding: 0.3em 0.6em\" class=\"badge badge ms-2\">" + selectedFacetsInGroup + "</span>" : Translate(facet.Name); 403 404 <div class="dropdown js-facets-selector"> 405 <button class="btn dropdown-toggle" type="button" 406 id="FacetGroup_@facetGroupId" data-bs-toggle="dropdown" 407 aria-expanded="false"> 408 @label 409 </button> 410 <div data-lenis-prevent class="dropdown-menu p-3" 411 aria-labelledby="FacetGroup_@facetGroupId" 412 style="min-width: 280px"> 413 @foreach (FacetOption facetOption in facet.Options.OrderBy(fo => fo.Label)) 414 { 415 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 416 string disabled = facetOption.Count <= 0 ? "disabled" : string.Empty; 417 string selected = facetOption.Selected ? "checked" : string.Empty; 418 string facetValue = Uri.UnescapeDataString(facetOption.Value); 419 string optionValue = $"[{facetValue}]"; 420 421 facetLabel = facetLabel.ToLower() == "true" ? facetLabel = Translate("Yes") : facetLabel; 422 facetLabel = facetLabel.ToLower() == "false" ? facetLabel = Translate("No") : facetLabel; 423 424 <label class="form-check mt-1" @disabled> 425 <input type="checkbox" 426 onclick="custom.QueryResult.update(event)" 427 class="form-check-input" 428 name="@facet.QueryParameter" 429 value="@optionValue" 430 data-filter-value="@facetLabel" @selected> 431 <span 432 class="form-check-label d-flex align-items-center"> 433 <span class="flex-fill">@facetLabel </span> 434 <small 435 class="opacity-85">@facetOption.Count</small> 436 </span> 437 </label> 438 439 if (facetOption.Selected) 440 { 441 FacetOption selectFacetOption = facetOption; 442 selectFacetOption.Name = facet.QueryParameter; 443 selectedFacetOptions.Add(selectFacetOption); 444 } 445 } 446 </div> 447 </div> 448 } 449 } 450 } 451 452 if (!string.IsNullOrEmpty(searchTerm)) 453 { 454 selectedFacetOptions.Add(new FacetOption() 455 { 456 Count = 1, 457 Label = searchTerm, 458 Name = "q", 459 Selected = true, 460 Value = searchTerm 461 }); 462 } 463 } 464 465 if (showSearch) 466 { 467 <div class="type-ahead-dropdown"> 468 <div class="position-relative suggest-form"> 469 <span 470 class="position-absolute top-0 end-0 icon-3 px-3 d-flex align-items-center h-100 search-icon"> 471 @ReadFile(iconPath + "search.svg") 472 </span> 473 474 <input id="searchField_@Model.Id" 475 class="form-control custom-header-searchbar js-custom-facets-search-field pe-5 ps-3 js-" 476 type="search" 477 placeholder="@Translate("Search here")" 478 autocomplete="off" 479 maxlength="255" 480 name="q" 481 value="@searchTerm" 482 data-original="@searchTerm"> 483 484 <button type="button" 485 onclick="custom.QueryResult.clearSearchField(event)" 486 class="btn h-100 icon-2 reset-search" 487 aria-label="@Translate("Clear search")" 488 style="opacity: 0; position: absolute; top: 0; right: 0; visibility: hidden;"> 489 @ReadFile(iconPath + "x.svg") 490 </button> 491 </div> 492 </div> 493 <input type="submit" onclick="custom.QueryResult.update(event)" 494 class="btn btn-primary" value="@Translate("Search", "Search")"> 495 } 496 } 497 </form> 498 499 if (showFacets && selectedFacetOptions.Any()) 500 { 501 <div 502 class="js-dalgas-queryresult-selectedfacets-container dalgas-queryresult-selectedfacets-container mt-3"> 503 @foreach (FacetOption facetOption in selectedFacetOptions) 504 { 505 string facetValue = Uri.UnescapeDataString(facetOption.Value); 506 string optionValue = $"[{facetValue}]"; 507 <input class="visually-hidden" 508 id="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)" 509 name="@facetOption.Name" 510 onclick="custom.QueryResult.deselectFacetOption(event)" type="checkbox" 511 value="@optionValue" title="@facetOption.Label" checked> 512 <label class="badge theme border border-dark text-nowrap" 513 for="Selected_@(Model.Id)_@facetOption.Value.Replace("#", string.Empty)"> 514 <span class="text-nowrap">@(facetOption.Label)</span> 515 <span class="icon-2 ms-2"> 516 @ReadFile(iconPath + "x.svg") 517 </span> 518 </label> 519 } 520 521 @if (selectedFacetOptions.Count >= 3) 522 { 523 <input class="visually-hidden" id="ClearAll" name="ClearAll" 524 onclick="custom.QueryResult.clearAll(event)" type="checkbox" value="" 525 title="" checked> 526 <label class="badge theme border border-dark dalgas-btn-clear-all" 527 for="ClearAll"> 528 <span class="text-nowrap">@Translate("Clear all")</span> 529 <span class="icon-2 ms-2"> 530 @ReadFile(iconPath + "x.svg") 531 </span> 532 </label> 533 } 534 </div> 535 }} 536 537 @if (pageIds.Any() == false) 538 { 539 <div class="mt-4">@Translate("Your search returned no results...")</div> 540 } 541 542 <div 543 class="row @(!showAll ? "dalgas-featured-list-mobile-horizontal-scroll" : "mt-5") js-dalgas-queryresult-itemlist dalgas-queryresult-itemlist mt-2"> 544 @foreach (string pageId in pageIds) 545 { 546 if (!int.TryParse(pageId, out int intPageId)) 547 { 548 continue; 549 } 550 551 Page page = Services.Pages.GetPage(intPageId); 552 553 if (page == null) 554 { 555 continue; 556 } 557 558 @* Renders articles from another website language *@ 559 560 string resolvedPageId = pageId; 561 if (PageView.Current().Page.AreaId != page.AreaId) 562 { 563 resolvedPageId = GetPageIdByNavigationTag("ArticlePageFromOtherSite") + "&render-article-id=" + pageId; 564 } 565 566 string articleUrl = SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + resolvedPageId); 567 568 strTitle = page.Item["Title"]?.ToString(); 569 strSummary = page.Item["Summary"]?.ToString(); 570 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 571 btnViewResult.Id = "pageId_" + page.ID; 572 btnViewResult.Url = !string.IsNullOrEmpty(articleUrl) ? articleUrl : "/Default.aspx?ID=" + resolvedPageId; 573 if (page.Item["Date"] != null) 574 { 575 strDate = (DateTime) page.Item["Date"]; 576 } 577 578 int jpgIndex = strImage.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase); 579 if (jpgIndex != -1) 580 { 581 strImage = strImage.Substring(0, jpgIndex + 4); 582 } 583 584 featuredListImage = ViewModelFactory.CreateFieldFileValueView(strImage); 585 imageList.Add(featuredListImage); 586 587 if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 588 { 589 badgeTheme = ""; 590 if (loopCounter % 6 == 2 || loopCounter % 6 == 4) 591 { 592 newsModolusClasslist = "col-lg-5"; 593 imageAspectRatio = "ratio-16x9"; 594 if (showAll) 595 { 596 imageAspectRatio = "ratio-3x4 ratio-custom-news"; 597 } 598 } 599 else 600 { 601 newsModolusClasslist = "col-lg-3"; 602 imageAspectRatio = "ratio-16x9 ratio-lg-3x4"; 603 if (showAll) 604 { 605 imageAspectRatio = "ratio-3x4"; 606 } 607 } 608 609 loopCounter++; 610 } 611 612 613 <div class="@colClasslist @newsModolusClasslist"> 614 615 @if (!string.IsNullOrEmpty(featuredListImage.Path)) 616 { 617 <a href="@btnViewResult.Url"> 618 <figure class="ratio @imageAspectRatio mb-0"> 619 @RenderPartial("Components/Image.cshtml", featuredListImage ?? new FileViewModel()) 620 </figure> 621 </a> 622 } 623 624 <div class="@cardClasslist"> 625 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events") 626 { 627 badgeTheme = "mb-5"; 628 } 629 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "events" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "news") 630 { 631 if (strDate != null) 632 { 633 var date = strDate; 634 var formattedDate = date.ToLongDateString(); 635 if (date.TimeOfDay.ToString() != "00:00:00") 636 { 637 formattedDate = formattedDate + " - " + date.ToShortTimeString(); 638 } 639 640 <div class="badge mb-3 @badgeTheme"> 641 @formattedDate 642 </div> 643 } 644 } 645 646 @if (Model.Item.GetItem("Content").GetString("FeatureOptions") == "cases" || Model.Item.GetItem("Content").GetString("FeatureOptions") == "projects") 647 { 648 var selectedValues = page.Item["Type"].ToString(); 649 <div class="badge mb-5 mr-3 @badgeTheme"> 650 @ContentService.Instance.GetLabelForCaseType(selectedValues) 651 </div> 652 } 653 654 @{ 655 var badgeParms = new Dictionary<string, object>(); 656 badgeParms.Add("pageId", page.ID); 657 } 658 @RenderPartial("UserInterfaceModels/badge.cshtml", Model, badgeParms) 659 660 <h4> 661 <a href="@btnViewResult.Url" class="text-decoration-none"> 662 @strTitle 663 </a> 664 </h4> 665 @if (strSummary != null) 666 { 667 <span class="small">@strSummary</span> 668 } 669 670 <div class="mt-2"> 671 @RenderModel(btnViewResult) 672 </div> 673 </div> 674 </div> 675 } 676 </div> 677 678 @if (showAll && totaleCount > numberOfItemsToShow) 679 { 680 <div class="row"> 681 <div class="col-12 text-center"> 682 <button onclick="custom.QueryResult.getNextPage(event)" 683 class="btn btn-primary">@Translate("Vis flere")</button> 684 </div> 685 </div> 686 } 687 688 @if (hasButton) 689 { 690 <div class="js-content-container content-container col-12"> 691 692 <div class="d-flex flex-wrap gap-3"> 693 @foreach (ButtonViewModel button in buttons) 694 { 695 @button 696 } 697 </div> 698 699 </div> 700 } 701 702 </div> 703 </div> 704 </div> 705 </div> 706 @if (enableFifthElement) 707 { 708 <div class="fifth-element-section-container"> 709 <div class="fifth-element size-2 bottom-0 ob-50 right-0 @fifthElementTheme"> 710 @ReadFile(fifthElementIconPath + "sun.svg") 711 </div> 712 </div> 713 } 714 </section> 715 } 716 else 717 { 718 if (Pageview.IsVisualEditorMode) 719 { 720 <div class="container-xl alert alert-danger" role="alert"> 721 This <strong>@Model.Item.SystemName</strong> is empty 722 </div> 723 } 724 } 725

Vi skaber værdi for din branche

Dalgas løser alle typer grønne opgaver i en række forskellige brancher og sektorer på tværs af ydelser. Vi har erfaringen, maskinparken og referencerne, der sikrer dig den bedst mulige løsning.

No products in cart