Otranto
Email customisation2.5 seater + ChaiselongFabric Burano Mushroom
infoW: 179 cm / D: 270 cm / H: 86,5 cm
Item# 32401611091
Customize your own ideal sofa
Combination: 2.5 seater + Chaiselong
Error executing template "Designs/theca/ecom/product/partials/add-to-cart.cshtml"System.NullReferenceException: Object reference not set to an instance of an object.at Lucene.Net.Index.SegmentTermDocs.Seek(Term term)at Lucene.Net.Search.MultiTermQueryWrapperFilter`1.GetDocIdSet(IndexReader reader)at Lucene.Net.Search.ConstantScoreQuery.ConstantScorer..ctor(ConstantScoreQuery enclosingInstance, Similarity similarity, IndexReader reader, Weight w)at Lucene.Net.Search.ConstantScoreQuery.ConstantWeight.Scorer(IndexReader reader, Boolean scoreDocsInOrder, Boolean topScorer)at Lucene.Net.Search.BooleanQuery.BooleanWeight.Scorer(IndexReader reader, Boolean scoreDocsInOrder, Boolean topScorer)at Lucene.Net.Search.BooleanQuery.BooleanWeight.Scorer(IndexReader reader, Boolean scoreDocsInOrder, Boolean topScorer)at Lucene.Net.Search.BooleanQuery.BooleanWeight.Scorer(IndexReader reader, Boolean scoreDocsInOrder, Boolean topScorer)at Lucene.Net.Search.IndexSearcher.SearchWithFilter(IndexReader reader, Weight weight, Filter filter, Collector collector)at Lucene.Net.Search.IndexSearcher.Search(Weight weight, Filter filter, Collector collector)at Lucene.Net.Search.IndexSearcher.Search(Weight weight, Filter filter, Int32 nDocs, Sort sort, Boolean fillFields)at Lucene.Net.Search.IndexSearcher.Search(Weight weight, Filter filter, Int32 nDocs, Sort sort)at Dynamicweb.Indexing.Lucene.LuceneIndexProvider.SearchInternal(IQuery query, QuerySettings settings)at Dynamicweb.Indexing.Querying.QueryService.Query(IQuery query, QuerySettings settings)at Co3.Theca.Website.Models.Frontend.Ecommerce.ThecaProduct.get_VariantGroups() in C:\projects\theca\Theca\Co3.Theca.Website\Models\Frontend\Ecommerce\ThecaProduct.cs:line 1069at CompiledRazorTemplates.Dynamic.RazorEngine_8c0bfbcf3903466dbfa60ee340bc63aa.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>
Otranto
Otranto Sofa – a perfect blend of style and comfort. Experience personalized relaxation with manually adjustable headrests for optimal neck support. The fixed back and seat cushions, combined with beautiful stitching details, create a sleek and elegant look. Elevate your living space with the Otranto Sofa.
Specifications
All measurements can vary +-3%
Fabric
Price Group | 2 |
---|---|
Color Family | BURANO |
Color | Brown |
Colorname | Mushroom |
Oeko-Tex | yes |
Composition | 100% Polyester |
Martindale | 33000 |
Lightfastness | 5 |
Description | BURANO |
Description
Description | Otranto Sofa – a perfect blend of style and comfort. Experience personalized relaxation with manually adjustable headrests for optimal neck support. The fixed back and seat cushions, combined with beautiful stitching details, create a sleek and elegant look. Elevate your living space with the Otranto Sofa. |
---|---|
Product Name | Otranto |
Back Height | 104 cm |
Back Type | Fixed |
Seat Height | 45,5 cm |
Sofa Material Type | Wood (seat + back) |
Seat Depth | 59 cm |
Seat Type | Fixed |
Logistics
Assembled Width | 179 cm |
---|---|
Assembled Depth | 270 cm |
Assembled Height | 86,5 cm |