Changes Report
Keep XWiki running after a UI test
![]()
When executing a UI integration test, it is now possible to keep XWiki running after the test finishes by specifying the -Dxwiki.test.ui.keepRunning=true configuration option in the command line.
Required rights from page templates
![]()
When creating a page from a template, the required rights of the template are now also enforced on the created page. This makes it easier to consistently enforce required rights in the wiki.
Enforce Required Rights property in LiveTable
![]()
The property if required rights are enforced on a page is now supported in LiveTable, and with the LiveTable source also in Live Data. This allows, for example, to develop dashboards for seeing which pages are already enforcing required rights and which don't.
Improved accessibility of annotations


Updated the annotations to make them keyboard interactable. Small changes to the design of highlights have been applied. When clicking any part of an annotation highlight, its bubble is now displayed. Annotation highlights now contain a button that shows up when focused with the keyboard. Learn more about using annotations
![]()
When going through a tour, the highlights are not clickable anymore. Understand why that interaction was removed.
Static values supported in HQL queries
![]()
It is now possible to select static values like select 1 in HQL queries with just script right. This is useful for example for not exists subqueries that involve tables from which no columns are allowed to be selected directly.
Importmap supports transitive dependencies
![]()
The importmap checker now accepts transitive dependencies.
java.util.Optional Converter
![]()
The Converter Manager now supports converting Optionals:
- from X to Optional<Y>, if conversion from X to Y is possible
- from Optional<X> to Optional<Y>, if conversion from X to Y is possible.
This means, for instance, that from now on you can call methods that have Optional arguments from Velocity, by passing the actual value or null for an empty optional.
Overwrite transformation list from from transformation context
![]()
You can now overwrite the list of rendering transformations to execute from the transformation context:
TransformationContext transformationContext = new TransformationContext();
transformationContext.setTransformationNames(Optional.of(List.of("macro", "icon")));
transformationManager.performTransformations(xdom, transformationContext);The transformation manager is using the following fallback chain:
execution (transformation context) -> request (parameter) -> rendering configurationExecute rendering transformations from scripts
![]()
The rendering script service has two new APIs:
- $services.rendering.createTransformationContext() used to create a new transformation context
- $services.rendering.transform($xdom, $transformationContext) used to perform the transformations; requires programming rights
You can use them like this:
#set ($targetSyntax = 'uniast/1.0')
#set ($restricted = "$!source.restricted" == 'true')
#set ($xdom = $services.rendering.parse($source.content, $source.syntax))
#set ($transformationContext = $services.rendering.createTransformationContext())
#set ($discard = $transformationContext.setId("BlockNote:${source.documentReference}"))
#set ($discard = $transformationContext.setXDOM($xdom))
#set ($discard = $transformationContext.setSyntax($source.syntax))
#set ($discard = $transformationContext.setTargetSyntax($targetSyntax))
#set ($discard = $transformationContext.setRestricted($restricted))
#set ($discard = $transformationContext.setTransformationNames(['macro']))
#set ($discard = $transformationContext.setContentDocument($source.documentReference))
#set ($discard = $services.rendering.transform($xdom, $transformationContext))
#set ($renderedContent = $services.rendering.render($xdom, $targetSyntax))UniAst Syntax
![]()
A new JSON-based rendering syntax, called UniAst, is available. It provides both a parser and a renderer, and it is currently used only by the BlockNote WYSIWYG editor.
BlockNote integration drops Markdown dependency
![]()
The experimental BlockNote WYSIWYG editor doesn't depend on Markdown syntax any more. We implemented a parser and a renderer for the UniAst syntax used by the editor so we now go directly from UniAst to the wiki syntax used for storage on the backend. The advantage of this is that we're not affected any more by the Markdown syntax limitations (e.g. we now have support for underline syntax in BlockNote).
Dedicated database table for passwords
![]()
A new dedicated database table has been created in the database to store specifically passwords (to improve security): if you're performing an upgrade, you might see a migration related to the move of passwords values to that new table.
InternalLinksSerializer is now exposed
![]()
The markdown rendered for UniAST is now exposing a InternalLinksSerializer role allowing to customize how links and images are serialized for each backend.
Share typescript configuration
![]()
A shared Typescript configuration is now available in the @xwiki/platform-tool-tsconfig package.
Shared vite configuration
![]()
A shared Vite configuration is now available in the @xwiki/platform-tool-viteconfiguration package.
Mentions Auto-Complete Allows Spaces
When you have many users in your wiki there is a high chance some of them will have the same first name. If you want to mention such a user from the WYSIWYG editor, you probably have to start typing the second name as well. Before this version, the mention auto-complete dropdown was closing as soon as you typed space (to begin the second name). This has been fixed now. See the User Mentions Application for more information.
New object property type attribute in XAR Format
![]()
The XAR Format Specification has been updated to provide the concept of object property type: an attribute specifying the type of an object property if the corresponding class information is missing in the XML document.
Client-side localization improvements
![]()
Client-side localization benefits from a few improvements:
- When using the default resolver, localizations are now cached in the browser, avoiding translation keys to be resolved several times
- A localization helper is available for Vue.js developer
API extractor shared configuration
![]()
The default api-extractor configuration is now distributed in a dedicated package. See how-to use it in your packages.