Repository navigation
Commit d07e8d1
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)
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
<!-- claude-projects-attribution: {"github_login":"os-bill"} -->
_Requested by **Bill** · [project
thread](https://claude.ai/code/project/chan_016iMXWSZDzqWRWvWzdNo8wg?thread=cmsg_016iMXWSZDzqWRWvWzdNo8wgP6XkfpjCfyzzG2KwQPUZfy)_
Refs #27521
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:Setup 走查建议的界面部分——首页链接与应用切换器统一用 Setup
应用自己的名称;软件包页说明只读原因、禁用前确认、改称「删除软件包」;打包自动化关闭动作前确认、成功后提示、显示对象名称、手机上不再溢出;强制改密页用控制台自己的译文并把字段叫「临时密码」;记录页标签栏可横向滚动并有渐隐提示;info/warning
不再显示成警报橙色;Setup 页眉标签可用键盘打开说明。
- 为什么改:#27521 是 18.3.0 RC 走查的建议卡,分诊要求每行要么做掉、要么建卡、要么给出不做的理由;这里是 Setup 第
1–23 行中只需改 ui 的部分。
- 风险与回滚:只动 ui 文案、确认框和布局,不改
spec、服务端或元数据协议;标签栏和严重度颜色是所有应用共用的渲染器,影响面最大;回滚即还原本 PR。
-
先看:`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):
- **Row 1 — one name for Setup.** Home's apps-strip link and the app
switcher's entry now read the Setup app's own served label (`appLabel`
over `resolveKeyedI18nLabel`), 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.
- **Row 4 (ui half) — info is not an alarm.** A select value `info` or
`warning` with no declared colour now reads blue or yellow from
`SEMANTIC_COLOR_MAP` (`@object-ui/fields`), instead of the hashed
palette slot that drew Notifications' `info` orange. A declared option
colour still wins.
- **Row 5 (ui half) — header tags explain themselves from the
keyboard.** `ManagedByBadge` already opens its explanation on hover
(measured on main); the tag now takes focus (`tabIndex=0`), which opens
the same tooltip.
- **Rows 12 and 22 (ui half) — the forced password change.** On
`PASSWORD_RESET_REQUIRED` the 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.
- **Row 13 (ui half) — record tab strips scroll.** A horizontal
`page:tabs` strip wider than its box scrolls sideways
(`overflow-x-auto`, triggers `shrink-0`) and fades at each edge that
hides a tab; `useHorizontalOverflow` (package-private, not exported)
re-reads the edge on scroll and resize into `data-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: `scrollWidth` 1269 in a 1088 box, cut with no cue before; now it
scrolls and reads `end` / `both` / `start`.
- **Row 20 — Packaged automation.** Switching a packaged action off asks
first (off stops it everywhere it is offered); switching on runs at
once. An accepted switch, action or flow, says so in a toast; a refused
one keeps its verbatim refusal and no toast. The Object column shows the
object's label (`useObjectLabel`) over the machine name. On a phone the
fixed column widths apply from `sm` up, long machine names break, and
cells pad less: measured at 390, both tables went from `scrollWidth` 523
/ 537 in a 342 box to 342 / 342. Not touched: #27504's question (whether
a switched-off action's button stays on the record page).
- **Row 21 — Packages.** The sheet says why a read-only package offers
no write action: loaded from code (`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" (key
`engine.packages.detail.deletePackage`). Installed Apps gets its own
subtitle.
Fixed on main, not changed here:
- **Row 16, name derivation** — New Permission Set derives Name from
Label on main (`createDerive` slugify on `permission`; typing "Field Ops
Lead" fills `field_ops_lead`).
- **Row 18** — the Add user picker shows email beside name: landed by
#27808 (card 27433) while this branch was open; the merge took main's
version.
Carded, filed from the paragraphs in the `os-dev-report` comment 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-settings` manifests,
`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 in
`ResourceEditPage`, row 17's grid).
Will not do:
- **Row 5, empty states** — Sharing Rules and Webhooks open on their
"Active" view, which filters `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.
- **Row 15, hover-only row actions** — the reveal on hover,
focus-within, selection and coarse pointers is the grid-wide pattern of
every list in the product (`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.
| Row | Answer | Pin or reason |
|---|---|---|
| 1 | taken | `AppSwitcher.homeMenu-12605` (served label, any label),
`HomePage.greetingAndApps-12601` |
| 2 | carded #27853 | server copy (`service-settings` manifests,
`plugin-webhooks`) |
| 3 | carded #27854 | server nav (`setup-nav.contributions.ts`) |
| 4 | taken (colour) · carded #27855 (rest) | `badge-severity-27521` |
| 5 | taken (keyboard) · fixed on main (hover) · will-not-do (empty
states) | `ManagedByBadge.keyboard-27521` |
| 6 | #27797 | — |
| 7, 8, 9, 10 (Invite), 11, 23 | waits on #27843, separate PR | — |
| 10 (Create User) | carded #27857 | `plugin-auth` refusal,
`sys-user.object.ts` params |
| 12 | taken (overlay) · carded #27858 (result line) |
`RemediationOverlay.passwordResetRequired-12365` (new describe),
`forcedResetNewPassword` |
| 13 | taken (tab strip) · carded #27859 (rest) |
`page-tabs-overflow-cue-27521` |
| 14 | carded #27861 (ui) · #27862 (server) | ui read face + server
grant message |
| 15 | will-not-do (hover) · carded #27863 (columns) | grid-wide pattern
|
| 16 | fixed on main (derivation) · carded #27864 (order) · #27865
(messages) | spec form + `ResourceEditPage` |
| 17 | carded #27866 | too large here |
| 18 | fixed on main by #27808 | — |
| 19 | carded #27867 | server manifest; "de" still refused, measured |
| 20 | taken | `PackagedActionsSection.test` §6; phone layout measured
in Chromium (jsdom lays nothing out) |
| 21 | taken | `PackagesPage.readOnlyReasonAndDisableConfirm-27521` |
| 22 | taken (overlay) · carded #27869 (rest) | as row 12 |
## Tests
New: `ManagedByBadge.keyboard-27521`, `badge-severity-27521`,
`page-tabs-overflow-cue-27521`,
`PackagesPage.readOnlyReasonAndDisableConfirm-27521`, a describe in
`RemediationOverlay.passwordResetRequired-12365`, §6 of
`PackagedActionsSection.test`, a case in `AppSwitcher.homeMenu-12605`.
Existing pins updated for the new words: "Delete package", "Temporary
password", the switch-off confirm (`switchOff` helper), the Setup link's
label.
## Acceptance notes
- `@object-ui/i18n`'s `de-quote-pairing-3876` pins 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.
- The tab-strip fade is a CSS mask on the sticky strip, so the strip's
own background fades with the tabs at that edge.
- `@object-ui/i18n`: `engine.packages.detail.deleteApp` is renamed
`engine.packages.detail.deletePackage`; no other reader of the old key
exists in the tree.
## Verification
All on head `5a54fd98` (after merging `origin/main`, `pnpm install
--frozen-lockfile` and a full `turbo run build`, 114/114) unless a line
says otherwise.
<details><summary>Targeted tests — 483 files, 9777 passed, 0
failed</summary>
```
pnpm --dir ui exec vitest run --maxWorkers=2 packages/app-shell/src/views/setup/ packages/app-shell/src/views/metadata-admin/PackagesPage packages/app-shell/src/views/metadata-admin/AssignedUsersSection packages/app-shell/src/console/__tests__/RemediationOverlay packages/app-shell/src/console/home/ packages/app-shell/src/layout/__tests__/AppSwitcher packages/app-shell/src/components/ packages/fields/src/__tests__/ packages/components/src/__tests__/page-tabs packages/i18n/ scripts/
Test Files 483 passed | 3 skipped (486)
Tests 9777 passed | 22 skipped (9799)
os-verify-lock: VERDICT command-exit 0
```
Before the merge, on `ed05c2ac`: `packages/components/src/__tests__/`
256 files / 2412 passed; `console/home` + `layout` 152 / 974;
`components/` + `fields` + the ManagedBy pins 149 / 2940.
</details>
<details><summary>Ablation — the Disable confirm</summary>
`node scripts/ablation-replace.mjs` on `PackagesPage.tsx`, anchor
`onClick={() => (enabled ? startAction(() => setDisableOpen(true)) :
void toggleEnable())}` → `onClick={() => void toggleEnable()}`: anchor
x1 → x0, blob `032c769d` → `41626a6b`;
`PackagesPage.readOnlyReasonAndDisableConfirm-27521` 2 failed / 6 passed
(both (b) cases); restored: blob == HEAD `032c769d`, `git diff HEAD`
empty.
</details>
<details><summary>Gates (local subset, exit codes captured before any
pipe)</summary>
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 34 families on `2c0f76c9`; each run:
```
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-sdui-manifest.mjs :: exit 0
node scripts/check-sdui-manifest.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:dispatcher-error-vocabulary :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:engine-double-contract :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-changeset-deadline-census :: exit 0
pnpm check:published-files :: exit 0
pnpm check:query-options-erasure :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:test-source-alias :: exit 0
pnpm check:tier-file-adoption :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:where-matcher :: exit 0
pnpm --dir ui exec vitest run scripts/ :: exit 0
pnpm --filter @object-ui/components run type-check :: exit 0
pnpm --filter @object-ui/fields run type-check :: exit 0
pnpm --filter @object-ui/i18n run type-check :: exit 0
pnpm --filter @object-ui/app-shell run type-check :: exit 0
eslint (changed ui files) :: exit 1
pnpm --dir ui check:new-line-citations :: exit 0
eslint (changed ui files, inline config honoured) :: exit 0
```
`pnpm --dir ui exec vitest run scripts/` first ran together with
`packages/i18n/` and went red on `de-quote-pairing-3876` (the new de
strings carried „…“); fixed in `ed05c2ac`, then green in the run above.
The full ESLint run with `--no-inline-config` reports one pre-existing
error in `containers.tsx` (`react-hooks/static-components` on the
record-title read face, already disabled inline on `main`); with inline
config honoured: 0 errors.
</details>
<details><summary>Browser (Chromium, stock `examples/app-showcase
--seed-admin`, admin)</summary>
- 1440: Home shows "System Settings" and the switcher "Settings" on
main; the Setup header shows "Setup".
- 1440, user record: tab strip `scrollWidth` 1269 in a 1088 box with
`overflow: visible` on main; on the branch it scrolls, `data-overflow`
reads `end` → `both` → `start`, the active underline sits on the rule.
- 390, Packaged automation: tables `scrollWidth` 523 / 537 in a 342 box
on main; 342 / 342 on the branch; 1136 / 1136 at 1440.
- 1440, Company: Country "de" answers "1 setting needs attention:
Country", input `maxlength=2` (row 19, carded).
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Utp6CZLnkdSxVfvNuQ6RgB)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent c0f9fdb commit d07e8d1
39 files changed
Lines changed: 789 additions & 66 deletions
File tree
- .changeset
- ui/packages
- app-shell/src
- components
- __tests__
- console
- __tests__
- home
- __tests__
- layout
- __tests__
- views
- metadata-admin
- setup
- components/src
- __tests__
- hooks
- renderers/layout
- fields/src
- __tests__
- i18n/src
- locales
- namespaces/studio
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
214 | 214 | | |
215 | 215 | | |
216 | 216 | | |
| 217 | + | |
| 218 | + | |
217 | 219 | | |
218 | 220 | | |
| 221 | + | |
219 | 222 | | |
220 | 223 | | |
221 | 224 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
178 | 178 | | |
179 | 179 | | |
180 | 180 | | |
181 | | - | |
182 | | - | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
183 | 186 | | |
184 | | - | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
185 | 190 | | |
186 | 191 | | |
187 | 192 | | |
188 | | - | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
189 | 198 | | |
190 | 199 | | |
191 | 200 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
49 | | - | |
50 | | - | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
51 | 54 | | |
52 | 55 | | |
53 | 56 | | |
| |||
81 | 84 | | |
82 | 85 | | |
83 | 86 | | |
84 | | - | |
| 87 | + | |
85 | 88 | | |
86 | 89 | | |
87 | 90 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
153 | | - | |
| 153 | + | |
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
| |||
196 | 196 | | |
197 | 197 | | |
198 | 198 | | |
199 | | - | |
| 199 | + | |
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
| |||
227 | 227 | | |
228 | 228 | | |
229 | 229 | | |
230 | | - | |
| 230 | + | |
231 | 231 | | |
232 | | - | |
| 232 | + | |
233 | 233 | | |
234 | 234 | | |
235 | 235 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | | - | |
| 41 | + | |
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| 61 | + | |
61 | 62 | | |
62 | 63 | | |
63 | 64 | | |
| |||
91 | 92 | | |
92 | 93 | | |
93 | 94 | | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
94 | 101 | | |
95 | 102 | | |
96 | 103 | | |
| |||
153 | 160 | | |
154 | 161 | | |
155 | 162 | | |
156 | | - | |
| 163 | + | |
157 | 164 | | |
158 | 165 | | |
159 | 166 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
790 | 790 | | |
791 | 791 | | |
792 | 792 | | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
793 | 798 | | |
794 | 799 | | |
795 | 800 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
298 | 298 | | |
299 | 299 | | |
300 | 300 | | |
301 | | - | |
| 301 | + | |
302 | 302 | | |
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
306 | 306 | | |
307 | | - | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
308 | 311 | | |
309 | 312 | | |
310 | 313 | | |
| |||
0 commit comments