Commit Graph

1136 Commits

Author SHA1 Message Date
3da2fd65b0 test(16.2): phase gate
Fail-closed stages go, admin, editor, layer, docs and postgres with go,
vitest-JSON and TAP detectors, the editor corpus copy comparison and a
self-test that proves each fails on planted output. --all runs postgres
only when a Docker daemon answers and otherwise prints a loud NOT RUN
notice; PHASE162_REQUIRE_POSTGRES=1 makes that a failure.
2026-10-10 16:12:19 +02:00
9f5e807af6 test(16.2-06): admin SPA coverage of plugin field types and View site
- fieldTypes: one load per script URL, failed and refused scripts
  reported, global styles enabled on every screen, empty list on failure
- registry, formState, FormField and ListView: plugin renderers, locale
  maps, notices as literal text, unknown column types as text
- AppShell: the View site link's href, target, rel and en/pl label
2026-10-10 16:03:07 +02:00
3404a4b3ad test(16.2-06): full unit coverage of the plugin field type framework
- pact: FormFieldError message joining, nil pointer, funcs never serialized
- cabana: registry and option boot rules, compile (option kinds, general
  and core keys, CompileForm vs CompileFormWithTypes, settings and relation
  refusal), decode 422/500 split, localized and capped notices, Load,
  ListValue with the request ctx, field writes, field-types and upload
  routes
- TestFieldTypeSavePostgres (Docker host): create, show, untouched and
  changed update, refused update, upload in and out of the record scope
2026-10-10 15:49:35 +02:00
08a20021e3 test(16.2-06): pin the untouched-value skip in cabana and PluginField
- TestFieldTypeUntouched: served values skip Decode, writes and notices;
  one changed locale writes and reports only that locale; canonical JSON
  comparison; a create never skips
- PluginField: an element that echoes its value on connect is never
  written a second time
2026-10-10 15:42:31 +02:00
c07da3912b docs(16.3): capture phase context 2026-10-10 15:33:02 +02:00
4e0b31feb2 docs(16.2): preview pane and View site deploy to UAT 2026-10-10 14:52:06 +02:00
b5c70b7340 docs(16.2): post 1 untouched re-save proof on UAT 2026-10-10 14:05:06 +02:00
684bfe1dc8 docs(fast): log View site link 2026-10-10 14:01:49 +02:00
85fe541b03 feat(admin): View site link next to the user menu
Opens the admin origin's root in a new tab, like the WinterCMS backend.
2026-10-10 14:01:44 +02:00
ea42f04ae0 docs(quick-261010-iwu): Blog Editor live preview pane 2026-10-10 13:59:10 +02:00
ea955b39ae docs(16.2-05): update state, roadmap and windows ledger after plan 05 2026-10-10 13:36:19 +02:00
aba1ef7391 docs(16.2-05): complete Blog Editor release and UAT acceptance plan 2026-10-10 13:35:44 +02:00
f1d8a757fd docs(16.2-04): update state and roadmap after plan 04 v0.1.18 2026-10-10 13:07:31 +02:00
2786faade3 docs(16.2-04): complete Journal embeds layer release plan 2026-10-10 13:07:11 +02:00
ffa6d18474 docs(16.2-03): update state and roadmap after plan 03 2026-10-10 12:13:59 +02:00
2a7e9761a4 docs(16.2-03): complete Journal Blog Editor integration plan 2026-10-10 12:13:26 +02:00
332993c909 docs(16.2): record the editor-output policy extension 2026-10-10 12:11:30 +02:00
685cfc21cd docs(16.2-02): complete blog editor element plan
- SUMMARY with the package report, the human reply, installed versions,
  sm-journal-plugin commits and bundle size
- STATE, ROADMAP and the broken-windows ledger updated
2026-10-10 11:55:28 +02:00
5600c02a73 docs(16.2-01): update state and roadmap after plan 01 2026-10-10 11:28:33 +02:00
8237b7a19f docs(16.2-01): complete plugin field type framework plan 2026-10-10 11:27:58 +02:00
4adb48a76e feat(16.2-01): translatable plugin fields, element uploads and save notices in the admin
- MLPluginField wraps PluginField in the MLField locale switcher; the
  element gets the active content locale and that locale's string
