Bestil afhentning af varer til slibning
Venligst oplys afhentningsadresse og kontaktoplysninger

Varer ex. moms

Lagersalg - GØR ET KUP!

Gå ikke glip af et godt tilbud på disse skærende værktøjer, som nu sælges ud af lageret. Tilbuddene gælder kun online og så længe lager haves.

Lagersalget er udelukkende gældende for onlinesalg
og for at benytte dig af disse tilbud skal din bestilling derfor laves her i webshoppen og ikke via vores kundeservice eller eksterne sælgere.

Det aktuelle udvalg i lagersalget omfatter bla:

  • Bajonetsavsklinger
  • Rundsavsklinger
  • Diamantklinger
Har du brug for hjælp? Du kan kontakte Junget her: Telefontider
Mandag - torsdag7:30 - 16:00
Fredag7:30 - 15:00
+45 89 36 55 30 tool@junget.dk
Error executing template "Designs/Junget/eCom/Productlist/productlist.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_e3bb9eff43a245e1b06ffef4cc828ef0.Execute() in D:\Web\Junget\Website\Files\Templates\Designs\Junget\eCom\Productlist\productlist.cshtml:line 1546
   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.Web 2 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 3 4 @{ 5 var query = HttpContext.Current.Request; 6 var pathName = GetGlobalValue("Global:Pageview.Url"); 7 if (pathName.IndexOf("?") != -1) 8 { 9 pathName = pathName.Substring(0, pathName.IndexOf("?")); 10 } 11 12 string prevPage = !string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.PrevPage.Clean")) ? GetString("Ecom:ProductList.PrevPage.Clean") : ""; 13 string nextPage = !string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.NextPage.Clean")) ? GetString("Ecom:ProductList.NextPage.Clean") : ""; 14 var facetGroup = GetLoop("FacetGroups"); 15 var products = GetLoop("Products"); 16 var pageService = new Dynamicweb.Content.PageService(); 17 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" }); 18 19 } 20 21 @using Dynamicweb.Ecommerce 22 @using Dynamicweb.Ecommerce.Products 23 @using Dynamicweb.Security.UserManagement; 24 @using Helpers = Website.Helpers; 25 @using VestjyskMarketing.Models; 26 27 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 28 @functions { 29 30 string DiscountPct(LoopItem context = null) { 31 double oldPrice = 0; 32 double price = 0; 33 double discount = 0; 34 35 string inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT")); 36 string inputprice = (context != null ? context.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price")); 37 38 double.TryParse( inputprice, out oldPrice); 39 double.TryParse( inputdiscountPrice, out price); 40 41 double difference = ( oldPrice - price ); 42 discount = Math.Round((difference / oldPrice) * 100); 43 44 return discount.ToString(); 45 } 46 47 string DiscountDiff(LoopItem context = null) { 48 double oldPrice = 0; 49 double price = 0; 50 51 var inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT")); 52 var inputprice = (context != null ? context.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price")); 53 54 double.TryParse( inputprice, out oldPrice); 55 double.TryParse( inputdiscountPrice, out price); 56 57 double difference = ( oldPrice - price ); 58 59 return SliceCommas(difference.ToString()); 60 } 61 62 string OldPrice(LoopItem context = null, LoopItem product = null) { 63 double oldPrice = 0; 64 double price = 0; 65 66 var inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT")); 67 var inputprice = (product != null ? product.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price")); 68 69 double.TryParse( inputprice, out oldPrice); 70 double.TryParse( inputdiscountPrice, out price); 71 72 double difference = ( oldPrice + price ); 73 74 return SliceCommas(difference.ToString()); 75 } 76 77 string SliceCommas(string givenPrice) { 78 // We remove everything after comma, if the Discount-Handler calculates it differently, however the price in the cart is with comma values *@ 79 string price = givenPrice; 80 int index = price.LastIndexOf(','); 81 82 if(index > -1) { 83 price = price.Substring(0, index) + ",-"; 84 } 85 else { 86 price = price + ",-"; 87 } 88 89 return price.ToString(); 90 } 91 92 string ChangeAttribute(string input, string format) { 93 if(!String.IsNullOrEmpty(input) && input == "checked") { 94 return format; 95 } 96 else if(!String.IsNullOrEmpty(input) && Convert.ToBoolean(input)) { 97 return format; 98 } 99 return null; 100 } 101 102 } 103 104 105 @helper ContentRenderingNew(LoopItem item, string loopName, bool isSmallSpot = false, string productUrl = "", bool checkoutPage = false) 106 { 107 108 User mainUserHeader = Pageview.User?.CurrentSecondaryUser != null ? Pageview.User.CurrentSecondaryUser : Pageview.User; 109 110 //set URL for page. To get correct URL all places in regards to list 111 //fetch pages from shop 112 var pageService = new Dynamicweb.Content.PageService(); 113 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" }); 114 string productPrice = GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-"); 115 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 116 int pageId = 0; 117 foreach (var page in pages) 118 { 119 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]); 120 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID)) 121 { 122 pageId = page.ID; 123 break; 124 } 125 } 126 127 productUrl = "/Default.aspx?ID=" + pageId + "&amp;ProductID=" + item.GetString("Ecom:Product.ID"); 128 if (pageId == 0) 129 { 130 productUrl = item.GetString("Ecom:Product.Link.Clean"); 131 } 132 133 // Images 134 string grpId = string.Empty; 135 string grpQtyDiscount5 = string.Empty; 136 string grpQtyDiscount10 = string.Empty; 137 138 foreach (LoopItem subItem in item.GetLoop("AssociatedGroups")) 139 { 140 grpId = subItem.GetString("Ecom:Group.ID"); 141 } 142 143 if (!string.IsNullOrEmpty(grpId)) 144 { 145 146 double minQuantity = item.GetDouble("Ecom:Product.PurchaseMinimumQuantity"); 147 if (minQuantity < 1) 148 { 149 minQuantity = 1; 150 } 151 double quantityStep = item.GetDouble("Ecom:Product.PurchaseQuantityStep"); 152 if (quantityStep < 1) 153 { 154 quantityStep = 1; 155 } 156 157 bool internalProduct = item.GetBoolean("Ecom:Product:Field.InternalProduct"); 158 bool webshopOK = item.GetBoolean("Ecom:Product:Field.WebshopOK"); 159 string productName = item.GetString("Ecom:Product.Name"); 160 string productImage = "/Files/System/Images/Shop/na-image.jpg"; 161 162 163 string getImageForProductList = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(grpId).LargeImage; 164 string myFormat = string.Format("/Files/{0}", getImageForProductList); 165 166 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.ImageNZProductImage.Clean"))) 167 { 168 productImage = item.GetString("Ecom:Product.ImageNZProductImage.Clean"); 169 } 170 else if (!string.IsNullOrEmpty(getImageForProductList)) 171 { 172 productImage = myFormat; 173 } 174 175 var deleteLink = item.GetString("Ecom:Order:OrderLine.DeleteLink"); 176 177 var newDeleteLink = deleteLink; 178 if (!string.IsNullOrEmpty(deleteLink) && deleteLink.ToLower().Contains("&productid")) 179 { 180 var deleteLinkParts = deleteLink.ToLowerInvariant().Split('&'); 181 var productItemPart = deleteLinkParts.FirstOrDefault(p => p.Contains("productid")); 182 var productId = item.GetString("Ecom:Product.ID"); 183 deleteLinkParts[Array.IndexOf(deleteLinkParts, productItemPart)] = "productid=" + productId; 184 newDeleteLink = string.Join("&", deleteLinkParts); 185 } 186 187 int jungStockAmount = Dynamicweb.Core.Converter.ToInt32(item.GetString("Ecom:Product:Field.jung_stock").Replace("D", "")); 188 string productFabrikat = item.GetString("Ecom:Product:Field.fabrikat").ToLower(); 189 190 string image = VestjyskMarketing.Helpers.ImageHelper.ResizeImage(new ResizeImageSettings() 191 { 192 Image = "/Files/Files/Images/img_calculator.png", 193 Height = 96, 194 Width = 96, 195 Quality = 85 196 }); 197 198 //get campaign name 199 string campaignName = ""; 200 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true); 201 var prices = productApi.Prices; 202 double oldPrice = 0; 203 foreach (var priceFromMatrix in prices) 204 { 205 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value") && Helpers.Product.IsCampaingPrice(priceFromMatrix) 206 && Helpers.Product.IsPriceValid(priceFromMatrix)) 207 { 208 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name; 209 foreach (var priceFromMatrix2 in prices) 210 { 211 if (priceFromMatrix2.Amount != item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value") && 212 !Helpers.Product.IsCampaingPrice(priceFromMatrix2) && Helpers.Product.IsPriceValid(priceFromMatrix2)) 213 { 214 oldPrice = priceFromMatrix2.Amount; 215 break; 216 } 217 } 218 } 219 } 220 221 //has to be done like this and not tags. tags will make more calls via live integrayion. 222 bool hasCombinations = productApi.VariantCombinations.Any(); 223 224 var smallSpotClasses = "product-item__price"; 225 226 if (isSmallSpot) 227 { 228 229 smallSpotClasses = "text-success font-weight-bold ml-auto"; 230 231 if (checkoutPage) 232 { 233 <a href="@item.GetString("Ecom:Order:OrderLine.DeleteLink")" class="product-item__closebtn btn p-0"><span class="icon icon-close m-0"></span></a> 234 } 235 else 236 { 237 <a href="#" class="product-item__closebtn btn p-0 js-product-state-submit" data-action="@newDeleteLink"><span class="icon icon-close m-0"></span></a> 238 } 239 240 } 241 if (!string.IsNullOrEmpty(campaignName)) 242 { 243 string discountImage = ""; //@TODO hvad skal vi gøre med billeder? 244 bool blackFriday = false; //@TODO hvad skal vi gøre med black friday? 245 246 if (!String.IsNullOrEmpty(discountImage)) 247 { 248 <div class="product-item__badge image-badge"><img src="@discountImage" alt="Kampagne billede" width="150px" /></div> 249 } 250 else if (blackFriday) 251 { 252 <div class="product-item__badge blackfriday-badge text-uppercase">@Translate("ecom-campaigne-blackfriday", "Black Friday")</div> 253 } 254 else 255 { 256 257 //old campaign 258 @*<div class="product-item__badge text-uppercase">@Translate("Campaign-" + campaignName, campaignName)</div>*@ 259 260 } 261 262 } 263 264 if (internalProduct && !webshopOK) 265 { 266 <div class="product-item__badge image-badge"><img src="/Files/System/Images/Shop/Webshop_logo_intern.jpg" alt="Internt produkt" height="50px" /></div> 267 } 268 <div class=" d-flex flex-column result-item__product-content w-100"> 269 @if (loopName == "Products" || loopName == "Item.ProductDisplay") 270 { 271 <picture class="product-item__photo d-flex justify-content-center " onclick="window.location = '@productUrl';" style="cursor:pointer"> 272 <!-- 273 <source srcset="/Admin/Public/GetImage.ashx?Image=@productImage&width=146&height=128&background=ffffff&format=webP&Compression=99&fillcanvas=true" media="(min-width: 576px)"> 274 275 --> 276 <img class="img-fluid" src="/Admin/Public/GetImage.ashx?Image=@productImage&width=345&height=300&background=ffffff&format=webP&Compression=99&fillcanvas=true" alt="@productName"> 277 </picture> 278 } 279 <div class="d-flex flex-row mb-3 mt-3" style="height: 110px; justify-content: center;"> 280 <div class="w-100 d-flex flex-column justify-content-center" onclick="window.location = '@productUrl';" style="cursor:pointer"> 281 <div style="font-size: 13px; padding: 5px; text-align: center; line-height: 15px; line-break: auto " class="product-item__title p-0 m-0">@productName</div> 282 283 <div class="d-flex justify-content-center"> 284 <div class="product-item__description d-flex mt-2" style="justify-content: center; width: max-content; font-size: 12px"> 285 @Translate("ProductNumber", "Varenummer") @item.GetString("Ecom:Product.Number") 286 @if ((jungStockAmount > 0 && jungStockAmount < 3) || item.GetInteger("Ecom:Product.Stock") > 0) 287 { 288 <svg style="margin-left: 10px" height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg> 289 290 291 } 292 </div> 293 </div> 294 <div class="product-item__delivery-time" style="font-size: 12px; text-align: center"> 295 @Helpers.Product.GetJungStock(item.GetString("Ecom:Product:Field.jung_stock"), item.GetInteger("Ecom:Product.Stock")) 296 </div> 297 298 299 @if (mainUserHeader != null && mainUserHeader.HasGroup(24)) 300 { 301 <span class="d-flex justify-content-center"> 302 &nbsp; 303 (@item.GetInteger("Ecom:Product.Stock") @Translate("stk.")) 304 </span> 305 } 306 307 @{ 308 if (minQuantity > 1) 309 { 310 <div class="d-flex" style="justify-content: center; font-size: 12px"><strong> @Translate("Minimumskøb:", "Minimumskøb:") @minQuantity @Translate("stk.")</strong> </div> 311 } 312 } 313 @foreach (LoopItem subItem in item.GetLoop("Order.OrderLineFields")) 314 { 315 <div class="product-item__description"> 316 @if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "DeliveryPromised") 317 { 318 @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value") 319 } 320 else if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "customSizeAdded") 321 { 322 @Translate("customSize", "Størrelse") @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")<span>mm</span> 323 } 324 </div> 325 } 326 </div> 327 328 </div> 329 330 <div> 331 332 <div class="d-flex mb-2" style="justify-content: space-evenly; align-items: center"> 333 <input type="hidden" name="ProdId" class="js-reorder-product-id" value="@item.GetString("Ecom:Product.ID")" /> 334 @if (loopName != "Products" && loopName != "Item.ProductDisplay") 335 { 336 <div class="input-group product-item__quantity-wrapper"> 337 <span class="input-group-btn"> 338 @if (checkoutPage) 339 { 340 <a href="@item.GetString("Ecom:Order:OrderLine.DecrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-minus"></span></a> 341 } 342 else 343 { 344 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.DecrementLink")"><span class="icon icon-minus"></span></a> 345 } 346 </span> 347 <input id="Quantity" type="text" autocomplete="off" class="form-control text-center js-quantity-input" name="Quantity" min="@minQuantity" value="@item.GetString("Ecom:Order:OrderLine.Quantity")" data-step="@quantityStep" data-type="order"> 348 <span class="input-group-btn"> 349 @if (checkoutPage) 350 { 351 <a href="@item.GetString("Ecom:Order:OrderLine.IncrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-plus"></span></a> 352 } 353 else 354 { 355 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.IncrementLink")"><span class="icon icon-plus"></span></a> 356 } 357 358 </span> 359 </div> 360 } 361 else if (!hasCombinations) 362 { 363 <div class="input-group product-item__quantity-wrapper d-md-none"> 364 <span class="input-group-btn"> 365 <button class="btn btn-buy js-reorder-quantity-subtract" type="button"><span class="icon icon-minus"></span></button> 366 </span> 367 <input type="text" autocomplete="off" class="form-control text-center js-reorder-quantity-input" name="Quantity" min="0" max="20" value="1"> 368 <span class="input-group-btn"> 369 <button class="btn btn-buy js-reorder-quantity-add" type="button"><span class="icon icon-plus"></span></button> 370 </span> 371 </div> 372 } 373 374 375 @if (productFabrikat != "leitz") 376 { 377 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer"> 378 @if (!String.IsNullOrEmpty(campaignName) && oldPrice > 0 && !User.IsExtranetUserLoggedIn()) 379 { 380 @*<div class="product-details__price-container"> 381 @if (hasCombinations && loopName != "OrderLines") 382 { 383 <div class="from-price">@Translate("ProductFromPrice", "Fra")</div> 384 } 385 <div>@item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div> 386 <div class="product-item__price--old">DKK @oldPrice,-</div> 387 </div>*@ 388 389 390 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2"> 391 @if (loopName == "OrderLines") 392 { 393 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-") 394 } 395 else 396 { 397 <div class="without-discount d-flex flex-column align-items-center"> 398 @if (hasCombinations && loopName != "OrderLines") 399 { 400 @Translate("ProductFromPrice", "Fra") 401 } 402 403 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-") 404 405 <div class="product-item__price--old m-0 text-center" style="font-size: 11px; color: #68943c">DKK @oldPrice,-</div> 406 </div> 407 408 409 } 410 </div> 411 412 } 413 414 else 415 { 416 417 418 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2"> 419 @if (loopName == "OrderLines") 420 { 421 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-") 422 } 423 else 424 { 425 <div> 426 @if (hasCombinations && loopName != "OrderLines") 427 { 428 @Translate("ProductFromPrice", "Fra") 429 } 430 431 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-") 432 </div> 433 <div class="item__container__info__no-vat">(@Translate("ecom-price-excl-vat", ""))</div> 434 435 } 436 </div> 437 } 438 </div> 439 } 440 else if (User.IsExtranetUserLoggedIn()) 441 { 442 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer"> 443 444 @if (hasCombinations && loopName != "OrderLines") 445 { 446 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div> 447 } 448 449 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2"> 450 @if (loopName == "OrderLines") 451 { 452 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-") 453 } 454 else 455 { 456 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-") 457 } 458 <div class="item__container__info__no-vat">(@Translate("ecom-price-excl-vat", ""))</div> 459 </div> 460 461 462 </div> 463 } 464 465 @if (loopName == "Products" || loopName == "Item.ProductDisplay") 466 { 467 if (productFabrikat != "leitz" || User.IsExtranetUserLoggedIn()) 468 { 469 <div class="d-inline-block flex-row no-wrap"> 470 @if (!hasCombinations) 471 { 472 <button type="submit" class="js-reorder-add-to-basket w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none"> 473 <span class="icon icon-cart"></span> 474 </button> 475 } 476 else 477 { 478 <button type="submit" class="w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none" onclick="window.location = '@productUrl';"> 479 <span class="icon icon-cart"></span> 480 </button> 481 } 482 <button type="button" class="btn btn-success align-self-end px-4 d-none d-md-flex" onclick="window.location = '@productUrl';"> <div class="d-flex flex-row"> <span class="icon icon-shopping-cart mr-2" style="font-size: 14px"></span> </div>BESTIL </button> 483 484 485 </div> 486 } 487 else 488 { 489 <div class="d-flex"> 490 491 <div class="align-self-end px-4 d-none d-md-inline-block" style="font-size: 12px">Log ind for at se prisen</div> 492 493 <button type="button" class="btn btn-success align-self-end px-4 d-md-inline-block js-aside-btn" href="#" data-view="login">@Translate("HeaderLoginButton", "Login")</button> 494 </div> 495 } 496 } 497 </div> 498 499 @if (mainUserHeader != null && mainUserHeader.HasGroup(24) && !isSmallSpot) 500 { 501 string salesPrice = item.GetDouble("Ecom:Product.DBPrice").ToString("F2"); 502 string webPrice = salesPrice; 503 string webDiscount = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("WebDiscount")); 504 string cost = Dynamicweb.Core.Converter.ToString(productApi.Cost); 505 string externalNumber = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ExterntNummer")); 506 string manufacturer = productApi.Manufacturer != null ? productApi.Manufacturer.Name : ""; 507 string discountGroup = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ItemDiscGroup")); 508 509 foreach (var priceFromMatrix in productApi.Prices) 510 { 511 if (Helpers.Product.IsPriceValid(priceFromMatrix)) 512 { 513 webPrice = priceFromMatrix.Amount.ToString("F2"); 514 } 515 } 516 517 <div class="mt-3 d-flex justify-content-between align-items-end"> 518 <div> 519 <div class="text-center" style="margin-left: 10px; font-size: 12px;"> 520 @Translate("Bruttopris", "Bruttopris") @salesPrice 521 </div> 522 523 <div class="text-center" style="margin-left: 8px; font-size: 12px;"> 524 @Translate("Webpris", "Webpris") @webPrice 525 </div> 526 </div> 527 <div class="product-item__details"> 528 <img src="@image" class="product-item__details__image"> 529 <div class="product-item__details__tooltip"> 530 <div class="row"> 531 <div class="col-7"> 532 @Translate("Bruttopris", "Bruttopris"): 533 </div> 534 <div class="col-5"> 535 @salesPrice 536 </div> 537 <div class="col-7"> 538 @Translate("Webrabat", "Webrabat") %: 539 </div> 540 <div class="col-5"> 541 @webDiscount 542 </div> 543 <div class="col-7"> 544 @Translate("Webpris", "Webpris"): 545 </div> 546 <div class="col-5"> 547 @webPrice 548 </div> 549 <div class="col-7"> 550 @Translate("Cost", "Kostpris"): 551 </div> 552 <div class="col-5"> 553 @cost 554 </div> 555 <div class="col-7"> 556 @Translate("Manufacturer's number", "Leverandørens varenr"): 557 </div> 558 <div class="col-5"> 559 @externalNumber 560 </div> 561 <div class="col-7"> 562 @Translate("Manufacturer", "Levenrandør"): 563 </div> 564 <div class="col-5"> 565 @manufacturer 566 </div> 567 <div class="col-7"> 568 @Translate("DiscountGroup", "Varerabatgruppe"): 569 </div> 570 <div class="col-5"> 571 @discountGroup 572 </div> 573 </div> 574 </div> 575 </div> 576 </div> 577 } 578 </div> 579 </div> 580 581 } 582 } 583 @helper ContentRendering(LoopItem item, string loopName, bool isSmallSpot = false, string productUrl = "", bool checkoutPage = false) 584 { 585 586 User mainUserHeader = Pageview.User?.CurrentSecondaryUser != null ? Pageview.User.CurrentSecondaryUser : Pageview.User; 587 588 //set URL for page. To get correct URL all places in regards to list 589 //fetch pages from shop 590 var pageService = new Dynamicweb.Content.PageService(); 591 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" }); 592 string productPrice = GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-"); 593 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 594 int pageId = 0; 595 foreach (var page in pages) 596 { 597 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]); 598 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID)) 599 { 600 pageId = page.ID; 601 break; 602 } 603 } 604 605 productUrl = "/Default.aspx?ID=" + pageId + "&amp;ProductID=" + item.GetString("Ecom:Product.ID"); 606 if (pageId == 0) 607 { 608 productUrl = item.GetString("Ecom:Product.Link.Clean"); 609 } 610 611 // Images 612 string grpId = string.Empty; 613 string grpQtyDiscount5 = string.Empty; 614 string grpQtyDiscount10 = string.Empty; 615 616 foreach (LoopItem subItem in item.GetLoop("AssociatedGroups")) 617 { 618 grpId = subItem.GetString("Ecom:Group.ID"); 619 } 620 621 if (!string.IsNullOrEmpty(grpId)) 622 { 623 624 double minQuantity = item.GetDouble("Ecom:Product.PurchaseMinimumQuantity"); 625 if (minQuantity < 1) 626 { 627 minQuantity = 1; 628 } 629 double quantityStep = item.GetDouble("Ecom:Product.PurchaseQuantityStep"); 630 if (quantityStep < 1) 631 { 632 quantityStep = 1; 633 } 634 635 bool internalProduct = item.GetBoolean("Ecom:Product:Field.InternalProduct"); 636 bool webshopOK = item.GetBoolean("Ecom:Product:Field.WebshopOK"); 637 string productName = item.GetString("Ecom:Product.Name"); 638 string productImage = "/Files/System/Images/Shop/na-image.jpg"; 639 640 641 string getImageForProductList = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(grpId).LargeImage; 642 string myFormat = string.Format("/Files/{0}", getImageForProductList); 643 644 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.ImageNZProductImage.Clean"))) 645 { 646 productImage = item.GetString("Ecom:Product.ImageNZProductImage.Clean"); 647 } 648 else if (!string.IsNullOrEmpty(getImageForProductList)) 649 { 650 productImage = myFormat; 651 } 652 653 var deleteLink = item.GetString("Ecom:Order:OrderLine.DeleteLink"); 654 655 var newDeleteLink = deleteLink; 656 if (!string.IsNullOrEmpty(deleteLink) && deleteLink.ToLower().Contains("&productid")) 657 { 658 var deleteLinkParts = deleteLink.ToLowerInvariant().Split('&'); 659 var productItemPart = deleteLinkParts.FirstOrDefault(p => p.Contains("productid")); 660 var productId = item.GetString("Ecom:Product.ID"); 661 deleteLinkParts[Array.IndexOf(deleteLinkParts, productItemPart)] = "productid=" + productId; 662 newDeleteLink = string.Join("&", deleteLinkParts); 663 } 664 665 int jungStockAmount = Dynamicweb.Core.Converter.ToInt32(item.GetString("Ecom:Product:Field.jung_stock").Replace("D", "")); 666 string productFabrikat = item.GetString("Ecom:Product:Field.fabrikat").ToLower(); 667 668 //get campaign name 669 string campaignName = ""; 670 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true); 671 var prices = productApi.Prices; 672 foreach (var priceFromMatrix in productApi.Prices) 673 { 674 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value")) 675 { 676 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name; 677 } 678 } 679 680 //has to be done like this and not tags. tags will make more calls via live integrayion. 681 bool hasCombinations = productApi.VariantCombinations.Any(); 682 683 var smallSpotClasses = "product-item__price"; 684 685 if (isSmallSpot) 686 { 687 smallSpotClasses = "text-success font-weight-bold ml-auto"; 688 689 if (checkoutPage) 690 { 691 <a href="@item.GetString("Ecom:Order:OrderLine.DeleteLink")" class="product-item__closebtn btn p-0"><span class="icon icon-close m-0"></span></a> 692 } 693 else 694 { 695 <a href="#" class="product-item__closebtn btn p-0 js-product-state-submit" data-action="@newDeleteLink"><span class="icon icon-close m-0"></span></a> 696 } 697 698 } 699 if (!string.IsNullOrEmpty(campaignName)) 700 { 701 string discountImage = ""; //@TODO hvad skal vi gøre med billeder? 702 bool blackFriday = false; //@TODO hvad skal vi gøre med black friday? 703 704 if (!String.IsNullOrEmpty(discountImage)) 705 { 706 <div class="product-item__badge image-badge"><img src="@discountImage" alt="Kampagne billede" width="150px" /></div> 707 } 708 else if (blackFriday) 709 { 710 <div class="product-item__badge blackfriday-badge text-uppercase">@Translate("ecom-campaigne-blackfriday", "Black Friday")</div> 711 } 712 else 713 { 714 <div class="product-item__badge text-uppercase">@Translate("Campaign-" + campaignName, campaignName)</div> 715 } 716 717 } 718 719 if (internalProduct && !webshopOK) 720 { 721 <div class="product-item__badge image-badge"><img src="/Files/System/Images/Shop/Webshop_logo_intern.jpg" alt="Internt produkt" height="50px" /></div> 722 } 723 724 if (loopName == "Products") 725 { 726 <picture class="product-item__photo mr-5 mr-md-7" onclick="window.location = '@productUrl';" style="cursor:pointer"> 727 <source srcset="/Admin/Public/GetImage.ashx?Image=@productImage&width=146&height=128&background=ffffff&format=webP&Compression=75&fillcanvas=true" media="(min-width: 576px)"> 728 <img class="img-fluid w-100" src="/Admin/Public/GetImage.ashx?Image=@productImage&width=345&height=300&background=ffffff&format=webP&Compression=75&fillcanvas=true" alt="@productName"> 729 730 731 </picture> 732 } 733 734 735 <div class="h-100 d-flex flex-column result-item__product-content"> 736 <div class="d-flex flex-row"> 737 <div class="d-flex flex-column mb-3" onclick="window.location = '@productUrl';" style="cursor:pointer"> 738 <div class="product-item__title">@productName</div> 739 <div class="product-item__description"> 740 @Translate("ProductNumber", "Varenummer") @item.GetString("Ecom:Product.Number") 741 @if ((jungStockAmount > 0 && jungStockAmount < 3) || item.GetInteger("Ecom:Product.Stock") > 0) 742 { 743 <svg height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg> 744 745 if (mainUserHeader != null && mainUserHeader.HasGroup(24)) 746 { 747 <span> 748 &nbsp; 749 (@item.GetInteger("Ecom:Product.Stock") @Translate("stk.")) 750 </span> 751 } 752 } 753 </div> 754 @{ 755 if (minQuantity > 1) 756 { 757 <div><strong>@Translate("Minimumskøb:", "Minimumskøb:")</strong> @minQuantity @Translate("stk.")</div> 758 } 759 } 760 @foreach (LoopItem subItem in item.GetLoop("Order.OrderLineFields")) 761 { 762 <div class="product-item__description"> 763 @if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "DeliveryPromised") 764 { 765 @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value") 766 } 767 else if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "customSizeAdded") 768 { 769 @Translate("customSize", "Størrelse") @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")<span>mm</span> 770 } 771 </div> 772 } 773 774 @if (mainUserHeader != null && mainUserHeader.HasGroup(24) && !isSmallSpot) 775 { 776 string image = VestjyskMarketing.Helpers.ImageHelper.ResizeImage(new ResizeImageSettings() 777 { 778 Image = "/Files/Files/Images/img_calculator.png", 779 Height = 96, 780 Width = 96, 781 Quality = 85 782 }); 783 784 string salesPrice = item.GetDouble("Ecom:Product.DBPrice").ToString("F2"); 785 string webPrice = salesPrice; 786 string webDiscount = Dynamicweb.Core.Converter.ToDouble(productApi.GetProductFieldValue("WebDiscount")).ToString("F2"); 787 string cost = Dynamicweb.Core.Converter.ToString(productApi.Cost); 788 string externalNumber = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ExterntNummer")); 789 string manufacturer = productApi.Manufacturer != null ? productApi.Manufacturer.Name : ""; 790 string discountGroup = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ItemDiscGroup")); 791 792 foreach (var priceFromMatrix in productApi.Prices) 793 { 794 if (Helpers.Product.IsPriceValid(priceFromMatrix)) 795 { 796 webPrice = priceFromMatrix.Amount.ToString("F2"); 797 } 798 } 799 800 <div class="d-flex flex-row align-items-end"> 801 <div> 802 <div class="text-center" style="font-size: 10px;"> 803 @Translate("Salgspris", "Salgspris"): @salesPrice 804 </div> 805 806 <div class="text-center" style="font-size: 10px;"> 807 @Translate("Webpris", "Webpris"): @webPrice 808 </div> 809 </div> 810 <div class="product-item__details ml-6"> 811 <img src="@image" class="product-item__details__image"> 812 <div class="product-item__details__tooltip"> 813 <div class="row"> 814 <div class="col-7"> 815 @Translate("Salgspris", "Salgspris"): 816 </div> 817 <div class="col-5"> 818 @salesPrice 819 </div> 820 <div class="col-7"> 821 @Translate("Webrabat", "Webrabat") %: 822 </div> 823 <div class="col-5"> 824 @webDiscount 825 </div> 826 <div class="col-7"> 827 @Translate("Webpris", "Webpris"): 828 </div> 829 <div class="col-5"> 830 @webPrice 831 </div> 832 <div class="col-7"> 833 @Translate("Cost", "Kostpris"): 834 </div> 835 <div class="col-5"> 836 @cost 837 </div> 838 <div class="col-7"> 839 @Translate("Manufacturer's number", "Leverandørens varenr"): 840 </div> 841 <div class="col-5"> 842 @externalNumber 843 </div> 844 <div class="col-7"> 845 @Translate("Manufacturer", "Levenrandør"): 846 </div> 847 <div class="col-5"> 848 @manufacturer 849 </div> 850 <div class="col-7"> 851 @Translate("DiscountGroup", "Varerabatgruppe"): 852 </div> 853 <div class="col-5"> 854 @discountGroup 855 </div> 856 </div> 857 </div> 858 </div> 859 </div> 860 } 861 </div> 862 </div> 863 <div class="d-flex flex-row mt-auto align-items-center justify-content-start"> 864 <input type="hidden" name="ProdId" class="js-reorder-product-id" value="@item.GetString("Ecom:Product.ID")" /> 865 @if (loopName != "Products") 866 { 867 <div class="input-group product-item__quantity-wrapper"> 868 <span class="input-group-btn"> 869 @if (checkoutPage) 870 { 871 <a href="@item.GetString("Ecom:Order:OrderLine.DecrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-minus"></span></a> 872 } 873 else 874 { 875 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.DecrementLink")"><span class="icon icon-minus"></span></a> 876 } 877 </span> 878 <input id="Quantity" type="text" autocomplete="off" class="form-control text-center js-quantity-input" name="Quantity" min="@minQuantity" value="@item.GetString("Ecom:Order:OrderLine.Quantity")" data-step="@quantityStep" data-type="order"> 879 <span class="input-group-btn"> 880 @if (checkoutPage) 881 { 882 <a href="@item.GetString("Ecom:Order:OrderLine.IncrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-plus"></span></a> 883 } 884 else 885 { 886 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.IncrementLink")"><span class="icon icon-plus"></span></a> 887 } 888 889 </span> 890 </div> 891 } 892 else if (!hasCombinations) 893 { 894 <div class="input-group product-item__quantity-wrapper d-md-none"> 895 <span class="input-group-btn"> 896 <button class="btn btn-buy js-reorder-quantity-subtract" type="button"><span class="icon icon-minus"></span></button> 897 </span> 898 <input type="text" autocomplete="off" class="form-control text-center js-reorder-quantity-input" name="Quantity" min="0" max="20" value="1"> 899 <span class="input-group-btn"> 900 <button class="btn btn-buy js-reorder-quantity-add" type="button"><span class="icon icon-plus"></span></button> 901 </span> 902 </div> 903 } 904 905 906 @if (productFabrikat != "leitz") 907 { 908 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer"> 909 @if (false) //TODO campaign prices 910 { 911 <div class="product-details__price-container"> 912 @if (hasCombinations && loopName != "OrderLines") 913 { 914 <div class="from-price">@Translate("ProductFromPrice", "Fra")</div> 915 } 916 <div>@item.GetString("Ecom:Product.Discount.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div> 917 <div class="product-item__price--old">@item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div> 918 </div> 919 } 920 else 921 { 922 if (hasCombinations && loopName != "OrderLines") 923 { 924 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div> 925 } 926 927 <div class="without-discount"> 928 @if (loopName == "OrderLines") 929 { 930 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-") 931 } 932 else 933 { 934 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-") 935 } 936 </div> 937 } 938 </div> 939 } 940 else if (User.IsExtranetUserLoggedIn()) 941 { 942 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer"> 943 944 @if (hasCombinations && loopName != "OrderLines") 945 { 946 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div> 947 } 948 949 <div class="without-discount"> 950 @if (loopName == "OrderLines") 951 { 952 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-") 953 } 954 else 955 { 956 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-") 957 } 958 </div> 959 960 </div> 961 } 962 963 @if (loopName == "Products") 964 { 965 if (productFabrikat != "leitz" || User.IsExtranetUserLoggedIn()) 966 { 967 <div class="product-item__infowrapper d-inline-block ml-auto flex-row no-wrap"> 968 <button type="button" class="btn btn-link mr-2 align-self-end px-4 d-none d-md-inline-block" onclick="window.location = '@productUrl';">INFO</button> 969 @if (!hasCombinations) 970 { 971 <button type="submit" class="js-reorder-add-to-basket w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none"> 972 <span class="icon icon-cart mr-4"></span> 973 </button> 974 } 975 else 976 { 977 <button type="submit" class="w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none" onclick="window.location = '@productUrl';"> 978 <span class="icon icon-cart mr-4"></span> 979 </button> 980 } 981 <button type="button" class="btn btn-success align-self-end px-4 d-none d-md-inline-block" onclick="window.location = '@productUrl';"><span class="icon icon-shopping-cart mr-2"></span>BESTIL</button> 982 983 984 </div> 985 } 986 else 987 { 988 989 <div class="d-flex"> 990 991 <div class="align-self-end px-4 d-none d-md-inline-block" style="font-size: 12px">Log ind for at se prisen</div> 992 993 <button type="button" class="btn btn-success align-self-end px-4 d-md-inline-block js-aside-btn" href="#" data-view="login">@Translate("HeaderLoginButton", "Login")</button> 994 995 </div> 996 997 998 } 999 1000 1001 } 1002 </div> 1003 1004 @if (loopName == "Products") 1005 { 1006 if (prices.Count > 1 && false) 1007 { 1008 int counterPrices = 0; 1009 string marginLeft = string.Empty; 1010 <div class="d-flex flex-column my-5 mb-md-7 font-weight-bolder "> 1011 <h4 class="font-weight-bold"> 1012 Køb flere og spar: 1013 </h4> 1014 1015 <div> 1016 <div class="font-small d-flex flex-column flex-lg-row"> 1017 1018 @foreach (Dynamicweb.Ecommerce.Prices.Price priceInMatrix in prices.OrderBy(x => x.Quantity)) 1019 { 1020 if (!Helpers.Product.IsCampaingPrice(priceInMatrix) && Helpers.Product.IsPriceValid(priceInMatrix) && priceInMatrix.Quantity > 1) 1021 { 1022 if (counterPrices > 0) 1023 { 1024 marginLeft = "ml-lg-3"; 1025 } 1026 double productPriceDouble = item.GetDouble("Ecom:Product.Price.PriceWithoutVAT"); 1027 double percentageSaved = (productPriceDouble - priceInMatrix.Amount) / productPriceDouble * 100; 1028 <div class="d-flex flex-row @marginLeft"> 1029 <span class="text-success"> 1030 @priceInMatrix.Quantity stk. af @priceInMatrix.Amount,- 1031 </span> 1032 <span class="text-danger ml-2"> 1033 Du sparer @Math.Round(percentageSaved)% 1034 </span> 1035 </div> 1036 counterPrices++; 1037 } 1038 } 1039 </div> 1040 </div> 1041 </div> 1042 } 1043 } 1044 </div> 1045 } 1046 } 1047 @helper RenderProductListNew(string loopName, int limit = 0, bool isSmallSpot = false, bool productPage = false, List<Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>.LoopItem> newLoop = null) 1048 { 1049 var loop = GetLoop(loopName); 1050 1051 1052 1053 if (newLoop != null) 1054 { 1055 loop = newLoop; 1056 } 1057 1058 //fetch pages from shop 1059 var pageService = new Dynamicweb.Content.PageService(); 1060 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" }); 1061 1062 foreach (LoopItem item in limit == 0 ? loop : loop.Take(limit)) 1063 { 1064 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"))) 1065 { 1066 //set URL for page. To get correct URL all places in regards to list 1067 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 1068 int pageId = 0; 1069 foreach (var page in pages) 1070 { 1071 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]); 1072 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID)) 1073 { 1074 pageId = page.ID; 1075 break; 1076 } 1077 } 1078 string productPageUrl = "/Default.aspx?ID=" + pageId + "&amp;ProductID=" + item.GetString("Ecom:Product.ID"); 1079 if (pageId == 0) 1080 { 1081 productPageUrl = item.GetString("Ecom:Product.Link.Clean"); 1082 } 1083 1084 var cols = "col-md-6 col-lg-4"; 1085 1086 if (productPage) 1087 { 1088 cols = "col-md-6 col-lg-3"; 1089 } 1090 1091 if (loopName.Equals("Products") || loopName.Equals("Item.ProductDisplay")) 1092 { 1093 1094 1095 1096 1097 1098 //get campaign name 1099 string campaignName = ""; 1100 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true); 1101 var prices = productApi.Prices; 1102 foreach (var priceFromMatrix in productApi.Prices) 1103 { 1104 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value")) 1105 { 1106 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name; 1107 } 1108 } 1109 1110 1111 <div class="@cols d-none d-md-flex js-product-list-item position-relative" style="padding: 8px 8px 0 8px; justify-content: center;"> 1112 <span href="@productPageUrl" class="product-item mb-3 box-shadow-sm box-shadow-sm-hoover" style="width: 100%; padding: 10px; position: relative;"> 1113 @if (!string.IsNullOrEmpty(campaignName)) 1114 { 1115 <div onclick="window.location = '@productPageUrl'" class="campaign-container" style="position: absolute; height: 120px; top: 0; left: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center;"> 1116 <img src="/Admin/Public/GetImage.ashx?Image=/Files/Files/Images/discount_label2.png&Format=png&Width=587&Height=628&Resolution=99&Crop=0" style="height: 120px;"> 1117 <div class="text-uppercase" style="margin-bottom: 39px; font-size: 12px; margin-right: 30px; color: white; font-weight: 600; position: absolute; z-index: 5; transform: rotate(-46deg); transform-origin: center center; white-space: nowrap">@Translate("Campaign-" + campaignName, campaignName)</div> 1118 </div> 1119 1120 } 1121 @ContentRenderingNew(item, loopName, false, productPageUrl) 1122 </span> 1123 </div> 1124 <span href="@productPageUrl" class="d-flex d-md-none product-item mb-3 box-shadow-sm box-shadow-sm-hoover" style="width: 100%; padding: 10px; z-index: 1; position: relative;"> 1125 @if (!string.IsNullOrEmpty(campaignName)) 1126 { 1127 <div onclick="window.location = '@productPageUrl'" class="campaign-container" style="position: absolute; height: 120px; top: 0; left: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center;"> 1128 <img src="/Admin/Public/GetImage.ashx?Image=/Files/Files/Images/discount_label2.png&Format=png&Width=587&Height=628&Resolution=99&Crop=0" style="height: 120px;"> 1129 <div class="text-uppercase" style="margin-bottom: 39px; font-size: 12px; margin-right: 30px; color: white; font-weight: 600; position: absolute; z-index: 5; transform: rotate(-46deg); transform-origin: center center; white-space: nowrap">@Translate("Campaign-" + campaignName, campaignName)</div> 1130 </div> 1131 1132 } 1133 @ContentRenderingNew(item, loopName, false, productPageUrl) 1134 </span> 1135 1136 } 1137 else 1138 { 1139 1140 <a href="@productPageUrl" class="product-item mb-3 box-shadow-sm box-shadow-sm-hoover js-product-list-item"> 1141 @ContentRenderingNew(item, loopName, false, productPageUrl) 1142 </a> 1143 1144 } 1145 1146 } 1147 } 1148 } 1149 @helper RenderProductList(string loopName, int limit = 0, bool isSmallSpot = false, bool isSearch = false) 1150 { 1151 var loop = GetLoop(loopName); 1152 1153 //fetch pages from shop 1154 var pageService = new Dynamicweb.Content.PageService(); 1155 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" }); 1156 var productService = new ProductService(); 1157 1158 foreach (LoopItem item in limit == 0 ? loop : loop.Take(limit)) 1159 { 1160 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"))) 1161 { 1162 //set URL for page. To get correct URL all places in regards to list 1163 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 1164 int pageId = 0; 1165 foreach (var page in pages) 1166 { 1167 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]); 1168 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID)) 1169 { 1170 pageId = page.ID; 1171 break; 1172 } 1173 } 1174 string productPageUrl = "/Default.aspx?ID=" + pageId + "&amp;ProductID=" + item.GetString("Ecom:Product.ID"); 1175 if (pageId == 0) 1176 { 1177 productPageUrl = item.GetString("Ecom:Product.Link.Clean"); 1178 } 1179 1180 if (loopName.Equals("Products")) 1181 { 1182 1183 1184 var displays = isSearch ? "" : "d-flex d-md-none"; 1185 1186 <span href="@productPageUrl" class="@displays product-item mb-3 box-shadow-sm box-shadow-sm-hoover js-product-list-item"> 1187 @ContentRendering(item, loopName, false, productPageUrl) 1188 <a href="@productPageUrl" class="product-item__label d-md-none"> 1189 <span>@Translate("Læs mere")</span> 1190 </a> 1191 </span> 1192 } 1193 } 1194 } 1195 } 1196 1197 1198 <div class="product-list"> 1199 <div class="container-fluid"> 1200 <div class="row no-gutters"> 1201 <div class="col-12 col-md-4 col-lg-3"> 1202 <div class="d-none d-md-block"> 1203 <div class="filters-login d-flex flex-column"> 1204 @if (string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.Email"))) 1205 { 1206 <h4 class="mb-5">@Translate("login-teaser-text", "Log ind for at se dine nettopriser")</h4> 1207 <div> 1208 <button type="button" class="btn btn-sm btn-outline-primary px-4 d-md-none"><span class="icon icon-user"></span> @Translate("login-text", "LOG IND")</button> 1209 <button type="button" class="btn btn-outline-primary px-4 d-none d-md-inline-block js-aside-btn" href="#" data-view="login"><span class="icon icon-user"></span> @Translate("logout", "LOG IND")</button> 1210 </div> 1211 <hr class="w-100 my-7" /> 1212 } 1213 </div> 1214 1215 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any()))) 1216 { 1217 <div class="filters-list d-flex flex-column"> 1218 <!-- 1219 <span class="mb-7 h2">@Translate("ecom-product-filter", "Product filter")</span> 1220 --> 1221 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any()))) 1222 { 1223 var getCurrentPageId = new Dynamicweb.Content.Page(); 1224 var getFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(getCurrentPageId.ParentPageId); 1225 string producturl = getFriendlyUrl.ToString(); 1226 <div class="filter js-ajax-refresh"> 1227 <div class="filter__container"> 1228 <form class="filter__form js-filter-form" action="@producturl" method="GET"> 1229 1230 @foreach (LoopItem facetGroupLoop in GetLoop("FacetGroups")) 1231 { 1232 foreach (LoopItem facetItem in facetGroupLoop.GetLoop("Facets")) 1233 { 1234 1235 if (!facetItem.GetLoop("FacetOptions").Any()) 1236 { 1237 continue; 1238 } 1239 1240 string FacetName = facetItem.GetString("Facet.Name"); 1241 string FacetQueryParameter = facetItem.GetString("Facet.QueryParameter"); 1242 string isActive = facetItem.GetLoop("FacetOptions").Exists(item => item.GetBoolean("FacetOption.Selected")) ? "is-mobile-active" : null; 1243 bool isCollapse = facetItem.GetLoop("FacetOptions").Count > 5; 1244 1245 <div class="d-flex flex-column "> 1246 <div class=""> 1247 <div class="filter-list__facets mb-2 js-filter-list-@FacetQueryParameter"> 1248 <span class="mb-5 h4 @isActive">@Translate(FacetName, FacetName)</span> 1249 @{ 1250 1251 bool first = true; 1252 var mt = ""; 1253 1254 } 1255 1256 @foreach (LoopItem FacetOption in facetItem.GetLoop("FacetOptions")) 1257 { 1258 string FacetOptionValue = FacetOption.GetString("FacetOption.Value"); 1259 string FacetOptionName = FacetOption.GetString("FacetOption.Name"); 1260 string FacetOptionLabel = (FacetOption.GetString("FacetOption.Label") == "True" || FacetOption.GetString("FacetOption.Label") == "False" ? Translate(FacetOption.GetString("FacetOption.Label")) : FacetOption.GetString("FacetOption.Label")); 1261 var state = FacetOption.GetBoolean("FacetOption.Selected") ? "checked='true'" : null; 1262 int FacetCounter = FacetOption.GetInteger("FacetOption.Count"); 1263 if (!string.IsNullOrEmpty(FacetOptionValue) && !string.IsNullOrEmpty(FacetOptionName) && FacetOptionValue != "0" && FacetOptionValue != "00" && FacetOptionName != "0" && FacetOptionName != "00" && !string.IsNullOrEmpty(FacetOptionValue) && FacetOptionValue != "0") 1264 { 1265 1266 if (first) 1267 { 1268 1269 mt = "mt-5"; 1270 } 1271 else 1272 { 1273 mt = ""; 1274 } 1275 1276 <div class="form-check @mt"> 1277 <div class="custom-control custom-checkbox p-0 w-100 "> 1278 <input type="checkbox" data-name="@FacetOptionLabel" name="@FacetQueryParameter" class="custom-control-input js-filter__input js-apply-filter" id="@FacetQueryParameter@FacetOptionValue" value="[@FacetOptionValue]" @state> 1279 <label class="custom-control-label d-flex custom-checkbox" for="@FacetQueryParameter@FacetOptionValue"> 1280 <span class="custom-control-description">@FacetOptionLabel</span> 1281 <span class="custom-control-underline"></span> 1282 <span class="custom-control-count">@FacetCounter</span> 1283 </label> 1284 </div> 1285 </div> 1286 1287 first = false; 1288 } 1289 } 1290 </div> 1291 <button class="@(!isCollapse ? "d-none" : "js-toggle-class") btn btn-more-filters float-right pr-0 pl-2 p-0 btnout" type="button" data-view-more="@Translate("ecom-show-more")" data-view-less="@Translate("ecom-show-less")" data-target=".js-filter-list-@FacetQueryParameter"><span class="icon icon-chevron-right mr-3"></span><span class="js-toggle-translation">@Translate("ecom-show-more")</span></button> 1292 </div> 1293 </div> 1294 } 1295 } 1296 1297 1298 1299 1300 </form> 1301 </div> 1302 </div> 1303 } 1304 </div> 1305 } 1306 </div> 1307 @if (facetGroup.Any()) 1308 { 1309 <div class="d-md-none"> 1310 <div class="js-append-filter"></div> 1311 <button type="button" class="btn btn-primary align-self-end px-4 mb-7 w-100 js-aside-btn js-filter-panel-button" data-view="filters"><small class="d-md-none">@Translate("ecom-filter-headline-mobile", "FILTER")</small><span class="icon icon-settings mr-4"></span><small class="d-none d-md-block">@Translate("ecom-filter-headline", "PRODUKTFILTER")</small></button> 1312 </div> 1313 } 1314 </div> 1315 <div class="col-12 col-md-8 pl-md-4 pl-lg-0 col-lg-8 ml-auto"> 1316 <div class="d-flex flex-column flex-lg-row align-items-center mb-5 mb-md-7"> 1317 <span class="h2">@Translate("ecom-filter-text-one", "Vi fandt") <span class="text-secondary"><span class="js-result-counter">@GetString("Ecom:ProductList.PageProdCnt")</span> @Translate("ecom-filter-text-two", "produkter")</span> @Translate("ecom-filter-text-three", "der matcher")</span> 1318 @{ 1319 var path = GetGlobalValue("Global:Pageview.Url"); 1320 if (path.IndexOf("?") != -1) 1321 { 1322 path = path.Substring(0, path.IndexOf("?")); 1323 } 1324 } 1325 <div class="product-list__sorting d-flex flex-row align-items-center ml-lg-auto"> 1326 <div class="product-list__sorting-title">@Translate("Sorter efter", "Sorter efter")</div> 1327 <div class="product-list__sorting-select"> 1328 1329 <form name="sorting" method="GET" action="@path" class="js-product-list-sorting"> 1330 <select class="custom-select js-product-list-sorting-sort-by"> 1331 <option @(GetString("Ecom:ProductList.SortBy") == "SortingField" ? "selected" : "") value="SortBy=Created&SortOrder=DESC">@Translate("Vælg sortering", "Vælg sortering")</option> 1332 <option @(GetString("Ecom:ProductList.SortBy") == "SortBy=Price&SortOrder=ASC" ? "selected" : "") value="SortBy=Price&SortOrder=ASC">@Translate("Billigste Pris", "Billigste Pris")</option> 1333 <option @(GetString("Ecom:ProductList.SortBy") == "SortBy=Stock&SortOrder=DESC" ? "selected" : "") value="SortBy=Stock&SortOrder=DESC">@Translate("På lager", "På lager")</option> 1334 </select> 1335 </form> 1336 <span class="icon icon-chevron-down"></span> 1337 </div> 1338 </div> 1339 1340 </div> 1341 <div class="d-block d-md-none p-0"> 1342 <div class="p-0 list-unstyled js-product-list js-product-list-loader" data-page-url="@pathName"> 1343 @RenderProductList("Products") 1344 @if( GetInteger("Ecom:ProductList.TotalPages") > 1 ) 1345 { 1346 <div class="product-list__pagination js-product-list-item"> 1347 <a class="product-list__previous-button @(!string.IsNullOrWhiteSpace(prevPage) ? "is-active" : null)" data-icon="arrow-left" href="@(!string.IsNullOrWhiteSpace(prevPage) ? prevPage : null)"></a> 1348 <div class="product-list__counter-wrapper"> 1349 <select id="pageSelector" class="product-list__counter js-select"> 1350 <option>@Translate("productlist-count-text", "Page") @GetString("Ecom:ProductList.CurrentPage") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option> 1351 @foreach (LoopItem page in GetLoop("Ecom:ProductList.Pages")) 1352 { 1353 string pageUrl = page.GetString("Ecom:ProductList.Pages.Page.Url"); 1354 <option class="pagination__item" value="@pageUrl">@Translate("productlist-count-text", "Page") @page.GetValue("Ecom:ProductList.Pages.Page.Number") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option> 1355 } 1356 </select> 1357 </div> 1358 <a class="product-list__next-button @(!string.IsNullOrWhiteSpace(nextPage) ? "is-active" : null)" data-icon="arrow-right" href="@(!string.IsNullOrWhiteSpace(nextPage) ? nextPage : null)"></a> 1359 </div> 1360 } 1361 1362 <script> 1363 document.addEventListener('DOMContentLoaded', function() { 1364 document.body.addEventListener('change', function(event) { 1365 var element = event.target; 1366 if (element && element.id === 'pageSelector') { 1367 var url = element.value; 1368 if (url) { 1369 window.location.href = url; 1370 } 1371 } 1372 }); 1373 }); 1374 </script> 1375 1376 </div> 1377 </div> 1378 <div class="d-none d-md-block p-0"> 1379 <div style="flex-flow: wrap; justify-content: start" class="p-0 d-flex list-unstyled js-product-list js-product-list-loader col-12" data-page-url="@pathName"> 1380 @RenderProductListNew("Products") 1381 @if( GetInteger("Ecom:ProductList.TotalPages") > 1 ) 1382 { 1383 <div class="product-list__pagination js-product-list-item"> 1384 <a class="product-list__previous-button @(!string.IsNullOrWhiteSpace(prevPage) ? "is-active" : null)" data-icon="arrow-left" href="@(!string.IsNullOrWhiteSpace(prevPage) ? prevPage : null)"></a> 1385 <div class="product-list__counter-wrapper"> 1386 <select id="pageSelector" class="product-list__counter js-select"> 1387 <option>@Translate("productlist-count-text", "Page") @GetString("Ecom:ProductList.CurrentPage") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option> 1388 @foreach (LoopItem page in GetLoop("Ecom:ProductList.Pages")) 1389 { 1390 string pageUrl = page.GetString("Ecom:ProductList.Pages.Page.Url"); 1391 <option class="pagination__item" value="@pageUrl">@Translate("productlist-count-text", "Page") @page.GetValue("Ecom:ProductList.Pages.Page.Number") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option> 1392 } 1393 </select> 1394 </div> 1395 <a class="product-list__next-button @(!string.IsNullOrWhiteSpace(nextPage) ? "is-active" : null)" data-icon="arrow-right" href="@(!string.IsNullOrWhiteSpace(nextPage) ? nextPage : null)"></a> 1396 </div> 1397 } 1398 1399 <script> 1400 document.addEventListener('DOMContentLoaded', function() { 1401 document.body.addEventListener('change', function(event) { 1402 var element = event.target; 1403 if (element && element.id === 'pageSelector') { 1404 var url = element.value; 1405 if (url) { 1406 window.location.href = url; 1407 } 1408 } 1409 }); 1410 }); 1411 </script> 1412 1413 </div> 1414 </div> 1415 1416 @if (GetInteger("Ecom:ProductList.PageProdCnt") == 0) 1417 { 1418 var pageId = GetInteger("Ecom:ProductList:Page.ID"); 1419 var page = pageService.GetPage(pageId); 1420 1421 if (page.Item["FormToShowIfEmpty"] != null) 1422 { 1423 1424 if (page.Item["FormToShowIfEmpty"].ToString().Split('#').Length > 1) 1425 { 1426 var paragraphId = int.Parse(page.Item["FormToShowIfEmpty"].ToString().Split('#')[1]); 1427 @RenderParagraphContent(paragraphId) 1428 } 1429 1430 } 1431 1432 } 1433 1434 </div> 1435 </div> 1436 <span><p style="float:right;"><svg height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg> = Varen er p&aring lager</p></span> 1437 </div> 1438 </div> 1439 1440 1441 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any()))) 1442 { 1443 var getCurrentPageId = new Dynamicweb.Content.Page(); 1444 var getFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(getCurrentPageId.ParentPageId); 1445 string producturl = getFriendlyUrl.ToString(); 1446 <section class="aside-panel js-aside js-view-filters js-ajax-refresh-mobile"> 1447 <form class="filter__form js-filter-form-mobile" action="@producturl" method="GET"> 1448 <div class="aside-panel__bcg js-aside-bcg js-aside-close-btn" data-view="filters"></div> 1449 <div class="side-modal aside-panel__content flex-column js-view-filters"> 1450 <span class="mb-7 h2 filters-title"> 1451 <strong>@(Pageview.Page.MenuText)</strong><br/> 1452 @Translate("Filtrer efter", "Filtrer efter") 1453 </span> 1454 <button type="button" class="btn btn-link btn-close js-aside-close-btn" data-view="filters">@Translate("FilterCloseButton", "LUK") <span class="icon icon-close ml-2"></span></button> 1455 <div class="container-fluid aside-panel__container"> 1456 <div class="aside-panel__scroll-content"> 1457 <div class="filters-list d-flex flex-column"> 1458 1459 @{ 1460 int facetsCounter = 0; 1461 } 1462 1463 @foreach (LoopItem facetGroupLoop in GetLoop("FacetGroups")) 1464 { 1465 1466 foreach (LoopItem facetItem in facetGroupLoop.GetLoop("Facets")) 1467 { 1468 1469 if (!facetItem.GetLoop("FacetOptions").Any()) 1470 { 1471 continue; 1472 } 1473 1474 facetsCounter++; 1475 1476 string FacetName = facetItem.GetString("Facet.Name"); 1477 string FacetQueryParameter = facetItem.GetString("Facet.QueryParameter"); 1478 string isActive = facetItem.GetLoop("FacetOptions").Exists(item => item.GetBoolean("FacetOption.Selected")) ? "is-mobile-active" : null; 1479 bool isCollapse = true;//facetItem.GetLoop("FacetOptions").Count > 5; 1480 int FacetTotalCount = facetItem.GetInteger("Facet.OptionResultTotalCount"); // Facet.OptionCount Facet.OptionResultTotalCount Facet.OptionWithResultCount 1481 1482 1483 <div class="d-flex flex-column"> 1484 <div class="filter-list__facets js-filter-list-@FacetQueryParameter@(facetsCounter == 1 ? " is-active" : string.Empty)"> 1485 @foreach (LoopItem FacetOption in facetItem.GetLoop("FacetOptions").OrderBy(FacetOption => FacetOption.GetString("FacetOption.Label").Length).ThenBy(FacetOption => FacetOption.GetString("FacetOption.Label"))) 1486 { 1487 string FacetOptionValue = FacetOption.GetString("FacetOption.Value"); 1488 string FacetOptionName = FacetOption.GetString("FacetOption.Name"); 1489 string FacetOptionLabel = (FacetOption.GetString("FacetOption.Label") == "True" || FacetOption.GetString("FacetOption.Label") == "False" ? Translate(FacetOption.GetString("FacetOption.Label")) : FacetOption.GetString("FacetOption.Label")); 1490 var state = FacetOption.GetBoolean("FacetOption.Selected") ? "checked='true'" : null; 1491 int FacetCounter = FacetOption.GetInteger("FacetOption.Count"); 1492 1493 <div class="form-check"> 1494 <div class="custom-control custom-checkbox w-100"> 1495 <label class="custom-control-label d-flex js-filter-label" for="@FacetQueryParameter@FacetOptionValue"> 1496 <span class="custom-control-description">@FacetOptionLabel</span> 1497 <span class="custom-control-underline"></span> 1498 <span class="custom-control-count">@FacetCounter</span> 1499 </label> 1500 </div> 1501 </div> 1502 } 1503 </div> 1504 <div class="mb-md-10 mb-5"> 1505 <h4 class="mb-5">@Translate(FacetName, FacetName)</h4> 1506 <button class="@(!isCollapse ? " d-none" : "js-toggle-class" ) filter__show-filter btn btn-more-filters float-right pr-0 pl-2" type="button" data-reset=".filter-list__facets" data-target=".js-filter-list-@FacetQueryParameter"><span class="icon icon-chevron-right mr-3"></span>@Translate("ecom-show-more")</button> 1507 <span>@FacetTotalCount</span> 1508 </div> 1509 </div> 1510 } 1511 } 1512 </div> 1513 </div> 1514 </div> 1515 <div class="px-5 pb-4"> 1516 <button type="reset" class="btn btn-primary btn-lg align-self-end px-4 mb-4 w-100 js-aside-close-btn" onclick="window.location = '/Default.aspx?Id=@(Pageview.Page.ID.ToString())';">@Translate("FilterResetButtonTextMobile", "NULSTIL")</button> 1517 <button type="button" class="btn btn-primary btn-lg align-self-end px-4 mb-4 w-100 js-aside-close-btn" data-view="filters">@Translate("FilterApplyButtonTextMobile", "ANVEND FILTER")</button> 1518 </div> 1519 </div> 1520 </form> 1521 </section> 1522 } 1523 1524 1525 @SnippetStart("BeforeBodyEndScripts") 1526 1527 @if (products.Count > 0) 1528 { 1529 <script> 1530 document.addEventListener("DOMContentLoaded", function () { 1531 var listitemLd = 1532 { 1533 "@@context": "https://schema.org/", 1534 "@@type": "ItemList", 1535 "itemListElement": [ 1536 @foreach (var productScheme in products) 1537 { 1538 1539 //URL 1540 string host = "https://" + GetGlobalValue("Global:Request.Host"); 1541 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(productScheme.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 1542 int pageId = 0; 1543 foreach (var page in pages) 1544 { 1545 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]); 1546 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID)) 1547 { 1548 pageId = page.ID; 1549 break; 1550 } 1551 } 1552 1553 string productUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + pageId + "&ProductID=" + productScheme.GetString("Ecom:Product.ID")); 1554 if (pageId == 0) 1555 { 1556 productUrl = productScheme.GetString("Ecom:Product.Link.Clean"); 1557 } 1558 1559 productUrl = host + productUrl; 1560 1561 //image 1562 string productImage = "/Files/System/Images/Shop/na-image.jpg"; 1563 string getImageForProductList = group.LargeImage; 1564 string myFormat = string.Format("/Files/{0}", getImageForProductList); 1565 1566 if (!string.IsNullOrEmpty(productScheme.GetString("Ecom:Product.ImageNZProductImage.Clean"))) 1567 { 1568 productImage = productScheme.GetString("Ecom:Product.ImageNZProductImage.Clean"); 1569 } 1570 else if (!string.IsNullOrEmpty(getImageForProductList)) 1571 { 1572 productImage = myFormat; 1573 } 1574 productImage = host + productImage; 1575 1576 string availability = ""; 1577 double productStock = productScheme.GetDouble("Ecom:Product.Stock"); 1578 1579 if (productStock > 0) 1580 { 1581 availability = "https://schema.org/InStock"; 1582 } 1583 else 1584 { 1585 availability = "https://schema.org/OutOfStock"; 1586 } 1587 1588 1589 1590 <text> 1591 { 1592 "@@type": "ListItem", 1593 "position": @productScheme.Index, 1594 "item": { 1595 "@@type": "Product", 1596 "name": "@productScheme.GetString("Ecom:Product.Name")", 1597 "url": "@productUrl", 1598 "image": "@productImage", 1599 "offers": { 1600 "@@type": "Offer", 1601 "priceCurrency": "@productScheme.GetString("Ecom:Product.Currency.Code")", 1602 "availability": "@availability", 1603 "price": @Dynamicweb.Core.Converter.ToString(productScheme.GetDouble("Ecom:Product.Price.PriceWithoutVAT")).Replace(",", ".") 1604 } 1605 } 1606 }, 1607 </text> 1608 } 1609 ] 1610 } 1611 1612 var jsonLdScript = document.createElement('script'); 1613 jsonLdScript.type = 'application/ld+json'; 1614 jsonLdScript.text = JSON.stringify(listitemLd); 1615 document.head.appendChild(jsonLdScript); 1616 }); 1617 </script> 1618 } 1619 @SnippetEnd("BeforeBodyEndScripts")
