Skip to content

Commit 13eb3ea

Browse files
feature(REPORT-478182): Bold Reports 12.1 Release Changes
1 parent 250d9ae commit 13eb3ea

File tree

176 files changed

+11040
-313
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+11040
-313
lines changed

Controllers/ExternalReportServer.cs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,109 @@ public override List<CatalogItem> GetItems(string folderName, ItemTypeEnum type,
9494
_items.Add(catalogItem);
9595
}
9696
}
97+
else if (type == ItemTypeEnum.File)
98+
{
99+
var dataSourceProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(Path.Combine(targetFolder, "Files"));
100+
foreach (var file in dataSourceProvider.GetDirectoryContents("").Where(f => !f.IsDirectory))
101+
{
102+
CatalogItem catalogItem = new CatalogItem();
103+
catalogItem.Name = Path.GetFileNameWithoutExtension(file.Name);
104+
catalogItem.Type = ItemTypeEnum.File;
105+
catalogItem.Id = Regex.Replace(catalogItem.Name, @"[^0-9a-zA-Z]+", "_");
106+
catalogItem.Extension = Path.GetExtension(file.Name);
107+
_items.Add(catalogItem);
108+
}
109+
}
97110

98111
return _items;
99112
}
100113

114+
public override BoldReports.RDL.DOM.Server.ItemDefinition GetItemDefinition(string itemName)
115+
{
116+
try
117+
{
118+
if (string.IsNullOrWhiteSpace(Path.GetFileNameWithoutExtension(itemName)))
119+
return null;
120+
121+
BoldReports.RDL.DOM.Server.ItemDefinition itemDefinition = new BoldReports.RDL.DOM.Server.ItemDefinition();
122+
itemDefinition.FileContent = this.GetFileContent(itemName);
123+
itemDefinition.FilePassword = this.GetFilePassword(itemName);
124+
itemDefinition.Extension = Path.GetExtension(itemName);
125+
126+
return itemDefinition;
127+
}
128+
catch (Exception ex)
129+
{
130+
throw new InvalidOperationException($"Unable to load the report resource '{itemName}'. Please check the resource name and ensure the file exists", ex);
131+
}
132+
133+
return null;
134+
}
135+
136+
private string GetFilePassword(string itemName)
137+
{
138+
if (itemName.EndsWith(".pfx", StringComparison.OrdinalIgnoreCase))
139+
{
140+
string passwordFile = Path.Combine(this.basePath, "resources", "Files", "CertificateCredentials.xml");
141+
142+
if (File.Exists(passwordFile))
143+
{
144+
XmlDocument xml = new XmlDocument();
145+
xml.Load(passwordFile);
146+
147+
foreach (XmlNode certNode in xml.SelectNodes("//CertificateCredentials/Certificate"))
148+
{
149+
if (certNode == null)
150+
continue;
151+
152+
string name = certNode.SelectSingleNode("name")?.InnerText?.Trim() ?? string.Empty;
153+
string password = certNode.SelectSingleNode("password")?.InnerText?.Trim();
154+
155+
if (!name.Equals(Path.GetFileNameWithoutExtension(itemName), StringComparison.OrdinalIgnoreCase))
156+
continue;
157+
if (!string.IsNullOrEmpty(password))
158+
{
159+
return password;
160+
}
161+
162+
break;
163+
}
164+
}
165+
}
166+
167+
return null;
168+
}
169+
170+
private byte[] GetFileContent(string itemName)
171+
{
172+
string imagePath = Path.Combine(this.basePath, "resources", itemName);
173+
string[] fileExtensions = { ".pfx", ".pdf", ".html" };
174+
175+
if (fileExtensions.Any(extension => itemName.EndsWith(extension, StringComparison.OrdinalIgnoreCase)))
176+
{
177+
imagePath = Path.Combine(this.basePath, "resources", "Files", itemName);
178+
}
179+
if (File.Exists(imagePath))
180+
{
181+
using (Stream stream = this.ReadFiles(imagePath))
182+
{
183+
if (stream == null)
184+
return null;
185+
186+
using (MemoryStream memoryStream = new MemoryStream())
187+
{
188+
stream.CopyTo(memoryStream);
189+
if (memoryStream.Length == 0)
190+
return null;
191+
192+
return memoryStream.ToArray();
193+
}
194+
}
195+
}
196+
197+
return null;
198+
}
199+
101200
public override bool CreateReport(string reportName, string folderName, byte[] reportdata, out string exception)
102201
{
103202
return base.CreateReport(reportName, folderName, reportdata, out exception);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Microsoft.AspNetCore.Mvc;
6+
7+
namespace ReportsCoreSamples.Controllers
8+
{
9+
[Route("report-viewer/hr-payroll")]
10+
public class HrPayrollController : PreviewController
11+
{
12+
[HttpGet("")]
13+
public IActionResult Index()
14+
{
15+
this.updateMetaData();
16+
return View();
17+
}
18+
}
19+
}
-35.8 KB
Binary file not shown.
35.8 KB
Binary file not shown.

ReportsCoreSamples.csproj

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,21 @@
1919
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.12.0" />
2020
</ItemGroup>
2121
<ItemGroup>
22-
<PackageReference Include="Bold.Licensing" Version="11.1.10" />
23-
<PackageReference Include="BoldReports.AspNet.Core" Version="11.1.10" />
24-
<PackageReference Include="BoldReports.CRI.Barcode" Version="11.1.10" />
25-
<PackageReference Include="BoldReports.CRI.Signature" Version="11.1.10" />
26-
<PackageReference Include="BoldReports.CRI.Shape" Version="11.1.10" />
27-
<PackageReference Include="BoldReports.CRI.Html" Version="11.1.10">
22+
<PackageReference Include="Bold.Licensing" Version="12.1.12" />
23+
<PackageReference Include="BoldReports.AspNet.Core" Version="12.1.12" />
24+
<PackageReference Include="BoldReports.CRI.Barcode" Version="12.1.12" />
25+
<PackageReference Include="BoldReports.CRI.Signature" Version="12.1.12" />
26+
<PackageReference Include="BoldReports.CRI.Shape" Version="12.1.12" />
27+
<PackageReference Include="BoldReports.CRI.Html" Version="12.1.12">
2828
<ExcludeAssets>native</ExcludeAssets>
2929
</PackageReference>
30-
<PackageReference Include="BoldReports.CRI.Pdf" Version="11.1.10" />
31-
<PackageReference Include="BoldReports.Net.Core" Version="11.1.10" />
32-
<PackageReference Include="BoldReports.Data.WebData" Version="11.1.10" />
33-
<PackageReference Include="BoldReports.Data.Csv" Version="11.1.10" />
34-
<PackageReference Include="BoldReports.Data.Excel" Version="11.1.10" />
35-
<PackageReference Include="BoldReports.Data.ElasticSearch" Version="11.1.10" />
36-
<PackageReference Include="BoldReports.Data.SSAS" Version="11.1.10" />
30+
<PackageReference Include="BoldReports.CRI.Pdf" Version="12.1.12" />
31+
<PackageReference Include="BoldReports.Net.Core" Version="12.1.12" />
32+
<PackageReference Include="BoldReports.Data.WebData" Version="12.1.12" />
33+
<PackageReference Include="BoldReports.Data.Csv" Version="12.1.12" />
34+
<PackageReference Include="BoldReports.Data.Excel" Version="12.1.12" />
35+
<PackageReference Include="BoldReports.Data.ElasticSearch" Version="12.1.12" />
36+
<PackageReference Include="BoldReports.Data.SSAS" Version="12.1.12" />
3737
<PackageReference Include="BuildBundlerMinifier" Version="3.2.449" />
3838
<PackageReference Include="log4net" Version="2.0.15" />
3939
<PackageReference Include="PuppeteerSharp" Version="5.0.0" />
@@ -43,12 +43,12 @@
4343
</PackageReference>
4444
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="8.0.0" />
4545
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
46-
<PackageReference Include="BoldReports.Data.MySQL" Version="11.1.10" />
47-
<PackageReference Include="BoldReports.Data.Oracle" Version="11.1.10" />
48-
<PackageReference Include="BoldReports.Data.PostgreSQL" Version="11.1.10" />
49-
<PackageReference Include="BoldReports.Data.Snowflake" Version="11.1.10" />
50-
<PackageReference Include="BoldReports.Data.GoogleBigQuery" Version="11.1.10" />
51-
<PackageReference Include="BoldReports.Data.MongoDB" Version="11.1.10" />
46+
<PackageReference Include="BoldReports.Data.MySQL" Version="12.1.12" />
47+
<PackageReference Include="BoldReports.Data.Oracle" Version="12.1.12" />
48+
<PackageReference Include="BoldReports.Data.PostgreSQL" Version="12.1.12" />
49+
<PackageReference Include="BoldReports.Data.Snowflake" Version="12.1.12" />
50+
<PackageReference Include="BoldReports.Data.GoogleBigQuery" Version="12.1.12" />
51+
<PackageReference Include="BoldReports.Data.MongoDB" Version="12.1.12" />
5252
</ItemGroup>
5353
<ItemGroup>
5454
<None Include="Controllers\**" CopyToOutputDirectory="Always" />

Startup.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Threading.Tasks;
@@ -125,6 +125,22 @@ public void Configure(IApplicationBuilder app)
125125
{
126126
app.UseDeveloperExceptionPage();
127127
}
128+
// Add trailing slash middleware - dynamically skip ALL API routes
129+
app.Use(async (context, next) =>
130+
{
131+
var pathBase = context.Request.PathBase;
132+
var path = context.Request.Path.Value;
133+
string[] reportKeywords = ["report-viewer", "report-designer", "report-writer"];
134+
bool isReportRoute = reportKeywords.Any(keyword => path.Contains(keyword, StringComparison.OrdinalIgnoreCase));
135+
if (isReportRoute && !string.IsNullOrEmpty(path) && path != "/" && !path.EndsWith('/') && !Path.HasExtension(path) && !path.Contains("report-writer/generate", StringComparison.OrdinalIgnoreCase))
136+
{
137+
var query = context.Request.QueryString.Value;
138+
var destination = $"{pathBase}{path}/{query}";
139+
context.Response.Redirect(destination, permanent: true);
140+
return;
141+
}
142+
await next();
143+
});
128144
app.UseMiddleware<CSRFHandler>();
129145
app.UseResponseCompression();
130146
app.UseFileServer();

Views/HrPayroll/Index.cshtml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
@inject Globals globals;
2+
@section control {
3+
<bold-report-viewer id="reportviewer" report-service-url="@Globals.SERVICE_URL" report-path="hr-payroll.rdl" toolbar-rendering="onToolbarRendering" tool-bar-item-click="onToolBarItemClick" export-item-click="onExportItemClick" />
4+
}
5+
@section description {
6+
<div id="description">
7+
<p>
8+
The HR Payroll report provides a comprehensive overview of employee compensation, departmental performance, and leave management. It helps HR teams analyze payroll trends and make informed decisions.
9+
</p>
10+
<ul>
11+
<li>Displays <code>gross salary</code>, <code>net salary</code>, and <code>deductions</code> across departments.</li>
12+
<li>Visualizes <code>Loss of Pay (LOP)</code>breakdown by leave type: sick, good, and compensation leave.</li>
13+
<li>Includes <code>employee demographics</code> such as gender distribution and contract types.</li>
14+
<li>Summarizes leave availability for sick and casual leave by department.</li>
15+
<li>Highlights <code>average performance</code> and employee count per department.</li>
16+
</ul>
17+
<p>
18+
For more information on how dynamic image report items enhance customization in multi-company HR reports, refer to this
19+
<a href="https://help.boldreports.com/enterprise-reporting/designer-guide/report-designer/image-manager/"
20+
target="_blank" rel="noreferrer">documentation</a> section.
21+
</p>
22+
</div>
23+
}

Views/MultiLanguageReport/Index.cshtml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,31 @@
4646
$("#update").on("click", function () {
4747
updateViewer();
4848
});
49+
const tooltipLocales = {
50+
"en-US": { header: "Edit Report", content: "Edit this report in designer" },
51+
"fr-CA": { header: "Modifier le rapport", content: "Modifier ce rapport dans le concepteur" },
52+
"de-DE": { header: "Bericht bearbeiten", content: "Bearbeiten Sie diesen Bericht im Designer" },
53+
"hi-IN": { header: "रिपोर्ट संपादित करें", content: "इस रिपोर्ट को डिज़ाइनर में संपादित करें" },
54+
"es-ES": { header: "Editar informe", content: "Editar este informe en el diseñador" },
55+
"nl-NL": { header: "Rapport bewerken", content: "Bewerk dit rapport in de ontwerper" },
56+
"ko-KR": { header: "보고서 편집", content: "디자이너에서 이 보고서를 편집합니다" },
57+
"he-IL": { header: "ערוך דוח", content: "ערוך דוח זה במעצב" },
58+
"ru-RU": { header: "Редактировать отчет", content: "Редактировать этот отчет в дизайнере" }
59+
};
4960
function updateViewer(){
5061
const reportViewer = $("#reportviewer").boldReportViewer("instance");
5162
const selectedLanguageId = languages.value.toString();
63+
const tooltipData = tooltipLocales[selectedLanguageId];
5264
const selectedLanguage = languagesList.find(lang => lang.languageId === selectedLanguageId);
5365
const parameters = [{ name: 'Language', labels: [selectedLanguage.Name], values: [selectedLanguage.Name] }];
5466
reportViewer.model.parameters = parameters;
5567
reportViewer.reload();
5668
reportViewer.setModel({'locale': selectedLanguageId});
69+
const item = reportViewer.model.toolbarSettings.customGroups[0].items[0];
70+
item.tooltip = {
71+
header: tooltipData.header,
72+
content: tooltipData.content
73+
};
5774
}
5875
</script>
5976
}

