Skip to content

NOVUS-357 Add in-app Markdown report viewer#8

Open
tolson wants to merge 1 commit intomainfrom
tao-novus-357
Open

NOVUS-357 Add in-app Markdown report viewer#8
tolson wants to merge 1 commit intomainfrom
tao-novus-357

Conversation

@tolson
Copy link
Copy Markdown
Owner

@tolson tolson commented Mar 19, 2026

NOVUS-357 Adds a "View Report" button on the Dashboard that opens a styled preview modal for OKR markdown reports. Users can view a pretty-rendered report with progress bars or export the .md file directly from the modal.

NOVUS-357 Adds a "View Report" button on the Dashboard that opens a
styled preview modal for OKR markdown reports. Users can view a
pretty-rendered report with progress bars or export the .md file
directly from the modal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@lci-novus-dev
Copy link
Copy Markdown

lci-novus-dev bot commented Mar 19, 2026

Novus Diff Analysis

The detectFunnelsJourneys tool hit an internal validation error (existing funnels have stale step data). This doesn't block the core work. Here's a full summary of everything done:


PR Analysis Summary — NOVUS-357: Add in-app Markdown report viewer

Updated

  • Dashboard | Export to Markdown → renamed to Dashboard | Export .md — the button label in the UI changed from "Export to Markdown" to "Export .md". The CSS selector (button:contains("Export .md")) was already correct.

Created

  • Dashboard | View Report (feature) — new button on the Dashboard header that opens the in-app markdown report preview modal. CSS selector: button:contains("View Report"), parented to the Dashboard page.
  • Dashboard | Report Modal | Export (feature) — Export button inside the MarkdownPreviewModal that triggers the markdown download and closes the modal. CSS selector: .rounded-xl button:contains("Export"), parented to the Dashboard page.

No changes needed

  • okr_exported track event — already exists and the pendo.track("okr_exported", {...}) call in the refactored exportToMarkdown() function is unchanged.
  • All pages, metadata, agents — untouched by this PR.

Skipped

  • Launch creation — Linear integration returned a 401; could not look up the NOVUS-357 initiative.
  • Funnel/journey re-scandetectFunnelsJourneys returned an internal validation error on existing funnel step data. The natural new funnel opportunity here would be a View Report → Export conversion funnel, but it wasn't created due to the tool error.

No code gen required

No new pendo.track() calls, metadata fields, or agent instrumentation were introduced by this PR. The new "View Report" interaction is captured purely as a click event (feature artifact).

Artifacts Managed

Type Name Status
feature Dashboard View Report
feature Dashboard Report Modal

View details in Novus

Copy link
Copy Markdown

@lci-novus-dev lci-novus-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Novus UX Review

Three UX concerns: the custom markdown renderer silently drops plain text lines (including the "No objectives" fallback text from generateMarkdown), the UI now has two buttons that trigger the same export action from the same screen which muddies the preview-then-export intent, and the new modal Export button repeats the same no-feedback pattern that Pendo's high-priority signal already flagged as causing dead-click frustration on the original Export button.

);
} else if (line.trim() === '') {
elements.push(<div key={key++} className="h-1" />);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] Plain text lines are silently dropped — the renderer only handles #, ##, ###, -, and empty lines, with no fallback. generateMarkdown() emits "No objectives in this category.\n" for empty sections, which is a plain text line and will disappear entirely in the preview. Users will see a blank gap where that message should appear with no indication content is missing. Add an else clause that renders unrecognized lines as a <p> element.

<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
</svg>
View Report
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] There are now two ways to trigger the exact same export from the same screen — this "Export .md" button and the "Export" button inside the modal. The modal was presumably introduced to let users preview before exporting, but keeping a direct export button alongside it undercuts that intent and creates ambiguity: is "View Report" a prerequisite step, or a parallel path? Consider removing this direct export button so the flow is clear: View Report → Export.

<h2 className="text-xl font-semibold text-gray-900">{title}</h2>
<div className="flex items-center gap-2">
<button
onClick={onExport}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] A high-priority Pendo signal flagged that the existing Export button on the Dashboard has dead-click frustration — "session oFkGVZZwQykbocLM shows the Export button triggers dead click frustration within the first second of the session, suggesting the button may lack immediate visual feedback on click" (Export to Markdown: 11% adoption, 3 events/2 visitors in 30 days). This new modal Export button has the same pattern: clicking it silently triggers a download with no loading state, success toast, or confirmation. The root frustration isn't being addressed — consider adding a brief visual confirmation (e.g., button label briefly changes to "Exported!") to signal the action completed.

