Skip to main content
This page documents breaking changes and upgrade notes between versions, ordered from newest to oldest.
After upgrading, if a new database column has been added, run php bin/console nowo_dashboard_menu:generate-migration --update to generate an ALTER migration, then apply it with php bin/console doctrine:migrations:migrate.

From 0.3.24 to 0.3.25

No breaking changes.
  • Dashboard import modal: import submit now handles redirects reliably after successful POST + 302 responses, so the modal no longer appears stuck.
  • Dashboard item list: rows are rendered in deterministic tree order using item position (sibling fallback by id), and the table displays each item position under its parent label.
  • Performance: reduced N+1 risk in dashboard copy/export/edit flows (copy uses a flat preloaded item list, descendant lookup uses BFS, import uses an in-memory has-children map, export-all loads all items in one query).

From 0.3.22 to 0.3.23

No breaking changes.
  • LiveComponent: fixes item modal submit crash; per-locale label_{locale} fields hydrate reliably.
  • Dashboard UI: item modal icon field uses a plain text input so the stored icon string is always prefilled during LiveComponent editing.
  • Demos: asset build commands run inside the demo Docker container (make assets / make ts-assets) for consistent pnpm behaviour.

From 0.3.23 to 0.3.24

No breaking changes.
  • Dashboard UI: menu item labels are rendered using MenuItem::getLabelForLocale().
  • Dashboard item forms: “Add child” modal shows only label + per-locale translations (type fixed to Link) and hides icon/position fields.
  • Dashboard item forms: icon identity editing uses a normal Symfony form (not LiveComponent) to ensure the icon-selector widget refreshes correctly.
  • Dashboard item forms: label validation accepts either a non-empty base label or at least one non-empty translation; empty position values are normalized to 0.

From 0.3.21 to 0.3.22

No breaking changes.
  • Config: new optional dashboard.icon_size to control the CSS size of rendered menu item icons.
  • Templates/overrides: item.label is already resolved for the current locale by MenuTreeLoader; if you override menu.html.twig, prefer rendering item.label as-is (avoid an extra |trans(...)).

From 0.3.20 to 0.3.21

No breaking changes.
  • Config/UI: new dashboard.item_span_active option to optionally render an extra wrapper <span> around non-section items in menu.html.twig.
  • Config: wrapper class is taken from the first non-empty value in dashboard.css_class_options.span.

From 0.3.19 to 0.3.20

No breaking changes.
  • Config: new dashboard.id_options to drive the dashboard menu form field ulId (dropdown vs plain text).
  • Menu entity: added nullable Menu.ulId mapped to DB column ul_id. When set, the rendered menu root <ul> gets id="...".
Database migration required. Existing installations must add the ul_id column:
php bin/console nowo_dashboard_menu:generate-migration --update
php bin/console doctrine:migrations:migrate

From 0.3.18 to 0.3.19

No breaking changes.

From 0.3.17 to 0.3.18

No breaking changes.
  • Dashboard UI spacing: default CSS class options were updated (gap-2gap-1). If you depend on exact default class strings, re-check your expectations.

From 0.3.16 to 0.3.17

No breaking changes.
  • CSRF: dashboard item forms explicitly set csrf_token_id to submit to keep CSRF consistent across Symfony versions.
  • Dashboard templates: autocomplete form theme is applied only when Symfony\UX\Autocomplete is available; overrides of _item_form_partial.html.twig, item_form.html.twig or components/ItemFormLiveComponent.html.twig should keep the same conditional if you rely on autocomplete.
  • Demo Symfony 7: sessions + CSRF and framework.property_info are enabled to avoid config option errors on older Symfony versions.

From 0.3.15 to 0.3.16

No breaking changes.
  • Config: optional dashboard.permission_key_choices (array of strings) turns the item form permission key field into a select with autocomplete.
  • Add child: parent ID is sent in the form action URL; the “Add child” button is disabled for section and divider items.
  • MenuItem: itemType is now nullable (DB and entity); getter/setter handle null. No change needed unless you type-hint or reflect on the property.
  • Permission checkers: if you add a custom checker, tag it with nowo_dashboard_menu.permission_checker and optional label.

From 0.3.14 to 0.3.15

No breaking changes.
  • Dashboard: menu and item forms are split into definition (pencil icon) and configuration (gear icon). New menu/item shows only definition; after creation edit configuration via the gear button.
  • Redirect: after any successful dashboard action the app redirects to the same-origin referer URL.
  • Import: the import form can be opened in a modal (AJAX) from the dashboard index.
If you override _menu_form_partial.html.twig or _item_form_partial.html.twig, update your overrides to handle form.definition / form.config (menu) and form.basic / form.config (item), and the section_focus variable.
  • MenuItem: label property is now nullable (for divider items). The getter still returns a string (empty string when null). Update type hints if you extend or reflect on the entity.

From 0.3.13 to 0.3.14

No breaking changes.

From 0.3.12 to 0.3.13

No breaking changes.
  • New menu option nestedCollapsibleSections: when disabled, section-type items do not collapse their children.
  • Export/import now includes classSectionLabel and nestedCollapsibleSections.
  • New required dependency: symfony/mime (for the import form file validator).
  • ImportMenuType constraints updated for Symfony 7/8 (named arguments).

