Error executing template "Designs/Ege/eCom/ProductCatalog/Ege_ProductViewDetail.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_36b72c073bd94814b4e405354956ac56.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\eCom\ProductCatalog\Ege_ProductViewDetail.cshtml:line 594
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits ViewModelTemplate<ProductViewModel> 2 @using Dynamicweb.Rendering 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 @using EGE.Website.CustomModules 5 @using EGE.Website.CustomModules.Models 6 @using EGE.Website.CustomModules.Extensions 7 @using EGE.Website.CustomModules.Helpers 8 @using System.Web 9 @using Newtonsoft.Json 10 @using Newtonsoft.Json.Linq 11 12 @{ 13 var product = Dynamicweb.Ecommerce.Services.Products.GetProductById(Model.Id, Model.VariantId, Model.LanguageId); 14 } 15 16 @if (product == null) 17 { 18 <h3>The product is not available in the chosen language, please try another.</h3> 19 } 20 else 21 { 22 bool isOutletSite = PageExtensions.IsOutletArea(Pageview.AreaID); 23 var B2cSiteActive = PageExtensions.IsB2CArea(Pageview.AreaID); 24 //string groupIdQueryParameter = string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["GroupID"]) 25 // ? string.Empty 26 // : "&amp;GroupID=" + Dynamicweb.Context.Current.Request["GroupID"]; 27 var variantCombinations = product.VariantCombinations.Where(x => !x.VariantId.Contains("NA")); 28 29 string productLink = "/Default.aspx?ID=" + Pageview.Page.ID + "&amp;ProductID=" + Model.Id; 30 var prodImage = ProductExtensions.GetProductImagePath(Model.Id, out bool isExternal); 31 var prodTypeName = Model.GetFieldName("ProductEgeType"); 32 var prodTypeValue = Model.GetFieldValue("ProductEgeType"); 33 var prodConceptName = Model.GetFieldName("ProductConcept"); 34 var prodConceptValue = Model.GetFieldValue("ProductConcept"); 35 var prodCollectionName = Model.PrimaryOrDefaultGroup.Name; 36 var prodCollectionLink = string.Empty; 37 var prodB2CCollectionLink = string.Empty; 38 var prodConceptLink = string.Empty; 39 var prodColor = Model.GetFieldName("ProductColor"); 40 int variantListCounter = 0; 41 var IsBulkCarpets = PageExtensions.IsBulkCarpets(prodTypeValue); 42 43 //EGEDR-769 44 bool isCircleBack = false; 45 string circleBackText = string.Empty; 46 if (Model.ProductCategories.Keys.Any()) 47 { 48 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 49 { 50 isCircleBack = bool.Parse(product.GetCategoryValue("CarpetCategory", "IsCircleBack").ToString()); 51 var circleBackTextObj = product.GetCategoryValue("CarpetCategory", "CircleBackText"); 52 circleBackText = circleBackTextObj != null ? circleBackTextObj.ToString() : null; 53 54 } 55 56 } 57 58 var CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code; 59 60 if (Model.ProductCategories.Keys.Any()) 61 { 62 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 63 { 64 var fields = Model.ProductCategories["CarpetCategory"]; 65 prodCollectionLink = fields.Fields["CollectionContentPage"].Value as string; 66 prodConceptLink = fields.Fields["ConceptContentPage"].Value as string; 67 prodB2CCollectionLink = fields.Fields["B2CCollectionContentPage"].Value as string; 68 } 69 70 } 71 var images = Model.GetImages(); 72 var sustainabilityChoices = string.Empty; 73 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 74 { 75 var susChoiceList = (Model.ProductCategories["CarpetCategory"].Fields["PdfSustainBlocks"]?.Value as List<FieldOptionValueViewModel>); 76 77 foreach (var choice in susChoiceList) 78 { 79 sustainabilityChoices += choice.Value; 80 } 81 } 82 83 var variantsDivId = "js-product-details__variants"; 84 var prodNumber = ""; 85 var patternNumber = ""; 86 var backingAbbr = ""; 87 88 if (isOutletSite) 89 { 90 @TemplateHelper.RenderPartial("Ecom/Partials/Details_OutletData.cshtml", Model) 91 prodNumber = Model.GetCategoryValueAs<string>("M3ProductNumber", "OutletSpecs"); 92 patternNumber = Model.GetCategoryValueAs<string>("PatternNumber", "OutletSpecs"); 93 backingAbbr = Model.GetFieldValue("ProductBacking").ToString(); 94 } 95 else 96 { 97 @TemplateHelper.RenderPartial("Ecom/Partials/Details_Data.cshtml", Model) 98 } 99 100 var cartOrderLinesFeed = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "CartOrderLinesFeed"); 101 var cartOrderLinesFeedUrl = ""; 102 if (cartOrderLinesFeed != null) 103 { 104 cartOrderLinesFeedUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(cartOrderLinesFeed.ID); 105 } 106 107 var isProductRug = EGE.Website.CustomModules.Extensions.ProductExtensions.IsRug(HttpContext.Current.Request["ProductID"]); 108 var showConfigurator = EGE.Website.CustomModules.Extensions.ProductExtensions.GetProductShowConfigurator(HttpContext.Current.Request["ProductID"]); 109 bool anyNonEmptyImagePath = false; 110 111 Dynamicweb.Content.PageService pageService = new Dynamicweb.Content.PageService(); 112 Dynamicweb.Content.Page configuratorLoginPage = pageService.GetPageByNavigationTag(Pageview.AreaID, "ConfiguratorLoginPage"); 113 string configuratorLoginPageUrl = configuratorLoginPage != null ? Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(configuratorLoginPage.ID) : null; 114 string productId = HttpContext.Current.Request["ProductID"]; 115 116 string configuratorFullLink = configuratorLoginPageUrl + "?configuratorId=" + productId; 117 118 var hasRugImages = false; 119 120 //Sorting images to make thumbnail first image in PDP main image slider 121 List<ImagePathModel> imageArray = new List<ImagePathModel>(); 122 ImagePathCollectionModel rugImageInfo = ProductExtensions.GetImagePaths(Model.Id); 123 124 if (rugImageInfo != null) 125 { 126 foreach (var thumbnailImage in rugImageInfo.Thumbnail) 127 { 128 imageArray.Add(thumbnailImage); 129 } 130 131 foreach (var webImage in rugImageInfo.WebImages) 132 { 133 imageArray.Add(webImage); 134 } 135 136 hasRugImages = imageArray.Any(); 137 } 138 139 <section class="product-details" id="js-product-details" data-model-color="@prodColor" data-model-category="@prodTypeName" data-model-currency="@CurrencyCode" data-model-id="@Model.Id" data-model-name="@Model.Name" data-non-variants="@Model.GetRelatedGroupById("RELGRP1").Any()" data-thumb="@ProductExtensions.GetProductImagePath(Model.Id, out isExternal, "XS")"> 140 141 <div class="container"> 142 <div class="product-details__inner"> 143 <div class="product-details__header-holder"> 144 <h1 class="header-in-component header-in-component--product-detail"> 145 @Model.Name 146 </h1> 147 <div class="product-details__header-id"> 148 @if (!isOutletSite) 149 { 150 @Model.Number 151 } 152 else 153 { 154 @:@prodNumber - @patternNumber - @backingAbbr 155 } 156 </div> 157 </div> 158 <div class="product-details__slider-holder"> 159 <div class="slider-with-counter slider-with-counter--main" id="slider-with-counter--wide"> 160 <div class="slider-with-counter__slider-holder"> 161 162 <ul class="slider-with-counter__list slider-with-counter__list--hidden" data-counter-text="@Translate("Product | You are viewing {X} of {Y} images", "You are viewing {X} of {Y} images").Replace("{X}", "{0}").Replace("{Y}", "{0}")"> 163 164 @if (hasRugImages) 165 { 166 foreach (var image in imageArray) 167 { 168 string title = image.Title; 169 string imageSrc = image.ImagePath; 170 var imageIndex = 0; 171 172 if (!string.IsNullOrEmpty(imageSrc)) 173 { 174 anyNonEmptyImagePath = true; 175 <li class="slider-with-counter__item"> 176 @{ 177 var isThumbnail = image.ImagePath.ToLower().Contains("thumbnail"); 178 if (isCircleBack && !B2cSiteActive && isThumbnail) 179 { 180 @CircleBackLogo(); 181 } 182 } 183 <img class="lazyload a-image lazyload-measure lazyload-bg " src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="@title" property="contentUrl" data-src="@(ImageUiFormatHelper.Format(imageSrc, 542, 542))" 184 data-query-obj='{ "mode":"crop" }'> 185 <noscript v-if="false"> 186 <img src="@(ImageUiFormatHelper.Format(imageSrc, 542, 542))" alt="@title"> 187 </noscript> 188 189 <button @@click="showOverlay(@imageIndex+1)" class="slider-with-counter__button-lightbox" data-lightbox-image="test-slider.jpg"></button> 190 </li> 191 } 192 } 193 } 194 @if (!hasRugImages || !anyNonEmptyImagePath) 195 { 196 foreach (var image in images) 197 { 198 var imageIndex = 0; 199 <li class="slider-with-counter__item"> 200 @if (isCircleBack && !B2cSiteActive && image.Url.Contains("/Files/Files/Ecom/Images/Products/")) 201 { 202 @CircleBackLogo() 203 } 204 <img class="lazyload a-image lazyload-measure lazyload-bg " src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="@image.AltText" property="contentUrl" data-src="@(image.IsExternal ? image.Url : ImageUiFormatHelper.Format(image.Url, 542, 542))" 205 data-query-obj='{ "mode":"crop" }'> 206 <noscript v-if="false"> 207 <img src="@(image.IsExternal ? image.Url : ImageUiFormatHelper.Format(image.Url, 542, 542))" alt="@image.AltText"> 208 </noscript> 209 210 <button @@click="showOverlay(@imageIndex+1)" class="slider-with-counter__button-lightbox" data-lightbox-image="test-slider.jpg"></button> 211 </li> 212 } 213 } 214 215 </ul> 216 <div class="slider-with-counter__navigation"> 217 <button @@click="slideToPrev(sliderMain)" v-bind:class="{ 'slider-with-counter__button--show': sliderMain.showButtonPrev}" class="slider-with-counter__button slider-with-counter__button--prev"> 218 <svg class="svg-icon slider-with-counter__svg"> 219 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 220 </svg> 221 </button> 222 <button @@click="slideToNext(sliderMain)" v-bind:class="{ 'slider-with-counter__button--show': sliderMain.showButtonNext }" class="slider-with-counter__button slider-with-counter__button--next"> 223 <svg class="svg-icon slider-with-counter__svg"> 224 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 225 </svg> 226 </button> 227 </div> 228 </div> 229 @if (!isOutletSite && !B2cSiteActive && !isProductRug) 230 { 231 <div v-if="sliderMain.currentSlide <= 1"> 232 <span id="ImageDownload" class="product-list-room-shot__item-image-download-product-detail"> 233 <figure class="product-list-room-shot__item-image-download-icon"><svg class="svg-icon product-list-room-shot__item-image-download-icon-arrow"><use xlink:href="/dist/icons/icons.svg#arrow-down-in-circle"></use></svg></figure> 234 <a href="@prodImage" download="@prodImage" class="product-list-room-shot__item-image-download-link">Low res</a> 235 236 @if (ProductExtensions.GetHighResolutionImagePath(Model.Id) != null && !string.IsNullOrEmpty(ProductExtensions.GetHighResolutionImagePath(Model.Id))) 237 { 238 <a href="@ProductExtensions.GetHighResolutionImagePath(Model.Id)" download="@ProductExtensions.GetHighResolutionImagePath(Model.Id)" class="product-list-room-shot__item-image-download-link">High res</a> 239 } 240 </span> 241 </div> 242 243 } 244 <div class="slider-with-counter__counter"> 245 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--plain" v-html="sliderMain.counterTextBefore"></span> 246 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--number" v-html="sliderMain.currentSlide"></span> 247 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--middle" v-html="sliderMain.counterTextMiddle"></span> 248 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--number" v-html="slidesAmount"></span> 249 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--plain" v-html="sliderMain.counterTextAfter"></span> 250 </div> 251 <div class="slider-with-counter__template"> 252 253 <div class="novi-backdrop novi-backdrop--hidden novi-backdrop--slider-with-counter" id="slider-with-counter__overlay"> 254 <div class="novi-overlay"> 255 <div class="novi-overlay__container"> 256 <div class="novi-overlay__content"> 257 <div class="slider-with-counter slider-with-counter--in-overlay slider-with-counter--zoom" id="slider-with-counter--wide"> 258 <div class="slider-with-counter__slider-holder"> 259 <ul class="slider-with-counter__list slider-with-counter__list--hidden slider-with-counter__list--zoom"> 260 @{ 261 int canvasCounter = 0; 262 } 263 264 @if (hasRugImages) 265 { 266 267 foreach (var image in imageArray) 268 { 269 string imageSrc = image.ImagePath; 270 if (!string.IsNullOrEmpty(imageSrc)) 271 { 272 anyNonEmptyImagePath = true; 273 <li class="slider-with-counter__item"> 274 <img class="lazyload a-image lazyload-measure lazyload-bg" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="@image.Title" property="contentUrl" data-src="@ImageUiFormatHelper.Format(imageSrc, 700, 700)" 275 data-query-obj='{ "mode":"crop" }'> 276 <noscript v-if="false"> 277 <img src="@ImageUiFormatHelper.Format(imageSrc, 700, 700)" 278 alt="@image.Title"> 279 </noscript> 280 <span class="button__wait-animation button__wait-animation--slider-with-counter"> 281 <span></span> 282 <span></span> 283 <span></span> 284 <span></span> 285 </span> 286 287 @if (canvasCounter == 0) 288 { 289 <canvas v-bind:class="{'slider-with-counter__zoom-canvas--loading':zoomElements[@canvasCounter] && zoomElements[@canvasCounter].isLoading}" @@touchend="zoomOnTouchEnd(@canvasCounter,$event)" @@mouseup="zoomOnTouchEnd(@canvasCounter,$event)" @@touchmove="zoomOnTouchMove(@canvasCounter,$event)" @@touchstart="zoomOnTouchStart(@canvasCounter,$event)" @@mousedown="zoomOnTouchStart(@canvasCounter,$event)" @@wheel="zoomOnWheel(@canvasCounter,$event)" @@mousemove="zoomOnTouchMove(@canvasCounter,$event)" @@mouseleave="zoomClear(@canvasCounter)" data-src="@(image.ImagePath)" data-no="@canvasCounter" class="slider-with-counter__zoom-canvas"></canvas> 290 <span class="slider-with-counter__zoom-loading" v-if="zoomElements[@canvasCounter] && zoomElements[@canvasCounter].isLoading"> 291 <span class="button__wait-animation button__wait-animation--zoom"> 292 <span></span> 293 <span></span> 294 <span></span> 295 <span></span> 296 </span> 297 <span class="slider-with-counter__zoom-loading-text">@Translate("Product | Zoom | Loading zoomable image", "Loading zoomable image")</span> 298 </span> 299 <div class="slider-with-counter__zoom-container"> 300 <div v-if="zoomElements[@canvasCounter]" class="slider-with-counter__zoom-level-indicator"> 301 <button @@click="zoomOnButton(@canvasCounter,true)" class="increase-decrease__button increase-decrease__button--up slider-with-counter__zoom-level-button slider-with-counter__zoom-level-button--plus"></button> 302 <div class="slider-with-counter__zoom-level-illustration"> 303 <span v-bind:style="'top:'+zoomDotPosition" class="slider-with-counter__zoom-level-illustration-dot"></span> 304 </div> 305 <button @@click="zoomOnButton(@canvasCounter,false)" class="increase-decrease__button increase-decrease__button--down slider-with-counter__zoom-level-button slider-with-counter__zoom-level-button--minus"></button> 306 </div> 307 <span class="slider-with-counter__zoom-indicator" style="background-image: url(@image.ImagePath)"> 308 <span v-if="zoomElements[@canvasCounter]" v-bind:style="{paddingTop: zoomElements[@canvasCounter].thumbnailRatio}" class="slider-with-counter__zoom-indicator-aspect-ratio"></span> 309 <span v-if="zoomElements[@canvasCounter]" v-bind:style="{width:zoomThumbnailSize[@canvasCounter],height:zoomThumbnailSize[@canvasCounter],left:zoomThumbnailPositionComp[@canvasCounter].left,top:zoomThumbnailPositionComp[@canvasCounter].top}" class="slider-with-counter__zoom-indicator-excerpt"><span></span></span> 310 </span> 311 </div> 312 } 313 @{canvasCounter++;} 314 </li> 315 } 316 } 317 } 318 @if (!hasRugImages || !anyNonEmptyImagePath) 319 { 320 foreach (var image in images) 321 { 322 <li class="slider-with-counter__item"> 323 <img class="lazyload a-image lazyload-measure @(image.IsFirst ? "slider-with-counter__real-image" : "lazyload-bg")" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="@image.AltText" property="contentUrl" data-src="@(image.IsExternal ? image.Url : ImageUiFormatHelper.Format(image.Url, 700, 700))" 324 data-query-obj='{ "mode":"crop" }'> 325 <noscript v-if="false"> 326 <img src="@(image.IsExternal ? image.Url + "?mode=crop" : ImageUiFormatHelper.Format(image.Url, 700, 700))" 327 alt="@image.AltText"> 328 </noscript> 329 <span class="button__wait-animation button__wait-animation--slider-with-counter"> 330 <span></span> 331 <span></span> 332 <span></span> 333 <span></span> 334 </span> 335 336 @if (canvasCounter == 0) 337 { 338 <canvas v-bind:class="{'slider-with-counter__zoom-canvas--loading':zoomElements[@canvasCounter] && zoomElements[@canvasCounter].isLoading}" @@touchend="zoomOnTouchEnd(@canvasCounter,$event)" @@mouseup="zoomOnTouchEnd(@canvasCounter,$event)" @@touchmove="zoomOnTouchMove(@canvasCounter,$event)" @@touchstart="zoomOnTouchStart(@canvasCounter,$event)" @@mousedown="zoomOnTouchStart(@canvasCounter,$event)" @@wheel="zoomOnWheel(@canvasCounter,$event)" @@mousemove="zoomOnTouchMove(@canvasCounter,$event)" @@mouseleave="zoomClear(@canvasCounter)" data-src="@(image.Url)" data-no="@canvasCounter" class="slider-with-counter__zoom-canvas"></canvas> 339 <span class="slider-with-counter__zoom-loading" v-if="zoomElements[@canvasCounter] && zoomElements[@canvasCounter].isLoading"> 340 <span class="button__wait-animation button__wait-animation--zoom"> 341 <span></span> 342 <span></span> 343 <span></span> 344 <span></span> 345 </span> 346 <span class="slider-with-counter__zoom-loading-text">@Translate("Product | Zoom | Loading zoomable image", "Loading zoomable image")</span> 347 </span> 348 <div class="slider-with-counter__zoom-container"> 349 <div v-if="zoomElements[@canvasCounter]" class="slider-with-counter__zoom-level-indicator"> 350 <button @@click="zoomOnButton(@canvasCounter,true)" class="increase-decrease__button increase-decrease__button--up slider-with-counter__zoom-level-button slider-with-counter__zoom-level-button--plus"></button> 351 <div class="slider-with-counter__zoom-level-illustration"> 352 <span v-bind:style="'top:'+zoomDotPosition" class="slider-with-counter__zoom-level-illustration-dot"></span> 353 </div> 354 <button @@click="zoomOnButton(@canvasCounter,false)" class="increase-decrease__button increase-decrease__button--down slider-with-counter__zoom-level-button slider-with-counter__zoom-level-button--minus"></button> 355 </div> 356 <span class="slider-with-counter__zoom-indicator" style="background-image: url(@image.Url)"> 357 <span v-if="zoomElements[@canvasCounter]" v-bind:style="{paddingTop: zoomElements[@canvasCounter].thumbnailRatio}" class="slider-with-counter__zoom-indicator-aspect-ratio"></span> 358 <span v-if="zoomElements[@canvasCounter]" v-bind:style="{width:zoomThumbnailSize[@canvasCounter],height:zoomThumbnailSize[@canvasCounter],left:zoomThumbnailPositionComp[@canvasCounter].left,top:zoomThumbnailPositionComp[@canvasCounter].top}" class="slider-with-counter__zoom-indicator-excerpt"><span></span></span> 359 </span> 360 </div> 361 } 362 @{canvasCounter++;} 363 </li> 364 } 365 } 366 </ul> 367 <div class="slider-with-counter__navigation"> 368 <button @@click="slideToPrev(sliderInOverlay)" v-bind:class="{ 'slider-with-counter__button--show': sliderInOverlay.showButtonPrev}" class="slider-with-counter__button slider-with-counter__button--prev"> 369 <svg class="svg-icon slider-with-counter__svg"> 370 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 371 </svg> 372 </button> 373 <button @@click="slideToNext(sliderInOverlay)" v-bind:class="{ 'slider-with-counter__button--show': sliderInOverlay.showButtonNext }" class="slider-with-counter__button slider-with-counter__button--next"> 374 <svg class="svg-icon slider-with-counter__svg"> 375 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 376 </svg> 377 </button> 378 </div> 379 </div> 380 <div class="slider-with-counter__counter"> 381 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--plain" v-html="sliderInOverlay.counterTextBefore"></span> 382 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--number" v-html="sliderInOverlay.currentSlide"></span> 383 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--middle" v-html="sliderInOverlay.counterTextMiddle"></span> 384 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--number" v-html="slidesAmount"></span> 385 <span class="slider-with-counter__counter-part slider-with-counter__counter-part--plain" v-html="sliderInOverlay.counterTextAfter"></span> 386 </div> 387 </div> 388 <div class="novi-overlay__close-area"> 389 <button class="close-button novi-overlay__close-button"> 390 <span class="close-button__icon"> 391 <svg class="svg-icon close-button__svg"> 392 <use xlink:href="@Constants.DistPath/icons/icons.svg#cross"></use> 393 </svg> 394 </span> 395 <span class="close-button__text">@Translate("Product | Image overlay | Close", "Close")</span> 396 </button> 397 </div> 398 </div> 399 </div> 400 </div> 401 402 </div> 403 </div> 404 405 </div> 406 407 </div> 408 409 <div class="product-details__details-holder"> 410 <h2 class="product-text__header">@(B2cSiteActive ? @Translate("Product | B2C Tags", "B2C Tags") : @Translate("Product | Tags", "Tags"))</h2> 411 <ul class="product-details__tag-list"> 412 <li class="product-details__tag-item"> 413 @if (B2cSiteActive) 414 { 415 <span class="product-details__tag-link">@prodTypeName</span> 416 } 417 else 418 { 419 420 <a href="@(Model.GetTypeUrl(prodTypeValue))" class="product-details__tag-link">@prodTypeName</a> 421 } 422 </li> 423 @if (!B2cSiteActive && !string.IsNullOrWhiteSpace(prodConceptLink)) 424 { 425 <li class="product-details__tag-item"> 426 <a href="@prodConceptLink" class="product-details__tag-link">@prodConceptName</a> 427 </li> 428 } 429 @if (B2cSiteActive) 430 { 431 <li class="product-details__tag-item"> 432 <span class="product-details__tag-link">@prodCollectionName</span> 433 </li> 434 435 } 436 else if (!string.IsNullOrWhiteSpace(prodCollectionLink)) 437 { 438 <li class="product-details__tag-item"> 439 <a href="@prodCollectionLink" class="product-details__tag-link">@prodCollectionName</a> 440 </li> 441 } 442 </ul> 443 444 <div id="@variantsDivId" ref="variantType_@variantListCounter" class="product-details__variants"> 445 @foreach (var designVariantLists in Model.ProduceListsOfDesignVariants()) 446 { 447 var activeProductId = HttpContext.Current.Request["ProductID"]; 448 var hideVariantsClass = "product-details__variant-type--hide"; 449 if (variantListCounter == 0) 450 { 451 hideVariantsClass = ""; 452 } 453 if (variantListCounter > 0) 454 { 455 <button ref="variantTypeButton_@variantListCounter" @@click="toggleVariantType(@variantListCounter)" class="product-text__read-more"><svg class="svg-icon product-text__svg"><use xlink:href="/dist/icons/icons.svg#arrow"></use></svg><span>@Translate(designVariantLists.TranslationKey, designVariantLists.TranslationDefaultValue)</span></button> 456 } 457 <div ref="variantType_@variantListCounter" class="product-details__variant-type @hideVariantsClass"> 458 <h2 class="product-text__header">@Translate(designVariantLists.TranslationKey, designVariantLists.TranslationDefaultValue)</h2> 459 <div class="product-details__variant-type-content"> 460 <div class="product-details__variant-truncate" :style="{'max-height':variantTruncateHeight[@variantListCounter]}"> 461 <ul class="product-details__variant-list"> 462 463 @foreach (var relatedProduct in designVariantLists.RelatedProducts.OrderBy(x => x.Id)) 464 { 465 var imagePath = ProductExtensions.GetProductImagePath(relatedProduct.Id, out bool relatedIsExternal, "XS"); 466 productLink = "/Default.aspx?ID=" + Pageview.Page.ID + "&amp;ProductID=" + relatedProduct.Id; 467 <li class="product-details__variant-item"> 468 <a href="@productLink" class="product-details__variant-link @(activeProductId == relatedProduct.Id ? "product-details__variant-link--active" : "")" title="@relatedProduct.Id"> 469 <figure class="product-details__variant-img"> 470 <img class="lazyload a-image lazyload-measure lazyload-bg " src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="@relatedProduct.Name" property="contentUrl" data-src="@(activeProductId == relatedProduct.Id ? (isExternal ? prodImage : ImageUiFormatHelper.Format(prodImage, 700, 700)) : (relatedIsExternal ? imagePath : ImageUiFormatHelper.Format(imagePath, 700, 700)))" 471 data-query-obj='{ }'> 472 <noscript v-if="false"> 473 <img src="@(activeProductId == relatedProduct.Id ? (isExternal ? prodImage : ImageUiFormatHelper.Format(prodImage, 700, 700)) : (relatedIsExternal ? imagePath : ImageUiFormatHelper.Format(imagePath, 700, 700)))" 474 alt="@relatedProduct.Name"> 475 </noscript> 476 </figure> 477 </a> 478 </li> 479 480 } 481 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 482 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 483 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 484 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 485 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 486 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 487 <li class="product-details__variant-item product-details__variant-item--adjustment"></li> 488 </ul> 489 </div> 490 </div> 491 <button class="product-details__see-all-variants" :class="{'product-details__see-all-variants--open':variantTypes[@variantListCounter].showAllVariants}" v-if="variantTypes[@variantListCounter] && variantTypes[@variantListCounter].moreVariantsThanOneLine" @@click="hideShowVariants(@variantListCounter)"> 492 <span class="product-details__see-all-variants-text product-details__see-all-variants-text--see-all"> 493 @Translate("Product | See all variants", "See all variants") 494 </span> 495 <span class="product-details__see-all-variants-text product-details__see-all-variants-text--see-less"> 496 @Translate("Product | See less variants", "See less variants") 497 </span> 498 499 <svg class="svg-icon product-details__see-all-variants-svg"> 500 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow-down-in-circle"></use> 501 </svg> 502 </button> 503 </div> 504 variantListCounter++; 505 } 506 </div> 507 @if (Model.GetCadesignProperties().Recolour) 508 { 509 510 string firstBtnText = string.Empty; 511 string dataLayerTool = string.Empty; 512 firstBtnText = Translate("Product | Customize", "Customize"); 513 dataLayerTool = "recolour tool"; 514 string customMargin = variantListCounter > 0 ? "margin-left:24px;" : ""; 515 var ctaImageItem = Pageview.Area?.Item?.GetItem("CTAImage"); 516 string ctaImage = ctaImageItem != null && !string.IsNullOrEmpty(ctaImageItem.ToString()) 517 ? ctaImageItem.ToString() 518 : "/missing-image.png"; 519 520 521 <div class="product-details__variants"> 522 <div class="product-details__variant-type"> 523 <div class="product-details__variant-type-content"> 524 <div class="product-details__variant-truncate" :style="{'max-height':variantTruncateHeight[@variantListCounter]}"> 525 <div class="product-details__variant-list"> 526 <div class="product-details__variant-item"> 527 <a id="cadesign-custom-button-two" data-href="@Model.GetCadesignProperties().ToolUrl" @@click="openCustomizeOverlay" class="product-details__variant-link js-customize-button product-details__select-custom-color"> 528 <figure class="product-details__variant-img"> 529 <img class="lazyload a-image lazyload-measure lazyload-bg " src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Recolour" property="contentUrl" data-src="@ImageUiFormatHelper.Format(ctaImage, 700, 700)" 530 data-query-obj='{ }'> 531 </figure> 532 <div class="product-details__hide js-customize-iframe-holder"> 533 <div class="product-details__iframe-holder"> 534 <iframe class="product-details__customize-iframe" frameborder="0"></iframe> 535 <span class="product-details__wait-animation"> 536 <span></span> 537 <span></span> 538 <span></span> 539 <span></span> 540 </span> 541 </div> 542 </div> 543 <div class="product-details__select-custom-color--cta-container"> 544 <div class="product-details__select-custom-color--cta-text"> 545 @Translate("Product | Choose color", "Customize colors") 546 </div> 547 </div> 548 </a> 549 </div> 550 <div class="product-details__variant-item product-details__variant-item--adjustment"></div> 551 <div class="product-details__variant-item product-details__variant-item--adjustment"></div> 552 </div> 553 </div> 554 </div> 555 </div> 556 </div> 557 } 558 @if (isCircleBack && !B2cSiteActive) 559 { 560 <div id="product-details__circle-back" class="product-details__variant-type"> 561 <img src="@ImageUiFormatHelper.Format("/Files/Files/Images/CircleBack/Ege_Circular_Black.png", 50, 55)" height="50" width="55" /> 562 <button ref="circleBackButton" v-show="!toggleCircleBack" @@click="initToggleCircleBack()" class="product-text__read-more"><svg class="svg-icon product-text__svg"><use xlink:href="/dist/icons/icons.svg#arrow"></use></svg><span>@Translate("EgeCircleBack:ReadMoreButtonText", "Ege CircleBack")</span></button> 563 <div v-show="toggleCircleBack" class="product-text__text"> 564 @circleBackText 565 </div> 566 </div> 567 } 568 <div class="product-text" data-button-text-1="@Translate("Read more", "Read more")" data-button-text-2="@Translate("Show less", "Show less")"> 569 <h2 class="product-text__header">@Model.ShortDescription</h2> 570 <div v-bind:style="{ maxHeight: maxHeight + 'px' }" class="product-text__text" v-bind:class="{'product-text__text--truncate':truncateText}"> 571 <div>@Model.LongDescription</div> 572 </div> 573 <button @@click="toggle" v-if="hasOverflow" class="product-text__read-more"> 574 <svg class="svg-icon product-text__svg"> 575 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 576 </svg><span v-html="buttonText"></span> 577 </button> 578 </div> 579 580 @if (B2cSiteActive) 581 { 582 583 var B2CFullWidthPrice = string.Empty; 584 var B2CCarvingPrice = string.Empty; 585 var B2CAnyShapePrice = string.Empty; 586 var B2CAnyShapeExtraText = string.Empty; 587 588 if (Model.ProductCategories.Keys.Any()) 589 { 590 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 591 { 592 var fields2 = Model.ProductCategories["CarpetCategory"]; 593 594 B2CFullWidthPrice = product.GetCategoryValue("CarpetCategory", "B2CFullWidthPrice").ToString(); 595 B2CCarvingPrice = product.GetCategoryValue("CarpetCategory", "B2CCarvingPrice").ToString(); 596 B2CAnyShapePrice = product.GetCategoryValue("CarpetCategory", "B2CAnyShapePrice").ToString(); 597 B2CAnyShapeExtraText = fields2.Fields["B2CAnyShapeExtraText"].Value as string; 598 } 599 600 } 601 602 <div class="remnants"> 603 <div class="remnants__header"> 604 <div class="remnants__headline">@Translate("Product details B2C | Remnants | Priser", "Priser")</div> 605 </div> 606 <ul class="remnants__list"> 607 @if (!string.IsNullOrWhiteSpace(B2CFullWidthPrice) && B2CFullWidthPrice != "0") 608 { 609 // adding decimals if not already present 610 var B2CFillWidthPriceFormatted = (B2CFullWidthPrice.Contains(',') ? B2CFullWidthPrice : B2CFullWidthPrice + ",00"); 611 612 <li class="remnants__item"> 613 <div class="remnants__item-inner"> 614 <div class="remnants__info remnants__info--first-column"> 615 <div class="remnants__info-text">@Translate("Product details B2C | Remnants | B2CFullWidthText", "Fuld bredde, pr. m2 inkl. moms")</div> 616 </div> 617 <div class="remnants__price remnants__price--first-column">@CurrencyCode @B2CFillWidthPriceFormatted</div> 618 </div> 619 </li> 620 } 621 @if (!string.IsNullOrWhiteSpace(B2CCarvingPrice) && B2CCarvingPrice != "0") 622 { 623 // adding decimals if not already present 624 var B2CCarvingPriceFormatted = (B2CCarvingPrice.Contains(',') ? B2CCarvingPrice : B2CCarvingPrice + ",00"); 625 626 <li class="remnants__item"> 627 <div class="remnants__item-inner"> 628 <div class="remnants__info remnants__info--first-column"> 629 <div class="remnants__info-text">@Translate("Product details B2C | Remnants | B2CCarvingText", "Udskåret mål, pr. m2 inkl. moms")</div> 630 </div> 631 <div class="remnants__price remnants__price--first-column">@CurrencyCode @B2CCarvingPriceFormatted</div> 632 </div> 633 </li> 634 } 635 @if (!string.IsNullOrWhiteSpace(B2CAnyShapePrice) && B2CAnyShapePrice != "0") 636 { 637 // adding decimals if not already present 638 var B2CAnyShapePriceFormatted = (B2CAnyShapePrice.Contains(',') ? B2CAnyShapePrice : B2CAnyShapePrice + ",00"); 639 640 <li class="remnants__item"> 641 <div class="remnants__item-inner"> 642 <div class="remnants__info remnants__info--first-column"> 643 <div class="remnants__info-text">@B2CAnyShapeExtraText</div> 644 </div> 645 <div class="remnants__price remnants__price--first-column">@CurrencyCode @B2CAnyShapePriceFormatted</div> 646 </div> 647 </li> 648 } 649 </ul> 650 </div> 651 } 652 653 @if (isOutletSite) 654 { 655 var addToBasketString = Translate("Product details | Remnants | Add to basket", "Add to basket"); 656 657 <div id="js-remnants" v-cloak class="remnants" data-text-options-singular="@Translate("Product details | Remnants | option (singular)", "option")" data-text-options-plural="@Translate("Product details | Remnants | options (plural)", "options")" data-text-product-singular="@Translate("Product details | Remnants | fault (singular)", "fault")" data-text-product-plural="@Translate("Product details | Remnants | faults (plural)", "faults")"> 658 <div class="remnants__header"> 659 <div class="remnants__headline">@Translate("Product details | Remnants | Choose carpet remnants", "Choose carpet remnants")</div> 660 <div class="remnants__items-available">{{remnantItems.length}} <span v-html="remnantItems.length === 1 ? textOptionsSingular : textOptionsPlural"></span></div> 661 </div> 662 <ul class="remnants__list" :class="{'remnants__list--show-all':showAll}"> 663 <li class="remnants__item" v-for="remnantItem in remnantItems" :key="remnantItem.VariantId"> 664 <div class="remnants__item-inner"> 665 <div class="remnants__input"> 666 <label :for="'remnant-input-'+remnantItem.VariantId" class="form__checkbox-label"> 667 <input :id="'remnant-input-'+remnantItem.VariantId" :value="remnantItem.VariantId" v-model="chosenRemnants" name="remnants" type="checkbox" class="form__input-checkbox"> 668 <span class="form__checkbox-label-text"></span> 669 </label> 670 </div> 671 <div class="remnants__area">{{remnantItem.AvailableArea}} m<sup>2</sup></div> 672 <div class="remnants__info"> 673 <div class="remnants__info-text">{{remnantItem.RollCorners}} @Translate("Product details | Remnants | corners", "corners"), {{remnantItem.NumberOfFlaws}} <span v-html="remnantItem.NumberOfFlaws === 1 ? textProductSingular : textProductPlural"></span><span class="remnants__waste-carpet" v-if="remnantItem.IsWasteCarpet"> (@Translate("Product details | Remnants | waste carpet", "waste carpet"))</span><span v-if="remnantItem.UnitPrice">, </span><span class="remnants__unit-price" v-if="remnantItem.UnitPrice">{{remnantItem.UnitPrice}} {{remnantItem.CurrencyCode}} @Translate("Product details | Remnants | per m2", "per m2")</span></div> 674 <button class="remnants__preview" @@click="showCarpetProfile(remnantItem.ProductNumber,remnantItem.M3BatchNumber,remnantItem.M3ProductNumber)">@Translate("Product details | Remnants | Outlet | Roll profile", "Roll profile")</button> 675 @if (ProductExtensions.GetOutletPatternPDF(patternNumber) != "") 676 { 677 <a target="_blank" class="remnants__pattern-pdf" href="@ProductExtensions.GetOutletPatternPDF(patternNumber)">@Translate("Product details | Remnants | Outlet | Pattern PDF", "Pattern PDF")</a> 678 } 679 </div> 680 <div class="remnants__price">{{Number(remnantItem.Price).toLocaleString('en-GB') }} {{remnantItem.CurrencyCode}}</div> 681 </div> 682 </li> 683 <div class="remnants__additional-costs-msg" v-if="remnantItems.length > 0">@Translate("Product details | Remnants | Additional costs message", "Delivery costs will be added")</div> 684 </ul> 685 <div class="remnants__footer"> 686 <div class="remnants__show-all-holder"> 687 <button class="remnants__show-all" @@click="doShowAll" :class="{'remnants__show-all--show':showShowAll}">@Translate("Product details | Remnants | Show all", "Show all") ({{remnantItems.length}})</button> 688 </div> 689 <button @@click="addChosenToBasket" type="button" property="url" 690 class="button button--solid button--black button--wait-animation" 691 data-service="@cartOrderLinesFeedUrl" 692 v-bind:class="{'button--error':showErrorOnButton,'button--wait':showWaitAnimation}" 693 data-text="@addToBasketString"> 694 <span class="button__error-message"> 695 @Translate("Product details | Remnants | You haven't selected any products to add to basket", "You haven't selected any products to add to basket") 696 </span> 697 <span class="button__wait-animation"> 698 <span></span> 699 <span></span> 700 <span></span> 701 <span></span> 702 </span> 703 <span class="button__content"> 704 <span class="button__icon"> 705 <svg class="svg-icon button__svg"> 706 <use xlink:href="@Constants.DistPath/icons/icons.svg#samples"></use> 707 </svg> 708 </span> 709 <span class="button__text">@addToBasketString</span> 710 </span> 711 </button> 712 </div> 713 714 <div @@click="closeProfileOverlay" class="novi-backdrop novi-backdrop--hidden novi-backdrop--carpet-profile" :class="{'novi-backdrop--shown':showProfileOverlay}"> 715 <div class="novi-overlay"> 716 <div class="novi-overlay__container"> 717 <div class="novi-overlay__content" @@click="stopProp"> 718 <div class="carpet-profile"> 719 <header class="carpet-profile__header"> 720 <h2 class="subheader-in-component js-alt-color-gold"> 721 @Translate("Product details | Remnants | Error table | header | Error profile", "Error profile") 722 </h2> 723 <p v-if="currentChosenProfileIndex !== null">@Translate("Product details | Remnants | Profile overlay | For product number", "For product number"): <span v-html="remnantProfiles[currentChosenProfileIndex].M3productNumber"></span> @Translate("Product details | Remnants | Profile overlay | Batch number", "Batch number"): <span v-html="remnantProfiles[currentChosenProfileIndex].batchNumber"></span></p> 724 </header> 725 <div class="row"> 726 <div class="col-xs-12"> 727 <img class="carpet-profile__img" id='base64image' v-if="currentChosenProfileIndex !== null" 728 :src="'data:image/jpeg;base64, '+remnantProfiles[this.currentChosenProfileIndex].data.profileBase64" /> 729 <p class="carpet-profile__draw-outline" v-if="currentChosenProfileIndex !== null" v-html="remnantProfiles[this.currentChosenProfileIndex].data.profileText"></p> 730 731 <table class="carpet-profile__fault-list" v-if="currentChosenProfileIndex !== null && remnantProfiles[this.currentChosenProfileIndex].data.faults.length"> 732 <tr class="carpet-profile__fault-list-item carpet-profile__fault-list-item--header"> 733 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Error code", "Error code")</th> 734 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Error rank", "Error rank")</th> 735 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Text", "Text")</th> 736 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Width from", "Width from")</th> 737 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Width to", "Width to")</th> 738 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Length from", "Length from")</th> 739 <th class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--header">@Translate("Product details | Remnants | Error table | Length to", "Length to")</th> 740 </tr> 741 <tr class="carpet-profile__fault-list-item" v-for="fault in remnantProfiles[this.currentChosenProfileIndex].data.faults"> 742 <td data-header="@Translate("Product details | Remnants | Error table | Error code", "Error code")" class="carpet-profile__fault-list-cell" v-html="fault.reasonCode"></td> 743 <td data-header="@Translate("Product details | Remnants | Error table | Error rank", "Error rank")" class="carpet-profile__fault-list-cell" v-html="fault.errorRank"></td> 744 <td data-header="@Translate("Product details | Remnants | Error table | Text", "Text")" class="carpet-profile__fault-list-cell carpet-profile__fault-list-cell--text" v-html="fault.textForReason"></td> 745 <td data-header="@Translate("Product details | Remnants | Error table | Width from", "Width from")" class="carpet-profile__fault-list-cell" v-html="fault.brdStart"></td> 746 <td data-header="@Translate("Product details | Remnants | Error table | Width to", "Width to")" class="carpet-profile__fault-list-cell" v-html="fault.brdEnd"></td> 747 <td data-header="@Translate("Product details | Remnants | Error table | Length from", "Length from")" class="carpet-profile__fault-list-cell" v-html="fault.lgdStart"></td> 748 <td data-header="@Translate("Product details | Remnants | Error table | Length to", "Length to")" class="carpet-profile__fault-list-cell" v-html="fault.lgdEnd"></td> 749 </tr> 750 </table> 751 </div> 752 </div> 753 </div> 754 <div class="novi-overlay__close-area"> 755 <button @@click="closeProfileOverlay" class="close-button novi-overlay__close-button"> 756 <span class="close-button__icon"> 757 <svg class="svg-icon close-button__svg"> 758 <use xlink:href="@Constants.DistPath/icons/icons.svg#cross"></use> 759 </svg> 760 </span> 761 <span class="close-button__text">@Translate("Product | Sample overlay | Close", "Close")</span> 762 </button> 763 </div> 764 </div> 765 </div> 766 </div> 767 </div> 768 </div> 769 } 770 else 771 { 772 <span> 773 <div class="button-double product-details__buttons"> 774 @if (!B2cSiteActive && !string.IsNullOrWhiteSpace(Model.GetCadesignProperties().ToolUrl) && !isProductRug) 775 { 776 string firstBtnText = string.Empty; 777 string dataLayerTool = string.Empty; 778 779 if (Model.GetCadesignProperties().IsTile) 780 { 781 firstBtnText = Translate("Product | Tile", "Create your tile design"); 782 dataLayerTool = "tile tool"; 783 } 784 else if (Model.GetCadesignProperties().Recolour) 785 { 786 firstBtnText = Translate("Product | Customize", "Customize"); 787 dataLayerTool = "recolour tool"; 788 } 789 else 790 { 791 firstBtnText = Translate("Product | Visualize", "Visualize"); 792 dataLayerTool = "visualize tool"; 793 } 794 795 <script> 796 document.addEventListener('DOMContentLoaded', function () { 797 798 var button = document.getElementById("cadesign-custom-button"); 799 800 if (button) { 801 button.addEventListener('click', function (event) { 802 803 window.dataLayer = window.dataLayer || []; 804 window.dataLayer.push({ 805 "event": "tool_entry", 806 "tool": "@dataLayerTool", 807 }); 808 }); 809 } 810 }); 811 </script> 812 813 var ctaImageItem = Pageview.Area?.Item?.GetItem("CTAImage"); 814 string ctaImage = ctaImageItem != null && !string.IsNullOrEmpty(ctaImageItem.ToString()) ? ctaImageItem.ToString() : "/missing-image.png"; 815 816 <button id="cadesign-custom-button" data-href="@Model.GetCadesignProperties().ToolUrl" @@click="openCustomizeOverlay" class="button button--ghost button--black js-customize-button" data-text="@firstBtnText"> 817 <span class="button__content"> 818 <span class="button__icon"> 819 <svg class="svg-icon button__svg"> 820 <use xlink:href="@Constants.DistPath/icons/icons.svg#magic-wand"></use> 821 </svg> 822 </span> 823 <span class="button__text">@firstBtnText</span> 824 </span> 825 <div class="product-details__hide js-customize-iframe-holder"> 826 <div class="product-details__iframe-holder"> 827 <iframe class="product-details__customize-iframe" frameborder="0"></iframe> 828 <span class="product-details__wait-animation"> 829 <span></span> 830 <span></span> 831 <span></span> 832 <span></span> 833 </span> 834 </div> 835 </div> 836 </button> 837 } 838 else if (isProductRug) 839 { 840 if (showConfigurator) 841 { 842 string firstBtnText = string.Empty; 843 firstBtnText = Translate("Product | Rug configurator", "Configure rug"); 844 <a href="@configuratorFullLink" target="_blank" class="button button--ghost button--black js-customize-button"> 845 <span class="button__content"> 846 <span class="button__icon"> 847 <svg class="svg-icon button__svg"> 848 <use xlink:href="@Constants.DistPath/icons/icons.svg#magic-wand"></use> 849 </svg> 850 </span> 851 <span class="button__text">@firstBtnText</span> 852 </span> 853 <div class="product-details__hide js-customize-iframe-holder"> 854 <div class="product-details__iframe-holder"> 855 <iframe class="product-details__customize-iframe" frameborder="0"></iframe> 856 <span class="product-details__wait-animation"> 857 <span></span> 858 <span></span> 859 <span></span> 860 <span></span> 861 </span> 862 </div> 863 </div> 864 </a> 865 } 866 } 867 868 869 else if (B2cSiteActive && !string.IsNullOrWhiteSpace(Model.GetFieldValue<string>("ProductBacking")) && !string.IsNullOrWhiteSpace(Model.GetFieldValue<string>("ProductSpecificationCode"))) 870 { 871 var prod = Dynamicweb.Ecommerce.Services.Products.GetProductByNumber(Model.GetFieldValue<string>("ProductBacking"), Model.LanguageId); 872 873 <form method="post" action="/api/specifications/getpdf" class="button-double__form" id="js-downloadSpecifications"> 874 <input type="hidden" name="backingCode" value="@(Model.GetFieldValue<string>("ProductBacking"))" /> 875 <input type="hidden" name="backingName" value="@(ProductExtensions.GetProductName(product))" /> 876 <input type="hidden" name="qualityName" value="@prodCollectionName" /> 877 <input type="hidden" name="collectionCode" value="@Model.GetFieldValue("ProductCollectionCode")" /> 878 <input type="hidden" name="specificationCode" value="@(Model.GetFieldValue<string>("ProductSpecificationCode"))" /> 879 <input type="hidden" name="nationalityCode" value="@Dynamicweb.Ecommerce.Common.Context.Language.CountryCode" /> 880 <input type="hidden" name="areaId" value="@Pageview.AreaID" /> @* On the B2C site we hardcode the area id to the danish b2b site to pull the sustainability stores from there(these are defined in website settings) *@ 881 <input type="hidden" name="productName" value="@Model.Name" /> 882 <input type="hidden" name="sustainabilityChoice" value="@sustainabilityChoices" /> 883 <button type="submit" property="url" class="button button--ghost button--black" data-text="@Translate("Product details | Specifications | Download full specifications", "Download full specifications")" @@click="downloadFullSpecifications" ref="showFullSpecificationsSubmitButton"> 884 <span class="button__content"> 885 <span class="button__icon"> 886 <svg class="svg-icon button__svg"> 887 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow-down-in-circle"></use> 888 </svg> 889 </span> 890 <span class="button__text"> 891 @Translate("Product details | Specifications | Download full specifications", "Download full specifications") 892 </span> 893 </span> 894 </button> 895 </form> 896 } 897 @if (!B2cSiteActive && (variantCombinations.Any() || Model.GetRelatedGroupById("RELGRP1").Any())) 898 { 899 var nonVariantSamples = Model.GetRelatedGroupById("RELGRP1"); 900 var showSamplesVersion = ""; 901 if (variantCombinations.Any()) 902 { 903 showSamplesVersion = "showSamplesAdvanced"; 904 } 905 else if (nonVariantSamples.Any()) 906 { 907 showSamplesVersion = "showSamplesSimple"; 908 } 909 <button id="js-add-to-samples-button" type="button" class="button button--solid button--black " @@click="@showSamplesVersion" data-text="@Translate("Product | Add to samples", "Add to samples")"> 910 <span class="button__content"> 911 <span class="button__icon"> 912 <svg class="svg-icon button__svg"> 913 <use xlink:href="@Constants.DistPath/icons/icons.svg#samples"></use> 914 </svg> 915 </span> 916 <span class="button__text">@Translate("Product | Add to samples", "Add to samples")</span> 917 </span> 918 </button> 919 } 920 else if (B2cSiteActive) 921 { 922 if (IsBulkCarpets && prodCollectionName != "Geometrica Rugs") 923 { 924 var shapeOverlayBtnText = Translate("Product | See rug in room", "Se tæppet i rum"); 925 var shapeToolUrl = ProductExtensions.CadesignServiceUrl + "/rug-ui.html?prod=" + @Model.Id; 926 <button data-href="@shapeToolUrl" @@click="openCustomizeOverlay" 927 class="button button--solid button--black js-customize-button" 928 data-text="@shapeOverlayBtnText"> 929 <span class="button__content"> 930 <span class="button__icon"> 931 <svg class="svg-icon button__svg"> 932 <use xlink:href="@Constants.DistPath/icons/icons.svg#magic-wand"></use> 933 </svg> 934 </span> 935 <span class="button__text">@shapeOverlayBtnText</span> 936 </span> 937 <div class="product-details__hide js-customize-iframe-holder"> 938 <div class="product-details__iframe-holder"> 939 <iframe class="product-details__customize-iframe" frameborder="0"></iframe> 940 <span class="product-details__wait-animation"> 941 <span></span> 942 <span></span> 943 <span></span> 944 <span></span> 945 </span> 946 </div> 947 </div> 948 </button> 949 } 950 else 951 { 952 <button id="js-product-details__contact-form-link-button" @@click="scrollDown" type="button" class="button button--solid button--black " data-text="@Translate("Product | B2C Kontakt Os Knap", "B2C Kontakt Os Knap")"> 953 <span class="button__content"> 954 <span class="button__icon"> 955 <svg class="svg-icon button__svg"> 956 <use xlink:href="@Constants.DistPath/icons/icons.svg#contact"></use> 957 </svg> 958 </span> 959 <span class="button__text">@Translate("Product | B2C Kontakt Os Knap", "B2C Kontakt Os Knap")</span> 960 </span> 961 </button> 962 } 963 } 964 @if (!B2cSiteActive) 965 { 966 <div class="product-details__contact-form-link"> 967 <span class="product-details__contact-form-link-left">@Translate("Product | Do you need help", "Do you need help?")</span> 968 <span class="product-details__contact-form-link-right"> 969 <button type="button" id="js-product-details__contact-form-link-button" class="product-details__contact-form-link-button" @@click="scrollDown"> 970 @Translate("Product | Contact us", "Contact us") 971 <span class="product-details__contact-form-link-arrow"> 972 <svg class="svg-icon product-details__contact-form-link-arrow-svg"> 973 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 974 </svg> 975 </span> 976 </button> 977 </span> 978 </div> 979 } 980 else if (B2cSiteActive && !string.IsNullOrEmpty(prodB2CCollectionLink)) 981 { 982 <div class="product-details__contact-form-link product-details__contact-form-link--b2c"> 983 <a href="@prodB2CCollectionLink" type="button" class="product-details__contact-form-link-button"> 984 @Translate("Product | B2C Se vores Priser", "Se vores priser her!") 985 <span class="product-details__contact-form-link-arrow product-details__contact-form-link-arrow--b2c"> 986 <svg class="svg-icon product-details__contact-form-link-arrow-svg"> 987 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 988 </svg> 989 </span> 990 </a> 991 </div> 992 } 993 </div> 994 </span> 995 <div> 996 @TemplateHelper.RenderPartial("Ecom/Partials/Details_SelectedSamplesOverlay.cshtml") 997 @TemplateHelper.RenderPartial("Ecom/Partials/Details_AddToSamples.cshtml", Model) 998 </div> 999 } 1000 </div> 1001 </div> 1002 1003 </div> 1004 </section> 1005 1006 if (isOutletSite) 1007 { 1008 1009 } 1010 else if (B2cSiteActive) 1011 { 1012 @TemplateHelper.RenderPartial("Ecom/Partials/Details_B2CGuidesAndImages.cshtml", Model) 1013 } 1014 else 1015 { 1016 if (isProductRug) 1017 { 1018 @TemplateHelper.RenderPartial("Ecom/Partials/Details_RugShapeAndFinishingTypes.cshtml", Model) 1019 @TemplateHelper.RenderPartial("Ecom/Partials/Details_DesignerInformation.cshtml", Model) 1020 1021 } 1022 else 1023 { 1024 @TemplateHelper.RenderPartial("Ecom/Partials/Details_B2BGuidesAndImages.cshtml", Model) 1025 } 1026 1027 @TemplateHelper.RenderPartial("Ecom/Partials/Details_SpecificationsAndHighlights.cshtml", Model) 1028 1029 } 1030 1031 1032 @helper CircleBackLogo() 1033 { 1034 <div class="product-details__circle-back-overlay-container"> 1035 <div class="product-details__circle-back-overlay"> 1036 <div class="product-details__circle-back-overlay--img-container"> 1037 <img class="product-details__circle-back-overlay--img" src="@ImageUiFormatHelper.Format("/Files/Files/Images/CircleBack/Ege_Circular_Black.png", 123, 136)" height="123" width="136" /> 1038 </div> 1039 </div> 1040 </div> 1041 } 1042 } 1043

Vil du vide mere?

Så lad os kontakte dig

Har du spørgsmål eller forespørgsler om Ege Carpets eller vores tæpper, er du velkommen til at kontakte os.

Indsæt dine kontakt informationer og vi vil kontakte dig - eller du kan finde kontaktoplysningerne på en forhandler.