
Wir ändern unseren Namen zu Dalgas
Seit Oktober 2024 treten alle Geschäftsbereiche unter dem einheitlichen Markennamen Dalgas auf. Dies ist auch der Name der dänischen Muttergesellschaft. Die alten Markennamen wie HD SILVA, HD Forest und HD LogSystems gibt es nicht mehr. Die rechtliche Firmierung der deutschen Tochtergesellschaft ist jedoch noch Heidegesellschaft Forstprodukte und -geräte GmbH.
Published on 24. Juni 2024
Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Dalgas_Paragraph.cshtml" System.Exception: Custom field 'AccessUser_JobTitleTranslatedDE' was not found. at Dalgas.Custom.Extensions.UserViewModelExtensions.GetCustomFieldValue[T](UserViewModel user, String fieldSystemName) in D:\a\1\s\Custom\Extensions\UserViewModelExtensions.cs:line 34 at Dalgas.Custom.Extensions.UserViewModelExtensions.GetJobTitleTranslatedDE(UserViewModel user) in D:\a\1\s\Custom\Extensions\UserViewModelExtensions.cs:line 236 at Dalgas.Custom.Extensions.UserViewModelExtensions.GetJobTitle(UserViewModel user) in D:\a\1\s\Custom\Extensions\UserViewModelExtensions.cs:line 255 at CompiledRazorTemplates.Dynamic.RazorEngine_f512cabc726344869b9060f0fdfc462f.Execute() in E:\Solutions\dalgas\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Dalgas_Paragraph.cshtml:line 202 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 @using System 2 @using System.Collections.Generic 3 @using System.Linq 4 @using Dalgas.Custom.Extensions 5 @using Dynamicweb.Content 6 @using Dynamicweb.Frontend 7 @using Dalgas.Custom.Services 8 @using Dalgas.Custom.ViewModels.UI 9 @using Dynamicweb.Core.Json 10 @using Dynamicweb.Ecommerce.ProductCatalog 11 @using Dynamicweb.Indexing.Querying 12 @using Dynamicweb.Indexing.Querying.Faceting 13 @using Dynamicweb.Indexing.Querying.Sorting 14 @using Dynamicweb.Modules 15 @using Dynamicweb.Security.UserManagement 16 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 17 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.GridRowViewModel> 18 19 @using System 20 @using System.Collections.Generic 21 @using System.Linq 22 @using Dalgas.Custom.ViewModels.UI 23 @using Dynamicweb.Content 24 @using Dynamicweb.Ecommerce.ProductCatalog 25 @using Dynamicweb.Frontend 26 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 27 28 @*TODO: Move these functions onto the model *@ 29 30 @functions 31 { 32 33 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 34 { 35 var returnValues = new List<string> 36 { 37 $"item_{model.Item.SystemName.ToLower()}" 38 }; 39 40 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 41 { 42 returnValues.Add("dalgas-section-first-on-page"); 43 } 44 45 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 46 47 if (!string.IsNullOrEmpty(overwriteTheme)) 48 { 49 sectionBackgroundTheme = overwriteTheme; 50 } 51 52 // Add theme class if it exists 53 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 54 { 55 if (sectionBackgroundTheme.Contains("default")) 56 { 57 returnValues.Add("theme theme-light"); 58 } 59 else 60 { 61 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 62 } 63 } 64 65 // Determine if top padding should be removed 66 67 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 68 69 returnValues.Add("pb-6"); 70 if (removeTopPadding != "enable") 71 { 72 returnValues.Add("pt-6"); 73 } 74 75 return string.Join(" ", returnValues); 76 } 77 78 } 79 80 81 @{ 82 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 83 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 84 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 85 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 86 87 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 88 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 89 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 90 bool hasHeading = headings.Any(); 91 bool hasButton = buttons.Any(); 92 93 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 94 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 95 96 var sectionClassList = GetSectionClassList(Model); 97 98 var image = string.Empty; 99 var imageParameters = new Dictionary<string, object>(); 100 101 string layout = string.Empty; 102 Boolean enableFifthElement = false; 103 if (Model?.Item != null) 104 { 105 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 106 107 if (paragraphLayout != null) 108 { 109 layout = paragraphLayout.GetString("Layout"); 110 111 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 112 } 113 } 114 115 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 116 { 117 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 118 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 119 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 120 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 121 string cssPosition = $"{xPos}% {yPos}%"; 122 imageParameters.Add("style", "object-position:" + cssPosition); 123 } 124 125 LinkViewModel imageLink = new LinkViewModel(); 126 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 127 { 128 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 129 } 130 131 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 132 } 133 134 135 @{ 136 ClassList imageAspectRatio = new ClassList(""); 137 ClassList textClasslist = new ClassList(""); 138 ClassList textContainerClassList = new ClassList(""); 139 ClassList rowClasslist = new ClassList(""); 140 ClassList sectionClasslist = new ClassList("col-md-10"); 141 ClassList contentFlowDirection = new ClassList(""); 142 143 var contentFlow = Model.Item?.GetItem("Content")?.GetString("ContentFlow"); 144 145 IList<ItemViewModel> paragraphItems = Model.Item?.GetItem("Content")?.GetItems("ContentType") ?? Enumerable.Empty<ItemViewModel>().ToList(); 146 Page page = Services.Pages.GetPage(PageView.Current().Page.ID); 147 148 if (!string.IsNullOrEmpty(page.Item["Author"]?.ToString())) 149 { 150 textClasslist.Remove("col-lg-6"); 151 textClasslist.Add("col-lg-9"); 152 sectionClasslist.Remove("col-md-10"); 153 textContainerClassList.Add("col-lg-9 offset-lg-1"); 154 } 155 156 string removeTopPadding = Model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 157 158 if (contentFlow == "vertical") 159 { 160 if (removeTopPadding != "enable") 161 { 162 rowClasslist.Add("gap-6"); 163 } 164 165 imageAspectRatio.Add("ratio-21x9"); 166 contentFlowDirection.Add("d-flex flex-column flex-md-row gap-md-4"); 167 } 168 else 169 { 170 sectionClasslist.Add("col-lg-12 col-xxl-10"); 171 rowClasslist.Add("g-5"); 172 imageAspectRatio.Add("ratio-16x9"); 173 textClasslist.Add("col-lg-6"); 174 } 175 } 176 177 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 178 <div class=""> 179 180 @if (paragraphItems.Count > 0) 181 { 182 <div class="container-xl"> 183 <div class="row justify-content-center"> 184 <div class="col-12 @sectionClasslist"> 185 186 <div class="row flex-column-reverse flex-lg-row"> 187 188 @if (page.Item["Author"] != null) 189 { 190 var authorValue = page.Item["Author"]; 191 if (int.TryParse((string) authorValue, out int parsedValue)) 192 { 193 int articleAuthor = parsedValue; 194 UserCollection authers = User.GetUsersByIds(new List<int> {articleAuthor}); 195 foreach (var author in authers) 196 { 197 UserViewModel resultViewModel = author.ToViewModel(); 198 object contactPhone = resultViewModel.Phone; 199 object contactEmail = resultViewModel.GetContactEmail(); 200 object contactImage = resultViewModel.Image; 201 object contactName = resultViewModel.Name; 202 object contactTitle = resultViewModel.GetJobTitle(); 203 FileViewModel imageFile = ViewModelFactory.CreateFieldFileValueView(contactImage.ToString()); 204 205 <div class="col-6 col-lg-2 mb-5"> 206 <div class="position-sticky" style="top: calc(var(--header-height)* 2);"> 207 <div class="p-img-container d-flex"> 208 <figure class="ratio ratio-1x1"> 209 @RenderPartial("Components/Image.cshtml", imageFile ?? new FileViewModel()) 210 </figure> 211 </div> 212 <div class="p-txt-container mt-2"> 213 <h4 class="mb-2">@contactName</h4> 214 215 <div class="small d-flex flex-column mb-3 opacity-75"> 216 <span>@contactTitle</span> 217 </div> 218 @if (!string.IsNullOrEmpty(contactEmail?.ToString())) 219 { 220 <div class="d-flex gap-3 small opacity-75"> 221 <span>E.</span> 222 <span>@contactEmail</span> 223 </div> 224 } 225 @if (!string.IsNullOrEmpty(contactPhone?.ToString())) 226 { 227 <div class="d-flex gap-3 small opacity-75"> 228 <span>T.</span> 229 <span>@contactPhone</span> 230 </div> 231 } 232 </div> 233 </div> 234 </div> 235 } 236 } 237 } 238 239 <div class="@textContainerClassList"> 240 <div class="row @rowClasslist"> 241 242 @* Topic, Issue & Podcast *@ 243 244 @{ 245 // Topic – Gets value from "Tag" Dropdown List 246 string topicTitle = string.Empty; 247 string topicLink = string.Empty; 248 249 // Check if there is a related topic and get the first related topic item ID 250 string topicItemId = page.Item["RelatedTopics"]?.ToString() 251 ?.Split(',') 252 .Select(v => v.Trim()) 253 .FirstOrDefault(id => !string.IsNullOrEmpty(id)); 254 255 if (!string.IsNullOrEmpty(topicItemId)) 256 { 257 // Fetch the item using topicItemId and retrieve both Title and Link fields 258 var topicItem = Services.Items.GetItem("HS_TopicType", topicItemId); 259 if (topicItem != null) 260 { 261 topicTitle = topicItem["Title"]?.ToString() ?? string.Empty; 262 topicLink = topicItem["Link"]?.ToString() ?? string.Empty; // Assuming "Link" is the field for the link 263 } 264 } 265 266 // Issue – Gets value from "Tag" Dropdown List 267 268 string issueTitle = string.Empty; 269 string issueLink = string.Empty; 270 271 // Check if there is a related issue and get the first related issue item ID 272 string issueItemId = page.Item["RelatedIssues"]?.ToString() 273 ?.Split(',') 274 .Select(v => v.Trim()) 275 .FirstOrDefault(id => !string.IsNullOrEmpty(id)); 276 277 if (!string.IsNullOrEmpty(issueItemId)) 278 { 279 // Fetch the item using issueItemId and retrieve both Title and Link fields 280 var issueItem = Services.Items.GetItem("HS_IssueType", issueItemId); 281 if (issueItem != null) 282 { 283 issueTitle = issueItem["Title"]?.ToString() ?? string.Empty; 284 issueLink = issueItem["Link"]?.ToString() ?? string.Empty; // Assuming "Link" is the field for the link 285 } 286 } 287 288 // Podcast 289 string podcastInput = page.Item["Podcast"]?.ToString(); // Replace with the actual model property if using a form or similar 290 string embedBaseUrl = "https://embed.podcasts.apple.com"; 291 string podcastSrcUrl; 292 293 // Check if the input is a full URL 294 if (Uri.TryCreate(podcastInput, UriKind.Absolute, out Uri parsedUri) && parsedUri.Host.Contains("apple.com")) 295 { 296 // If it's a full URL, build the src URL using its path and query 297 podcastSrcUrl = $"{embedBaseUrl}{parsedUri.PathAndQuery}&theme=auto"; 298 } 299 else 300 { 301 // If only an ID is provided, construct the URL assuming a US podcast region 302 podcastSrcUrl = $"{embedBaseUrl}/us/podcast/id{podcastInput}?theme=auto"; 303 } 304 } 305 306 @if (!string.IsNullOrEmpty(topicTitle)) 307 { 308 <div class="col-12 col-sm-6 col-lg-4 col-xxl-3"> 309 310 <div class="mb-3 col-6 col-sm-10 small"> 311 @Translate("Knowledge Topic - Text", "Artiklen er en del af vores tema om") @topicTitle 312 </div> 313 314 @if (!string.IsNullOrEmpty(topicLink)) 315 { 316 <div> 317 <a href="@topicLink" class="btn btn-secondary btn-sm fs-7"> 318 @Translate("Knowledge Topic - Button Text", "Gå til overblik") 319 </a> 320 </div> 321 } 322 323 </div> 324 } 325 326 @if (!string.IsNullOrEmpty(issueTitle)) 327 { 328 <div class="col-12 col-sm-6 col-lg-4 col-xxl-3"> 329 <div class="mb-3 col-6 col-sm-10 small"> 330 @Translate("Knowledge Issue - Text", "Artiklen er også bragt i vores medlemsmagasin") @issueTitle 331 </div> 332 @if (!string.IsNullOrEmpty(issueLink)) 333 { 334 <a href="@issueLink" class="btn btn-secondary btn-sm fs-7"> 335 @Translate("Knowledge Issue - Button Text", "Se mere om Vækst") 336 </a> 337 } 338 </div> 339 <hr class="col-12 opacity-0 m-0"/> 340 } 341 <div class="col-12 col-lg-9"> 342 @if (!string.IsNullOrEmpty(podcastInput)) 343 { 344 if (podcastInput.Contains(".mp3")) 345 { 346 <div class="theme theme-mud p-4"> 347 <audio controls class="w-100"> 348 <source src="@podcastInput" type="audio/mpeg"> 349 Your browser does not support the audio element. 350 </audio> 351 <a href="@podcastInput" class="btn btn-link" target="_blank" 352 download> 353 @Translate("Download lydfil") 354 </a> 355 </div> 356 } 357 else 358 { 359 <div class="cookieconsent-optout-marketing p-4 border" 360 style="border-color: var(--swift-accent-color) !important;"> 361 <a href="javascript:Cookiebot.renew()"> 362 @Translate("CookieBot - Please", "Venligst") @Translate("CookieBot - accept marketing-cookies", "acceptere marketing-cookies") 363 @Translate("CookieBot - to hear this podcast.", "for at se lytte til denne podcast") 364 </a> 365 </div> 366 367 <div class="cookieconsent-optin-marketing" 368 data-cookieconsent="marketing" 369 data-cookieblock-src="@podcastSrcUrl"> 370 371 <iframe 372 allow="autoplay *; encrypted-media *; fullscreen *; clipboard-write" 373 frameborder="0" 374 height="175" 375 style="width:100%;max-width:100%;overflow:hidden;border-radius:10px;" 376 sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" 377 data-cookieblock-src="@podcastSrcUrl" 378 data-cookieconsent="marketing"> 379 </iframe> 380 381 @if (!string.IsNullOrEmpty(Pageview.AreaSettings.GetString("Podcast_Page_Link"))) 382 { 383 <a href="@Pageview.AreaSettings.GetString("Podcast_Page_Link")" 384 class="btn btn-link"> 385 @Translate("Podcast – Find flere episoder – Link", "Find flere episoder") 386 </a> 387 } 388 </div> 389 } 390 } 391 </div> 392 393 @foreach (var item in paragraphItems.Select((item, index) => new {Item = item, Index = index + 1})) 394 { 395 if (item.Index > 1) 396 { 397 } 398 399 var paragraphItem = item.Item; 400 string paragraphLead = paragraphItem.GetItem("Paragraph_Text").GetString("Lead"); 401 string paragraphText = paragraphItem.GetItem("Paragraph_Text").GetString("Text"); 402 IEnumerable<HeadingViewModel> paragraphHeadings = ParagraphService.Instance.GetHeadingsByItems(paragraphItem.GetItem("Paragraph_Text").GetItems("Headings")); 403 IEnumerable<ButtonViewModel> paragraphButtons = ParagraphService.Instance.GetButtonsByItems(paragraphItem.GetItem("Paragraph_Text").GetItems("Buttons")); 404 405 string colorScheme = paragraphItem.GetItem("ColorScheme")?.GetString("ColorScheme"); 406 string paragraphTheme = string.Empty; 407 408 if (!string.IsNullOrEmpty(colorScheme) && colorScheme != theme) 409 { 410 paragraphTheme = "p-4 pb-1 theme " + colorScheme; 411 } 412 413 bool hasMedia = !string.IsNullOrEmpty(paragraphItem.GetItem("Paragraph_Media")?.GetItem("Video").GetString("VideoSourceID")) || !string.IsNullOrEmpty(paragraphItem.GetItem("Paragraph_Media")?.GetItem("Video").GetString("VideoPath")); 414 415 string quote = paragraphItem?.GetItem("Paragraph_Quote")?.GetString("Text"); 416 string name = paragraphItem?.GetItem("Paragraph_Quote")?.GetString("Name"); 417 string titleAndCompany = paragraphItem?.GetItem("Paragraph_Quote")?.GetString("TitleAndCompany"); 418 419 420 <div class="col-12 @textClasslist"> 421 <div class="@paragraphTheme"> 422 @if (string.IsNullOrEmpty(paragraphLead) && string.IsNullOrEmpty(quote) && string.IsNullOrEmpty(paragraphText) && paragraphButtons.Count() < 1 && paragraphHeadings.Count() < 1 && string.IsNullOrEmpty(paragraphItem.GetItem("Paragraph_Media").GetItem("Image").GetString("Image")) && !hasMedia) 423 { 424 if (Pageview.IsVisualEditorMode) 425 { 426 <div class="alert alert-light" role="alert"> 427 This column is empty. <br/> 428 You can use it as a "Ghost" paragraph, otherwise it should 429 be 430 deleted. 431 </div> 432 } 433 } 434 else 435 { 436 <div 437 class="js-content-container content-container d-flex flex-column @(hasMedia ? "gap-2" : "")"> 438 439 @if (paragraphItem.GetItem("Paragraph_Media")?.GetField("Media").Value.ToString() == "Image" && !string.IsNullOrEmpty(paragraphItem.GetItem("Paragraph_Media").GetItem("Image").GetString("Image"))) 440 { 441 imageLink = ParagraphService.Instance.GetLinkByItem(paragraphItem?.GetItem("Paragraph_Media")?.GetItem("Image")?.GetItem("Link")); 442 443 if (imageLink != null && !string.IsNullOrEmpty(imageLink.Url)) 444 { 445 <a href="@imageLink.Url"> 446 <figure 447 class="mb-0 d-flex flex-column mb-3"> 448 @RenderPartial("Components/Image.cshtml", paragraphItem.GetItem("Paragraph_Media").GetItem("Image").GetFile("Image") ?? new FileViewModel()) 449 </figure> 450 </a> 451 } 452 else 453 { 454 <figure 455 class="mb-0 d-flex flex-column mb-3"> 456 @RenderPartial("Components/Image.cshtml", paragraphItem.GetItem("Paragraph_Media").GetItem("Image").GetFile("Image") ?? new FileViewModel()) 457 </figure> 458 } 459 } 460 else if (paragraphItem.GetItem("Paragraph_Media")?.GetField("Media").Value.ToString() == "Video") 461 { 462 string provider = paragraphItem?.GetItem("Paragraph_Media")?.GetItem("Video").GetRawValueString("VideoSourceProvider", "none"); 463 string videoId = paragraphItem?.GetItem("Paragraph_Media")?.GetItem("Video").GetString("VideoSourceID"); 464 Dynamicweb.Frontend.FileViewModel video = paragraphItem?.GetItem("Paragraph_Media")?.GetItem("Video").GetFile("VideoPath"); 465 string videoPath = video?.Path ?? ""; 466 467 <div class="cookieconsent-optout-marketing p-4 border" 468 style="border-color: var(--swift-accent-color) !important;"> 469 <a href="javascript:Cookiebot.renew()"> 470 @Translate("CookieBot - Please", "Venligst") @Translate("CookieBot - accept marketing-cookies", "acceptere marketing-cookies") 471 @Translate("CookieBot - to watch this video.", "for at se denne video") 472 </a> 473 </div> 474 475 <div class="cookieconsent-optin-marketing" 476 data-cookieconsent="marketing" 477 data-cookieblock-src="@videoPath"> 478 479 @switch (provider) 480 { 481 case "youtube": 482 case "vimeo": 483 484 <div 485 id="player_@paragraphItem.Id" 486 class="player plyr__video-embed theme theme-light h-100 w-100 plyr-instance" 487 data-plyr-provider="@provider" 488 data-plyr-embed-id="@videoId" 489 style="--plyr-color-main: var(--swift-foreground-color); "> 490 </div> 491 492 break; 493 494 case "self-hosted": 495 496 <video 497 id="player_@paragraphItem.Id" 498 class="player plyr__video-embed theme theme-light h-100 w-100 plyr-instance" 499 src="@videoPath" 500 style="--plyr-color-main: var(--swift-foreground-color);" 501 preload="metadata"> 502 </video> 503 504 break; 505 } 506 <script type="module" defer 507 src="~/Files/Templates/Designs/Swift/Assets/js/plyr.js"></script> 508 <script type="text/plain" 509 data-cookieconsent="marketing"> 510 511 const players = document.querySelectorAll('.plyr-instance'); 512 players.forEach(function(playerElement) { 513 new Plyr(playerElement, { 514 type: 'video', 515 youtube: { 516 noCookie: true, 517 showinfo: 0 518 }, 519 fullscreen: { 520 enabled: true, 521 iosNative: true, 522 } 523 }); 524 }); 525 </script> 526 527 </div> 528 } 529 530 <div> 531 532 @if (paragraphItem.GetItem("Paragraph_Media")?.GetField("Media").Value.ToString() == "Graphic") 533 { 534 <div class="p-graphic-container mb-3"> 535 <div 536 class="graphic-size-@paragraphItem.GetItem("Paragraph_Media").GetItem("Graphic").GetString("GraphicSize")"> 537 @RenderPartial("Components/Image.cshtml", paragraphItem?.GetItem("Paragraph_Media")?.GetItem("Graphic")?.GetFile("Image") ?? new FileViewModel()) 538 </div> 539 </div> 540 } 541 @if (!string.IsNullOrEmpty(quote)) 542 { 543 <div class="col-12"> 544 545 <p class="quote">"@quote</p> 546 <h4 class="fs-6 mb-2">@name</h4> 547 <p class="small">@titleAndCompany</p> 548 549 </div> 550 } 551 <div> 552 <span> 553 @string.Join("", paragraphHeadings.Select(h => h.ToString())) 554 </span> 555 556 <span class="@contentFlowDirection"> 557 @if (!string.IsNullOrEmpty(paragraphLead)) 558 { 559 <p class="lead">@paragraphLead</p> 560 } 561 @paragraphText 562 </span> 563 @string.Join("", paragraphButtons.Select(h => h.ToString())) 564 </div> 565 </div> 566 567 </div> 568 } 569 </div> 570 </div> 571 } 572 </div> 573 </div> 574 </div> 575 </div> 576 </div> 577 578 </div> 579 } 580 else 581 { 582 if (Pageview.IsVisualEditorMode) 583 { 584 <div class="container-xl alert alert-danger" role="alert"> 585 This <strong>@Model.Item.SystemName</strong> is empty 586 </div> 587 } 588 } 589 </div> 590 </section> 591
Neuigkeiten aus der Natur
Dienstag, 10. Juni 2025
Dalgas geht neue Partnerschaft für digitale Messlösungen in der Forst- und Holzindustrie ein
Die Produkte LogStackLIDAR und LogStackPRO von Dalgas werden nun Teil des digitalen Portfolios von ForestX. Die neue Partnerschaft soll die Digitalisierung der Forst- und Holzindustrie in Europa stärken.Artikel und Inspiration

Whitepaper - Aufforstungsmöglichkeiten in den baltischen Staaten
Erwägen Sie, Ihr Anlageportfolio mit Forstwirtschaft in den baltischen Staaten zu diversifizieren, aber Ihnen fehlt das tiefgehende Wissen über die lokalen Vorschriften? Wir können Ihnen einen Überblick verschaffen.