Swap Proposal H's unified page onto /editor, redirect /display - #389
Merged
Conversation
Nav-redesign PR #313 only pointed the "Editor" nav label at /display while the classic grid page stayed live at /editor - per the owner's explicit directive, this completes the actual route swap: the unified sheet+rail page now serves at /editor, /display is a client-side redirect preserving query params/hash, and the classic ProjectEditor is fully unrouted (component kept in-tree, deletion is a later decision). Ports ProjectEditor's beforeunload unsaved-work guard onto DisplayPage (it lived only in the now-unrouted component, so it wasn't naturally inherited). Fixes a real, unrelated redirect-preservation bug found in useBackendSetter.ts while verifying (documented in troubleshooting.md, not fixed here - pre-existing, affects every page, out of scope). ~190 Playwright tests that exercised classic-/editor-only UI (CardSlot grid, SelectedImagesRibbon bulk-select, GridSelectorModal-as-modal, etc. - issue #272's own tracked parity gaps) are now individually skipped with a standard citation rather than left red or silently deleted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
|
HOLD (owner ruling 2026-07-23): merges only after #272's parity gaps close — parity is now a high-priority blocker. The branch stays current via rebases as parity PRs land. |
This was referenced Jul 23, 2026
# Conflicts: # docs/troubleshooting.md
…page route (proposal-h)
* Port parity wave 1: import/card-detail/export test clusters onto DisplayPage Un-skips and ports 58 tests from the classic /editor grid onto the unified page (issue #272 wave 1): ImportCSV/ImportText/ImportXML + visual (29), the CardDetailedViewModal ecosystem via Browse mode (20), ExportDecklist/ ExportXML content-correctness (6), AddCardToProjectForm (3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix orphan-cardback test's dangling importXML reference in ImportXML.spec.ts * Adapt orphan-cardback test's badge assertion to the sheet's per-slot corner badge (#398) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
4 tasks
…tion clusters onto DisplayPage (#403) Wave 2 of issue #272: un-skips and ports 44 Playwright tests from the classic /editor grid onto the unified DisplayPage (issue #272 wave 2): SelectVersionSection (7, already-adapted, just needed its skip removed), ChangeQueryModal via the shared CardSlotContextMenu (9), 3 Toasts.spec.ts tests that fire on plain landing-page mount, GeneralUIAccessibility's per-slot a11y checks (3), InvalidIdentifiersStatus (5) + its visual companion, and SearchSettings.visual (1). Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
4 tasks
* Port GridSelectorModal/CardSlot clusters onto DisplayPage (issue #272 wave 3) Un-skips 30 of 55 deferred tests (GridSelectorModal.spec.ts + GridSelectorModalVariants.spec.ts fully, CardSlot.spec.ts partially), retargeted onto CardbackToolbarButton's cardback picker and the sheet's page-preview-slot context menu; ports 2 of 6 CardSlot.visual.spec.ts aria-snapshot tests, regex-tolerant on unrelated pre-existing icon-font rendering leaves. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fold the DOM-API sheet gap into the doc body per edit-in-place convention --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
4 tasks
WilfordGrimley
added a commit
that referenced
this pull request
Jul 24, 2026
Closes #415. Incident #389 skipped ~190 Playwright tests in one commit with green CI - nothing checked test inventory across a diff, only whether tests that still ran still passed. coverage_delta.py statically parses frontend/tests/**/*.spec.ts titles + skip state at head vs. the PR's merge-base and fails on a removed or newly-skipped title unless .github/coverage-acks.txt carries a matching ack line. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Completes the Proposal H switchover the owner had originally authorized. Nav-redesign PR #313 (2026-07-22) only pointed the "Editor" nav label at
/displaywhile the classic gridProjectEditorstayed live at/editor- matching the design doc's own documented migration plan (§6 step 5: "flip the default nav entry point... keep/editorreachable behind a classic-view link"), but NOT what the owner now says they intended ("all of the changes...should have been to the new editor page (H) and it should be on editor").This PR does the literal route swap:
/editornow serves the unified sheet+rail page (DisplayPage.tsx, component unchanged) directly./displayis a client-side redirect to/editor, forwarding query params and the URL fragment byte-for-byte (verified - see test plan).ProjectEditorcomponent is fully unrouted (kept in-tree, not deleted - a separate later cleanup decision, now documented in its own file header)./editoragain.pages/print.tsx's empty-state link and internal comments swept for stale/displayreferences;docs/user-guide.md,docs/features/saved-decks.md, and the livingproposal-h-display-layout-spec.mdupdated in place.Real regression found and fixed as part of the swap:
ProjectEditor.tsx'sbeforeunloadunsaved-work guard lived only in that component's function body, never extracted to a shared hook - unrouting it would have silently dropped the guard app-wide (closing/reloading a tab with unsaved cards would warn no one). Ported ontoDisplayPage.tsxverbatim.Known, accepted regression (owner directive: proceed with the swap regardless of issue #272's checklist): ~190 Playwright tests that exercised classic-
/editor-only UI (CardSlotgrid tiles,SelectedImagesRibbonbulk multi-select,GridSelectorModal-as-standalone-modal, the classic PDFPrint!tab, etc. - all confirmed still-open parity gaps per issue #272's own tracking) can no longer reach their subject matter by URL. Each is individually skipped (not deleted, not left silently red) with a standardtestInfo.skip(...)citing this swap and issue #272, so CI stays honest and green rather than either lying or drowning in known-red noise.Unrelated pre-existing bug found while verifying, documented not fixed:
useBackendSetter.ts's?server=URL clean-up (router.replace({ server }, ...)) drops every other query param and the URL fragment on ANY page (reproduced on a direct/editor?server=...&foo=bar#fragload, no redirect involved) - a genuine, separate bug, harmless today since no code builds such a link, documented indocs/troubleshooting.md.Checklist
pre-commitand installed the hooks withpre-commit installbefore creating any commits.npx tsc --noEmitclean.npx jest- 525/525 passing.npx playwright test(full suite, excl. perf) - 324 total: 133 passed, 189 skipped (documented classic-/editor-only coverage, see above), 2 failed (chunkErrorRecovery.spec.ts, confirmed pre-existing/environment flake unrelated to this change - the tested mechanism is app-wide viaLayout.tsx, page-agnostic).npx prettier@2.7.1 --checkclean on all changed files.python3 .github/scripts/docs_lint.py --strictclean./editorpopulated with a card and the rail open, phone-viewport/editor, and/display?foo=bar#hashvallanding on/editor?foo=bar#hashval(params/hash preserved) - confirms the DisplayPage shell renders correctly at the new route on both viewports and the redirect works end-to-end.docs/user-guide.md,docs/features/saved-decks.md,docs/proposals/proposal-h-display-layout-spec.md(switchover marked DONE),docs/troubleshooting.md(new entry for the unrelateduseBackendSetterbug), and in-code comments (pages/editor.tsx,pages/display.tsx,Navbar.tsx,components/ProjectEditor.tsx).Open items for the owner
FinishSettingsplacement, cardback gallery chrome, sheet zoom/pan) - this swap proceeds ahead of it per direct instruction, but the checklist itself is unchanged by this PR.DisplayPage's DOM or formally retired - tracked via their skip-reason citing issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272, not a new tracking item, but worth the owner's awareness at review time.components/ProjectEditor.tsxand its now-unrouted child components are untouched in-tree; deletion is a deliberately separate decision (noted in the file's own header).