Gro Outdoor Sofa

Email customization

Climbing · Fiesta · Gro Outdoor Sofa · Antracite

W: 161.0 cm / D: 74.0 cm / H: 74.0 cm


View more specifications

Customize product

Error executing template "Designs/kebe-e5/ecom/product/partials/add-to-cart.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_5eec9387ed0f4aed97ba77cac366e923.Execute() in E:\Dynamicweb.NET\Solutions\kebe.espresso4.dk\Files\Templates\Designs\kebe-e5\ecom\product\partials\add-to-cart.cshtml:line 203
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits ViewModelTemplate<KebeProduct> @using System.Globalization @using Co3.Espresso.Base.Extensions @using Co3.Espresso.Base.Models @using Co3.Espresso.Website.Models @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce @using Co3.Espresso.Website.Models.FrontEnd @using Co3.Espresso.Website.Models.FrontEnd.Elements @using Co3.Espresso.Website.Models.Settings @using Co3.Espresso.Website.Services @using Co3.Kebe.Data.Apps @using Co3.Kebe.Website.Models.Ecommerce @using Co3.Kebe.Website.Models.Users @using Co3.Kebe.Website.Services @using Co3.Kebe.Website.Services.Ecommerce @using Dynamicweb.Core @using Dynamicweb.Ecommerce.Common @using Dynamicweb.Ecommerce.Notifications @using Dynamicweb.Ecommerce.Products @using Dynamicweb.Ecommerce.Variants @using Dynamicweb.Frontend @using Dynamicweb.Rendering @using Dynamicweb.Rendering.Translation @using Dynamicweb.Security.UserManagement @using OfficeOpenXml.FormulaParsing.Excel.Functions.Text @using Dynamicweb.Security.UserManagement.Common.CustomFields @using Co3.Kebe.Website.Models.Users @{ ClassList variantContainerHeaderClasslist = new ClassList("border-bottom pb-1 mb-1 d-flex text-black"); ClassList variantSelectorClasslist = new ClassList("kebe-custom-select-container kebe-custom-select-variant mb-2"); CultureInfo currencyCulture = new CultureInfo(Context.Currency.CultureInfo); string currencyDecimalSeparator = currencyCulture.NumberFormat.CurrencyDecimalSeparator; string currencyGroupSeparator = currencyCulture.NumberFormat.CurrencyGroupSeparator; string currencyCode = Context.Currency.Code; string currencySymbol = Context.Currency.Symbol; int currencySymbolPlace = Context.Currency.SymbolPlace; bool isUserAuthenticated = User.IsExtranetUserLoggedIn(); bool userHidePDPPrices = false; if (isUserAuthenticated) { userHidePDPPrices = Converter.ToBoolean(UserContext.Current.User.DWUser.GetCustomFieldValue<object>("Hide ProductPage Prices")?.ToString().ToLowerInvariant()); } } <form action="/system/data/cart" class="e-product-form js-e-product-form js-e-product-form-addtocart js-kebe-product-form-addtocart py-1" method="post" data-currencyDecimalSeparator="@currencyDecimalSeparator" data-currencyGroupSeparator="@currencyGroupSeparator" data-currencyCode="@currencyCode" data-currencySymbol="@currencySymbol" data-currencySymbolPlace="@currencySymbolPlace"> @*<input name="CartCmd" type="hidden" value="Add">*@ <input id="CartCmd" name="CartCmd" type="hidden" value="addmulti"> <input name="ProductLoopCounter0" id="ProductLoopCounter0" type="hidden" value="0"> <input name="ProductID0" id="ProductID0" type="hidden" value="@Model.Id"> <input name="VariantID0" id="VariantID0" type="hidden" value="@Model.VariantId"> <input name="UnitID0" id="UnitID0" type="hidden" value=""> <input name="Redirect" type="hidden" value=""> <input name="Name" type="hidden" value="@Model.Name"> <input name="Number" type="hidden" value="@Model.Number"> <input name="Price" type="hidden" value="@(isUserAuthenticated == true ? @Model.Price.Value.ToJavaScript() : "")"> <input name="CurrencyCode" type="hidden" value="@Model?.Price.CurrencyCode"> <input id="EcomOrderLineFieldInput_SetKey" name="EcomOrderLineFieldInput_SetKey0" type="hidden" value="@Model.SetKey" disabled> @if (Model.VariantGroups.Any()) { List<string> variantGroupOrder = new List<string>(); /* 1 */ //variantGroupOrder.Add("Mirrored"); /* 2 */ variantGroupOrder.Add("Cover"); /* 3 */ variantGroupOrder.Add("Base"); /* 4 */ //variantGroupOrder.Add("Legs"); /* 5 */ //variantGroupOrder.Add("Height"); /* 6 */ //variantGroupOrder.Add("Function"); List<string> excludedVariantOptionValues = new List<string>(); //excludedVariantOptionValues.Add("NoFunction"); //excludedVariantOptionValues.Add("Standard"); //excludedVariantOptionValues.Add("NoShell"); GroupedVariantOptions baseGroupedColor = null; GroupedVariantOptions baseGroupedType = null; GroupedVariantOptions coverGrouped = null; if (Model != null) { baseGroupedColor = Model.GetGroupedVariantOptionsByVariantGroup(Constants.DW_ECOMMERCE_PRODUCT_WEBVARIANT_STELFARVE_NAME); baseGroupedType = Model.GetGroupedVariantOptionsByVariantGroup(Constants.DW_ECOMMERCE_PRODUCT_WEBVARIANT_SOKKELTYPE_NAME); coverGrouped = Model.GetGroupedVariantOptionsByVariantGroup(Constants.DW_ECOMMERCE_PRODUCT_WEBVARIANT_COVER_NAME); } string inputType = "radio"; string cssToggle = string.Empty; //string inputType = "select"; <div class="d-flex flex-column"> @foreach (KeyValuePair<string, EspressoVariantGroup> variantGroup in Model.VariantGroups) { EspressoVariantGroup kebeVariantGroupValue = variantGroup.Value; if (kebeVariantGroupValue.Options != null) { Dictionary<string, EspressoVariantOption> kebeVariantGroupValueOptions = kebeVariantGroupValue.Options.Where(opt => excludedVariantOptionValues.IndexOf(opt.Value.Name) == -1).ToDictionary(opt => opt.Key, opt => opt.Value); cssToggle = kebeVariantGroupValueOptions.Any() ? string.Empty : "d-none"; if (inputType == "select") { string variantInputFieldName = string.Format("{0}_{1}", Model.Id, variantGroup.Value.Id); string variantInputFieldId = variantInputFieldName; <div class="form-group @cssToggle js-kebe-product-form-variant-form-group js-e-product-form-variant-form-group mb-2 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)"> <label class="text-black form-control-label" for="@variantInputFieldId">@variantGroup.Value.Name</label> <select class="custom-select js-e-product-form-variant-group-input required" id="@variantInputFieldId" name="@variantInputFieldName"> @foreach (KeyValuePair<string, EspressoVariantOption> variantOption in kebeVariantGroupValue.Options) { bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId; <option value="@variantOption.Value.Id" @(isSelected ? "selected" : string.Empty)>@variantOption.Value.Name</option> } </select> </div> } else { string translateKey = string.Format("eCom Product - {0} - Heading", variantGroup.Value.Id); string variantInputFieldName = string.Format("{0}_{1}", Model.Id, variantGroup.Value.Id); List<string> filterColors = new List<string>(); List<string> filterColorFamilies = new List<string>(); List<string> filterMaterialTypes = new List<string>(); List<string> filterColorFamiliesDropdown = new List<string>(); List<string> filterMaterialTypesDropdown = new List<string>(); Dictionary<string, EspressoPrice> colorGroupPrices = new Dictionary<string, EspressoPrice>(); Dictionary<string, EspressoPrice> colorGroupPricesDropdown = new Dictionary<string, EspressoPrice>(); Dictionary<string, List<EspressoVariantOption>> colorFamilies = new Dictionary<string, List<EspressoVariantOption>>(); List<string> filterBases = new List<string>(); List<string> filterBaseFamilies = new List<string>(); List<string> filterBaseTypes = new List<string>(); Dictionary<string, EspressoPrice> baseGroupPrices = new Dictionary<string, EspressoPrice>(); Dictionary<string, List<EspressoVariantOption>> baseFamilies = new Dictionary<string, List<EspressoVariantOption>>(); //BASE if (baseGroupedType != null) { foreach (string groupKey in baseGroupedType.Keys) { foreach (string variantOptionKey in baseGroupedType[groupKey].Keys) { if (filterBases.IndexOf(baseGroupedType[groupKey][variantOptionKey].VariantOption.Stelfarve) == -1) { filterBases.Add(baseGroupedType[groupKey][variantOptionKey].VariantOption.Stelfarve); } if (filterBaseFamilies.IndexOf(baseGroupedType[groupKey][variantOptionKey].VariantOption.Group) == -1) { filterBaseFamilies.Add(baseGroupedType[groupKey][variantOptionKey].VariantOption.Group); baseGroupPrices[baseGroupedType[groupKey][variantOptionKey].VariantOption.Group] = baseGroupedType[groupKey][variantOptionKey].Product.PriceWithoutSurcharges; } string baseFamilyKey = baseGroupedType[groupKey][variantOptionKey].VariantOption.Group; if (!string.IsNullOrEmpty(baseFamilyKey)) { if (!baseFamilies.ContainsKey(baseFamilyKey)) { baseFamilies[baseFamilyKey] = new List<EspressoVariantOption>(); } baseFamilies[baseFamilyKey].Add(baseGroupedType[groupKey][variantOptionKey].VariantOption); } List< string > baseSortOrder = KebeProductService.Instance.GetBaseSortOrder(); baseFamilies = baseFamilies.OrderBy( cf => baseSortOrder.IndexOf(cf.Key)).ToDictionary(cf => cf.Key, cf => cf.Value); } } } //COVER if (coverGrouped != null) { foreach (string groupKey in coverGrouped.Keys) { foreach (string variantOptionKey in coverGrouped[groupKey].Keys) { if (filterColors.IndexOf(coverGrouped[groupKey][variantOptionKey].VariantOption.ColorGroup) == -1) { filterColors.Add(coverGrouped[groupKey][variantOptionKey].VariantOption.ColorGroup); } if (filterColorFamilies.IndexOf(coverGrouped[groupKey][variantOptionKey].VariantOption.Group) == -1) { filterColorFamilies.Add(coverGrouped[groupKey][variantOptionKey].VariantOption.Group); filterMaterialTypes.Add(coverGrouped[groupKey][variantOptionKey].VariantOption.Group); colorGroupPrices[coverGrouped[groupKey][variantOptionKey].VariantOption.Group] = coverGrouped[groupKey][variantOptionKey].Product.PriceWithoutSurcharges; } if (filterColorFamiliesDropdown.IndexOf(coverGrouped[groupKey][variantOptionKey].VariantOption.FabricType) == -1) { filterColorFamiliesDropdown.Add(coverGrouped[groupKey][variantOptionKey].VariantOption.FabricType); filterMaterialTypesDropdown.Add(coverGrouped[groupKey][variantOptionKey].VariantOption.FabricType); colorGroupPricesDropdown[coverGrouped[groupKey][variantOptionKey].VariantOption.FabricType] = coverGrouped[groupKey][variantOptionKey].Product.PriceWithoutSurcharges; } string colorFamilyKey = coverGrouped[groupKey][variantOptionKey].VariantOption.Group; string colorFamilyKeyDropdown = coverGrouped[groupKey][variantOptionKey].VariantOption.FabricType; if (!string.IsNullOrEmpty(colorFamilyKey)) { if (!colorFamilies.ContainsKey(colorFamilyKey)) { colorFamilies[colorFamilyKey] = new List<EspressoVariantOption>(); } colorFamilies[colorFamilyKey].Add(coverGrouped[groupKey][variantOptionKey].VariantOption); } List< string > colorFamilySortOrder = KebeProductService.Instance.GetColorFamilySortOrder(); colorFamilies = colorFamilies.OrderBy( cf => colorFamilySortOrder.IndexOf(cf.Key)).ToDictionary(cf => cf.Key, cf => cf.Value); } } } if (variantGroup.Value.Id == "Cover") { <div class="form-group @cssToggle js-kebe-product-form-variant-form-group mb-2 order-@variantGroupOrder.IndexOf(variantGroup.Value.Id)" data-variant-group="@variantGroup.Value.Id"> <p class="@variantContainerHeaderClasslist">@Translate("eCom Product - Upholstery - Text", "Upholstery"): <span class="js-kebe-product-selected-option-value font-weight-normal ml-1">@kebeVariantGroupValue.SelectedOptionName</span></p> <div class="@variantSelectorClasslist"> @{ string selectedOptionId = kebeVariantGroupValue.SelectedOptionId + ".jpg"; } <button data-toggle="popover" data-trigger="hover focus" data-placement="bottom" data-content="@kebeVariantGroupValue.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/kebe-e5/_assets/img/no-image.jpg')">&nbsp;</button> <button type="button" class="btn btn-secondary flex-grow-1" data-toggle="modal" data-target="#materialModal">@Translate("eCom Product - Change Cover - Heading", "Change Cover") (@kebeVariantGroupValue.Options.Count @Translate("eCom Product - Options - Text", "options"))</button> </div> @using Co3.Espresso.Website.Services @using System.Web @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce @using Co3.Kebe.Website.Models.Ecommerce @using Dynamicweb.Core @using Dynamicweb.Frontend <div class="modal modal-fullscreen js-kebe-modal-material kebe-modal-material" data-fallback-material="" id="materialModal" tabindex="-1" role="dialog" aria-labelledby="materialModalLabel" aria-hidden="true" data-backdrop="false"> <div class="modal-dialog" role="document"> <div class="e-loading-overlay js-e-loading-overlay"> @RenderingService.Instance.PartialView( "_partials/loading-spinner.cshtml" ) </div> <div class="row"> <div class="modal-content col-12 col-md-6 bg-light" style="max-height: 100vh; min-height: auto;"> <div class="modal-body d-flex flex-column modal-body"> <h2 class="e-product-name"> @Model.ModelName <span class="text-muted">· @Translate("eCom Products - All upholsteries - Heading", "All upholsteries") (@kebeVariantGroupValue.Options.Count @Translate("eCom Product - Options - Text", "options"))</span> </h2> <div class="d-flex flex-wrap mb-4" id="js-kebe-cover-filters"> <div class="dropdown e-productlist-filters-group border-0 mr-1" style="flex:1"> <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"> @Translate("Filter_Facet_Label_Color","Color") <i class="material-icons e-productlist-filters-group-collapse-toggle-icon-off ml-auto">arrow_drop_down</i> </button> <div class="dropdown-menu border" style="width: 97%;" aria-labelledby="dropdownColour"> <div class="px-2" style="max-height: 25vh; overflow-y: auto;"> @foreach (string filterColor in filterColors) { if (!string.IsNullOrEmpty(filterColor)) { string filterColorClean = filterColor.Replace(" ", "_"); <div class="e-material-filters-option js-kebe-cover-filters-option"> <label for="facet_Color_@filterColorClean" class="custom-control custom-checkbox"> <input class="custom-control-input" id="facet_Color_@filterColorClean" name="Color" type="checkbox" value="@filterColor"> <span class="custom-control-indicator"></span> <span class="custom-control-description">@filterColor</span> </label> </div> } } </div> </div> </div> <div class="dropdown e-productlist-filters-group border-0 " style="flex:1"> <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"> @Translate("Filter_FacetOption_Label_Leather/Fabric","Fabric / Leather") <i class="material-icons e-productlist-filters-group-collapse-toggle-icon-off ml-auto">arrow_drop_down</i> </button> <div class="dropdown-menu border" style="width: 97%;" aria-labelledby="dropdownFabric"> <div class="px-2" style="max-height: 25vh; overflow-y: auto;"> @foreach (string filterMaterialType in filterMaterialTypesDropdown) { if (!string.IsNullOrEmpty(filterMaterialType)) { string filterMaterialTypeClean = filterMaterialType.Replace(" ", "_"); <div class="e-material-filters-option js-kebe-cover-filters-option"> <label for="facet_MaterialType_@filterMaterialTypeClean" class="custom-control custom-checkbox"> <input class="custom-control-input" id="facet_MaterialType_@filterMaterialTypeClean" name="MaterialType" type="checkbox" value="@filterMaterialType"> <span class="custom-control-indicator"></span> <span class="custom-control-description">@filterMaterialType</span> </label> </div> } } </div> </div> </div> </div> @{ string jsonSrc = "/system/data/product"; string jsonSrcGetParams = HttpUtility.HtmlAttributeEncode( JsonService.Instance.ToJson( new Dictionary< string, string > { {"productId", Model.Id}, {"variantId", Model.VariantId} } ) ); } <div class="e-product-image-container js-e-product-images my-auto mx-6 mx-md-0"> <div class="js-e-jsonpublisher product-modal-image-gray-overlay bg-white d-flex" 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"> <script class="js-e-handlebars-tmpl-product-image-carousel-modal" type="text/x-handlebars-template"> {{#if imageDetails}} <img src="{{imagePrimary.fullscreen}}" style="width: 100%; height: 100%; object-fit: contain; max-height: 35vh;"> {{/if}} </script> </div> </div> </div> </div> <div class="modal-content col-12 col-md-6 pl-md-0"> <div class="modal-header bg-white border-0 modal-header pt-1 d-none d-lg-block"> <button type="button" class="close mr-1 ml-auto js-kebe-modal-close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body pb-6" style="max-height: calc(100vh - 9em); overflow-y: scroll;"> <div id="accordion" class="form-group js-e-product-form-variant-form-group" data-auto-select="true"> <h2 class="d-none js-no-results">@Translate("eCom Productlist - No Products - Text", "")</h2> @{ List< string > colorFamilyIds = new List< string >(); foreach ( KeyValuePair< string, List< EspressoVariantOption > > colorFamily in colorFamilies ) { string hideColorGroupWithoutPrices = ""; if (isUserAuthenticated) { if (colorGroupPrices[colorFamily.Key].Value == 0) { hideColorGroupWithoutPrices = "d-none"; } } <div class="js-kebe-color-groups @hideColorGroupWithoutPrices"> <div> <a class="d-flex text-auto border-bottom text-decoration-none" data-toggle="collapse" style="cursor: auto;"> <span class="d-flex py-1 w-100"> @{ string infoPopoverFabricText = string.Empty; } @if (!string.IsNullOrEmpty(colorFamily.Key)) { infoPopoverFabricText = Translate(string.Format("eCom Product - Fabric Info - {0} - Text", colorFamily.Key), colorFamily.Key); } <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> @if (isUserAuthenticated) { if( userHidePDPPrices != true) { <span class="@Co3.Kebe.Website.Services.Ecommerce.KebeProductService.GetNoBuyB2C()"> <span class="text-right">@colorGroupPrices[colorFamily.Key].Formatted</span> </span> } } </span> </a> </div> <div id="collapse-@colorFamily.Key.Replace(" ", "-")" class="collapse show"> <div > <div class="@variantSelectorClasslist mb-3"> @foreach (KebeVariantOption variantOption in colorFamily.Value) { if (colorFamilyIds.IndexOf(variantOption.Id) == -1) { string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Id); bool isSelected = variantOption.Id == variantGroup.Value.SelectedOptionId; string optionIdWithImageFormat = variantOption.Id + ".jpg"; <label class="js-kebe-color-group-item"> <input class="variant-color js-e-product-form-variant-group-input" id="@variantInputFieldId" name="@variantInputFieldName" title="@variantOption.ColorGroup @variantOption.Name @variantOption.FabricType" type="radio" value="@variantOption.Id" @(isSelected ? "checked" : string.Empty)> <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/kebe-e5/_assets/img/no-image.jpg')"> <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/kebe-e5/_assets/img/no-image.jpg')"></span> </span> <span style="word-break: break-word;" class="custom-control-description text-center d-none d-lg-block small text-muted"> @variantOption.Name.Replace("/", " / ") </span> </label> colorFamilyIds.Add(variantOption.Id); } } </div> </div> </div> </div> } } </div> </div> <div class="modal-footer border-top py-1" style="position: sticky; bottom: 0; z-index: 1;"> <a class="arrow-left js-kebe-modal-close flex-grow-1" data-dismiss="modal" aria-label="Close">@Translate("eCom Product - Back to overview - Link","Back to overview")</a> <button type="button" class="btn btn-primary ml-auto flex-grow-1" data-dismiss="modal" aria-label="Close"> @Translate("eCom Product - Save adjustments - Button","Save adjustments") </button> </div> </div> </div> </div> </div> </div> } else if (variantGroup.Value.Id == "StelFarve" || variantGroup.Value.Id == "SokkelType" ) { string translateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", "SokkelType", variantGroup.Value.Id, kebeVariantGroupValue.SelectedOptionName); bool _translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(translateKeyVariantOptionName); if (_translationKeyExist) { kebeVariantGroupValue.SelectedOptionName = Translate(translateKeyVariantOptionName); } string translateKeyVariantGroupName = string.Format("eCom Product - Variant Group Name - {0} - Heading", variantGroup.Value.Name); <div class="form-group @cssToggle js-kebe-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"> <p class="@variantContainerHeaderClasslist">@Translate(translateKeyVariantGroupName) <span class="ml-1 js-kebe-product-selected-option-value font-weight-normal">@kebeVariantGroupValue.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> <div class="@variantSelectorClasslist"> @foreach (KeyValuePair<string, EspressoVariantOption> variantOption in kebeVariantGroupValue.Options) { string variantInputFieldId = string.Format("{0}_{1}", variantInputFieldName, variantOption.Value.Id); bool isSelected = variantOption.Value.Id == variantGroup.Value.SelectedOptionId; //string optionIdWithImageFormat = variantOption.Value.Id + ".jpg"; string variantOptionName = variantOption.Value.Name; string dataTranslateKeyVariantOptionName = string.Format("eCom Product - Variant Option - {0} {1} - {2} - Text", "SokkelType", variantGroup.Value.Id, variantOptionName); bool translationKeyExist = Translation.GetTranslationKeys(KeyScope.DesignsLocal, PageView.Current().Layout.Design).ContainsKey(dataTranslateKeyVariantOptionName); if (translationKeyExist) { variantOptionName = Translate(dataTranslateKeyVariantOptionName); } string optionIdWithImageFormat = variantOptionName; optionIdWithImageFormat = optionIdWithImageFormat.Replace(" ", ""); optionIdWithImageFormat = string.Format("{0}.jpg", optionIdWithImageFormat); if (translationKeyExist) { optionIdWithImageFormat = optionIdWithImageFormat.Replace("-", string.Format("-{0}-", "SokkelType")); } <label data-translatekey="@dataTranslateKeyVariantOptionName"> <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)> <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/kebe/_assets/img/no-image.jpg')"></span> </label> } </div> </div> } } } } @{ string cssDFlex = string.Empty; if (string.IsNullOrEmpty(cssToggle)) { cssDFlex = "d-flex"; } string jsonAccessoriesSrcGetParams = HttpUtility.HtmlAttributeEncode(JsonService.Instance.ToJson(new Dictionary<string, string> { {"productId", Model.Id}, {"variantId", Model.VariantId} })); } @if (!string.IsNullOrEmpty(Model.BaseHeight)) { <div class="form-group d-flex flex-wrap order-3" data-auto-select="true"> <div class="col-12 px-0"> <label class="text-black form-control-label">@Translate("eCom Product - Height - Text", "Height")</label> </div> <div class="flex-wrap"> <div class="js-e-jsonpublisher js-kebe-height" data-selected-value="Standard" data-json-src="/system/data/product" data-json-src-get-params="@jsonAccessoriesSrcGetParams" data-template=".js-e-handlebars-tmpl-height"> @for (int i = 0; i < Model.BaseHeightList.Count; i++) { string value = Model.BaseHeightList[i]; <label class="custom-control custom-radio mr-2" style="display: inline-block;"> <input @(value == "Standard" ? "checked" : "") class="custom-control-input js-e-product-form-variant-group-input js-e-product-form-variant-group-input-height required" id="@value" name="Height" title="@value" type="radio" value="@value"> <span class="custom-control-indicator"></span> <span class="custom-control-description">@value</span> </label> } <script class="js-e-handlebars-tmpl-height" type="text/x-handlebars-template"> {{#each baseHeightList}} <label class="custom-control custom-radio mr-2" style="display: inline-block;"> <input {{#compare this '===' 'Standard'}}checked{{/compare}} class="custom-control-input js-e-product-form-variant-group-input required" id="{{this}}" name="Height" title="{{value}}" type="radio" value="{{this}}"> <span class="custom-control-indicator"></span> <span class="custom-control-description">{{this}}</span> </label> {{/each}} </script> </div> <input id="EcomOrderLineFieldInput_HEIGHTADJ" name="EcomOrderLineFieldInput_HEIGHTADJ0" type="hidden" value="Standard"> </div> </div> } @if (Model.HasReturnSwivel == true || Model.HasAdjustableHeadrest == true) { <div class="form-group @cssToggle @cssDFlex mb-0 order-3" data-auto-select="true"> <div class="col-3 pl-0"> <label class="text-black form-control-label">@Translate("eCom Product - Options - Text", "Options")</label> </div> <div class=""> @if (Model.HasReturnSwivel == true) { <label class="custom-checkbox custom-control d-inline-block ml-2"> <input class="custom-control-input js-e-product-form-input" id="Return swivel" name="Return swivel" title="Return swivel" type="checkbox" value="Return swivel"> <span class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Return swivel - Input", "Return swivel")</span> </label> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Return swivel infotext - Input", "Return swivel infotext")" data-original-title="" title="">info</i> <input id="EcomOrderLineFieldInput_RETURN" name="EcomOrderLineFieldInput_RETURN0" type="hidden" value=""> } @if (Model.HasAdjustableHeadrest == true) { <label class="custom-checkbox custom-control d-inline-block ml-2"> <input class="custom-control-input js-e-product-form-input" id="Adjustable headrest" name="Adjustable headrest" title="Adjustable headrest" type="checkbox" value="Adjustable headrest"> <span class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Adjustable headrest - Input", "Adjustable headrest")</span> </label> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Adjustable headrest infotext - Input", "Adjustable headrest infotext")" data-original-title="" title="">info</i> <input id="EcomOrderLineFieldInput_PFUNC" name="EcomOrderLineFieldInput_PFUNC0" type="hidden" value=""> } </div> @*<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>*@ </div> } @if (!string.IsNullOrEmpty(Model.Footrest.ProductId)) { <div class="form-group @cssToggle mb-0 order-3 @(Model.SoldDefaultInSet == true ? "d-none" : @cssDFlex)" data-auto-select="true" > <div class="col-3 pl-0"> <label class="text-black form-control-label">@Translate("eCom Product - Footstool - Input", "Footstool")</label> </div> <div class="d-flex flex-column"> <div class="js-e-jsonpublisher js-kebe-accessories-productlist" data-json-src="/system/data/product" data-json-src-get-params="@jsonAccessoriesSrcGetParams" data-template=".js-e-handlebars-tmpl-accessories"> <label class="custom-checkbox custom-control d-inline-block ml-2"> <input @(Model.SoldDefaultInSet == true ? "onclick='return false;'" : "") checked="checked" type="checkbox" class="custom-control-input js-kebe-checkbox-accessories js-dont-disable-group" data-unitprice="@(Model.Footrest.Price?.Value)" data-title="@(Model.Footrest.Name)" name="accessories@(Model.Footrest.ProductId)_@(Model.Footrest.VariantId)" id="accessories@(Model.Footrest.ProductId)_@(Model.Footrest.VariantId)"> <span @(Model.SoldDefaultInSet == true ? "hidden" : "") class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Matching footstool - Input", "Matching footstool")</span> </label> <input type="hidden" value="1" id="ProductLoopCounter1" name="ProductLoopCounter1"> <input type="hidden" value="@Model.Footrest.ProductId" id="ProductID1" name="ProductID1"> <input type="hidden" value="@Model.Footrest.VariantId" id="VariantID1" name="VariantID1"> @if (Model.SoldDefaultInSet != true) { <input data-sizes="@Model.Footrest.BaseHeight" id="EcomOrderLineFieldInput_HEIGHTADJ1" name="EcomOrderLineFieldInput_HEIGHTADJ1" type="hidden" value="Standard"> } <input data-inclination="@Model.Footrest.Inclination" id="EcomOrderLineFieldInput_INCLINATION1" name="EcomOrderLineFieldInput_INCLINATION1" type="hidden" value=""> <input id="EcomOrderLineFieldInput_SetKey1" name="EcomOrderLineFieldInput_SetKey1" type="hidden" value="@Model.SetKey"> <input type="hidden" value="" id="UnitID1" name="UnitID1"> <input type="hidden" class="js-kebe-accessories-quantity" name="Quantity1" id="Quantity1" value="1"> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Footstool infotext - Input", "Footstool infotext")" data-original-title="" title="">info</i> <a href="@Model.Footrest.Link" class="btn btn-secondary arrow-right ml-2 mb-1 js-btn-footrest d-none">@Translate("eCom Product - Footrest customizer - Button","Footrest customizer")</a> <script class="js-e-handlebars-tmpl-accessories" type="text/x-handlebars-template"> {{#if footrest}} <label class="custom-checkbox custom-control d-inline-block ml-2"> <input @(Model.SoldDefaultInSet == true ? "onclick='return false;'" : "") checked="checked" type="checkbox" class="custom-control-input js-kebe-checkbox-accessories js-dont-disable-group" data-unitprice="{{footrest.Price.value}}" data-title="{{footrest.Name}}" name="accessories{{footrest.ProductId}}_{{footrest.VariantId}}" id="accessories{{footrest.ProductId}}_{{footrest.VariantId}}"> <span @(Model.SoldDefaultInSet == true ? "hidden" : "") class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Matching footstool - Input", "Matching footstool")</span> </label> <input type="hidden" value="1" id="ProductLoopCounter1" name="ProductLoopCounter1"> <input type="hidden" value="{{footrest.ProductId}}" id="ProductID1" name="ProductID1"> <input type="hidden" value="{{footrest.VariantId}}" id="VariantID1" name="VariantID1"> @if (Model.SoldDefaultInSet != true) { <input data-sizes="{{footrest.BaseHeight}}" id="EcomOrderLineFieldInput_HEIGHTADJ1" name="EcomOrderLineFieldInput_HEIGHTADJ1" type="hidden" value="Standard"> } <input data-inclination="{{footrest.Inclination}}" id="EcomOrderLineFieldInput_INCLINATION1" name="EcomOrderLineFieldInput_INCLINATION1" type="hidden" value=""> <input id="EcomOrderLineFieldInput_SetKey1" name="EcomOrderLineFieldInput_SetKey1" type="hidden" value="{{setKey}}"> <input type="hidden" value="" id="UnitID1" name="UnitID1"> <input type="hidden" class="js-kebe-accessories-quantity" name="Quantity1" id="Quantity1" value="1"> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Footstool infotext - Input", "Footstool infotext")" data-original-title="" title="">info</i> <a href="{{footrest.Link}}" class="btn btn-secondary arrow-right ml-2 mb-1 js-btn-footrest d-none">@Translate("eCom Product - Footrest customizer - Button","Footrest customizer")</a> {{/if}} </script> </div> </div> </div> } @if (!string.IsNullOrEmpty(Model.HeadPillow.ProductId)) { <div class="form-group @cssToggle @cssDFlex mb-0 order-3" data-auto-select="true"> <div class="col-3 pl-0"> <label class="text-black form-control-label">@Translate("eCom Product - Headpillow - Input", "Headpillow")</label> </div> <div class="d-flex flex-column"> <div class="js-e-jsonpublisher js-kebe-accessories-productlist" data-json-src="/system/data/product" data-json-src-get-params="@jsonAccessoriesSrcGetParams" data-template=".js-e-handlebars-tmpl-headpillow"> <label class="custom-checkbox custom-control d-inline-block ml-2"> <input checked="checked" type="checkbox" class="custom-control-input js-kebe-checkbox-accessories js-dont-disable-group" data-unitprice="@(Model.HeadPillow.Price?.Value)" data-title="@(Model.HeadPillow.Name)" name="accessories@(Model.HeadPillow.ProductId)_@(Model.HeadPillow.VariantId)" id="accessories@(Model.HeadPillow.ProductId)_@(Model.HeadPillow.VariantId)"> <span class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Matching Headpillow - Input", "Matching Headpillow")</span> </label> <input type="hidden" value="1" id="ProductLoopCounter2" name="ProductLoopCounter2"> <input type="hidden" value="@Model.HeadPillow.ProductId" id="ProductID2" name="ProductID2"> <input type="hidden" value="@Model.HeadPillow.VariantId" id="VariantID2" name="VariantID2"> @*<input id="EcomOrderLineFieldInput_SetKey2" name="EcomOrderLineFieldInput_SetKey2" type="hidden" value="@Model.SetKey">*@ <input type="hidden" value="" id="UnitID2" name="UnitID2"> <input type="hidden" class="js-kebe-accessories-quantity" name="Quantity2" id="Quantity2" value="1"> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Headpillow infotext - Input", "Headpillow infotext")" data-original-title="" title="">info</i> <a href="@Model.HeadPillow.Link" class="btn btn-secondary arrow-right ml-2 mb-1 js-btn-headpillow d-none">@Translate("eCom Product - Headpillow customizer - Button","Headpillow customizer")</a> <script class="js-e-handlebars-tmpl-headpillow" type="text/x-handlebars-template"> {{#if headPillow}} <label class="custom-checkbox custom-control d-inline-block ml-2"> <input checked="checked" type="checkbox" class="custom-control-input js-kebe-checkbox-accessories js-dont-disable-group" data-unitprice="{{headPillow.Price.value}}" data-title="{{headPillow.Name}}" name="accessories{{headPillow.ProductId}}_{{headPillow.VariantId}}" id="accessories{{headPillow.ProductId}}_{{headPillow.VariantId}}"> <span class="custom-control-indicator"></span> <span class="custom-control-description mr-1">@Translate("eCom Product - Matching Headpillow - Input", "Matching Headpillow")</span> </label> <input type="hidden" value="2" id="ProductLoopCounter2" name="ProductLoopCounter2"> <input type="hidden" value="{{headPillow.ProductId}}" id="ProductID2" name="ProductID2"> <input type="hidden" value="{{headPillow.VariantId}}" id="VariantID2" name="VariantID2"> <input type="hidden" value="" id="UnitID2" name="UnitID2"> @*<input id="EcomOrderLineFieldInput_SetKey2" name="EcomOrderLineFieldInput_SetKey2" type="hidden" value="{{setKey}}">*@ <input type="hidden" class="js-kebe-accessories-quantity" name="Quantity2" id="Quantity2" value="1"> <i class="material-icons ml-auto align-self-center ml-2" data-toggle="popover" data-trigger="hover focus" data-content="@Translate("eCom Product - Headpillow infotext - Input", "Headpillow infotext")" data-original-title="" title="">info</i> <a href="{{headPillow.Link}}" class="btn btn-secondary arrow-right ml-2 mb-1 js-btn-headpillow d-none">@Translate("eCom Product - Headpillow customizer - Button","Headpillow customizer")</a> {{/if}} </script> </div> </div> </div> } @if (!string.IsNullOrEmpty(Model.Inclination)) { <div class="form-group d-flex flex-wrap order-3" data-auto-select="true"> <div class="col-12 px-0"> <label class="text-black form-control-label">@Translate("eCom Product - Inclination - Input", "Inclination")</label> </div> <div class="flex-wrap"> <div class="js-e-jsonpublisher js-kebe-inclination" data-selected-value="" data-json-src="/system/data/product" data-json-src-get-params="@jsonAccessoriesSrcGetParams" data-template=".js-e-handlebars-tmpl-inclination"> @for (int i = 0; i < Model.InclinationList.Count; i++) { string value = Model.InclinationList[i]; <label class="custom-control custom-radio d-inline-block mr-2"> <input @(value == "Tilted" ? "checked" : "") class="custom-control-input js-e-product-form-variant-group-input required" id="@value" name="Inclination" title="@value" type="radio" value="@value"> <span class="custom-control-indicator"></span> <span class="custom-control-description">@value</span> </label> } <script class="js-e-handlebars-tmpl-inclination" type="text/x-handlebars-template"> {{#each inclination}} <label class="custom-control custom-radio d-inline-block mr-2"> <input {{#compare this '===' 'Tilted'}}checked{{/compare}} class="custom-control-input js-e-product-form-variant-group-input required" id="{{this}}" name="Inclination" title="{{value}}" type="radio" value="{{this}}"> <span class="custom-control-indicator"></span> <span class="custom-control-description">{{this}}</span> </label> {{/each}} </script> </div> <input id="EcomOrderLineFieldInput_INCLINATION" name="EcomOrderLineFieldInput_INCLINATION0" type="hidden" value="Tilted"> </div> </div> } </div> } <!-- CTA --> @if (isUserAuthenticated) { if (UserContext.Current.User.IsDealer) { if (Model.IsSetItem == false && Model.SoldDefaultInSet == false || Model.IsSetItem == true && Model.SoldDefaultInSet == false || Model.IsSetItem == false && Model.SoldDefaultInSet == true) { <div class="@Co3.Kebe.Website.Services.Ecommerce.KebeProductService.GetNoBuyB2C()"> @if(userHidePDPPrices != true) { <div class="row pt-2 border-top"> <div class="col-6"> @{ bool showRetailPrice = UserContext.Current.ShowRetailPrice; } @if (showRetailPrice == true) { <p class="mb-0">@Translate("eCom Product - Retail price - Text", "Retail price")</p> } else { <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p> } </div> <div class="col-6"> <p class="mb-0 text-right d-none js-kebe-product-price-formatted" data-unitprice="@Model.Price.Value.ToJavaScript()"></p> </div> </div> } <div class="row mb-1"> <div class="col-8"> <p class="mb-0 text-muted">@Translate("eCom Product - Estimated delivery time - Text", "Estimated delivery time")</p> </div> <div class="col-4"> <p class="mb-0 text-muted text-right js-kebe-product-stock-deliverytext">@Model.Stock.DeliveryText</p> </div> </div> <div class="d-flex"> <input name="Quantity0" id="Quantity0" type="number" value="1" class="w-25 text-center border-0"> <button class="btn btn-success btn-block" type="submit"> @Translate("eCom Product - Add To Cart - Button", "Add to cart") </button> </div> </div> } } } else { if (UserContext.Current.CartIsLocked) { <p class="bg-info p-1 mt-2">@Translate("eCom Product - Cart Is locked - Info","You have reached max number of items in your cart")</p> } else { <div class="@Co3.Kebe.Website.Services.Ecommerce.KebeProductService.GetNoBuyB2C()"> <div class="row pt-2 border-top"> <div class="col-6"> <p class="mb-0">@Translate("eCom Product - Indicative price - Text", "Indicative price")</p> </div> <div class="col-6"> <p class="mb-0 text-right">@Translate("eCom Product - Request price - Button", "Request price")</p> </div> </div> <div class="row mb-1"> <div class="col-8"> <p class="mb-0 text-muted">@Translate("eCom Product - Estimated delivery time - Text", "Estimated delivery time")</p> </div> <div class="col-4"> <p class="mb-0 text-muted text-right js-kebe-product-stock-deliverytext">@Model.Stock.DeliveryText</p> </div> </div> <div class="d-flex"> <input name="Quantity0" id="Quantity0" type="number" value="1" class="w-25 text-center border-0"> <button class="btn btn-success btn-block" type="submit"> @Translate("eCom Product - Request price - Button", "Request price") </button> </div> </div> } } </form>

Gro-Outdoor-Sofa

Designed by Hans Thyge & Co., our Gro Outdoor Sofa is with its clean and stylish look not only available
but also perfect for your outdoor environment. Offering unprecedented comfort to your garden, this brand new line is a game changer to any outdoor space.
After leaving the Gro Lounge in the rain or a snow, simply allow the stain-resistant and water-repellant fabric to dry out, or wipe the surface dry. As the water travels through the fibers and into the foam, the humidity is not able to come back up due to its membrane of solution dyed polyolefin. Thus, Gro will keep your seat dry and comfortable even through the harshest conditions.

Reimagine your garden 


Offering our 10 year guarantee on all Kebe chairs does not have to be limited to our indoor furniture. Having tested the Gro range through various conditions for 2 winters and more than 18 months, we know Gro will survive many winters and summers outside. Built to last, adding powder coating rust protection to the metal legs and inside steel frame and springs, we are convinced of the longevity of our Kebe products. The Climbing fabric is Oeko-tex tested and fit for the task. Stain free, water repellent, anti- microbial and bacterial, mildew and odour resistant as well. And with a UV filter top grade of 5, it offers all the features you need and should expect of your new comfortable outdoor lounge.

Specifications

Description

Product name Gro Outdoor Sofa Metal
Product number 59410B2450625
Product Group Description Sofa
Height 74.0 cm
Depth 74.0 cm
Volume 1.06
SeatingHeight 45.0 cm
Width 161.0 cm
Seating Depth 48.0 cm

Cover

Product name Gro Outdoor Sofa Metal
Color group
Color Fiesta
Fabric name Climbing
Fabric name
keyboard_arrow_up