fix(policies): show a draft version's own content when editing it

Merged
TO
5mo ago
+136-6

Bug

Create a new policy version → edit the text → switch tabs → Versions → Edit the latest draft → the edit appears to vanish (reproduced; customer video confirms it reaches "Saved" first).

Root cause (it's a load bug, not a save bug)

The edit is saved correctly to the draft version's content. The problem is what the editor displays when you re-open the draft.

In PolicyContentManager (editor/components/PolicyDetails.tsx):

  • currentContent (what the editor shows) is seeded from the policyContent prop, which PolicyPageTabs always sets to the published/current version's content.
  • viewingVersion is correctly the draft.
  • The effect that swaps the draft's content into currentContent early-returns on first mount, because prevInitialVersionIdRef is initialized to initialVersionId (prevRef === initialVersionId → skip).

Switching tabs unmounts the Content tab (the design-system Tabs don't keep inactive panels mounted), so clicking Edit on a draft from the Versions tab remounts the tab fresh with ?versionId=… already set — hitting that skip-on-mount path and showing the published content. (Editing via the in-editor version dropdown works, because handleVersionSelect sets the content explicitly — which is why it's intermittent.)

Risk: first edit isn't lost (it's safe in the DB), but a follow-up edit on top of the wrongly-shown published content would overwrite the draft — so worth fixing promptly.

Fix

Seed currentContent from the initialVersionId version when present, via a new pure, unit-tested helper resolveInitialPolicyContent. viewingVersion was already correct, so this just aligns the displayed content with the selected version. No save-path change.

Tests

apps/app → npx vitest run resolve-initial → 6/6 pass (covers: seeds from the targeted draft, falls back to published when no/unknown version, single-node wrapping, empty-draft).

Notes for reviewer

  • Scope: PolicyDetails.tsx (1 seed line + import) + the helper + its test.
  • Pre-existing issues in this area, not introduced by this PR (verified by reverting PolicyDetails.tsx to origin/main):
    • PolicyDetails.test.tsx → "renders editor as read-only when pending approval" fails identically on origin/main.
    • apps/app typecheck + several policy vitest files fail only on env grounds (PointerEvent is not defined in jsdom; @trycompai/auth needs internal packages built first; unrelated *.test.tsx prop drift) — none in the files this PR touches.

🤖 Generated with Claude Code


Summary by cubic

Fixes an editor load bug where editing a draft from Versions > Edit showed the published content. The editor now loads the draft’s own content on mount, so saved edits are visible and not overwritten.

  • Bug Fixes
    • Seed currentContent from the version in initialVersionId via resolveInitialPolicyContent, falling back to published content only when no match.
    • Updated PolicyDetails.tsx to use the helper; no changes to the save path.