Eclipse Scout Release Notes

About This Release

The latest version of this release is: 25.2.0-beta.2.

You can see the detailed change log on GitHub.

Coming from an older Scout version? Check out the Migration Guide for instructions on how to obtain the new version and upgrade existing applications.

The here described functionality has not yet been released and is part of an upcoming release.

New Build & Runtime Requirements

Scout 25.2 requires at least the following:

  • Build and runtime of Scout 25.2 require Java 24 (Java 21 support has been dropped). The compiler target level is set to Java 21. We plan to update to Java 25 LTS as soon as it is available.

Bookmark Support for Scout JS

It is now possible to create bookmarks for Pages in a Scout JS application. A bookmark holds information about the page including its position in the outline and its state, e.g. search data, table filters, table settings etc.

Please read the documentation and have a look at the example implementation in the jswidgets app.

New Data Object API for Scout JS

Scout JS now supports DataObjects to be written as classes in TypeScript. A new serialization mechanisms takes care of recursively (de)serializing such DataObjects in a way compatible with the Scout Java backends. It supports base types like number, string, boolean, but also more complex types like Array, Date, Map, Set or nested Data Objects. Also, TypeScript specific types like Record or string literal types are supported.

Please read the DO documentation for Scout JS for more details and the advantages of the new API. It is recommended to switch to the new API where ever possible by following the steps from the migration guide. An example implementation can be found in the REST HowTo which might be helpful to understand the new concepts.

Object Identifier Support for Scout JS

Scout Classic applications can use the classId to define a stable identifier for various Scout objects like widgets. With the new uuid property the same can now be done for Scout JS objects.

The main purpose of such an identifier is to have a stable identifier that is refactoring-safe, meaning it won’t change when the class or id of the object is renamed. This makes it possible to persist references to such Scout objects without having to migrate the persisted data when the objects are renamed.

Please refer to the documentation for details.

Table

Table Organizer Menu

In the top right corner of the table header is a menu with a gear icon that opens the table organizer form. This form has been simplified and now has a cleaner look.

Also, the menu is now available for Scout JS tables. It is visible by default for the table of a PageWithTable. If it should be visible for other tables as well, just add the menu TableOrganizerMenu to the menus of your table.

table: {
  objectType: Table,
  menus: [
    {
      objectType: TableOrganizerMenu
    }
  ]
}
table organizer form
Figure 1. Table Organizer Form

Table UI Preferences (Scout JS)

Adjustments to a table made by the user (e.g. column visibility, column width, sort order) can now also be stored and preserved between sessions for Scout JS tables. If the Table Organizer Menu is enabled, users can create additional table profiles that they can apply later.

This feature can be enabled manually by setting the property uiPreferencesEnabled. If enabled, the table should also have a unique uuuid to ensure that the preferences are assigned to the correct table.

By default, uiPreferencesEnabled is set to true for all detail tables of all table pages. In this case, the table does not need a unique uuid as long as the page already has one.

Preferences are stored in the browser’s local storage by default. Refer to the UI Preferences documentation for more information about how to change this.

New Section in Table Column Menu

The column menu now has a section called Width containing the following actions:

  1. Optimize width: makes the column as big as necessary to show its content

  2. Optimize width of all columns: makes all columns as big as necessary to show their content

  3. Adjust width: allows the user to set the width in pixels of that column

column header menu
Figure 2. Column Header Menu

Default Row Action (Scout JS)

The Scout JS Table has a new property defaultRowAction of type Action. If set, this action is executed when a row is double-clicked. Prior to the execution, a rowAction event is triggered. When default is prevented on this event, the defaultRowAction is not executed. The defaultRowAction can be used to execute a particular Menu of the Table on a row action. It can be specified in the TableModel by referencing the id of the Menu.

defaultRowAction: 'MyMenu',
menus: [{
  id: 'MyMenu',
  objectType: Menu
}]

Column: Improved API (Scout JS)

Some new methods have been added to easier get the cells and their values: cells(), cellValues(), selectedCells(), selectedCellValue(), selectedCellValues(), checkedCellValue(), checkedCellValues().

New API to insert, delete or set columns (Scout JS)

The new methods insertColumn, insertColumns, deleteColumn, deleteColumns and setColumns can be used to modify the columns of the Table. The columns inserted using insertColumn, insertColumns or setColumns are initialized with an initValue that can be passed to the methods directly or in form of a callback. When the columns of the Table are modified using one of these methods the Table will automatically recalculate its checkable and table node column, re-apply filters and apply sorting, grouping and background effects. Therefore, method setColumns can also be used to change and apply e.g. sort properties of multiple columns at once. In order to do so, simply change the properties of the columns and call

table.setColumns([...table.columns]);

Move Table Row Menu Helper (Scout JS)

If you need menus that move rows of a table up or down, you can use the new MoveTableRowMenuHelper. The helper implements actions for the move menus and updates their states (enabled, visible) accordingly.

To use it, just create the helper and install it for your menus:

const moveRowHelper = scout.create(MoveTableRowMenuHelper);
moveRowHelper.install({table, moveRowUpMenu, moveRowDownMenu});

Search Form Table Control (Scout JS)

The Scout JS table control SearchFormTableControl was added in order to add search forms to a PageWithTable. The PageWithTable uses the data of the search form as its search filter each time the data is loaded (see Search Form for more details).

Slider

The Slider widget is now rendered using multiple <div> instead of the browser-native <input type="range">. This allows for a more precise adjustment of the appearance.

The SliderField now also allows entering the desired value by hand. It has two new properties:

  • valueEditable: Whether there is a label or a number field to the right of the slider.

  • tabbable: Makes this slider tabbable.

slider
Figure 3. Slider

IId signature

The mechanism that adds signatures to IId is now available for the service tunnel. For more information see IId signatures in service tunnel.

Migration handler for deletion of data object contributions

The new AbstractRemoveDoEntityContributionValueMigrationHandler can be used when a data object contribution class is completely deleted.
This migration handler will remove the contribution with the given type name and type version from the data objects.

Behavior Change of Scout JS Utilities objects.valueCopy, objects.equals And objects.equalsRecursive

In order to support the new class-based Data Objects, these functions had to be improved as follows:

  • Date: is compared by its value (rather than the reference === as before) and copied by value (new instance is created).

  • Map: is deeply compared by its content (rather than the reference === as before) and deeply copied.

  • Set: is deeply compared by its content (rather than the reference === as before) and deeply copied.

  • The function objects.valueCopy uses the function clone if existing to create deep clones (except for Widgets).

  • The function objects.equalsRecursive uses the same equals logic as objects.equals which includes equality for empty arrays and the use of the equals functions of the objects, if available.