diff --git a/CHANGELOG.md b/CHANGELOG.md index 19963ba..8ceaa85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,79 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.11.0] — 2026-06-02 + +### Added +- **Faithful rendering for every form-spec `widget.kind` (#664).** The + form-spec wire declares 23 `widget.kind` values; the change form previously + mapped only 5 and let the rest silently fall back to the control implied by + `FieldType` — so `hidden` rendered as a *visible, editable* input, + `split-datetime` collapsed to one control, and the multi-selects / `file` + had no faithful path. `adaptFormSpec` now maps **all 23** explicitly (an + exhaustive `Record` so a new kind is a compile error), and + `FieldInput` gained branches for `hidden` (real hidden input), + `split-datetime` (date + time), `select-date` (date input), + `checkbox-multiple` / `select-multiple` (checkbox bank / ``) | 🟡 [#626](https://github.com/MartinCastroAlvarez/django-admin-react/issues/626) (API emits the hint; SPA still renders dropdown) | +| `raw_id_fields` (pk text input + lookup popup) | ✅ | +| `radio_fields` (inline radio buttons vs `` (default choice control) instead of inline radio buttons. | [#626](https://github.com/MartinCastroAlvarez/django-admin-react/issues/626) | -| `filter_horizontal` / `filter_vertical` (M2M shuttle widget) | Renders the generic multi-select checkbox list, not Django's two-pane shuttle. Switch the field to `autocomplete_fields` for a workable SPA UX. | [#627](https://github.com/MartinCastroAlvarez/django-admin-react/issues/627) | +| `formfield_overrides = {Field: {"widget": CustomWidget}}` | Custom widget rendered via the React widget-registration API (`registerFieldWidget`, #625) when the consumer registers a renderer for the widget class; otherwise falls back to the default control + an operator-visible "not registered" note. | [#625](https://github.com/MartinCastroAlvarez/django-admin-react/issues/625) | +| `empty_value_display` | **Hard-coded to `—`.** A per-`ModelAdmin` / per-field `empty_value_display` override is **not** surfaced — the SPA renders the literal em-dash for every empty value, regardless of the consumer's chosen placeholder. | [#629](https://github.com/MartinCastroAlvarez/django-admin-react/issues/629) | +| Custom `AdminSite.each_context(request)` extra keys | Not surfaced. Only a fixed set of site attributes (`site_header` / `site_title` / `site_logo` / `site_primary_color`) reaches the SPA; any extra keys a consumer adds in a custom `each_context` are dropped. | [#629](https://github.com/MartinCastroAlvarez/django-admin-react/issues/629) | +| `list_select_related` | A backend query-optimisation concern, applied server-side by the REST API's queryset; it changes query efficiency, **not** the wire shape, so it is intentionally invisible to the SPA (no client-visible effect to surface). | [#629](https://github.com/MartinCastroAlvarez/django-admin-react/issues/629) | | `GenericForeignKey` / `GenericInlineModelAdmin` | Support gap — verify per-model before relying on the SPA. | [#628](https://github.com/MartinCastroAlvarez/django-admin-react/issues/628) | -| `LANGUAGE_CODE` / `gettext` / `Accept-Language` | The SPA chrome stays English; translated `verbose_name` / `help_text` / `@admin.action(description=_("..."))` are not surfaced per-request. | [#630](https://github.com/MartinCastroAlvarez/django-admin-react/issues/630) | +| `LANGUAGE_CODE` / `gettext` / `Accept-Language` | SPA chrome strings translate via the bundled catalogs (es / fr / pt; #630); translated `verbose_name` / `help_text` / `@admin.action(description=_("..."))` flow through when `LocaleMiddleware` is installed. | [#630](https://github.com/MartinCastroAlvarez/django-admin-react/issues/630) | | `ModelAdmin.get_urls()` custom views | Opens as a popout (``) into the Django-rendered HTML page — no SPA chrome, no breadcrumb. The link IS surfaced; the UX is just outside the SPA. | [#623](https://github.com/MartinCastroAlvarez/django-admin-react/issues/623) | -| Django 4.2 LTS support | Not yet — the package pins `django >= 5.0,<7.0`. | [#622](https://github.com/MartinCastroAlvarez/django-admin-react/issues/622) | If your admin relies on any "silently ignored" hook above, the typical workaround is to keep that model on the legacy diff --git a/SECURITY.md b/SECURITY.md index e893d3c..3c68372 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -275,6 +275,7 @@ Content-Security-Policy: connect-src 'self'; # the API is same-origin manifest-src 'self'; worker-src 'self'; # the PWA service worker + frame-src 'self'; # legacy-admin iframe fallback (#659) — same-origin only frame-ancestors 'none'; # clickjacking (with X_FRAME_OPTIONS) base-uri 'self'; form-action 'self'; @@ -291,6 +292,26 @@ Caveats — **validate before enforcing**: `style` attributes at runtime; it is far lower-risk than allowing inline scripts. Drop it if you verify your build needs no inline styles. +- `frame-src 'self'` and the **X-Frame-Options interaction** — the SPA's + legacy-admin fallback (#659) embeds the legacy admin change/add page in + a **same-origin** `