Repository navigation
feat(app-shell): the permission-set editor shows the Export column, and Assigned Users no longer covers the grid - #26955
Merged
Conversation
…nd Assigned Users scrolls under the grid The matrix lists Export (allowExport) between Delete and Transfer, as the position summary does, on the routed page and the Studio Objects tab. It is an opt-in grant: the R, CRUD and All buttons leave it as it is, and All says so on its tooltip. The Setup page's Assigned Users panel moves into the matrix's own scroll, after the grid, instead of a 35vh strip pinned under it, and the filter bar wraps on a phone. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jURizai1Jspt8sbMXk
…rs move Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jURizai1Jspt8sbMXk
Below md the chrome above the matrix is taller than the screen, so the grid's own scroll box was about 120px tall at 390x844. There the column now takes its content's height and PageShell's body scrolls it; from md up the matrix keeps its own scroll. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jURizai1Jspt8sbMXk
…cle pair ObjectPerm now declares allowExport (the matrix's Export column), so the EMIT-SIDE case's example of a key the shape omits moves to allowRestore, which the spec still accepts. The gate header's list of omissions is corrected to match. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jURizai1Jspt8sbMXk
Contributor
Author
席位核对ACCEPT · seat
Landing: no contract review is owed (no published schema, no governed text, |
This was referenced Oct 28, 2026
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.
Requested by Steedos · project thread
Fixes #26885
Clause-②: no
Metadata-protocol: none
维护者速读
allowExport),位置在删除与转移之间,和岗位页摘要的顺序一致,可以看到并勾选。Setup 页的「已分配用户」面板从网格下方固定的 35% 高条带,移到网格自己的滚动区里、排在网格和高级设置之后;手机宽度下整页一起滚动。ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx的getObjectActions(新增optIn的 Export 行)、bulkSetObject(bulkKeys排除导出)、页面主体(perm-assignments移进网格滚动区,外层md:h-full md:overflow-hidden);PermissionMatrixEditor.exportColumn-26885.test.tsx。pnpm --dir ui exec vitest run packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.exportColumn-26885.test.tsx,预期 9 个测试全绿。What changes
getObjectActionslistsallowExport(E, "Export records"; zh 导出记录) between Delete and Transfer, the orderpreviews/PermissionPreview'sCAPSuses for the position summary. Both renderings read that list, so the routed Setup page's table and the Studio Access pillar's Objects tab both gain the header, the per-row checkbox (toggled throughupdateObjectPerm, like Transfer) and the legend entry (engine.studio.access.legend.export).ObjectPerminpermission-slice.tsdeclares the key (one line), soObjectPermFlagcovers it.optIn: true;bulkSetObjectresets and grants only the other columns (bulkKeys). So R, CRUD and All neither set nor clear Export, which is what they did before this change too, when the key rode through unmodelled. "All" gets a tooltip saying so (perm.bulk.allTip). "None" still replaces the row with{}, unchanged. Reason for the choice:allowExportis the opt-in, high-privilege export axis (packages/spec/src/security/high-privilege.ts, the ADR-0090 D5 list), whose point is that export is granted deliberately; a button labelled "All" quietly granting bulk egress would undo that. The bulk-arm pins inPermissionMatrixEditor.bulkMergeKeys.test.tsxhold unchanged; only their comments are updated.perm-assignmentspanel moves from ashrink-0 max-h-[35vh]strip under the matrix into the matrix's own scroll box, after the grid and the advanced facets.mdthe editor's column takes its content's height (md:h-full md:overflow-hidden), soPageShell's body scrolls the chrome and the grid together. Frommdup nothing changes. The filter bar wraps (flex-wrap, inputw-full sm:w-72).studionamespace rows in@object-ui/i18n,enandzh. One root changeset:@object-ui/app-shellpatch,@object-ui/i18npatch.packages/spec/**, no server change, no new metadata key.Tests
PermissionMatrixEditor.exportColumn-26885.test.tsx, nine cases on the realPermissionMatrixEditPage, asserting the saved payload:Eheader sits betweenDandTr, titled "Export records";allowExport: false; ticking savesallowExport: trueand nothing else;PermissionMatrixEditor.retiredLifecycleKeys.test.tsx: the live column set now includesE(the pin's purpose is the exact set).Acceptance notes
pnpm dev:crm -- --fresh, Setup → Permission Sets →crm_sales_user, 83 objects, the built Console from this branch). At 1440×900: the grid's scroll box is 441px tall with 9 object rows fully on screen, the panel sits after the grid at the end of that scroll, no horizontal page overflow. At 390×844: once the page is scrolled to the grid, 12 rows are on screen (before the phone change, the grid's own box was 121px tall with 2 rows). "Only granted" is fully in view at both widths. The before reading (about 5 rows at 1440×900, none at 390×844) is the filer's, from the card's screenshots; I did not rebuild main to re-measure it. Screenshots are in the project files underissue-26885/.crm_sales_useris a code-package set, so it is read-only in the browser; toggling Export is covered by the tests above, not the browser pass.mdup).Verification
All at head
dafbeddd, in a worktree offorigin/main8074feb6, unless a line names another head.New tests, ablations, type-check and nearby suites
pnpm --dir ui exec vitest runonPermissionMatrixEditor.exportColumn-26885,.bulkMergeKeys,.retiredLifecycleKeysand.setupCatalog-7611underscripts/pm/os-verify-lock.sh:Test Files 4 passed (4),Tests 26 passed (26).node scripts/ablation-replace.mjs, anchorconst bulkKeys = OBJECT_ACTIONS.filter((a) => !a.optIn).map((a) => a.key);replaced byconst bulkKeys = OBJECT_ACTIONS.map((a) => a.key);, anchor x1 to x0):Tests 3 failed | 6 passed (9), the three bulk cases ("All" grants every other column but not Export, "R" and "CRUD" keep a granted Export). Restored, blob equal to HEAD (b1f94509ca8b). The tests import the editor from source, so no build sits between mutation and run.origin/main'sPermissionMatrixEditor.tsx(written to disk, restored from HEAD under a trap, blob checked): "renders in the matrix's own scroll, after the grid" fails (expected false to be true).pnpm --filter @object-ui/app-shell run type-check && pnpm --filter @object-ui/i18n run type-checkunder the lock:VERDICT command-exit 0(app-shell's covers the test files).3c942530(the later commit touches onlyui/scripts/): every app-shell test file namingPermissionMatrixEdit,permission-slice, aperm.action/perm.bulk/engine.studio.accesskey orAccessPillar(52 files), plus all ofpackages/i18n/:Test Files 141 passed (141),Tests 1756 passed | 13 skipped (1769). CI's Test UI runs the rest of app-shell.pnpm run check:i18n-designer-parity(fromui/): "Every en row has a zh row, and every shared row carries the same placeholders."pnpm check:new-line-citations(fromui/):0 new citation(s).Browser measurement
Chromium (Playwright),
pnpm dev:crm -- --freshon a private port, the Console built from this branch (turbo run buildthenpnpm console:build), signed in as the seeded admin,/_console/apps/setup/metadata/permission/crm_sales_user?scope=environment:Object C R U D E Tr VA MA Read scope Write scope Bulk; the grid's scroll box is 441px tall from y=459, 9 object rows fully on screen;perm-assignmentsinside that box, after the grid; "Only granted" in view; no horizontal page overflow.9ee0f570, the grid's own box was 121px tall with 2 rows.Derived dispatch gates (34/34)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 34 commands atdafbeddd; every one exited 0, the PR-body gates (check-closing-keyword-parity,check-adr-0087-registration,check-changeset-no-major) against this body.pnpm --dir ui exec vitest run scripts/under the lock:Test Files 178 passed | 2 skipped (180),Tests 5065 passed | 2 skipped (5067). Its first run at3c942530was red in one case:check-designer-field-key-parity.test.ts"stays EMIT-SIDE" namedallowExportas the keyObjectPermomits. That is no longer true, so the case now namesallowRestore(still accepted by the spec, still omitted), and the gate's header comment lists the current omissions.pnpm check:type-check-debtunder the lock:0 raw tsc error(s) total, none above its recorded number.dispatch-gates --ran:34 derived famil(ies) accounted for — 34 run, 0 NOT-MEASURED.pnpm check:nul-bytes: OK.Dogfood battery: not run, no
!in the title and no(narrowing)arm.Generated by Claude Code