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