Error executing template "Designs/Ege/Paragraph/CollectionSpecificationPartials/Details_Data.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_d3e84d3226a54bc08acd4220e0f2a8e9.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\Paragraph\CollectionSpecificationPartials\Details_Data.cshtml:line 11
   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 Dynamicweb.Frontend 5 @using EGE.Website.CustomModules.Extensions 6 @using EGE.Website.CustomModules 7 @using Dynamicweb.Ecommerce.Variants; 8 9 @{ 10 var product = Dynamicweb.Ecommerce.Services.Products.GetProductById(Model.Id, Model.VariantId, Model.LanguageId); 11 var variantCombinations = product.VariantCombinations; 12 var variantGroups = product.VariantGroups; 13 var qualityVariants = variantGroups.SingleOrDefault(x => x.Id == "VARGRP3"); 14 var backingVariants = variantGroups.SingleOrDefault(x => x.Id == "VARGRP2"); 15 var sampleVariants = variantGroups.SingleOrDefault(x => x.Id == "VARGRP4"); 16 var relatedSamples = Model.GetRelatedGroupById("RELGRP1"); 17 var keyDictionary = new Dictionary<string, int>(); 18 var keyValue = 0; 19 var architectFolders = Model.GetRelatedGroupByIdOfDefaultGroupInMasterLang("RELGRP3"); 20 } 21 22 <script> 23 var languageId = "@Model.LanguageId"; 24 var languageCode = "@Pageview.Area.EcomCountryCode"; 25 var architectFolderItems = [ 26 @foreach (var folder in architectFolders) 27 { 28 @:{ 29 @:"preTitle": "@folder.Name", 30 @:"title": "@folder.Name", 31 @:"id": "@folder.Id", 32 @:"imagePath": "@(ProductExtensions.GetProductImagePath(folder.Id, out bool isExternal))" 33 @:}, 34 } 35 ]; 36 37 var listJsonSampleSizeItems = [ 38 @if (sampleVariants != null) 39 { 40 foreach (var sample in sampleVariants.GetVariantOptions(Model.Id)) 41 { 42 keyDictionary.Add(sample.Id, keyValue); 43 if (sample != null) 44 { 45 @:{ 46 @:"preTitle": "@sample.Name", 47 @:"title": "@sample.Name", 48 @:"id": @keyValue, 49 @:"variantId": "@sample.Id" 50 @:} 51 if (sample != sampleVariants.GetVariantOptions(Model.Id).Last()) 52 { 53 @:, 54 } 55 keyValue++; 56 } 57 } 58 } 59 ]; 60 61 var listJsonQualityItems = [ 62 @{ 63 var qualityVariantOptions = new List<Dynamicweb.Ecommerce.Variants.VariantOption>(); 64 var isCollectionQuality = false; 65 } 66 @if (qualityVariants != null) 67 { 68 qualityVariantOptions = qualityVariants.GetVariantOptions(Model.Id).ToList(); 69 } 70 else 71 { 72 var collectionCode = product.GetFieldValue<string>("ProductCollectionCode").TrimStart(new char[] { '0' }); 73 74 if (!string.IsNullOrEmpty(collectionCode)) 75 { 76 isCollectionQuality = true; 77 78 var qualOption = new Dynamicweb.Ecommerce.Variants.VariantOption 79 { 80 Id = product.Id, 81 MediumImage = collectionCode, 82 LanguageId = product.LanguageId 83 }; 84 qualityVariantOptions.Add(qualOption); 85 } 86 } 87 @foreach (var quality in qualityVariantOptions) 88 { 89 keyDictionary.Add(quality.Id, keyValue); 90 if (quality != null) 91 { 92 var prod = Dynamicweb.Ecommerce.Services.Products.GetProductByNumber(quality.Id, quality.LanguageId); 93 var productDefinedTitle = ProductExtensions.GetValueForVariantSpecField(prod, "QualityVariantTitle"); 94 var variantTitle = ""; 95 var variantImageUrl = (Constants.VariantImagePath + quality.MediumImage + ".jpg"); 96 if (!string.IsNullOrWhiteSpace(productDefinedTitle)) 97 { 98 variantTitle = productDefinedTitle; 99 var productDefinedImage = ProductExtensions.GetValueForVariantSpecField(prod, "QualityVariantImage"); 100 if (!string.IsNullOrWhiteSpace(productDefinedImage)) 101 { 102 variantImageUrl = productDefinedImage.Replace("..", "/Files"); 103 } 104 } 105 else if (isCollectionQuality && !string.IsNullOrEmpty(prod.PrimaryGroupId)) 106 { 107 var primaryGroup = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(prod.PrimaryGroupId, prod.LanguageId); 108 variantTitle = primaryGroup.GetFieldValue<string>("M3GroupName"); 109 } 110 else 111 { 112 variantTitle = quality.Name; 113 114 } 115 @:{ 116 @:"preTitle": "@variantTitle", 117 @:"title": "@variantTitle", 118 @:"id": @keyValue, 119 @:"variantId": "@quality.Id", 120 @:"forceSelect": @isCollectionQuality.ToString().ToLower(), 121 @:"toolTip": { 122 @:"title": "@variantTitle", 123 @:"text": [{ 124 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F1Title")", 125 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F1Text")", 126 @:"link": "@SearchEngineFriendlyURLs.GetFriendlyUrl(ProductExtensions.GetValueForVariantSpecField(prod, "F1Link"))" 127 @:}, 128 @:{ 129 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F2Title")", 130 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F2Text")" 131 @:}, 132 @:{ 133 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F3Title")", 134 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F3Text")" 135 @:}, 136 @:{ 137 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F4Title")", 138 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F4Text")" 139 @:}, 140 @:{ 141 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F5Title")", 142 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F5Text")" 143 @:}, 144 @:{ 145 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F6Title")", 146 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F6Text")" 147 @:} 148 @:], 149 @:"paragraph": { 150 @:"title": "@ProductExtensions.GetValueForVariantSpecField(prod, "DescriptionTitle")", 151 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "SpecDescriptionText")" 152 @:}, 153 @:"link": "@SearchEngineFriendlyURLs.GetFriendlyUrl(ProductExtensions.GetValueForVariantSpecField(prod, "F8Link"))", 154 @:"linkText": "@ProductExtensions.GetValueForVariantSpecField(prod, "F8Title")", 155 @:"imageUrl": "@variantImageUrl" 156 @:} 157 @:} 158 if (qualityVariants != null && quality != qualityVariantOptions.Last()) 159 { 160 @:, 161 } 162 keyValue++; 163 } 164 } 165 ]; 166 167 var listJsonBackingItems = [ 168 @{ 169 var forceSelectBacking = false; 170 IList<VariantOption> backingVariantOptions = new List<VariantOption>(); 171 if (backingVariants == null) 172 { 173 var backingCode = product.GetFieldValue<string>("ProductBacking"); 174 if (!string.IsNullOrEmpty(backingCode)) 175 { 176 var backingOption = new Dynamicweb.Ecommerce.Variants.VariantOption 177 { 178 Id = backingCode, 179 MediumImage = backingCode, 180 LanguageId = product.LanguageId 181 }; 182 backingVariantOptions.Add(backingOption); 183 forceSelectBacking = true; 184 } 185 } 186 else 187 { 188 backingVariantOptions = backingVariants.GetVariantOptions(Model.Id); 189 } 190 } 191 @if (backingVariantOptions.Any()) 192 { 193 foreach (var backing in backingVariantOptions) 194 { 195 keyDictionary.Add(backing.Id, keyValue); 196 var prod = Dynamicweb.Ecommerce.Services.Products.GetProductByNumber(backing.Id, backing.LanguageId); 197 198 if (backing != null && prod != null) 199 { 200 var variantTitle = ProductExtensions.GetProductName(prod); 201 @:{ 202 @:"preTitle": "@ProductExtensions.GetCustomFieldValue(prod, "M3ProductName")", 203 @:"title": "@variantTitle", 204 @:"id": @keyValue, 205 @:"variantId": "@backing.Id", 206 @:"forceSelect": @forceSelectBacking.ToString().ToLower(), 207 @:"toolTip": { 208 @:"title": "@variantTitle", 209 @:"text": [{ 210 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F1Title")", 211 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F1Text")", 212 @:"link": "@SearchEngineFriendlyURLs.GetFriendlyUrl(ProductExtensions.GetValueForVariantSpecField(prod, "F1Link"))" 213 @:}, 214 @:{ 215 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F2Title")", 216 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F2Text")" 217 @:}, 218 @:{ 219 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F3Title")", 220 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F3Text")" 221 @:}, 222 @:{ 223 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F4Title")", 224 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F4Text")" 225 @:}, 226 @:{ 227 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F5Title")", 228 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F5Text")" 229 @:}, 230 @:{ 231 @:"subtitle": "@ProductExtensions.GetValueForVariantSpecField(prod, "F6Title")", 232 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "F6Text")" 233 @:} 234 @:], 235 @:"paragraph": { 236 @:"title": "@ProductExtensions.GetValueForVariantSpecField(prod, "DescriptionTitle")", 237 @:"text": "@ProductExtensions.GetValueForVariantSpecField(prod, "SpecDescriptionText")" 238 @:}, 239 @:"link": "@SearchEngineFriendlyURLs.GetFriendlyUrl(ProductExtensions.GetValueForVariantSpecField(prod, "F8Link"))", 240 @:"linkText": "@ProductExtensions.GetValueForVariantSpecField(prod, "F8Title")", 241 @:"imageUrl": "@(Constants.VariantImagePath + backing.MediumImage + ".jpg")" 242 @:} 243 @:} 244 if (backing != backingVariantOptions.Last()) 245 { 246 @:, 247 } 248 keyValue++; 249 } 250 } 251 } 252 ]; 253 254 @if (!variantGroups.Any()) 255 { 256 int countRelated = 0; 257 @:var relatedSamples = [ 258 foreach (var sample in relatedSamples) 259 { 260 @:{ 261 @:"preTitle": "@sample.Id", 262 @:"title": "@sample.Name", 263 @:"variantId": "@sample.Id", 264 @:"id": @countRelated, 265 @:"imageUrl": "@ProductExtensions.GetProductImagePath(sample.Id, out bool isExternal, "XS")" 266 @:} 267 if (sample != relatedSamples.Last()) 268 { 269 @:, 270 } 271 countRelated++; 272 } 273 @:]; 274 } 275 276 var variantCombinations = [ 277 @if (variantCombinations.Any()) 278 { 279 foreach (var variantCombination in variantCombinations) 280 { 281 var variants = variantCombination.GetVariantOptionIds(); 282 if (variants.Any()) 283 { 284 @:{ 285 @:"qualityId": @keyDictionary[variants[0]], 286 @:"sampleSizeId": @(variants.Length >= 2 ? keyDictionary[variants[1]] : 0), 287 @:"backingId": @(variants.Length >= 3 ? keyDictionary[variants[2]] : 0) 288 @:} 289 } 290 if (variantCombination != variantCombinations.Last()) 291 { 292 @:, 293 } 294 } 295 } 296 ]; 297 var combinations = [ 298 @foreach (var variantCombination in variantCombinations) 299 { 300 var variants = variantCombination.GetVariantOptionIds(); 301 if (variants.Any(x => x == "NA")) 302 { 303 continue; 304 } 305 if (variants.Any() && variants.Length > 2) 306 { 307 int qualityId; 308 int sampleSizeId; 309 int backingId; 310 @:{ 311 if (keyDictionary.TryGetValue(variants[0], out qualityId)) 312 { 313 @:"qualityId": @qualityId, 314 } 315 if (keyDictionary.TryGetValue(variants[1], out sampleSizeId)) 316 { 317 @:"sampleSizeId": @sampleSizeId, 318 } 319 if (keyDictionary.TryGetValue(variants[2], out backingId)) 320 { 321 @:"backingId": @backingId 322 } 323 @:} 324 } 325 if (variantCombination != variantCombinations.Last()) 326 { 327 @:, 328 } 329 } 330 ]; 331 332 </script>

