September 2025
The NewEdit component now has the ability to display a table of contents, based on the titles of its field groups. It provides users with an overview of the page. It also highlights those sections that have validation errors.
The feature is best used for pages with several headings, and where all headings have a title.
Component Content Links, introduced in the prior version, are now also supported by the Calendar component. They are used to separate links that work directly on the calendar items from top links, and the same recommendations apply as for the grid component's use of content links.
On mobile, some grids only work well in either List view or Table view. You can now configure menu items to not show the toggle button to end users.
When configured for drag & drop, if nodes are dropped onto a node group the procedure will now receive the group's id.
You can see this feature in action in the Database Designer, where function blocks can now be dragged between system blocks.
The timeline layout has been updated for better clarity and no longer stretches to fill the full width of the screen.
The color picker has been redesigned and now includes all available colors and shades.
Enterprise Search grows slower for each word searched for. Previous versions have alleviated this somewhat by filtering out common words, but this version should improve performance further when there are many words in the search string.
Inline documents on mobile have a download button and show the file name, description, and an icon indicating the file type.
In earlier versions, you had to use the Web Service Call component to call AI services.
Now, we introduce dedicated administration for providers and models, as well as the GenAI component.
This is an example using the component for chatting. A separate NewEdit-menu item (not included) is responsible for inserting the user's questions into the chat log.
CREATE OR ALTER PROCEDURE Example.GenAI_ContractChat
@ChatId uniqueidentifier = '44520744-D8BF-48F4-86FA-FE6461B5F7FA',
@Action varchar(50) = NULL,
@Response nvarchar(MAX) = NULL
AS
BEGIN
SET NOCOUNT, XACT_ABORT ON;
IF @Action = 'Init'
BEGIN
CREATE TABLE #Messages
(
RowId int IDENTITY,
Role varchar(50) NOT null,
Message nvarchar(MAX) null
);
INSERT #Messages (Role, Message)
SELECT
'System' AS Role,
'You will be provided with the text of a contract.
Your task is to help the user by answering their questions about the contract.' AS Message;
INSERT #Messages (Role, Message)
SELECT
'User' AS Role,
CONCAT('This is the contract =======', '<contract text>') AS Message;
INSERT #Messages (Role, Message)
SELECT
[Role],
[Message]
FROM
Example.ChatLog
ORDER BY
ChatLogId;
SELECT
Role,
Message
FROM
#Messages
ORDER BY
RowId;
END;
IF @Action = 'StoreResponse'
BEGIN
INSERT Example.ChatLog (ChatId, Role, Message)
VALUES (@ChatId, 'Assistant', @Response);
END;
END;
This is an example using the component for batch processing. In real use, you should use a better, more detailed system prompt.
CREATE OR ALTER PROCEDURE Example.GenAI_CodeReview
@Action varchar(50) = NULL,
@Response nvarchar(MAX) = NULL,
@PromptId int = NULL
AS
BEGIN
SET NOCOUNT, XACT_ABORT ON;
IF @Action = 'Init'
BEGIN
SELECT TOP (3)
'You are to review TSQL code for code quality and security.' AS SystemPrompt,
CONCAT('Review this code: ', M.definition) AS Prompt,
P.object_id AS PromptId
FROM
sys.procedures P
JOIN sys.sql_modules M ON M.object_id = P.object_id
WHERE
P.name LIKE '%insertupdate';
RETURN;
END;
IF @Action = N'StoreResponse'
BEGIN
INSERT Example.CodeReview (object_id, Review)
VALUES (@PromptId, @Response);
END;
END;
When a message fails delivery, it eventually ends up in a dead letter queue. You can now create listeners to subscribe to messages from the dead letter queues as well, for example, to determine if a message truly contains bad data, or if it was just unfortunate and suffered deadlocks each time delivery was attempted.
Previously, two of the Node Graph component's link types did not support dependencies.
The link type Graph link can now depend on a SQL procedure.
The link type Graph node group link can now depend on values from the node group table.
Edit menu item now has a Save as copy button, which optionally also copies all links leading from the menu item.
The user impersonation dropdown will now become a textbox with autosearch instead, if the current user has ten or more options to choose from.
The Database Designer now supports creating and editing tables, system blocks, and function blocks.
There is a new specialized menu item for finding where in procedures, key constraints, etc. columns are used.
For objects where references can be found, the auto comment block will now only list those places, and not also list all the data types that were searched.
Following best practices, the built-in menu item where users can change their own password will now send an email when a password is changed.
If you construct custom password change menu items, the SoftadminApi.User_UpdatePassword procedure now accepts a @SendMail
parameter.
The previous log types (e.g., "Page Warning", "Menu Item Error") combined severity and error source, leading to inconsistencies and many error sources without a corresponding log type.
Starting from this version, we will adopt a more standardized set of log types that focus solely on severity. These log levels have been chosen to align with those used by popular logging solutions.
The new log levels are:
Previously, the log type "Diagnostics" served as a catch-all category, encompassing various levels of detail. "Diagnostics" has been replaced by three distinct levels: Trace, Debug, and Information.
New | Old |
---|---|
Trace | Diagnostics |
Debug | Diagnostics |
Information | Diagnostics |
Warning | Menuitem Warning |
Warning | Page Warning |
Error | Deploy |
Error | Event Error |
Error | Internal Error |
Error | Job Error |
Error | Menuitem Error |
Error | Page Error |
Error | Project-specific Error |
Error | Webservice Error |
Critical | Webservice setup Error |
The Web Service Call component now supports media type parameters in the Content-Type header. Previously, only standard content types such as:
application/json
were accepted. With this update, it is now possible to specify content types that include additional parameters, for example:
application/json; version=2.1; format=compact