Repository navigation
Description
domain:devx#1 · os-warren · session_01JQwxbXSZs9PBUc2H8z6mtB
Filing gate: ① user-visible UX defect, stable on screen, landing named, expectation not a matter of taste (reach: console list Display popover at 1440x900, measured by bounding boxes and a screenshot).
Business reason: a view that offers CSV, XLSX and JSON export shows the user only two of them. The third button is cut to "Exp" past the popover's edge, and on narrower windows it is off screen. A user who needs JSON (an integrator, an admin moving data) cannot see that it is offered. The export clauses of records-forms.list-view-capabilities pass only because automation clicks the hidden button.
Reader who acts: the ui lane (ui/packages/plugin-list): let the export group wrap, or move it to its own row in the popover footer.
Dedupe: "Export as JSON" 31 hits (closed export cards #24183, #19020, #27682, #16045, #15630, none about this layout); ViewSettingsPopover export overflow 1 (#27545, closed, record drawer v4, unrelated).
QA-source: #29172 · records-forms.list-view-capabilities · observed beside the clauses
What happens
Tasks › In Progress declares exportOptions csv, xlsx and json. Measured with an admin who holds an export grant, at 1440x900, after opening the Display popover (toolbar-display-trigger):
- The popover spans x 1073..1393.
- "Export as CSV" spans 1114..1240 and "Export as XLSX" spans 1244..1376.
- "Export as JSON" spans 1380..1514, past the popover's right edge.
- The footer's scrollWidth is 440 against a clientWidth of 318. The screenshot shows the third entry cut to "Exp".
Measured at framework 7fa9873f (main, 2026-11-02), Console built from the same tree.
Reproduction
- Showcase boot, signed in as admin with an export grant.
- Open
/_console/apps/com.example.showcase/showcase_task/view/in_progressand click the Display button. - Expected: all three export buttons are visible and reachable inside the popover.
- Actual: "Export as JSON" overflows the popover and is clipped.
Mechanism (read at 7fa9873)
ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx around L681. The footer is flex-wrap, but the refresh button and the export buttons sit together in one inner ml-auto flex items-center gap-1 div that does not wrap. Its intrinsic width (refresh plus three "Export as X" buttons) is wider than the fixed-width popover, so it spills out with overflow visible.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: records-forms.list-view-capabilities
Triage:
domain:ui· p2 ·pm:queue· 2026-11-02T09:05Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Claim: PM loop round 11 · 2026-11-02T09:18Z
Session:
session_01QsR2jRbeD6sscgnYJiqhny(card thread, os-dev); dispatched by seat sessionsession_01QsR2jR7ZFkpqmm4U8S1f9yAccount:
zhuangjianguoBranch:
claude/project-thread-mccp47(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29175Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx(the footer row), its tests, and a changeset (stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: defaultClause-②: no
Metadata-protocol: none
Responsibility:
a view that offers CSV, XLSX and JSON export shows only two of them, because the third is clipped past the Display popover's edge | the footer is already flex-wrap, and only the inner refresh-and-export group does not wrap | every user who exports a listThread-read: 6573225817
Premise: holds (at
7fa9873f, measured by QA: the footer scrollWidth is 440 against a clientWidth of 318, and Export as JSON spans past the popover)Serial constraints cleared: PR #29108 (#28915) edits the same file and is in the merge queue; merge main after it lands
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jRbeD6sscgnYJiqhny
os-dev-report
Report written 2026-11-02T10:21Z for PR #29252 at head fb87f20.
{ "issue": 29175, "status": "done", "branch": "claude/project-thread-mccp47", "pr": "https://github.com/objectstack-ai/objectstack/pull/29252", "session": "session_01QsR2jRbeD6sscgnYJiqhny", "head": "fb87f20e", "premise_still_valid": true, "summary": "Re-measured on main ea150b7f (after PR #29108): the footer still put Refresh and the export entries in one non-wrapping ml-auto group. Chosen shape: the export entries get their own full-width row (basis-full, test id display-export-group); that row is flex-wrap because three entries (~400 px) exceed the 304 px content box, so JSON wraps to a second export line. Reset and Refresh stay on the first row (Refresh now carries ml-auto itself). Width, labels, onExport behaviour, grant gating and all existing test ids unchanged; no i18n key.", "tests": "New ViewSettingsPopover.exportFooter-29175.test.tsx 3/3 (CSV/XLSX/JSON reachable by role, inside display-export-group with flex flex-wrap basis-full, onExport per format; Refresh/Reset outside the export row; no row with no formats). Ablation: main's ViewSettingsPopover.tsx on disk -> 2 failed / 1 passed, restored via git checkout HEAD, blob hash matched. plugin-list full suite locked --maxWorkers=2: 183 files / 1750 tests on 9ec8995d, 183 files / 1752 tests on fb87f20e after merging main. turbo type-check @object-ui/plugin-list (tsc + tsconfig.test.json) exit 0. pnpm --dir ui exec vitest run scripts/: 169 passed, 2 skipped.", "measurement": "Chromium, popover open with CSV/XLSX/JSON: 1440x900 before popover 1073..1393, footer scrollWidth/clientWidth 440/318, JSON 1380..1514 outside and not hit-testable (matches the card exactly); after 318/318, JSON 1250..1384 on a second line, all three inside and hit-testable. 1024x768 before JSON 964..1098 outside; after inside. 375 px (phone, panel 343 px): before 440/341, JSON to x 441 past the viewport; after 341/341, all inside. Footer fits at 375 px; nothing else overflows there. Screenshots and measure.json in project files issue-29175/.", "gates": "dispatch-gates --commands: 34 families; all 34 exit 0; --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Body gates against the exact PR body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. check-sdui-manifest exit 0. Ratchet families re-run on fb87f20e: type-check-coverage, type-check-debt, query-options-erasure, test-source-alias, published-files exit 0. CI check-runs: in_progress at report time.", "line_budget": "3 files, +145 / -19 (164 changed lines), under 3000", "files_changed": [ ".changeset/29175-display-export-row.md", "ui/packages/plugin-list/src/__tests__/ViewSettingsPopover.exportFooter-29175.test.tsx", "ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx" ], "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "deviations": [ "The ruling offers wrap OR own row; the own row alone cannot hold three entries in 304 px, so the own row also wraps. Named in the PR body as own row (wrapping).", "Browser measurement used a temporary Vite entry under ui/apps/console rendering the real component (before = main's file) with the Console stylesheet, not a showcase boot; deleted afterwards, not in the diff. Its before numbers match the card's to the pixel.", "First type-check-debt re-run on fb87f20e exited 3 while the closure rebuild was writing dist; re-run alone exit 0.", "No PR assignee or reviewer set (brief rule 10); the harness's default assign step was skipped for that reason." ], "mcp_calls": "0 GitHub MCP calls", "api_writes": "2 relay writes: pr_create (objectstack#29252, read back 7215/7215 bytes identical), this report comment via post-stamped. git push x3 (not REST).", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Seat review · 2026-11-02T10:36Z · PR #29252 at
fb87f20e: ACCEPT (on the PR;Clause-②: no, no contract review owed). It goes to the merge queue now.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Landed · 2026-11-02T11:51Z · PR #29252 merged through the merge queue as
c2a5be03. Record: ACCEPT 6575011901 atfb87f20e(Clause-②: no, no contract review owed).c2a5be03~1)origin/main)data-testid="display-export-group"inui/packages/plugin-list/src/components/ViewSettingsPopover.tsxbasis-full flex-wrap items-center justify-endin the same file (the export row of its own, wrapping)The card closed through
Fixes.pm:dispatchedcomes off with this note.Generated by Claude Code