Changes Report

Last modified by Vincent Massol on 2026/09/10 13:54

Return to view without creating revisions

You can now use the Done button to return to view mode from realtime collaboration without fearing that useless empty page revisions are created. The page is saved, and a new revision is created, only if the content has changed since the last (auto)save. This behavior applies to the Save & Continue shortcut key (Alt+Shift+S) as well. You can force a new empty revision only by specifying a change summary, using either the "Summarize & Done" or the "Summarize Changes" actions from the realtime toolbar. See the Realtime WYSIWYG Editor documentation for more information.

Support for several CSS files in icon themes

When creating an icon set, you can now specify several CSS files, making it easier to support icon sets that require several style sheets.

Documentation Linking in Repository Application

There's now a "Documentation" button displayed when using the website xproperty to link to an extension's documentation. In addition, that button is styled as a primary button, and the "Download" button is now styled as a default button and has been moved to be the last button displayed (since it's the less useful one).

LESS customizations now impact CSS properties

CSS and LESS variables now share a common source of truth. In addition, the LESS customization will now have an impact on CSS variables as long as LESS computation works. Read more

Administration categories are now consistently ordered. When viewing page administration, the order of the categories could change in unpredictable ways. Now they always respect the order that can be seen in the global administration.

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 configuration

Execute 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.

Get Connected