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 // : "&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 + "&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 + "&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
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.