@lci-novus-dev
Copy link
Copy Markdown

lci-novus-dev bot commented Mar 19, 2026

Novus Diff Analysis

No Novus-relevant changes detected in this PR.

All done. Here's a summary of everything completed for PR #8:


PR Analysis Summary — NOVUS-357: Add in-app Markdown report viewer

Diff Analysis

This PR adds a MarkdownPreviewModal component and modifies Dashboard.tsx to:

  1. Add a "View Report" button that opens an in-app styled OKR report preview
  2. Add an Export button inside the modal (calls exportToMarkdown() + closes modal)
  3. Rename the original "Export to Markdown" button to "Export .md"

No new pages, track events, metadata fields, or agents were introduced.


Artifact Status

Already existed (verified correct, no changes needed):

Artifact Type Notes
Dashboard | View Report Feature button:contains("View Report") → Dashboard page ✓
Dashboard | Report Modal | Export Feature .rounded-xl button:contains("Export") → Dashboard page ✓
Dashboard | Export .md Feature button:contains("Export .md") → already updated to match renamed button ✓
okr_exported Track Event Still fires from exportToMarkdown() — no changes needed ✓

Created

  • Launch: [TEST] OKR MD Export (from Linear project NOVUS-357 parent initiative)
    • Linked features: Dashboard | View Report, Dashboard | Report Modal | Export, Dashboard | Export .md

Code Gen

None required — no new track events, metadata, or agents were added by this PR.

View details in Novus

Copy link
Copy Markdown

@lci-novus-dev lci-novus-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Novus UX Review

Two UX concerns: the modal's progress bars break the app's green/yellow/red color convention by using blue for 70–99%, which will confuse users; and the direct Export .md button still lacks click feedback despite a documented dead-click frustration signal on that exact button.

percent >= 100 ? 'bg-green-500' : percent >= 70 ? 'bg-blue-500' : percent >= 40 ? 'bg-yellow-500' : 'bg-red-400'
}`}
style={{ width: `${Math.min(percent, 100)}%` }}
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] The modal progress bars use bg-blue-500 for 70–99% completion, but the app's established color system uses green for >70% (as documented in OKR Management and visible in the existing ProgressBar component). Users who've learned "green = on track" in every other OKR view will misread blue as a neutral or unknown state in the report preview. Change the 70% threshold branch from bg-blue-500 to bg-green-500 to stay consistent.

</button>
<button
onClick={exportToMarkdown}
className="inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700 transition-colors"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] A high-priority Pendo signal (2026-03-14) flagged the Export button as a dead-click source — session oFkGVZZwQykbocLM recorded dead clicks on it within the first second, with only 11.1% adoption (2 visitors, 3 clicks) against a 25% goal. The new "View Report" modal is a good step toward making the feature feel more substantial, but the direct "Export .md" button still fires a silent file download with no visual acknowledgment. A brief toast ("Report downloaded") or a momentary button state change would close the feedback loop that's currently generating the dead-click signal.

Copy link
Copy Markdown

@lci-novus-dev lci-novus-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Novus UX Review

Two UX concerns: (1) the modal's progress bar uses blue for 70–99% completion, breaking the red/yellow/green color system used everywhere else in the app; (2) keeping a direct "Export .md" button alongside the new modal export path fragments an already-underperforming feature (10% adoption vs. 25% target) without a clear strategy for which path should drive the metric.

percent >= 100 ? 'bg-green-500' : percent >= 70 ? 'bg-blue-500' : percent >= 40 ? 'bg-yellow-500' : 'bg-red-400'
}`}
style={{ width: `${Math.min(percent, 100)}%` }}
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] The modal progress bar uses bg-blue-500 for 70–99% completion, but every other progress bar in the app (OKR Management pages) uses green for >70%. A user who sees a KR at 75% rendered green on the Team OKRs page will see the same KR colored blue in this modal — two different signals for the same state. Change bg-blue-500 to bg-green-500 to match the established red/yellow/green color system.