Views/RDLC/Index.cshtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
List<BoldReports.Models.ReportDesigner.ReportItemExtensionsModule> extensions = new List<BoldReports.Models.ReportDesigner.ReportItemExtensionsModule>(){
77
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="barcode",ClassName="EJBarcode",ImageClass="customitem-barcode",DisplayName="1D Barcode",Category="Barcodes"},
88
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="matrixbarcode",ClassName="EJQRBarcode",ImageClass="customitem-qrbarcode",DisplayName="2D Barcode",Category="Barcodes"},
9-
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="ESignature",ClassName="EJSignature",ImageClass="customitem-signature",DisplayName="Electronic",Category="Signature"},
9+
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="ESignature",ClassName="EJSignature",ImageClass="customitem-signature",DisplayName="Electronic",Category="Signatures"},
10+
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="PDFSignature",ClassName="EJPDFSignature",ImageClass="customitem-pdfsignature",DisplayName="PDF",Category="Signatures"},
1011
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="Shape",ClassName="EJShape",ImageClass="customitem-shape",DisplayName="Shape",Category="Shapes"},
1112
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="pdfdocument",ClassName="EJPdfDocument",ImageClass="customitem-pdfdocument",DisplayName="PDF",Category="Documents",AllowHeaderFooter=false},
1213
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="htmldocument",ClassName="EJHtmlDocument",ImageClass="customitem-htmldocument",DisplayName="Html",Category="Documents"}