- isMLField treats a translatable plugin field as a locale map in the form
  state, FormView adopt and the relation child modal
- summer-upload posts the file with the admin session to the field upload
  route and answers summer-upload-result {id, url} or {id, error}
- noticeLines shows meta.notices under each field as a warning status line
  (text only) and in the saved toast; the stored value is reloaded
- docs/backend/field-types.md documents the full element contract;
  modules/boardwalk/dist rebuilt
2026-10-10 11:25:26 +02:00
8fa92db96d feat(16.2-01): translatable plugin field types, untouched skip, writes, list values and uploads
- translatable types lift, store and hydrate through the ML path
  (isMLField); Decode and Load run per locale and notices carry the locale
- on update a value equal to the served value (Load of the stored host
  value or exact translation) is neither decoded nor written
- FieldWrite, FieldWritesFromContext and WithFieldWrites expose what a save
  writes to the Form hooks
- list columns may use a plugin alias and show the type's ListValue
- POST .../{id}/fields/{field}/upload hands the file to the type's Upload
  (guard, X-Requested-With, permissions, field context, record scope, body
  cap); OpenAPI, route inventories, README and docs updated
2026-10-10 11:19:24 +02:00
83fa2f7b2c feat(16.2-01): host plugin field type elements in the admin SPA
- loadFieldTypes fetches GET /field-types after sign-in, loads each script
  once and adds the styles as global links activateStyles never disables
- PluginField creates the type's element, sets the value property and the
  contract attributes, takes summer-change as the form value and never
  writes back a value the element just emitted
- rendererForField and isRegisteredField route any field with an element
  to PluginField in forms, previews and the save payload
- rebuilt modules/boardwalk/dist
2026-10-10 11:10:41 +02:00
717d46ec3d feat(16.2-01): compile, decode and load plugin field types in cabana
- compileFieldTypes builds a per-boot field type registry (alias, core and
  cross-plugin collisions, element prefix, assets, option keys) passed down
  the compile functions; settings and relation forms refuse plugin aliases
- fields.yaml accepts a plugin alias with the general keys plus the type's
  options (typeOptions, element, translatable in the schema); CheckOptions
  runs at boot; CompileFormWithTypes for plugin tests
- save decodes plugin values inside the transaction (FormFieldError is a
  422, other errors opaque 500) and answers meta.notices (FieldNotice) only
  when a type reported something; show and save serve values through Load
- GET /field-types lists the types with versioned asset URLs; OpenAPI,
  schema.d.ts, README and docs/backend/field-types.md updated
2026-10-10 11:06:12 +02:00
1e20ace15c feat(16.2-01): add the pact plugin field type API
- pact.HasFormFieldTypes and pact.FormFieldType: a plugin registers admin
  form field types under a short alias, with element, assets, options and
  CheckOptions/Decode/Load/ListValue/Upload funcs
- FormFieldValue, FormFieldDecoded (value plus notices), FormFieldNotice,
  FormFieldUpload, FormFieldUploadResult and FormFieldError
- ListValue takes the request context: func(ctx, value) string
2026-10-10 11:03:01 +02:00
0754a6e5ab docs(16.2): revise phase plans after phase 16.1 2026-10-10 02:27:05 +02:00
94900f233b docs(16.2): amend D-10 to strip on every admin save, categories included 2026-10-10 01:57:55 +02:00
9656bab214 docs(phase-16.1): complete phase — UAT passed, verification passed 2026-10-10 01:49:19 +02:00
433a543f85 test(16.1): UAT item 1 passed — hardened vhost installed on UAT 2026-10-10 01:42:52 +02:00
f734d25d05 test(16.1): persist human verification items as UAT 2026-10-10 00:58:42 +02:00
967449bf62 docs(16.1): add phase verification; record Docker-host suites green 2026-10-10 00:58:28 +02:00
c21fe36de7 docs(16.1): record translation and duplicate-attribute sanitizing; close audit warnings v0.1.17 2026-10-10 00:14:14 +02:00
17d467e9c2 docs(phase-16.1): add security threat verification; fix stale validation row 2026-10-10 00:07:06 +02:00
60892ad49b docs(16.2): create phase plan 2026-10-09 23:55:01 +02:00
cd25af0878 fix(admin): scope remembered list state to the signed-in admin and recover from bad restored queries
- Store list queries under summer-admin.list:<admin id>:<controller>; me()
  and setCurrentUser set the owner, which removes other admins' keys and
  the unscoped keys of older builds; nothing is read or written without one