Kontakt Junget
Det kræver både visioner og erfaring at skabe kundetilpassede maskin-, værktøjs- og slibeløsninger til industrien, men hos Junget har vi begge dele. Ring til Junget på +45 89365500. - Sammen finder vi en løsning.
Find en medarbejder for direkte kontakt
Poul Thøgersen
Poul Thøgersen
Udviklingsdirektør +45 20 20 61 37 pth@junget.dk
Steen Hansen
Steen Hansen
Key Account Manager +45 20 20 63 37 sh@junget.dk
Ulrik Søe
Ulrik Søe
Key Account Manager +45 20 20 61 76 us@junget.dk
Poul Erik Haurum
Poul Erik Haurum
Key Account Manager +45 25 59 58 89 peh@junget.dk
Ole Thulstrup Pedersen
Ole Thulstrup Pedersen
Key Account Manager +45 21 21 49 85 Otp@junget.dk
Karsten Lund
Karsten Lund
Key Account Manager +45 89 36 55 02 klu@junget.dk
Michael Hald Laursen
Michael Hald Laursen
Projektleder +45 20 20 63 56 mhl@junget.dk
Mark Andersen
Mark Andersen
Key Account Manager +45 23 24 87 89 maa@junget.dk
Mikkel  Borg Nielsen
Mikkel Borg Nielsen
Projektleder +45 89 36 55 04 mbn@junget.dk
Line Ravn Jensen
Line Ravn Jensen
Projektleder +45 89 36 55 21 lj@junget.dk
Mads Mailund Mikkelsen
Mads Mailund Mikkelsen
Software ingeniør +45 89 36 55 75 mmm@junget.dk
Mikael Lundqvist
Mikael Lundqvist
Software ingeniør +45 89 36 55 05 ml@junget.dk
Thomas Lykke Mindedahl
Thomas Lykke Mindedahl
Software ingeniør +45 89 36 55 92 tlm@junget.dk
Emil Overgaard Lassen
Emil Overgaard Lassen
Servicechef +45 89 36 55 31 eol@junget.dk
Jan R. Andersen
Jan R. Andersen
Servicekoordinator +45 89 36 55 10 jro@junget.dk
Michael Hald Laursen
Michael Hald Laursen
Projektleder +45 20 20 63 56 mhl@junget.dk
Jesper Lund Hansen
Jesper Lund Hansen
Projektleder +45 89 36 55 34 jlh@junget.dk
Klaus B. Petersen
Klaus B. Petersen
Key Account Service +45 89 36 55 11 kbp@junget.dk
Henrik Jespersen
Henrik Jespersen
Reservedele +45 89 36 55 15 hje@junget.dk
Kristian Dolmer
Kristian Dolmer
Reservedele +45 89 36 55 28 kdo@junget.dk
Lars Pedersen
Lars Pedersen
Servicetekniker +45 89 36 55 77 lp@junget.dk
Ivan Bach
Ivan Bach
Servicetekniker +45 89 36 55 57 Inb@junget.dk
Morten Jensen
Morten Jensen
Servicetekniker +45 89 36 55 74 moj@junget.dk
Jan Rasmussen
Jan Rasmussen
Servicetekniker +45 89 36 55 58 jra@junget.dk
Hans Jacobsen
Hans Jacobsen
Servicetekniker +45 89 36 55 51 hj@junget.dk
Mikael Libner
Mikael Libner
Servicetekniker +45 89 36 55 56 mil@junget.dk
Nick M. Bunkenborg
Nick M. Bunkenborg
Servicetekniker +45 89 36 55 36 nmb@junget.dk
Allan S. Mortensen
Allan S. Mortensen
Servicetekniker +45 89 36 55 37 asm@junget.dk
Martin Jørgensen
Martin Jørgensen
Servicetekniker +45 89 36 55 59 mj@junget.dk
Søren Nilaus
Søren Nilaus
Servicetekniker +45 89 36 55 78 smn@junget.dk
Oliver Ditlevsen
Oliver Ditlevsen
Servicetekniker +45 89 36 55 29 odi@junget.dk
Mads Mailund Mikkelsen
Mads Mailund Mikkelsen
Software ingeniør +45 89 36 55 75 mmm@junget.dk
Mikael Lundqvist
Mikael Lundqvist
Software ingeniør +45 89 36 55 05 ml@junget.dk
Thomas Lykke Mindedahl
Thomas Lykke Mindedahl
Software ingeniør +45 89 36 55 92 tlm@junget.dk
Martin Andersen
Martin Andersen
Salgschef - Ekstern salg +45 89 36 55 63 man@junget.dk
Mads A. Mønsted
Mads A. Mønsted
Afdelingschef - Intern salg +45 89 36 55 07 mam@junget.dk
Jesper Andersen
Jesper Andersen
Key Account - Tooling +45 89 36 55 18 jea@junget.dk
Preben Kristensen
Preben Kristensen
Key Account - Tooling +45 40 19 33 99 pkr@junget.dk
Ulrich Spliid
Ulrich Spliid
Key Account - Tooling +45 20 20 61 53 uls@junget.dk
Jan Thomassen
Jan Thomassen
Værktøjs- og slibekonsulent- Sjælland +45 89 36 55 66 jct@junget.dk
Jan Flaathen Hansen
Jan Flaathen Hansen
Salgskonsulent +45 89 36 55 72 jfh@junget.dk
Even H. Rasmussen
Even H. Rasmussen
Salgskonsulent - Junget Norge +47 905 81 830 even@junget.dk
Knud Lauge Sørensen
Knud Lauge Sørensen
Salgskonsulent, Intern Værktøj +45 89 36 55 62 kls@junget.dk
Christian Krogh Hansen
Christian Krogh Hansen
Salgskonsulent, Intern Værktøj +45 89 36 55 67 ckh@junget.dk
Finn Jensen
Finn Jensen
Konstruktør +45 89 36 55 08 fij@junget.dk
Trine Johansen
Trine Johansen
Kontorassistent +45 89 36 55 20 tjo@junget.dk
Jakob Ravn
Jakob Ravn
Produktionschef +45 89 36 55 38 jar@junget.dk
Lone Knudsen
Lone Knudsen
Indkøbsansvarlig, Værktøj +45 89 36 55 14 lkn@junget.dk
Kenneth Pedersen
Kenneth Pedersen
CNC operatør og slibetekniker kpe@junget.dk
Lars K.B. Andreasen
Lars K.B. Andreasen
CNC-operatør og slibetekniker lkba@junget.dk
Martin Andersen
Martin Andersen
Salgschef - Ekstern salg +45 89 36 55 63 man@junget.dk
Mads A. Mønsted
Mads A. Mønsted
Afdelingschef - Intern salg +45 89 36 55 07 mam@junget.dk
Jesper Andersen
Jesper Andersen
Key Account - Tooling +45 89 36 55 18 jea@junget.dk
Preben Kristensen
Preben Kristensen
Key Account - Tooling +45 40 19 33 99 pkr@junget.dk
Ulrich Spliid
Ulrich Spliid
Key Account - Tooling +45 20 20 61 53 uls@junget.dk
Jan Thomassen
Jan Thomassen
Værktøjs- og slibekonsulent- Sjælland +45 89 36 55 66 jct@junget.dk
Jan Flaathen Hansen
Jan Flaathen Hansen
Salgskonsulent +45 89 36 55 72 jfh@junget.dk
Knud Lauge Sørensen
Knud Lauge Sørensen
Salgskonsulent, Intern Værktøj +45 89 36 55 62 kls@junget.dk
Christian Krogh Hansen
Christian Krogh Hansen
Salgskonsulent, Intern Værktøj +45 89 36 55 67 ckh@junget.dk
Tommy Jakobsen
Tommy Jakobsen
Værktøjs- og slibekonsulent +45 21 46 63 94 toj@junget.dk
Heine H. Sørensen
Heine H. Sørensen
Værktøjs- og slibekonsulent +45 41 95 35 04 hhs@junget.dk
Jakob Ravn
Jakob Ravn
Produktionschef +45 89 36 55 38 jar@junget.dk
Jane V. Baiemler
Jane V. Baiemler
Marketingansvarlig +45 89 36 55 83 jvb@junget.dk
Anders Holm
Anders Holm
CFO & HR +45 89 36 55 25 ah@junget.dk
Anders Søndergaard
Anders Søndergaard
Ecommerce Product Manager +45 89 36 55 85 ans@junget.dk
Joachim Grøfte Ulfkjær
Joachim Grøfte Ulfkjær
Business Controller +45 89 36 55 00 jgu@junget.dk
Britta Sand
Britta Sand
Kreditor bogholder +45 89 36 55 24 bsa@junget.dk
Dorte F. Sørensen
Dorte F. Sørensen
Debitor bogholder +45 89 36 55 23 dfs@junget.dk
Torsten G. Ahlbeck
Torsten G. Ahlbeck
IT - Administrator +45 89 36 55 61 tga@junget.dk