Neos 9 Beta-18 Release

Today we released another Neos 9 Beta.

A late new years gift to you :wink:

Thanks to all who contributed <3.

Upgrade instructions from Beta 17

previous beta → Neos 9 Beta-17 Release

In your composer.json you should require 9.0.0-beta18 for all Neos packages from the development distribution and for the NeosUi as well as Flow:

"neos/flow": "9.0.0-beta18",
"neos/neos": "9.0.0-beta18",
"neos/neos-ui": "9.0.0-beta18"

The database can be migrated the following way:

A setup to apply the latest schema adjustments:

./flow doctrine:migrate
./flow cr:setup

:warning: Note to publish your legacy node copy’s to the live workspace

We want to emphasise again as in the last betas, that copy nodes was refactored.
In case you’re running on a project with events from before Beta16 and used the copy nodes button in the Neos Ui, the legacy copy nodes events must be published to the live workspace before the final release of Neos 9. After the release they will always be discarded.

To detect those cases please use:

./flow migrateevents:copynodesstatus

In case you don’t understand the output feel free to ask.

Features

1.) :sparkles: Highlight :sparkles: New workspace module

Introduces new HTMX based UI with improved usability for the workspace overview based on the package Shel.Neos.WorkspaceModule.

This change is the first milestone for the new package Neos.Workspace.Ui rewriting its templates to Fusion & HTMX as well as the server logic.

New features:

  • New interactive Ui with popup modals, and navigation
  • Improved workspace review
  • Rebasing workspaces and super rudimentary conflict detection
  • Changing visibility to private or shared → a new role assignment Ui is in the works
  • and more :wink:

2.) :sparkles: Highlight :sparkles: One-click document publishing in the Neos Ui

Neos beta 10 introduced a new publishing confirmation modal that provides information and will run the publish or discard operation when continuing.
The simple workflow of publishing the current document was optimised to be directly executed with one click, without any confirmation or result dialog like in Neos 8.

Further the conflict resolution workflow in combination with publishing was hardened by fixing some edge-cases.

3.) !!! Improved content repository core stability & debugging

Correlation ids and debug information

The command class name is now partially encoded into the event with a random suffix, allowing to identify a publishing sequence while debugging the event log.
Further content stream forking and reopening are also enriched with debug information in the metadata.

Also structure adjustments, content stream pruner and importer write custom correlation ids allowing to determine how the even landed in the store.

No no-op content repository commands

The last beta started to introduce a more strict philosophy, that each command must lead to at least one event.

Instead of failing during command handling for SetNodeProperties and SetNodeReferences will ensure that on create() there are properties to change.

For publishing commands no-ops are only partially prevented via create() - for example, by ensuring that PublishIndividualNodesFromWorkspace::$nodesToPublish is not empty,
but additionally if publishing or rebasing was not necessary a new WorkspaceCommandSkipped exception will be thrown during handling instead of writing no events. No events are published.

Workspace publishing/discarding

Command skipped if there are no (selected) publishable changes.

To avoid this exception being thrown into the outer world it should be caught and logged or the case were its
likely that the operation might be a noop can easily be determined beforehand via Workspace::hasPublishableChanges():

if ($workspace->hasPublishableChanges()) {
    $contentRepository->handle(...);
}

Workspace rebase

Command skipped if the workspace is not outdated.

Workspace base change

Command skipped when attempting to change the base workspace to the currently set base workspace.

Note:

The case is not handled gracefully with a no-op as there would be no traces (emitted events) of the handled command,
and the original content stream id is kept (for publish operations).
This exception denoting the operation is obsolete should harden the interaction and make behaviour more explicit.

4.) Risen from ashes: FlowQuery context() operation

Reintroduction of the context FlowQuery operation known from Neos 8.3.

Supported options:

  • workspaceName
  • dimensions
  • invisibleContentShown

The API for the options was left intact though some concepts are now named differently in the core. The context operation should thus not be seen as forever-staying feature and will likely be deprecated and replaced with more explicit ways which fit better the current naming scheme and API.

  • ${q(node).context({'workspaceName': 'other-workspace'})}
  • ${q(node).context({'dimensions': {'language': ['de']}})}
  • ${q(node).context({'invisibleContentShown': true})}

Due to fundamental changes these options from 8.3 cannot be supported and will throw an exception:

  • currentDateTime
  • targetDimensions
  • removedContentShown
  • inaccessibleContentShown

5.) Removed dead policies / routes with Neos 9

Neos 9 removed a lot of dead routes from the old ember js user interface
as well as the previous workspace permissions configured in yaml like Workspaces.ManageOwnWorkspaces and more.

These changes finalised the removal of the dead policies and routes.

6) Slowly modernising the Neos Ui react codebase

We are in the slow process to modernise some of the Neos Ui concepts. There have been many drafts and discussions of the direction, and it would be promising to centralise some of the backend concepts that are similar for all backend modules, like the drawer on the left and the user dropdown and so forth.
The Ui would provide the outer “shell” and the content module or any other would live inside: RFC: Future of the Neos package architecture (`Neos.Neos` in particular)

For that we must decouple some parts from the global Neos Ui only redux store like flash-messages and also decouple the translation logic from the Neos Ui only concept of registries.
Instead, in the Neos Ui uses now standalone functions like translate() and showFlashMessage() which will simplify a lot of code and be eventually part of the outer “shell” and separate from the content module.

Bugfixes

Neos

Dev only relevant

List of things

Flow

Neos

4 Likes