You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
The list's Display menu closes after a layout is chosen and on Escape #12621
Walked on objectui main 8415d9f11, /crm_opportunity: open Display, choose Layout › Kanban. The board renders behind the menu and the menu stays open over the first column; Escape does not close it; it closes on the next click elsewhere (the New button in the walk, which then also opened the form).
Target
Choosing a layout closes the menu (the choice is complete); toggles inside the menu (row numbers, inline edit, density) keep it open.
Escape closes the menu and returns focus to the Display button.
File surface
packages/plugin-list/src/components/ViewSettingsPopover.tsx (or the Display popover component the list toolbar mounts), tests beside.
Acceptance
Tests: selecting Kanban closes the popover; Escape closes it and focuses the trigger.
Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 walk of HotCRM's core pages as a user: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the maintainer's browser pane at 1024 × 768 (en). The maintainer asked for the findings to be filed on the repository each belongs to, verbatim: 「相关问题也在对应的项目上创建任务」.
Claim: PM loop round 2
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12621-display-menu-close
Worktree: objectui-issue-12621
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/plugin-list/src/, the Display popover the list toolbar mounts (ViewSettingsPopover.tsx or wherever the dev locates it, including its open-state owner in ListView.tsx if that is where it lives), the tests beside them, and one .changeset/12621-*.md (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
Clause-②: no
Responsibility: objectui plugin-list's Display popover keeps itself open after a layout choice and ignores Escape | none: the Radix popover's own Escape and close behaviour is what it bypasses | every console list user who switches layout; measured on HotCRM /crm_opportunity
Thread-read: none
Serial constraints cleared: no open PR touches plugin-list. This seat's other two claims this round (objectui#12603, #12617) do not touch the Display popover.
Claimed at: 2026-10-16T06:14Z
{
"issue": 12621,
"status": "done",
"branch": "claude/issue-12621-display-menu-close",
"pr": "https://github.com/objectstack-ai/objectui/pull/12632",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Target 1 reproduced and fixed: the Display popover's `layout` slot is now a function of `closeMenu`; ListView's switcher calls it on a layout pick (segmented and nested-dropdown shapes), so the menu closes through its controlled state and Radix returns focus to the trigger; toggles keep it open. A1 refuted: the popover was already controlled (`onOpenChange={setOpen}`), no close was swallowed and no `onEscapeKeyDown` was prevented; the producer was the absence of any close on a layout choice. Escape (target 2) already closed and refocused the trigger in happy-dom on base 63d00da3d; the card's real-browser 'Escape after a Kanban choice does not close' is NOT MEASURED (no browser run) and is moot after the fix, since the menu is closed once a layout is chosen. Choosing the already-active layout does not close (ViewSwitcherDropdown returns before onViewChange for the current view) - noted in Acceptance notes.",
"tests": "HEAD 882ce9b30. New packages/plugin-list/src/__tests__/ListView.displayMenuClose-12621.test.tsx: `Tests 4 passed (4)` (segmented Kanban closes+focus, dropdown Kanban closes+focus, Escape closes+focus, CONTROL Row numbers+density keep open). Ablation (fix committed first; deleted `closeMenu();` in ListView via python with anchor count 1 then 0; trap restore `git checkout HEAD --`; `git diff HEAD` empty and HEAD blob hash match after restore): `Tests 2 failed | 2 passed (4)`, the two choice pins red, Escape+control green as predicted; tests import ../ListView from src so no dist rebuild involved. Package: `pnpm exec vitest run --maxWorkers=2 packages/plugin-list/` under lock exit 0, `Test Files 139 passed (139)`, `Tests 1453 passed (1453)`. Closure build `pnpm --filter '@object-ui/plugin-list^...' build` exit 0; `pnpm --filter @object-ui/plugin-list type-check` exit 0 (tsconfig.test.json --listFilesOnly includes the new test: 1 hit). Lint narrowed: eslint --no-inline-config --format json on the 3 changed source files exit 0, 3 files, 0 errors; population: all 3 resolve under eslint.config.js via --print-config; invariance: eslint.config.js has no parserOptions.project/projectService (not type-aware) so the diff moves no verdict on untouched files; ListView.tsx warnings 196 = base 196.",
"gates": {
"closure-build plugin-list^...": 0,
"type-check @object-ui/plugin-list": 0,
"vitest new test file": 0,
"vitest packages/plugin-list/": 0,
"eslint narrowed (3 files)": 0,
"check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0,
"check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0,
"check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0,
"check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0,
"check-hand-rolled-comment-mask.mjs": 0, "check-changeset-fixed.mjs": 0, "check-changeset-presence.mjs": 0, "check:new-line-citations": 0,
"check:spec-floors": "1 - NOT MEASURED: no-artifact (needs full workspace build), recorded per dispatch",
"CI": "in_progress (not awaited)"
},
"line_budget": "n/a - no skills/** or governed ledger touched",
"files_changed": [
"packages/plugin-list/src/components/ViewSettingsPopover.tsx",
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-list/src/__tests__/ListView.displayMenuClose-12621.test.tsx",
".changeset/12621-display-menu-close.md"
],
"deviations": [
"File surface: edited the `layout=` prop lines on the ViewSettingsPopover element in ListView.tsx although ListView does not own the open state (the order allowed ListView lines only if it does). Closing on a choice needs the switcher's onViewChange, which only the mount site holds; the alternatives were ViewSwitcher.tsx (also off-surface), lifting open state into ListView (more state in a 5000-line component), or a DOM-shape heuristic in the popover. Declared here and in the PR rather than stopping; PM may reject.",
"Real-browser Escape reading NOT MEASURED (happy-dom only).",
"Labels: zero writes (objectui, dispatch named none).",
"Commit trailer is the model-free pair per both AGENTS.md files, not the harness reminder's model-named Co-Authored-By."
],
"mcp_calls": "0",
"api_writes": "3 REST writes via fleet-write relay plus this report comment: relay dispatch POST /repos/objectstack-ai/objectstack/dispatches (1) executing POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos/objectstack-ai/objectui/issues/12632/assignees; POST /repos/objectstack-ai/objectui/issues/12621/comments (os-dev-report). git pushes: 2 (empty branch, fix commit).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: whoever next touches packages/plugin-list/src/ViewSwitcher.tsx - re-choosing the already-active layout in ViewSwitcherDropdown returns before onViewChange, so the Display menu stays open on that click; noted in Acceptance notes, not filed"
]
}
PR #12632 merged through the merge queue as 79c1996, which is on main. Verified by content: all 4 of the PR's files on origin/main are blob-identical to the accepted head 882ce9b.
What changed: the list's Display menu now closes once a layout is chosen, in both switcher shapes, and returns focus to the Display button. The toggles keep it open, and Escape closes it as before.
Activity
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12621-display-menu-closeWorktree:
objectui-issue-12621Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-list/src/, the Display popover the list toolbar mounts (ViewSettingsPopover.tsxor wherever the dev locates it, including its open-state owner inListView.tsxif that is where it lives), the tests beside them, and one.changeset/12621-*.md(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
objectui plugin-list's Display popover keeps itself open after a layout choice and ignores Escape | none: the Radix popover's own Escape and close behaviour is what it bypasses | every console list user who switches layout; measured on HotCRM /crm_opportunityThread-read: none
Serial constraints cleared: no open PR touches
plugin-list. This seat's other two claims this round (objectui#12603, #12617) do not touch the Display popover.Claimed at: 2026-10-16T06:14Z
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12621, "status": "done", "branch": "claude/issue-12621-display-menu-close", "pr": "https://github.com/objectstack-ai/objectui/pull/12632", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Target 1 reproduced and fixed: the Display popover's `layout` slot is now a function of `closeMenu`; ListView's switcher calls it on a layout pick (segmented and nested-dropdown shapes), so the menu closes through its controlled state and Radix returns focus to the trigger; toggles keep it open. A1 refuted: the popover was already controlled (`onOpenChange={setOpen}`), no close was swallowed and no `onEscapeKeyDown` was prevented; the producer was the absence of any close on a layout choice. Escape (target 2) already closed and refocused the trigger in happy-dom on base 63d00da3d; the card's real-browser 'Escape after a Kanban choice does not close' is NOT MEASURED (no browser run) and is moot after the fix, since the menu is closed once a layout is chosen. Choosing the already-active layout does not close (ViewSwitcherDropdown returns before onViewChange for the current view) - noted in Acceptance notes.", "tests": "HEAD 882ce9b30. New packages/plugin-list/src/__tests__/ListView.displayMenuClose-12621.test.tsx: `Tests 4 passed (4)` (segmented Kanban closes+focus, dropdown Kanban closes+focus, Escape closes+focus, CONTROL Row numbers+density keep open). Ablation (fix committed first; deleted `closeMenu();` in ListView via python with anchor count 1 then 0; trap restore `git checkout HEAD --`; `git diff HEAD` empty and HEAD blob hash match after restore): `Tests 2 failed | 2 passed (4)`, the two choice pins red, Escape+control green as predicted; tests import ../ListView from src so no dist rebuild involved. Package: `pnpm exec vitest run --maxWorkers=2 packages/plugin-list/` under lock exit 0, `Test Files 139 passed (139)`, `Tests 1453 passed (1453)`. Closure build `pnpm --filter '@object-ui/plugin-list^...' build` exit 0; `pnpm --filter @object-ui/plugin-list type-check` exit 0 (tsconfig.test.json --listFilesOnly includes the new test: 1 hit). Lint narrowed: eslint --no-inline-config --format json on the 3 changed source files exit 0, 3 files, 0 errors; population: all 3 resolve under eslint.config.js via --print-config; invariance: eslint.config.js has no parserOptions.project/projectService (not type-aware) so the diff moves no verdict on untouched files; ListView.tsx warnings 196 = base 196.", "gates": { "closure-build plugin-list^...": 0, "type-check @object-ui/plugin-list": 0, "vitest new test file": 0, "vitest packages/plugin-list/": 0, "eslint narrowed (3 files)": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0, "check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0, "check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0, "check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0, "check-hand-rolled-comment-mask.mjs": 0, "check-changeset-fixed.mjs": 0, "check-changeset-presence.mjs": 0, "check:new-line-citations": 0, "check:spec-floors": "1 - NOT MEASURED: no-artifact (needs full workspace build), recorded per dispatch", "CI": "in_progress (not awaited)" }, "line_budget": "n/a - no skills/** or governed ledger touched", "files_changed": [ "packages/plugin-list/src/components/ViewSettingsPopover.tsx", "packages/plugin-list/src/ListView.tsx", "packages/plugin-list/src/__tests__/ListView.displayMenuClose-12621.test.tsx", ".changeset/12621-display-menu-close.md" ], "deviations": [ "File surface: edited the `layout=` prop lines on the ViewSettingsPopover element in ListView.tsx although ListView does not own the open state (the order allowed ListView lines only if it does). Closing on a choice needs the switcher's onViewChange, which only the mount site holds; the alternatives were ViewSwitcher.tsx (also off-surface), lifting open state into ListView (more state in a 5000-line component), or a DOM-shape heuristic in the popover. Declared here and in the PR rather than stopping; PM may reject.", "Real-browser Escape reading NOT MEASURED (happy-dom only).", "Labels: zero writes (objectui, dispatch named none).", "Commit trailer is the model-free pair per both AGENTS.md files, not the harness reminder's model-named Co-Authored-By." ], "mcp_calls": "0", "api_writes": "3 REST writes via fleet-write relay plus this report comment: relay dispatch POST /repos/objectstack-ai/objectstack/dispatches (1) executing POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos/objectstack-ai/objectui/issues/12632/assignees; POST /repos/objectstack-ai/objectui/issues/12621/comments (os-dev-report). git pushes: 2 (empty branch, fix commit).", "open_questions": [], "out_of_scope_findings": [ "carrier: whoever next touches packages/plugin-list/src/ViewSwitcher.tsx - re-choosing the already-active layout in ViewSwitcherDropdown returns before onViewChange, so the Display menu stays open on that click; noted in Acceptance notes, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-16T07:26ZPR #12632 merged through the merge queue as
79c1996, which is onmain. Verified by content: all 4 of the PR's files onorigin/mainare blob-identical to the accepted head882ce9b.StudioDesignSurface.automationsRailOrder-12612, which also failed PR fix(app-shell): Studio at 1024 px keeps the package name, the flow title and the tab labels readable (objectui#12611) #12631's queue group. That test is filed as objectui#12634. The one re-queue merged./crm_opportunity.pm:dispatchedleaves with this note. The card closedcompletedon merge.Generated by Claude Code
fix(plugin-list): Display menu closes after a layout is chosen (objec…