Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@objectstack-fleet

Source

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

  1. Choosing a layout closes the menu (the choice is complete); toggles inside the menu (row numbers, inline edit, density) keep it open.
  2. 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

  1. Tests: selecting Kanban closes the popover; Escape closes it and focuses the trigger.
  2. pnpm --filter @object-ui/plugin-list test green.

Evidence

Screenshots on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit b72c97985, never merged): hotcrm-opportunity-kanban-first-25.jpg · hotcrm-display-menu.jpg.

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: 「相关问题也在对应的项目上创建任务」.

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-16T07:26Z

    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.
    • First queue attempt: it was dropped by a test this PR does not touch, 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.
    • Acceptance note: choosing the layout that is already active does not close the menu.
    • Owed by the maintainer: the browser reading on HotCRM /crm_opportunity.

    pm:dispatched leaves with this note. The card closed completed on merge.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions