Port ChangeQueryModal/Toasts/a11y/InvalidIdentifiers/SelectVersionSection clusters onto DisplayPage - #403
Merged
WilfordGrimley merged 1 commit intoJul 24, 2026
Conversation
…tion clusters onto DisplayPage 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>
WilfordGrimley
merged commit Jul 24, 2026
e61ca68
into
proposal-h-editor-display-route-swap
7 checks passed
4 tasks
WilfordGrimley
added a commit
that referenced
this pull request
Jul 24, 2026
* Swap Proposal H's unified page onto /editor, redirect /display 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> * Port chunkErrorRecovery/DisplayLeftRailFidelity specs to the unified-page route (proposal-h) * Port import/card-detail/export test clusters onto DisplayPage (#395) * 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> * Port ChangeQueryModal/Toasts/a11y/InvalidIdentifiers/SelectVersionSection 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> * Port pin-persistence tests to unified-page routing * Port GridSelectorModal/CardSlot clusters onto DisplayPage (#410) * 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> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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
Wave 2 of issue #272's parity work (following wave 1's PR #395): un-skips and
ports 44 Playwright tests from the classic
/editorgrid's coverage onto theunified
DisplayPageat/editor(PR #389's own swap), stacked onproposal-h-editor-display-route-swap(PR #389) the same way wave 1 was.Ported clusters (44 tests)
classic-editor-only: it already exercised the unified page's own rail (via
openSelectVersionSection, added totest-utils.tsback whenDisplayLeftRailFidelity.spec.tslanded) since issue Select Version section build (blocked on PR #116) #167 shipped, wellbefore the route swap. It picked up the swap's blanket per-file skip
marker anyway and was deliberately left for this wave. Un-skipped with no
other change - all 7 pass as-is.
ChangeQueryModal.tsxisunchanged and still globally mounted (
Modals.tsx); reached via theshared
CardSlotContextMenu's "Change Query" action (right-click a sheetslot), the same context menu DisplayPage.tsx already wires up
("no new action, just three more ways to reach it on /display" per that
file's own comment). New
openDisplayChangeQueryModalhelper intest-utils.ts.DFCPairs/importSites/sampleCards error-toast tests used
openImportTextModal/getAddCardsMenuonly as a means to mountImportText.tsx/ImportURL.tsx, whose own RTK Query hooks fire onmount, not on any click. DisplayPage's empty landing mounts both
unconditionally (
ImportColumns, URL accordiondefaultActiveKey="url")already-passing
/2/cards//2/sourcestests beside them.options" a11y checks retarget onto
PagePreview.tsx's own per-slot menucue (
page-preview-slot-menu-cue, "Open card menu" - the sheet's closestequivalent, reserving the same corner classic
CardSlot's 3-dot buttonoccupied). The editor-page console-warnings test ports directly.
test) -
InvalidIdentifiersStatus.tsx/InvalidIdentifiersModal.tsxareboth unchanged; DisplayPage.tsx's own D13 comment confirms the
landing/search-bar mount (which these tests exercise) already works -
only the separate right-rail Status row (issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272 item 2's own
remaining scope) is missing.
SearchSettings.tsxisunchanged, relocated into the right rail unmodified. New
openDisplaySearchSettingsModalhelper (opens the gear button/rightrail first, when it isn't already inline).
Deviations from a clean port
ChangeQueryModal.spec.ts's 12 tests dropped: the multi-slotDFC tests ("plural text when multiple front slots are selected",
"updates all fronts and backs for a multi-slot selection", "not shown
when any one of the selected slots already has the DFC back query")
depended on the classic grid's checkbox multi-select +
SelectedImagesRibbon's own "Change Query" trigger - bulk multi-selecthas no equivalent on the unified page (see "Parked clusters" below). The
9 single-slot DFC prompt/submission/condition/fuzzy-search/checkbox-reset
tests are unaffected and fully prove the same underlying logic.
GeneralUIAccessibility.spec.ts's "comfortable touch-target size"(>=40x40px) assertion dropped, not weakened:
PagePreview.tsxrendersthe sheet near print-scale (millimetre-driven sizing), and the menu cue
measured ~11x11px there - a real, structural difference in what the
element IS (a small on-page-preview affordance vs. a full-size toolbar
button), not an accessibility regression. The focus-visible-style half of
that same test is unaffected and still verified.
GeneralUIAccessibility.spec.ts's two "Editor - mobile layout" testsdropped (left-panel/right-panel 50/50-split-vs-stacked): they verified
the same "mobile scroll affordances -> Mobile /display: fit-to-width sheet + bottom-sheet drawer for card actions (#231 blocker) #266's responsive layer"
replacement issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272's own body already lists as intentional, not a
gap. The unified page's rails are off-canvas drawers below their own
breakpoints regardless of viewport - there's no persistent 50/50 split to
ever "stack" in the first place.
CardImageStates.spec.tsinvestigated, left skipped with an improvedreason - not a route-swap casualty after all: its
card-image-error-placeholder/card-image-slow-load-hinttestids onlyexist in
Card.tsx.PagePreview.tsx's sheet slots are their owncomponent with their own
loading/failedstates (already covered byDisplaySlotStates.spec.ts) but a plain, unwrapped<img>for the"candidate resolved, but its own image fetch 404s or hangs" case - no
error-placeholder swap, no slow-load hint, at all. This is a genuine,
confirmed gap (new UI work, not test-porting), not something this wave
can port.
DeckbuilderConfirmAffordance.spec.tsinvestigated, left skipped -its rail-header mount was intentionally REMOVED and superseded by
ConfidenceElement.tsx(DisplayPage.tsx's own D14 comment). Its onlyremaining reachable mount (the Select Version confirm ribbon) is already
covered by
SelectVersionSection.spec.ts's own "carries the confirmribbon" test, ported above - porting this file too would just duplicate
that coverage against a UI surface (the auto-shown top-level badge) that
no longer exists on this page.
Parked clusters (skip left untouched, not ported or dropped)
I could not find an authoritative "cluster N" list in issue #272 itself
(its own checklist is 8 numbered GAPS, not test clusters) - the mapping
below is my own inference from the issue body's "Intentional replacements,
NOT gaps" list plus source investigation. Flagging this so it can be
corrected if it doesn't match the intended list:
visual/CommonCardback.visual.spec.ts- issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272's own body:"CommonCardback mount -> CardbackToolbarButton" is an intentional
replacement, not a gap.
SelectedImagesRibbon.spec.ts(bulk multi-select) - issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272 item6, still not built; no DisplayPage surface exists to point this at.
ProjectEditorMobileScroll.spec.ts- issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272's own body: "mobilescroll affordances -> Mobile /display: fit-to-width sheet + bottom-sheet drawer for card actions (#231 blocker) #266's responsive layer" is an intentional
replacement.
PDFGenerator.spec.ts+PagePreview.spec.ts+PostExportContributionPrompt.spec.ts- the PDF-generation surfacesplit across two entry points (the classic embedded PDF tab, now gone -
DisplayPage's own center sheet region is the preview now per the owner's
addendum - vs. the separate
/printroute, generation/settings only).Where this coverage should live now is a placement decision, not a
mechanical port.
Deferred to a future wave (not owner-parked - time/complexity only)
GridSelectorModal.spec.ts(23 tests) +GridSelectorModalVariants.spec.ts(7 tests) - the modal is reachable on DisplayPage (e.g. via
CardbackToolbarButton), but mapping this cluster's grouping/filter/title-count assertions onto a genuinely reachable instance is real,
non-mechanical work I didn't get to this wave.
CardSlot.spec.ts(25 tests) +visual/CardSlot.visual.spec.ts-large per-slot interaction cluster (image cycling arrows, per-slot
context menu, badges) that needs redesigning around the sheet+rail
architecture rather than a 1:1 retarget.
Saying this plainly rather than silently shrinking wave 2's scope: these
two clusters are real, non-trivial remaining work, not confirmed gaps or
owner decisions.
Verification
together.
ImportXML.spec.ts(16),chunkErrorRecovery.spec.ts,DisplayLeftRailFidelity.spec.ts- allpass.
npx playwright test, excl. perf): 325 total, 225 passed, 96skipped (unchanged - only intra-file skips converted to real tests, no
file went from unskipped to skipped), 4 failed on the first full run
(
Navbar.spec.ts's Sign-out test,UnsavedWorkGuard.spec.ts'seditor->/print test,
visual/CardDetailedViewModal.visual.spec.ts,visual/DynamicLogo.visual.spec.ts) - all 4 re-run individually andpassed; none touch a file this PR changed.
DynamicLogo.visual.spec.ts'sfailure in the full run is this session's own dedicated-port workaround
(its MSW handler hardcodes
localhost:3000), documented in wave 1's ownPR as the same known artifact.
npx tsc --noEmitclean.npx jest --silent- 568/568 passing (unchanged; nosrc/filestouched).
npx prettier@2.7.1 --checkclean on all changed files.Environment note: local runs used a temporary, uncommitted
playwright.config.tsport override (3411) perdocs/lessons.md'sworktree-port-collision entry, reverted before every commit.
Open items for the owner
sourced from an explicit list - please correct if it's wrong.
GridSelectorModal.spec.ts/GridSelectorModalVariants.spec.ts/CardSlot.spec.ts(55 tests total) remain deferred, not parked - realscope for a wave 3.
CardImageStates.spec.ts's gap (no image-fetch-error/slow-load UX onthe sheet) may be worth its own tracked issue, separate from /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272.
Checklist
pre-commitand installed the hooks withpre-commit installbefore creating any commits.tests where appropriate. (This PR is the test update.)
above.
documentation where appropriate. (No
docs/file tracks per-wavetest-porting status, matching wave 1's own precedent.)
Stacked on
proposal-h-editor-display-route-swap(PR #389, held open,parity-blocked), same stacking as wave 1's PR #395.