Clean up the new releases UI #49

Closed
opened 2026-09-04 18:14:36 +00:00 by crueber · 3 comments
Owner

This is what it looks like right now: image

That section on the left doesn't look great right now. Redesign it so that it looks good.

This is what it looks like right now: ![image](/attachments/bd92dd2f-b7e2-4434-881c-eeb7732ab370) That section on the left doesn't look great right now. Redesign it so that it looks good.
Author
Owner

Fixed by #60 (branch fix/issue-49): new-release composer redesigned — centered max-w-2xl layout with section fieldsets, tag picker + count line, checkbox option rows, inline validation; behaviors unchanged. Browser-verified (dark + light, 16/16 checks, zero console errors).

Fixed by #60 (branch fix/issue-49): new-release composer redesigned — centered max-w-2xl layout with section fieldsets, tag picker + count line, checkbox option rows, inline validation; behaviors unchanged. Browser-verified (dark + light, 16/16 checks, zero console errors).
Author
Owner

Review of PR #60 (fix/issue-49, 6880aba) — new-release composer redesign.

BEFORE vs AFTER: the before-shot bare boxed form (tag/title/notes + inline checkboxes/buttons, adrift in page whitespace) is now a centered max-w-2xl composer matching the IssueNew/PullNew convention. All requested composition present in web/src/pages/ReleaseNew.jsx: heading row + 'all releases' back link (line 79, href ///releases — correct list route, round-trips with Releases.jsx new-button); Target/Content/Visibility fieldsets with legends + per-field help text (lines 95,126,166); tag datalist kept on tags({n:100}) stream with count/empty/loading line (lines 113-123, loading guard getTags()!==undefined matches the useData undefined-initial + Releases.jsx latest-panel convention); title placeholder follows typed tag (line 137); draft/prerelease as bordered checkbox rows with descriptions (lines 168-197); action row with primary create + autodraft, busy labels, asset-upload note (lines 198-214).

No-required-attribute decision: APPROVED as complete. Empty-tag submit always surfaces inline error, never silently no-ops: (1) both buttons disabled until tagged (lines 198,204), (2) Enter-key submit with disabled button still fires onSubmit -> create() sets 'Choose a tag for this release.' via role=alert line (lines 50-53,86-93) and preventDefaults before the check, (3) tag input trims on entry so whitespace-only is also caught. No required/pattern/type=email attrs exist, so no native bubble can pre-empt the single inline channel. fillAutodraft empty-tag guard (lines 31-34) is unreachable via UI (button disabled) but harmless defense-in-depth. Minor: the error only clears on the next submit/autodraft attempt, not while typing — same as IssueNew, acceptable.

Behaviors preserved: autodraft fill (+title-from-tag), create->detail nav, busy/disabled logic all unchanged; backend/SDK untouched. No new deps (only A added from already-allowed @solidjs/router). Dark+light classes throughout (emerald link, red alert, zinc borders). Keyboard/focus: explicit for/id labels, label-wrapped checkboxes, focusable back link, no traps; error announced via role=alert.

Doc decision (docs/go/12_web_ui.md) is accurate on every claim. AGENTS laws 1/7/8/12 hold (no deps; busy labels + former silent no-op now errors; page-only, no seam change; decision appended same-change).

VERIFY (scratch worktree /tmp/pr60 @6880aba, removed afterward): node --test web/test/unit/*.test.js -> 245 pass / 0 fail (note: scratch needed a node_modules symlink to the main worktree; two initial failures were missing-deps artifacts, not PR regressions — PR touches only the .jsx + doc). vite build -> clean (108 modules, 1.51s). No browser drive (static composition review + headless cover; noted per brief).

NIT (non-blocking): shared getBusy drives both button labels, so running autodraft labels submit 'Creating…' and vice versa (lines 199,207). Transient + both disabled; suggest separate signals only if touching the file again.

No code changes pushed — nothing blocking found. MERGE RECOMMENDATION: ready to merge.

Review of PR #60 (fix/issue-49, 6880aba) — new-release composer redesign. BEFORE vs AFTER: the before-shot bare boxed form (tag/title/notes + inline checkboxes/buttons, adrift in page whitespace) is now a centered max-w-2xl composer matching the IssueNew/PullNew convention. All requested composition present in web/src/pages/ReleaseNew.jsx: heading row + 'all releases' back link (line 79, href /<owner>/<repo>/releases — correct list route, round-trips with Releases.jsx new-button); Target/Content/Visibility fieldsets with legends + per-field help text (lines 95,126,166); tag datalist kept on tags({n:100}) stream with count/empty/loading line (lines 113-123, loading guard getTags()!==undefined matches the useData undefined-initial + Releases.jsx latest-panel convention); title placeholder follows typed tag (line 137); draft/prerelease as bordered checkbox rows with descriptions (lines 168-197); action row with primary create + autodraft, busy labels, asset-upload note (lines 198-214). No-required-attribute decision: APPROVED as complete. Empty-tag submit always surfaces inline error, never silently no-ops: (1) both buttons disabled until tagged (lines 198,204), (2) Enter-key submit with disabled button still fires onSubmit -> create() sets 'Choose a tag for this release.' via role=alert line (lines 50-53,86-93) and preventDefaults before the check, (3) tag input trims on entry so whitespace-only is also caught. No required/pattern/type=email attrs exist, so no native bubble can pre-empt the single inline channel. fillAutodraft empty-tag guard (lines 31-34) is unreachable via UI (button disabled) but harmless defense-in-depth. Minor: the error only clears on the next submit/autodraft attempt, not while typing — same as IssueNew, acceptable. Behaviors preserved: autodraft fill (+title-from-tag), create->detail nav, busy/disabled logic all unchanged; backend/SDK untouched. No new deps (only A added from already-allowed @solidjs/router). Dark+light classes throughout (emerald link, red alert, zinc borders). Keyboard/focus: explicit for/id labels, label-wrapped checkboxes, focusable back link, no traps; error announced via role=alert. Doc decision (docs/go/12_web_ui.md) is accurate on every claim. AGENTS laws 1/7/8/12 hold (no deps; busy labels + former silent no-op now errors; page-only, no seam change; decision appended same-change). VERIFY (scratch worktree /tmp/pr60 @6880aba, removed afterward): node --test web/test/unit/*.test.js -> 245 pass / 0 fail (note: scratch needed a node_modules symlink to the main worktree; two initial failures were missing-deps artifacts, not PR regressions — PR touches only the .jsx + doc). vite build -> clean (108 modules, 1.51s). No browser drive (static composition review + headless cover; noted per brief). NIT (non-blocking): shared getBusy drives both button labels, so running autodraft labels submit 'Creating…' and vice versa (lines 199,207). Transient + both disabled; suggest separate signals only if touching the file again. No code changes pushed — nothing blocking found. MERGE RECOMMENDATION: ready to merge.
Author
Owner

Fixed by PR #60 (review clean, 1 non-blocking nit; 245/245 node tests), merged. Closing.

Fixed by PR #60 (review clean, 1 non-blocking nit; 245/245 node tests), merged. Closing.
crueber added this to the v1 milestone 2026-09-10 22:20:52 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#49
No description provided.