Release Notes

Version 2.7.0

The release notes contain changes compared to version 2.6.2.

Version Updates

The following versions have been updated:

Dependency New version Previous version

Faktor-IPS

25.1.0.release (Release Notes)

24.7.5.release

Vaadin

24.5.8 (Release Notes)

24.4.16

Spring Boot

3.4.1 (Release Notes)

3.3.5

The Vaadin version update brings some notable changes that affect linkki applications:

  • New properties in LumoUtility: In LumoUtility new properties have been added, most notably a utility class to set flex to 1. Existing custom CSS classes can thus be replaced by the new utility class.

  • Setting reactEnable to false in the vaadin-maven-plugin leads to a Vite error on startup of the application due to missing vaadin-router resources.
    As the react router now behaves mostly like the legacy vaadin router, it may be an option to remove the configuration and use the default react router instead.
    If the configuration should be kepft, the property vaadin.react.enable needs to be set to false too. See https://vaadin.com/docs/latest/upgrading#opting-out-of-react

UI Annotations and Aspects

  • New annotation: @UICheckboxes
    A new UI component, @UICheckboxes, is now available, providing a way to create a checkbox group for related binary choices. For more information, see here.

  • New annotation: @UILongField
    A new UI component, @UILongField, is now available, providing a way to accept a number with data type long. For more information, see here.

  • @UIComboBox: Automatically focus first applicable element
    If a character or word is entered into a combobox and there is only one matching element, then this element gets selected automatically.

    Example

    A combobox has the values UP, DOWN, LEFT, RIGHT.

    If the user enters 'u', the entry UP is selected automatically.

    If the user enters 't', there are two possible matches (LEFT and RIGHT) and therefore no entry is selected automatically.

  • @UILabel: support for asynchronously loaded values
    UILabel has been enhanced to handle asynchronous value loading using CompletableFuture as return type. A loading indicator will be displayed until the value is available. Refer to UILabel documentation for more details.

  • New aspect annotation: @BindClosable for sections
    A new aspect annotation, @BindClosable, is now available, providing a way to create closable sections with the option to have them initially closed. For more information, see here.

  • @BindPlaceholder: support for sections
    The @BindPlaceholder annotation can now be used on a @UISection to set a placeholder text if the section has no child elements or all child elements are invisible.

    @BindPlaceholder on @UISection
    @BindPlaceholder
    @UISection(caption = "@UISection with @BindPlaceholder")
    public class SectionWithBindPlaceholder {
    
        public String getPlaceholder() {
            return "This section is empty";
        }
    
    }

    The old solution using an extra UILabel with the style LinkkiTheme.Text.TEXT_PLACEHOLDER is now obsolete and should be replaced as it did not work correctly with different layout options.

    Old solution with UILabel and style LinkkiTheme.Text.TEXT_PLACEHOLDER
    @UISection(caption = "@UISection with placeholder label")
    public class SectionWithPlaceholderLabel {
    
        @UILabel(position = 10, label = "", styleNames = LinkkiTheme.Text.TEXT_PLACEHOLDER)
        public String getPlaceholder() {
            return "This is a placeholder.";
        }
    
    }
    LinkkiTheme.Text.TEXT_PLACEHOLDER has been deprecated and should not be used anymore as it did not work consistently for varying label width. Use @BindPlaceholder on @UISection instead (see above).

Other Improvements

  • Unique IDs for exceptions
    If an exception occurs in the application, it will be displayed by the configured error handler or an error page in case of an exception during navigation. With the default configuration, the exception is now logged with a unique ID that is also displayed in the UI, making it easier to find the exception in the logs. Custom implementation may need to be adapted to be able to make use of this feature.

  • Karibu testing: more utilities
    The KaribuUIExtension has been extended with possibilities to add error routes and to set production mode. The documentation has been improved accordingly.
    Many useful methods were also added to the KaribuUtils to make it even easier to write Karibu tests, such as

    • methods for printing out any component as String. This can be used to assert that certain text is or is not displayed anywhere in the UI, disregarding the placement or the actual component that is used.

    • methods for setting value input fields and consistently firing change events

    • methods for tables

  • Testbench extension: support for table placeholder
    The new page object LinkkiGridElement adds support to retrieve the placeholder text of a table. It can be used instead of GridElement, e.g. $(LinkkiGridElement.class).

  • Tutorial in the documentation
    The linkki tutorial is now part of this documentation.

Bugfixes

  • LabelComponentWrapper#setLabel() now calls HasLabel#setLabel() if the component is an instance of HasLabel instead of setting the HTML property directly.

  • The items of a table created with @UITableComponent are now only fetched asynchronously if the return type is CompletableFuture. The documentation is updated accordingly.

  • Card sections theme now only applies to dialogs if the theme is explicitly set on the dialog itself or a child layout.

  • The disabled and readonly style of radio buttons and checkboxes has been harmonised to follow the linkki style guidelines.

  • DefaultCaptionProvider now takes the provided locale into account and translates the captions accordingly.

  • The recommended .gitignore file is now added in generated archetype projects.

  • Components within a form layout that are required and have an empty/ blank label do not scroll anymore.

  • @UIDecimalField now handles very large numbers without unwanted rounding.

  • Previously, setting the value to null in @UIRadioButtons failed to check the appropriate radio button. Now, selecting null correctly checks the "Not specified" radio button, ensuring proper representation.

    With this bug fix, the converter must now be able to handle null-valued presentation values. Although this was already part of the Converter contract, it can now lead to an exception in ValueAspectDefinition.

  • Disabled, readonly and checked radio buttons are now displayed correctly