This page documents how the Reports in Truxton are displayed, or how the View of the report is created.
-
- Entry Point
- Navigation and Routing
- Databinding
- Dependency Injection
- Task Bar Icon
- Truxton CLI options
- How Reports are Displayed
Overview
- Most of the UI app is in C# and WPF. Typically, when you load a page, a View is made and rendered on screen using C# and WPF magic. This is not the case for Reports. The report is generated using HTML. Eventually, that HTML-report is loaded into an existing view.
- I assume this is the case for multi-platform report generation as well as ease of printing. I'll update this as it's discovered.
Main Files
| File
|
Summary
|
Path
|
| ReportSection.xaml
|
This view has a WebBrowser element that displays the HTML. It's loaded using the Binding HTMLReport.Stream
|
\Truxton\Client\TruxtonClient\TruxtonClient\Templates\ReportSection.xaml
|
| ReportSectionViewModel.cs
|
This is the ViewModel for the ReportSection
|
\Truxton\Client\TruxtonClient\TruxtonClient\ViewModels\Reports\ReportSectionViewModel.cs
|
| HTMLReportViewModel.cs
|
This is where the report-generating functions are called in loadReportContent
|
\Truxton\Client\TruxtonClient\TruxtonClient\ViewModels\Reports\HTMLReportViewModel.cs
|
HTMLReportViewModel.cs
- In the loadReportContent function,
- the relevant reportFactory is selected.
| loadReportContent
|
var reportFactory = _ctx.ReportService.GetReportFactory(req.ReporterID);
|
- Then, the report is generated resulting in a ITruxtonReport.
| loadReportContent
|
var report = await reportFactory.GenerateAsync(req.ReportConfig, req.CTS.Token);
|
- Next, the reportContent(HTML) is generated resulting in a string that contains the HTML.
| loadReportContent
|
string reportContent = await report.GetReportContentAsync(req.CTS.Token);
|
- Eventually, the string is converted into a stream then assigned so that it's available for dataBinding.
| loadReportContent
|
Stream = req.Stream;
|
- For quick reference, the databinding can be found in ReportSection.xaml.
| ReportSection.xaml
|
<controls:WebBrowser x:Name="WebBrowser" Stream="{Binding HTMLReport.Stream}" />
|
- Here's the full snippet of loadReportConent with the relevant code..
| loadReportContent
|
var reportFactory = _ctx.ReportService.GetReportFactory(req.ReporterID);
if (reportFactory != null)
{
var report = await reportFactory.GenerateAsync(req.ReportConfig, req.CTS.Token);
report.ReportFormatter = ReportFormatter;
string reportContent = await report.GetReportContentAsync(req.CTS.Token);
if (!req.CTS.Token.IsCancellationRequested)
{
var bytes = Encoding.UTF8.GetBytes(reportContent);
req.Stream = new CancellableStream(bytes);
Stream = req.Stream;
string message = getActionMessage(req, reportFactory.Name);
await _ctx.InvestigationContext.AddActionAsync(message, CancellationToken.None);
}
}
|