How Reports are Displayed

From truxwiki.com
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

  1. Entry Point
  2. Navigation and Routing
  3. Databinding
  4. Dependency Injection
  5. Task Bar Icon
  6. Truxton CLI options
  7. How Reports are Displayed
  8. How Dialog Forms Work
  9. Forms with Images
  10. Images
  11. Bookmarks

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);
       }
   }