logaritmisk and Claude Opus 4.8
4a76d6043a
docs(plans): instance locale + single-language content authoring (4 tasks)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-05 14:29:40 +02:00
logaritmisk and Claude Opus 4.8
0f43c75b24
docs(specs): instance locale (env) + single-language content authoring
...
Keep the multilingual content schema (dormant); simplify authoring inputs to one
language. Default language + timezone via env vars (no settings table). Public
/api/config endpoint surfaces them to the SPA. Per-account UI language deferred.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-05 14:23:32 +02:00
logaritmisk and Claude Opus 4.8
3c6a41a80a
merge: tier 4 hardening batch 1 ( #1 #2 #21 )
...
#1 graceful shutdown on SIGINT/SIGTERM (axum with_graceful_shutdown).
#2 configurable DB pool size (--db-max-connections / DB_MAX_CONNECTIONS, default 5).
#21 audit vocabulary/term/authority creation atomically, attributing the acting
user; ~15 call sites threaded an AuditActor.
173 workspace tests; clippy + fmt clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 22:10:13 +02:00
logaritmisk and Claude Sonnet 4.6
146e0164e7
refactor(db): name audit entity_type constants for vocab/term/authority ( #21 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 22:05:06 +02:00
logaritmisk and Claude Sonnet 4.6
984be697ac
feat: audit vocabulary/term/authority creation, attributing the acting user ( #21 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 21:54:50 +02:00
logaritmisk and Claude Sonnet 4.6
7181437625
feat(server): configurable DB pool size via --db-max-connections/DB_MAX_CONNECTIONS ( #2 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 21:46:41 +02:00
logaritmisk
7e235ffd3e
feat(server): graceful shutdown on SIGINT/SIGTERM ( #1 )
2026-06-04 21:42:55 +02:00
logaritmisk and Claude Opus 4.8
b0d2c247df
docs(plans): tier 4 hardening batch 1 ( #1 #2 #21 )
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 21:41:29 +02:00
logaritmisk and Claude Opus 4.8
e9a5a10524
chore: sync Cargo.lock — domain gains utoipa (tier 3 #3 )
...
CI / web (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 20:26:21 +02:00
logaritmisk and Claude Opus 4.8
df113bd7ac
merge: tier 3 typed-client ( #3 #24 #29 )
...
Decision #3 = Option A (utoipa::ToSchema allowed in domain, no I/O deps).
domain: ToSchema on Visibility/AuthorityKind + new DataType enum.
api: open-map fields (#24 ); enum value_types for visibility/data_type/kind (#29 );
domain enums registered in OpenAPI; client regenerated. Frontend: dropped the
now-redundant fields/visibility casts. Wire format unchanged; schema diff additive.
domain 26 + api 41 + web 78 tests; bundle 145.5 KB gz.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 20:25:54 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
d3c33a6c5d
feat(domain): derive ToSchema on Visibility/AuthorityKind; add DataType enum ( #3 Option A)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 20:08:41 +02:00
logaritmisk and Claude Opus 4.8
331a6d7f34
docs(plans): tier 3 typed-client ( #3 Option A, #24 , #29 )
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 20:06:27 +02:00
logaritmisk and Claude Opus 4.8
0d971cda15
merge: tier 2 papercuts ( #22 #18 #9 #4 #34 #31 #32 #37 )
...
CI / web (push) Has been cancelled
Backend: add_term FK→404 (#22 ); log discarded errors on public 500 paths (#18 );
enum↔CHECK cross-ref comments (#9 ); drop dead clone + harden serve smoke test (#4 ).
Frontend: search 503 'unavailable' vs generic error (#34 ); loading/error states on
terms & authorities lists (#31 ); authority kind-tab ARIA + dead i18n key removal
(#32 ); authority-kind reveal test (#37 ).
78 web tests; 72 backend tests; bundle 145.5 KB gz.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 17:39:35 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
1a91b8a242
chore: cross-ref enum/CHECK constraints ( #9 ); drop dead clone + harden smoke test ( #4 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 17:21:33 +02:00
logaritmisk and Claude Sonnet 4.6
2bce469ed2
fix(api): 404 when adding a term to a missing vocabulary ( #22 ); log public 500s ( #18 )
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 17:17:35 +02:00
logaritmisk and Claude Opus 4.8
fbb7a297a6
docs(plans): tier 2 papercuts — #22/#18/#9/#4/#34/#31/#32/#37
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 17:14:39 +02:00
logaritmisk
8442afbf02
chore: gitignore local docker-compose.override.yml
CI / web (push) Has been cancelled
2026-06-04 14:56:21 +02:00
logaritmisk and Claude Opus 4.8
869a2c6e50
docs(dev): Running locally + tests README; add Meilisearch to compose; env defaults
...
Single docker compose (Postgres + Meilisearch) for dev and tests. .env.example
now works out-of-the-box (SESSION_COOKIE_SECURE=false for http://localhost login;
MEILI_* matching compose).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 14:52:34 +02:00
logaritmisk and Claude Opus 4.8
126f84962a
merge: fields management — create field definitions (endpoint + /fields UI)
...
CI / web (push) Has been cancelled
POST /api/admin/field-definitions (EditCatalogue) over the existing db layer,
validated through FieldType::from_parts (422 on inconsistent type/binding),
dup key -> 409, nonexistent vocabulary / empty key -> 422. /fields two-pane
screen: grouped list + create form with conditional vocabulary/authority-kind
selects, reused LabelEditor; creating a field invalidates the shared
[field-definitions] cache so it appears in the object editor too. Fields nav
enabled — no disabled nav stubs remain.
api tests green (8 admin_fields + suite); web 72 tests; bundle 145.4 KB gz.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 14:36:14 +02:00
logaritmisk
daad9438ba
fix(api): map CHECK-constraint violation (empty key) to 422
2026-06-04 14:35:56 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
df8f31d14d
fix(api): map nonexistent-vocabulary FK violation to 422; cover term/authority create paths
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 14:15:19 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Opus 4.8
b490db13b1
docs(plans): fields management — POST endpoint + /fields UI, 4 tasks
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 13:50:30 +02:00
logaritmisk and Claude Opus 4.8
19408f6282
docs(specs): fields management — POST field-definitions + /fields two-pane UI
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 13:35:18 +02:00
logaritmisk and Claude Opus 4.8
2d0b76ab34
merge: frontend M5 — full-text search (endpoint + /search UI)
...
CI / web (push) Has been cancelled
GET /api/admin/search backed by Meilisearch (highlighted hits, visibility
filter, offset/limit, estimated total; 503 when search unconfigured). /search
two-pane screen: debounced query, visibility pills, URL-synced + bookmarkable,
infinite 'Load more', XSS-safe sentinel highlighting, ObjectDetail reuse for
the detail pane. Search nav enabled (only Fields remains stubbed).
Backend search+api tests green; web 68 tests; bundle 145.1 KB gz.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 12:54:12 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
90a1539090
test(api): cover search visibility-filter narrowing; note pagination cap rationale
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 12:26:38 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
9b1771d584
refactor(search): document+guard visibility filter precondition; drop redundant dev-dep
...
- Remove serde_json from [dev-dependencies] (already in [dependencies])
- Add debug_assert! in search_objects visibility filter as defense-in-depth
- Extend search_objects doc-comment with visibility precondition
- Clarify estimated_total_hits.unwrap_or(0) is safe under offset/limit pagination
- Add brief comment on with_crop_length(20) explaining ~20-word context window
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 11:19:46 +02:00
logaritmisk and Claude Sonnet 4.6
84c4c2807b
feat(search): search_objects returns highlighted hits + estimated total
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 10:46:54 +02:00
logaritmisk and Claude Opus 4.8
38e4525404
docs(plans): frontend M5 search — backend endpoint + /search UI, 6 tasks
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 10:27:59 +02:00
logaritmisk and Claude Opus 4.8
a9208f56fe
docs(specs): frontend M5 search — endpoint + /search two-pane UI design
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 10:17:29 +02:00
logaritmisk and Claude Opus 4.8
18a19eec16
merge: frontend M4 — vocabulary & authority management (create+list)
...
Vocabularies two-pane screen (list/create + per-vocab terms/add), Authorities
kind-tabbed screen (list/create), shared sv/en LabelEditor, 4 new query hooks,
nav enabled for both surfaces. 57 tests, bundle 143.1 KB gz.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 09:42:39 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
26e10704a9
docs(plan): frontend SPA milestone 4 — task-by-task implementation plan
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 09:05:10 +02:00
logaritmisk and Claude Opus 4.8
684b5449ca
docs(spec): frontend SPA milestone 4 (vocabulary & authority management) design
...
Two-pane vocab (list/create + terms/add) + kind-tabbed authorities
(list/create); shared sv/en LabelEditor; create+list only (no backend
edit/delete yet); 4 new hooks; enables the nav stubs; Vitest+RTL+MSW.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 09:00:02 +02:00
logaritmisk and Claude Sonnet 4.6
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 and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
516ecf3e95
docs(plan): frontend SPA milestone 3 — task-by-task implementation plan
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 08:25:53 +02:00
logaritmisk and Claude Opus 4.8
f206ee8995
docs(spec): frontend SPA milestone 3 (publishing workflow) design
...
Segmented Draft->Internal->Public stepper on the object detail; legal
one-step moves only; confirm on ->Public; surfaces the 422 publish-gate
(generic + Edit link) and 409 illegal-transition; useSetVisibility +
adjacentTransitions helper; Vitest+RTL+MSW.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 07:58:22 +02:00
logaritmisk and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
f3bab3336c
docs(plan): frontend SPA milestone 2 — task-by-task implementation plan
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 00:16:22 +02:00
logaritmisk and Claude Opus 4.8
9f43793c4a
docs(spec): frontend SPA milestone 2 (object authoring) design
...
Create (full-width /objects/new) + edit (in-pane /objects/:id/edit) +
delete; dynamic flexible-field form (all 7 field types incl. term/authority
Selects + sv/en localized text) via react-hook-form; replace-semantics
field save; client validation + partial-create recovery; Vitest+RTL+MSW.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-04 00:09:15 +02:00
logaritmisk and Claude Opus 4.8
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 and Claude Opus 4.8
397e606793
ci(web): fail bundle check when no JS chunks found (avoid false green)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 23:31:08 +02:00
logaritmisk and Claude Sonnet 4.6
89132f6745
ci(web): typecheck/lint/test/build + bundle-size budget
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 23:28:36 +02:00
logaritmisk and Claude Sonnet 4.6
7170be016d
feat(server): embed SPA via memory-serve behind embed-web feature
...
Adds `memory-serve` 2.1 as an optional workspace dependency, a `build.rs`
that runs `load_directory` only when `CARGO_FEATURE_EMBED_WEB` is set, a
`web_assets` module serving `web/dist` at `/` with SPA fallback (200 OK)
for unknown client-side routes, and a feature-gated integration test.
The default build (no feature) compiles and tests cleanly without `web/dist`.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 23:22:26 +02:00
logaritmisk and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Opus 4.8
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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 and Claude Sonnet 4.6
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
logaritmisk and Claude Sonnet 4.6
b7ec4b1041
feat(web): Tailwind 4 + shadcn/ui + ESLint
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:14:12 +02:00
logaritmisk and Claude Opus 4.8
8466ed4d08
chore(web): drop dangling favicon link (runtime 404)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 22:10:29 +02:00
logaritmisk and Claude Sonnet 4.6
f64688a16f
feat(web): scaffold Vite + React + TS SPA with Vitest
...
Bootstraps the web/ SPA: Vite 6 + React 19 + TypeScript 5.8, Vitest
with jsdom, @testing-library/react, and a green smoke test asserting
the App renders its Collection heading.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 22:06:03 +02:00
logaritmisk and Claude Opus 4.8
a177b02145
docs(plan): frontend SPA milestone 1 — task-by-task implementation plan
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 21:56:54 +02:00
logaritmisk and Claude Opus 4.8
31e2a3f30a
docs(spec): frontend SPA milestone 1 (foundation slice) design
...
Decomposes the admin SPA into milestones; specs M1 — web/ scaffold,
Vite+React+TS+pnpm+shadcn/ui, openapi-typescript+openapi-fetch typed
client, TanStack Query, react-i18next (sv/en), two-pane master-detail
layout, login/session guard, read-only Objects browse, Vitest+RTL+MSW
tests, memory-serve embed behind a feature gate, 150KB bundle budget.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-03 21:50:30 +02:00
logaritmisk and Claude Opus 4.8
8cfcf07387
fix(db): publish gate fires only on transition into public, not re-set
...
Preserves the documented set-to-current idempotent no-op: re-setting an
already-public object's visibility no longer rejects when a required field
was introduced after publish. Adds a regression test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 23:40:10 +02:00
logaritmisk and Claude Opus 4.8
e96f74f47a
feat(db): enforce required-field completeness on publish ( #16 )
...
set_visibility now gates the transition to Public: every field definition
with required=true must have a value on the object (typed inventory-minimum
columns are already NOT NULL, so only flexible required fields are checked).
Missing values yield VisibilityError::MissingRequiredFields(keys); the admin
publish endpoint maps it to 422. The gate runs in db so every caller is
protected and the check is atomic with the transition.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 23:36:24 +02:00
logaritmisk and Claude Opus 4.8
4921c73fa7
style(api): import reindex into scope rather than crate::-qualify
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 23:29:50 +02:00
logaritmisk and Claude Opus 4.8
d15afda9b2
feat(api): on-write search reindex after catalogue writes ( #17 )
...
Wire best-effort Meilisearch index sync into the admin write paths
(create/update/delete/set_fields/set_visibility). Adds
SearchClient::sync_object (reindex if the object exists, remove if gone —
one uniform path), an optional AppState.search client, and a reindex
helper that logs failures via tracing without failing the committed
write. Server gains MEILI_URL/MEILI_MASTER_KEY/MEILI_INDEX config;
search stays disabled (no-op) when unset. reindex_all remains the
recovery path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 23:25:43 +02:00
logaritmisk and Claude Opus 4.8
c4e0c4c834
style(api): merge use decl; assert status + breathing room in authority test
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 22:39:36 +02:00
logaritmisk and Claude Sonnet 4.6
01abd5cbbc
feat(api): admin authority management (create + list by kind)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:33:44 +02:00
logaritmisk and Claude Opus 4.8
d81b069b8f
style(api): merge use decl; breathing-room blank in vocab test
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 22:29:51 +02:00