How Reports are Displayed
Jump to navigation
Jump to search
This page documents how the Reports in Truxton are displayed, or how the View of the report is created.
UI Guide Menu
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);
}
}
|