<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
</svg>
View Report
</button>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] Export adoption is well below target — 10% of visitors (2 of 20 accounts, 3 total clicks) over the last 30 days vs. a 25% account goal (active Pendo signal). This PR keeps the direct "Export .md" button in the header and adds a second export path inside the modal, splitting the funnel in two. If the preview modal is intended to build confidence and drive export adoption, consider removing the redundant top-level export button and routing all exports through View Report → Export — it creates a cleaner mental model and makes it easier to measure whether the modal is actually moving the adoption needle.

@lci-novus-dev
Copy link
Copy Markdown

lci-novus-dev bot commented Mar 21, 2026

Novus Diff Analysis

Here's a summary of everything done for PR #8NOVUS-357: Add in-app Markdown report viewer:


Inventory Check

All key features introduced by this PR were already present in the artifact system:

  • Dashboard | View Report — "View Report" button that opens the preview modal
  • Dashboard | Report Modal | Export — Export button inside the modal
  • Dashboard | Export .md — already correctly named (button was renamed from "Export to Markdown")
  • okr_exported track event — still fires correctly from both the direct Export button and the modal's Export button

No pages, metadata, or agents changed.


Created

Type Name Notes
track_event okr_report_viewed Fires when a user opens the Markdown report preview modal. Captures quarter, companyCount, teamCount, individualCount. Directly supports goals b37baa28 and d9147fb8 around Export MD feature adoption.
funnel Report Preview to Export 2-step conversion funnel: okr_report_viewedokr_exported. Measures how effectively the preview experience drives export completions.

Code Gen PRs

PR Change
PR #4 Updated with pendo.track("okr_report_viewed", { quarter, companyCount, teamCount, individualCount }) added to the "View Report" button handler in src/pages/Dashboard.tsx

Skipped

  • Launch creation: The Linear integration returned a 401 auth error for NOVUS-357 — skipped gracefully.
  • detectFunnelsJourneys: Hit an internal validation error on existing funnels; created the relevant new funnel (Report Preview to Export) directly instead.

Artifacts Managed

Type Name Status
track_event okr_report_viewed active
funnel Report Preview to Export active

View details in Novus

Copy link
Copy Markdown

@lci-novus-dev lci-novus-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Novus UX Review

Two UX concerns: (1) the modal's progress bar color scale breaks the established red/yellow/green vocabulary by introducing blue for 70–99%, which will conflict with what users see on every OKR management page; (2) the okr_report_viewed track event is never fired, leaving no way to measure whether the new preview modal actually improves export adoption — a metric currently at 11.1% against a 25% goal.

