Bestil afhentning af varer til slibning

Venligst oplys afhentningsadresse og kontaktoplysninger eller klik her for at se hvilken dag vi kører i dit område.

Bestil servicetekniker til din maskine
Venligst oplys kontaktoplysninger, adresse, maskine og ønske til dato. Vi kontakter dig hurtigst muligt for endelig aftale


Varer ex. moms
Top billede

Robland

Maskinproducenten Robland fremstiller standard træ- og snedkerimaskiner. Virksomheden blev grundlagt i 1968 af Robert Landuyt og er beliggende i Brugge i Belgien. Robland er kendt for at bygge holdbare og prismæssigt overkommelige kombimaskiner, der den dag i dag fortsat udgør en væsentlig del af produktprogrammet.

Sortimentet omfatter dog også traditionelle snedkerimaskiner som:

Roblands mission er altid at tilbyde produkter, som giver dig den bedste kvalitet for pengene. Dette er en mission, som kræver, at man altid har fingeren på pulsen og kender sit marked og sine kunder godt. Kontinuerlig produktudvikling er derfor også et kendetegn for Robland. Cirka 5% af budgettet investeres årligt i udvikling af nye produkter og opdatering af det eksisterende sortiment.

Roblands snedkerimaskiner bliver i dag eksporteret til hele verden og med et internationalt forhandlernetværk går 85% af produktionen til eksport.


Spindelfræsere med høj ydeevne

I 25 år har Robland fremstillet robuste og meget pålidelige fræsere, som tilbydes til en overkommelige pris. Alle Robland spindelfræsere udvikles og fremstilles i fabrikken i Brugge. Da virksomheden også selv fremstiller ca. 85% af alle reservedele til maskinerne, er du sikker på, at reservedelene til dine Robland maskiner vil være tilgængelige årtier efter produktlanceringen.

I det aktuelle udvalg af spindelfræsere finder du modeltyperne:

  • T120 –  som også fås i modellerne X2, E, M og P
  • KT30 -  fås også i en pro model

Download brochure med Robland spindelfræsere

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

Kontakt maskinteamet hos Junget. Vi hjælper gerne med gode råd og vejledning til optimering af din produktion.

Find en medarbejder for direkte kontakt

Image name
Kontakt mig, tak
Ønsker du at blive kontaktet, så ringer vi dig gerne op. Venligst oplys dine kontaktinfo i skemaet nedenfor.
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
Mark Andersen
Mark Andersen
Key Account Manager +45 23 24 87 89 maa@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
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
Brian Saugstrup
Brian Saugstrup
Servicetekniker +45 89 36 55 12 brs@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
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
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
Emil B. Nielsen
Emil B. Nielsen
Konstruktør +45 89 36 55 43 ebn@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
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
Kenneth B. Rasmussen
Kenneth B. Rasmussen
Værktøjsspecialist salg & produktion +45 29 81 25 41 kbr@junget.dk
Lars K.B. Andreasen
Lars K.B. Andreasen
CNC-operatør og slibetekniker lkba@junget.dk
Andreas Firlings
Andreas Firlings
CNC-operatør og slibetekniker afi@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
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
Emil B. Nielsen
Emil B. Nielsen
Konstruktør +45 89 36 55 43 ebn@junget.dk
Denis Nielsen
Denis Nielsen
Værktøjs- og slibekonsulent +45 89 36 55 22 dvn@junget.dk
Anders Lassen
Anders Lassen
Værktøjs- og slibekonsulent - Sjælland +45 89 36 55 93 ala@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
Marketingchef +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
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