Repository navigation
refactor(app-shell): a permission set's advanced facets pick with the shared Select (objectui#11865) - #12017
Merged
objectstack-fleet[bot] merged 1 commit intoOct 9, 2026
Conversation
… shared Select (objectui#11865) An RLS policy's operation and a tab's visibility were browser-native selects. They now use the shared Radix Select through one module-private FacetPicker, the pattern the card's earlier slices landed: items carry index tokens, a stored value outside the options shows as its own item, and read-only disables the trigger through the primitive. Each pick hands the option's own value to the same draft update as before. The conversion is restored from PR objectui#12000's history (commit 703fb04), where it was put back for first-load bytes only, and re-verified against today's main. The pin gains the fourth picker's rows, a stored empty operation, and the empty-key row the Add tab button creates, each against literals read from the native control on main. Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
objectstack-fleet
Bot
deleted the
claude/issue-11865-access-facets-select
branch
October 9, 2026 01:43
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.
Part of #11865
Clause-②: no
Slice k of the card's claim (comment 6071773793): the permission set's advanced facets. An RLS policy's operation and a tab's visibility, the two native select elements in
PermissionAdvancedFacets, now pick with the sharedSelectthrough one module-privateFacetPicker. That is the pattern the card's landed slices use (objectui#11976 through objectui#12013).What changes
FacetPickeris module-private, not exported. Its items carry index tokens, so a stored value that no option carries gets an item of its own, labelled with the value. That holds even for'', whichSelectItemrefuses. Picking that item writes nothing.setPolicies/setTabsupdate the nativeonChangemade.writablefalse, each trigger is disabled and wearsSelectTrigger's own disabled look. The native selects were disabled the same way.data-testidvalues:rls-operation-plus the policy index, andtab-visibility-plus the tab key. These are DOM attributes only.Prior work. This conversion first rode PR objectui#12000's branch (commit
703fb048c). Commit93fdcf2put it back for first-load bytes only, under the seat's ruling6067513366. Today'smaincarries the same base blobs for both edited files (1a922755and38dd28a1), so the conversion is restored from that history byte for byte. Everything below is re-measured onmain5d77c099bfrom scratch. The pin gains three things: the fourth picker's four rows, a stored empty operation, and the empty-key row the Add tab button creates.H1 to H4, measured
main's blob. It fired a change event on every option of all four native selects as mounted (two policies, two tabs) and recorded, as JSON text, the draft eachsetDraftupdater produced. The pin'sWRITEStable checks every option of every picker against those literals, 18 rows in all.''arises only as a stored value, pinned under H3.disabled:classes, and does not open. CONTROL: when writable, the same triggers are enabled.readand a visibilitydefaultshow as themselves. The native selects showed "all" and "Visible" there. The outside item is listed first, and re-picking it writes nothing.''gets its own item; the native select showed "all". Picking "insert" writes the literal the native control wrote.First-load bytes
Measured with
apps/consoleCI=true pnpm exec vite build, under the verify lock, with both legs in this worktree at5c72930b4. The head leg builds the tree as committed. The base leg builds it with the panel atmain's blob; the landing and the restore were proved by hash, andgit diff HEADread 0 bytes afterwards. The other three files of this diff are tests and a changeset, which the console bundle does not carry, so the base leg ismain's bundle.main5d77c099b(panel at its blob)5c72930b4srcchunk grows by 341 B raw and 191 B gzip.PermissionAdvancedFacetsships there: the base leg'ssrcchunk holds itsperm.rls.checkPlaceholderkey, andsrcis the head leg's only grown chunk.srcchunk's hashed name inside it changed.Tests
PermissionAdvancedFacets.sharedSelect-11865.test.tsx, 28 tests.PermissionMatrixEditor.packageDoorFacets.test.tsxauthored a tab visibility with a change event on the native select. It now opens the trigger and picks Hidden, as a user does.5c72930b4. The panel was then written back tomain's blob1a922755, proved by hash (2 native selects, 0FacetPicker).packageDoorFacetsread30 failed | 1 passed (31), VITEST-EXIT 1. The predicted direction was red.packageDoorFacetscases that author a tab visibility. Green: its third case, which authors none.git checkout HEAD --on the absolute path. Proof: hash4244a1c8equals the HEAD blob,git diff HEAD0 bytes, 0 status entries.distis involved.Gates on HEAD
5c72930b4pnpm exec vitest run --maxWorkers=2, lock VERDICT command-exit 0:Test Files 43 passed (43),Tests 389 passed (389). The run covers 41 suites plus the two repo-wide pins,column-identity.ratchetandone-authority-per-exported-name-6273. The 41 are the suites agit grepnames for the facets, the permission matrix, RLS, tab visibility or the Access pillar. They include the facets' own suites and the pin, the 17PermissionMatrixEditor.*suites, the CEL field and test-run suites, and the fourStudioDesignSurfaceaccess suites.pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json): exit 0. It ran afterpnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' run build(Scope: 29 of 47, exit 0). By--listFilesOnly, the panel is in both programs and both test files are in the test program.pnpm exec eslinton the 3 touched .tsx files: exit 0, 0 errors, 8 warnings. All 8 are onmain: each modified file's per-rule multiset equals itsmainblob's, via--stdin. The new pin has none.check-changeset-presence: "3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)";check-changeset-no-major,check-changeset-fixed,check-changeset-overwrite,check:changeset-claimsandcheck:pending-changeset-literals;check:new-line-citations: "0 new citation(s)";check:control-bytes,check:test-path-roots, and the threecheck:vi-mock-*gates;check:unreferenced-sources,check:i18n-keys,check:metadata-write-doors,check:handler-key-readsandcheck:self-import.pnpm testfarm and repo-widepnpm lint.Files
packages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.tsxpackages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.sharedSelect-11865.test.tsx(new)packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.packageDoorFacets.test.tsx.changeset/11865-k-permission-facets-shared-select.md, a patch for@object-ui/app-shellNo docs edit.
packages/app-shell/README.mdnames the facets without naming a control kind, andcontent/docsdescribes neither picker.Acceptance notes
mainas now; the dispatch asks each control to keep the name it has today. Naming them would need new i18n keys, which this slice may not add. Not filed: it is a11y polish, and no public door was measured.Implemented by an
os-devsubagent of thedomain:uiseat 2, sessionhttps://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU.Generated by Claude Code