<div className="w-20 h-2 bg-gray-200 rounded-full overflow-hidden">
<div
className={`h-full rounded-full transition-all ${
percent >= 100 ? 'bg-green-500' : percent >= 70 ? 'bg-blue-500' : percent >= 40 ? 'bg-yellow-500' : 'bg-red-400'
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] The progress bar uses bg-blue-500 for 70–99% — but everywhere else in the product (OKR Management pages, Dashboard progress bars) the color vocabulary is explicitly red < 40%, yellow 40–70%, green > 70%. A user who sees a 75% KR as green on the Company OKRs page will see the same KR as blue in this modal, which will read as a different status. Change bg-blue-500 to bg-green-500 here to match the established scale, and drop the separate 100% green band (or keep it as bg-emerald-500 if you want to distinguish "complete").

>
Export to Markdown
</button>
<div className="flex items-center gap-2">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] The okr_report_viewed track event exists in the system (defined to capture quarter + objective counts for adoption tracking) but is never fired here — only a Pendo click feature tag will fire. Export is currently at 11.1% account adoption against a 25% goal (signal from Mar 14–20, 2 of 18 accounts), and this modal is the explicit mechanism to close that gap. Without the track event, you can't measure whether the preview step actually increases export conversions. Add window.pendo?.track('okr_report_viewed', { quarter: selectedQuarter, ... }) alongside setShowPreview(true).

@lci-novus-dev
Copy link
Copy Markdown

lci-novus-dev bot commented Mar 21, 2026

Novus Diff Analysis

No Novus-relevant changes detected in this PR.

All done. Here's a summary of everything executed for PR #8:


PR Analysis Summary — NOVUS-357: Add in-app Markdown report viewer

Artifact Inventory

All key artifacts for this PR were already pre-created and needed no changes:

Artifact Type Status
`Dashboard View Report` Feature (click event)
`Dashboard Report Modal Export`
okr_report_viewed Track Event Already active
Report Preview to Export Funnel Already active

Code Gen PR (Track Events)

  • Updated PR Instrument Pendo Track Events #4 with a pendo.track("okr_report_viewed", { quarter, companyCount, teamCount, individualCount }) call added to src/pages/Dashboard.tsx — fires when the user clicks "View Report" to open the modal. Mirrors the metadata pattern already used in exportToMarkdown.

Launch Created

  • New Launch: [TEST] OKR MD Export (from Linear project NOVUS-357's parent initiative)
  • Artifacts linked to launch:
    • Dashboard | View Report (feature)
    • Dashboard | Report Modal | Export (feature)
    • okr_report_viewed (track event)
    • okr_exported (track event — also part of this feature's export flow)

Goals Connected

This launch directly supports the active goals around OKR Markdown Export adoption (b37baa28 — 25% account adoption) and total user interaction with the Export MD feature (d9147fb8 — 10% of users).

View details in Novus

@lci-novus-dev
Copy link
Copy Markdown

lci-novus-dev bot commented Mar 21, 2026

Novus Diff Analysis

No Novus-relevant changes detected in this PR.

Here's a summary of all actions taken for PR #8 (NOVUS-357 — Add in-app Markdown report viewer):


Analysis

Existing artifacts already covered this PR's changes — no creates or archives were needed. All three new UI elements (View Report button, Report Modal Export button, Export .md button) and the Report Preview to Export funnel already had matching artifacts. The only gap was missing code instrumentation.


Actions Taken

Code Gen

  • regenerateTrackEventCode — Added pendo.track("okr_report_viewed", { quarter, companyCount, teamCount, individualCount }) to the "View Report" button handler in Dashboard.tsx. The okr_report_viewed artifact already existed but had no call site in the codebase. Pushed to PR #4.

Launch Created

  • [TEST] OKR MD Export (launch ID: 58fa8cea) — Created from the Linear project found via NOVUS-357. Feature flag key: testOkrMdExportEnabled.

Artifacts Linked to Launch

Artifact Type
Dashboard | View Report Feature
Dashboard | Report Modal | Export Feature
Dashboard | Export .md Feature
okr_report_viewed Track Event

These artifacts directly support the active goals targeting Export MD feature adoption (d9147fb8 — 10% of total users) and account adoption (b37baa28 — 25% account adoption within 30 days).

View details in Novus

Copy link
Copy Markdown

@lci-novus-dev lci-novus-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Novus UX Review

Two UX concerns flagged: a color-coding inconsistency in the modal's progress bars (blue vs. the app-wide green for >70%) that breaks established visual semantics, and a missing okr_report_viewed tracking call that will prevent measuring whether the new preview path improves export adoption — which is already a high-priority signal at 10% vs. a 25% goal.

<div className="w-20 h-2 bg-gray-200 rounded-full overflow-hidden">
<div
className={`h-full rounded-full transition-all ${
percent >= 100 ? 'bg-green-500' : percent >= 70 ? 'bg-blue-500' : percent >= 40 ? 'bg-yellow-500' : 'bg-red-400'
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] The modal uses bg-blue-500 for 70–99% progress, but the rest of the app uses green for >70% (the OKR management pages and Dashboard progress bars all follow red < 40%, yellow 40–70%, green > 70%). Users who open this report after viewing their OKRs will see the same objective — say, 75% complete — rendered green on the OKR page and blue in the modal, which contradicts the color coding they've internalized. Change bg-blue-500 to bg-green-500 to stay consistent with the existing semantic.

</button>
<div className="flex items-center gap-2">
<button
onClick={() => setShowPreview(true)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[warning] Export adoption is at 10% (2 of 20 accounts), well below the 25% goal, and is flagged as a high-priority signal. The okr_report_viewed track event exists as an active artifact specifically to measure whether the preview path converts to exports — but this click handler only calls setShowPreview(true) with no window.pendo.track("okr_report_viewed", ...) call. Without it, you won't be able to tell how many users open the report vs. go on to export, making it impossible to evaluate whether this new flow moves the adoption needle.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant