Customize your own ideal sofa
Combination: 1.5 seater + Chaiselong
Error executing template "Designs/theca/ecom/product/partials/add-to-cart.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 Co3.Theca.Website.Models.Frontend.Ecommerce.ThecaProduct.get_VariantGroups()at CompiledRazorTemplates.Dynamic.RazorEngine_d3875effec35467ab0c23880349b1987.Execute() in D:\Dynamicweb\Theca.espresso4.dk\theca.espresso4.dk\Files\Templates\Designs\theca\ecom\product\partials\add-to-cart.cshtml:line 70at 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<ThecaProduct> 2 @using System.Collections.Immutable 3 @using System.Globalization 4 @using Co3.Espresso.Base.Extensions 5 @using Co3.Espresso.Base.Models 6 @using Co3.Espresso.Website.Models.FrontEnd 7 @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce 8 @using Co3.Espresso.Website.Models.FrontEnd.Elements 9 @using Co3.Espresso.Website.Models.FrontEnd.Settings 10 @using Co3.Espresso.Website.Services 11 @using Co3.Theca.Website.Models.Frontend.Ecommerce 12 @using Co3.Theca.Website.Services 13 @using Dynamicweb.Core 14 @using Dynamicweb.Ecommerce.Common 15 @using Dynamicweb.Ecommerce.Notifications 16 @using Dynamicweb.Ecommerce.Variants 17 @using Dynamicweb.Frontend 18 @using Dynamicweb.Rendering 19 @using Dynamicweb.Rendering.Designer 20 @using Dynamicweb.Rendering.Translation 21 @using Dynamicweb.Security.UserManagement 22 @using OfficeOpenXml.FormulaParsing.Excel.Functions.Text 23 24 @{ 25 ClassList variantContainerHeaderClasslist = new ClassList("border-bottom pb-1 mb-1 d-flex font-weight-bold"); 26 ClassList variantSelectorClasslist = new ClassList("theca-custom-select-container theca-custom-select-variant mb-2"); 27 28 CultureInfo currencyCulture = new CultureInfo(Context.Currency.CultureInfo); 29 string currencyDecimalSeparator = currencyCulture.NumberFormat.CurrencyDecimalSeparator; 30 string currencyGroupSeparator = currencyCulture.NumberFormat.CurrencyGroupSeparator; 31 string currencyCode = Context.Currency.Code; 32 string currencySymbol = Context.Currency.Symbol; 33 int currencySymbolPlace = Context.Currency.SymbolPlace; 34 string category1 = Model.Category1; 35 36 Dictionary<string, EspressoPrice> colorGroupVariantPrices = new Dictionary<string, EspressoPrice>(); 37 bool isUserAuthenticated = User.IsExtranetUserLoggedIn(); 38 string hidePricesFromDownloadUserGroup = string.Empty; 39 bool isCatalogUser = false; 40 if (isUserAuthenticated) 41 { 42 User user = User.GetCurrentUser(PagePermissionLevels.Frontend); 43 44 ReadOnlyGroupCollection userGroups = user.Groups; 45 if (userGroups != null) 46 { 47 var groupDownload = userGroups.FirstOrDefault(g => g.Name == "Download"); 48 if (groupDownload != null && groupDownload.Name == "Download") 49 { 50 hidePricesFromDownloadUserGroup = "d-none"; 51 } 52 isCatalogUser = userGroups.Any(g => g.Name == "CatalogUsers"); 53 } 54 } 55 } 56 57 <form action="/system/data/cart" class="e-product-form js-theca-variant-form js-e-product-form js-e-product-form-addtocart js-theca-product-form-addtocart py-1" method="post" data-currencyDecimalSeparator="@currencyDecimalSeparator" data-currencyGroupSeparator="@currencyGroupSeparator" data-currencyCode="@currencyCode" data-currencySymbol="@currencySymbol" data-currencySymbolPlace="@currencySymbolPlace"> 58 @*<input name="CartCmd" type="hidden" value="Add">*@ 59 <input id="CartCmd" name="CartCmd" type="hidden" value="addmulti"> 60 <input name="ProductLoopCounter0" id="ProductLoopCounter0" type="hidden" value="0"> 61 <input name="ProductID0" id="ProductID0" type="hidden" value="@Model.Id"> 62 <input name="VariantID0" id="VariantID0" type="hidden" value="@Model.VariantId"> 63 <input name="UnitID0" id="UnitID0" type="hidden" value=""> 64 <input name="Redirect" type="hidden" value=""> 65 <input name="Name" type="hidden" value="@Model.Name"> 66 <input name="Number" type="hidden" value="@Model.Number"> 67 <input name="Price" type="hidden" value="@Model.Price.Value.ToJavaScript()"> 68 <input name="CurrencyCode" type="hidden" value="@Model.Price.CurrencyCode"> 69 70 @if (Model.VariantGroups.Any()) 71 { 72 List<string> variantGroupOrder = new List<string>(); 73 /* 1 */ 74 variantGroupOrder.Add("Mirrored"); 75 /* 2 */ 76 variantGroupOrder.Add("Material"); 77 /* 3 */ 78 variantGroupOrder.Add("Shell"); 79 /* 4 */ 80 variantGroupOrder.Add("Armrests"); 81 /* 5 */ 82 variantGroupOrder.Add("Legs"); 83 /* 6 */ 84 variantGroupOrder.Add("Height"); 85 /* 7 */ 86 variantGroupOrder.Add("Function"); 87 88 List<string> excludedVariantOptionValues = new List<string>(); 89 excludedVariantOptionValues.Add("NoFunction"); 90 excludedVariantOptionValues.Add("Standard"); 91 excludedVariantOptionValues.Add("NoShell"); 92 93 string inputType = "radio"; 94 //string inputType = "select"; 95 <div class="d-flex flex-column"> 96 @foreach (KeyValuePair<string, ThecaVariantGroup> variantGroup in Model.VariantGroups) 97 { 98 ThecaVariantGroup thecaVariantGroupValue = variantGroup.Value; 99 if (thecaVariantGroupValue.Options != null)100 {101 //excludedVariantOptionValues102 //thecaVariantGroupValue.Options = ;103104 //Dictionary<string,ThecaVariantOption> test = new Dictionary< string, ThecaVariantOption >();105 //var student = objStudent.ToDictionary(x => x.Id, x => x.Name);106107 Dictionary<string, ThecaVariantOption> thecaVariantGroupValueOptions = thecaVariantGroupValue.Options.Where(opt => excludedVariantOptionValues.IndexOf(opt.Value.Name) == -1).ToDictionary(opt => opt.Key, opt => opt.Value);108 string cssToggle = thecaVariantGroupValueOptions.Any() ? string.Empty : "d-none";109110 if (inputType == "select")111 {112 string variantInputFieldName = string.Format("{0}_{1}", Model.Id, variantGroup.Value.Id);113 string variantInputFieldId = variantInputFieldName;114115116 <div class="form-group @cssToggle js-theca-product-form-variant-form-group js-e-product-form-variant-form-group mb-2 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)">117 <label class="font-weight-bold form-control-label" for="@variantInputFieldId">@variantGroup.Value.Name</label>118 <select class="custom-select js-e-product-form-variant-group-input required" id="@variantInputFieldId" name="@variantInputFieldName">119 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)120 {121 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;122 <option value="@variantOption.Value.Id" @(isSelected ? "selected" : string.Empty)>@variantOption.Value.Name</option>123 }124 </select>125 </div>126 }127 else128 {129 string translateKey = string.Format("eCom Product - {0} - Heading", variantGroup.Value.Id);130 string variantInputFieldName = string.Format("{0}_{1}", Model.Id, variantGroup.Value.Id);131132 if (variantGroup.Value.Id == "Material")133 {134 //ThecaVariantInfo thecaVariantInfo = ThecaVariantService.Instance.GetVariantInfo(Model.Id);135 IEnumerable<string> filterColors = new List<string>();136 IEnumerable<string> filterColorFamilies = new List<string>();137 IEnumerable<string> filterMaterialTypes = new List<string>();138139 filterColors = thecaVariantGroupValueOptions.Values?.Select(go => go.ThecaColor).Distinct();140 filterColorFamilies = thecaVariantGroupValueOptions.Values?.Select(go => go.ThecaColorFamily).Distinct();141 filterMaterialTypes = thecaVariantGroupValueOptions.Values?.Where(go => !string.IsNullOrEmpty(go.ThecaMainMaterialType))?.Select(go => go.ThecaMainMaterialType).Distinct();142143 Dictionary<string, List<ThecaVariantOption>> colorFamilies = new Dictionary<string, List<ThecaVariantOption>>();144145 foreach (ThecaVariantOption thecaVariantOption in thecaVariantGroupValueOptions.Values)146 {147 if (!colorFamilies.ContainsKey(thecaVariantOption.ThecaColorFamily))148 {149 colorFamilies.Add(thecaVariantOption.ThecaColorFamily, new List<ThecaVariantOption>());150 }151 if (!colorFamilies[thecaVariantOption.ThecaColorFamily].Any(cf => cf.Id.Equals(thecaVariantOption.Id)))152 {153 colorFamilies[thecaVariantOption.ThecaColorFamily].Add(thecaVariantOption);154 }155 }156157 List<string> colorFamilySortOrder = ThecaProductService.Instance.GetColorFamilySortOrder();158 colorFamilies = colorFamilies.OrderBy(cf => colorFamilySortOrder.IndexOf(cf.Key)).ToDictionary(cf => cf.Key, cf => cf.Value);159160161 <div class="form-group @cssToggle js-theca-product-form-variant-form-group mb-2 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)" data-variant-group="@variantGroup.Value.Id">162 <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Upholstery - Text", "Upholstery"): <span class="js-theca-product-selected-option-value font-weight-normal ml-1">@thecaVariantGroupValue.SelectedOptionName</span></p>163 <div class="@variantSelectorClasslist">164 @{165 string selectedOptionId = thecaVariantGroupValue.SelectedOptionId + ".jpg";166 }167 <button data-toggle="popover" data-trigger="hover focus" data-placement="bottom" data-content="@thecaVariantGroupValue.SelectedOptionName" type="button" class="btn btn-selected-option js-btn-material-selected-option border" data-toggle="modal" data-target="#materialModal" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/upholstery/@selectedOptionId&Width=250&Height=250&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')"> </button>168 <button type="button" class="btn btn-secondary flex-grow-1" data-toggle="modal" data-target="#materialModal">@Translate("eCom Product - Change upholstery - Heading", "Change upholstery") (@thecaVariantGroupValue.Options.Count @Translate("eCom Product - Options - Text", "options"))</button>169 </div>170 @using Co3.Espresso.Website.Services171 @using System.Web172 @using Co3.Theca.Website.Models.Frontend.Ecommerce173 @using Dynamicweb.Core174175176 <div class="modal modal-fullscreen js-theca-modal-material theca-modal-material" data-fallback-material="" style="overflow: hidden;" id="materialModal" tabindex="-1" role="dialog" aria-labelledby="materialModalLabel" aria-hidden="true" data-backdrop="false">177 <div class="modal-dialog" role="document">178 <div class="e-loading-overlay js-e-loading-overlay">179 @RenderingService.Instance.PartialView( "_partials/loading-spinner.cshtml" )180 </div>181182 <div class="row">183 <div class="modal-content col-12 col-lg-6 bg-light" style="max-height: 100vh; min-height: auto;">184 <div class="modal-body d-flex flex-column modal-body">185 <h2 class="e-product-name">186 @Model.ModelName <span class="text-muted">· @Translate("eCom Products - All upholsteries - Heading", "All upholsteries") (@thecaVariantGroupValue.Options.Count @Translate("eCom Product - Options - Text", "options"))</span>187 </h2>188189 <div class="d-flex flex-wrap mb-4" id="js-theca-material-filters">190 <div class="dropdown e-productlist-filters-group border-0 mr-1" style="flex:1">191 <button class="bg-transparent border btn-block dropdown-toggle p-1 d-flex" type="button" id="dropdownColour" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">192 Colour193 <i class="material-icons e-productlist-filters-group-collapse-toggle-icon-off ml-auto">arrow_drop_down</i>194 </button>195 <div class="dropdown-menu border" style="width: 97%;" aria-labelledby="dropdownColour">196 <div class="px-2" style="max-height: 25vh; overflow-y: auto;">197 @foreach (string filterColor in filterColors)198 {199 string filterColorClean = filterColor.Replace(" ", "_");200 <div class="e-material-filters-option js-theca-material-filters-option">201 <label for="facet_Color_@filterColorClean" class="custom-control custom-checkbox">202 <input class="custom-control-input" id="facet_Color_@filterColorClean" name="Color" type="checkbox" value="@filterColor">203 <span class="custom-control-indicator"></span>204 <span class="custom-control-description">@filterColor</span>205 </label>206 </div>207 }208 </div>209 </div>210 </div>211 <div class="dropdown e-productlist-filters-group border-0 " style="flex:1">212 <button class="bg-transparent border btn-block dropdown-toggle p-1 d-flex" type="button" id="dropdownFabric" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">213 Fabric / Leather214 <i class="material-icons e-productlist-filters-group-collapse-toggle-icon-off ml-auto">arrow_drop_down</i>215 </button>216 <div class="dropdown-menu border" style="width: 97%;" aria-labelledby="dropdownFabric">217 <div class="px-2" style="max-height: 25vh; overflow-y: auto;">218 @foreach (string filterMaterialType in filterMaterialTypes)219 {220 string filterMaterialTypeClean = filterMaterialType.Replace(" ", "_");221 <div class="e-material-filters-option js-theca-material-filters-option">222 <label for="facet_MaterialType_@filterMaterialTypeClean" class="custom-control custom-checkbox">223 <input class="custom-control-input" id="facet_MaterialType_@filterMaterialTypeClean" name="MaterialType" type="checkbox" value="@filterMaterialType">224 <span class="custom-control-indicator"></span>225 <span class="custom-control-description">@filterMaterialType</span>226 </label>227 </div>228 }229 </div>230 </div>231 </div>232 </div>233234235 @{236 string jsonSrc = "/system/data/product";237 string jsonSrcGetParams = HttpUtility.HtmlAttributeEncode( JsonService.Instance.ToJson( new Dictionary< string, string >238 {239 {"productId", Model.Id},240 {"variantId", Model.VariantId}241 } ) );242 }243244 <div class="e-product-image-container js-e-product-images my-auto mx-6 mx-lg-0">245246 <div class="js-e-jsonpublisher product-modal-image-gray-overlay" data-json-src="@jsonSrc" data-json-src-get-params="@jsonSrcGetParams" data-template=".js-e-handlebars-tmpl-product-image-carousel-modal" data-template-helpers="counter compare">247 <script class="js-e-handlebars-tmpl-product-image-carousel-modal" type="text/x-handlebars-template">248 {{#if imageDetails}}249 <img src="{{imagePrimary.large}}" style="width: 100%">250 {{/if}}251 </script>252 </div>253254 </div>255256 </div>257 </div>258 <div class="modal-content col-12 col-lg-6 pl-lg-0">259 <div class="modal-header bg-white border-0 modal-header pt-1 d-none d-lg-block">260 <button type="button" class="close mr-1 ml-auto js-theca-modal-close" data-dismiss="modal" aria-label="Close">261 <span aria-hidden="true">×</span>262 </button>263 </div>264 <div class="modal-body pb-6" style="max-height: 92vh; overflow-y: scroll;">265 <div id="accordion" class="form-group js-e-product-form-variant-form-group" data-auto-select="true">266 <h2 class="d-none js-no-results">@Translate("eCom Productlist - No Products - Text", "")</h2>267268 @{269 List< string > colorFamilyIds = new List< string >();270 foreach ( KeyValuePair< string, List< ThecaVariantOption > > colorFamily in colorFamilies )271 {272 <div class="js-theca-color-groups" data-colorFamily="@colorFamily.Key">273 <div>274 <a class="d-flex text-auto border-bottom text-decoration-none" data-toggle="collapse" style="cursor: auto;">275 <span class="d-flex py-1 w-100">276 @{277 string infoPopoverFabricText = string.Empty;278 }279280 @if ( !string.IsNullOrEmpty( colorFamily.Key ) )281 {282 infoPopoverFabricText = Translate( string.Format( "eCom Product - Fabric Info - {0} - Text", colorFamily.Key ), colorFamily.Key );283 }284 <span class="flex-grow-1">@colorFamily.Key <i class="material-icons ml-1 align-self-center" data-toggle="popover" data-trigger="hover focus" data-content="@infoPopoverFabricText" data-original-title="" title="">info</i></span>285 <span class="@Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C() @hidePricesFromDownloadUserGroup">286 <span class="text-right js-theca-colorfamily-price"></span>287 </span>288 </span>289 </a>290 </div>291 <div id="collapse-@colorFamily.Key.Replace( " ", "-" )" class="collapse show">292 <div >293 <div class="@variantSelectorClasslist mb-3">294 @foreach ( ThecaVariantOption variantOption in colorFamily.Value.OrderBy(v => v.Id) )295 {296 if ( colorFamilyIds.IndexOf( variantOption.Id ) == -1 )297 {298 string variantInputFieldId = string.Format( "{0}_{1}", variantInputFieldName, variantOption.Id );299 bool isSelected = variantOption.Id == variantGroup.Value.SelectedOptionId;300 string optionIdWithImageFormat = variantOption.Id + ".jpg";301302 <label class="js-theca-color-group-item">303 <input class="variant-color js-e-product-form-variant-group-input" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOption.Name" type="radio" value="@variantOption.Id" @(isSelected ? "checked" : string.Empty)>304 <span class="border select-option" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/upholstery/@optionIdWithImageFormat&Width=250&Height=250&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')">305 <span class="image-magnifier-large" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/upholstery/@optionIdWithImageFormat&Width=600&Height=600&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')"></span>306 </span>307 <span class="custom-control-description text-center d-none d-lg-block small text-muted">@variantOption.Name @variantOption.Id</span>308 </label>309310 colorFamilyIds.Add( variantOption.Id );311 }312 }313 </div>314 </div>315 </div>316 </div>317 }318 }319320 </div>321 </div>322 <div class="modal-footer e-theme-dark py-1" style="position: sticky; bottom: 0; z-index: 1;">323 <a class="arrow-left js-theca-modal-close flex-grow-1" data-dismiss="modal" aria-label="Close">@Translate("eCom Product - Back to overview - Link","Back to overview")</a>324 <button type="button" class="btn btn-primary ml-auto flex-grow-1" data-dismiss="modal" aria-label="Close">325 @Translate("eCom Product - Save adjustments - Button","Save adjustments")326 </button>327 </div>328 </div>329 </div>330 </div>331 </div>332333 </div>334 }335 else if (variantGroup.Value.Id == "Mirrored")336 {337 <div class="form-group @cssToggle js-theca-product-form-variant-form-group d-flex js-e-product-form-variant-form-group mb-3 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)" data-variant-group="@variantGroup.Value.Id" data-auto-select="true">338 <label class="font-weight-bold form-control-label">@variantGroup.Value.Name</label>339 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options.OrderByDescending(vg => vg.Value.Name))340 {341 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);342 string variantOptionTranslateKey = string.Format("eCom Product - Variant Option {0} - {1} - Text", variantOption.Value.GroupId, variantOption.Value.Name);343 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;344345 <label class="custom-control custom-radio d-inline-block ml-2">346 <input class="custom-control-input js-e-product-form-variant-group-input required" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOption.Value.Name" type="radio" value="@variantOption.Value.Id" @(isSelected ? "checked" : string.Empty)>347 <span class="custom-control-indicator"></span>348 <span class="custom-control-description">@Translate(variantOptionTranslateKey, variantOption.Value.Name)</span>349 </label>350 }351 </div>352 }353 else if (variantGroup.Value.Id == "Shell" || variantGroup.Value.Id == "Height")354 {355 <div class="form-group @cssToggle js-theca-product-form-variant-form-group js-e-product-form-variant-form-group mb-1 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)" data-variant-group="@variantGroup.Value.Id">356 <p class="@variantContainerHeaderClasslist">@variantGroup.Value.Name: <span class="ml-1 js-theca-product-selected-option-value font-weight-normal">@thecaVariantGroupValue.SelectedOptionName</span><i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate(string.Format("eCom Product - Info - {0} - Text", variantGroup.Value.Name), variantGroup.Value.Name)" data-original-title="" title="">info</i></p>357 <div class="@variantSelectorClasslist">358 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)359 {360 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);361 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;362 string optionIdWithImageFormat = variantOption.Value.Id + ".jpg";363364 <label>365 <input class="variant-color js-e-product-form-variant-group-input" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOption.Value.Name" type="radio" value="@variantOption.Value.Id" @(isSelected ? "checked" : string.Empty)>366 @if (variantGroup.Value.Id == "Height")367 {368 string fileName = string.Format("FLEXLUX_height_{0}.jpg", variantOption.Value.Name);369 <span title="@variantOption.Value.Name" class="border select-option" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/products/@(fileName)&Width=250&Height=250&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')"></span>370 }371 else372 {373 <span title="@variantOption.Value.Name" class="border select-option" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/@variantGroup.Value.Id/@optionIdWithImageFormat&Width=250&Height=250&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')"></span>374 }375 </label>376 }377378 </div>379 </div>380 }381 else if (variantGroup.Value.Id == "Armrests" || variantGroup.Value.Id == "Legs")382 {383 string translateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", category1, variantGroup.Value.Id, thecaVariantGroupValue.SelectedOptionName);384 bool _translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(translateKeyVariantOptionName);385 if (_translationKeyExist)386 {387 thecaVariantGroupValue.SelectedOptionName = Translate(translateKeyVariantOptionName);388 }389390 <div class="form-group @cssToggle js-theca-product-form-variant-form-group js-e-product-form-variant-form-group mb-1 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)" data-variant-group="@variantGroup.Value.Id">391 <p class="@variantContainerHeaderClasslist">@variantGroup.Value.Name: <span class="ml-1 js-theca-product-selected-option-value font-weight-normal">@thecaVariantGroupValue.SelectedOptionName</span><i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate(string.Format("eCom Product - Info - {0} - Text", variantGroup.Value.Name), variantGroup.Value.Name)" data-original-title="" title="">info</i></p>392 <div class="@variantSelectorClasslist">393 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)394 {395 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);396 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;397 //string optionIdWithImageFormat = variantOption.Value.Id + ".jpg";398399 string variantOptionName = variantOption.Value.Name;400401 string dataTranslateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", category1, variantGroup.Value.Id, variantOptionName);402 bool translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(dataTranslateKeyVariantOptionName);403404 if (translationKeyExist)405 {406 variantOptionName = Translate(dataTranslateKeyVariantOptionName);407 }408409 string optionIdWithImageFormat = variantOptionName;410 optionIdWithImageFormat = optionIdWithImageFormat.Replace(" ", "");411 optionIdWithImageFormat = string.Format("{0}.jpg", optionIdWithImageFormat);412413 if (translationKeyExist)414 {415 optionIdWithImageFormat = optionIdWithImageFormat.Replace("-", string.Format("-{0}-", category1));416 }417418 <label data-translatekey="@dataTranslateKeyVariantOptionName">419 <input class="variant-color js-e-product-form-variant-group-input" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOptionName" type="radio" value="@variantOption.Value.Id" @(isSelected ? "checked" : string.Empty)>420 <span data-toggle="popover" data-trigger="hover focus" data-placement="bottom" data-content="@variantOptionName" class="border select-option" style="background-image: url('/admin/public/getimage.ashx?Image=/Files/Images/@variantGroup.Value.Id/@optionIdWithImageFormat&Width=250&Height=250&Format=jpg&Quality=75&Crop=0&AlternativeImage=/Files/Templates/Designs/theca/_assets/img/no-image.jpg')"></span>421 </label>422 }423424 </div>425 </div>426 }427 else428 {429 string cssDFlex = string.Empty;430 if (string.IsNullOrEmpty(cssToggle))431 {432 cssDFlex = "d-flex";433 }434 <div class="form-group @cssToggle js-e-product-form-variant-form-group @cssDFlex mb-0 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)435 " data-variant-group="@variantGroup.Value.Id" data-auto-select="true">436 <div class="col-2 pl-0">437 <label class="font-weight-bold form-control-label">@variantGroup.Value.Name</label>438 </div>439 <div class="flex-wrap">440 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)441 {442 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);443 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;444 <label class="custom-control custom-radio d-inline-block ml-2">445 <input class="custom-control-input js-e-product-form-variant-group-input required" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOption.Value.Name" type="radio" value="@variantOption.Value.Id" @(isSelected ? "checked" : string.Empty)>446 <span class="custom-control-indicator"></span>447 <span class="custom-control-description">@variantOption.Value.Name</span>448 </label>449 }450 </div>451 <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate(string.Format("eCom Product - Info - {0} - Text", variantGroup.Value.Name), variantGroup.Value.Name)" data-original-title="" title="">info</i>452 </div>453 }454 }455 }456 }457 </div>458 }459460 @{461 string jsonAccessoriesSrcGetParams = HttpUtility.HtmlAttributeEncode(JsonService.Instance.ToJson(new Dictionary<string, string>462 {463 { "ProductId", Model.Id },464 { "VariantId", Model.VariantId }465 }));466 }467468 <div class="e-productlist js-e-jsonpublisher js-theca-accessories-productlist mt-2" data-json-src="/system/data/accessories" data-json-src-get-params="@jsonAccessoriesSrcGetParams" data-json-src-prop="" data-json-template-prop="" data-json-item-count="" data-json-item-count-prop="products" data-template=".js-e-handlebars-tmpl-accessories">469470 @{471 List<ThecaProduct> additionProducts = ThecaProductService.Instance.GetAdditionProducts(Model);472473 if (additionProducts.Any())474 {475 string[] uniqueAdditionProductIds = additionProducts.Select(ap => ap.Id).ToArray();476 var allAdditionProductVariantsFromIndex = Model.GetVariantsFromIndex(uniqueAdditionProductIds);477478 <div class="e-productlist-main js-theca-accessories-products mb-4" data-count="@Model.RelatedGroups["Accessories"].Products.Count()">479 <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Additions - Headings", "Additions")</p>480481482 @foreach (ElementWithIndex<ThecaProduct> accessoryProduct in additionProducts.WithIndex())483 {484 int count = accessoryProduct.Index + 1;485486 ThecaProduct accessoryProductElement = accessoryProduct.Element;487488 string[] variantDimensionValues = Model.VariantId.Split('.');489 string variantVariantId = variantDimensionValues.Length > 2 ? string.Format("{0}.{1}.{2}", variantDimensionValues[0], variantDimensionValues[1], variantDimensionValues[2]) : variantDimensionValues[0];490491 bool isNeckrest = false;492493 if (accessoryProductElement.MarketingName != null)494 {495 isNeckrest = accessoryProductElement.MarketingName.ToLower().IndexOf("neckrest") > -1;496 }497498 string infoPopoverText = string.Empty;499500 if (!string.IsNullOrEmpty(accessoryProductElement.MarketingName))501 {502 infoPopoverText = Translate(string.Format("eCom Product - Info - {0} - Text", accessoryProductElement.MarketingName), accessoryProductElement.MarketingName);503 }504505 <div class="js-theca-accessories-item d-flex flex-row" style="min-height: 2.25em;">506507 @if (!Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C().Contains("d-none"))508 {509 <label class="custom-checkbox custom-control d-inline-flex mb-0 mr-auto" for="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)">510 @if (isNeckrest)511 {512 <input type="checkbox" class="custom-control-input js-theca-checkbox-accessories" data-unitprice="@accessoryProductElement.Price.Value" data-is-neckrest="@isNeckrest" data-title="@(accessoryProductElement.Name)" name="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)" id="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)">513 }514 else515 {516 <input type="checkbox" checked class="custom-control-input js-theca-checkbox-accessories" data-unitprice="@accessoryProductElement.Price.Value" data-is-neckrest="@isNeckrest" data-title="@(accessoryProductElement.Name)" name="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)" id="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)">517 }518 <span class="custom-control-indicator"></span>519 <span class="custom-control-description" style="transform: translateY(-3px);">@(accessoryProductElement.MarketingName)</span>520 @if (string.IsNullOrEmpty(accessoryProductElement.MarketingName))521 {522 <span>MarketingName mangler berigelse</span>523 }524 </label>525 }526 else527 {528 <label>529 <span class="custom-control-description" style="transform: translateY(-3px);">@(accessoryProductElement.MarketingName)</span>530 @if (string.IsNullOrEmpty(accessoryProductElement.MarketingName))531 {532 <span>MarketingName mangler berigelse</span>533 }534 </label>535 }536537538 <input type="hidden" value="@(count)" id="ProductLoopCounter@(count)" name="ProductLoopCounter@(count)">539 <input type="hidden" value="@(accessoryProductElement.Id)" id="ProductID@(count)" name="ProductID@(count)">540 <input type="hidden" value="@(accessoryProductElement.VariantId)" id="VariantID@(count)" name="VariantID@(count)">541 <input type="hidden" value="" id="UnitID@(count)" name="UnitID@(count)">542543 @if (isNeckrest)544 {545 <input type="number" class="form-control js-theca-accessories-quantity d-none" name="Quantity@(count)" id="Quantity@(count)" value="0" min="0" style="max-width: 4em;">546 }547 else548 {549 <input type="hidden" class="js-theca-accessories-quantity" name="Quantity@(count)" id="Quantity@(count)" value="1">550 }551 @if (!string.IsNullOrEmpty(accessoryProductElement.MarketingName) && isUserAuthenticated)552 {553 <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@(infoPopoverText)" data-original-title="" title="">info</i>554 }555 </div>556 }557 </div>558 }559 }560561 <script class="js-e-handlebars-tmpl-accessories" type="text/x-handlebars-template">562 {{#if products}}563 <div class="e-productlist-main js-theca-accessories-products mb-4" data-count="{{products.length}}">564 <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Additions - Headings", "Additions")</p>565 {{#each products}}566 <div class="js-theca-accessories-item d-flex flex-row" style="min-height: 2.25em;">567568 {{#if ../allowBuy}}569 <label class="custom-checkbox custom-control d-inline-flex mb-0 mr-auto" for="accessories{{productId}}_{{variantId}}">570 <input type="checkbox" {{#unless isNeckrest}}checked{{/unless}} class="custom-control-input js-theca-checkbox-accessories" data-unitprice="{{price.value}}" data-is-neckrest="{{isNeckrest}}" data-title="{{name}}" name="accessories{{productId}}_{{variantId}}" id="accessories{{productId}}_{{variantId}}">571 <span class="custom-control-indicator"></span>572 <span class="custom-control-description" style="transform: translateY(-3px);">{{marketingName}}</span>573 {{#if marketingName}}574 {{else}}575 <span>MarketingName mangler berigelse</span>576 {{/if}}577 </label>578 {{else}}579 <label>580 <span class="custom-control-description" style="transform: translateY(-3px);">{{marketingName}}</span>581 {{#if marketingName}}582 {{else}}583 <span>MarketingName mangler berigelse</span>584 {{/if}}585 </label>586 {{/if}}587588 <input type="hidden" value="{{count}}" id="ProductLoopCounter{{count}}" name="ProductLoopCounter{{count}}">589 <input type="hidden" value="{{productId}}" id="ProductID{{count}}" name="ProductID{{count}}">590 <input type="hidden" value="{{variantId}}" id="VariantID{{count}}" name="VariantID{{count}}">591 <input type="hidden" value="" id="UnitID{{count}}" name="UnitID{{count}}">592593 {{#if isNeckrest}}594 <input type="number" class="form-control js-theca-accessories-quantity d-none" name="Quantity{{count}}" id="Quantity{{count}}" value="0" min="0" style="max-width: 4em;">595 {{else}}596 <input type="hidden" class="js-theca-accessories-quantity" name="Quantity{{count}}" id="Quantity{{count}}" value="1">597 {{/if}}598599 {{#if ../allowBuy}}600 {{#if marketingName}}601 <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="{{infopopovertext}}" data-original-title="" title="">info</i>602 {{/if}}603 {{/if}}604 </div>605 {{/each}}606 </div>607 {{/if}}608609 </script>610 </div>611612 <!-- CTA -->613 <div class="@Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C() @hidePricesFromDownloadUserGroup">614 @if (isCatalogUser)615 {616 <div class="row pt-2 border-top">617 <div class="col-4">618 <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p>619 </div>620 <div class="col-8">621 <p class="mb-0 text-right d-none js-theca-product-price-formatted" data-unitprice="@Model.Price.Value"></p>622 </div>623 </div>624 <input name="Quantity0" id="Quantity0" type="hidden" value="1">625 }626 else627 {628 <div class="row pt-2 border-top">629 <div class="col-4">630 <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p>631 </div>632 <div class="col-8">633 <p class="mb-0 text-right d-none js-theca-product-price-formatted" data-unitprice="@Model.Price.Value"></p>634 </div>635 </div>636637 <div class="row mb-1">638 <div class="col-6">639 <p class="mb-0 text-muted">@Translate("eCom Product - Estimated delivery time - Text", "Estimated delivery time")</p>640 </div>641 <div class="col-6">642 <p class="mb-0 text-muted text-right js-theca-product-stock-deliverytext">@Model.Stock.DeliveryText</p>643 </div>644 </div>645646 <div class="d-flex">647 <input name="Quantity0" id="Quantity0" type="number" value="1" class="w-25 text-center border-0">648 <button class="btn btn-success btn-block" type="submit">@Translate("eCom Product - Add To Cart - Button", "Add to cart")</button>649 </div>650651 <div class="row my-1">652 <div class="col-4">653 <p class="mb-0">654 <a class="text-heading" data-target="#howItWorksModal" data-toggle="modal">@Translate("eCom Product - How to order - Heading", "How to order?")</a>655 </p>656 </div>657 </div>658 }659 </div>660661 </form>662663 <script data-cookieconsent="ignore">var colorGroupVariantPrices = @JsonService.Instance.ToJson(colorGroupVariantPrices);</script>
Loano sofa
Loano is a light weight sofa with high comfort and beautiful design details. The loose cushions gives it a soft and pleasant look. The stitching on the seat and a perfect sloping arm makes Loano one of a kind. Find the combination of the Loano sofa that suits your needs.
Specifications
All measurements can vary +-3%
Fabric
Description |
---|
Description
Description | Loano is a light weight sofa with high comfort and beautiful design details. The loose cushions gives it a soft and pleasant look. The stitching on the seat and a perfect sloping arm makes Loano one of a kind. Find the combination of the Loano sofa that suits your needs.
|
---|---|
Product Name | Loano sofa |
Back Type | Loose |
Back Height | 84,5 cm |
Seat Type | Loose |
Seat Depth | 59,5 cm |
Seat Height | 44,5 cm |
Sofa Material Type | Wood (seat + back) |
Logistics
Assembled Width | 243,5 cm |
---|---|
Assembled Depth | 167 cm |
Assembled Height | 84,5 cm |