Changes Report
Automatic save for Live Data entries


In edit mode, a new entry no longer needs to be manually validated: it is now created as soon as one of its cells gets a value. A new row with no value yet can still be dropped with its "Cancel" button.
Entries can also be deleted from edit mode, with the "Delete" button on their right.
Live Data APIs to fetch and delete single entries
![]()
LiveDataEntryStore has a new get(Object entryId, List<String> properties) method, fetching one entry with at least the given properties, and the REST resource of one entry now accepts the matching properties query parameter. The Live Table source now implements remove, so its entries can be deleted. LiveTableNewRowNamingStrategy has a new getNewEntryLocation method telling where new entries are created: a custom strategy should implement it, so that edit rights can be properly checked for cells of a new row (i.e., before its creation). See Live Data Extension Points.
On the JavaScript side, LiveDataSource has the new getEntry and removeEntry methods, and addEntry now returns the values of the created entry. Logic has the new deleteEntry, getEntryKey, getEntryKeys, isMaximized and toggleMaximized methods, as described in the Live Data API.
Edit Code Macros in place with BlockNote
The BlockNote editor now displays the standalone Code Macro calls (as opposed to the inline ones) as code blocks, styled like in view mode. Edit the code in place, and pick its language from the selector shown when hovering the block, which highlights the code accordingly. The other parameters of the macro are kept on save.
Code blocks inserted from the slash menu are now saved as Code Macro calls instead of verbatim blocks. Inline Code Macro calls, or calls taking their code from the source parameter, are still edited through the Macro edit modal.
Realtime edit actions in the BlockNote editor

When editing with the BlockNote editor, the usual edit buttons are replaced by the same realtime edit actions as in the realtime WYSIWYG editor. They show who is editing the Page with you, warn you when the connection is lost, and display the save status ("Unsaved", "Saving", "Saved"), so you now know when the automatic save happens. You can also summarize your changes and browse the versions created during the session.
The "Leave Collaboration" action is not available with BlockNote yet, and clicking a collaborator opens their profile instead of scrolling to where they are typing.
Configure Syntaxes


It's now possible to easily configure the markup syntaxes that you wish to be made available to your users when writing pages, directly from the Admin UI.
Blog Post Template

You now have the option to create a blog post from anywhere inside the Blog page (or one of its children) by simply using the + (create page) button and selecting Blog Post as your new page's type
Temporary Resource API
![]()
A new API is available to create temporary resources. Here's an example of how you can use it:
// (1) Create the temporary resource reference.
String moduleName = "chart";
List<String> resourcePath = Arrays.asList("pie", "issuesByReporter.png");
EntityReference owningEntityReference = new DocumentReference("wiki", Arrays.asList("Path", "To"), "Page");
TemporaryResourceReference temporaryResourceReference =
new TemporaryResourceReference(moduleName, resourcePath, owningEntityReference);
// (2) Create the temporary file.
InputStream content = new ByteArrayInputStream("content".getBytes());
File tempFile = this.temporaryResourceStore.createTemporaryFile(temporaryResourceReference, content);
// (3) Obtain the URL that can be used to access the above temporary file.
String temporaryResourceURL =
this.urlTemporaryResourceReferenceSerializer.serialize(temporaryResourceReference).serialize();Ratings on Extensions Repository home page

Rating is now displayed in the Repository App's home page livetable.
Active Installs for Extensions

The number of active installs is displayed for each extension in the Repository App's home page livetable and in the extension page.
Global Color Themes


It's now possible, on a subwiki, to use a color theme coming from the main wiki (global themes).
Not Found Suggestions


We have added suggestions for the "document not found" and "attachment not found" error screens. The suggestions address minor typos and misspelling (including lower case vs upper case), but also bad location requests.
Velocity and ScriptContext synchronization
![]()
VelocityContext and ScriptContext are now fully in sync (and if you find a use case where it's not true create a BUG on https://jira.xwiki.org) and VelocityContext is now close to internal detail. This allows for example defining a variable in Velocity and accessing it from a Groovy script:
{{velocity}}
## Setting some script binding in Velocity
#set($myvar = "toto")
{{/velocity}}
{{groovy}}
// Lets use the script binding that has been set in previous script
print myvar
{{/groovy}}![]()
Active installs client now send the memory used by the instance.
Template Restrictions

It's now possible to specify visibility restrictions separate from creation restrictions on a template provider and to set default values. See the documentation for more details.
Document Tree Improvements

The tree now displays the rendered translated page title when the showDocumentTitle parameter is set to true, which is the default value. So the document tree is now taking into account the current locale when displaying the page titles. Moreover, the child pages are now sorted by their raw translated title, with a fall-back on the raw default title and then on the page name (if the raw titles are empty). Note that the rendered title may be different than the raw title if the title is dynamic (i.e. has Velocity code) so the child pages may not be sorted correctly if some have dynamic titles. The child pages are sorted by their name when the showDocumentTitle parameter is set to false.
The support for relative references in the root and openTo parameters has been improved. You still need to prefix the entity reference with its entity type though.
{{documentTree root="document:Alice" openTo="document:Bob" /}}The behavior of the limit parameter has changed a bit: if there is only one child node remaining the "more ..." link is replaced by that child node, instead of displaying "one more".
The child nodes should be loaded much faster now as we refactored and improved the database queries used under the hood.
Extension Repository adds recommendations


The Extension Repository Application now supports the optional feature of being able to mark some Extensions as Recommended. This provides some form of curation and separate "good" Extensions from others. The need arises when there are lots of Extensions.
The screenshots show:
- The view when the Recommendation feature is turned on
- How a Recommended Extension is displayed with a badge showing it's Recommended
Author Executor
![]()
It's now easier to execute code with a different author. Author is used to check SCRIPT and PROGRAMMING right. Example:
this.authorExecutor.call(this.renderer::execute, getAuthorReference());Default values in User Preferences


When you go to your user profile in order to changes your preferences, you now see better what are the default values (both in view and edit modes).
Language Picker

It's now easier to select a language in the administration for your wiki.
Ability to re-order items in the Applications Panel

It's now possible to re-order the items displayed in the Application Panel, in the administration.