feat(FN-3974): document reports view in dashboard guide

Added documentation for the dashboard's reports view to the dashboard guide, including a corresponding test assertion.

Fusion-Task-Id: FN-3974
This commit is contained in:
Fusion
2026-05-10 23:09:34 -07:00
committed by gsxdsm
parent 884cd5283c
commit e151cf2c55
3 changed files with 31 additions and 9 deletions

View File

@@ -198,6 +198,24 @@ Features:
![Documents view](./screenshots/documents-view.png)
## Reports View
Reports View is available when the **Reports** plugin is installed and enabled.
Navigation:
- Desktop: **Header → More views → Reports**
- Mobile: **More** sheet → **Reports**
Features:
- Reports history list with filters for cadence, status, date range, title text, and agent
- Detail viewer with a sandboxed iframe preview backed by the report HTML preview endpoint
- Section quick-jump sidebar based on stable report section markers
- Compare drawer for side-by-side report comparisons with section-level diff groupings
- Standalone HTML download/export action for sharing a self-contained report file
For plugin internals (registration, API routes, rendering/export pipeline), see [Reports plugin docs](./plugins/reports.md).
### Markdown Rendering
Documents view supports toggling between raw text and formatted markdown when viewing document content:

View File

@@ -22,6 +22,7 @@ describe("dashboard guide coverage for lazy-loaded views", () => {
"Agents View",
"Roadmaps View",
"Insights View",
"Reports View",
"Plugin Manager",
"Pi Extensions Manager",
] as const;

View File

@@ -157,22 +157,25 @@ export class RoadmapStore extends EventEmitter<RoadmapStoreEvents> {
// ── ID Generators ───────────────────────────────────────────────────
private generateRoadmapId(): string {
const timestamp = Date.now();
private idSequence = 0;
private generateId(prefix: "RM" | "RMS" | "RF"): string {
const timestamp = Date.now().toString(36).toUpperCase();
const sequence = (this.idSequence++).toString(36).toUpperCase().padStart(4, "0");
const random = Math.random().toString(36).substring(2, 6).toUpperCase();
return `RM-${timestamp.toString(36).toUpperCase()}-${random}`;
return `${prefix}-${timestamp}-${sequence}-${random}`;
}
private generateRoadmapId(): string {
return this.generateId("RM");
}
private generateMilestoneId(): string {
const timestamp = Date.now();
const random = Math.random().toString(36).substring(2, 6).toUpperCase();
return `RMS-${timestamp.toString(36).toUpperCase()}-${random}`;
return this.generateId("RMS");
}
private generateFeatureId(): string {
const timestamp = Date.now();
const random = Math.random().toString(36).substring(2, 6).toUpperCase();
return `RF-${timestamp.toString(36).toUpperCase()}-${random}`;
return this.generateId("RF");
}
// ── Row-to-Object Converters ───────────────────────────────────────