Recoloured

Choose quality

Chosen: {{selectedQuality.title}}
{{item.title}}

Choose backing

Chosen: {{selectedBacking.title}}
{{item.title}}

Choose sample size

Chosen: {{selectedSize.title}}
{{item.title}}
When you have chosen a quality and a backing, the available sample sizes will be shown here.

Recoloured

Choose sample

Chosen: {{selectedRelated.title}}
{{item.title}}
Error executing template "Designs/Ege/Paragraph/CollectionSpecificationPartials/Details_OutletData.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at Dynamicweb.Ecommerce.Products.ProductService.GetProductsAndVariantsByProduct(Product product)
   at CompiledRazorTemplates.Dynamic.RazorEngine_3f2b57c6955c44ec91c23b836f635ada.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\Paragraph\CollectionSpecificationPartials\Details_OutletData.cshtml:line 12
   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 Dynamicweb.Ecommerce.Prices 5 @using Dynamicweb.Frontend 6 @using EGE.Website.CustomModules.Extensions 7 @using EGE.Website.CustomModules 8 @using Dynamicweb.Ecommerce.Variants; 9 10 @{ 11 var product = Dynamicweb.Ecommerce.Services.Products.GetProductById(Model.Id, Model.VariantId, Model.LanguageId); 12 var productVariants = Dynamicweb.Ecommerce.Services.Products.GetProductsAndVariantsByProduct(product).Where(x => !string.IsNullOrEmpty(x.VariantId) && x.Active); 13 14 var productVariantObjects = productVariants.Select(x => new 15 { 16 Id = x.Id, 17 VariantId = x.VariantId, 18 ProductNumber = x.Number, 19 M3ProductNumber = x.GetCategoryValue("OutletSpecs", "M3ProductNumber"), 20 M3BatchNumber = x.GetCategoryValue("OutletSpecs", "M3BatchNumber"), 21 M3Version = x.GetCategoryValue("OutletSpecs", "Version"), 22 AvailableArea = x.GetCategoryValue("OutletSpecs", "AvailableArea"), 23 RollCorners = x.GetCategoryValue("OutletSpecs", "RollCorners"), 24 NumberOfFlaws = x.GetCategoryValue("OutletSpecs", "NumberOfFlaws"), 25 IsWasteCarpet = x.GetCategoryValue("OutletSpecs", "WasteCarpet"), 26 Backing = product.GetFieldValue<string>("ProductBacking"), 27 PatternNumber = x.GetCategoryValue("OutletSpecs", "PatternNumber"), 28 UnitPrice = Dynamicweb.Ecommerce.Prices.Price.GetPrices(x.Id, Dynamicweb.Ecommerce.Common.Context.Currency.Code, $"{x.GetCategoryValue("OutletSpecs", "M3ProductNumber")}-{x.GetCategoryValue("OutletSpecs", "M3BatchNumber")}-UNIT{Dynamicweb.Ecommerce.Common.Context.Currency.Code}")?.FirstOrDefault()?.Amount, 29 Price = x.GetPrice(new PriceContext(Dynamicweb.Ecommerce.Common.Context.Currency, Dynamicweb.Ecommerce.Common.Context.Country)).Price, 30 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code 31 }).ToList(); 32 } 33 34 <script> 35 var productVariantObjects = {"productVariantOptions": @Newtonsoft.Json.JsonConvert.SerializeObject(productVariantObjects)}; 36 </script>

