`8.4.0 (2025-10-10) `_ ============================================================================================== Overview of merged pull requests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `FEATURE: Restrict site creation module to site nodetype and hide legacy options `_ -------------------------------------------------------------------------------------------------------------------------------------------------- Hide "Import a site" and "Create a new site-package" by default in Neos 8.4 and add settings to re-enable these options were removed via Neos 9.0 but can be restored by settings: ```yaml Neos.Neos.modules.administration.submodules.sites.settings.enableLegacyPackageImport: true Neos.Neos.modules.administration.submodules.sites.settings.enableLegacyPackageCreation: true ``` **Upgrade instructions** * Packages: ``Neos`` `FEATURE: Add image helper and render image dimensions in image tag attributes `_ ------------------------------------------------------------------------------------------------------------------------------------------------ With this change a new image helper is introduced in Neos.Media which allows creating a thumbnail and using its various properties in Fusion object. This way the actual size of a thumbnail can be rendered into the HTML attributes. Until now we only had the uri from the ImageUri helper and component. **Review instructions** Adjust the image prototype renderer in the Demo like this: ``` prototype(Neos.Demo:Content.Image) < prototype(Neos.Neos:ContentComponent) { renderer = afx`
` // renderer = afx```` } ``` The resulting image should have with and height properties of the generated thumbnail and not the ones of the original. I'm not 100% sure if we could break something with this change if somebody modified the ImageTag prototype. We can also target 9.0 if the anybody thinks this would be better. * Packages: ``Media`` ``Neos`` `FEATURE: Fusion (EEL) core migrations for new 9.0 API (replaces `neos/rector` for Fusion) `_ ------------------------------------------------------------------------------------------------------------------------------------------------------------ Fixes the fusion part of https://github.com/neos/neos-development-collection/issues/5607 in a simple manner as a first iteration ### Behaviour for 9.0 This change introduces an extended way to write flow core migrations by providing a trait which allows for exact eel replacements. For this framework code see the changes in "Neos.Fusion" and its tests. Also this change introduces a first major user of this new migration api. The migration "20251005080230" contains all fusion migrations concerning the content repository that currently reside in ``neos/rector`` and were executed with rector. They are now part of "Neos.Neos" and can be executed as any flow core migration: ``` flow flow:core:migrate Neos.Demo --version 20251005080230 ``` The comprehensive testsuite for this cr-fusion migration was copied and adjusted from ``neos/rector`` to ensure all replacements work as desired. ### Behaviour for Neos 8.4 Introducing a core migration for 8.4 was considered but was found to be too magic as its truly an optional step which makes the code not backwardscompatible to previous neos versions. You can run the adjustments manually. They will not add todo comments like the 9.0 migration. It will be safe to rerun this migration and also to run the 9.0 migration via ``flow:core:migrate`` when updating. ``` ./flow neos9preparation:preadjustfusion Neos.Demo ``` **Upgrade instructions** * Packages: ``Neos`` `FEATURE: Filter users by role `_ ------------------------------------------------------------------------------------------------ * Resolves: `#5208 `_ **Review instructions** Go to there users module and filter the users by their role, also in combination with the search term !`CleanShot 2024-08-16 at 11 07 15@2x `_ * Packages: ``Neos`` `FEATURE: Improve user sorting behavior `_ --------------------------------------------------------------------------------------------------------- **Upgrade instructions** _None_ **Review instructions** Original PR: `#5159 `_ * Packages: ``Neos`` `FEATURE: Backport NodeHelper methods from 9.0 `_ ---------------------------------------------------------------------------------------------------------------- * Resolves: `#5627 `_ **Upgrade instructions** * Packages: ``ContentRepository`` ``Neos`` `FEATURE: Hacky backport of the 9.0 `renderingMode` in Fusion `_ ------------------------------------------------------------------------------------------------------------------------------- Neos 9.0 contains the introduction of FusionGlobals https://github.com/neos/neos-development-collection/pull/4425 which allowed to introduce ``renderingMode`` https://github.com/neos/neos-development-collection/pull/4505 as global like ``request``. We evaluated to fully back-port these features but this would require lots of effort and might be not agreeable as it certainly would break APIs across Fusion and Neos. But herby we introduce a super slim backport which disregards any architecture and makes ``${renderingMode}`` magically possible in Fusion when Neos is installed and nodes are rendered. The ``renderingMode`` attempts to align to the new 9.0 specification as close as possible - but the implementation is limited in two regards: - ``site``, ``documentNode`` or ``node`` have to be available in the current fusion context which can be tampered with in fusion by forgetting to register those in a cached segment. This would lead to ``renderingMode`` not being available but in 9.0 it would as its ever-present. - when nodes from the "live" workspace are rendered the renderingMode will switch to ``frontend`` which results in ``renderingMode.isEdit`` being false. In Neos 9 the rendering mode and the rendered nodes are decoupled from each other. With this backport a decoupling is not possible and using ``q().context()`` on a node and replacing that fusion variable might thus have implications on the ``renderingMode``. Also users of the herby introduced 8.4 ``renderingMode`` and its 9.0 brother should be aware its not behaving exactly as ``node.context.currentRenderingMode``. The rendering mode of the ``context`` returns for every logged in users its current rendering mode. This leads to ``edit`` being true for the frontend and for the backend in the neos ui. Only if logged out or when using a private window the frontend behaviour aligns to the Neos 9 specification and ``edit`` is false. The rector migration ```FusionContextCurrentRenderingModeRector`` `_/src/ContentRepository90/Rules/FusionContextCurrentRenderingModeRector.php#L27-L28>`_ still migrates it as an exact replacement to improve the current situation. **Upgrade instructions** * Packages: ``Neos`` `FEATURE: Adds new login wallpaper and backport attribution `_ ------------------------------------------------------------------------------------------------------------------------------ resolves `#5620 `_ Bildschirmfoto 2025-10-07 um 09 04 07 * Packages: ``ContentRepository`` ``Diff`` ``Fusion.Afx`` ``Fusion`` ``Media.Browser`` ``Media`` ``Neos`` ``NodeTypes.Form`` ``SiteKickstarter`` `FEATURE: Backport Neos.Caching Helper `_ -------------------------------------------------------------------------------------------------------- Backport of Neos.Caching Eel Helper to provide forward compatibility in Neos 8.4. ``` prototype(Acme.Site:Document) { @cache { mode = "cached" entryIdentifier { documentNode = ${Neos.Caching.entryIdentifierForNode(documentNode)} } } } ``` * Fixes: `#5628 `_ * Packages: ``Neos`` `FEATURE: Backport Neos.Site Helper `_ ----------------------------------------------------------------------------------------------------- Backport of Neos.Site Eel Helper to provide forward compatibility in Neos 8.4. ``` prototype(Acme.Site:Document) { name = ${Neos.Site.findBySiteNode(site).siteResourcesPackageKey} } ``` * Fixes: `#5629 `_ * Packages: ``Neos`` `FEATURE: Backport aggregateId from 9.0 `_ --------------------------------------------------------------------------------------------------------- * Resolves: `#5633 `_ **Upgrade instructions** With this change it's possible to use ``node.aggregateId`` which will return an instance of ``NodeAggregateIdentifier`` that can also be cast to a string which equals the ``node.identifier``. It is recommended to replace all ``node.identifier`` instances this way to already be compatible with Neos 9. See the related rector rule https://github.com/neos/rector/blob/main/docs/rules_overview.md#fusionnodeidentifierrector. Keep in mind to adjust places where you do a strict comparison as the returned value is not a plain string. * Packages: ``Neos`` `FEATURE: Site nodetype `_ ----------------------------------------------------------------------------------------- * Resolves: `#5617 `_ **Upgrade instructions** Add the abstract nodetype ``Neos.Neos:Site`` to your homepage nodetype like this: ```yaml 'My.SitePackage:Document.Homepage': superTypes: 'Neos.Neos:Site': true ``` **Review instructions** Newly generated sites and empty content repository should be initialised with the new sites nodetype and use the site mixing in the generated homepage. * Packages: ``SiteKickstarter`` `FEATURE: add more details to user list and user show command `_ ------------------------------------------------------------------------------------------------------------------------------- ### Description Adds more informations to the ``./flow user:list`` and ``./flow user:show`` command. **Upgrade instructions** _None_ **Review instructions** resolves: `#4357 `_ - [ ] Reviewer - Breaking Changes are marked with ``!!!`` and have upgrade-instructions * Packages: ``ContentRepository`` ``Media.Browser`` ``Neos`` ``NodeTypes.BaseMixins`` `FEATURE: Custom label for auto created child nodes `_ -------------------------------------------------------------------------------------------------------------------- Resolves: https://github.com/neos/neos-development-collection/issues/2276 This change add a node type configuration to generate a custom node label for auto created child nodes: ``` 'Neos.Neos.NodeTypes:Page': superTypes: 'Neos.Neos:Document': TRUE childNodes: main: label: 'Main Content Collection' type: 'Neos.Neos:ContentCollection' ``` This allow to have a less technical content tree. This change include the schema validation and default label for default node types. The label can be a string or an EEL expression. Inside the expression you can access the parent node in the variable ``parentNode``. * Packages: ``Neos`` ``ContentRepository`` `FEATURE: Support doctrine/dbal 2.x and 3.x `_ ------------------------------------------------------------------------------------------------------------- Declares compatibility with ``doctrine/dbal`` 3.x (in addition to the already supported versions ``2.8+``) and adjusts affected code such that it works with both versions * Packages: ``ContentRepository`` `FEATURE: Improve site:list command `_ ----------------------------------------------------------------------------------------------------- **Upgrade instructions** _None_ **Review instructions** Improves our ``./flow site:list`` command by render the list of all available sites directly in a table. !`WindowsTerminal_2VE3pBUkYq `_ * Packages: ``Neos`` `FEATURE: Link Neos logo in modules to primary module `_ ----------------------------------------------------------------------------------------------------------------------- In the default configuration this links to the content module, or to their user settings if they don’t have access to the content module. * Resolves: `#4799 `_ * Packages: ``Neos`` ``SiteKickstarter`` `BUGFIX: Preview modes do not display hidden nodes `_ -------------------------------------------------------------------------------------------------------------------- This makes the preview more realistic and helps editors better estimate how the end result will look like. * Packages: ``Neos`` `BUGFIX: Avoid duplicating shadow nodes `_ --------------------------------------------------------------------------------------------------------- This fixes a regression in handling shadow nodes while publishing in nested workspaces. Without this change we first create a new shadow node by replicating the move in the target workspace and then try to adjust the existing source shadow node to exist in the target, which triggers a duplicate key error. As commented, we can be sufficiently sure that the move operation will take care of (not) creating shadow nodes as necessary and any previously existing shadow node in the source workspace can be discarded safely. The new "else" branch should probably not be necessary, as if there was no move, there should never be a shadow node to adjust. Just in case though we leave this in place. Might clean up some leftover shadow nodes. * Fixes: `#5561 `_ * Related: `#1608 `_ * Packages: ``Media.Browser`` ``Neos`` ``NodeTypes.BaseMixins`` ``NodeTypes.ColumnLayouts`` ``NodeTypes`` ``ContentRepository`` `Revert "BUGFIX: Reload node if hidden state is updated via inspector" `_ ---------------------------------------------------------------------------------------------------------------------------------------- Reverts `#5602 `_ as it raises issues while using the toolbar actions to hide and show nodes. * See: `#5615 `_ * Packages: ``ContentRepository`` ``Media.Browser`` ``Neos`` ``NodeTypes.AssetList`` ``NodeTypes.BaseMixins`` ``NodeTypes.ColumnLayouts`` ``NodeTypes.ContentReferences`` ``NodeTypes.Form`` ``NodeTypes.Html`` ``NodeTypes.Navigation`` ``NodeTypes`` `BUGFIX: backend module links with no hover color `_ ------------------------------------------------------------------------------------------------------------------- **Upgrade instructions** _None_ **Review instructions** Issue: `#5586 `_ This fixes the issue at some places in the neos backend where links dont have a hover color. That where all places i found 🤔: https://github.com/user-attachments/assets/7c448606-5922-46b1-a0ae-400f724a2fad * Packages: ``Neos`` `BUGFIX: Reload node if hidden state is updated via inspector `_ ------------------------------------------------------------------------------------------------------------------------------- With this change nodes are updated in the guest frame when the hidden state is updated in the inspector. * Resolves: `#5601 `_ * Packages: ``Neos`` `BUGFIX: Neos backend login autofocus username `_ ---------------------------------------------------------------------------------------------------------------- When loading the backend login screen, one have to either TAB or click in the username field to input the login. Increase accessibility (and convenience) by autofocusing the field upon loading. **Note**: The password field already gets autofocus if the username is already filled (i.e. after a failed password attempt), which is why we have the ``@if`` here. * Packages: ``Neos`` `BUGFIX: Convert *DateTime XML elements to \DateTimeImmutable during import `_ --------------------------------------------------------------------------------------------------------------------------------------------- fixes: `#5248 `_ **Steps To Reproduce** Run ``./flow site:import`` on a site export (presumably one that has been done with Neos 8.3 or earlier) in a Neos 8.4 setup. Make sure ``doctrine/dbal@3.*`` is installed. You should see an error like this: ``` Exception `#1300360480 `_in line 99 of [...]/Framework/Neos.Flow/Classes/ObjectManagement/DependencyInjection/DependencyProxy.php: Error: During import an exception occurred: "Could not convert PHP value of type DateTime to type date_immutable. Expected one of the following types: null, DateTimeImmutable". ``` After checking out this branch, the error should be gone. * Packages: ``ContentRepository`` `BUGFIX: Fix checking workspaces when move nodes `_ ------------------------------------------------------------------------------------------------------------------ **Upgrade instructions** While fixing the move of nodes in `#5561 ``_I also noticed, that the workspace itself has not been checked correctly, as the workspaceName was checked against the Workspace (class) in the ``beginning of the move()-Method `_/Neos.ContentRepository/Classes/Domain/Model/NodeData.php#L886>``_. This PR fixes this and correctly compares the workspaces at the beginning of the ``NodaData::move()` method. * Packages: ``ContentRepository`` `BUGFIX: MediaBrowser's upload action shows empty flash message if file is too big `_ ---------------------------------------------------------------------------------------------------------------------------------------------------- expected (like in the standalone media browser) image actual (media browser insider neos ui): image interestingly the error works in the neos ui when one uses the media browsers drag and drop image ------- The existence of this bug was uncovered via https://github.com/neos/neos-development-collection/pull/5528 because previously no validation error was shown and on upload the server just died: image > Could not convert target type "Neos\\Media\\Domain\\Model\\Asset": Missing constructor argument "resource" for object of type "Neos\\Media\\Domain\\Model\\Asset". **Upgrade instructions** **Review instructions** This bug was uncovered because translate() simply returns undefined, if not initialised. No error no fallback, nuthing. Also while ``I18n.init()`` _IS_ called, it doesnt actually initialise anything. For that https://github.com/neos/neos-development-collection/blob/`847e4647d761249b5c48ade07fe08ad7d1db58c5 `_/Neos.Neos/Resources/Public/JavaScript/index.js#L23-L27 has to be invoked and that is done by adding the link. ------------------ Notice also that ist not particularly keen of us to initialise I18n once in the host (neos.ui) and then in the iframe too. This is just extra work for the browser, and we dump the iframe after selecting the image. Now my pr doenst improve that but there are ideas outlined here https://github.com/neos/neos-ui/issues/3119 and the first step for a global translate api was already introduced via https://github.com/neos/neos-ui/pull/3804. Nothing for a bugfix to build up on though. * Packages: ``Media.Browser`` `BUGFIX: Convert selectbox group labels i18n values `_ --------------------------------------------------------------------------------------------------------------------- **Review instructions** This change converts ``i18n`` values of group labels to shorthand strings like ``Neos.Demo:NodeTypes.Content.Headline:properties.tagName.selectBoxEditor.groups.h1``. This works together with https://github.com/neos/neos-ui/pull/3955 to make it possible to localise group labels for select box values like in the following example: ```yaml tagName: type: string defaultValue: 'h2' ui: label: i18n reloadIfChanged: true inspector: group: settings position: 10 editor: Neos.Neos/Inspector/Editors/SelectBoxEditor editorOptions: values: h1: label: h1 group: i18n h2: label: h2 group: i18n h3: label: h3 group: 'Neos.Demo:Main:group.label' h4: label: h4 group: Just some text h5: label: h5 group: 'Neos.Demo:Main:group.label' ``` * Packages: ``Neos`` `BUGFIX: Replace skip migrations with simple return `_ --------------------------------------------------------------------------------------------------------------------- If we use the skip migrations feature of doctrine, the migrations never get marked as applied. Which leads to situations, where your migration status will never be clean. So I replaced all skipif with a simple return. See also: https://github.com/doctrine/migrations/issues/1179 * Packages: ``ContentRepository`` `BUGFIX: Fix publishing for `Neos.Neos:RestrictedEditor` from 3rd level workspace `_ --------------------------------------------------------------------------------------------------------------------------------------------------- **Changes I made:** - ``WorkspacesController``: explicitly define the target workspace for case ``publish`` in ``publishOrDiscardNodesAction()`` **Why I'm changing this:** Our project has a workspace setup like ``Workspace A -> Workspace B -> Live``. Users, who are not allowed to publish to Live (like ``Neos.Neos:RestrictedEditor``) cannot publish nodes with childNodes from Workspace A to Workspace B, because it wrongly assumes that the targetWorkspace for the childNodes is Live. This fix sets the target workspace explicitly to prevent the system from assuming the wrong target workspace. The problem is more fully explained in the linked issue. resolved: https://github.com/neos/neos-development-collection/issues/5373 * Packages: ``Neos`` `BUGFIX: Find nodes marked as removed in other dimension `_ -------------------------------------------------------------------------------------------------------------------------- If you delete a node in a workspace that has already been deleted in the workspace in another dimension, the node is not marked as removed in the database. With this PR, nodes marked as removed are also found in non-live workspaces. related: `#5031 `_ * Packages: ``ContentRepository`` `BUGFIX: Boot media module flash-messages correctly if rendered outside Neos module `_ ----------------------------------------------------------------------------------------------------------------------------------------------------- Solves the bug described in https://github.com/neos/neos-development-collection/issues/5379#issuecomment-2701041702 Previously only flashmessages in the Default template (e.g. on show) where shown but neither for editing or uploading Flashmessages in the media module are not shown for all actions if the media module is booted within the Neos ui. The current error for ``edit`` or ``new`` action is that ``this.container`` (``#neos-notification-container``) is null and thus no flashmessages can be rendered in the dom: https://github.com/neos/neos-development-collection/blob/`c7be41ac865e096b62a019f3cf700222834b29f6 `_/Neos.Neos/Resources/Public/JavaScript/Components/Notification/Toast.ts#L39 The mentioned container is normally created by js itself as child to ``#neos-application`` https://github.com/neos/neos-development-collection/blob/`c7be41ac865e096b62a019f3cf700222834b29f6 `_/Neos.Neos/Resources/Public/JavaScript/Components/Notification/Toast.ts#L24 But the ``#neos-application`` is only rendered by the Backend Module Index template from Neos: https://github.com/neos/neos-development-collection/blob/`89d4c84c5640a49867d56592b6def1a2c6e5db0d `_/Neos.Neos/Resources/Private/Templates/Backend/Module/Index.html#L90 As the Media Ui provides a layout for the case of being rendered in the Neos backend module and for plain rendering as in the neos ui iframe (added via https://github.com/neos/neos-development-collection/pull/2171), the non module layouts must ensure that the shared javascript works by providing the desired dom structure. - Module/Default.html - Module/UploadImage.html - Module/EditImage.html - Default.html - UploadImage.html - EditImage.html The flashmessages for ``showAction`` (e.g. default layout) work already in the neos ui as two changes https://github.com/neos/neos-development-collection/pull/5133 and https://github.com/neos/neos-development-collection/pull/5117 provided a fix to make the flashmessages work by ensuring ``
`` is present. This pull request extends the fix of providing an ``#neos-notification-container`` container for the ``UploadImage`` and ``EditImage`` template: image **Upgrade instructions** * Packages: ``Media.Browser`` `BUGFIX: Allow boolean values for hidden properties in nodetype schema `_ ---------------------------------------------------------------------------------------------------------------------------------------- This prevents matching warnings in the configuration module or when verifying nodetypes via cli. * Resolves: `#5520 `_ * Packages: ``Neos`` `BUGFIX: Missing flash messages after Dropzone upload in Neos Media Browser `_ --------------------------------------------------------------------------------------------------------------------------------------------- related: https://github.com/neos/neos-development-collection/issues/5522 **Review instructions** - Navigate to the Neos Media Browser backend Module - Upload an Asset via the Dropzone by either Drag'n Dropping or clicking into the dropzone * Packages: ``Neos`` ``Media.Browser`` `BUGFIX: Recognize removed-state while reducing `_ ----------------------------------------------------------------------------------------------------------------- Please read Issue #3651, to get the problem. By adding the removed-state as 3rd priority while reducing NodeData results, we should always get the not-removed NodeData, if there are 2 (because of Node-move). I tested this fix on our projects, and it worked. I can't find something breaking. But since this is deep inside NodeData, I've no idea, if we could get unexpected side-effects on it. Thanks to @Nikdro for the change. Fixes: #3651 * Packages: ``ContentRepository`` `BUGFIX: Fix return type error with `getUriForThumbnail()` `_ ---------------------------------------------------------------------------------------------------------------------------- In ``getUriForThumbnail()`` the result of ``getPublicPersistentResourceUri()`` is returned unchecked, but may be ``false``. This conflicts with the declared return type ``string``. In that case an exception is now thrown (similar to when a static resource thumbnail URI cannot be generated). * Packages: ``Media.Browser`` ``Neos`` ``Media`` `BUGFIX: fix error during site import `_ ------------------------------------------------------------------------------------------------------- This adjusts the annotation to work with Flow 8.3.13 ... before the type with spaces was interpreted as ``mixed`` and caused the following error during site:import. ``` During the import of the "Sites.xml" from the package "Neos.Demo" an exception occurred: Error: During import an exception occurred: "Could not convert target type "Neos\\Media\\Domain\\Model\\ImageVariant": Could not convert target type "Neos\\Media\\Domain\\Model\\Adjustment\\CropImageAdjustment", at property path "aspectRatio": Could not find a suitable type converter for "mixed" because the class / interface "mixed" does not exist."., see log for further information. ``` * Resolves: `#5448 `_ **Review instructions** The new behavior was introduced to flow with pr: https://github.com/neos/flow-development-collection/pull/3424 * Packages: ``Neos`` ``Media`` `BUGFIX: Add missing event emitters to internal node properties `_ --------------------------------------------------------------------------------------------------------------------------------- **Review instructions** Currently, when using the event log, internal node data is not logged. So whenever an internal property like ``_hiddenBeforeDateTime`` is changed, you can't see that property in the event log. Therefore, this PR adds missing event emitters to the methods used to set the internal properties. resolved: `#3284 `_ * Packages: ``Neos`` ``ContentRepository`` `BUGFIX: Force direct access on setting node properties in node data similarize `_ ------------------------------------------------------------------------------------------------------------------------------------------------- The ``creationDateTime`` has no setters in AbstractNodeData, so the NodeData::similarize can't set them in the target node propery. We need to allow the ``ObjectAccess::setProperty`` to force direct access to the class properties. The ``lastModificationDateTime`` was also not copied before this bugfix and shouldn't be copied anyways. * Fixes: `#5280 `_ * Packages: ``ContentRepository`` `BUGFIX: Fixed table view of asset editor `_ ----------------------------------------------------------------------------------------------------------- Related to https://github.com/neos/neos-development-collection/issues/5430 This table view: image doesn't currently work because the event listener checks whether there is an or a