Error executing template "Designs/Ege/Ecom/Partials/Details_Data.cshtml" System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.ThrowHelper.ThrowKeyNotFoundException() at System.Collections.Generic.Dictionary`2.get_Item(TKey key) at CompiledRazorTemplates.Dynamic.RazorEngine_acd0ffde26604ae9a0b987316f773f8c.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\Ecom\Partials\Details_Data.cshtml:line 285 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))" 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, "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>
Error executing template "Designs/Ege/Ecom/Partials/Details_SpecificationsAndHighlights.cshtml" System.IndexOutOfRangeException: Index was outside the bounds of the array. at CompiledRazorTemplates.Dynamic.RazorEngine_62145569a89b48e589cc7d0a393a5584.Execute() in E:\Solutions\egecarpets.dk\Files\Templates\Designs\Ege\Ecom\Partials\Details_SpecificationsAndHighlights.cshtml:line 29 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 if (Model.ProductCategories.ContainsKey("CarpetCategory")) 61 { 62 var susChoiceList = (Model.ProductCategories["CarpetCategory"].Fields["PdfSustainBlocks"]?.Value as List<FieldOptionValueViewModel>); 63 64 foreach (var choice in susChoiceList) 65 { 66 sustainabilityChoices += choice.Value; 67 } 68 Boolean.TryParse((Model.ProductCategories["CarpetCategory"].Fields["HideSpecifications"]?.Value)?.ToString(), out hideSpecs); 69 } 70 71 } 72 73 @if (specFound) 74 { 75 if (specificationsFeed == null) 76 { 77 <h5>SpecificationsFeed not found. Check Nav-tag.</h5> 78 } 79 else if (highlightsFeed == null) 80 { 81 <h5>HighlightsFeed not found. Check Nav-tag.</h5> 82 } 83 else 84 { 85 if (highlightsViewModel != null) 86 { 87 <script> 88 var highlightsFeedUrl = '/api/specifications/gethighlights'; 89 var specificationHighlights = [ 90 @foreach (var highlightSection in highlightsViewModel.HighlightSections) 91 { 92 @:{ 93 @:'title': '@highlightSection.Title', 94 @:'specificationLines': [ 95 96 foreach (var highlight in highlightSection.SpecificationLines) 97 { 98 var defaulDocCount = highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).Count(); 99 @:{ 100 @:'name': '@highlight.Name', 101 @:'selectedDocument': { 102 if(defaulDocCount > 0) 103 { 104 @:'name': "@highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).FirstOrDefault().Name", 105 @:'link': '@highlight.Documents.Where(x => x.Name.ToLower().Contains(CurrentLang)).FirstOrDefault().Link', 106 } else 107 { 108 @:'name': "", 109 @:'link': '', 110 } 111 112 @:}, 113 @:'documents': [ 114 foreach (var document in highlight.Documents) 115 { 116 if (!string.IsNullOrEmpty(document.Link) && !string.IsNullOrEmpty(document.Name)) 117 { 118 @:{ 119 @:'name': "@document.Name", 120 @:'link': '@document.Link' 121 @:}, 122 } 123 } 124 @:] 125 @:}, 126 } 127 @:] 128 @:}, 129 } 130 ]; 131 </script> 132 } 133 134 <div class="product-specification-and-highlights" id="js-product-specification-and-highlights"> 135 <section class="product-specs" id="js-product-specs"> 136 137 <div class="container"> 138 <div class="product-specs__inner"> 139 <div class="row"> 140 <h1 class="product-specs__title js-alt-color">@Translate("Product details | Specifications | Title", "Product Specifications")</h1> 141 </div> 142 143 <transition name="tooltip-show"> 144 <div class="product-specs-tool-tip" v-if="toolTip !== null" id="js-product-specs-tool-tip"> 145 <div class="product-specs-tool-tip__close" @@click="closeToolTip"> 146 <svg class="icon icon--cross"> 147 <use xmlns:xlink="http://www.w3.org/1999/xlink" 148 xlink:href="@Constants.DistPath/icons/icons.svg#cross"> 149 </use> 150 </svg> 151 </div> 152 <figure class="product-specs-tool-tip__image" v-if="toolTip.imageUrl" :alt="toolTip.title"> 153 <img v-bind:src="toolTip.imageUrl" :alt="toolTip.title"> 154 </figure> 155 <div> 156 <div class="product-specs-tool-tip__title">{{toolTip.title}}</div> 157 <div class="product-specs-tool-tip__text"> 158 <div v-for="item in toolTip.text" class="product-specs-tool-tip__lines"> 159 <span v-if="item.subtitle" class="product-specs-tool-tip__subtitle">{{item.subtitle}}:</span> 160 <a v-bind:href="item.link" v-if="item.link"> 161 <span class="product-specs-tool-tip__speclink">{{item.text}}</span> 162 </a> 163 <span v-else class="product-specs-tool-tip__spec">{{item.text}}</span> 164 </div> 165 <div class="product-specs-tool-tip__paragraph"> 166 <div class="product-specs-tool-tip__subtitle">{{toolTip.paragraph.title}}</div> 167 <span>{{toolTip.paragraph.text}}</span> 168 </div> 169 </div> 170 <a class="product-specs-tool-tip__link" v-bind:href="toolTip.link">{{toolTip.linkText}}</a> 171 </div> 172 </div> 173 </transition> 174 175 <div class="row"> 176 <div class="col-xs-12"> 177 <h2 class="product-specs__subtitle"> 178 @Translate("Product details | Specifications | Subtitle", "Specifications<br>based on") 179 </h2> 180 </div> 181 </div> 182 <div class="row"> 183 <div class="col-xs-12 col-md-10 col-md-offset-1"> 184 <div class="product-specs-info"> 185 <div class="product-specs-info__name">@Model.Name</div> 186 <div class="product-specs-info__item" v-if="selectedQuality != null && selectedQuality != 0"> 187 <span class="product-specs-info__label">@Translate("Product details | Specifications | Quality", "Quality"):</span> 188 {{selectedQuality.preTitle}} 189 </div> 190 <div class="product-specs-info__item" v-if="selectedBacking != null && selectedBacking != 0"> 191 <span class="product-specs-info__label">@Translate("Product details | Specifications | Backing", "Backing"):</span> 192 {{selectedBacking.preTitle}} 193 </div> 194 </div> 195 </div> 196 </div> 197 <div class="row"> 198 <div class="col-xs-12 col-md-6 col-md-offset-1"> 199 <div class="product-specs-quality"> 200 <h3 class="product-specs-quality__title">@Translate("Product details | Specifications | Quality", "Quality")</h3> 201 <div class="product-specs-list"> 202 <div class="product-specs-list-item" v-if="availableOptions.quality" 203 :class="{'product-specs-list-item--selected': selectedQuality === item ,'product-specs-list-item--hide':availableOptions.quality[item.id]===false}" 204 v-for="item in qualityItems"> 205 <figure class="product-specs-list-item__image" 206 @@click="selectOption(item,'selectedQuality')"> 207 <img :src="item.toolTip.imageUrl" :alt="item.title"> 208 <svg class="icon icon--checkmark"> 209 <use xmlns:xlink="http://www.w3.org/1999/xlink" 210 xlink:href="@Constants.DistPath/icons/icons.svg#checkmark"> 211 </use> 212 </svg> 213 </figure> 214 <div class="product-specs-list-item__title">{{item.title}}</div> 215 <div class="product-specs-list-item__read-more" v-if="item.toolTip" 216 @@click="showToolTip(item.toolTip, $event)"> 217 @Translate("Read more", "Read more") 218 </div> 219 </div> 220 </div> 221 </div> 222 </div> 223 <div class="col-xs-12 col-md-3 col-md-offset-1"> 224 <div class="product-specs-backing"> 225 <h3 class="product-specs-backing__title" v-if="Object.keys(backingItems).length !== 0">@Translate("Product details | Specifications | Backing", "Backing")</h3> 226 <div class="product-specs-list"> 227 <div class="product-specs-list-item" v-if="availableOptions.backing" 228 :class="{'product-specs-list-item--selected': selectedBacking === item ,'product-specs-list-item--hide':availableOptions.backing[item.id]===false}" 229 v-for="item in backingItems"> 230 <figure class="product-specs-list-item__image" 231 @@click="selectOption(item,'selectedBacking')"> 232 <img :src="item.toolTip.imageUrl" alt=""> 233 <svg class="icon icon--checkmark"> 234 <use xmlns:xlink="http://www.w3.org/1999/xlink" 235 xlink:href="@Constants.DistPath/icons/icons.svg#checkmark"> 236 </use> 237 </svg> 238 </figure> 239 <div class="product-specs-list-item__title">{{item.title}}</div> 240 <div class="product-specs-list-item__read-more" v-if="item.toolTip" 241 @@click="showToolTip(item.toolTip, $event)"> 242 @Translate("Read more", "Read more") 243 </div> 244 </div> 245 </div> 246 </div> 247 </div> 248 </div> 249 @if (!hideSpecs) 250 { 251 <div class="product-specs-buttons"> 252 <div class="button-double product-specs-buttons"> 253 <form method="post" action="/api/specifications/getpdf"> 254 <input type="hidden" v-if="selectedBacking != null" name="backingCode" :value="selectedBacking.variantId" /> 255 <input type="hidden" v-if="selectedBacking != null" name="backingName" :value="selectedBacking.title" /> 256 <input type="hidden" v-if="selectedQuality != null" name="qualityName" :value="selectedQuality.title" /> 257 <input type="hidden" name="collectionCode" value="@Model.GetFieldValue("ProductCollectionCode")" /> 258 259 @if (variantCombinations.Any()) 260 { 261 <input type="hidden" v-if="selectedQuality != null" name="qualityId" :value="selectedQuality.variantId" /> 262 } 263 else 264 { 265 <input type="hidden" name="specificationCode" value="@specificationCode" /> 266 } 267 <input type="hidden" name="nationalityCode" value="@Dynamicweb.Ecommerce.Common.Context.Language.Code2" /> 268 <input type="hidden" name="areaId" value="@Pageview.AreaID" /> 269 <input type="hidden" name="productName" value="@Model.Name" /> 270 <input type="hidden" name="sustainabilityChoice" value="@sustainabilityChoices" /> 271 <button type="submit" title="" property="url" class="button button--ghost button--gold" data-text="Download specifications" :class="{ 'button--error':showDownloadFullSpecificationsError }" @@click="downloadFullSpecifications" ref="showFullSpecificationsSubmitButton"> 272 <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> 273 <span class="button__content"> 274 <span class="button__icon"> 275 <svg class="svg-icon button__svg"> 276 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow-down-in-circle"></use> 277 </svg> 278 </span> 279 <span class="button__text"> 280 @Translate("Product details | Specifications | Download full specifications", "Download full specifications") 281 </span> 282 </span> 283 </button> 284 </form> 285 <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 }"> 286 <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> 287 <span class="button__content"> 288 <span class="button__icon"> 289 <svg class="svg-icon button__svg"> 290 <use xlink:href="@Constants.DistPath/icons/icons.svg#arrow"></use> 291 </svg> 292 </span> 293 <span class="button__text">@Translate("Product details | Specifications | View full specifications", "View full specifications")</span> 294 </span> 295 </button> 296 </div> 297 </div> 298 } 299 </div> 300 </div> 301 </section> 302 @if (!hideSpecs) 303 { 304 if (specificationsViewModel != null && highlightsViewModel != null) 305 { 306 <div id="js-spec-list" class="overlay-template"> 307 @TemplateHelper.RenderPartial("Feeds/SpecificationsFeed.cshtml", specificationsViewModel) 308 </div> 309 310 if (conceptCode != "10") 311 { 312 <transition name="product-highlights-fade"> 313 314 <section class="product-highlights"> 315 <div class="container"> 316 <div class="product-highlights__inner"> 317 <div class="row"> 318 <div class="col-xs-12 col-md-2"> 319 <h2 class="product-highlights__subtitle">@Translate("Product details | Specifications | Specification highlights", "Specification<br/>highlights")</h2> 320 </div> 321 <div class="col-xs-12 col-md-10"> 322 <div class="product-highlights__options"> 323 <div v-for="category in specificationHighlights"> 324 <h3 class="product-highlights__options-title">{{category.title}}</h3> 325 <div class="product-highlights__options-list"> 326 <div class="product-highlights__options-list-item" 327 v-for="line in category.specificationLines"> 328 <span class="product-highlights__options-list-item-label">{{line.name}}</span> 329 <span class="product-highlights__options-list-item-dropdown"> 330 <div class="dropdown dropdown--not-standalone"> 331 <div class="dropdown__header" 332 v-bind:class="{ 'dropdown__header-active': line.showDropdown}" 333 @@click="toggleDropdown(line)"> 334 <span class="dropdown__type"> 335 <span v-if="!line.selectedValue && line.defaultValue"> 336 {{line.defaultValue.name}} 337 </span> 338 <span v-if="line.selectedValue"> 339 {{line.selectedValue.name}} 340 </span> 341 </span> 342 <span class="dropdown__direction"> 343 <figure class="dropdown__icon" 344 v-bind:class="{ 'dropdown__icon-active': line.showDropdown}"> 345 <svg class="svg-icon dropdown__icon-arrow"> 346 <use xlink:href="../../dist/icons/icons.svg#arrow-down-in-circle"></use> 347 </svg> 348 </figure> 349 </span> 350 </div> 351 352 <div class="dropdown__body" 353 v-bind:class="{ 'dropdown__body-active': line.showDropdown}" 354 v-if="line.showDropdown != undefined"> 355 <div class="dropdown__body-header" 356 v-bind:class="{ 'dropdown__body-header-active': line.showDropdown}" 357 @@click="toggleDropdown(line)"> 358 <span class="dropdown__type dropdown__type-body"> 359 <span v-if="!line.selectedValue.name"> 360 {{line.defaultValue.name}} 361 </span> 362 <span v-if="line.selectedValue.name"> 363 {{line.selectedValue.name}} 364 </span> 365 </span> 366 <span class="dropdown__direction"> 367 <figure class="dropdown__icon dropdown_icon" 368 v-bind:class="{ 'dropdown__icon-active': line.showDropdown}"> 369 <svg class="svg-icon dropdown__icon-arrow"> 370 <use xlink:href="../../dist/icons/icons.svg#arrow-down-in-circle"></use> 371 </svg> 372 </figure> 373 </span> 374 </div> 375 <hr class="dropdown__body-hr" /> 376 <div class="dropdown__select-container"> 377 <div class="dropdown__select-list"> 378 <div class="dropdown__select-list-item" 379 v-for="doc in line.documents" 380 @@click="itemListSelected(line,doc)"> 381 <label class="dropdown__select-label">{{doc.name}}</label> 382 </div> 383 </div> 384 </div> 385 </div> 386 </div> 387 <a v-if="line.selectedValue" :href="line.selectedValue.link" download 388 class="product-highlights__options-list-item-link">@Translate("Global | Download", "Download")</a> 389 </span> 390 </div> 391 </div> 392 </div> 393 </div> 394 </div> 395 </div> 396 </div> 397 </div> 398 </section> 399 </transition> 400 } 401 } 402 } 403 </div> 404 } 405 } 406 else 407 { 408 <p>No specifications found with Backing: <b>@backingCode</b> & <b>Specificationcode: @specificationCode</b></p> 409 }
Are you planning a project, let's help you through the entire process, from idea to unique carpet solution.
Fill in your details and we'll revert to you or find your closest contact .