arrow_backBack

envelopeEmail customisation

Design Chair

infoW: 88 cm / D: 80 cm / H: 89 cm


Item#

View more specifications

Customize your own ideal chair

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() in C:\projects\Flexlux\Theca\Co3.Theca.Website\Models\Frontend\Ecommerce\ThecaProduct.cs:line 1197at CompiledRazorTemplates.Dynamic.RazorEngine_fb3f7b7926cf4420abd896cdab4b6a09.Execute() in D:\Dynamicweb\Theca.espresso4.dk\thecaStaging.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')">&nbsp;</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" style="display: block !important;">245 <div class="js-e-jsonpublisher product-modal-image-gray-overlay w-100" 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">246 <script class="js-e-handlebars-tmpl-product-image-carousel-modal" type="text/x-handlebars-template">247 <cylindo-viewer customer-id="{{imageViewer.customer-id}}" controls="{{imageViewer.controls}}" code="{{imageViewer.code}}" configuration="{{imageViewer.configuration}}" class="bg-white"></cylindo-viewer>248 </script>249 </div>250251 </div>252253 </div>254 </div>255 <div class="modal-content col-12 col-lg-6 pl-lg-0">256 <div class="modal-header bg-white border-0 modal-header pt-1 d-none d-lg-block">257 <button type="button" class="close mr-1 ml-auto js-theca-modal-close" data-dismiss="modal" aria-label="Close">258 <span aria-hidden="true">&times;</span>259 </button>260 </div>261 <div class="modal-body pb-6" style="max-height: 92vh; overflow-y: scroll;">262 <div id="accordion" class="form-group js-e-product-form-variant-form-group" data-auto-select="true">263 <h2 class="d-none js-no-results">@Translate("eCom Productlist - No Products - Text", "")</h2>264265 @{266 List< string > colorFamilyIds = new List< string >();267 foreach ( KeyValuePair< string, List< ThecaVariantOption > > colorFamily in colorFamilies )268 {269 <div class="js-theca-color-groups" data-colorFamily="@colorFamily.Key">270 <div>271 <a class="d-flex text-auto border-bottom text-decoration-none" data-toggle="collapse" style="cursor: auto;">272 <span class="d-flex py-1 w-100">273 @{274 string infoPopoverFabricText = string.Empty;275 }276277 @if ( !string.IsNullOrEmpty( colorFamily.Key ) )278 {279 infoPopoverFabricText = Translate( string.Format( "eCom Product - Fabric Info - {0} - Text", colorFamily.Key ), colorFamily.Key );280 }281 <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>282 <span class="@Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C() @hidePricesFromDownloadUserGroup">283 <span class="text-right js-theca-colorfamily-price"></span>284 </span>285 </span>286 </a>287 </div>288 <div id="collapse-@colorFamily.Key.Replace( " ", "-" )" class="collapse show">289 <div >290 <div class="@variantSelectorClasslist mb-3">291 @foreach ( ThecaVariantOption variantOption in colorFamily.Value.OrderBy(v => v.Id) )292 {293 if ( colorFamilyIds.IndexOf( variantOption.Id ) == -1 )294 {295 string variantInputFieldId = string.Format( "{0}_{1}", variantInputFieldName, variantOption.Id );296 bool isSelected = variantOption.Id == variantGroup.Value.SelectedOptionId;297 string optionIdWithImageFormat = variantOption.Id + ".jpg";298299 <label class="js-theca-color-group-item">300 <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)>301 <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')">302 <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>303 </span>304 <span class="custom-control-description text-center d-none d-lg-block small text-muted">@variantOption.Name @variantOption.Id</span>305 </label>306307 colorFamilyIds.Add( variantOption.Id );308 }309 }310 </div>311 </div>312 </div>313 </div>314 }315 }316317 </div>318 </div>319 <div class="modal-footer e-theme-dark py-1" style="position: sticky; bottom: 0; z-index: 1;">320 <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>321 <button type="button" class="btn btn-primary ml-auto flex-grow-1" data-dismiss="modal" aria-label="Close">322 @Translate("eCom Product - Save adjustments - Button","Save adjustments")323 </button>324 </div>325 </div>326 </div>327 </div>328 </div>329330 </div>331 }332 else if (variantGroup.Value.Id == "Mirrored")333 {334 <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">335 <label class="font-weight-bold form-control-label">@variantGroup.Value.Name</label>336 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options.OrderByDescending(vg => vg.Value.Name))337 {338 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);339 string variantOptionTranslateKey = string.Format("eCom Product - Variant Option {0} - {1} - Text", variantOption.Value.GroupId, variantOption.Value.Name);340 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;341342 <label class="custom-control custom-radio d-inline-block ml-2">343 <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)>344 <span class="custom-control-indicator"></span>345 <span class="custom-control-description">@Translate(variantOptionTranslateKey, variantOption.Value.Name)</span>346 </label>347 }348 </div>349 }350 else if (variantGroup.Value.Id == "Shell" || variantGroup.Value.Id == "Height")351 {352 <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">353 <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>354 <div class="@variantSelectorClasslist">355 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)356 {357 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);358 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;359 string optionIdWithImageFormat = variantOption.Value.Id + ".jpg";360361 <label>362 <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)>363 @if (variantGroup.Value.Id == "Height")364 {365 string fileName = string.Format("FLEXLUX_height_{0}.jpg", variantOption.Value.Name);366 <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>367 }368 else369 {370 <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>371 }372 </label>373 }374375 </div>376 </div>377 }378 else if (variantGroup.Value.Id == "Armrests" || variantGroup.Value.Id == "Legs" || variantGroup.Value.Id == "Tabletop")379 {380 string translateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", category1, variantGroup.Value.Id, thecaVariantGroupValue.SelectedOptionName);381 bool _translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(translateKeyVariantOptionName);382 if (_translationKeyExist)383 {384 thecaVariantGroupValue.SelectedOptionName = Translate(translateKeyVariantOptionName);385 }386387 <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">388 <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>389 <div class="@variantSelectorClasslist">390 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)391 {392 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);393 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;394 //string optionIdWithImageFormat = variantOption.Value.Id + ".jpg";395396 string variantOptionName = variantOption.Value.Name;397398 string dataTranslateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", category1, variantGroup.Value.Id, variantOptionName);399 bool translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(dataTranslateKeyVariantOptionName);400401 if (translationKeyExist)402 {403 variantOptionName = Translate(dataTranslateKeyVariantOptionName);404 }405406 string optionIdWithImageFormat = variantOptionName;407 optionIdWithImageFormat = optionIdWithImageFormat.Replace(" ", "");408 optionIdWithImageFormat = string.Format("{0}.jpg", optionIdWithImageFormat);409410 if (translationKeyExist)411 {412 optionIdWithImageFormat = optionIdWithImageFormat.Replace("-", string.Format("-{0}-", category1));413 }414415 <label data-translatekey="@dataTranslateKeyVariantOptionName">416 <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)>417 <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>418 </label>419 }420421 </div>422 </div>423 }424 else425 {426 string cssDFlex = string.Empty;427 if (string.IsNullOrEmpty(cssToggle))428 {429 cssDFlex = "d-flex";430 }431 <div class="form-group @cssToggle js-e-product-form-variant-form-group @cssDFlex mb-0 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)432 " data-variant-group="@variantGroup.Value.Id" data-auto-select="true">433 <div class="col-2 pl-0">434 <label class="font-weight-bold form-control-label">@variantGroup.Value.Name</label>435 </div>436 <div class="flex-wrap">437 @foreach (KeyValuePair<string, ThecaVariantOption> variantOption in thecaVariantGroupValue.Options)438 {439 string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id);440 bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId;441 <label class="custom-control custom-radio d-inline-block ml-2">442 <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)>443 <span class="custom-control-indicator"></span>444 <span class="custom-control-description">@variantOption.Value.Name</span>445 </label>446 }447 </div>448 <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>449 </div>450 }451 }452 }453 }454 </div>455 }456457 @{458 string jsonAccessoriesSrcGetParams = HttpUtility.HtmlAttributeEncode(JsonService.Instance.ToJson(new Dictionary<string, string>459 {460 { "ProductId", Model.Id },461 { "VariantId", Model.VariantId }462 }));463 }464465 <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">466467 @{468 List<ThecaProduct> additionProducts = ThecaProductService.Instance.GetAdditionProducts(Model);469470 if (additionProducts.Any())471 {472 string[] uniqueAdditionProductIds = additionProducts.Select(ap => ap.Id).ToArray();473 var allAdditionProductVariantsFromIndex = Model.GetVariantsFromIndex(uniqueAdditionProductIds);474475 <div class="e-productlist-main js-theca-accessories-products mb-4" data-count="@Model.RelatedGroups["Accessories"].Products.Count()">476 <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Additions - Headings", "Additions")</p>477478479 @foreach (ElementWithIndex<ThecaProduct> accessoryProduct in additionProducts.WithIndex())480 {481 int count = accessoryProduct.Index + 1;482483 ThecaProduct accessoryProductElement = accessoryProduct.Element;484485 string[] variantDimensionValues = Model.VariantId.Split('.');486 string variantVariantId = variantDimensionValues.Length > 2 ? string.Format("{0}.{1}.{2}", variantDimensionValues[0], variantDimensionValues[1], variantDimensionValues[2]) : variantDimensionValues[0];487488 bool isNeckrest = false;489490 if (accessoryProductElement.MarketingName != null)491 {492 isNeckrest = accessoryProductElement.MarketingName.ToLower().IndexOf("neckrest") > -1;493 }494495 string infoPopoverText = string.Empty;496497 if (!string.IsNullOrEmpty(accessoryProductElement.MarketingName))498 {499 infoPopoverText = Translate(string.Format("eCom Product - Info - {0} - Text", accessoryProductElement.MarketingName), accessoryProductElement.MarketingName);500 }501502 <div class="js-theca-accessories-item d-flex flex-row" style="min-height: 2.25em;">503504 @if (!Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C().Contains("d-none"))505 {506 <label class="custom-checkbox custom-control d-inline-flex mb-0 mr-auto" for="accessories@(accessoryProductElement.Id)_@(accessoryProductElement.VariantId)">507 @if (isNeckrest)508 {509 <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)">510 }511 else512 {513 <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)">514 }515 <span class="custom-control-indicator"></span>516 <span class="custom-control-description" style="transform: translateY(-3px);">@(accessoryProductElement.MarketingName)</span>517 @if (string.IsNullOrEmpty(accessoryProductElement.MarketingName))518 {519 <span>MarketingName mangler berigelse</span>520 }521 </label>522 }523 else524 {525 <label>526 <span class="custom-control-description" style="transform: translateY(-3px);">@(accessoryProductElement.MarketingName)</span>527 @if (string.IsNullOrEmpty(accessoryProductElement.MarketingName))528 {529 <span>MarketingName mangler berigelse</span>530 }531 </label>532 }533534535 <input type="hidden" value="@(count)" id="ProductLoopCounter@(count)" name="ProductLoopCounter@(count)">536 <input type="hidden" value="@(accessoryProductElement.Id)" id="ProductID@(count)" name="ProductID@(count)">537 <input type="hidden" value="@(accessoryProductElement.VariantId)" id="VariantID@(count)" name="VariantID@(count)">538 <input type="hidden" value="" id="UnitID@(count)" name="UnitID@(count)">539540 @if (isNeckrest)541 {542 <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;">543 }544 else545 {546 <input type="hidden" class="js-theca-accessories-quantity" name="Quantity@(count)" id="Quantity@(count)" value="1">547 }548 @if (!string.IsNullOrEmpty(accessoryProductElement.MarketingName) && isUserAuthenticated)549 {550 <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>551 }552 </div>553 }554 </div>555 }556 }557558 <script class="js-e-handlebars-tmpl-accessories" type="text/x-handlebars-template">559 {{#if products}}560 <div class="e-productlist-main js-theca-accessories-products mb-4" data-count="{{products.length}}">561 <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Additions - Headings", "Additions")</p>562 {{#each products}}563 <div class="js-theca-accessories-item d-flex flex-row" style="min-height: 2.25em;">564565 {{#if ../allowBuy}}566 <label class="custom-checkbox custom-control d-inline-flex mb-0 mr-auto" for="accessories{{productId}}_{{variantId}}">567 <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}}">568 <span class="custom-control-indicator"></span>569 <span class="custom-control-description" style="transform: translateY(-3px);">{{marketingName}}</span>570 {{#if marketingName}}571 {{else}}572 <span>MarketingName mangler berigelse</span>573 {{/if}}574 </label>575 {{else}}576 <label>577 <span class="custom-control-description" style="transform: translateY(-3px);">{{marketingName}}</span>578 {{#if marketingName}}579 {{else}}580 <span>MarketingName mangler berigelse</span>581 {{/if}}582 </label>583 {{/if}}584585 <input type="hidden" value="{{count}}" id="ProductLoopCounter{{count}}" name="ProductLoopCounter{{count}}">586 <input type="hidden" value="{{productId}}" id="ProductID{{count}}" name="ProductID{{count}}">587 <input type="hidden" value="{{variantId}}" id="VariantID{{count}}" name="VariantID{{count}}">588 <input type="hidden" value="" id="UnitID{{count}}" name="UnitID{{count}}">589590 {{#if isNeckrest}}591 <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;">592 {{else}}593 <input type="hidden" class="js-theca-accessories-quantity" name="Quantity{{count}}" id="Quantity{{count}}" value="1">594 {{/if}}595596 {{#if ../allowBuy}}597 {{#if marketingName}}598 <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>599 {{/if}}600 {{/if}}601 </div>602 {{/each}}603 </div>604 {{/if}}605606 </script>607 </div>608609 <!-- CTA -->610 <div class="@Co3.Theca.Website.Services.ThecaProductService.GetNoBuyB2C() @hidePricesFromDownloadUserGroup">611 @if (isCatalogUser)612 {613 <div class="row pt-2 border-top">614 <div class="col-4">615 <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p>616 </div>617 <div class="col-8">618 <p class="mb-0 text-right d-none js-theca-product-price-formatted" data-unitprice="@Model.Price.Value"></p>619 </div>620 </div>621 <input name="Quantity0" id="Quantity0" type="hidden" value="1">622 }623 else624 {625 <div class="row pt-2 border-top">626 <div class="col-4">627 <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p>628 </div>629 <div class="col-8">630 <p class="mb-0 text-right d-none js-theca-product-price-formatted" data-unitprice="@Model.Price.Value"></p>631 </div>632 </div>633634 <div class="row mb-1">635 <div class="col-6">636 <p class="mb-0 text-muted">@Translate("eCom Product - Estimated delivery time - Text", "Estimated delivery time")</p>637 </div>638 <div class="col-6">639 <p class="mb-0 text-muted text-right js-theca-product-stock-deliverytext">@Model.Stock.DeliveryText</p>640 </div>641 </div>642643 <div class="d-flex">644 <input name="Quantity0" id="Quantity0" type="number" value="1" class="w-25 text-center border-0">645 <button class="btn btn-success btn-block" type="submit">@Translate("eCom Product - Add To Cart - Button", "Add to cart")</button>646 </div>647648 <div class="row my-1">649 <div class="col-4">650 <p class="mb-0">651 <a class="text-heading" data-target="#howItWorksModal" data-toggle="modal">@Translate("eCom Product - How to order - Heading", "How to order?")</a>652 </p>653 </div>654 </div>655 }656 </div>657658 </form>659660 <script data-cookieconsent="ignore">var colorGroupVariantPrices = @JsonService.Instance.ToJson(colorGroupVariantPrices);</script>

Specifications

All measurements can vary +-3%

Fabric

Logistics

Assembled Width88 cm
Assembled Depth80 cm
Assembled Height89 cm

Similar items

Moro

Moro

Design Chair

Scopello

Scopello

Design Chair

Ghost high

Design Chair