logaritmisk
2460a1368d
feat: DEFAULT_LANGUAGE/DEFAULT_TIMEZONE config + public GET /api/config
2026-06-05 14:52:09 +02:00
logaritmisk
0ee3b970cb
refactor(web): drop redundant fields/visibility casts now the client is typed ( #24 #29 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 20:20:13 +02:00
logaritmisk
5a72f85989
feat(api): enum-typed visibility/data_type/kind + open-map fields in OpenAPI ( #24 #29 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 20:14:30 +02:00
logaritmisk
914527edc6
fix(web): place aria-selected on the role=tab element ( #32 ) + assert it
...
Per WAI-ARIA, aria-selected must be on the same element carrying role="tab".
The previous impl placed it on an inner <span> via the render-prop, making it
invisible to assistive technology. Move both role="tab" and aria-selected to
the NavLink, compute currentKind once from useParams, drop the render-prop.
Add a Vitest assertion that the selected tab has aria-selected="true" and an
unselected tab has aria-selected="false".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 17:32:18 +02:00
logaritmisk
ff513e1712
fix(web): search 503 vs error ( #34 ); terms/authorities list error states ( #31 ); authority-tab a11y + dead keys ( #32 ); authority-kind test ( #37 )
2026-06-04 17:28:01 +02:00
logaritmisk
fd1c22191b
polish(web): fields form resets error, shared labelText, drop dead nav.soon, a11y required marker, Other group last
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 14:29:25 +02:00
logaritmisk
37c80121ed
feat(web): /fields two-pane screen (grouped list + create form) + nav (no stubs left)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 14:22:57 +02:00
logaritmisk
6ad1304efd
feat(web): useCreateFieldDefinition mutation + MSW handler
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 14:16:55 +02:00
logaritmisk
b508273a52
feat(api): POST /api/admin/field-definitions (create field definition)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 14:09:08 +02:00
logaritmisk
4dd00362b8
polish(web): search pill aria-pressed, keepPreviousData, plural result count, URL-hydration test
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 12:47:38 +02:00
logaritmisk
358d793e44
feat(web): /search two-pane screen (debounced query, visibility filter, load more) + nav
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 12:40:46 +02:00
logaritmisk
ee65b27595
feat(web): Highlight (XSS-safe) + SearchResultRow components
2026-06-04 12:34:27 +02:00
logaritmisk
de830999d4
test(web): embed highlight sentinels in search fixture snippet
2026-06-04 12:32:23 +02:00
logaritmisk
18ed9bd947
feat(web): useSearch infinite query + useDebouncedValue + MSW search handler
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 12:29:11 +02:00
logaritmisk
a87501b902
feat(api): GET /api/admin/search endpoint + regenerated client types
...
Expose full-text search over catalogue objects via a new admin endpoint
backed by the Meilisearch SearchClient. Validates visibility filter values,
short-circuits on empty queries, clamps pagination, and returns 503 when
search is not configured. Registered in OpenAPI; schema.d.ts regenerated.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 11:48:32 +02:00
logaritmisk
352d899fa5
fix(web): authorities unknown-kind redirect, extract labelText util, EN-required test
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 09:39:15 +02:00
logaritmisk
38673e52ba
feat(web): authorities kind-tabbed screen (list/create) + nav
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 09:32:57 +02:00
logaritmisk
02e4f34a1b
fix(web): vocab form-level error states, newVocabulary heading, id guard, EN-required test
2026-06-04 09:29:51 +02:00
logaritmisk
ac30eadbb2
feat(web): vocabularies two-pane screen (list/create + terms/add) + nav
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 09:22:38 +02:00
logaritmisk
e8d173a18f
refactor(web): LabelEditor ignores blank labels; revert gratuitous tsconfig ES2022 bump
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 09:19:27 +02:00
logaritmisk
8d2323ed95
feat(web): shared sv/en LabelEditor
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 09:14:16 +02:00
logaritmisk
6afc358334
feat(web): vocabulary/term/authority list+create hooks + MSW handlers
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 09:08:15 +02:00
logaritmisk
7a8e7ff2d7
feat(web): show the publish control on the object detail
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 08:41:32 +02:00
logaritmisk
34d4ed2fd6
fix(web): disable publish-confirm while pending; aria-current on stepper
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 08:39:20 +02:00
logaritmisk
39b7fc51e9
feat(web): PublishControl stepper (legal one-step moves, confirm-on-public, gate/illegal errors)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 08:35:02 +02:00
logaritmisk
01f757a239
feat(web): useSetVisibility hook + adjacentTransitions helper + MSW handler
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 08:30:15 +02:00
logaritmisk
bb05331a3f
chore(web): remove unused shadcn Select (term/authority use native select)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 01:11:23 +02:00
logaritmisk
1cf36e39cc
chore(web): finalize object authoring — i18n parity + verification
...
Lazy-load ObjectNewPage and ObjectEditForm routes to bring the initial
JS bundle under the 150 KB gz budget (was 159 KB, now 140 KB).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 01:06:59 +02:00
logaritmisk
eedeb179e3
fix(web): handle delete failure in confirm dialog (no unhandled rejection)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 01:04:58 +02:00
logaritmisk
5087e34280
feat(web): delete object with confirm dialog
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 01:00:57 +02:00
logaritmisk
9880f24dd2
feat(web): nested object routes + in-pane edit form + edit flow
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:54:02 +02:00
logaritmisk
22b37c138b
test(web): assert partial-create passes fieldsError state to the edit route
2026-06-04 00:50:43 +02:00
logaritmisk
30d851182e
feat(web): new-object full-width page + create flow + /objects/new
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:46:49 +02:00
logaritmisk
616c232a22
feat(web): ObjectForm (core + dynamic flexible fields, RHF, validation)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:40:19 +02:00
logaritmisk
cf0b34b254
refactor(web): FieldInput form type unknown (drop any); wire localized_text required; a11y/comment nits
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:36:04 +02:00
logaritmisk
cb191225cc
feat(web): dynamic FieldInput (text/integer/date/boolean/localized_text/term/authority)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:31:05 +02:00
logaritmisk
b23a48c310
feat(web): authoring query/mutation hooks + MSW handlers + shadcn select/checkbox/alert-dialog
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 00:22:59 +02:00
logaritmisk
0a2398f507
fix(web): localize flexible-field labels to the active locale (sv/en)
...
CI / web (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 23:37:26 +02:00
logaritmisk
1d1be5fbe9
fix(web): hide null flexible-field values instead of rendering 'null'
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 23:17:14 +02:00
logaritmisk
859f41dcb9
feat(web): object detail + two-pane page + app routing
...
Implements the navigable SPA shell: object detail pane showing
inventory-minimum fields, flexible fields (via Record<string,unknown>
cast) and visibility badge; ObjectsPage two-pane layout; BrowserRouter
wired through RequireAuth+AppShell; QueryClient provided in main.tsx.
Consolidates ObjectList NavLink to use isActive function form, removing
manual useParams highlight.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 23:13:52 +02:00
logaritmisk
d6fe0b0597
feat(web): paginated object list with visibility badges and states
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 23:06:42 +02:00
logaritmisk
684469273f
feat(web): app shell with sidebar nav, language switch, sign out
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 23:01:42 +02:00
logaritmisk
057a00c413
feat(web): login page with inline error handling
...
Add shadcn input/label/card primitives and implement the login page:
email/password form using useLogin, navigates to /objects on success,
shows inline i18n error on 401 (auth.invalid) or network failure.
2 new tests, 9 total green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:56:17 +02:00
logaritmisk
01f43e1f67
fix(web): disable retry on useObject (404 resolves to null)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 22:53:32 +02:00
logaritmisk
cf02eeb991
feat(web): TanStack Query hooks + session-guarded routes
...
Installs @tanstack/react-query and react-router-dom; adds typed query
hooks (useMe, useObjectsPage, useObject, useFieldDefinitions, useLogin,
useLogout), a QueryClient+MemoryRouter test render helper, and
RequireAuth — a layout route that blocks unauthenticated access and
redirects to /login. All 7 tests pass, typecheck/lint/build clean.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:49:55 +02:00
logaritmisk
2e4187c850
test(web): reset i18n to English after the language-switch test
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 22:47:27 +02:00
logaritmisk
478b4ce44e
feat(web): i18n with react-i18next (sv/en)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:42:47 +02:00
logaritmisk
66d0624279
test(web): MSW harness with typed handlers, fixtures, and client tests
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:35:55 +02:00
logaritmisk
dcfddc88c7
feat(web): generated OpenAPI types + typed openapi-fetch client with 401 redirect
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:25:10 +02:00
logaritmisk
5267f05089
fix(web): restore shadcn theme tokens in index.css; tidy deps + eslint rule
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:21:58 +02:00