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

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.