Views/ReportDesigner/Index.cshtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
List<BoldReports.Models.ReportDesigner.ReportItemExtensionsModule> extensions = new List<BoldReports.Models.ReportDesigner.ReportItemExtensionsModule>(){
77
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="barcode",ClassName="EJBarcode",ImageClass="customitem-barcode",DisplayName="1D Barcode",Category="Barcodes"},
88
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="matrixbarcode",ClassName="EJQRBarcode",ImageClass="customitem-qrbarcode",DisplayName="2D Barcode",Category="Barcodes"},
9-
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="ESignature",ClassName="EJSignature",ImageClass="customitem-signature",DisplayName="Electronic",Category="Signature"},
9+
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="ESignature",ClassName="EJSignature",ImageClass="customitem-signature",DisplayName="Electronic",Category="Signatures"},
10+
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="PDFSignature",ClassName="EJPDFSignature",ImageClass="customitem-pdfsignature",DisplayName="PDF",Category="Signatures"},
1011
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="Shape",ClassName="EJShape",ImageClass="customitem-shape",DisplayName="Shape",Category="Shapes"},
1112
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="pdfdocument",ClassName="EJPdfDocument",ImageClass="customitem-pdfdocument",DisplayName="PDF",Category="Documents",AllowHeaderFooter=false},
1213
new BoldReports.Models.ReportDesigner.ReportItemExtensionsModule{Name="htmldocument",ClassName="EJHtmlDocument",ImageClass="customitem-htmldocument",DisplayName="Html",Category="Documents"}

0 commit comments

Comments
 (0)