Port GridSelectorModal/CardSlot clusters onto DisplayPage - #410
Merged
WilfordGrimley merged 3 commits intoJul 24, 2026
Merged
Conversation
…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>
WilfordGrimley
merged commit Jul 24, 2026
2b796f7
into
proposal-h-editor-display-route-swap
11 checks passed
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 3 of issue #272's parity work (following wave 1's PR #395 and wave 2's
PR #403 — the final unparked tranche from wave 2's own "deferred to a future
wave" list): un-skips and ports 30 of the 55 remaining Playwright tests from
the classic
/editorgrid's coverage onto the unifiedDisplayPageat/editor, stacked onproposal-h-editor-display-route-swap(PR #389) thesame way waves 1-2 were.
Ported clusters (30 tests)
(7 tests) — full port.
GridSelectorModal.tsx's only surviving mountpost-route-swap is
CardbackToolbarButton/CommonCardback.tsx'sproject-wide cardback picker (testid
cardback-grid-selector, title"Select Cardback") — per-slot picking now goes entirely through the
rail's own Select Version section instead (a different component,
already covered by
SelectVersionSection.spec.ts).GridSelectorModal.tsxitself is completely generic (a bare
imageIdentifiersarray +onClickcallback, doesn't care what the identifiers represent), so every
grouping/filter/keyboard/mobile-viewport behavior these two files test is
identical regardless of which caller's identifiers feed it — this is the
full-fidelity instance both files port onto. New
openDisplayCardbackGridSelectorhelper (test-utils.ts); newcardback-endpoint fixtures reusing the existing
cardDocuments*sets(
cardbacksThreeResults/cardbacksFourResults/cardbacksTwoSources/cardbacksWithCanonicalCards,mocks/handlers.ts).right-click-context-menu/auto-select-first-result coverage, retargeted
onto the sheet's own
page-preview-slot+page-preview-slot-menu-cue(new
openDisplaySlotMenu/openDisplaySlotContextMenuhelpers — thesheet's visible "..." menu cue is the direct equivalent of the classic
3-dot button, both open the identical
card-slot-context-menu).aria-snapshot tests, retargeted onto the cardback picker (see Add NotMPC ordering tab and PringlePrints listing #1).
Deviations from a clean port
the file:
classic grid's inline ❯/❮ cycling arrows have no equivalent anywhere on
the unified page; per-slot picking is browse-and-click only now (Select
Version), with no "next/previous"/wrap-around concept to port onto.
and confirmed a genuine, previously-undocumented product gap, not
dropped for convenience: this test's real payload is
docs/features/card-dom-api.md's contract (data-card-*attributes +the
mpc:card-selectedevent). Confirmed by grep againstcommon/cardDom.ts's own callers:Card.tsx/CardSlot.tsx/CardDetailedViewModal.tsxall wire it;PagePreview.tsx(the unifiedpage's own sheet-slot renderer) does not, at all — no
data-card-*attributes, no event dispatch. Flagged in both
docs/features/ card-dom-api.mdanddocs/features/grid-selector.md(edited in place)for an owner priority call, same as wave 1's
CardImageStates.spec.tsfinding.
"most recently selected card is tracked") — 4 tests — no unified-page
equivalent (issue /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272 item 6, still not built;
SelectedImagesRibbon.spec.tsitself has been parked, not ported, every wave).
already covered verbatim by
DisplayPage.spec.ts's own two badge testsagainst the identical shared
RequestedPrintingBadgecomponent in therail header (the sheet slot itself never renders this badge —
PagePreviewSlotContentcarries no such field). Porting again wouldjust duplicate coverage, same precedent as wave 2's
DeckbuilderConfirmAffordance.spec.tsdrop. The third badge test (the"absent" case) is NOT covered elsewhere and was ported.
candidate-strip snapshots (thumbnails + "N / M" counter + ❮/❯ arrows) have
no sheet equivalent; same finding wave 1's import cluster already made for
selectedImage/totalImages.exact-matched, on a handful of specific leaves (icon-only chevron-toggle
buttons, the "Filters"/"Collapse All" buttons' own leading icon, "Remove
None"/"Remove Source" chip buttons' trailing clear-icon, each
StyledDropdownTreeSelect's placeholder-caret text node) — verified
directly: a plain
toMatchAriaSnapshotpolling assertion reproduciblysettles on a different accessible-name/text value for exactly these nodes
than a single
--update-snapshotscapture does, deterministically andindependent of worker count/explicit wait length (both ruled out by direct
testing across 10+ runs) — a genuine pre-existing rendering race in this
third-party icon-font/tree-select machinery (unchanged by this port), not
a route-swap or port artifact. Every other leaf (headings, table rows,
source names, result-tile names/images, DPI/file-size bounds) matched
exactly and consistently across every run. Full reasoning in the file's
own module comment.
New findings flagged for the owner (not ported, not silently dropped)
docs/features/card-dom-api.md's DOM API contract is unimplemented on/editor's sheet slots — see that doc's own "Known gap" entry(edited in place) for the full detail and a scoped fix description.
docs/features/grid-selector.md's own new "Known gaps" entry.Neither is tracked against any numbered item in issue #272's own checklist —
both are new findings from this wave, not previously-known gaps.
Verification
(
npx playwright test tests/CardSlot.spec.ts tests/visual/CardSlot.visual.spec.ts tests/GridSelectorModal.spec.ts tests/GridSelectorModalVariants.spec.ts) —69/69 passed alongside the wave-1/2 marquee regression files
(
ImportXML.spec.ts,chunkErrorRecovery.spec.ts,DisplayLeftRailFidelity.spec.ts,SelectVersionSection.spec.ts).visual/CardSlot.visual.spec.ts's 2 ported tests specifically re-verifiedfor stability: 6/6 green across 3 repeats × 4 parallel workers, after
landing on the regex-tolerant fix described above (this took real
investigation — the flake was 100% reproducible before that fix, not
timing-sensitive; the reasoning is captured in the file's own module
comment).
npx playwright test, excl. perf): 269 passed, 36 skipped(owner-parked clusters, untouched), 6 failed on the one full-suite run —
all 6 re-run individually and passed:
ImportCSV.spec.tsandCardDetailedViewModal.visual.spec.ts(genericimport-texttextboxtimeouts under this run's heavy full-suite load, files this PR never
touched),
Navbar.spec.ts's Sign-out test andUnsavedWorkGuard.spec.ts'seditor->/print test (both already documented as pre-existing/environment
flakes in wave 1's own PR Port import/card-detail/export test clusters onto DisplayPage #395 description),
visual/DynamicLogo.visual.spec.ts(documented dedicated-port-workaround artifact, also from wave 1's PR).
npx tsc --noEmitclean.npx jest --silent— 568/568 passing (unchanged; nosrc/files touchedbesides the new
mocks/handlers.tsfixtures).npx prettier@2.7.1 --checkclean on all changed files.Environment note: local runs used a temporary, uncommitted
playwright.config.tsport override (3427) perdocs/lessons.md'sworktree-port-collision entry, reverted before every commit (confirmed via
git diffshowing no changes to that file in the final commit).Open items for the owner
equivalent) — worth their own tracked issue(s), separate from /display parity inventory: verified remaining gaps vs /editor (switchover checklist) #272?
CardImageStates.spec.ts(wave 1's own flagged gap) andDeckbuilderConfirmAffordance.spec.ts(wave 2's own investigated-and-dropped file) remain untouched, as before.
visual/CommonCardback.visual.spec.ts,SelectedImagesRibbon.spec.ts,ProjectEditorMobileScroll.spec.ts,PDFGenerator.spec.ts,PagePreview.spec.ts,PostExportContributionPrompt.spec.ts) remain untouched, skips intact,per the owner's own prior parking decision.
With this wave, the 55-test "deferred to a future wave" tranche wave 2's PR
#403 flagged is now: 30 ported, 14 dropped with justification (bulk
multi-select/duplicate-coverage/no-equivalent-UI), 1 dropped as a confirmed
product gap, 10 remaining in
CardSlot.visual.spec.tsdropped as the sameclass of "no sheet equivalent" as the wave-1 import-cluster precedent — no
tests silently left in limbo.
Checklist
pre-commitand installed the hooks withpre-commit installbefore creating any commits.tests where appropriate. (This PR is the test update.)
documentation where appropriate (
docs/features/card-dom-api.md,docs/features/grid-selector.md, both edited in place).Stacked on
proposal-h-editor-display-route-swap(PR #389, held open,parity-blocked), same stacking as waves 1-2's PRs #395/#403.