Changes Report

Last modified by Vincent Massol on 2026/09/02 19:04

XAR export improvement

A new version of the XAR format has been introduced to improve the way attachment history is exported:

  • it's streamable (exporting an attachment history used to require a lot of memory)
  • version with identical content are de-duplicated (for example the history contain the current version so with the old format it's stored in both the current version and the history)

This new format is used by default to store deleted documents but not yet in the XAR export administration, should be enabled in 12.0 final.

Solr Debian package

A new xwiki-solr-core Debian package is now provided, which automatically registers an xwiki core in a standalone Solr instance (provided it uses the standard setup).

Emoji Support Enabled in WYSIWYG Editor

You can now insert emoji from the WYSIWYG editor using the dedicated toolbar button. This is done using the Emoji CKEditor Plugin. See the CKEditor Integration for more information.

Allow to force-download attachments based on their mimetype

It is now possible to decide which attachments should be always downloaded based on their mimetypes: until now two properties (attachments.download.whitelist and attachments.download.blacklist) were allowing to control the display of some attachments for security reasons, but those properties are not able to control the behaviour of attachments added by a user with programming rights.

A new property has been added to allow force-download any attachment, whoever added it:

#-# [Since 12.10]
#-# Define the kind of attachment that you always want to be downloaded and never displayed inline.
#-# By default this list is empty, but you can specify a list of mime-types (coma separated list of values) which
#-# should be always downloaded no matter who attached them or what is the whitelist/blacklist configuration.
#-#
#-# The distinction with the blacklist configuration above is that the blacklist won't affect file attached by a user
#-# with programming rights, while this configuration affect any attachment.
# attachment.download.forceDownload=

User Mentions API upgraded

The User Mentions API has been upgraded to support new use-cases, such as sending notification to different kind of actors. This new API is a first step toward the mention of users from remote wikis, or to the mention of groups. A new event has also been introduced, making it easier to listen and react to mentions from new modules.

Async Rendering improvements

  • Saving/restoring the context action is now supported.
  • When saving the context document but not the wiki, the context wiki should be restored from the document.

Solr dedicated core improvements

  • The base schema now provide a type "text_general" and associated helpers which follow the Solr standard "text_general" type, "a general text field that has reasonable, generic cross-language defaults: it tokenizes with StandardTokenizer, removes stop words from case-insensitive 'stopwords.txt' (empty by default), and down cases. At query time only, it also applies synonyms". This is the easiest way to insert full text search friendly fields in your schema.
  • A Solr core initializer can now decide if the data should be stored as cached data or not

Use LibreOffice with a pool of process

The Office Importer Application configuration has changed to allow using a pool of process in case of internally managed office server.

The property openoffice.serverPort is deprecated in favor of openoffice.serverPorts which takes a list of ports: each port will be use to start a dedicated office process. This will allow to use the process in parallel and avoid blocking users when several operations involving office are performed at the same time (imports and exports).

Ignore extension dependencies

It's now possible to force Extension Manager to ignore a set of dependencies that might cause problem or simply be useless. See Dependencies for more details.

HTTPS extensions repositories

The extensions repositories are now accessed through HTTPS instead of HTTP.

Locale (Language) Picker

The locale (language) picker that is used in the Localization administration section has been converted to a generic picker that you can reuse.

UIXP to publish RequireJS modules

We added a new UIXP to support extending the global RequireJS configuration. This allows you to publish a RequireJS module that others can use without knowing its path.

In-place edit for object properties

You can enable in-place editing for an existing XWiki application, if you're using the Vertical Form layout, by editing the application sheet (the page used to display the application entries) and operating 2 changes:

  1. Load the JavaScript code required for in-place editing and define some variables:
    #set ($discard = $xwiki.jsfx.use('uicomponents/edit/editableProperty.js', {
      'forceSkinAction': true,
      'language': $xcontext.locale
    }))
    #set ($object = $doc.getObject('Path.To.YourClass'))
    #set ($editing = $xcontext.action == 'edit')
  2. Add some meta data to the definition term (dt) elements that wrap the field names:
    <dt #if (!$editing && $hasEdit)
        class="editableProperty"
        data-property="$escapetool.xml($services.model.serialize($object.getProperty('yourProperty').reference))"
        data-property-type="object"#end>

The result should look like this:

editObjectPropertyInPlace.png

In-place section editing

You can now edit in-place the sections of a plain wiki page, if the WYSIWYG editor is the preferred content editor. Unlike the old section editing, this allows you to edit the entire page, so that you don't loose the context, but it places the focus in the right section so that you don't have to scroll the page.

Live macro rendering when editing in-place

The new in-place edit mode runs the JavaScript code required by rendering macros, producing a true WYSIWYG editing experience.

Translate page while editing in-place

If multilingual is on and the current page is not translated in the current user interface language then editing in-place will load the original page. If you wish to translate the page then you just need to click on the Translate button. Whatever changes you do next will be saved to the translated page.

Solr multi-core improvements

Solr core are now created at runtime (for embedded Solr setup) so it's not needed to restart after installing an extension which require a custom Solr core.

This version introduces org.xwiki.search.solrAbstractSolrCoreInitializer which provide a lot of helpers for creating/migrating Solr cores. See more details on Solr Search Application.

Selection preserved when switching between WYSIWYG and Source

We upgraded the CKEditor Integration extension and the new version comes with a long-awaited feature: the selection / caret is preserved when switching between WYSIWYG and Source area. This makes it really easy to:

  • check the wiki syntax that corresponds to the current WYSIWYG selection
  • check how the selected text from the Source area is rendered when switching back to WYSIWYG

Simplify usage of Include macro

It's now simpler to use the Include and Display macros. Some complex and never-used parameters have been removed from the WYISWYG editor's macro dialog UI. Specifically, the page parameter is now hidden and for the Include macro the context parameter is now deprecated (and thus hidden). This also allows to display a single way to choose the reference of the included/displayed page and to ensure that users use the provided page picker.

User Properties

There's now an API to modify user properties. Scripting example:

{{velocity}}
#set ($props = $services.user.getProperties("testuser"))
#set ($discard = $props.setEmail('[email protected]'))
#set ($discard = $props.setFirstName('John'))
#set ($discard = $props.save())
{{/velocity}}

Get Connected