New release page: replace free-form tag input + caret button with a dropdown of existing tags #503
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#503
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?
New release page: replace the free-form tag input + caret button with a dropdown of existing tags
What's requested
On the New release page (
/:owner/:name/releases/new), the tag field should stop being a free-form text input with a caret-button accessory, and become a proper dropdown select of the repo's existing tags. The tag is required and must already exist (the backend'sreleases.putresolves the tag and errors otherwise), so a picker of real tags is the honest control — typing an arbitrary name is the one input the form can't accept.Requested behavior:
Evidence
web/src/pages/ReleaseNew.jsx— current shape:<input id="release-tag" role="combobox">plus an adjacent▾caret<button>(lines 191–208) that toggles the popover.onInputsets the tag from arbitrary typed text (line 179) and auto-opens the list.tag-drop card absolute inset-x-0 z-30 …) — this is the visual that a proper dropdown should retain.tags:{full}cache entry (ctx.repoClient.tags({ n: 100 })), names normalized by strippingrefs/tags/. No new fetch should be introduced.releases.put(tag)which the server resolves against existing tags.web/src/lib/releases.jsfilterTagNamesis the existing client-side filter used by the combobox — a plain dropdown (no typed filtering) may not need it; planner's call whether the select keeps type-to-filter behavior (see decision point below).Architecture notes
web/src/pages/ReleaseNew.jsxonly. No backend change; the release service already rejects nonexistent tags.useData(tags:${ctx.full})cache — keep it that way, no new network path.<select>, note the selected-tag row and popover styling from the current combobox is lost; if it stays a custom popover triggered by a single button (rather than input + caret), preserve the accessibility contract now in place:role="listbox"/role="option",aria-expanded,aria-activedescendant, keyboard nav (arrows/Enter/Esc — RefPicker conventions), outside-click close via the document-level listener idiom (LabelPicker/MilestonePicker pattern; current implementation lines 98–112).Decision points (planner's call)
<select>styled with the app'sinputclass, vs. a single-button custom popover (input removed) reusing the current list markup. Either is acceptable; note the trade-off.Acceptance criteria
▾caret button are gone from the New release page tag field; one control opens the tag list.ReleaseNew.jsxupdated to reflect the new control.Fixed by PR #508 (#508): tag field is now a native single-select dropdown of existing tags — required selection, zero-tags empty state, updated helper copy. No backend change, no new deps.
Review of PR #508 (fix/issue-503, commit
2ae035a) — verified in scratch worktree /tmp/pr508 (symlinked node_modules, since removed).PASS — all 7 review points hold:
tags:${ctx.full}, () => ctx.repoClient.tags({ n: 100 })) unchanged (:30); exactly one repoClient.tags( call; refs/tags/ strip kept (:101); stream order kept via .VERIFY: targeted 4 files 27/27 pass; full node --test 1126 total / 1125 pass / 1 fail = smoke.test.js 'built SPA shell served at / and /setup' — environmental, needs live :8080 (smoke.test.js:9 unmodified by PR; failure is an HTTP 403 from whatever answers :8080 here, unreachable from this change's client-only files). vite build green (2.27s). esbuild unaffected (no sdk/ files touched). No browser drive per instructions (node tests + reasoning).
No fixes pushed — nothing to fix. MERGE RECOMMENDATION: ready to merge.
Fixed by PR #508 (review clean — all 7 checks pass, old shape fully deleted, gates reflect selection), merged. Closing.