Repository navigation
fix(app-shell): Studio Access pillar polish — plain-words draft race refusal, OWD banner clears on revert, live rail label, field table count and pinned name column - #27148
Merged
Conversation
…refusal, OWD banner clears on revert, live rail label, field table count and sticky name column Claude-Session: https://claude.ai/code/session_01JQwxbYZa5ViBSW4Et4fr91 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对ACCEPT · seat 席位意见:Access 支柱四处小修可以落地:草稿抢先创建的拒绝按错误码改成作者能懂的话,OWD 总览撤回到「No changes」后拒绝提示消失,草稿保存后左侧列表重读标签,字段子表计数挪到筛选框旁、字段名列横向滚动时固定。第五项(恢复已忽略的建议绑定)服务端没有接口,已立服务端卡 #27149。
Generated by Claude Code |
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 Warren · project thread
Fixes #26846
Clause-②: no
Metadata-protocol: none
维护者速读
@object-ui/app-shell三个组件与@object-ui/i18n新增一个键,无契约、无服务端改动;回滚即 revert 本 PR。StudioDesignSurface.tsx(AccessPillar 的创建拒绝映射与矩阵保存后重读列表)、PackageOwdOverviewPanel.tsx(回到无改动时清除拒绝)、PermissionMatrixEditor.tsx(字段子表的计数位置与固定列)。pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design/PackageOwdOverviewPanel.refusalClearsOnRevert-26846.test.tsx packages/app-shell/src/views/studio-design/StudioDesignSurface.accessRailLabelLive-26846.test.tsx packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.fieldTableLayout-26846.test.tsx packages/app-shell/src/views/studio-design/StudioDesignSurface.accessCreateTaken-26836.test.tsx,预期 4 个文件、15 个测试全绿。What changes
Each item was re-reproduced on
origin/main07d18e69first (the QA run was at3fcafcd3).findTakenIdentifierbefore its save and refuses a taken identifier with an author-facing notice, writing nothing. The server's first-write-pin sentence still reached the dialog in the window between that check and the save, and the existing race test pinned it verbatim.AccessPillar.doCreatenow reads that refusal by its code: this create always sends the pin (ifNoneMatch: '*'), soMETADATA_CONFLICTmeans the identifier holds a draft, and the dialog showsengine.studio.access.createDraftTaken(en + zh, new in@object-ui/i18n). Any other refusal keeps its own text. The server message is unchanged.PackageOwdOverviewPanel(the Access pillar's sharing-baseline overview), not inPermissionMatrixEditor. ItssaveErrornow clears on the dirty-to-clean transition, when every row is back at its loaded value ("No changes"). A row that is still dirty keeps the banner.onDraftSavedinAccessPillarupdated only the draft-name set; the rail list was read on mount, publish and the live-metadata pulse. That callback now also calls the pillar's ownload(), so a label an autosave changed shows at once, with no polling.min-w-[1304px]floor, wider than the Studio content column beside the rail at 1440 px, so the field sub-table'sml-autocounter sat past the visible edge of the scroll container. The counter now sits right after the field filter (shrink-0 whitespace-nowrap), and the field-name header and cells carryFIELD_NAME_CELL(sticky left-0 z-[1] bg-background), so the column stays in view while the matrix scrolls sideways. The sub-table is shared, so the non-Studio matrix page gets the same.GET /security/suggested-bindings,POST …/:id/confirmandPOST …/:id/dismiss;confirmAudienceBindingSuggestionin plugin-security refuses any row whose status is notpending("only pending suggestions can be accepted"), and no route re-opens a dismissed row. Per the dispatch order no endpoint is invented here; the seat can file a server-side card.Why
Five small Access-pillar defects measured in one Studio QA pass (#26846). Triage graded them p3 together: "One PR is fine."
Tests
All at head
8220f32d(after mergingorigin/main, which brought #26999 into the same two files).PackageOwdOverviewPanel.refusalClearsOnRevert-26846.test.tsx: a revert to the loaded value clears the banner; CONTROL: a still-dirty edit keeps it.StudioDesignSurface.accessRailLabelLive-26846.test.tsx: the realAccessPillarwith a matrix stand-in that reports one draft save; the rail row goes from "Dispatcher" to "Dispatcher v2".PermissionMatrixEditor.fieldTableLayout-26846.test.tsx: the count is the filter's next sibling and has noml-auto; the name header and every name cell carry the pinned classes; CONTROL: a box cell is not sticky. jsdom lays nothing out, so this pins structure and classes, not pixels.StudioDesignSurface.accessCreateTaken-26836.test.tsx: the race test now expects the author-facing sentence and the absence of the pin sentence; a new CONTROL keeps aVALIDATION_ERRORrefusal's own text.Runs
Test Files 4 passed (4),Tests 15 passed (15)(lock VERDICT command-exit 0).PermissionMatrixEdit,AccessPillar,PackageOwdOverviewPanelor anengine.studio.access.key (65 files):Test Files 65 passed (65),Tests 595 passed (595)(lock VERDICT command-exit 0, 5m37s).pnpm --filter @object-ui/app-shell run type-checkexit 0;pnpm --filter @object-ui/i18n run type-checkexit 0;pnpm --dir ui run type-check:scriptsexit 0.scripts/ablation-replace.mjswith the restore proved by blob equal to HEAD and an emptygit diff HEAD:METADATA_CONFLICTtest replaced byfalse: the race test fails, 9 others pass.void 0;: the revert test fails, its CONTROL passes.void load();deleted: the rail-label test fails. (A first attempt that replaced the line was refused by the tool before any run, the replacement count not rising; the delete form ran.)FIELD_NAME_CELLemptied: the pinned-column test fails, the counter test passes.ml-auto …: the counter test fails, the pinned-column test passes.Acceptance notes
_draftsrow label (ruling 6053526025, question 1). A label edit on a published set's pending draft therefore still shows the published label until publish; this PR does not change that reading.min-w-[1304px]floor against the Studio column width, not measured in a browser at 1440 x 900.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat8220f32d): 34 commands, all exit 0;--ranreconciliation: "34 derived famil(ies) accounted for — 34 run, 0 NOT-MEASURED". Also run outside the derivation:pnpm check:changeset-fixedexit 0 andpnpm --dir ui run check:new-line-citationsexit 0 ("0 new citation(s)").dispatch-gates --tier: no path-derived mandate; 349 changed lines (+341 / -8), under the 3000 threshold..changeset/26846-studio-access-polish.md:@object-ui/i18npatch (new key),@object-ui/app-shellpatch.Human Minimum
packages/specholds no runtime logic. (untouched)pnpm lintis CI's.main, one pull request.packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code