Release Notes

Version 2.5.1

New features and improvements

Dependency Updates

The following versions have been updated:

Faktor-IPS

24.1.3.release

Vaadin

24.3.3

Spring Boot

3.2.2

JUnit

5.10.2

Karibu

2.1.2

Bugfixes

Default Error Page Exception Handling

For better message handling in the LinkkiErrorPage a new MessageException was introduced.

  • On receiving a MessageException, the error page shows the message of this exception in production as well as in development mode.

  • On receiving any other exception:

    • In development mode: a custom message or the exception message is shown to the user.

    • In production mode: only a generic error message is shown to the user to hide any sensitive information.

Additionally logging for the thrown exception has been added. MessageExceptions are only logged if they contain a cause. All other exceptions are logged anyways.

Version 2.5.0

New features and improvements

Dependency Updates

The following versions have been updated:

Faktor-IPS

24.1.1.release

Vaadin

24.3.2

Spring Boot

3.2.1

Commons IO

2.15.1

With Vaadin 24.2, the compile-scoped dependency org.apache.httpcomponents:httpclient has been removed. It cannot be used transitively anymore.

Furthermore, the compile-scoped dependency org.seleniumhq.selenium:selenium-http-jdk-client has been removed from the testbench extension.

Spring Boot has been updated to 3.2.1. Check the release notes for more information.

Improved update behavior

The update behavior has been improved for two cases:

Null model object

When using model binding, linkki would throw an exception if the model object is null upon creation or update until now. With this change, linkki would gracefully handle the null value.

How the null value is handled depends on the respective aspect definition. Aspect definitions that are provided by linkki are adjusted accordingly. In case of the value aspect, the field value is cleared if the model object is null. Boolean valued aspects such as enabled or visible are set to false.

Custom aspect definition may need to be adjusted to be able to handle null value. If model object is null upon update, PropertyDispatcher#pull now returns null instead of throwing an exception. This can then be handled in the UI updater created in LinkkiApsectDefinition#createUiupdater.

When using ModelToUiAspectDefinition, a new method #handleNullItem has been introduced which can be overridden to define the null handling. The behavior defaults to calling the component value setter created by #createComponentValueSetter with null.

To be able to handle null values for generic model objects properly when using the PropertyDispatcherFactory, MemberAccessors#getType(Member) has been deprecated and replaced by MemberAccessors#getType(Member, Type), where Type is the concrete PMO class.

Invisible PMOs

Updates of child bindings are now skipped entirely if the PMO is invisible. This reduces the number of unnecessary binding updates, making using nested components more efficient.

An initial update is still conducted upon the creation of child bindings, even in invisible PMOs. This necessitates null- and Exception-handling, particularly when direct model binding is absent. To address this, consider:

  1. Using a temporary model object at PMO creation, followed by a switch to the actual model object and a call to BindingContext.uiUpdated().

  2. Maintaining null-checks in getter methods where direct model binding is not used, ensuring resilience during the initial update.

Additional utility for Karibu testing

KaribuUIExtension and KaribuUtils have been added to allow JUnit Testing with Karibu-Testing. To use these simply import the module 'linkki-vaadin-flow-test'.

See Testing with Karibu for more Details.

VaadinUIExtension has been deprecated since KaribuUIExtension not only offers the same functionality, but also additional features.
Member access utility methods cleaned up for public access

Classes such as PropertyAccessor or MemberAccessors are useful classes that can be used for aspect definitions, or when writing a custom UI annotation. MemberAccessors offer methods to read field and method values, while PropertyAccessor and find and read the value of a property using the getter method, as well as call the corresponding call or invoke method.

Up until now, these classes are intended for internal usage. With this version, they are moved to the linkki-utils module to make them more accessible. Associated classes that should remain being used internally are made package private:

  • ReadMethod

  • WriteMethod

  • InvokeMethod

  • PropertyAccessorDescriptor

  • PropertyAccessorCache

PropertyAccessorCache#get can be replaced with PropertyAccessor#get. All other usages of the internal classes should be removed.

Removed generated Vaadin files

Files generated by Vaadin can now be removed from the repository without affecting the speed of the build. The advantage of this is that a Vaadin version update does not cause any further Git differences.

It is not required to list these files in .gitignore since they are automatically deleted by the Vaadin build if they did not exist before.

Affected files, for example:

  • package.json

  • package-lock.json

  • tsconfig.json

  • types.d.ts

  • vite.config.ts

Partial support for null model objects in IpsPropertyDispatcher

When determining a label from the Faktor-IPS model, the IpsPropertyDispatcher now falls back to the declared model object class if the model object of a PMO is null. This behavior is only supported for labels.

Therefore, the constructor IpsPropertyDispatcher(Supplier, Supplier, String, PropertyDispatcher) has been added. The second supplier can be used to provide the model object class used for the fallback. The constructor IpsPropertyDispatcher(Supplier, String, PropertyDispatcher) has been deprecated.

