Karriere i Dalgas
I Dalgas arbejder vi med naturen i en international virksomhed med 700+ kolleger. Hos os får du et arbejdsliv i frihed. Hvor du kan bruge din faglighed og vokse i takt med dine ønsker. Friheden til at forme. Naturen til at gro.
Typer af jobs
Anlægsgartner
Er du uddannet anlægsgartner? Eller elsker du bare at arbejde i det grønne? Betyder sammenholdet med dine kolleger meget for dig? Og drømmer du om fleksibilitet – både i forhold til opgaveløsning og privatliv? Måske er der plads til dig hos Dalgas.
Driftsleder
Vil du have mulighed for at sætte et aftryk til lands, til vands og i fremtiden? Som driftsleder spiller du en central rolle i vores projekter. Og så er du en del af et stærkt, fagligt fællesskab præget af respekt og fleksibilitet.
Projektleder
Vær med til at lede og koordinere vores team, så vi kan levere høj kvalitet og gode løsninger til vores kunder. Din rolle som projektleder er afgørende for at drive projekter fremad. Men du er også med til at opfylde vores vision om en bæredygtig fremtid.
Vores arbejdsplads
Måske du drømmer om fede projekter, ledelse og ansvar. Måske savner du godt kollegaskab og et sundt arbejdsmiljø. Uanset hvad, får du dygtige, erfarne kolleger med rødderne solidt plantet i en uhøjtidelig kultur og uformel omgangstone.
Det kan du arbejde med
Skove & træer
Som plantningskonsulenter rejser vi skov og som skovfogeder drifter vi den ansvarligt. Vi opmåler råtræ med egne, digitale værktøjer og sælger det både lokalt og internationalt. Og så dyrker og plejer vi frøene til fremtidens skove.
Landskab & hav
Naturen er under pres. Heldigvis kan vi sammen gøre noget ved det. Som en del af Dalgas kan du hjælpe med naturpleje, klimatilpasning og naturgenopretning i det åbne landskab, ved kysterne og i havet. Til gavn for planter, dyreliv og mennesker.
By & udemiljø
Elsker du også når byen summer? Det gør vi. Derfor etablerer vi grønne anlæg og skaber rekreative åndehuller i byrummet hos virksomheder, kommuner, boligselskaber og offentlige myndigheder. Til gavn for mennesker og for biodiversiteten.
ESG, klima & biodiversitet
Lad os sige det, som det er. Vi er i en biodiversitetskrise, og den skal løses. Derfor rådgiver vores specialiserede medarbejdere om fremtidens naturbaserede løsninger. Og bagefter gør vi dem til virkelighed.
Genanvendelse & energi
Vi ved at grønne fremskridt har flere nuancer end sort og hvid. Derfor må vi benytte og beskytte naturen. Med fokus på balance mellem produktivitet og biodiversitet. Klimasikring og økonomiske resultater.
Administration
Med en anerkendende tilgang til vores forskellige styrker og fagligheder, arbejder vi i Dalgas tæt sammen på tværs. Fra økonomi til marketing. For hos os er det den fælles indsats, der gør, at vi kan gøre en positiv forskel for naturen.
Et engageret fællesskab
Gennem personaleforeninger og fælles arrangementer bygger vi en stærk kultur, hvor du bliver en del af et engageret fællesskab.
Med både små og store events i løbet af året er der plads til alle. Events arrangeret lokalt på din arbejdsplads - eller på tværs af hele forretningen. Hos Dalgas er det fællesskabet der gør forskellen.
Tæt på naturen – tæt på dig
Med 700+ medarbejdere og mere end 20 lokationer arbejder vi på tværs af forretningen og på tværs af Europa på syv forskellige markeder. Vi krydser grænser – geografisk og fagligt – fordi vi tror på, at de bedste løsninger opstår i mødet mellem mennesker, perspektiver og erfaringer. Derfor har vi også en lokation tæt på dig. Så du kan skabe balance mellem arbejdsliv og privatliv.
Det grønne arbejde har flere nuancer end sort og hvid
Vi favner bredt. Men vores arbejde peger i den samme retning. Vi bygger en bæredygtig fremtid – med naturen som partner.
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
Tilmeld jobagent
Vores jobagent gør det nemt for dig at holde øje med de nyeste ledige stillinger. Tilmeld dig vores jobagent og få de bedste jobmuligheder direkte i din indbakke!
Praktikanter, elever og lærlinge
Praktikanter
Bliv praktikant hos Dalgas og få styrket dine faglige og praktiske færdigheder. Du får et spændende praktikforløb på tværs af fagområder, hvor vi sætter fokus på naturværdier for mennesker, miljø og klima. Fra talent til ekspert på Den Grønne Gren.
Elever og lærlinge
Drømmer du om at blive en del af noget større? Og være med til at gøre en forskel for naturen? Som elev eller lærling i Dalgas bliver du en del af et stærkt fællesskab, som arbejder for at beskytte og benytte naturen. Derfor kalder vi vores elever og lærlinge for fremtidens helte.