Changelog
v2.1.2 — Upcoming
Fix Prefix admin
The admin route now accepts the provided prefix, routes are no longer hardcoded to /admin, for surcharge template a key {{ admin_prefix }} is necessary. For moment user /admin to prefix
Fix Admin bulk JS — checkboxes
`admin-bulk.js` now listens to `htmx:afterSwap` on `#list-content` and re-attaches all checkbox listeners (`#bulk-check-all` and `.bulk-check`). Previously, pagination and filter navigation via HTMX recreated DOM elements without event listeners, breaking the select-all checkbox.
Fix Admin middleware
now redirects to `{prefix}/login` using the configured prefix from `AdminState`. Unmatched routes pass through without triggering the redirect. * **`admin_prefix` missing from all admin template contexts:** `inject_admin_prefix` was not called in `inject_context` (shared handler entry point), causing `Variable admin_prefix not found` in templates. Now injected centrally so every admin view has access to it. * **`AdminRoutes` struct added:** `admins::routes(prefix)` now returns `AdminRoutes { router, prefix }` instead of a bare `axum::Router`, so the staging layer can propagate the prefix to `AdminConfig` automatically without a separate `.prefix()` call.
Fix FK resolution in admin list_display
New optional third element in list_display DSL: ["menu_id", "Menu", "menus.titre"] // column label table.target_column When provided, the generated list_fn automatically resolves FK integer IDs to human-readable labels in the list view. A single SELECT ... WHERE id IN (...) is issued per FK column, post-processed in memory via HashMap. Compatible with i32, i64 and UUID primary keys — uses CAST(id AS TEXT) on the SQL side and HashMap on the Rust side to be type-agnostic. FK columns are excluded from full-text search (searching a raw FK ID is meaningless). Files changed: runique/src/admin/daemon/parser.rs — FkDisplay struct, parse_list_display with optional third element runique/src/admin/daemon/generator.rs — FK resolution blocks in write_list_fn, updated write_search_conditions and build_display_chain
Fix derive_form
Time/Date/Datetime fields not saved in `partial_update`:** a `return None` arm at the top of the match in `generate_partial_update` was silently discarding all temporal fields before reaching the correct chrono-parsing arms added in 2.0.2 — those arms were unreachable dead code. The blocking arm is removed; `NaiveTime`, `NaiveDate`, `NaiveDateTime`, and `DateTime` now persist correctly via `admin_partial_update`.
Fix DSL `bulk_create: field
multi-record creation from a single form submit:** when `bulk_create: field_name` is declared on a resource in `admin!{}`, the generated `create_fn` splits `data[field_name]` by comma and inserts one record per value. Designed for `CheckboxField` multi-select (e.g. selecting multiple days of the week to create one `horaire` row per day).
Fix unique_together
`unique_together` generates `.unique_key()` — not found on `IndexCreateStatement`:** sea-query rc.27+ renamed `IndexCreateStatement::unique_key()` to `unique()`. The call in `generators.rs` is updated; `.unique_key()` on `ColumnDef` is unaffected. * **Enum tuple syntax `Variant = ("db_value", "Display")` ignored in migrations:** `parser_builder.rs` only handled `syn::Lit` directly after `=`. When the value was a tuple `(...)`, parsing failed and fell back to the Rust variant name (e.g. `'Entree'` instead of `'entree'`), causing SeaORM deserialization failures. Fixed with a `parenthesized!` branch that extracts the first string from the tuple.
Fix Makemigrations
`EihwazSessionsMigration`:** `ensure_admin_migration_positioned()` now inserts `EihwazSessionsMigration` between `EihwazUsersMigration` and `AdminTableMigration` in the generated `lib.rs`. The duplicate-filter and `FRAMEWORK_TABLE_PATTERNS` are updated accordingly. This table is use for persistance session after reload server
Fix Migration
`AdminTableMigration`:** `create_eihwaz_sessions_table()` is now called inside `AdminTableMigration::up()` (between `eihwaz_users_groupes` and `eihwaz_history`). The corresponding `DROP` is added to `down()`. New projects no longer need to add this migration manually.
Ajouté Request` query/path helpers
four new methods on `runique::context::Request`: * `get_path(key) -> Option<&str>` — raw path parameter. * `get_path_as::<T>(key) -> Option<T>` — typed path parameter (parses via `FromStr`). * `get_query(key) -> Option<&str>` — raw query string parameter (replaces `from_url`). * `query::<T>() -> Option<T>` — deserializes the full query string into a struct via `serde_qs`; `raw_query` is now stored on `Request` at extraction time.
v2.1.1 — 2026/05/02
Fix Responsive
Responsive admin — Several visual elements to fix on mobile/tablet.
Fix Admin view
Admin search — Debounce 300-500ms; WHERE on all model columns when list_display is empty, otherwise WHERE on list_display columns only. Current bug: falls back to id only when list_display is empty.
Fix Admin view
Admin filter persistence — Preserve search, filter_*, page, sort_by in the return URL after edit/delete. Current behavior: everything resets after redirect.
Fix Coverage test
Re-evaluate current rate (many features added since last audit). Target: 82% minimum line coverage.(try it)
Fix Multiple fix Makemigrations
derive_form bug fixes This release fixes a series of bugs in the derive_form proc-macro, uncovered while testing against a real project. No public API changes. Migration fixes unique_together and indexes defined in meta { } were silently ignored — SQL constraints are now correctly generated PascalCase model names in relations produced wrong module paths (super::menuimage instead of super::menu_image)
Fix Multiple fix Makemigrations
Entity generation fixes fk() in v2 blocks was silently ignored The skip attribute was unknown to the parser Decimal was missing from partial update and form mapping functions many_to_many syntax with a junction table was incorrect
Fix Multiple fix Makemigrations
Compilation fixes sea_query::ForeignKeyAction not found — re-exported from runique::migration rust_decimal::Decimal not found — replaced with sea_orm::prelude::Decimal .references_column() replaced with .to_column() via_self in ManyToMany relations generated the wrong variant name
Feature Forms
#[form] field override — field_override("name", |f| f.label("...").placeholder("...")) to configure label/placeholder on fields generated by the proc-macro.
Feature DIspatch_email
Add Email client SMTP/Console backends — Async email sending via lettre with configurable backend via EMAIL_BACKEND env var. Add Email builder — Fluent API for to, subject, html, text, reply_to; Tera template rendering with context! macro support. Add dispatch_email() — Shorthand helper for plain-text email sends in one call.
Feature Admin view
Admin history — CRUD action log per user: who changed what and when.
v2.1.0 — 2026/04/26
Fix Csp
Add the integration of integrity and crossorigin attributes in the static tag. The syntax of the tag changes from `{% static %}` to "{% static %}".
Fix Admin view
Group action available — bulk update fields directly from the list view via predefined selects (is_active, is_staff, etc.)
Fix add_js on Forms
The form function used to add a JS file now also adds CSP.
Fix Forms
Removal of Forms setters and getters in favor of using cleaned_{type}
Fix https
Following HTTPS production testing (~2h downtime), HTTP/1 and HTTP/2 support was fixed, removing the need for Nginx.
Feature Forms
Prisme refactor — form extraction integrated into Request Prisme removed as an Axum extractor. The pipeline (Sentinel → Aegis → CSRF) now runs automatically inside Request::from_request. Handlers access submitted form data via let form: MyForm = req.form() — no more Prisme parameter needed.
v2.0.2 — -> Upcoming
Fix derive_form
* **Time/Date/Datetime fields not saved in `partial_update`:** a `return None` arm at the top of the match in `generate_partial_update` was silently discarding all temporal fields before reaching the correct chrono-parsing arms added in 2.0.2 — those arms were unreachable dead code. The blocking arm is removed; `NaiveTime`, `NaiveDate`, `NaiveDateTime`, and `DateTime<Utc>` now persist correctly via `admin_partial_update`.
v2.0.0 — 2026/04/14
Feature derive_form
### Breaking Change — Semantic field types (derive_form 2.0.0) The DSL now uses semantic field types instead of raw SQL types. `String`, `i32`, `VARCHAR(n)` and other SQL primitives are removed from the `fields:` block and replaced by meaningful types that describe what the field is, not how it is stored. **Before:** fields: { username: String [max_length: 150, required] } **After:** fields: { username: text [max_length: 150, required] } The parser now automatically generates both the correct SQL schema (adapted per database engine detected from `.env`) and the form field code. No more duplicate declarations between model and form.
Fix Runique
Follows derive_form 2.0.0. All projects using model!{} macros must migrate their field declarations to the new semantic syntax. The framework itself gains no breaking changes beyond the DSL — middleware, admin, forms engine, and templates are unchanged. A migration guide will be provided covering the type mapping from 1.x SQL types to 2.0 semantic types.
v1.1.54 — 2026/04/11
Feature Admin view
Admin — permissions: removed from admin!{}: The permissions: [...] field is no longer accepted by the admin!{} macro. Remove it from all resource declarations — access control is now fully managed from the admin panel via scoped permissions. See the Permissions documentation.
Fix Admin view
search & filters (HTMX): Fetch-based admin list view with filter persistence. Includes search bar functionality, partially powered by HTMX.
Feature Admin view
Supports grouped/permission for actions (e.g. bulk delete/edit) in the admin view.
Fix Admin view
Admin — CSRF on login with DB sessions: Fixed CSRF token validation on the admin login page when using database-backed sessions.
Fix Macro search
Macro wrapping sea-orm queries, simplified and intuitive syntax
Fix Deriv_form
Modified — Procedural macro deriv_form to support Sea-ORM relations Updated — search! macro to align with deriv_form changes
Fix Logout
logout (session not cleared): Fixed an issue where users remained authenticated after logout. The session is now properly invalidated server-side, and the cookie is correctly cleared.
Fix Migration
table relationship order: Fixed table relationship ordering issues during creation. The CLI now generates migrations in the correct dependency order.
Fix Admin view
resource-level permissions system: Replaces static permissions: [...] with a database-driven system managed from the admin panel. Scoped permissions use resource_key and access_type (view / write). Write access is enforced server-side before every POST operation.
Fix Admin view
configure {} block in admin!{}: Allows configuring display options (list_display, list_exclude, list_filter) for any registered resource, including builtins. Admin — builtin resources (users, droits, groupes): Automatically registered with full CRUD support. No manual admin!{} declaration required.
Fix Admin view
resource_order([...]) allows controlling navigation order in the admin panel.
Fix Admin view
user creation flow: Users are created inactive and activated only after password setup via email reset flow. Login is blocked until activation is complete. separate create_form: support: Allows defining a dedicated form for creation, enabling password reset flow integration.
Fix Logger
Configurable logging (log_error, log_db, log_security, etc.) with builder error
Fix Macro search
up to take a relationship declaration
v1.1.53 — 2026/03/21
Fix Versionning Css
CSS versioning is now based on the file size.
Fix pagination
Pagination in the admin view is now functional and configurable in `admin.rs`.
Fix Boolean field
An unchecked boolean field is now treated as `false` rather than absent — the `required` validation no longer requires the box to be checked.
Fix Role vue admin
The addition of access permissions in the admin view is now functional; the documentation will provide more detailed information.
Fix Admin view
Restore template overriding functionality through the builder in the admin panel, and separate the demo logic from it
Fix Exercice interactif
Interactive exercise based on a prompt, connected to an AI, offering exercises on the current course -> in beta on the demo
Fix Password
The password field has been removed from the admin edit view. Password changes will now be handled through a dedicated email-based reset form.
Fix trim
Passwords and other database entries are now automatically passed through a `trim`, preventing any discrepancies caused by accidental spaces.
Fix Invalidation de session
Ability to choose whether to invalidate an active session when logging in from another device.
v1.1.51 — 20/03/2026
Fix Version derive_form -> Runique
The release order was reversed, publishing Runique 1.1.50 with the wrong version of `derive_form` 1.1.33 instead of 1.1.34.
v1.1.50 — 2026-03-20
Fix FileField — validation des restrictions
Invalid files are automatically deleted from the disk if validation fails. Submissions without a file no longer create orphaned files. The `upload_to()` function sets the exact path, and files are only moved in `finalize()` after successful validation.
Fix RuniqueForm::clear() + Forms::clear_values()
Clears all field values (except CSRF) and resets `submitted` to `false`. Requires `&mut self` — can be called from a handler or from `save(&mut self)`.
Feature derive_form — option file()
Models can now accept a file upload link.
v1.1.49 — 2026-03-19
Fix Makemigrations — ordre FK et updated_at
The new tables are topologically sorted before generation. `updated_at` is generated with `ON UPDATE CURRENT_TIMESTAMP` (MySQL) or a trigger (PostgreSQL). The diff detects columns that have gained or lost `DEFAULT CURRENT_TIMESTAMP`.
Fix is_valid() bloquait tous les formulaires
`set_expected_value()` has been removed from `Forms::new()`. CSRF is already validated upstream in Prisme — double validation was causing every submission to be rejected, even with correct data.