Mapa plastic reciclat cu elastic A4 13 compartimente interioare Q-Connect

Cod produs: MPA095

Mapa din plastic multifunctionala.
13 compartimente interioare transparente.
Realizata din materiale plastice reciclabile.
Rezistenta ridicata la uzura.
Porteticheta din plastic pe coperta.
Inchidere cu elastice la colturi.
Latime cotor: 37 mm
Grosime coperta: 650 microni
Grosime buzunare interioare: 175 microni
Greutate mapa: 323 g
Dimensiuni mapa: 33 x 24,5 cm

Culoare

Descriere

Mapa din plastic multifunctionala, cu 13 compartimente interioare transparente pentru stocarea documentelor A4. Este realizata din materiale plastice reciclabile, care-i confera o rezistenta ridicata la uzura. Inchiderea se realizeaza cu elastice la colturi, iar pe coperta beneficiaza de o porteticheta generoasa din plastic.

Latime cotor: 37 mm
Grosime coperta: 650 microni
Grosime buzunare interioare: 175 microni
Greutate mapa: 323 g
Dimensiuni mapa: 33 x 24,5 cm

Error executing template "/Designs/Swift/Paragraph/AUS_ProductSpecification.cshtml"
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetFieldDisplayGroupValues(ProductViewModelSettings settings, Product product, String languageID, Lazy`1 productIds)
   at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass3_1.<BulkCreateView>b__51()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_d923e3fac9bf4eb2832148b026c48641.Execute() in C:\Sites\www.austral.ro\Files\Templates\Designs\Swift\Paragraph\AUS_ProductSpecification.cshtml:line 65
   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 Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Ecommerce.ProductCatalog 3 4 5 @functions{ 6 7 public Dictionary<string, FieldValueViewModel> TransformNODSpecifications(string fieldJSON) 8 { 9 Dictionary<string, FieldValueViewModel> options = new Dictionary<string, FieldValueViewModel>(); 10 dynamic s = Newtonsoft.Json.JsonConvert.DeserializeObject(fieldJSON); 11 foreach(var option in s) 12 { 13 string systemName = option.Label; 14 FieldValueViewModel fieldOption = new FieldValueViewModel(); 15 fieldOption.Name = option.Label; 16 fieldOption.SystemName = systemName; 17 fieldOption.Type = "String"; 18 fieldOption.Value = option.Value; 19 fieldOption.ListType = 1; 20 options.Add(systemName, fieldOption); 21 } 22 return options; 23 } 24 } 25 @{ 26 bool isVisualEditor = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("VisualEdit")) ? Convert.ToBoolean(Dynamicweb.Context.Current.Request.QueryString.Get("VisualEdit")) : false; 27 28 ProductViewModel product = new ProductViewModel(); 29 30 ProductViewModelSettings productSetting = new ProductViewModelSettings 31 { 32 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 33 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 34 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 35 ShopId = Pageview.Area.EcomShopId 36 }; 37 38 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 39 { 40 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 41 } else if (Pageview.Item["DummyProduct"] != null) { 42 43 string dummyProductId = ""; 44 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 45 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 46 if (productList.Products != null) 47 { 48 foreach (var p in productList.Products) { dummyProductId = p.Id; } 49 ProductViewModel dummyProduct = dummyProductId != "" ? ViewModelFactory.CreateView(productSetting, dummyProductId) : new ProductViewModel(); 50 product = dummyProduct; 51 } else { 52 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 53 } 54 } else if (Pageview.Item["DummyProduct"] == null) { 55 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 56 } 57 } 58 59 @if (product?.Id != null) { 60 IEnumerable<string> selectedDisplayGroupIds = Model.Item.GetRawValueString("DisplayGroups").Split(',').ToList(); 61 List<CategoryFieldViewModel> displayGroups = new List<CategoryFieldViewModel>(); 62 63 foreach (var selection in selectedDisplayGroupIds) 64 { 65 foreach (CategoryFieldViewModel group in product.FieldDisplayGroups.Values) 66 { 67 if (selection == group.Id) 68 { 69 displayGroups.Add(group); 70 } 71 } 72 } 73 74 bool showProductFields = Model.Item.GetBoolean("ProductFields"); 75 76 bool hideTitle = Model.Item.GetBoolean("HideTitle"); 77 78 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 79 80 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "display-4"); 81 82 string contentPadding = Model.Item.GetRawValueString("ContentPadding", ""); 83 contentPadding = contentPadding == "small" ? "p-2 p-md-3" : contentPadding; 84 contentPadding = contentPadding == "large" ? "p-4 p-md-5" : contentPadding; 85 86 string layout = Model.Item.GetRawValueString("Layout", "list"); 87 string size = Model.Item.GetRawValueString("Size", "full"); 88 89 if (Pageview.IsVisualEditorMode && displayGroups.Count() == 0) 90 { 91 product.ProductFields.Clear(); 92 product.ProductFields.Add(Translate("Width"), new FieldValueViewModel { Name = Translate("Width"), Value = "99cm" }); 93 product.ProductFields.Add(Translate("Height"), new FieldValueViewModel { Name = Translate("Height"), Value = "195cm" }); 94 showProductFields = true; 95 } 96 97 <div class="@(theme) h-100 item_@Model.Item.SystemName.ToLower()"> 98 <div class="@contentPadding"> 99 @if ((product.ProductFields != null && Model.Item.GetBoolean("ProductFields")) || (product.ProductCategories != null && Model.Item.GetBoolean("CategoryFields")) || (displayGroups.Count != 0)) { 100 if (!hideTitle) 101 { 102 <div class="text-start pb-2 pb-lg-4"> 103 <h2 class="@titleFontSize">@Model.Item.GetString("Title")</h2> 104 </div> 105 } 106 } 107 108 @if (displayGroups.Count != 0) { 109 foreach (var group in displayGroups) { 110 bool hideHeader = Model.Item.GetBoolean("HideGroupHeaders"); 111 112 if (!hideHeader) { 113 <h4 class="h4 mb-4">@group.Name</h4> 114 } 115 //check if we have NOD specifications 116 if(group.Id == "Specificatii_NOD") 117 { 118 //separate Properties from other fields 119 var nodProperties = group.Fields["Properties"]; 120 var nodSpecifications = group.Fields.Where(i => i.Key != "Properties").ToDictionary(i => i.Key, i => i.Value); 121 if(nodSpecifications.Any()) 122 { 123 @RenderFieldsFromList(nodSpecifications, layout); 124 } 125 if(nodProperties != null) 126 { 127 var properties = TransformNODSpecifications(nodProperties.Value.ToString()); 128 @RenderFieldsFromList(properties, layout); 129 } 130 } else { 131 @RenderFieldsFromList(group.Fields, layout); 132 } 133 } 134 } 135 136 @if (product.ProductFields != null && showProductFields) { 137 if (product.ProductFields.Count > 0) { 138 @RenderFieldsFromList(product.ProductFields, layout); 139 } 140 } 141 142 @if (product.ProductCategories != null && Model.Item.GetBoolean("CategoryFields")) { 143 bool hideHeader = Model.Item.GetBoolean("HideGroupHeaders"); 144 if (product.ProductCategories.Count > 0) { 145 foreach (var group in product.ProductCategories) { 146 CategoryFieldViewModel category = group.Value; 147 148 if (!hideHeader) { 149 <h4 class="h4 mb-4">@group.Value.Name</h4> 150 } 151 152 @RenderFieldsFromList(category.Fields, layout); 153 154 } 155 } 156 } 157 </div> 158 </div> 159 } else if (Pageview.IsVisualEditorMode) { 160 <div class="alert alert-warning m-0">@Translate("No products available")</div> 161 } 162 163 164 @helper RenderFieldsFromList(Dictionary<string, FieldValueViewModel> fields, string layout) { 165 string size = Model.Item.GetRawValueString("Size", "full"); 166 string extraMargin = size == "full" ? "mb-3" : ""; 167 bool hideFieldLabels = Model.Item.GetBoolean("HideFieldLabels"); 168 string propertiesFieldName = "Properties"; 169 //remove fields used for filtering. 170 fields = fields.Where(x=>!x.Key.Contains("f_")).ToDictionary(item => item.Key, item => item.Value); 171 172 <div class="@extraMargin"> 173 @if (layout == "columns") { 174 string gaps = size == "full" ? "gap-0" : "gap-2"; 175 176 <div class="grid @gaps"> 177 @foreach (var field in fields) { 178 @RenderField(field.Value, layout) 179 } 180 </div> 181 } 182 @if (layout == "list") { 183 <dl class="grid gap-0"> 184 @foreach (var field in fields) { 185 @RenderField(field.Value, layout) 186 } 187 </dl> 188 } 189 @if (layout == "table") { 190 string tableSize = size == "full" ? "" : "table-sm"; 191 192 <table class="table table-striped @tableSize"> 193 @foreach (var field in fields) { 194 @RenderField(field.Value, layout) 195 } 196 </table> 197 } 198 @if (layout == "bullets") { 199 string listSize = size == "full" ? "" : "m-0 p-0 lh-1 fs-7 opacity-75"; 200 string listStyle = size == "full" ? "" : "style=\"list-style-position: inside\""; 201 202 <ul class="@listSize" @listStyle> 203 @foreach (var field in fields) { 204 @RenderField(field.Value, layout) 205 } 206 </ul> 207 } 208 @if (layout == "commas") { 209 List<string> featuresList = new List<string>(); 210 211 foreach (var field in fields) 212 { 213 if (field.Value.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { 214 List<string> options = new List<string>(); 215 foreach (FieldOptionValueViewModel option in field.Value.Value as System.Collections.Generic.List<FieldOptionValueViewModel>) { 216 if (!string.IsNullOrWhiteSpace(option.Value)) { 217 if (option.Value.ToString().Contains("#") && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 218 string colorSpan = "<span class=\"colorbox-sm\" style=\"background-color: " + option.Value + "\"></span>"; 219 options.Add(colorSpan); 220 } else if (!string.IsNullOrEmpty(option.Value)) { 221 options.Add(option.Name); 222 } 223 } 224 } 225 string optionsString = (string.Join(", ", options.Select(x => x.ToString()).ToArray())); 226 if ((Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 227 optionsString = (string.Join(" ", options.Select(x => x.ToString()).ToArray())); 228 } 229 230 if (!hideFieldLabels) { 231 featuresList.Add(field.Value.Name + ": " + optionsString); 232 } else { 233 featuresList.Add(optionsString); 234 } 235 } else { 236 if (!string.IsNullOrWhiteSpace(field.Value.Value.ToString())) { 237 if (field.Value.Value.ToString().Contains("#") && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 238 string colorSpan = "<span class=\"colorbox-sm\" style=\"background-color: " + field.Value.Value + "\"></span>"; 239 240 if (!hideFieldLabels) { 241 featuresList.Add(field.Value.Name + ": " + colorSpan); 242 } else { 243 featuresList.Add(colorSpan); 244 } 245 } else { 246 if (!hideFieldLabels) { 247 featuresList.Add(field.Value.Name + ": " + field.Value.Value.ToString()); 248 } else { 249 featuresList.Add(field.Value.Value.ToString()); 250 } 251 } 252 } 253 } 254 } 255 256 string featuresString = (string.Join(", ", featuresList.Select(x => x.ToString()).ToArray())); 257 258 <div class="opacity-75 fs-7">@featuresString</div> 259 } 260 </div> 261 } 262 263 @helper RenderField(FieldValueViewModel field, string layout) { 264 string size = Model.Item.GetRawValueString("Size", "full"); 265 string fieldValue = field?.Value != null ? field.Value.ToString() : ""; 266 bool hideFieldLabels = Model.Item.GetBoolean("HideFieldLabels"); 267 bool noValues = false; 268 269 if (!string.IsNullOrEmpty(fieldValue)) { 270 if (field.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { 271 System.Collections.Generic.List<FieldOptionValueViewModel> values = field.Value as System.Collections.Generic.List<FieldOptionValueViewModel>; 272 noValues = values.Count > 0 ? false : true; 273 } 274 } 275 276 if (!string.IsNullOrEmpty(fieldValue) && noValues == false) { 277 if (layout == "columns") { 278 <div class="grid g-col-6 g-col-lg-4"> 279 @if(!hideFieldLabels) 280 { 281 <dt class="g-col-4 py-2 fw-bold">@field.Name</dt> 282 } 283 <dd class="g-col-8 py-2 mb-0">@RenderFieldValue(field)</dd> 284 </div> 285 } 286 if (layout == "list") { 287 string extraPadding = size == "full" ? "py-2" : ""; 288 289 if (!hideFieldLabels) 290 { 291 <dt class="g-col-4 @extraPadding fw-bold">@field.Name</dt> 292 } 293 <dd class="g-col-8 @extraPadding mb-0"> 294 @RenderFieldValue(field) 295 </dd> 296 } 297 if (layout == "table") { 298 <tr> 299 @if (!hideFieldLabels) 300 { 301 <th class="fw-bold" scope="row">@field.Name</th> 302 } 303 <td>@RenderFieldValue(field)</td> 304 </tr> 305 } 306 if (layout == "bullets") { 307 <li> 308 @if (!hideFieldLabels) 309 { 310 <strong>@field.Name</strong> 311 } 312 <span>@RenderFieldValue(field)</span> 313 </li> 314 } 315 } 316 } 317 318 @helper RenderFieldValue(FieldValueViewModel field) { 319 string fieldValue = field?.Value != null ? field.Value.ToString() : ""; 320 321 bool isLink = field?.Type == "Link"; 322 bool isColor = false; 323 bool isBrandName = field?.SystemName == "Brand_name"; 324 325 fieldValue = fieldValue == "False" ? Translate("No") : fieldValue; 326 fieldValue = fieldValue == "True" ? Translate("Yes") : fieldValue; 327 328 329 if (field.Value.GetType() == typeof(System.Collections.Generic.List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel>)) 330 { 331 int valueCount = 0; 332 System.Collections.Generic.List<FieldOptionValueViewModel> values = field.Value as System.Collections.Generic.List<FieldOptionValueViewModel>; 333 int totalValues = values.Count; 334 335 foreach (FieldOptionValueViewModel option in values) 336 { 337 if (option.Value.Substring(0,1) == "#") { 338 isColor = true; 339 } 340 341 if (!isColor) { 342 @option.Name 343 } else { 344 <span class="colorbox-sm" style="background-color: @option.Value" title="@option.Name"></span> 345 } 346 347 if (valueCount != totalValues && valueCount < (totalValues - 1)) { 348 if (isColor) { 349 <text> </text> 350 } else { 351 <text>, </text> 352 } 353 } 354 valueCount++; 355 } 356 } 357 else 358 { 359 if (fieldValue.Substring(0,1) == "#") { 360 isColor = true; 361 } 362 363 if (!isColor) { 364 if(isLink) 365 { 366 string linktTitle = !fieldValue.Contains("aspx") ? fieldValue : Translate("Go to link"); 367 string target = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && fieldValue.Contains("http") ? "target=\"_blank\"" : string.Empty; 368 string rel = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && fieldValue.Contains("http") ? "rel=\"noopener\"" : string.Empty; 369 370 <a href="@field.Value" title="@field.Name" @target @rel>@linktTitle</a> 371 } 372 else if (isBrandName) 373 { 374 <span itemprop="brand" itemtype="https://schema.org/Brand" itemscope> 375 <span itemprop="name">@fieldValue</span> 376 </span> 377 } 378 else 379 { 380 @fieldValue 381 } 382 383 } else { 384 <span class="colorbox-sm" style="background-color: @fieldValue" title="@fieldValue"></span> 385 } 386 } 387 } 388
Austral.ro folosește cookies, navigarea pe site implică acceptarea politicilor acestora.