Error executing template "Designs/Swift/Paragraph/Finixa_ProductFieldDisplayGroupsAccordion.cshtml"
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
at System.Collections.Generic.List`1.get_Item(Int32 index)
at CompiledRazorTemplates.Dynamic.RazorEngine_ae7fc28af19348639700c476305be157.ExecuteAsync()
at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
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 @using System.Linq
4
5 @functions {
6
7 class ContentSetting
8 {
9 public FieldGroupViewModel FieldDisplayGroup { get; set; }
10 public string LayoutPath { get; set; }
11
12 public ContentSetting(FieldGroupViewModel fieldDisplayGroup, string layoutPath)
13 {
14 FieldDisplayGroup = fieldDisplayGroup;
15 LayoutPath = GetLayoutPathFormatted(layoutPath);
16 }
17 }
18
19 ProductViewModel GetProduct()
20 {
21 ProductViewModel product = null;
22
23 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails"))
24 {
25 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"];
26 }
27
28 return product;
29 }
30
31 List<ContentSetting> GetContentSettings(ProductViewModel product)
32 {
33 var displayGroups = GetDisplayGroups(product);
34 string defaultLayout = Model.Item.GetRawValueString("Layout", "list");
35 var contentSettings = displayGroups.Select(displayGroup => new ContentSetting(displayGroup, defaultLayout)).ToList();
36 bool layoutsCustomized = Model.Item.GetBoolean("CustomizeLayouts");
37
38 return layoutsCustomized ? GetContentSettingsCustomizedLayoutSelection(contentSettings) : contentSettings;
39 }
40
41 List<FieldGroupViewModel> GetDisplayGroups(ProductViewModel product)
42 {
43 bool hideFieldsWithZeroValue = Model.Item.GetBoolean("HideFieldsWithZeroValue");
44 var selectedDisplayGroupSystemName = Model.Item.GetList("FieldDisplayGroups")?.GetRawValue().OfType<string>();
45 var displayGroups = product.GetProductDisplayGroupFieldsByGroupSystemNames(selectedDisplayGroupSystemName, hideFieldsWithZeroValue);
46
47 return displayGroups.ToList();
48 }
49
50 List<ContentSetting> GetContentSettingsCustomizedLayoutSelection(List<ContentSetting> contentSettings)
51 {
52 var selections = Model.Item.GetItems("FieldDisplayGroupLayoutSelector");
53
54 foreach (var contentSetting in contentSettings)
55 {
56 foreach (var selection in selections)
57 {
58 string displayGroupSystemName = string.Empty;
59 string layoutPath = string.Empty;
60
61 foreach (var field in selection.Fields)
62 {
63 displayGroupSystemName = field.SystemName == "FieldDisplayGroups" ? field.GetRawValueString() : displayGroupSystemName;
64 layoutPath = field.SystemName == "Layout" ? field.GetRawValueString() : layoutPath;
65 }
66
67 if (displayGroupSystemName == contentSetting.FieldDisplayGroup.SystemName)
68 {
69 contentSetting.LayoutPath = GetLayoutPathFormatted(layoutPath);
70 }
71 }
72 }
73
74 return contentSettings;
75 }
76
77 public static string GetLayoutPathFormatted(string layout)
78 {
79 string layoutPathInCapitalCase = layout[0].ToString().ToUpper() + layout.Substring(1);
80 return $"Components/Specifications/{layoutPathInCapitalCase}.cshtml";
81 }
82
83 }
84
85 @{
86 var product = GetProduct();
87
88 if (product is object)
89 {
90 var accordionContentSettings = GetContentSettings(product);
91
92 string title = Model.Item.GetString("Title");
93 bool hideLabels = Model.Item.GetBoolean("HideFieldLabels");
94 bool hideTitle = Model.Item.GetBoolean("HideTitle");
95 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "display-4");
96 var templateParams = new Dictionary<string, object>
97 {
98 {"Size", "compact" },
99 { "HideGroupHeaders", true },
100 { "HideTitle", true }
101 };
102
103 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : "";
104 string gapCss = "gap-2";
105 string contentPadding = Model.Item.GetRawValueString("ContentPadding", "");
106 contentPadding = contentPadding == "none" ? string.Empty : contentPadding;
107 contentPadding = contentPadding == "small" ? " p-2 p-md-3" : contentPadding;
108 contentPadding = contentPadding == "large" ? " p-4 p-md-5" : contentPadding;
109
110 <div class="h-100@(theme)@(contentPadding) item_@Model.Item.SystemName.ToLower()">
111 <div class="grid @(gapCss)">
112 @if (!hideTitle && accordionContentSettings.Any())
113 {
114 <h2 class="g-col-12 @titleFontSize">Frequent Asked Questions</h2>
115 }
116 <div class="g-col-12">
117 <div class="accordion accordion-flush w-100" id="Specifications_@Model.ID">
118 @foreach (var contentSetting in accordionContentSettings)
119 {
120 foreach (var field in contentSetting.FieldDisplayGroup.Fields.Select((value, index) => new { value, index }))
121 {
122 if (field.index % 2 == 0)
123 {
124 var id = Guid.NewGuid().ToString();
125 string groupHeadingId = $"SpecificationHeading_{Model.ID}_{id}";
126 string groupItemId = $"SpecificationItem_{Model.ID}_{id}";
127
128 <div class="accordion-item">
129 <h2 class="accordion-header" id="@groupHeadingId">
130 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#@groupItemId" aria-expanded="false" aria-controls="@groupItemId">
131 @field.value.Value
132 </button>
133 </h2>
134
135 <div id="@groupItemId" class="accordion-collapse collapse" aria-labelledby="@groupHeadingId" data-bs-parent="#Specifications_@Model.ID">
136 <div class="accordion-body">
137 <span>@contentSetting.FieldDisplayGroup.Fields[field.index + 1].Value</span>
138 </div>
139 </div>
140 </div>
141 }
142 }
143 }
144 </div>
145 </div>
146 </div>
147 </div>
148 }
149 else
150 {
151 <div class="alert alert-warning m-0">@Translate("Product Specification will be shown here if any")</div>
152 }
153 }
154