Overloaded Constructors for DialogBindingManager and PmoBaseDialogFactory

The DialogBindingManager class has been enhanced to offer an overloaded constructor, which now accommodates an extra parameter of type PropertyDispatcherFactory. This enhancement provides flexibility by allowing the use of a custom PropertyDispatcherFactory, or falling back to the default Java constructor for PropertyDispatcherFactory.

Similarly, the PmoBasedDialogFactory class has also been equipped with an overloaded constructor that embraces the PropertyDispatcherFactory parameter, or reverting to the default Java constructor if needed. Additionally, the PmoBasedDialogFactory class has been seamlessly integrated with the recently introduced overloaded constructor of the DialogBindingManager class.

UITimeField added

A new annotation @UITimeField has been added for selecting a time. The annotation has the properties step and precision for configuring the time picker. The step property sets the interval between items in the overlay, while precision defines the smallest unit for time selection, supporting both minute and second intervals.

Improved Styling and Consistency for linkki Theme

Following table defines a mapping between linkki and Lumo color definitions. For each linkki color, the corresponding Lumo color is identified. It’s important to note that some linkki colors, such as --linkki-info-text-color, do not have a direct Lumo counterpart, marked as "N/A" in the table.

linkki Color Lumo Color

--linkki-info-color

N/A (custom color used)

--linkki-info-text-color

N/A (custom color used)

--linkki-warning-color

--lumo-warning-color

--linkki-warning-text-color

--lumo-warning-text-color

---linkki-success-color

--lumo-success-color

--linkki-success-text-color

--lumo-success-text-color

--linkki-warning-text-color

--lumo-warning-text-color

--linkki-warning-text-color

--lumo-warning-text-color

The table below defines visual behaviors for icons and text based on their specific classes. These styles primarily target the vaadin-icon component within linkki, enabling a more dynamic visual feedback system.

CSS Selector Color Variable Used

icon-success > vaadin-icon

--linkki-success-color

icon-warning > vaadin-icon

--linkki-warning-color

icon-error > vaadin-icon

--linkki-error-color

icon-info > vaadin-icon.linkki-text-icon

--linkki-info-color

text-info

--linkki-info-text-color

linkki-text.text-success > span

--lumo-success-text-color

linkki-text.text-warning > span

--lumo-warning-text-color

linkki-text.text-error > span

--lumo-error-text-color

linkki-text.text-info > span

--linkki-info-text-color

There are a few selectors that have been deprecated in favor of new ones that are more consistent with linkki and Lumo.

Deprecated Selector New Selector

LinkkiTheme#PLACEHOLDER_LABEL

LinkkiTheme.Text#TEXT_PLACEHOLDER

LinkkiApplicationTheme#TEXT_RIGHT_ALIGNED

LumoUtility.TextAlign#RIGHT

LinkkiApplicationTheme#MESSAGE_PREFIX

MessageUiComponents#ICON_STYLE_CLASS_PREFIX

IpsDialogCreator Utility Class to create PmoBasedDialogFactory with IpsPropertyDispatcherFactory and ValidationService

The IpsDialogCreator class was introduced to address instantiation complexities and provides methods such as create() for default configuration and with(ValidationService validationService) for custom validation settings, both of which return PmoBasedDialogFactory with a preconfigured IpsPropertyDispatcher.

Default Error Page for Exceptions During Navigation

With LinkkiErrorPage, a default error page has been introduced that handles all kinds of unhandled exceptions thrown during navigation. If found by the Vaadin component scan, the page will open automatically in described cases. Sensitive information, such as detailed exception messages or stack traces, will not be shown in production environments.

Consult the documentation for further information on how to customize the layout as well as the provided error information.

ErrorDialogConfiguration hides exception message in production mode by default

ErrorDialogConfiguration now only shows the exception message by default if the application does not run in the production mode, else the message will not be added. Consequently, a new method ErrorDialogConfiguration#showExceptionMessage() has been introduced to customize this behavior.

The default vertical alignment of @UIHorizontalLayout was set to baseline

This fixed the issue where error messages in a HorizontalLayout containing nested components within a Section were causing misalignment due to the VerticalLayout being set to "Middle". The fix involved setting the vertical alignment of UIHorizontalLayout to "Baseline", ensuring consistent alignment and enhancing visual cohesiveness and readability.

Other
  • The documentation that describes how to build and start an application created by the Spring Boot archetype has been adjusted to match the different requirements regarding development and production mode.

Bugfixes

  • Fixed wrong min-width in @UISection for layouts where the label is above the component

  • Fixed the issue where multiple screenshots taken for a single test case would overwrite each other

  • Fixed added child rows are not visible in hierarchical tables

  • Fixed @BindMessages not working on Grid column fields

  • Fixed empty rows in MessageTablePmo when duplicate messages are present

  • Missing English resource bundle has been added for DatePickerI18nCreator, which is used to internationalize a DatePicker

  • Fixed improperly indented content in ApplicationInfoPmo