From 0.3.11 to 0.3.12

No breaking changes.
  • Demos now rely on Doctrine Migrations (instead of schema update) and ship a single “create tables” migration matching the current schema.
  • The migration generator command supports --update to create ALTER migrations for existing installations.

From 0.3.10 to 0.3.11

No breaking changes.
  • The dashboard menu list shows the number of items per menu.
  • The dashboard menu items table is more responsive (actions moved left, up/down stacked).
  • New required dependency: symfony/ux-autocomplete.

From 0.3.9 to 0.3.10

No breaking changes. Unit tests were updated after replacing RegisterTwigNamespacePass with TwigPathsPass.

From 0.3.8 to 0.3.9

No breaking changes. The bundle now registers its Twig views via TwigPathsPass. Application overrides in templates/bundles/NowoDashboardMenuBundle/ continue to take precedence.

From 0.3.7 to 0.3.8

No breaking changes. Dashboard export links now open in a new browser tab.

From 0.3.6 to 0.3.7

No breaking changes. New optional security options:
  • dashboard.required_role — when set (e.g. ROLE_ADMIN), all dashboard routes require this role. Requires Symfony SecurityBundle.
  • dashboard.import_export_rate_limit — optional rate limit for import and export (e.g. { limit: 10, interval: 60 }). Returns HTTP 429 when exceeded.
  • dashboard.import_max_bytes — max size in bytes for JSON import uploads (default 2 MiB).
Dashboard delete and move up/down actions now validate CSRF and use POST for move actions; no change needed if you use the bundle’s dashboard templates.

From 0.3.5 to 0.3.6

No breaking changes. The bundle registers the Twig namespace @NowoDashboardMenuBundle so that templates in templates/bundles/NowoDashboardMenuBundle/ take precedence.

From 0.3.4 to 0.3.5

Translation domain changed. The bundle now uses the domain NowoDashboardMenuBundle (no longer messages or validators). Bundle files are NowoDashboardMenuBundle.{locale}.yaml.If you override bundle strings in your app:
  1. Rename or create translations/NowoDashboardMenuBundle.{locale}.yaml (e.g. NowoDashboardMenuBundle.en.yaml).
  2. Use the same key structure (dashboard.*, form.*).
  3. Remove any app overrides under messages.* or validators.* that were only for this bundle.

From 0.3.3 to 0.3.4

No breaking changes.
  • Dashboard export/import: export/import menus as JSON (config + item tree, no internal IDs).
  • Config: dashboard.layout_template to choose the Twig layout dashboard views extend (default unchanged).
  • Dashboard content block is now content (was dashboard_body). If you override the bundle’s dashboard layout template, ensure it defines {% block content %}.
  • MenuUrlResolver: fills missing route path params from the current request and adds a flash message on URL generation failure.

From 0.3.2 to 0.3.3

No breaking changes. Permission checkers are now auto-tagged: any service implementing MenuPermissionCheckerInterface is included in the dashboard dropdown automatically. You can remove the manual tag from your checker service. Optionally set the label via DASHBOARD_LABEL constant or #[PermissionCheckerLabel('...')] attribute.

From 0.3.1 to 0.3.2

No breaking changes. permission_checker_choices now accepts a list of service IDs (to order/filter the dropdown) as well as the existing map (service id => label).

From 0.3.0 to 0.3.1

No breaking changes. New optional config: permission_checker_choices (service id => label map) to customize the “Permission checker” dropdown.

From 0.2.x to 0.3.0

  • Restored support: PHP 8.2 and 8.3, and Symfony 6.4 and 7, are supported again. You can downgrade from PHP 8.4 to 8.2 or use Symfony 6.4/7 if needed.
  • Optional dependency: nowo-tech/icon-selector-bundle is no longer required. If you had it installed, it continues to work. If you remove it, the icon field becomes a plain text input.

From 0.1.x to 0.3.0

  • New: Symfony 6.4 (LTS) is supported; requirements are PHP >= 8.2 < 8.6, Symfony ^6.4 || ^7.0 || ^8.0.
  • Optional: For the icon selector widget in the dashboard item form you can install nowo-tech/icon-selector-bundle (suggested; requires Symfony ^7.0 || ^8.0). Without it, the icon field is a text input.

From 0.0.1 to 0.1.0

No breaking changes. New features: configurable cache for menu tree, icon_library_prefix_map, two-query SQL path in MenuRepository::findMenuAndItemsRaw(), Web Profiler panel “Dashboard menus”, and Doctrine table quoting via Platform::quoteSingleIdentifier(). Configure cache.ttl / cache.pool and icon_library_prefix_map in your config if needed.

0.0.1 (first release)

No upgrade path; this is the first stable release.
  • Requirements: PHP >= 8.2 < 8.6, Symfony ^6.4 || ^7.0 || ^8.0, Doctrine ORM ^2.13 || ^3.0. No Gedmo or Stof extensions required.
Future breaking changes will be documented here (e.g. “From 0.x to 1.0”).