Repository navigation
fix(app-shell): Setup walkthrough rows — one name for Setup, confirms before Disable and before switching a packaged action off, read-only reasons, forced-reset wording - #27849
Merged
Conversation
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
…object label Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
…'s label Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
…able header tags Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
…label form Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
…-uywna1 # Conflicts: # ui/packages/app-shell/src/views/metadata-admin/AssignedUsersSection.pickerColumns-27433.test.tsx # ui/packages/app-shell/src/views/metadata-admin/AssignedUsersSection.tsx
Claude-Session: https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 30, 2026
Contributor
Author
This was referenced Oct 30, 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.
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Requested by Bill · project thread
Refs #27521
Clause-②: no
Metadata-protocol: none
维护者速读
ui/packages/components/src/renderers/layout/containers.tsx(标签栏滚动与渐隐)、ui/packages/app-shell/src/views/setup/PackagedActionsSection.tsx(关闭前确认)、ui/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx(禁用确认与只读原因)。pnpm --dir ui exec vitest run packages/app-shell/src/views/setup/ packages/app-shell/src/views/metadata-admin/PackagesPage.readOnlyReasonAndDisableConfirm-27521.test.tsx,预期全部通过。What changes
Setup rows 1–23 of #27521 (row 6 is #27797), worked one by one against
main. Taken here (ui only):appLabeloverresolveKeyedI18nLabel), the name the app header shows, instead of the fixed "System Settings" / "Settings" strings; those strings stay only as the fallback when no app object is in hand. The Settings hub keeps its title: it is a page inside Setup ("All Settings" in the sidebar), not the app.infoorwarningwith no declared colour now reads blue or yellow fromSEMANTIC_COLOR_MAP(@object-ui/fields), instead of the hashed palette slot that drew Notifications'infoorange. A declared option colour still wins.ManagedByBadgealready opens its explanation on hover (measured on main); the tag now takes focus (tabIndex=0), which opens the same tooltip.PASSWORD_RESET_REQUIREDthe overlay draws its own body (auth.remediation.password.resetBody: an administrator set a temporary password) instead of the server's sentence, which repeated the title in English for a French user; the first field is "Temporary password" (auth.remediation.password.temporary). An expired password keeps the server's sentence and "Current password". Both keys in all ten packs.page:tabsstrip wider than its box scrolls sideways (overflow-x-auto, triggersshrink-0) and fades at each edge that hides a tab;useHorizontalOverflow(package-private, not exported) re-reads the edge on scroll and resize intodata-overflow. The bottom rule became an inset shadow so the active underline still draws over it once the strip clips at its padding box. Measured on the user record at 1440:scrollWidth1269 in a 1088 box, cut with no cue before; now it scrolls and readsend/both/start.useObjectLabel) over the machine name. On a phone the fixed column widths apply fromsmup, long machine names break, and cells pad less: measured at 390, both tables went fromscrollWidth523 / 537 in a 342 box to 342 / 342. Not touched: Setup › Packaged automation: a packaged action switched off keeps its button on the record page, and clicking it shows a toast naming sys_metadata_activation and ADR-0126 #27504's question (whether a switched-off action's button stays on the record page).scope: 'project'), read-only here (scope-less read-only), or part of the platform (system / cloud, reworded from "platform kernel package"). Disable asks first; Enable runs at once. "Delete app" becomes "Delete package" (keyengine.packages.detail.deletePackage). Installed Apps gets its own subtitle.Fixed on main, not changed here:
createDeriveslugify onpermission; typing "Field Ops Lead" fillsfield_ops_lead).Carded, filed from the paragraphs in the
os-dev-reportcomment on #27521: rows 2 (#27853), 3 (#27854), 4 rest (#27855), 10 Create User half (#27857), 12 Create User result line (#27858), 13 rest (#27859), 14 (#27861, #27862), 15 columns (#27863), 16 field order and stacked messages (#27864, #27865), 17 (#27866, too large for this PR), 19 (#27867), 22 rest (#27869). Each one's text, labels or layout comes from server or spec metadata (service-settingsmanifests,platform-objects,plugin-auth,packages/spec/src/security/permission.form.ts), or is its own ui card (row 14's registry-label read face, row 16's stacked messages inResourceEditPage, row 17's grid).Will not do:
active = true; "No records match this view's filter" is the accurate sentence there, and first-run copy would misstate a view that hides inactive rows.RowActionMenu,data-table); changing it for Setup alone would split one pattern in two.Later, separate PR: rows 7, 8, 9, 10 (Invite half), 11 and 23 touch the Invitations surface. #27797 is blocked behind server card #27843, so these rows wait for #27843 to land.
AppSwitcher.homeMenu-12605(served label, any label),HomePage.greetingAndApps-12601service-settingsmanifests,plugin-webhooks)setup-nav.contributions.ts)badge-severity-27521ManagedByBadge.keyboard-27521plugin-authrefusal,sys-user.object.tsparamsRemediationOverlay.passwordResetRequired-12365(new describe),forcedResetNewPasswordpage-tabs-overflow-cue-27521ResourceEditPagePackagedActionsSection.test§6; phone layout measured in Chromium (jsdom lays nothing out)PackagesPage.readOnlyReasonAndDisableConfirm-27521Tests
New:
ManagedByBadge.keyboard-27521,badge-severity-27521,page-tabs-overflow-cue-27521,PackagesPage.readOnlyReasonAndDisableConfirm-27521, a describe inRemediationOverlay.passwordResetRequired-12365, §6 ofPackagedActionsSection.test, a case inAppSwitcher.homeMenu-12605. Existing pins updated for the new words: "Delete package", "Temporary password", the switch-off confirm (switchOffhelper), the Setup link's label.Acceptance notes
@object-ui/i18n'sde-quote-pairing-3876pins an exact count of quoted spans in the de pack; the new de strings follow the pack's own unquoted{{label}}form for the flow switch, so the count stands.@object-ui/i18n:engine.packages.detail.deleteAppis renamedengine.packages.detail.deletePackage; no other reader of the old key exists in the tree.Verification
All on head
5a54fd98(after mergingorigin/main,pnpm install --frozen-lockfileand a fullturbo run build, 114/114) unless a line says otherwise.Targeted tests — 483 files, 9777 passed, 0 failed
Before the merge, on
ed05c2ac:packages/components/src/__tests__/256 files / 2412 passed;console/home+layout152 / 974;components/+fields+ the ManagedBy pins 149 / 2940.Ablation — the Disable confirm
node scripts/ablation-replace.mjsonPackagesPage.tsx, anchoronClick={() => (enabled ? startAction(() => setDisableOpen(true)) : void toggleEnable())}→onClick={() => void toggleEnable()}: anchor x1 → x0, blob032c769d→41626a6b;PackagesPage.readOnlyReasonAndDisableConfirm-275212 failed / 6 passed (both (b) cases); restored: blob == HEAD032c769d,git diff HEADempty.Gates (local subset, exit codes captured before any pipe)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 34 families on2c0f76c9; each run:pnpm --dir ui exec vitest run scripts/first ran together withpackages/i18n/and went red onde-quote-pairing-3876(the new de strings carried „…“); fixed ined05c2ac, then green in the run above. The full ESLint run with--no-inline-configreports one pre-existing error incontainers.tsx(react-hooks/static-componentson the record-title read face, already disabled inline onmain); with inline config honoured: 0 errors.Browser (Chromium, stock `examples/app-showcase --seed-admin`, admin)
scrollWidth1269 in a 1088 box withoverflow: visibleon main; on the branch it scrolls,data-overflowreadsend→both→start, the active underline sits on the rule.scrollWidth523 / 537 in a 342 box on main; 342 / 342 on the branch; 1136 / 1136 at 1440.maxlength=2(row 19, carded).Generated by Claude Code