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