Skip to content

Studio Access: scrolling the permission matrix sideways hides the field Read and Edit boxes under the sticky name cell #29677

Closed

Description

@objectstack-fleet

epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848

Filing gate: ① a measured break. Filed on the maintainer's word in direct chat with the epic PM seat, 2026-11-03: 「发记录并立卡」. ⛔ Not a claim.
QA-source: #29672 · studio-authoring.permission-matrix-editor-ux · off-clause
Reader: domain:ui.
Dedupe: permission matrix sticky. New.
type: Bug

Runner reading on main at 3482f3d8d2, on two fresh loads, not re-derived by the PM seat. Studio Access, a writable set, expand an object, scroll perm-matrix-pane to the right. The sticky perm-field-name-OBJ-FIELD cell (697 px wide) covers both field boxes: document.elementFromPoint at the box centre returns that cell from scrollLeft 80 up, and not at 0, 40 or 57. The matrix needs that scroll below 1304 px of pane width, so a narrow pane cannot reach them.

Wanted: the boxes stay reachable while scrolled. Add the clause to the item, whose clause 5 covers only the Bulk column.

Links back: #29672.

Activity

  1. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:ui kept · pm:queue · 2026-11-03T01:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Claim: PM loop round 10 · 2026-11-03T02:05Z
    Session: session_01QsR2jTaAUD6ttuQLjbPsrZ (card thread, os-dev); dispatched by seat session session_01QsR2jRFuJz9QBZqPVHYVhJ
    Account: zhuangjianguo
    Branch: claude/project-thread-4j0nrd (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29677
    Domain: domain:ui
    Seat: domain:ui#2 (seat 3 left it to this seat)
    File surface: ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx (the matrix scroll pane and the sticky field-name cell only), the QA checklist item studio-authoring.permission-matrix-editor-ux (a new clause, rev bump, append-only history row), tests, one changeset. Stop on breach; explain in the report
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier on the final file list), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: scrolled sideways, the Studio permission matrix's sticky field-name cell covers the field checkboxes | below 1304 px of pane width a person cannot reach a field's read/edit boxes | administrators editing field permissions in Studio Access
    Thread-read: none
    Premise: the filer's runner reading on main 3482f3d8d2 (elementFromPoint at the box centre returns perm-field-name-OBJ-FIELD from scrollLeft 80 up), not re-derived; the os-dev measures it before code.
    Serial constraints cleared: #29674 (this seat, branch claude/project-thread-uytq10) edits the same file in other hunks (package-scope object list, stats); merge main before pr_create, and serialize behind it if hunks meet

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jTaAUD6ttuQLjbPsrZ
    os-dev-report

    {
      "issue": 29677,
      "status": "done",
      "branch": "claude/project-thread-4j0nrd",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29744",
      "head": "9d196c52",
      "session": "session_01QsR2jTaAUD6ttuQLjbPsrZ",
      "premise_still_valid": true,
      "premise_note": "Re-measured on main at c76cdebf in the real Console (Vite on source, app-crm, 1000 px window): metadata-admin rendering pane 1000/1304, name cell 705 px, Read/Edit boxes 18/18 hit at scrollLeft 0/40/57, 9/18 at 80, 0/18 at 200 and 304; Studio Access rendering pane 760/1304, name cell 720 px, 0/18 at 0 (off pane), 9/18 at 40/57, 0/18 from 80. Every covered box answered perm-field-name-crm_account-FIELD. Matches the card's reading.",
      "summary": "Cause: the field sub-table is w-full in one cell spanning the 1304 px matrix, so its only unsized column (the name) took ~697 px, and FIELD_NAME_CELL pinned it sticky left-0 over the boxes. Fix in PermissionMatrixEditor.tsx only: FieldsSubTable's root carries FIELD_PANEL (sticky left-12 max-w-[calc(100cqi-6rem)]) so the whole panel holds at the cell's inset and is no wider than the pane; both MatrixScrollPane call sites pass MATRIX_PANE (flex-1 @container); the name th/td lose their pin (FIELD_NAME_CELL removed). Live after: 18/18 boxes hit at every offset on both renderings. QA item permission-matrix-editor-ux rev 10: acceptance[6], steps[8] (B5), negative[2], automated.ref names the new spec.",
      "files_changed": [
        ".changeset/29677-permission-field-panel-scroll.md",
        "docs/qa/platform-checklist/areas/studio-authoring.json",
        "ui/e2e/permission-field-panel-scroll.spec.ts",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.fieldTableLayout-26846.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.gridChrome-27866.test.tsx"
      ],
      "line_budget": "541 additions, 33 deletions over 6 files; source PermissionMatrixEditor.tsx +28/-11; the new Playwright spec is ~450 lines; QA JSON +22. Under the 3000-line human-merge threshold.",
      "tests": "New ui/e2e/permission-field-panel-scroll.spec.ts (Playwright, discovered by ui/playwright.config.ts testDir ./e2e, run by the required Build & E2E UI job via pnpm --dir ui run test:e2e --project=chromium): real PermissionMatrixEditPage bundled from source, stubbed metadata client, real Tailwind; elementFromPoint at every Read/Edit box and name over offsets 0,40,57,80,120,200,320,480,far end; 6 cases (studio and environment at 1000/720 px; CONTROL 1600 px; no-bind 1600 px): 6 passed at 9d196c52. jsdom class-contract pins (fieldTableLayout-26846 on both renderings: panel sticky left-12 max-w, 48 px inset, @container on the pane, names not sticky, boxes inside the panel; gridChrome-27866 name header no left-0): with fieldBulk and readonly 4 files / 26 tests passed at 9d196c52. Ablation (main's PermissionMatrixEditor.tsx, blob aa5d4f53 = origin/main, under a trap; restored to HEAD blob a0b449fd, git diff HEAD empty): spec 4 sweep cases red 'Read box of amount at scrollLeft 80 (pane 1000/1304) is covered by td[data-testid=perm-field-name-a_project-amount]', CONTROL green, no-bind red; jsdom 4/12 red. Neighbour sweep at 5799825f: 52 files / 368 tests passed. app-shell type-check exit 0; tsc -p ui/tsconfig.e2e.json exit 0; eslint on the 4 touched ui files 0 errors (19 pre-existing warnings).",
      "gates": "dispatch-gates --commands at 5799825f: 42 derived, 42 run, all exit 0 (incl. check-sdui-manifest, check:platform-checklist, pnpm --dir ui exec vitest run scripts/ 170 files/4977 tests under the lock, check:type-check-debt under the lock); --ran reconciled: 42 run, 0 NOT-MEASURED. After merging main (12 commits, none in touched files) at 9d196c52: app-shell closure rebuilt (65 tasks), check-sdui-manifest, check:platform-checklist, check-changeset-no-major, check:nul-bytes exit 0. PR-body gates on the final body: check-changeset-no-major 0, check-adr-0087-registration 0, check-closing-keyword-parity --body binds only #29677, check-partof-closing-keyword 0. dispatch-gates --tier: no path-derived mandate; default tier. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
      "measurement": "Live: objectstack dev --seed-admin --fresh (app-crm) + console Vite on source; writable env-scope set qa_field_scroll at /studio/~all/metadata/permission/qa_field_scroll and Studio Access /studio/com.example.crm/access?item=crm_sales_user, 1000 px window. Before/after screenshots at scrollLeft 0, 200, far end: /mnt/project-files/issue-29677/screens/. Servers torn down (ports 38677, 5197 empty).",
      "deviations": [
        "Fix pins the whole field panel (FieldsSubTable root div) rather than only editing the field-name cell; accepted by the seat before code review (same file, serves the claimed fix).",
        "The geometry test is a new Playwright spec in ui/e2e (tests are in the surface); the jsdom class-contract pin was extended to both renderings at the seat's request."
      ],
      "mcp_calls": "GitHub MCP reads only: issue_read x3 (card body, comments x2), list_pull_requests x2 (#29674's branch PR state). No MCP write.",
      "api_writes": "2: fleet-write pr_create (PR #29744, body read back 9381/9381 bytes identical, no assignees) and this os-dev-report comment via post-stamped. Plus git push (not a REST write).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: Studio Access /studio/com.example.crm/access?item=crm_sales_user at a 1000 px window, expand crm_account, scroll the matrix to its far end: on the expanded (or hovered) object row the object boxes scrolled under the pinned Object cell show through it (its row tint is not opaque); same on main (screens before-studio-scroll544.png / after-studio-scroll544.png) · dedupe: permission matrix sticky object cell tint, show through"
      ]
    }
  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Landed · 2026-11-03T03:54Z · PR #29744 merged through the queue as cba12d22; the merge commit carries all 6 files of the accepted head 9d196c52 (FIELD_PANEL / MATRIX_PANE in PermissionMatrixEditor.tsx, the QA item studio-authoring.permission-matrix-editor-ux rev 10, the browser geometry spec, two updated jsdom pins, the changeset). Delivered in full: every field Read and Edit box stays reachable at any sideways scroll of the permission matrix; pm:dispatched removed. Noted, not filed: on an expanded or hovered object row, scrolled object boxes show faintly through the pinned Object cell (same on main, cosmetic).

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions