April 2025
When a Grid with columns that use the Compute sum feature is grouped, each group also gets its own subtotal.
Grid now uses digits of equal width, making it easier to compare rows in columns containing numbers.
The user can now switch between different column widths, using narrow columns to get a general overview over a longer period, or wider columns for a more detailed view. You can choose which view each planner starts in.
To better highlight them, fields with a validation warning of the error level receive a red border. Now, this is applied to fields with a validation warning as well, which get a yellow border.
Most tooltips are now stationary instead of following the mouse cursor.
In addition, tooltips now have greater compatibility with screen readers.
In the past, when calling a web service that required an OAuth access token, you would sometimes need two different menu items, one to acquire the token and another to use it, and you needed to handle token expiration yourself.
The Web Service Call component now supports automatic OAuth token handling using @Action = 'GetRawOAuthData'
. It caches tokens and reuses them until they expire, based on the expires_in
field.
Web Services have a new setting, Request compressed responses. When enabled, responses are requested in gzip format to reduce network traffic. Decompression is handled transparently by the component; the stored procedure will receive the same data.
You can configure a Grid to start grouped. The groups would always be sorted ascending, forcing you to use trickery with the _SortOrder column if the groups should be sorted descending. Now, you can just choose which direction is needed instead.
When exporting a Grid as an Excel document, if there is an single sum row, it will now use an Excel formula instead of a hardcoded sum. If users change values in the Excel document column, the sum updates automatically.
This only applies if the grid’s SQL query does not return any aggregate rows.
The new setting, LoginAdminIpWhitelist can limit admin logins to specific IP addresses. It is recommended that you use this setting for any internet-facing system.
The new Log Out component cleanly ends a user's session. It runs logout plugins, clears the browser cache (critical for public or shared devices like library computers), and redirects the user to the logged-out page.
The HTTP Request component can download either binary data (returned in @ImageResponse
) or text data (returned in @TextResponse
). By default, the component uses the response's content type to determine how to interpret the data.
To override this behavior, use the ForceContentAs column. This lets you explicitly specify how the data should be handled - for example, forcing application/json
content to be treated as text instead of binary.
Previously, the HTTP Request component supported sending custom HTTP headers but did not expose response headers. Now, in batch mode, you can use the GetHeaders column to receive a temporary table containing the response headers.
The HTTP Request component is often used in simple integrations, such as importing files like exchange rates or member lists.
When working with large files or polling frequently, it's inefficient to re-download files that haven't changed. Batch mode now supports the @Action = 'NotModified'
response, which is returned when the remote server sends a 304 Not Modified
status instead of the usual @Action = 'StoreResponse'
.
To enable this behavior, include conditional headers - typically If-Modified-Since
or If-None-Match
- in your request.
Multi-autosearch now supports multiple columns in its option list, like Textbox with Autosearch already did.
It is strongly recommended that you set as many properties as possible by inheriting real field information instead of dynamically.
For example, instead of using
SELECT
'radio buttons' AS FieldType,
'Quiz.LikertScale_RadioButtons' AS SQL,
Q.Subject AS FieldLabel,
Q.Details AS Description
you should use
SELECT
'Quiz.LikertScale_Options' AS FieldInfo,
Q.Subject AS FieldLabel,
Q.Details AS Description
as the question (FieldLabel and Description) is the only thing that varies and needs to be dynamic.
In earlier versions, you would use the FieldInfoId column to import field information, instead of the new FieldInfo. However, ID values are not self-explanatory. They also are not portable; in case you're designing a function block that should be reused as an export bundle.
The Database Designer's read-only mode now can now display unique constraints, in addition to unique indexes.
The designer is no longer completely read-only: it can now add new columns to existing tables, as well as edit their internal description.
More actions will be added in future releases. For current designer capabilities, check Database designer information under the Database designer overview.
Export Bundles can now copy events and event listeners between systems.
The Allow HTML display setting now offers three modes: No, Yes, and Yes (Legacy).
Option | Description |
---|---|
No (Don't allow HTML) | Output is plain text. Line breaks are respected. |
Yes (Allow HTML) | Output is plain HTML. Line breaks are ignored. |
Yes (Legacy HTML) | Output is HTML, but line breaks are respected as if it was plain text. |
The old function SoftadminUtil.PersonalIdentityNumber_IsValid only checks if a Personal Identity Number is valid., but it is usually helpful to normalize Personal Identity Numbers before storing them.
The new function SoftadminUtil.PersonalIdentityNumber_Normalize both validates and normalizes numbers, accepting multiple input formats but ensuring a consistent output format.