Thank you for your request!

We are preparing your digital files pack and you will receive an email shortly with a link to download.

Meanwhile, you can select and order free physical samples from your configuration that can be shipped to you.

{{ title }}

We are sorry, we could not get data from one or more of the products.
Error executing template "Designs/Ege/Paragraph/CollectionSpecificationPartials/Details_SpecificationsAndHighlights.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_825f947806d84975ada46f785c8f8125.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\Paragraph\CollectionSpecificationPartials\Details_SpecificationsAndHighlights.cshtml:line 11
   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.Extensions 6 @using EGE.Website.CustomModules.Helpers 7 @using EGE.Website.CustomModules.ViewModels 8 9 @{ 10 var product = Dynamicweb.Ecommerce.Services.Products.GetProductById(Model.Id, Model.VariantId, Model.LanguageId); 11 var variantCombinations = product.VariantCombinations; 12 string specificationCode; 13 string backingCode; 14 string qualityId; 15 string conceptCode = product.GetFieldValue<string>("ProductConcept"); 16 var CurrentLang = Dynamicweb.Frontend.PageView.Current().Area.CultureInfo.Parent.NativeName.ToLower(); 17 byte[] tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(CurrentLang); 18 CurrentLang = System.Text.Encoding.UTF8.GetString(tempBytes); 19 20 21 if (variantCombinations.Any()) 22 { 23 var defaultVariantCombination = variantCombinations.First(); 24 var defaultVariantCombinationIds = defaultVariantCombination.GetVariantOptionIds(); 25 qualityId = defaultVariantCombinationIds[0]; 26 27 var qualityVariantOption = Dynamicweb.Ecommerce.Services.VariantOptions.GetVariantOption(qualityId, Model.LanguageId); 28 specificationCode = EGE.Website.CustomModules.Services.VariantService.GetPropertyValue("SpecificationCode", qualityVariantOption.Id, Model.LanguageId); 29 backingCode = defaultVariantCombinationIds[2]; 30 } 31 else 32 { 33 qualityId = string.Empty; 34 specificationCode = Model.GetFieldValue<string>("ProductSpecificationCode"); 35 backingCode = Model.GetFieldValue<string>("ProductBacking"); 36 } 37 38 var specificationsFeed = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, Constants.SpecificationsFeedNavigationTag); 39 var highlightsFeed = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, Constants.HighlightsFeedNavigationTag); 40 41 SpecificationHighlightsViewModel highlightsViewModel = null; 42 SpecificationsViewModel specificationsViewModel = null; 43 44 var specFound = false; 45 if (!string.IsNullOrWhiteSpace(specificationCode) && !string.IsNullOrWhiteSpace(backingCode)) 46 { 47 var specificationsContainer = EGE.Specification.SpecificationContainer.Instance; 48 var specifications = specificationsContainer.GetSpecification(specificationCode, backingCode, Dynamicweb.Ecommerce.Common.Context.Language.Code2); 49 if (specifications != null) 50 { 51 specFound = true; 52 var highlights = specificationsContainer.GetSpecificationHighlight(specificationCode, backingCode, Dynamicweb.Ecommerce.Common.Context.Language.Code2); 53 specificationsViewModel = new EGE.Website.CustomModules.ViewModels.SpecificationsViewModel(specifications); 54 highlightsViewModel = new EGE.Website.CustomModules.ViewModels.SpecificationHighlightsViewModel(highlights); 55 } 56 } 57 58 var sustainabilityChoices = string.Empty; 59 bool hideSpecs = false; 60 bool hideSpecsManually = Pageview.AreaSettings.GetBoolean("HideProductCertificates"); 61 62 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 63 { 64 var susChoiceList = (Model.ProductCategories["CarpetCategory"].Fields["PdfSustainBlocks"]?.Value as List<FieldOptionValueViewModel>); 65 66 foreach (var choice in susChoiceList) 67 { 68 sustainabilityChoices += choice.Value; 69 } 70 Boolean.TryParse((Model.ProductCategories["CarpetCategory"].Fields["HideSpecifications"]?.Value)?.ToString(), out hideSpecs); 71 } 72 73 } 74 75 @if (specFound) 76 { 77 if (specificationsFeed == null) 78 { 79 <h5>SpecificationsFeed not found. Check Nav-tag.</h5> 80 } 81 else if (highlightsFeed == null) 82 { 83 <h5>HighlightsFeed not found. Check Nav-tag.</h5> 84 } 85 else 86 { 87 if (highlightsViewModel != null) 88 { 89 <script> 90 var highlightsFeedUrl = '/api/specifications/gethighlights'; 91 var specificationHighlights = [ 92 @foreach (var highlightSection in highlightsViewModel.HighlightSections) 93 { 94 @:{ 95 @:'title': '@highlightSection.Title', 96 @:'specificationLines': [ 97 98 foreach (var highlight in highlightSection.SpecificationLines) 99 { 100 var defaulDocCount = highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).Count(); 101 @:{ 102 @:'name': '@highlight.Name', 103 @:'selectedDocument': { 104 if(defaulDocCount > 0) 105 { 106 @:'name': "@highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).FirstOrDefault().Name", 107 @:'link': '@highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).FirstOrDefault().Link', 108 } else 109 { 110 @:'name': "", 111 @:'link': '', 112 } 113 114 @:}, 115 @:'documents': [ 116 foreach (var document in highlight.Documents) 117 { 118 if (!string.IsNullOrEmpty(document.Link) && !string.IsNullOrEmpty(document.Name)) 119 { 120 @:{ 121 @:'name': "@document.Name", 122 @:'link': '@document.Link' 123 @:}, 124 } 125 } 126 @:] 127 @:}, 128 } 129 @:] 130 @:}, 131 } 132 ]; 133 </script> 134 } 135 136 <div class="product-specification-and-highlights" id="js-product-specification-and-highlights"> 137 <section class="product-specs" id="js-product-specs"> 138 139 <div class="container"> 140 <div class="product-specs__inner"> 141 <div class="row"> 142 <h1 class="product-specs__title js-alt-color">@Translate("Product details | Specifications | Title", "Product Specifications")</h1> 143 </div> 144 145 <transition name="tooltip-show"> 146 <div class="product-specs-tool-tip" v-if="toolTip !== null" id="js-product-specs-tool-tip"> 147 <div class="product-specs-tool-tip__close" @@click="closeToolTip"> 148 <svg class="icon icon--cross"> 149 <use xmlns:xlink="http://www.w3.org/1999/xlink" 150 xlink:href="@Constants.DistPath/icons/icons.svg#cross"> 151 </use> 152 </svg> 153 </div> 154 <figure class="product-specs-tool-tip__image" v-if="toolTip.imageUrl" :alt="toolTip.title"> 155 <img v-bind:src="toolTip.imageUrl" :alt="toolTip.title"> 156 </figure> 157 <div> 158 <div class="product-specs-tool-tip__title">{{toolTip.title}}</div> 159 <div class="product-specs-tool-tip__text"> 160 <div v-for="item in toolTip.text" class="product-specs-tool-tip__lines"> 161 <span v-if="item.subtitle" class="product-specs-tool-tip__subtitle">{{item.subtitle}}:</span> 162 <a v-bind:href="item.link" v-if="item.link"> 163 <span class="product-specs-tool-tip__speclink">{{item.text}}</span> 164 </a> 165 <span v-else class="product-specs-tool-tip__spec">{{item.text}}</span> 166 </div> 167 <div class="product-specs-tool-tip__paragraph"> 168 <div class="product-specs-tool-tip__subtitle">{{toolTip.paragraph.title}}</div> 169 <span>{{toolTip.paragraph.text}}</span> 170 </div> 171 </div> 172 <a class="product-specs-tool-tip__link" v-bind:href="toolTip.link">{{toolTip.linkText}}</a> 173 </div> 174 </div> 175 </transition> 176 177 <div class="row"> 178 <div class="col-xs-12"> 179 <h2 class="product-specs__subtitle"> 180 @Translate("Product details | Specifications | Subtitle", "Specifications<br>based on") 181 </h2> 182 </div> 183 </div> 184 <div class="row"> 185 <div class="col-xs-12 col-md-10 col-md-offset-1"> 186 <div class="product-specs-info"> 187 <div id="product-specs-info__name" class="product-specs-info__name">@product.DefaultGroup.Name</div> 188 <div class="product-specs-info__item" v-if="selectedQuality != null && selectedQuality != 0"> 189 <span class="product-specs-info__label">@Translate("Product details | Specifications | Quality", "Quality"):</span> 190 {{selectedQuality.preTitle}} 191 </div> 192 <div class="product-specs-info__item" v-if="selectedBacking != null && selectedBacking != 0"> 193 <span class="product-specs-info__label">@Translate("Product details | Specifications | Backing", "Backing"):</span> 194 {{selectedBacking.preTitle}} 195 </div> 196 </div> 197 </div> 198 </div> 199 <div class="row"> 200 <div class="col-xs-12 col-md-6 col-md-offset-1"> 201 <div class="product-specs-quality"> 202 <h3 class="product-specs-quality__title">@Translate("Product details | Specifications | Quality", "Quality")</h3> 203 <div class="product-specs-list"> 204 <div class="product-specs-list-item" v-if="availableOptions.quality" 205 :class="{'product-specs-list-item--selected': selectedQuality === item ,'product-specs-list-item--hide':availableOptions.quality[item.id]===false}" 206 v-for="item in qualityItems"> 207 <figure class="product-specs-list-item__image" 208 @@click="selectOption(item,'selectedQuality')"> 209 <img :src="item.toolTip.imageUrl" :alt="item.title"> 210 <svg class="icon icon--checkmark"> 211 <use xmlns:xlink="http://www.w3.org/1999/xlink" 212 xlink:href="@Constants.DistPath/icons/icons.svg#checkmark"> 213 </use> 214 </svg> 215 </figure> 216 <div class="product-specs-list-item__title">{{item.title}}</div> 217 <div class="product-specs-list-item__read-more" v-if="item.toolTip" 218 @@click="showToolTip(item.toolTip, $event)"> 219 @Translate("Read more", "Read more") 220 </div> 221 </div> 222 </div> 223 </div> 224 </div> 225 <div class="col-xs-12 col-md-3 col-md-offset-1"> 226 <div class="product-specs-backing"> 227 <h3 class="product-specs-backing__title" v-if="Object.keys(backingItems).length !== 0">@Translate("Product details | Specifications | Backing", "Backing")</h3> 228 <div class="product-specs-list"> 229 <div class="product-specs-list-item" v-if="availableOptions.backing" 230 :class="{'product-specs-list-item--selected': selectedBacking === item ,'product-specs-list-item--hide':availableOptions.backing[item.id]===false}" 231 v-for="item in backingItems"> 232 <figure class="product-specs-list-item__image" 233 @@click="selectOption(item,'selectedBacking')"> 234 <img :src="item.toolTip.imageUrl" alt=""> 235 <svg class="icon icon--checkmark"> 236 <use xmlns:xlink="http://www.w3.org/1999/xlink" 237 xlink:href="@Constants.DistPath/icons/icons.svg#checkmark"> 238 </use> 239 </svg> 240 </figure> 241 <div class="product-specs-list-item__title">{{item.title}}</div> 242 <div class="product-specs-list-item__read-more" v-if="item.toolTip" 243 @@click="showToolTip(item.toolTip, $event)"> 244 @Translate("Read more", "Read more") 245 </div> 246 </div> 247 </div> 248 </div> 249 </div> 250 </div> 251 @if (!hideSpecs) 252 { 253 <div class="product-specs-buttons"> 254 <div class="button-double product-specs-buttons"> 255 <form method="post" action="/api/specifications/getpdf"> 256 <input type="hidden" v-if="selectedBacking != null" name="backingCode" :value="selectedBacking.variantId" /> 257 <input type="hidden" v-if="selectedBacking != null" name="backingName" :value="selectedBacking.title" /> 258 <input type="hidden" v-if="selectedQuality != null" name="qualityName" :value="selectedQuality.title" /> 259 <input type="hidden" name="collectionCode" value="@Model.GetFieldValue("ProductCollectionCode")" /> 260 261 @if (variantCombinations.Any()) 262 { 263 <input type="hidden" v-if="selectedQuality != null" name="qualityId" :value="selectedQuality.variantId" /> 264 } 265 else 266 { 267 <input type="hidden" name="specificationCode" value="@specificationCode" /> 268 } 269 <input type="hidden" name="nationalityCode" value="@Dynamicweb.Ecommerce.Common.Context.Language.Code2" /> 270 <input type="hidden" name="areaId" value="@Pageview.AreaID" /> 271 <input type="hidden" name="productName" value="@Model.Name" /> 272 <input type="hidden" name="sustainabilityChoice" value="@sustainabilityChoices" /> 273 <button type="submit" title="" property="url" class="button button--ghost button--gold" data-text="Download specifications" :class="{ 'button--error':showDownloadFullSpecificationsError }" @@click="downloadFullSpecifications" ref="showFullSpecificationsSubmitButton"> 274 <span class="button__error-message">@Translate("Product details | Specifications | View full specifications error message", "Please choose both a quality and backing above to view full specifications")</span> 275 <span class="button__content"> 276 <span class="button__icon"> 277 <svg class="svg-icon button__svg"> 278 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow-down-in-circle"></use> 279 </svg> 280 </span> 281 <span class="button__text"> 282 @Translate("Product details | Specifications | Download full specifications", "Download full specifications") 283 </span> 284 </span> 285 </button> 286 </form> 287 <button type="button" class="button button--solid button--gold " data-text="@Translate("Product details | Specifications | View full specifications", "View full specifications")" @@click="viewFullSpecs" data-service="@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(specificationsFeed.ID)" data-highlights-service="@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(highlightsFeed.ID)" data-specification-code="@specificationCode" :class="{ 'button--error':showFullSpecificationsError }"> 288 <span class="button__error-message">@Translate("Product details | Specifications | View full specifications error message", "Please choose both a quality and backing above to view full specifications")</span> 289 <span class="button__content"> 290 <span class="button__icon"> 291 <svg class="svg-icon button__svg"> 292 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 293 </svg> 294 </span> 295 <span class="button__text">@Translate("Product details | Specifications | View full specifications", "View full specifications")</span> 296 </span> 297 </button> 298 </div> 299 </div> 300 } 301 </div> 302 </div> 303 </section> 304 305 @if (!hideSpecs) 306 { 307 308 if (specificationsViewModel != null && highlightsViewModel != null) 309 { 310 <div id="js-spec-list" class="overlay-template"> 311 @TemplateHelper.RenderPartial("Feeds/SpecificationsFeed.cshtml", specificationsViewModel) 312 </div> 313 314 if (conceptCode != "10" && !hideSpecsManually) 315 { 316 <transition name="product-highlights-fade"> 317 318 <section class="product-highlights"> 319 <div class="container"> 320 <div class="product-highlights__inner"> 321 <div class="row"> 322 <div class="col-xs-12 col-md-2"> 323 <h2 class="product-highlights__subtitle">@Translate("Product details | Specifications | Specification highlights", "Specification<br/>highlights")</h2> 324 </div> 325 <div class="col-xs-12 col-md-10"> 326 <div class="product-highlights__options"> 327 <div v-for="category in specificationHighlights"> 328 <h3 class="product-highlights__options-title">{{category.title}}</h3> 329 <div class="product-highlights__options-list"> 330 <div class="product-highlights__options-list-item" 331 v-for="line in category.specificationLines"> 332 <span class="product-highlights__options-list-item-label">{{line.name}}</span> 333 <span class="product-highlights__options-list-item-dropdown"> 334 <div class="dropdown dropdown--not-standalone"> 335 <div class="dropdown__header" 336 v-bind:class="{ 'dropdown__header-active': line.showDropdown}" 337 @@click="toggleDropdown(line)"> 338 <span class="dropdown__type"> 339 <span v-if="!line.selectedValue && line.defaultValue"> 340 {{line.defaultValue.name}} 341 </span> 342 <span v-if="line.selectedValue"> 343 {{line.selectedValue.name}} 344 </span> 345 </span> 346 <span class="dropdown__direction"> 347 <figure class="dropdown__icon" 348 v-bind:class="{ 'dropdown__icon-active': line.showDropdown}"> 349 <svg class="svg-icon dropdown__icon-arrow"> 350 <use xlink:href="../../dist/icons/icons.svg#arrow-down-in-circle"></use> 351 </svg> 352 </figure> 353 </span> 354 </div> 355 356 <div class="dropdown__body" 357 v-bind:class="{ 'dropdown__body-active': line.showDropdown}" 358 v-if="line.showDropdown != undefined"> 359 <div class="dropdown__body-header" 360 v-bind:class="{ 'dropdown__body-header-active': line.showDropdown}" 361 @@click="toggleDropdown(line)"> 362 <span class="dropdown__type dropdown__type-body"> 363 <span v-if="!line.selectedValue.name"> 364 {{line.defaultValue.name}} 365 </span> 366 <span v-if="line.selectedValue.name"> 367 {{line.selectedValue.name}} 368 </span> 369 </span> 370 <span class="dropdown__direction"> 371 <figure class="dropdown__icon dropdown_icon" 372 v-bind:class="{ 'dropdown__icon-active': line.showDropdown}"> 373 <svg class="svg-icon dropdown__icon-arrow"> 374 <use xlink:href="../../dist/icons/icons.svg#arrow-down-in-circle"></use> 375 </svg> 376 </figure> 377 </span> 378 </div> 379 <hr class="dropdown__body-hr" /> 380 <div class="dropdown__select-container"> 381 <div class="dropdown__select-list"> 382 <div class="dropdown__select-list-item" 383 v-for="doc in line.documents" 384 @@click="itemListSelected(line,doc)"> 385 <label class="dropdown__select-label">{{doc.name}}</label> 386 </div> 387 </div> 388 </div> 389 </div> 390 </div> 391 <a v-if="line.selectedValue" :href="line.selectedValue.link" download 392 class="product-highlights__options-list-item-link">@Translate("Global | Download", "Download")</a> 393 </span> 394 </div> 395 </div> 396 </div> 397 </div> 398 </div> 399 </div> 400 </div> 401 </div> 402 </section> 403 </transition> 404 } 405 } 406 } 407 </div> 408 } 409 } 410 else 411 { 412 <p>No specifications found with Backing: <b>@backingCode</b> & <b>Specificationcode: @specificationCode</b></p> 413 }
Trends & News, yes please