Error compiling template "Designs/Swift/Paragraph/Swift_Custom_Reports.cshtml"
Line 91: Argument 1: cannot convert from 'void' to 'object'
Line 234: Argument 1: cannot convert from 'void' to 'object'
Line 258: Argument 1: cannot convert from 'void' to 'object'
Line 284: Argument 1: cannot convert from 'void' to 'scoped System.ReadOnlySpan'
1 // <auto-generated/>
2 #pragma warning disable 1591
3 namespace CompiledRazorTemplates.Dynamic
4 {
5 #line hidden
6 using System.Threading.Tasks;
7 using System;
8 using System.Collections.Generic;
9 using System.Linq;
10 using System.Globalization;
11 using System.IO;
12 using Dynamicweb.Core.Encoders;
13 internal class RazorEngine_0b049a1c6d0747e1b2d268df13b10621 : Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel>
14 {
15 #pragma warning disable 1998
16 public async override global::System.Threading.Tasks.Task ExecuteAsync()
17 {
18 WriteLiteral("\r\n");
19
20 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : "";
21 string contentPadding = Model.Item.GetRawValueString("ContentPadding", "none");
22 contentPadding = contentPadding == "none" ? "p-0" : contentPadding;
23 contentPadding = contentPadding == "small" ? "p-3 p-md-3" : contentPadding;
24 contentPadding = contentPadding == "large" ? "p-5 p-md-5" : contentPadding;
25
26 var reportItems = Model.Item?.GetItems("Reports") ?? Enumerable.Empty<Dynamicweb.Frontend.ItemViewModel>().ToList();
27 var groupReports = reportItems
28 .GroupBy(r => r.GetDateTime("FiscalYear").Year)
29 .OrderByDescending(g => g.Key)
30 .Select(g => new
31 {
32 FiscalYear = g.Key,
33 Reports = g.OrderByDescending(r => r.GetDateTime("ReleaseDate")).ToList()
34 })
35 .ToList();
36
37 bool reportItemsExist = reportItems != null && reportItems.Any();
38 string title = Model.Item.GetString("Title");
39 string text = Model.Item.GetString("Text");
40 string iconSize = Model.Item.GetRawValueString("IconSize", "2");
41
42 string imageSrc = Model.Item.GetFile("Icon")?.Path ?? string.Empty;
43 string imagePath = imageSrc != string.Empty ? imageSrc : Model.Item.GetRawValueString("UploadIcon", string.Empty);
44 imagePath = Path.GetExtension(imagePath).ToLower() != ".svg" ? "/Admin/Public/GetImage.ashx?image=" + imagePath + "&height=" + iconSize + "&width=" + iconSize + "&Crop=0&format=webp" : imagePath;
45
46 string iconColor = Model.Item.GetString("IconColor", "text-inherit");
47 string iconOpacity = Model.Item.GetString("IconOpacity", "opacity-100");
48
49 HashSet<string> filters = new HashSet<string>();
50 HashSet<string> filtersYears = new HashSet<string>();
51
52 List<string> tableHeaders = new List<string>
53 {
54 Translate("Reports.TableHeader.Title", "Title"),
55 Translate("Reports.TableHeader.Report type", "Report type"),
56 Translate("Reports.TableHeader.ReleaseDate", "Release date"),
57 Translate("Reports.TableHeader.Download", "Download")
58 };
59 WriteLiteral("\r\n<div");
60 BeginWriteAttribute("class", " class=\"", 2228, "\"", 2315, 5);
61 WriteAttributeValue("", 2236, "custom-reports", 2236, 14, true);
62 WriteAttributeValue(" ", 2250, theme, 2251, 8, false);
63 WriteAttributeValue(" ", 2259, contentPadding, 2260, 17, false);
64 WriteAttributeValue(" ", 2277, "item_", 2278, 6, true);
65 WriteAttributeValue("", 2283, Model.Item.SystemName.ToLower(), 2283, 32, false);
66 EndWriteAttribute();
67 WriteLiteral(">\r\n\t<div class=\"custom-reports__wrapper d-flex flex-column\">\r\n\t\t<div class=\"custom-reports__text-container mb-4 order-1\">\r\n");
68 if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle"))
69 {
70 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h2");
71 string headingLevel = Model.Item.GetString("HeadingLevel", "h2");
72 string headingLevelStart = $"<{headingLevel} class=\"{titleFontSize} mb-4\">";
73 string headingLevelStop = $"</{headingLevel}>";
74
75 Write(headingLevelStart);
76 Write(Model.Item.GetString("Title"));
77 Write(headingLevelStop);
78
79 }
80 WriteLiteral("\r\n");
81 if (!string.IsNullOrEmpty(text))
82 {
83 Write(text);
84
85 }
86 WriteLiteral("\t\t</div>\r\n\r\n\t\t<div class=\"custom-reports__tables d-flex w-100 flex-column order-3\">\r\n");
87 if (reportItemsExist && groupReports.Any())
88 {
89 foreach (var group in groupReports)
90 {
91 Write(RenderTableStart(tableHeaders, group.FiscalYear, group.Reports.Count()));
92
93
94 foreach (var report in group.Reports)
95 {
96 string reportType = report.GetString("Type");
97 string reportTitle = report.GetString("Title");
98 DateTime reportReleaseDate = report.GetDateTime("ReleaseDate");
99 int reportReleaseDateYear = reportReleaseDate.Year;
100 string formattedDate = reportReleaseDate != DateTime.MinValue ? reportReleaseDate.ToString("dd MMMM yyyy", CultureInfo.InvariantCulture) : "";
101
102 DateTime reportFiscalYear = report.GetDateTime("FiscalYear");
103 string reportFiscalYearString = reportFiscalYear.Year.ToString();
104
105 string reportFilePath = report.GetFile("File")?.Path ?? string.Empty;
106
107 filters.Add(reportType);
108 filtersYears.Add(group.FiscalYear.ToString());
109
110 WriteLiteral("\t\t\t\t\t\t<tr class=\"js-report-row js-desktop-row desktop-row\" data-filter-type=\"report-type\" data-filter-value=\"");
111 Write(HtmlEncoder.HtmlAttributeEncode(reportType));
112 WriteLiteral("\" data-fiscal-year=\"");
113 Write(HtmlEncoder.HtmlAttributeEncode(reportFiscalYearString));
114 WriteLiteral("\">\r\n\t\t\t\t\t\t\t<td class=\"py-3 title-cell\">");
115 Write(reportTitle);
116 WriteLiteral("</td>\r\n\t\t\t\t\t\t\t<td class=\"py-3 report-type-cell\">");
117 Write(reportType);
118 WriteLiteral("</td>\r\n\t\t\t\t\t\t\t<td class=\"py-3 date-cell\">\r\n\t\t\t\t\t\t\t\t<time");
119 BeginWriteAttribute("datetime", " datetime=\"", 4450, "\"", 4502, 1);
120 WriteAttributeValue("", 4461, reportReleaseDate.ToString("yyyy-MM-dd"), 4461, 41, false);
121 EndWriteAttribute();
122 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t");
123 Write(formattedDate);
124 WriteLiteral("\r\n\t\t\t\t\t\t\t\t</time>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"py-3 download-cell\">\r\n");
125 if (!string.IsNullOrEmpty(reportFilePath))
126 {
127 WriteLiteral("\t\t\t\t\t\t\t\t\t<a");
128 BeginWriteAttribute("href", " href=\"", 4677, "\"", 4732, 1);
129 WriteAttributeValue("", 4684, HtmlEncoder.HtmlAttributeEncode(reportFilePath), 4684, 48, false);
130 EndWriteAttribute();
131 WriteLiteral(" target=\"_blank\">\r\n");
132 if (Path.GetExtension(imagePath).ToLower() == ".svg")
133 {
134 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t<div");
135 BeginWriteAttribute("class", " class=\"", 4846, "\"", 4887, 3);
136 WriteAttributeValue("", 4854, "icon-auto", 4854, 9, true);
137 WriteAttributeValue(" ", 4863, iconColor, 4864, 10, false);
138 WriteAttributeValue(" ", 4874, iconOpacity, 4875, 12, false);
139 EndWriteAttribute();
140 BeginWriteAttribute("style", " style=\"", 4888, "\"", 4940, 6);
141 WriteAttributeValue("", 4896, "height:", 4896, 7, true);
142 WriteAttributeValue(" ", 4903, iconSize, 4904, 11, false);
143 WriteAttributeValue("", 4915, "px;", 4915, 3, true);
144 WriteAttributeValue(" ", 4918, "width:", 4919, 7, true);
145 WriteAttributeValue(" ", 4925, iconSize, 4926, 11, false);
146 WriteAttributeValue("", 4937, "px;", 4937, 3, true);
147 EndWriteAttribute();
148 WriteLiteral(">");
149 Write(ReadFile(imagePath));
150 WriteLiteral("</div>\r\n");
151 }
152 else
153 {
154 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\"");
155 BeginWriteAttribute("src", " src=\"", 5042, "\"", 5091, 1);
156 WriteAttributeValue("", 5048, HtmlEncoder.HtmlAttributeEncode(imagePath), 5048, 43, false);
157 EndWriteAttribute();
158 BeginWriteAttribute("style", " style=\"", 5092, "\"", 5144, 6);
159 WriteAttributeValue("", 5100, "height:", 5100, 7, true);
160 WriteAttributeValue(" ", 5107, iconSize, 5108, 11, false);
161 WriteAttributeValue("", 5119, "px;", 5119, 3, true);
162 WriteAttributeValue(" ", 5122, "width:", 5123, 7, true);
163 WriteAttributeValue(" ", 5129, iconSize, 5130, 11, false);
164 WriteAttributeValue("", 5141, "px;", 5141, 3, true);
165 EndWriteAttribute();
166 WriteLiteral(">\r\n");
167 }
168 WriteLiteral("\t\t\t\t\t\t\t\t\t</a>\r\n");
169 }
170 WriteLiteral("\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n");
171 WriteLiteral("\t\t\t\t\t\t<tr class=\"js-report-row js-mobile-row mobile-row\" data-filter-type=\"report-type\" data-filter-value=\"");
172 Write(HtmlEncoder.HtmlAttributeEncode(reportType));
173 WriteLiteral("\" data-fiscal-year=\"");
174 Write(HtmlEncoder.HtmlAttributeEncode(reportFiscalYearString));
175 WriteLiteral("\">\r\n\t\t\t\t\t\t\t<td class=\"py-3\">\r\n\t\t\t\t\t\t\t\t<div class=\"report-row-nested-row pb-1\">\r\n\t\t\t\t\t\t\t\t\t<time class=\"report-row-nested-row pb-2\"");
176 BeginWriteAttribute("datetime", " datetime=\"", 5627, "\"", 5679, 1);
177 WriteAttributeValue("", 5638, reportReleaseDate.ToString("yyyy-MM-dd"), 5638, 41, false);
178 EndWriteAttribute();
179 WriteLiteral(">\r\n\t\t\t\t\t\t\t\t\t\t");
180 Write(formattedDate);
181 WriteLiteral("\r\n\t\t\t\t\t\t\t\t\t</time>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class=\"report-row-nested-row pb-1\">");
182 Write(reportTitle);
183 WriteLiteral("</div>\r\n\t\t\t\t\t\t\t\t<div class=\"report-row-nested-row pb-1\">");
184 Write(reportType);
185 WriteLiteral("</div>\r\n\t\t\t\t\t\t\t\t<div class=\"report-row-nested-row pb-1\">\r\n");
186 if (!string.IsNullOrEmpty(reportFilePath))
187 {
188 WriteLiteral("\t\t\t\t\t\t\t\t\t\t<a");
189 BeginWriteAttribute("href", " href=\"", 6006, "\"", 6061, 1);
190 WriteAttributeValue("", 6013, HtmlEncoder.HtmlAttributeEncode(reportFilePath), 6013, 48, false);
191 EndWriteAttribute();
192 WriteLiteral(" target=\"_blank\">\r\n");
193 if (Path.GetExtension(imagePath).ToLower() == ".svg")
194 {
195 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\t<div");
196 BeginWriteAttribute("class", " class=\"", 6178, "\"", 6219, 3);
197 WriteAttributeValue("", 6186, "icon-auto", 6186, 9, true);
198 WriteAttributeValue(" ", 6195, iconColor, 6196, 10, false);
199 WriteAttributeValue(" ", 6206, iconOpacity, 6207, 12, false);
200 EndWriteAttribute();
201 BeginWriteAttribute("style", " style=\"", 6220, "\"", 6272, 6);
202 WriteAttributeValue("", 6228, "height:", 6228, 7, true);
203 WriteAttributeValue(" ", 6235, iconSize, 6236, 11, false);
204 WriteAttributeValue("", 6247, "px;", 6247, 3, true);
205 WriteAttributeValue(" ", 6250, "width:", 6251, 7, true);
206 WriteAttributeValue(" ", 6257, iconSize, 6258, 11, false);
207 WriteAttributeValue("", 6269, "px;", 6269, 3, true);
208 EndWriteAttribute();
209 WriteLiteral(">");
210 Write(ReadFile(imagePath));
211 WriteLiteral("</div>\r\n");
212 }
213 else
214 {
215 WriteLiteral("\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\"");
216 BeginWriteAttribute("src", " src=\"", 6378, "\"", 6427, 1);
217 WriteAttributeValue("", 6384, HtmlEncoder.HtmlAttributeEncode(imagePath), 6384, 43, false);
218 EndWriteAttribute();
219 BeginWriteAttribute("style", " style=\"", 6428, "\"", 6480, 6);
220 WriteAttributeValue("", 6436, "height:", 6436, 7, true);
221 WriteAttributeValue(" ", 6443, iconSize, 6444, 11, false);
222 WriteAttributeValue("", 6455, "px;", 6455, 3, true);
223 WriteAttributeValue(" ", 6458, "width:", 6459, 7, true);
224 WriteAttributeValue(" ", 6465, iconSize, 6466, 11, false);
225 WriteAttributeValue("", 6477, "px;", 6477, 3, true);
226 EndWriteAttribute();
227 WriteLiteral(">\r\n");
228 }
229 WriteLiteral("\t\t\t\t\t\t\t\t\t\t</a>\r\n");
230 }
231 WriteLiteral("\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n");
232 }
233
234 Write(RenderTableEnd());
235
236 }
237 }
238 WriteLiteral("\t\t</div>\r\n\r\n");
239
240 // Report-type filters are ordered to match the option order defined in
241 // ItemType_Swift_Custom_Report_Item.xml ("Type" field). Keep this list in
242 // sync with that item type. Types not listed here fall back to the end.
243 List<string> reportTypeOrder = new List<string> { "Corporate Governance", "Sustainability", "Financial" };
244
245 List<string> orderedFilters = filters
246 .OrderBy(f =>
247 {
248 int index = reportTypeOrder.IndexOf(f);
249 return index == -1 ? int.MaxValue : index;
250 })
251 .ToList();
252
253 // Filters are rendered last but has flex-order: -1 to appear above tables
254 List<string> filtersToRender = orderedFilters.Concat(filtersYears).Distinct().ToList();
255
256 if (filtersToRender != null && filters.Any())
257 {
258 Write(RenderFilters(filtersToRender));
259
260 }
261 WriteLiteral("\t</div>\r\n</div>\r\n\r\n");
262 }
263 #pragma warning restore 1998
264
265
266 void RenderTableHeaders(List<string> tableHeaders)
267 {
268 if (tableHeaders != null && tableHeaders.Any())
269 {
270 foreach (string header in tableHeaders)
271 {
272 WriteLiteral("\t\t\t <th class=\"py-2\">");
273 Write(header);
274 WriteLiteral("</th>\r\n");
275 }
276 }
277 }
278
279 void RenderTableStart(List<string> tableHeaders, int year, int rowAmount)
280 {
281 string tableStartMarkup = $"<div class='mb-5 js-report-table report-table-wrapper' data-filter-type='year' data-filter-value='{year.ToString()}' data-fiscal-year='{year.ToString()}' data-row-amount='{rowAmount}'>" +
282 $"<h2 class='h2 mb-2 pb-2 pb-md-0'>{year.ToString()}</h2>" +
283 $"<table class='w-100'><thead><tr>" +
284 $"{@RenderTableHeaders(tableHeaders)}" +
285 "</tr></thead><tbody>";
286
287 Write(tableStartMarkup);
288
289 }
290
291 void RenderTableEnd()
292 {
293 string tableEndMarkup = "</tbody></table></div>";
294 Write(tableEndMarkup);
295
296 }
297
298 void RenderFilters(List<string> filters)
299 {
300 WriteLiteral("\t <div class=\"custom-reports__filters mb-5 order-2 d-flex flex-wrap gap-2\">\r\n\t\t <button type=\"button\" class=\"report-filter-button js-report-filter-button js-all-filter-button btn btn-primary active\" data-filter-value=\"all\">\r\n\t\t\t ");
301 Write(Translate("Reports.Filter.Button.All", "All"));
302 WriteLiteral("\r\n\t\t </button>\r\n\r\n");
303 foreach (string filter in filters)
304 {
305 bool isYearFilter = DateTime.TryParseExact(filter, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
306
307 WriteLiteral("\t\t\t <button type=\"button\"\r\n\t\t\t\t\t class=\"report-filter-button btn btn-primary js-report-filter-button\"\r\n\t\t\t\t\t data-filter-type=\"");
308 Write(isYearFilter ? "year" : "report-type");
309 WriteLiteral("\"\r\n\t\t\t\t\t data-filter-value=\"");
310 Write(HtmlEncoder.HtmlAttributeEncode(filter));
311 WriteLiteral("\">\r\n\t\t\t\t ");
312 Write(filter);
313 WriteLiteral("\r\n\t\t\t </button>\r\n");
314 }
315 WriteLiteral("\t </div>\r\n");
316 }
317 }
318 }
319 #pragma warning restore 1591
320
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel>
2 @using System.Globalization;
3 @using System.IO;
4 @using Dynamicweb.Core.Encoders;
5
6 @{
7 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : "";
8 string contentPadding = Model.Item.GetRawValueString("ContentPadding", "none");
9 contentPadding = contentPadding == "none" ? "p-0" : contentPadding;
10 contentPadding = contentPadding == "small" ? "p-3 p-md-3" : contentPadding;
11 contentPadding = contentPadding == "large" ? "p-5 p-md-5" : contentPadding;
12
13 var reportItems = Model.Item?.GetItems("Reports") ?? Enumerable.Empty<Dynamicweb.Frontend.ItemViewModel>().ToList();
14 var groupReports = reportItems
15 .GroupBy(r => r.GetDateTime("FiscalYear").Year)
16 .OrderByDescending(g => g.Key)
17 .Select(g => new
18 {
19 FiscalYear = g.Key,
20 Reports = g.OrderByDescending(r => r.GetDateTime("ReleaseDate")).ToList()
21 })
22 .ToList();
23
24 bool reportItemsExist = reportItems != null && reportItems.Any();
25 string title = Model.Item.GetString("Title");
26 string text = Model.Item.GetString("Text");
27 string iconSize = Model.Item.GetRawValueString("IconSize", "2");
28
29 string imageSrc = Model.Item.GetFile("Icon")?.Path ?? string.Empty;
30 string imagePath = imageSrc != string.Empty ? imageSrc : Model.Item.GetRawValueString("UploadIcon", string.Empty);
31 imagePath = Path.GetExtension(imagePath).ToLower() != ".svg" ? "/Admin/Public/GetImage.ashx?image=" + imagePath + "&height=" + iconSize + "&width=" + iconSize + "&Crop=0&format=webp" : imagePath;
32
33 string iconColor = Model.Item.GetString("IconColor", "text-inherit");
34 string iconOpacity = Model.Item.GetString("IconOpacity", "opacity-100");
35
36 HashSet<string> filters = new HashSet<string>();
37 HashSet<string> filtersYears = new HashSet<string>();
38
39 List<string> tableHeaders = new List<string>
40 {
41 Translate("Reports.TableHeader.Title", "Title"),
42 Translate("Reports.TableHeader.Report type", "Report type"),
43 Translate("Reports.TableHeader.ReleaseDate", "Release date"),
44 Translate("Reports.TableHeader.Download", "Download")
45 };
46 }
47
48 <div class="custom-reports @(theme) @(contentPadding) item_@Model.Item.SystemName.ToLower()">
49 <div class="custom-reports__wrapper d-flex flex-column">
50 <div class="custom-reports__text-container mb-4 order-1">
51 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle"))
52 {
53 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h2");
54 string headingLevel = Model.Item.GetString("HeadingLevel", "h2");
55 string headingLevelStart = $"<{headingLevel} class=\"{titleFontSize} mb-4\">";
56 string headingLevelStop = $"</{headingLevel}>";
57
58 @headingLevelStart
59 @Model.Item.GetString("Title")
60 @headingLevelStop
61 }
62
63 @if (!string.IsNullOrEmpty(text))
64 {
65 @text
66 }
67 </div>
68
69 <div class="custom-reports__tables d-flex w-100 flex-column order-3">
70 @if (reportItemsExist && groupReports.Any())
71 {
72 foreach (var group in groupReports)
73 {
74 @RenderTableStart(tableHeaders, group.FiscalYear, group.Reports.Count())
75
76 foreach (var report in group.Reports)
77 {
78 string reportType = report.GetString("Type");
79 string reportTitle = report.GetString("Title");
80 DateTime reportReleaseDate = report.GetDateTime("ReleaseDate");
81 int reportReleaseDateYear = reportReleaseDate.Year;
82 string formattedDate = reportReleaseDate != DateTime.MinValue ? reportReleaseDate.ToString("dd MMMM yyyy", CultureInfo.InvariantCulture) : "";
83
84 DateTime reportFiscalYear = report.GetDateTime("FiscalYear");
85 string reportFiscalYearString = reportFiscalYear.Year.ToString();
86
87 string reportFilePath = report.GetFile("File")?.Path ?? string.Empty;
88
89 filters.Add(reportType);
90 filtersYears.Add(group.FiscalYear.ToString());
91
92 @*
93 DESKTOP LAYOUT
94 *@
95 <tr class="js-report-row js-desktop-row desktop-row" data-filter-type="report-type" data-filter-value="@HtmlEncoder.HtmlAttributeEncode(reportType)" data-fiscal-year="@HtmlEncoder.HtmlAttributeEncode(reportFiscalYearString)">
96 <td class="py-3 title-cell">@reportTitle</td>
97 <td class="py-3 report-type-cell">@reportType</td>
98 <td class="py-3 date-cell">
99 <time datetime="@reportReleaseDate.ToString("yyyy-MM-dd")">
100 @formattedDate
101 </time>
102 </td>
103 <td class="py-3 download-cell">
104 @if (!string.IsNullOrEmpty(reportFilePath))
105 {
106 <a href="@HtmlEncoder.HtmlAttributeEncode(reportFilePath)" target="_blank">
107 @if (Path.GetExtension(imagePath).ToLower() == ".svg")
108 {
109 <div class="icon-auto @iconColor @iconOpacity" style="height: @(iconSize)px; width: @(iconSize)px;">@ReadFile(imagePath)</div>
110 }
111 else
112 {
113 <img loading="lazy" src="@HtmlEncoder.HtmlAttributeEncode(imagePath)" style="height: @(iconSize)px; width: @(iconSize)px;">
114 }
115 </a>
116 }
117 </td>
118 </tr>
119
120 @*
121 MOBILE/SMALL TABLET LAYOUT
122 *@
123 <tr class="js-report-row js-mobile-row mobile-row" data-filter-type="report-type" data-filter-value="@HtmlEncoder.HtmlAttributeEncode(reportType)" data-fiscal-year="@HtmlEncoder.HtmlAttributeEncode(reportFiscalYearString)">
124 <td class="py-3">
125 <div class="report-row-nested-row pb-1">
126 <time class="report-row-nested-row pb-2" datetime="@reportReleaseDate.ToString("yyyy-MM-dd")">
127 @formattedDate
128 </time>
129 </div>
130 <div class="report-row-nested-row pb-1">@reportTitle</div>
131 <div class="report-row-nested-row pb-1">@reportType</div>
132 <div class="report-row-nested-row pb-1">
133 @if (!string.IsNullOrEmpty(reportFilePath))
134 {
135 <a href="@HtmlEncoder.HtmlAttributeEncode(reportFilePath)" target="_blank">
136 @if (Path.GetExtension(imagePath).ToLower() == ".svg")
137 {
138 <div class="icon-auto @iconColor @iconOpacity" style="height: @(iconSize)px; width: @(iconSize)px;">@ReadFile(imagePath)</div>
139 }
140 else
141 {
142 <img loading="lazy" src="@HtmlEncoder.HtmlAttributeEncode(imagePath)" style="height: @(iconSize)px; width: @(iconSize)px;">
143 }
144 </a>
145 }
146 </div>
147 </td>
148 </tr>
149 }
150
151 @RenderTableEnd()
152 }
153 }
154 </div>
155
156 @{
157 // Report-type filters are ordered to match the option order defined in
158 // ItemType_Swift_Custom_Report_Item.xml ("Type" field). Keep this list in
159 // sync with that item type. Types not listed here fall back to the end.
160 List<string> reportTypeOrder = new List<string> { "Corporate Governance", "Sustainability", "Financial" };
161
162 List<string> orderedFilters = filters
163 .OrderBy(f =>
164 {
165 int index = reportTypeOrder.IndexOf(f);
166 return index == -1 ? int.MaxValue : index;
167 })
168 .ToList();
169
170 // Filters are rendered last but has flex-order: -1 to appear above tables
171 List<string> filtersToRender = orderedFilters.Concat(filtersYears).Distinct().ToList();
172
173 if (filtersToRender != null && filters.Any())
174 {
175 @RenderFilters(filtersToRender)
176 }
177 }
178 </div>
179 </div>
180
181 @functions {
182
183 void RenderTableHeaders(List<string> tableHeaders)
184 {
185 if (tableHeaders != null && tableHeaders.Any())
186 {
187 foreach (string header in tableHeaders)
188 {
189 <th class="py-2">@header</th>
190 }
191 }
192 }
193
194 void RenderTableStart(List<string> tableHeaders, int year, int rowAmount)
195 {
196 string tableStartMarkup = $"<div class='mb-5 js-report-table report-table-wrapper' data-filter-type='year' data-filter-value='{year.ToString()}' data-fiscal-year='{year.ToString()}' data-row-amount='{rowAmount}'>" +
197 $"<h2 class='h2 mb-2 pb-2 pb-md-0'>{year.ToString()}</h2>" +
198 $"<table class='w-100'><thead><tr>" +
199 $"{@RenderTableHeaders(tableHeaders)}" +
200 "</tr></thead><tbody>";
201
202 @tableStartMarkup
203 }
204
205 void RenderTableEnd()
206 {
207 string tableEndMarkup = "</tbody></table></div>";
208 @tableEndMarkup
209 }
210
211 void RenderFilters(List<string> filters)
212 {
213 <div class="custom-reports__filters mb-5 order-2 d-flex flex-wrap gap-2">
214 <button type="button" class="report-filter-button js-report-filter-button js-all-filter-button btn btn-primary active" data-filter-value="all">
215 @Translate("Reports.Filter.Button.All", "All")
216 </button>
217
218 @foreach (string filter in filters)
219 {
220 bool isYearFilter = DateTime.TryParseExact(filter, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
221
222 <button type="button"
223 class="report-filter-button btn btn-primary js-report-filter-button"
224 data-filter-type="@(isYearFilter ? "year" : "report-type")"
225 data-filter-value="@HtmlEncoder.HtmlAttributeEncode(filter)">
226 @filter
227 </button>
228 }
229 </div>
230 }
231 }
232