- clearUser removes every stored query, so logout, session expiry and an
  unrecoverable 401 (expireSession, now used by main.ts) all clear them
- A list request built from a restored query that fails for any reason
  (422, 500, network) forgets the query and loads the plain list once
- A failing URL query keeps the error and offers a reset button
  (backend::lang.list.reset_list, en and pl)
- Document remembered list state in docs/backend/lists-and-filters.md
- Rebuild modules/boardwalk/dist
2026-10-09 23:53:19 +02:00
5be98a0c83 docs(16.1): decide bluemonday for journal HTML sanitizing 2026-10-09 23:35:17 +02:00
cd076b881d docs(16.1): add code review report 2026-10-09 23:22:14 +02:00
b319b59989 docs(16.2): map phase patterns 2026-10-09 23:17:15 +02:00
1920ea6462 docs(phase-16.2): add validation strategy 2026-10-09 23:11:57 +02:00
99dd072f07 docs(16.2): research phase domain 2026-10-09 23:11:04 +02:00
b4adf751c8 docs(16.1-03): update state and roadmap after plan 03 2026-10-09 22:52:51 +02:00
62025d22b3 docs(16.1-03): complete unit tests plan 2026-10-09 22:52:32 +02:00
837e40ae6a docs(16.1-03): record phase 16.1 validation results 2026-10-09 22:51:10 +02:00
837922cf43 test(cabana): relation subquery and locale order coverage
- TestListRelationSQL: DryRun matrix for belongsToMany (incl. custom pivot keys and self-reference), hasMany, hasOne and belongsTo search and sort, soft delete, 422 refusals, bound and LIKE-escaped search values, no outer JOIN next to ListExtendQuery and scope predicates
- TestListRelationSearchPostgres: exact total through two matching tags, string_agg sort order and hasMany search on Postgres
- TestEnabledLocalesDefaultFirst: default-locale ordering cases
2026-10-09 22:47:57 +02:00
a8bce9c01f test(admin): list state round trip and storage coverage
- Form back, cancel, save-and-close and delete land on the list with the stored query; every list request after the return carries it
- listState helpers: key prefix, malformed stored values removed, empty query stores nothing, throwing storage
- ListView entry: URL wins, cleared controls forget the query, same-list navigation, 422 forgets, page clamp
- Logout removes every list key and keeps the sidebar preference
2026-10-09 22:42:36 +02:00
3b8527b397 docs(16.1-02): update state and roadmap after plan 02 2026-10-09 22:37:49 +02:00
80f4497f95 docs(16.1-02): complete release and UAT redeploy plan 2026-10-09 22:37:19 +02:00
d77393b4d1 docs(16.1-01): update state and roadmap after plan 01 v0.1.16 2026-10-09 21:05:55 +02:00
0ec2e31ffa docs(16.1-01): complete journal admin fixes plan 2026-10-09 21:05:31 +02:00
9cac45c389 fix(admin): keep list state in the URL and browser storage
- listState.ts stores each list's query (search, sort, dir, page, per_page,
  filter[name]) under summer-admin.list:<controller>; an empty query is
  never stored, malformed stored values are dropped like a hand-edited URL
- ListView restores the stored query into the URL before its first list
  request when entered without list params; a URL with list params wins
- a 422 forgets the stored query; an out-of-range page clamps to last_page
- logout clears every stored list query
- check-phase10.sh allows browser storage in useSidebar.ts and listState.ts
- list smoke tests start from a clean list state
- rebuilt modules/boardwalk/dist
2026-10-09 21:04:00 +02:00