Repository navigation
Commit 2855785
feat(console): Public Forms, Flow Runs and Profile pick with the shared Select (#12012)
Part of #11865
Clause-②: no
Slice h of claim `6069665700`, the console's own pages: four
browser-native select elements on three pages become the shared Radix
`Select` (`packages/components/src/ui/select`, used, not edited),
following objectui#11976, #11990, #11995, #12000 and #12005. This PR
converts these files and no others:
- `apps/console/src/pages/developer/PublicFormsPage.tsx`: "FormView" in
*Publish a FormView* and "After submit" in the edit dialog, through one
module-private `FormsPicker`.
- `apps/console/src/pages/developer/FlowRunsPage.tsx`: the flow picker,
through a module-private `FlowPicker`.
- `apps/console/src/pages/system/ProfilePage.tsx`: "Preferred language",
through a module-private `LanguagePicker`.
Each picker follows the card's earlier pickers. Items carry their
option's index, so the two options whose value is the empty string ("—
Select a FormView —", "Use the deployment default") need no empty
`SelectItem`. A value no option carries gets an item of its own and is
shown as itself. No picker is exported, and no listing logic on Public
Forms moved (objectui#11545 is untouched).
## Hypotheses, measured
- **H1, value parity: holds.** A scratch probe (not committed) on base
`902fbe190`, with the native selects and the same fixtures as the pins,
read what every option led to. The pins compare against those readings
as JSON text:
- Public Forms, publish: each view writes the same `meta.saveItem` call
(`["view","lead.intake",{…,"sharing":{"enabled":true,"allowAnonymous":true,"publicLink":"/forms/contact-us"}}]`,
and the same for the view with no label or object). "— Select a FormView
—" leaves Publish disabled with no call.
- Public Forms, "After submit": 12 rows (stored behaviour unset,
`redirect` with `/done`, or `continue`, by each of the four options),
each the same full `saveItem` call, `submitBehavior` included.
- Flow Runs: each flow, picked, is the one Run Flow executes
(`[["nightly_sync",{"params":{}}]]`) and whose runs are listed
(`[["nightly_sync",{"limit":20}]]`), and the same for `reassign_wizard`.
- Profile: 13 rows (stored tag none, `ja` or `pt-BR`, by each option),
each the same `adapter.update` call; "Use the deployment default" still
saves `{"locale":null}`. Re-picking the current option leaves Save
disabled, as before.
- **H2, names, keyboard and read-only: holds.**
- Names, read on base through `getByRole('combobox', { name })`:
"FormView", "After submit" and "Preferred language" come from each
field's Label htmlFor. Each trigger now carries that `id`, and the name
pins are green on base and head by design.
- The flow picker had no label, `id` or `aria-label`, so its name was
empty. It is still empty, and is pinned so (see Acceptance notes).
- Keyboard: Enter opens and Enter on an option selects, pinned once per
page.
- Read-only: only the Profile card has such a state. Its trigger is the
primitive's disabled trigger (objectui#11781), pinned by
`ProfilePage.language`'s "degrades to read-only" case. Public Forms' two
dialogs open only from the page's own buttons, and Flow Runs has no such
state.
- **H3, a value no option carries: holds.** On base the native control
showed its first option in each case. Head shows the value itself,
pinned three times:
- Flow Runs, a picked flow that a Refresh no longer lists: base showed
"Reassign (reassign_wizard)" while the page held `nightly_sync` and
showed no runner.
- "After submit" with a stored kind none of the four names: base showed
"Show a thank-you panel" with no thank-you fields.
- Profile, a pick the offered list has since dropped: base showed "Use
the deployment default" while Save wrote `zh`.
- **H4, first-load bytes: neutral.**
- Measured before the first edit, on base: the three pages ship in lazy
chunks (`PublicFormsPage-*`, `FlowRunsPage-*` and `ProfilePage-*`), none
among the 336 members of `dist/eager-closure.json`. The positive
controls were the entry chunk and `ui-components`, both eager.
- On head: eager gzip 3,391,326 B on base and 3,391,327 B on head, and
eager raw 11,496,190 B on both, so the delta is +1 B gzip and 0 B raw.
- The one eager member that changed is the entry chunk. It names the
three lazy chunks, whose hashes moved. `ui-components` keeps its file
name, so the shared `Select` was already in it.
## Tests
New pins (one per page): `PublicFormsPage.sharedSelect-11865.test.tsx`,
`FlowRunsPage.sharedSelect-11865.test.tsx`,
`ProfilePage.sharedSelect-11865.test.tsx`.
Suites that drove or mount these pages, changed only in their harness:
- `PublicFormsPage.redirect`: the editor helper picks "Redirect to a
URL" through the primitive.
- `ProfilePage.language`: picks through the primitive. Its adapter mock
is now one object, as the app's provider hands out. A fresh one per
render re-read the row and reset the pick before Save could be reached.
The native control's synchronous change event used to win that race.
- `developerMetadataEnvelope.contractEnvelope-6917` and
`consoleFaces.displayLocale-9909`: `getClient()` now returns one client,
as the real adapter's does. With a fresh client per call, Flow Runs
re-ran its loads on every render. Measured with that harness shape: 251
`meta.getItems` calls in 600 ms on the base page and 73 on this branch,
against 2 with one client. The native option text was readable between
reloads; the shared trigger's value never settled, so their Flow Runs
cases went red.
Reverse leg, from the committed head `699224076`:
- The three page files were put back on their base blobs (hash-checked
on disk) and the new pins run: `Tests 42 failed | 3 passed (45)`. The
three passing are the name pins, green on both sides by design.
- Restored with `git checkout HEAD`. The blobs on disk equal HEAD's, and
`git diff HEAD` is empty. A trap restored on EXIT, INT and TERM.
## Gates (head `f0ec3325f`, worktree clean)
- Repo-root `pnpm exec vitest run` over the 3 new pins, the 8 suites
that mount these pages, `submitRedirect.test.ts`,
`column-identity.ratchet.test.ts` and
`one-authority-per-exported-name-6273.test.ts`: `Test Files 14 passed
(14)`, `Tests 180 passed (180)`.
- `pnpm --filter @object-ui/console type-check`, after `turbo run build
--filter='@object-ui/console^...'` (`Tasks: 34 successful, 34 total`):
exit 0. `tsc --listFilesOnly` lists every touched file.
- `pnpm exec eslint` on the 10 touched ts/tsx files: 0 errors and 32
warnings, all pre-existing rule kinds. The base blobs carry 33, and
`PublicFormsPage` loses one `no-explicit-any`.
- `pnpm check:eager-closure` on the head build: "Console eager closure
is 3311.8 KB gzipped across 336 of 2458 chunks (budget: 3312.0 KB,
headroom: 0.2 KB)."
- Each exit 0:
- `node scripts/check-changeset-presence.mjs`: "10 source file(s) of 1
released package(s) changed, and this change declares 1 changeset(s)".
- `node scripts/check-changeset-no-major.mjs`.
- `pnpm check:new-line-citations`: "0 new citation(s)".
- `pnpm check:control-bytes`.
- Derived from the touched paths: `check:vi-mock-specifiers`,
`check:vi-mock-inherit`, `check:vi-mock-override-shape`,
`check:test-path-roots`, `check:i18n-keys`, `check:changeset-claims`,
`check:pending-changeset-literals`, `check:phantom-deps`,
`check:metadata-write-doors`, `check:unreferenced-sources` and
`check:handler-key-reads`.
Changeset: `.changeset/11865-h-console-pages-shared-select.md`,
`'@object-ui/console': patch`.
Docs: no guide or README describes these controls. A `git grep` of
`content/docs` and the console README for the page names and labels
finds only `public-forms.md`, which documents the route and the redirect
contract, not the dialog's controls. So no doc change.
## Acceptance notes
None of these is filed. Each is noted with no carrier.
- The flow picker has no accessible name, before and after: no label,
`id` or `aria-label` is associated with it. Kept for parity, as the
claim asks. Naming it is a separate change.
- Picking a flow reloads the flow list, because `loadFlows` depends on
the picked name. The picker unmounts while the list loads, so focus does
not come back to it after a pick. Read in jsdom, the same before and
after.
- Flow Runs keys its flow and run loads on the identity of
`getClient()`. The real adapter returns one client, so this is dormant
in the app; only a harness that builds a fresh client loops.
`FlowRunsPage.test.tsx` still builds one per call and passes.
- A stored `submitBehavior.kind` outside the spec's four is saved away:
Save writes the view without `submitBehavior`, before and after. The
spec refuses such a kind, so reaching this needs an off-spec stored
view.
- The FormView option for a view with no object keeps the trailing space
the native option had.
Session: `https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU`.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 5ad8183 commit 2855785
11 files changed
Lines changed: 1023 additions & 91 deletions
File tree
- .changeset
- apps/console/src/pages
- developer
- system
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
Lines changed: 8 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
69 | 76 | | |
70 | 77 | | |
71 | 78 | | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
| 79 | + | |
76 | 80 | | |
77 | 81 | | |
78 | 82 | | |
| |||
Lines changed: 183 additions & 0 deletions
| 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 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 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 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
48 | 53 | | |
49 | 54 | | |
50 | 55 | | |
| |||
130 | 135 | | |
131 | 136 | | |
132 | 137 | | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
133 | 193 | | |
134 | 194 | | |
135 | 195 | | |
| |||
216 | 276 | | |
217 | 277 | | |
218 | 278 | | |
219 | | - | |
| 279 | + | |
220 | 280 | | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
230 | 287 | | |
231 | 288 | | |
232 | 289 | | |
| |||
Lines changed: 9 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
| 51 | + | |
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| |||
119 | 119 | | |
120 | 120 | | |
121 | 121 | | |
122 | | - | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
123 | 127 | | |
124 | 128 | | |
125 | 129 | | |
126 | 130 | | |
127 | 131 | | |
128 | | - | |
129 | | - | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
130 | 135 | | |
131 | 136 | | |
132 | 137 | | |
| |||
0 commit comments