Frontend UX: reference-data screens are inconsistent and hard to scan (vocab / authorities / fields) #50
Reference in New Issue
Block a user
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?
Severity: High. From a frontend UX audit. Three sibling screens with three different layouts and edit models, and lists you can't scan.
Problems
vocabularies-page.tsx:7) and Fields (fields-page.tsx:13) are two-panegrid-cols-[20rem_1fr]; Authorities (authorities-page.tsx) is a single scrolling column (tabs + list + create form at the bottom). Create affordance lives in 3 places (vocab: fixed top-of-list; authorities: bottom of column; fields: the whole right pane). Edit happens 3 ways (vocab rename inline-in-row; term/authority inline-expand; fields in the right pane). No transferable mental model.list_terms/list_by_kindreturn creation order; rows render that order (vocabulary-terms.tsx:65,authorities-page.tsx:74) with no client sort. Finding "Bronze" in a 200-term vocabulary by scanning creation order is effectively impossible, and there's no search box on any reference screen.term-row.tsx:58/authority-row.tsx:58show only the label;external_uri(the whole point of authority control — distinguishing two "Mercury"s) is only visible in edit mode. (Fields gets this right:field-list.tsx:73-77shows label + key + type.)Badgecomponent already exists.external_urifield though edit does (authorities-page.tsx:84vsauthority-row.tsx:32); vocab rename has no empty-guard (create does); URI fields have notype="url"/placeholder/validation.Suggested fixes
key-reset pattern) + one create location.labelTextwith a locale-awareIntl.Collator; add a filterInputatop each list.external_uri(linkified) as a muted secondary line in rows; add count badges (vocab rows, authority tabs, field groups).Source: frontend UX/design audit, 2026-06-06.
Done — merged to
main(3575282). Scoped to scannability + parity (layout/edit-modality unification and API-backed counts filed as follow-ups below).Scannability:
lib/sort.tswith a memoized locale-awareIntl.Collator(byLabel/byKey/compareStrings). Terms, authorities, fields-within-group sort by label; vocabularies by key; field groups A–Z with "Other" last.Inputatop every reference list, with acommon.noMatchesempty state.external_urishows as a muted, truncated, linkified secondary line in term + authority read rows (sharedExternalUriLink,rel="noopener noreferrer").Badge(client-side).Parity / validation:
external_urifield and sends it (was hardcodednull).external_uriinputs are nowtype="url"+ placeholder.No layout/edit-modality change, no backend, no new dependency; 3 new i18n keys (en/sv parity); 221 tests green; typecheck/lint/build/check:size (215.3 KB gz)/check:colors clean; no codename. All list sorts operate on copies (no query-cache mutation).
Follow-ups (out of scope): the layout/edit-modality unification (authorities → two-pane pane-edit; vocab-rename/term/authority → pane-edit; one create location); API-backed counts (per-vocab term, per-kind authority — need view/count fields or endpoints); strict URL validation beyond
type="url".