Standardize the standalone create-form pages (New repository / Import / New organization) on the canonical form-page pattern #479
Labels
No labels
actions
bug
cli
duplicate
enhancement
fork
forum
git storage
help wanted
insights
invalid
issues
moderation
oidc
ownership transfer
packages
pr/merge protection rules
projects
pull requests
question
releases
sponsorships
tags
webhooks
wiki
wontfix
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
crueber/walhub#479
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Standardize the standalone create-form pages (New repository / Import / New organization) on the canonical form-page pattern
What's requested
Standardize the three standalone create-form pages — New repository (
/new), Import repository (/import), and New organization (/orgs/new) — on the canonical form-page pattern the repo already established for composer forms (issue #49,IssueNew.jsx/ReleaseNew.jsx), then adopt that pattern as the standing rule for all future form pages.Canonical form-page pattern (defined from the current tree)
Derived from
ReleaseNew.jsx(header comment cites the #49 convention) andIssueNew.jsx:mx-auto max-w-2xl(ReleaseNew line 139) — oneh2page heading, one short muted intro line.<form class="card grid gap-3 p-4">witharia-label.label.grid.gap-1→span.text-sm.font-mediumlabel →.inputcontrol (.font-monofor identifiers/URLs) → optional help line.id+aria-describedby(ReleaseNewrelease-tag-help/release-title-help/release-notes-helppattern); prose paragraphs that restate the submit outcome or repeat a sibling page's copy are not field help.grid grid-cols-1 gap-3 sm:grid-cols-2(theFork.jsxidiom, lines 191/228) so the pair stacks on phones.btn primary px-3 py-1with busy label swap; optional secondarybtnaction beside it (OrgNew's cancel).Divergences found (evidence)
New.jsx:175andImport.jsx:244usegrid grid-cols-2 gap-3for the Owner/Name pair: fixed two columns with nosm:breakpoint, so owner-select and name input squeeze side-by-side at phone widths.Fork.jsx:191,228already uses the correctgrid-cols-1 sm:grid-cols-2.New.jsx:195/Import.jsx:264: "you and your orgs only" under every owner select — restates the bounded owner list the select itself already shows; drop it.New.jsx:229-232andImport.jsx:324-327: the identical "Mirrors are pull-only: pushes are rejected…" paragraph is pasted into both pages — duplicate copy for the same feature; keep it once, and only where it carries decision-relevant detail.Import.jsx:329-332: standing LFS/ssh limitation prose rendered on every visit regardless of relevance — fold into the token field's help line or a<details>.id/aria-describedby(compare ReleaseNew's fieldset pattern).OrgNew.jsx:126-137has a cancel action;New.jsx:279-287andImport.jsx:359-363do not. Pick one: either every standalone create form gets a cancel affordance (OrgNew'sbtnlinking to the natural back surface), or none do.Acceptance criteria
New.jsxandImport.jsxOwner/Name rows usegrid-cols-1 sm:grid-cols-2(or the canonical row class); page pans nowhere at 390px width.aria-describedbyor collapsed under a<details>.id+aria-describedbyfollowing the ReleaseNew pattern.web/test/unit/create-menu-466.test.jsand related unit tests still pass in CI.Standing rule for future form pages
Adopt the pattern above as the convention for every new form page (the #49 composer convention extended to standalone create/edit forms):
max-w-2xlcolumn; one heading, one intro line;card grid gap-3 p-4form;label.grid.gap-1field composition;grid-cols-1 sm:grid-cols-2) — never a baregrid-cols-2;aria-describedby-wired, and only when it changes what the user does;Suggested placement: record this in the file-header convention of the next form page and reference
ReleaseNew.jsxas the reference implementation, so reviewers can diff new forms against a canonical sibling.Reference implementation:
web/src/pages/ReleaseNew.jsx(fieldset + help-text composition),web/src/pages/Fork.jsx(responsive grid idiom).Fix is up: #480 (branch fix/issue-479, no conflicts). All 7 acceptance criteria covered — visual/structure only, no behavior change. Cancel direction: every-form-gets-cancel (New/Import gain OrgNew's exact secondary btn to /explore). Tests: new create-forms-479 9/9, related 92/92, full suite 1027/1029 (2 pre-existing live-server smoke failures, identical on main); vite + esbuild green. Browser proof open (shared-daemon loopback guard). Do NOT merge yet.
REVIEW PR #480 (fix/issue-479) — verified in scratch worktree /tmp/pr480 at
6ab11e1, node tests + reasoning, no browser per instructions.AGENTS.md laws: (1) deps untouched — package.json/lock absent from diff, runtime set unchanged; (7) N/A, no async work; (8) no new routes/providers, existing A/router only; (12) decision appended to docs/go/12_web_ui.md in the same change, headers cite ReleaseNew.jsx. Main worktree untouched (read-only; still clean).
Acceptance criteria, all 7 PASS:
7cfeceerestructures further) — branch-unique diff vs origin/main is exactly the 5 scoped files, no action needed.Tests (scratch, node_modules symlinked from main): new create-forms-479.test.js 9/9 green; full 'node --test web/test/unit/*.test.js' 1029 total / 1027 pass / 2 fail — the 2 are the identical pre-existing live-server smoke subtests failing on pristine main (main: 1020/1018/2, same names; +9 net new, zero PR-caused). vite build green (2.35s), esbuild SDK bundle green (32.9kb). Browser proof open (shared-daemon loopback guard; headless drive not run).
MERGE RECOMMENDATION: ready to merge (nit in (5) advisory only). I am NOT merging per instructions.
Fixed by PR #480 (review clean — all 7 criteria pass, markup/copy-only diff proven, no behavior change), merged. Closing.