The 2024.3 release of the Thinkwise Platform introduces Personal Access Tokens (PATs) as an option to enhance security.
PATs are a secure way for users to allow external parties to connect with your application.
Some advantages of PATs are that user credentials are not shared, access can be limited to specific resources, and access can be revoked without changing the user's password.
Customized reports are now possible thanks to a new parameter property in the Software Factory and the ability to override the default report file in IAM.
Other highlights in IAM include environment interaction logs (to monitor the configuration of your environment),
and security checks (to verify the data accessibility of your application).
We also made quite a number of quality-of-life improvements, including performance enhancements, better merging capabilities,
UI/UX updates for unit tests, and new options in code search.
This release includes 16 Community ideas, representing 221 votes.
This release features the further integration of AI-powered model enrichments in the Software Factory.
We have added new generic model enrichments and model enrichments specifically designed for a seamless transition to the Universal GUI.
Many of the generic model enrichments have been made available as tasks on the screens where they can be of immediate use.
The AI code review has been improved, and is now also available as a task.
An important visual change is that we have restructured the default menu in the Software Factory.
It now contains a new menu group, Integration & AI, that allows easy access to screens that were previously only available as a tab in a branch.
In IAM, the tabs in the menu item Applications have been restructured as well.
Another new feature in the Software Factory is the columnstore index support.
A columnstore index offers substantial data compression, resulting in improved query performance.
A powerful use case for columnstore indexes is storing LLM embeddings.
We have also introduced a new process flow connector: Web connection. It is an enhanced and re-usable version of the HTTP connector.
One of the new features in IAM is the support for public OpenID Connect clients in the client apps. This allows two types of clients: confidential and public.
This release includes 9 Community ideas representing 104 votes. For a full overview of all the new features and changes, please read the release notes below.
After every platform upgrade, always re-generate the definition of your work model before you start developing it (menu Deployment > Creation > tab Generate definition).
This applies changes in the base models to your work model.
Note: if you are using nested base models, re-generate all base models below the highest level before you re-generate the work models.
The terminology related to ‘filter’, ‘find’, and ‘search’ in the Windows GUI, Software Factory, and IAM has been updated.
This change brings about a more logical and consistent use of these terms.
An additional advantage is that it facilitates a smoother transition for users moving from the Windows GUI to the Universal GUI.
Inform your users
When you generate your application and synchronize it to IAM, these changes are also applied to your application.
Inform your users about the new terminology.
Changes in the Windows GUI
Old
New
Above the menu: Filter (CTRL + Q)
Menu search (CTRL + Q)
Above the grid: Filter (CTRL + G)
Search (CTRL + G)
Changes in the Software Factory
Old
New
In the menu User interface > Subjects > tab Data:
tab: Combined filter
Search. This includes the underlying column:
column: In combined filter
Incl. in search
tab: Search
Find. This includes the underlying columns:
column: Visible in search
Visible in find
column: Search condition
Find condition
column: Search order no
Find order no. This includes three tasks:
task: Move search column up
Move find column up
task: Move search column down
Move find column down
task: Renumber the search
Renumber the find
In the menu User interface > Subjects > tab Settings > tab Permissions > group Data:
checkbox: Search
Find
In the ribbon
Remove filter
Clear all filters
New translations in the Subjects screen
Validations
The texts for validations mentioning combined filter have been rewritten to mention search instead.
The texts for validations mentioning search have been rewritten to mention find instead.
To enable a smooth transition to the Universal GUI, we have changed the availability of the action bar in some screen types.
Check your model
The following screen types have been changed in the base model SCREEN_TYPES. They no longer have a default action bar:
chart
chart_horizontal
chart_no_field
cube
cube_horizontal
cube_no_fields
hierarchy_no_filter
master_detail_no_filter
pivot_grid
pivot_grid_horizontal
pivot_grid_no_field
This change impacts your work model after the first definition generation.
'Field in next column' support for the Universal GUI
newUniversal GUI
The form- and parameter setting Field in next column now affects the Universal GUI. This change may affect existing configured forms, task- and report pop-ups.
You can find this setting in the Software Factory in the menu User interface > Subjects > tab Default/Variants > tab Components > tab Form.
The setting Field in next column moves an existing group to a new form column, but only if available form columns exist.
Availability depends on the horizontal width and other settings, such as the maximum number of form columns.
If the field cannot move to a new column, there will be no visual indication that the group is separated.
A form field that is marked with Field in next column will act as a form group without a header, keeping subsequent fields together vertically:
In a form or form section without groups, these fields would previously be spread horizontally within the form or form section.
Now, they will remain together vertically.
In a form or form section with groups, these fields would previously always remain in their form group. Now, they will move to a new form column, space permitting.
Additionally, when a field is marked with Field no. of positions further = 0 and with Field in next column, it will no longer be placed next to its predecessor.
Instead, it will occupy a new position in the form and follow the rules mentioned in this topic.
Review your settings
Check your existing configured forms, task- and report pop-ups.
We have also updated the setting Next group.
If no label or icon is specified for the group, the Universal GUI adds an empty position to the form.
This empty space clearly separates the new group from the previous one, even if they are vertically placed in the same form column.
If this is not intended, use Field in next column instead to create a new group without the empty position as a separator.
A rare occurrence is when Field in next column is set, but the entire preceding group is visually hidden.
In the previous generation GUIs, the label and icon of this group would be 'inherited' by the field marked with Field in the next column.
In the Universal GUI, the label and icon of the preceding group will be removed.
This is intentional.
To facilitate a seamless transition from previous generation GUIs, we have added the enrichment Retain group label and icon for fully hidden form groups.
It transfers the Field in next column setting to the hidden form field that introduces the group.
Process flows - Process action input/output views with nullable primary key
fixUniversal GUI
When using the Universal GUI to work with the Software Factory, the input and output views of process actions would raise an error about a nullable primary key column.
We have introduced new smoke test steps to check this specific scenario with your own views.
These steps inspect views to identify any records with a NULL primary key column.
Run the smoke tests
Run the smoke tests to see if you need to make any changes.
Authorization - Added 'Web connections' to 'Copy application' task
breakingnew
In this release, we have added Web connections to the Software Factory and IAM. For more information, see Process flows - Web connection.
When you copy an application within IAM, you can now include all overridden properties of web connections.
You can do this by selecting the checkbox Web connections in the task Copy application (menu Authorization > Applications > tab List).
If this checkbox is not selected, the new application will not contain any overridden web connection properties of the copied application.
Update post-synchronization calls
If you execute the task create_gui_appl_from_gui_appl from post-synchronization/deployment code, in CI/CD tooling or anywhere else,
update the call with the new parameter copy_gui_appl_web_connection and give it either the value True or False.
menu Deployment > Synchronization to IAM > tab Post synchronization code
menu Deployment > Deployment package > tab Post synchronization code
AI-powered enrichments now support more advanced prompting techniques by enabling prompt chaining.
This functionality is used in the default model enrichments, and you also have the option to implement it in your custom enrichments.
What is prompt chaining?
By default, an enrichment contains a single set of prompts that the generative AI completes.
With prompt chaining activated, additional prompts can be introduced based on the completion of earlier prompts.
This feature enables the breakdown of complex tasks into smaller steps.
When running an enrichment, the completion prompt query will be re-executed after a completion.
The completion prompt query has access to the temporary table #pc_data (key, completion) which contains all completions of all earlier cycles.
The model update query can access the completions of all prompt chain cycles.
Because of this, the keys used for the prompts must be unique for all prompt chain cycles in a run. Re-using a key will result in errors.
To use prompt chaining in your own enrichments, select the checkbox Prompt chaining enabled in the menu
Enrichment > Model Enrichments > tab Maintenance > tab Form > tab Enrichment.
You need to specify the prompts for all cycles in the same completion prompt query.
To organize the prompt completion code for different cycles, use the variable @pc_cycle.
It indicates the current prompt chaining cycle, starting at 1.
Example of prompt chaining
Here is an example of an AI enrichment that generates a system message based on a message translation.
You want the message ID to be snake case, which is challenging to derive directly from the message translation.
Instead, you can first have the AI summarize the text and then generate an ID based on the summary:
if@pc_cycle=1 begin -- Summarize the user input to a handful of words insertinto#ai_data ( "key", "prompt" ) values ( 'prep_summarize', concat('Summarize the following text to one to three words: ',@input) ) end if@pc_cycle=2 begin -- Turn the summarized words into a camel_case variable insertinto#ai_data ( "key", "prompt" ) select 'message_id', concat('Provide a snake_case property name for the following word(s): ', completion) from#pc_data where"key"='prep_summarize' end
You need to specify the number of cycles for an enrichment in advance.
A cycle can also be completed without a prompt, for example, when a step is skipped via an enrichment parameter.
In such cases, the process will move on to the next cycle.
For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.
In this release, we have added new model enrichments.
Generate application logic based on natural language business rules - This enrichment is AI-powered.
In its parameters you can enter a natural language business rule
that tells the enrichment when and where the rule should occur and what should happen.
The enrichment will derive the logic concept and the model object and create a logic template.
It can generate Default, Layout, Context, Trigger, and Handler logic.
Add comments to code with AI - This enrichment is AI-powered. Adding comments to code is essential for understanding its functionality.
This enrichment adds comments to a specific control procedure.
It uses AI to comprehend your code and includes comment lines where needed.
Comments will be added to control procedure code, template code, and dynamic model code, as applicable.
Set up a drag-drop link - Sets up a drag-drop link between two tables by creating the background task, settings, and functionality structure.
The task is pre-populated to display a 'Todo: fill with logic' message to remind you to enter code for what needs to happen on a drag and drop action.
Role creation based on a table variant - After entering a role name, a table name, and a specific variant,
this enrichment determines which rights must be granted to ensure that the variant is fully accessible.
The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.
note
If the role name already exists, the first suggested model update will be to revoke the existing rights.
You can deselect this, but this can result in more access rights for the role than intended.
Role creation based on a process flow - After entering a role name and a specific process flow,
this enrichment determines which rights must be granted to ensure that the process flow and all objects to which it links are fully accessible.
The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.
note
If the role name already exists, the first suggested model update will be to revoke the existing rights.
You can deselect this, but this can result in more access rights for the role than intended.
New model enrichments for the transition to the Universal GUI
new
tip
For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.
To support a seamless transition from previous generations of user interfaces to the Universal GUI, we have added new model enrichments:
Add the Universal platform - Creates the platform Universal.
It also adds a default theme for the Universal GUI, which is similar to the Windows GUI theme.
Remove obsolete platforms - Removes the two platforms that are no longer supported: Web and Mobile.
In addition, it removes themes, menus, configurations, and process flows that were only used for the removed platforms.
You can also choose to remove the Windows platform. Note that the Windows platform is still supported.
Use this enrichment only to remove platforms other than Universal.
Update tree page size - Automatically updates the page size of all hierarchical trees to an acceptable value for displaying the tree in the Universal GUI.
Keep ungrouped form fields vertically aligned - The Universal GUI keeps form fields in form groups together vertically
when repositioning fields in the form columns based on available horizontal space.
The exception is when fields are neither in a group nor marked to be allowed in a new form column.
These ungrouped fields spread across the available form columns.
This maximizes vertical space usage but results in a different visual experience than the tabbed forms that focus on filling horizontal space.
This enrichment updates the first such fields to be allowed in a new form column, causing subsequent fields to stay together vertically as a virtual group.
Field height limitation - In previous GUI generations, the setting Field height in positions for form fields could be set to very large values.
The GUIs limited this value based on the available space of the tabbed form.
However, the Universal GUI uses a scrollable (vertical) form that respects any configured value for Field height in positions.
This enrichment adjusts extreme values for this setting to a suitable value compatible with a scrollable form.
Show default cube view - In previous GUI generations, default cube views were always shown, even if the setting Show cube view was deactivated.
However, the Universal GUI respects the deactivated setting and will not show the default cube view.
This enrichment adjusts the setting to show the cube view. If you do not want this, you can also change the default cube view for this cube.
Set up a card list configuration - This enrichment sets up a basic card list configuration for each table that has more than three visible columns in the card list.
The configuration is based on the following columns:
The look-up value of the table. It will be shown without a label
If present: an image or icon
If present: the first checkbox or combo from the grid. It will be shown with a label
Additional columns in the table will be hidden in the card list.
This enrichment does not modify the card list setup for variants. These were made intentionally, so the enrichment should not modify these settings.
Update message options - When configuring messages and their corresponding options for the Windows GUI,
the most common practice is to model the affirmative message option (for example, 'yes') on the left side,
and the negative option (for example, 'no') on the right side on a screen.
In the Universal GUI this is exactly the opposite because of different standards in web and desktop applications.
This enrichment updates the message options so the negative option is positioned on the left side and the affirmative option on the right side.
Any other options will be modelled in between. You can select which model updates need to be executed.
Set the display type to hidden for drag-drop tasks - When drag-drop tasks are used in your application, there is usually no need for visible buttons in the user interface.
This enrichment sets the display type for drag-drop tasks to hidden.
Set the display type to Icon only for tasks and reports - Sets the display type to match the way tasks and reports used to be shown in the Windows GUI.
You can set the display type for tasks and reports, which determines how they are displayed in the GUI.
By default, new tasks and reports are set to Icon + text. The Universal GUI honors this setting.
However, the Windows GUI does not support the textual part and only shows the icon.
This means the display type would change for the end user when your application switches from the Windows GUI to the Universal GUI.
To mimic the behavior of the Windows GUI, this enrichment sets the display type to Icon for all tasks and reports that are set as Icon + text or Text only.
Show tab icons - Ensures that your tab icons are displayed like in the Windows GUI.
In the Classic theme used in the Windows GUI, there is an option to show or hide tab icons.
However, this setting is not available in the Universal theme, where tab icons are hidden by default.
This enrichment adds the extended property ShowTabIcons if tab icons are set to be shown in the Classic theme that is linked to the platform Windows.
This achieves the same behavior in the Universal GUI as in the Windows GUI.
Turn off auto-introduced search - Excludes the search bar from the introduced action bar for all affected screen types.
Every screen in the Universal GUI automatically gets an action bar, and every action bar automatically introduces a search bar if search settings are configured for the table.
This may not be desired, so with this enrichment, you can make sure that the search bar is excluded in those cases.
Set the keybinding schema to Classic - Adds the ability to select 'Classic' navigation for using Enter to move from field to field.
The Universal GUI uses web-oriented hotkeys for navigation.
This means that it supports using Tab to move from field to field.
The Enter key is used to create line breaks in multiline fields.
This enrichment adds an extended property called keybindings that changes the keybinding schema to ‘Classic’.
If set to 'Classic', you can use Enter to move from field to field in forms.
Set the default page size for pagination - Sets the page size so pagination is available in the Universal GUI.
If you move to the Universal GUI without a page size configured, there will be no pagination.
Show or hide the default action bar - With this enrichment, you can configure the presence of the default action bar.
This is determined by the screen components a screen type has.
If at least one of the chosen components is available in a screen type, the default action bar will be enabled.
If not, the default action bar will be turned off.
Screen types with a modeled action bar are excluded from this enrichment. Also generated screen types will not be modified.
Move tasks and reports to the overflow menu - In the Windows GUI, tasks and reports are not visible when their respective bars are not included in the screen type.
Users need to access them by navigating through the ribbon or by opening the context menu.
In the Universal GUI, tasks and reports are shown by default in the action bar, alongside the CRUD actions.
This enrichment ensures that tasks and reports are placed in the overflow menu if the assigned screen type for the subject does not contain a task bar or a report bar.
In the previous release, we have started adding AI-powered model enrichments to the Software Factory.
As you can read in these release notes, we have added many more to this release and will continue doing so.
So far, the AI-powered model enrichments were only available in the menu Enrichment > Model enrichments.
They remain available there but in this release we have started making them available as tasks on the screens where they can be of immediate use.
The following AI-powered model enrichments are now available on other Software Factory screens:
Create AI-generated data model - Available in the menu Data > Data model.
Similar to the enrichment process, you will be prompted to provide a description of your desired data model.
Upon execution, the data model will be created. The AI will generate a diagram with tables, references, and new domains as required.
note
The model enrichment in the menu Enrichment > Model enrichments has more options.
It allows you to select the specific tables, columns, and references to be created, and you can choose which steps to execute.
A description and a generated model
Translate using AI - Available in the menu User interface > Translations.
This task is only available if your branch contains two or more languages, and at least one translation.
Generate table description with AI - Available in the menu Data > Data model > Tables.
The selected table will be used as input for the enrichment. The table description will be filled with an AI-generated table description.
Generate application logic with AI - Available in the following locations:
Business Logic > Functionality
Data > Data model > tab Tables
User Interface > Subjects
If you enter a description of the desired control procedure, the AI automatically derives the logic concept, the model object, and creates a logic template.
It can generate Default, Layout, Context, Trigger and Handler logic.
Add comments to code with AI - Available in the following locations:
menu Business logic > Functionality (only for Assignment "SQL")
menu Business logic > Functionality > tab Templates
menu Dynamic model > tab Control procedure
Depending on the selected control procedure or template, the code is updated to include comments.
Summarize template with AI - Available in the menu Business Logic > Functionality > tab Templates.
The selected template will be used as input for the enrichment.
The template description will be filled with an AI-generated template description based on the code of this template.
We have made a start with replacing tasks with model enrichments in the Software Factory.
In this release, we have replaced one task:
Create cube - This model enrichment replaces the task Create cube in the menu User Interface > Business Intelligence.
You can customize the cube based on the selected table and choose what you want to execute exactly, which was not possible with the task.
When objects or code are generated using the AI-powered features of the Software Factory, the field Modified by is set to "Generative AI".
This user will replace the "AI Code review" user that we introduced earlier.
The history screens that can be opened with the tasks Show history in most screens will show clearly
when a record was inserted or updated by AI with the following icon:
To communicate with any service or third party online, HTTP connectors were already available to send and retrieve data.
However, despite all its capabilities, reusing the HTTP connector is not always easy and and altering its parameters requires writing logic.
For this reason, we have introduced a new process flow connector: Web connection.
It is an enhanced and re-usable version of the HTTP connector.
It stores information such as the base URL, (encrypted) authentication details, endpoints, and much more within the model
(menu Integration & AI > Web connections).
You can also define parameters for use across the web connection or endpoints, facilitating dynamic field settings.
Using curly brackets {}, you can add parameters to many settings.
For example, you could create a Web connection parameter user_name and use it in the Username field by entering the value {user_name} there.
The parameter is part of the input of the Web connection process action.
The value that is set for the parameter user_name is then passed to the Username field, so the field can be filled dynamically.
Settings
Web connection settings (only web connection parameters allowed):
Base URL
Username
Password
Bearer token
API key name
API key value
Endpoint settings:
Path
Body type
Content type
Form fields
Name
Value
Query string parameters
Name
Value
Request headers
Name
Value
It is possible to override the Web connection settings:
In the Software Factory, you can override the Web connection settings for a specific runtime configuration (menu Maintenance > Runtime configurations > tab Web connections).
In IAM, you can override the settings for applications (menu Authorization > Applications > tab General settings > tab Web connections).
This enables, for example, dynamic usage of web connections for different tenants.
It is now possible to merge a branch into an arbitrary branch (menu Models > Merging).
You could use this, for example, when you are developing two different releases
(each with their own release branch and develop branches) and need to merge changes from one release into the other.
During this process, the Software Factory determines an origin branch and point in time that are shared between the source and target branch.
The merge session identifies all changes from the origin up to the current state of the source branch.
This set of changes is then merged into the target branch and may include changes that were made before the source branch was created.
For example, when HOTFIX_A is merged into DEVELOP, it will include all changes between MAIN 1.00 and the current HOTFIX_A branch.
To allow for merge sessions that involve source and target branches that are not the origin branch, we have renamed various elements in the screens.
Instead of referring to the 'origin' and the 'branch' in the overview of actions and conflicts, in detail tabs, and conflict resolution texts,
these UI elements now always refer to the 'source' and 'target' branch instead.
note
These types of merges are not shown in the branch diagram.
Data migration settings in the source branch will not be migrated to the target branch,
as they are probably incompatible with all the existing data migrations in the target branch.
When switching your active branch in the Software Factory (menu Models > Switch branch), you have to confirm a message that all open documents will be closed.
This ensures that new documents are opened in the branch to which you are switching.
If you are familiar with this process, you may no longer want to get this message each time you switch branch.
For this reason, we have added the option Always. If you select it, the message will no longer open.
You can revert this option in the menu Maintenance > Users > tab Form > checkbox Branch switch confirmation.
Confirm closing of documents when switching active branch
Models - Trace columns handled differently in a merge
change
Previously, when preparing and executing a merge session, the trace values of the objects were not always updated.
For this reason, we have made some changes that make tracing the last person who updated an object much easier.
Note: A reciprocal merge has a minor limitation.
If a value changes automatically due to a merge, the update user will be the person who executed the merge.
This occurs, for example, when the absolute order number changes because columns have been added to the same table in both the origin and the branch.
They cannot have the same number and will be recalculated when the merge is executed.
In accordance with this enhancement, we have also added a tab General settings to the branche overview in the Software Factory
(menu Models > Model overview > tab Branches).
In addition to this, we have updated the menu structure in the Software Factory.
Certain features are more easily accessible now. They require fewer clicks to open.
Opening them is also less error-prone, because they are opened in the context of your working branch automatically.
These features remain available in the General settings tab, but have also become available through the menu.
The menu now includes the following:
A new menu group Integration & AI has been introduced. This menu group is home to the following menu items:
Web connections
Email providers
File storage locations
OAuth servers
Generative AI
AutoML
These features are all presented within the context of the current model/branch, making it easier to set up the values for each integration within the right context.
Since we have added AutoML to the menu group Integration & AI, the menu group Machine Learning has become obsolete and has been removed.
The menu group Enrichments has been moved to underneath Deployment, with the new menu group Integration & AI in between these two.
We have enhanced the Software Factory's support for creating indexes by introducing the option to generate columnstore indexes.
What are columnstore indexes?
A columnstore index is a type of index used in relational database management systems (RDBMS) to optimize the storage and retrieval of data in tables.
Unlike traditional row-based indexes that store data in rows, a columnstore index stores data in columns.
They offer substantial data compression, leading to a significant reduction in required storage space.
This results in improved query performance due to reduced I/O requirements when executing queries that involve scanning and aggregating large volumes of data,
typically in analytical and reporting workloads.
A columnstore index can be clustered or non-clustered.
You can find both options as two new index types when creating an index in the Software Factory, in the menu Data > Data model > tab Tables > tab Indexes.
If you are using SQL Server 2022 or later, you can specify an order column to improve performance.
Use case for columnstore indexes
Columnstore indexes include internal optimizations, such as SIMD and AVX-512 instructions, allowing SQL Server to compare millions of vector values in under a second.
This enables semantic search within an application.
A powerful use case for columnstore indexes is storing LLM embeddings.
This can be used for various purposes, such as:
Semantic searching in your application
Similarity matching of cases
Retrieval Augmented Generation (RAG): providing subject-related data in an AI-chat
Think about a system with a large number of emails.
Each email has a subject and a text.
The aim is to be able to quickly find relevant emails for various inquiries. To achieve this, the following steps are necessary:
Generate an embedding for each email
Store the embedding in a vector store
Generally, the vector store for emails would be modeled as a separate table:
For each email, the LLM Embedding connector generates an embedding based on the subject and email body.
Store the resulting embedding for an individual email as follows:
insertinto email_vector_store ( email_id, vector_value_id, vector_value ) select @email_id, cast(e.[key]asint)as vector_value_id, cast(e.[value]asfloat)as vector_value from openjson(@embedding) e
This process is performed for each stored email in the system.
Once the vector store is populated with email data, a semantic similarity search is possible.
An example of this search involves finding relevant emails based on a natural-language search query by the user.
The search query can be converted into an embedding through the LLM Embedding connector and is then processed as follows:
-- Turn the search query embedding into a temporary table select cast([key]asint)as[vector_value_id], cast([value]asfloat)as[vector_value] into#search_embedding from openjson(@search_embedding) -- Find the 10 most comparable emails -- https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use selecttop(10) e.email_id, sum(v1.[vector_value]* v2.[vector_value])as score from email_vector_store e join#search_embedding s on s.vector_value_id = e.vector_value_id orderby score desc
We have added a validation to warn you if you are using the domain controls File link or Folder link in your applications, so you can refactor them with alternatives.
These controls are especially suited for desktop applications where all users can access a file or folder from the same environment.
In a 3-tier architecture and Azure, files can be in a different location where users cannot link to directly.
Moreover, browser applications cannot access desktop files.
So, replacing the domain controls with alternatives makes your application more suitable for use in a 3-tier architecture (with the Universal GUI) and Azure.
Refactor File link and Folder link domain controls
Instead of File link, consider using File upload (for both uploads and downloads). Ensure that Indicium has access.
Instead of Folder link, you can use what is most suitable for your situation. Some examples:
Remove the control entirely, converting it into a freely editable text field. In that case, the GUI no longer checks whether the path exists.
Use a process flow for upload/download.
Use a Copy to clipboard control, users can then use the link on the clipboard to go to the right environment themselves and access the folder.
Data - More options for copying columns to another table
Community ideanew
We have added more options to the copy task in the tab Copy columns (menu Data > Data model > tab Tables > tab Columns > tab Copy columns).
When copying columns from another table, you can now also select identity-related settings (Identity, Seed, Increment) and the setting Mandatory.
This offers greater control over the desired outcome of the new column.
For example, if you select Mandatory to include in your copy, it copies the setting (mandatory or not) from its source.
Mandatory and Identity settings
User interface - Validations for prefilter groups
new
We have added new validations to alert you of prefilter groups that have been set up incorrectly.
This applies to groups for all three types of prefilters (main, detail, and lookup) in the default tables and table variants.
You can set prefilter groups in the menu User interface > Subjects > tab Subjects > tab Data > tab Prefilter.
User interface - Menu designer converted into a tree-based visualization
change
To make the Software Factory suitable for use with the Universal GUI, the menu designers (known as modelers) have been replaced with a Tree component.
Because this is a native screen component, menus can be visualized and maintained once the Software Factory uses the Universal GUI.
The functionality of the menu designer has been retained. Groups and items can be moved using drag-drop.
For list bar and tiles menus:
Groups can be dragged onto other groups. The groups are put before the group on which they were dropped.
Items can be dragged onto other groups or items of other groups. The items are moved to the group where they were dropped.
Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.
For tree menus, it is slightly different:
Groups can be dragged onto other groups. The groups are put before the group on which they were dropped within the parent groups. Groups will not be moved.
Groups can be dragged onto items in other groups. The groups are moved to the parent group of the item on which the row was dropped.
Items can be dragged onto other groups or items of other groups. The items are moved to the group where the row was dropped.
Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.
Icons are an essential part of any model.
They are kept in the icon repository, in the menu User interface > Icons.
For large models, the icon repository can contain hundreds of icons, each appearing in one or more locations.
To facilitate better organization, we have added the ability to group icons.
The tab Form now contains a field Icon group where you can specify the group to which the icon belongs.
You can create a new group in the field's lookup.
The tasks Generate translation objects and Delete unused translation objects
have been moved one level higher on the screen (menu User interface > Translations).
You can now find them above the grid with the languages.
Moved translation tasks
User interface - Removed the limitation on 100% field position width
changeUniversal GUI
Previously, fields on the same line would always equal 100% even when the field width would indicate otherwise.
We removed this limitation, allowing fields on the same line to exceed 100% of the available width.
This allows the Universal GUI to better scale sets of fields.
This change requires Universal GUI version 2024.1.14 or higher.
You can set the Field width in the menu User interface > Subjects > tab Default/Variants > tab Settings > tab General > group Form.
It is now possible to use wildcards in a code search (menu Business logic > Code search).
This allows for more complex searches with specified conditions while maintaining flexibility. The possible wildcard options are:
% - Matches any string of zero or more characters.
It can find a match on one word or on multiple words, as long as they appear in the same line, consist of the search string and appear in that specific order.
_ - Matches any single character.
[...-...] - Matches any single character within the specified range ([a-f], [0-4]) or set ([abcdef], [01234])
[^...] - Matches any single character not within the specified range ([^a-f], [^0-4]) or set ([^abcdef], [^01234])
Code search using wildcards
Business logic - Remember last 5 searches in code search
Community ideanew
The Software Factory now remembers your 5 most recent code searches, allowing you to quickly switch between them.
This applies not only to the search string itself, but also to its corresponding search options.
For quick selection, the combo box shows the sorted order number (latest on top) and the historical search string.
Code search combo box
For additional information, the lookup pop-up shows a grid containing the corresponding search options for each historical search string.
Reviewing code by a generative AI provider was already available.
Now, we have further enhanced this functionality by improving its results and adding an AI code review task to several convenient locations.
Activating an automatic AI code review has remained the same: in the menu Quality > Code review > tab Code review,
execute the task Ready for review and select the option Review by AI.
The Software Factory executes the AI code review in the background.
Additionally, you can request an AI code review manually if a control procedure is in review with the new task Review template code with AI .
This task is available in the following locations:
Quality > Code review
Business logic > Functionality > Code review
A task to start the AI code review
Quality - Smoke test success in the Quality dashboard
Community ideachange
In the Quality dashboard, we have replaced the measurement of Process test success with Smoke test success.
Smoke tests with status Warning are considered successful for the quality dashboard ratings, as this can only occur due to a query timeout.
You can currently not prevent this.
The calculation for the number of stars for smoke tests and the impact on the summarized branch quality is the same as the calculation for the process tests;
it shows the percentage of available smoke tests with a successful result.
The quality improves if more tests are successful.
Smoke test success in the Quality dashboard
Quality - Setting for smoke tests for the Windows GUI
newWindows GUI
The Indicium service tier now supports expression fields in prefilters for smoke tests.
However, if you are not using Indicium (i.e. the Windows GUI), expression fields in prefilters are not supported.
So, if you run a smoke test for the Windows GUI, you want it to fail for prefilters with expression fields.
To enable this, a new checkbox is available in the menu Model overview > Branches > tab Model settings.
It is called Mimic Windows GUI (classic) and is cleared by default.
Only select it if you are using the Windows GUI for your applications.
note
Do not select this setting if you are using the Universal GUI.
The Universal GUI is a 3-tier user interface that supports prefilters with expression fields.
Enabling this setting will lead to false negatives in your smoke tests, or prevent the use of expression fields in your prefilters.
Last year, we introduced the AI code review feature.
Consequently, the SQL code analysis has become outdated and has been removed from the Software Factory.
Previously, it was available in the following locations:
menu Quality > Code review > tab Code analysis
menu Model content > Program objects > tab SQL analysis
As of this release, we no longer use the domain controls File link and Folder link in the Software Factory and IAM.
For more information about the reasons for this change, see Advise to update two domain controls.
These domain controls were used in the following screens:
menu Deployment > Creation > tab Generate source code - If you run the task Generate source code with Write to storage activated,
the result screen shows folder locations.
menu Deployment > Synchronization to IAM > tab Synchronization - If you run the task Synchronize to storage,
the result screen shows the location of the synchronization file.
menu Deployment > Deployment package > tab Deployment package - If you run the task Create deployment package, the result screen shows the location of the deployment package.
Previously, you could open the folders or file directly from the Software Factory.
Now, a button Copy to clipboard is available instead.
You can use it to copy and paste the link to where the files are available, for example, in the file explorer or an AWS bucket.
In the screen Synchronization to IAM (menu Deployment),
you can now see the duration of every step in the process and all individual steps when generating synchronization scripts.
This helps visualize what tasks the process is performing and how many steps remain.
Do note that some scripts take longer to generate than others.
This can be because of the amount of data or that the underlying process takes more time to calculate all the necessary values,
such as calculating the effective rights for (variant) columns.
Duration of synchronization steps
Dynamic model - Trace columns filled for staged strategy
change
Previously, the person generating the code was usually not the same as the one who initiated the change,
so adding the first person to the trace columns made no sense.
And since we introduced system flows for generating code, the pool user is the one who generates.
When generating dynamic model procedures with the strategy Delete, you can specify your own value for the trace columns.
However, when using the strategy Staged, the trace columns were not filled.
This has been changed and now the Software Factory also fills the trace columns for all the temporary tables that are used,
but only when the data is new or has actually changed.
When the dynamic model creates a record, the insert and update trace fields are filled.
When the dynamic model updates a record, the update trace fields are also updated.
Maintenance - Retention plan for unit test results
new
The Software Factory saves unit test results for all executed unit tests in the menu Quality > Unit tests.
However, a large part of the unit test result information is usually not important enough to store for a longer period of time.
Similarly to how jobs are cleaned up, we have introduced a new setting named Unit test retention (in days)
in the menu Maintenance > Configuration > group Environment settings. The default value is 14 (days).
Every day at 8:00 PM UTC, the Software Factory removes the unit test result information based on the value of this setting.
The clean-up process removes all related data for unit test results that exceed the retention period.
Only the most recent run and the last successful run within the context of a model/branch combination will be retained.
We have added more 'go to' options to the Software Factory:
Go to model rights - With this task, you can navigate from different objects to the Model rights overview (menu Access Control > Model rights > tab Model rights).
It is available for the following objects:
Table (menu Data > Datamodel > Tables) and (menu User interface > Subjects)
Menu (menu User Interface > Menu)
Process flow (menu Processes > Process flows)
Subflow (menu Processes > Subflows)
Task (menu Processes > Tasks)
Report (menu Processes > Reports)
Subroutine (menu Business Logic > Subroutines)
Go to the mock data - With this task, when you add mock data to a unit test, you can navigate directly to the data set.
It is available in the menu Quality > Unit tests > tab Form > tab Mock data.
Go to [Object] - With these tasks, you can navigate to different objects from the menu Business Logic > Functionality > tab Deploy.
The following tasks are available:
Go to Tasks
Go to Data model
Go to Process actions
Go to Subroutines
Go to Reports
Generic - Direct link to documentation and release notes
new
It is now possible to navigate directly to the documentation and the release notes for the Software Factory.
The new menu group Documentation contains two menu items:
We added 3 validations to detect that an object uses a shortcut with a reserved Shift code value 'Shift'. The validations apply to prefilters, tasks and reports.
In the Windows GUI, the Shift code value 'Shift' is reserved for typing capitals and shift numeric keys.
This makes it impossible to use it for activating the object using the shortcut.
In the Universal GUI, the Shift code value 'Shift' is reserved for activating the object using the shortcut.
This makes it impossible to use it for typing capitals and shift numeric keys.
It was possible to delete the model settings of a branch in the Software Factory (menu Models > Model overview > tab Branches > tab Model settings).
However, deleting these settings would cause several processes to fail. We have disabled the delete option.
Models - Open sole active branch if 'Remember selected branch' is not selected
When a user only has one branch within a model set as their own (My models ),
the task pop-up Switch branch would always use the last user session when opening the Software Factory regardless of the setting Remember selected branch.
This was unintended and has been resolved. Now:
If the checkbox Remember selected branch is cleared,
the model and branch selection will be preset to the sole active model and branch that are linked to your user rather than the last user session.
If the checkbox Remember selected branch is selected, the model and branch used in the last session will be preset.
Models - Resolved merging base models into work model dependencies
When a base model supplied a table and a column and had the look-up display column set up for a reference,
the trigger code would set the look-up display column of the table before the actual column was added to the work model.
This has been corrected.
When adding a new process flow and using the Copy button to create another process flow, the process actions Start and Stop were not added.
This has been fixed. They are now always added when adding new process flows.
Data - Rebuild table now also results in recreating constraints in 'Smart upgrade'
When executing a smart upgrade (menu Deployment > Creation), constraints on a table selected for rebuilding were not recreated when the table was recreated.
This has been fixed.
All references with the setting Check integrity selected (menu Data > Data model > tab References > tab Form)
will be recreated during the smart upgrade if the table has been marked for rebuilding in the data migration (menu Data > Data migration).
Business logic - ROWGUID columns not allowed in handlers by Indicium
ROWGUID columns are now excluded from the generated statements for insert handlers and update handlers, as Indicium does not allow them to be used in these handlers.
If such handlers containing ROWGUID columns were already present in your database, they will be marked as modified during the next smart upgrade.
User interface - Selected font for updated conditional layout
When updating a conditional layout with a new font that has different bold or italic configuration than the configured font,
these settings would not override the existing ones. This has been fixed.
Access Control - Role simulation in the Software Factory with Always on prefilters
When you simulated a role in the Software Factory and that role had the setting Always on activated, the Software Factory ignored that setting. In IAM, it was used correctly.
This led to a difference between simulated roles in the Software Factory and IAM. The Software Factory now correctly listens to the Always on setting.
We resolved an issue where relative paths for code files and program objects had to contain a backslash for writing code files to disk,
writing program objects to disk, and deployment package processes.
These relative paths can now contain zero or more back or forward slashes.
Previously, the task Deselect all code files (menu Deployment > Creation > tab Execute source code) would also deselect the code file DB.
The Software Factory automatically selects this code file if the database does not exist.
Manually deselecting this code file is not allowed.
This was already disabled in the list, and now it is also no longer possible with the task Deselect all code files.
A unit test could lead to unexpected results if you used a domain with data type Numeric without decimals, like 2,0 (2 = total length, 0 = no decimals).
For example, if you expected '3' as output, the unit test would fail because the value returned by Indicium was '3.0'.
Now, the Software Factory converts '3.0' to '3' to match the expected outcome.
note
If you used workarounds to solve this problem, you can remove them. They are no longer necessary.
The menu item Work overview (menu Specification) opened without data.
This has been fixed by ensuring that the prefilter Work items is always enabled when opening the screen.
Oracle uses packages instead of program objects.
To generate and execute a single package for Oracle, select the checkbox Fixed file in the menu Models > Model content > tab Code files > tab List > tab Code file.
We have improved the support for Oracle in the following screens:
Functionality (menu Business logic > Functionality > tab Deploy)
Code overview (menu Business logic > Code overview)
These screens now include a tab page Package for the entire package of which the program object is a part.
We have also renamed some tasks to better reflect their nature:
Old name
New name
Generate selected program objects
Generate selected
Execute all program objects
Execute all
Execute selected program objects
Execute selected
The changes allow you to generate and execute a single package (code file) instead of a program object:
The tasks Generate control procedure and Generate selected assemble the package code.
The tasks Execute all and Execute selected execute the package on the database instead of the program object.
Additionally, the processes Create and Data migration are now similar to the ones for SQL Server.
New and changed in the Intelligent Application Manager
Client applications - Support for public OpenID Connect clients
new
You can now mark a client application as a public client (menu Client apps > Client applications > tab Form > tab Client application).
This is only possible under the following conditions:
The client application supports OpenID Connect, and the Grant type is "Authorization code".
The client application has no secrets. If there are secrets, this option is not available.
If Public client is selected, it is no longer possible to add secrets (the tab page is disabled).
note
All clients that do not currently have secrets will automatically be marked as public clients when you upgrade to this version of IAM.
This feature allows two types of OpenID clients:
Confidential clients - Clients that can keep their secrets confidential. They can authenticate themselves to the authorization server.
Public clients - Clients that cannot use registered client secrets, such as applications running in a browser or native apps on a device.
The screen Application in IAM (Authorization > Applications) contains a lot of detail tabs.
To improve the overview, we have created four main tab groups on this screen:
General settings - new
Authorization settings - new
Preferences - was already present
Analysis - was already present
These main groups each contain detail tabs.
This distribution corresponds to the task Copy application we updated in a previous release.
Since the Software Factory's branche overview (Models > Model overview > tab Branches) contains mostly the same tabs as the tab General settings in IAM,
its layout has been changed, too.
In addition, many tabs have been moved to a new menu group, Integration & AI.
See Models - Features available in new menu group for more information.
New tab: Authorization settings
Applications - Available languages for user preferences
Community ideachangeUniversal GUI
We have updated the list of languages available to users to pick from via user preferences in the Universal GUI (profile menu > User preferences).
They can no longer choose from all the languages known in the environment but only from languages configured for applications that users can access via a menu
(menu Authorization > Applications > tab General settings > tab Translations).
Unauthorized users are not allowed to add users to IAM.
The pool user, used by Indicium to communicate with IAM, was also not authorized to add users unless it was designated as a main administrator.
This has been changed.
All database users with sufficient rights, including pool users, can now add users to IAM.
This facilitates the automatic creation of users in IAM.
We have changed the layout of the screen Users in IAM (menu Authorization > Users).
The changes improve the overview and provide clearer context for the tasks.
Recommendation-related tasks and most user preference-related tasks have been moved to their respective detail tabs.
Additionally, the task Clean up unused preferences has been relocated to the menu Optimization.
Furthermore, the CRUD buttons are no longer shown alongside the tasks in the action bar.
This further enhances the cleanliness of the user interface on this screen.
note
While user preference-related tasks are placed on the first tab Global, they impact not only global user preferences but all user preferences.
We have adjusted the translation to reflect this.
The old action bar
The new action bar and some of the relocated tasks
Users - Removed "Begins on" and "Ends on" fields for Main administrator
change
We have removed the fields Begins on and Ends on from the screen Main administrators (menu Authorization > Users > tab Administrators)
because these fields are editable by the main administrator anyway.
When a row is inserted, the user is now considered a main administrator until the row is removed.
We have also changed how the fields Begins on and Ends on are handled for a user.
When these fields are edited, the fields Begins on and Ends on in related tables, such as User groups and Administrator screens, are no longer updated.
This means that a user will not be able to access any application if the Ends on date and time has passed.
The set dates for the user are now leading.
In both the Software Factory and IAM, the delete tasks have already been technically replaced by handlers.
In the Software Factory, they also have been hidden in the user interfaces.
Objects can be deleted using the regular CRUD delete button. We have now implemented the same in IAM.
In certain cases, the delete task remains accessible because it deletes more than one single item:
menu Analysis > Recommendations - delete removes all unused recommendations with a specific recommendation type.
menu Settings > Global translations - delete removes the language tag and all global translations linked to it.
Advanced menu > Administration > Role sets - delete removes all role sets without roles.
Generic - Improved role lookup reference performance
new
To improve the checking of rights in underlying views for Indicium, we have added new tables to IAM to store the granted lookup references for each role.
This eliminates the need for expensive queries to check granted lookup references for each role. The result is improved performance.
During the upgrade, the data for these tables will be automatically created based on the data in IAM for each of your models and branches.
These tables will receive updated information when you synchronize your branches from the Software Factory.
In IAM, the menu group Documentation already exists.
It contains the menu item Documentation.
We have added a new menu item to this group: Release notes.
Here, you can select the release notes for the version you need.
Reload application in Indicium after changes in email or generative AI providers
If you made changes to email providers or generative AI providers, IAM now tells Indicium to refresh the application where the changes were made.
Before, this had to be done manually, which was not always possible in production or due to lack of access.
Ensure email is mandatory when copying a user with TOTP
When a user uses TOTP (time-based one-time password), the email address is mandatory.
However, this mandatory state was not enforced when copying a user with TOTP.
This enforcement has been added to the copy task.
Data model changes for the Software Factory and IAM meta-models are listed here.
This overview can be used as a reference to fix dynamic control procedures, dynamic model code or custom validations after an upgrade.
The 2024.1 release of the Thinkwise Platform features the introduction of model enrichments.
Model enrichments are actions that automate parts of your manual workflows.
You can use them to kick-start the work on your application before you start with manual fine-tuning.
We have also enhanced the merging process by introducing reciprocal merging.
This allows you to merge a branch to its origin and continue working in the branch without having to manually merge the origin back to the branch.
To prevent branches from being archived or deleted, we have introduced branch protection.
For the Universal GUI, we have added support for screen configuration preferences.
Users can now, for example, select another screen type, and reorder or hide detail screens.
You can read more about this in the Universal GUI release notes in the Thinkwise Community.
This release also includes 10 Community ideas representing 123 votes.
One community idea that received many votes requested a double-click task that is bound to a specific column.
This enhancement significantly improves the user experience by allowing each column in a grid to start a different process or handle specific data.
After every platform upgrade, always re-generate the definition of your work model before you start developing it (menu Deployment > Creation > tab Generate definition).
This applies changes in the base models to your work model.
Note: if you are using nested base models, re-generate all base models below the highest level before you re-generate the work models.
In accordance with our lifecycle policy, the Web GUI is no longer supported.
The Thinkwise Platform version 2023.3 is the last version to support the Web GUI.
For more information, see the blog post on the Thinkwise Community.
tip
The Universal GUI is the Web GUI's successor.
It matches the Web GUI's functionality and more.
Processes - Support for task and report display types
breakingWindows GUI
The task and report display types that have been set in the model are now taken into account for the Windows GUI.
With the Display type setting, you can now influence how the task or report is available to your user.
The following states are supported:
Hidden - It is not visible on the screen but can be started with a keyboard shortcut, a double-click task, or a process flow.
Overflow - It is only shown in the ribbon menu and the overflow menu, not in the button bar.
Normal - The standard behavior that applies to all other cases.
The setting Display type can be found here:
For tasks: menu Processes > Tasks > tab Tasks > tab Default/Variants > Table tasks > tab Form > tab Table task > group Model settings
For reports: menu Processes > Reports > tab Reports > tab Default/Variants > Table reports > tab Form > tab Table report > group Model settings
Verify the display types
Your applications may show tasks and reports differently after upgrading to 2024.1. Verify the display types for tasks and reports after upgrading.
We have changed the validations accordingly to prevent unneeded validation messages.
When the task/report display type is Hidden or Overflow, it will no longer result in a validation message for the following validations:
Validations
Table with a report uses a detail screen type without a report component
Table with a report uses a main screen type without a report component
Table variant with a report uses a detail screen type without a report component
Table variant with a report uses a main screen type without a report component
Table with a task uses a detail screen type without a task component
Table with a task uses a main screen type without a task component
Table variant with a task uses a detail screen type without a task component
Table variant with a task uses a main screen type without a task component
We have added a new parameter to the Default logic concept.
It is called @auto_commit, and it enables you to initiate a commit without requiring the user to press Execute in the task pop-up or the Save button in the form.
When you set @auto_commit = 1 in the Default logic code, the GUI will execute the commit based on the object to which the Default logic is assigned.
To add this parameter, re-generate and deploy your Default logic.
Check your Default logic
As of this release, a validation is in place to check if your logic already includes a parameter called auto_commit.
If that is the case, review your code and rename the parameter.
Model enrichments are actions that automate parts of your manual workflows.
They can jump-start the work on your application before you start doing manual fine-tuning.
tip
Use a model enrichment instead of a dynamic model if you do not want your actions to be executed during every generation.
The Software Factory comes with a number of ready-made model enrichments.
For more information, see Available model enrichments.
We will add more in the future.
In addition, you can build your own enrichments. For example:
A subroutine for an API connection that always contains a few standard parameters as well as a few extra that can be added manually.
Base tables that always comply with a certain format.
Prefilters that are often used in the entire system.
Check if values and units are always on the same line; if not, correct that if needed..
Formatting name and address details in a consistent way.
The Software Factory comes with a number of ready-made model enrichments.
You can find them in the menu Enrichment > Model enrichments.
In the execution overview, you will find an instruction or explanation specific for that enrichment.
We will show you how to use the model enrichment Create sample model data with AI.
This enrichment swiftly generates a sample data model using AI.
It uses the application description that you provide to create a diagram with tables, columns, and references.
Select the enrichment Create sample model data with AI.
Enrichments list
Execute the task Create enrichment run .
The focus changes to the tab Run enrichment.
Add a description of the data model that you want to create.
Other enrichments require different input.
Execute the task Generate model updates
Select the model updates you want to execute from the list.
Model updates
Execute the task Execute model updates .
Once all the updates have been performed, the enrichment run is closed.
If any actions remain open, you will be prompted whether to close the run or to execute additional actions.
To continue, you can select and execute all the actions that have not been completed yet.
The enrichment run ends when all the actions have been executed or when you end it manually.
You cannot rerun a closed enrichment run. To execute it again, Cancel it in the tab Select enrichment.
MOdel enrichments can be model-driven, data-driven, or AI-powered. Or a combination of those.
A model-driven enrichment will query the model and then create (potential) model updates.
It can be used to check, for example, the consistency in your application. You can re-run it on demand.
A data-driven enrichment prompts you for a runtime configuration when you start it.
It queries the database to load the information required to present the model updates.
Examples of this type of enrichment include generating missing indexes, creating mock data based on table content,
and deriving control types and elements from data in the database.
An AI-powered enrichment uses the configured generative AI provider of the Software Factory to retrieve information from a large language model.
Examples include generating descriptions, translations, comments, etc.
The following model enrichments are available in the Software Factory:
Group
Name
Description
Data model
Create a sample data model with AI
Swiftly generate a sample data model using AI. The provided application description will be used to create a diagram with tables, columns, and references.
Data model
Suggest unique indexes when the data is unique
Reads all non-primary key columns of tables and suggests a unique index when the data is unique.
Functionality
Template summarization
Summarizes control procedure templates that do not yet have a description. Using AI, the summary will be generated based on the inspected code.
User interface
Translate all untranslated objects
Uses generative AI to update the translations of untranslated objects.
User interface
Create prefilters for checkboxes
Generates prefilters for columns that use a checkbox domain.
User interface
Create prefilters for image combo's
Generates prefilters for every column that uses an image combo domain.
Unit test
Create mock data table from test database
Reads the contents of a given table and converts it into a mock data set that can be used for unit tests.
Universal GUI
Create breakpoint screen types
Facilitates the transformation to the Universal GUI by creating breakpoints for specific situations.
Universal GUI
Decolorize all SVG icons that contain a black fill color
Facilitates the transformation to the Universal GUI by removing the fill color of icons, making them suitable for dark and light modes.
Universal GUI
Turn on 'Include the label width' setting
Facilitates the transformation to the Universal GUI by enabling the Include the label width setting, making forms look more like Windows GUI forms.
Upcycler
Set controls (EMAIL, CHECKBOX, URL, CALCULATOR)
Uses data from the product database and inspects the model to suggest controls to use.
Upcycler
Change Yes or No fields into BIT fields
Reads the contents of all tables and finds true/false data to convert into BIT.
Upcycler
Set Combo controls on foreign keys
Reads all tables equal to or below the given threshold. Then creates suggestions to change the foreign key lookup control and the default table lookup control to Combo (sorted).
Upcycler
Show row count in grids on first visible column
Provides the user with the number of records in a grid for the first visible column.
Upcycler
Set display column for every table
Sets a display column for every table.
Upcycler
Include every lookup column in combined filter
Includes every column that is a lookup in the combined filter.
Upcycler
Set main screentypes of tables
Sets the main screen type to master_detail, hierarchy, or master_detail_vertical based on the number of visible columns.
Upcycler
Hide technical primary key fields
Hides primary key columns when they are plain technical numbers without significant value for the user.
Upcycler
Set group labels in forms and grids
Provides structure and groups similar fields using grid group labels and form group labels.
Upcycler
Set column widths in grids
Reads all tables that are not empty to determine suitable grid column widths.
You can create your own model enrichments in the menu Enrichment > Model enrichments > tab Maintenance.
A model-driven enrichment is the basic process for all types of enrichments.
Follow these steps to create a model enrichment, they apply to all types:
In the tab Form > Enrichment, enter a title and instruction for your enrichment.
Select a group. You can use one of the available groups or create your own using the lookup.
If necessary for your enrichment, add user input parameters in the tab Parameters.
The values for these parameters must be provided when using the enrichment.
For example, if you create an enrichment that adds a new prefilter, you could include the prefilter name in a parameter.
Parameters can have default values. A default query can even fill them.
Parameters can be Mandatory and Multiline.
Add a template in the tab Templates.
You can use model update parameters in the description of a template.
This allows you to see which action is being performed.
For example, an enrichment that adds a prefilter to records if they are between a certain start date and end date might have the following description: 'Add prefilter for table @tab_id'.
Now, create a model update query in the tab Form > Model update.
When you create a new one, an example query is added to the tab Model update.
Example model update query
-- Available variables -- @model_id - Name of the current model -- @branch_id - Name of the current branch -- @enrichment_id - Name of the current enrichment -- Additional user input variables will also be available /* insert into #model_update ( model_update_id, template_id, default_active, order_no, parent_model_update_id ) select '@enrichment_id', '@enrichment_id', 1, 10, null insert into #model_update_parmtr ( model_update_id, parmtr_id, parmtr_value ) select '@enrichment_id', 'TAB', tab_id from tab where model_id = @model_id and branch_id = @branch_id and tab_id = 'example' */
Add the potentially executed updates to the table #model_update.
The table #model_update_parmtr contains the parameters that are used by the template.
The column parent_model_update_id can be used to set dependencies between model updates.
If set, the model update can only be selected when the parent update is also selected.
If the parent_model_update_id is set but does not refer to an actual model update, the dependency will be ignored.
It is possible to use is_truthy to validate truthy input, such as true, yes, and 1.
A value is considered truthy if it is not literally true but is evaluated as true.
If you are adding parameters to your enrichments that accept true or false values, use this function to validate the input.
It will return 1 for truthy input or 0 otherwise.
For example: set @no_yes = is_truthy(@parmtr_value)
tip
You can also use the is_truthy function in any other query running on the Software Factory database, such as the dynamic model and control procedure code.
Where relevant, the screens have unlink generated object and show history tasks.
The tab Maintenance has copy and rename tasks for both enrichments and enrichment groups.
A data-driven enrichment follows the same steps as the model-driven enrichment.
In addition, to make it a data-driven enrichment, you must mark it as Data-driven in the menu Enrichment > Model enrichments > tab Maintenance > tab Form.
This activates the tab Database code. It contains a query field with instructions on how to set up the database query.
When constructing this query, you can use generic variables (@model_id, @branch_id, @enrichment_id) and any user variables specific to the enrichment.
The database query allows you to retrieve a temporary table of key-value pairs from the database.
The pairs can be raw values, such as table_id as the key and a counter as the value,
or a JSON object as the key and a JSON object as the value for more complex use cases.
You can use the key-value pairs in the subsequent AI-powered step or in the step that prepares the model updates.
These steps are built with knowledge of the contents of the key-value structure.
An AI-powered enrichment follows the same steps as the model-driven enrichment.
In addition, to make it an AI-powered enrichment, you must mark it as AI-powered in the menu Enrichment > Model enrichments > tab Maintenance.
This activates the tab AI completion prompts. It contains a query field with instructions on how to set up the AI query.
When constructing this query, you can use generic variables (@model_id, @branch_id, @enrichment_id),
in addition to the temporary key-value table retrieved from the database, if applicable.
You can use the AI query to create a temporary table with key-prompt pairs.
This query can also access the model.
The prompts are then executed using the generative AI provider.
The subsequent query that prepares the model updates can use the completions for each key retrieved from the generative AI provider.
In this release, we have introduced branch protection.
This prevents branches from being archived or deleted.
This feature is particularly useful for managing branches with indefinite lifetimes, such as release branches.
Temporary branches, such as feature branches, should retain the ability to be archived or deleted after merging.
note
Deleting a model still results in the removal of all associated branches.
When you upgrade to this release, the branches named MAIN, RELEASE, and DEVELOP are automatically protected.
If you use other names for these branches or if you want to protect more branches, you can set the protection yourself:
go to the menu Models > Model Overview > tab Branch > tab Form and select the checkbox Protected.
You can disable this setting if you want to archive or delete a branch.
A branch is also automatically protected when it is used as an origin for another branch.
You can remove its protected status after all of its branches have been deleted.
When a branch is protected, a lock icon is displayed in the Branch diagram, making it easy to identify protected branches.
Previously, after merging a branch to its origin, you had to manually merge the origin back to the branch to continue working in the branch.
Now, we have integrated this reciprocal merging into the merge process.
When you start the merge session, you are given a choice of what to do with the branch after it is merged back into its origin.
In the menu Models > Merging > tab Merging the following options are available when you select the task Create merge session :
Keep working in branch, perform reciprocal merge - Select this option to continue working in the branch.
Your changes will be merged into the origin, and the origin changes will be merged into your branch.
In the future, you can merge into the origin again.
If your branch is protected, this is the only option available.
Archive branch automatically after merge - Select this option if you have finished working in a branch after the merge.
Your changes will be merged back into the origin.
Archive branch manually at a later point in time - Select this option if you have finished working in a branch after the merge.
Use it only to keep the branch intact for information purposes.
You can continue working in the branch, but this is strongly discouraged.
The branch requires a merge from the origin before you can merge it back to the origin.
Also, there is a chance that some changes made in the origin between the two merge sessions will not be propagated properly to the branch.
If you choose to archive the branch when you create a merge session, you can choose whether or not to actually archive it when you execute the branch.
Keep working in a branch or archive it
When you do a reciprocal merge, the changes from the branch are merged into the origin and vice versa.
The two Merge impact overviews show the impact on both the origin and the branch.
Conflict resolution may affect both branches. You can read this in the information that is provided when you select a conflict resolution.
Information about the conflict resolution you selected
Models - Thinkwise base models merged into one base model per RDBMS
change
To reduce the number of base models required for working models, we have merged the BSR, UG, and MODEL INFO base models into the DB base model.
For each respective RDBMS, only the DB base model remains, which contains all the necessary objects for creating models and deploying applications.
In short, the changes are as follows:
SQLSERVER_BSR, SQLSERVER_UG, SQLSERVER_MODEL_INFO have been merged into SQLSERVER_DB
ORACLE_BSR, ORACLE_UG, ORACLE_MODEL_INFO have been merged into ORACLE_DB
DB2_BSR, DB2_UG, DB2_MODEL_INFO have been merged into DB2_DB
Models - Thinkwise verification base models moved to the Thinkstore
change
Some base models named verification are not actually base models. They check the data that you want to upgrade to see if the checks and foreign keys can be applied.
For this reason, we have moved them to the Thinkstore.
The fields User name and Password are no longer mandatory when configuring an SMTP email provider.
This change allows you to send emails on an internal server without authentication.
note
In all other cases, we strongly recommend using a password.
You can configure an email provider in the Software Factory, in the menu Models > Models Overview > tab Branches > tab Email providers.
Community ideanewWindows GUIUniversal GUI as of release 2024.1.11
A Community idea with many votes requested a double-click task that is tied to a specific column.
This enhancement greatly improves the user experience by allowing each column in a grid to start a different process or handle specific data.
To enable this feature, go to the menu User Interface > Subjects > tab Default > tab Links > tab Tasks > group Model settings.
Check the Double click on record checkbox to activate the Double click column field.
Here, select a column from the table.
You can override this column selection in a table variant or leave it blank.
This changes the cell-based double-click task to a row-based double-click task in the specific table variant and vice versa.
The functionality for custom screens (menu Processes > Custom Screens) was no longer used.
Therefore, we have removed the menu item and all related screens from the Software Factory.
For some process actions (menu Processes > Process flows/Subflows > tab Process actions) you can select a variant:
Open document
Start task
Start report
Generate report
Previously, this variant name was not shown on the Design tab, which could be confusing when using multiple variants for the same object in a process flow.
Now, the variant name is also displayed in the diagram.
A process action with a variant
Process flows - New parameters for Email connector
new
In the process action Email Connector, we have introduced three new optional input parameters that were missing compared to the old SMTP connector:
From address - The email address to use as the email's sender. If not specified, it defaults to the From address of the specified email provider.
From name - The display name of the email sender. If not specified, it defaults to the From name of the specified email provider.
Message encoding - Specifies how your email message should be processed. If not specified, the default ASCII encoding will be used.
Process flows - Validation for process step name length
new
We have introduced a new validation to check the length of process step names in process procedures to ensure that they do not exceed the maximum limit of 128 characters.
The reason for this is that process procedures that contain steps with longer names cannot be used on a SQL Server database.
If you receive a validation message about this, you should shorten the name.
Community ideanewUniversal GUI as of release 2024.1.11
The process action Open document allows you to open a (new) document for a user. We have introduced a new option that allows you to open a document as a modal document.
This means that no interaction with the underlying application is possible until the user closes the document.
This is similar to the behavior of a task pop-up or export window.
We have renamed the parameter Open as floating document to Open as. We have also renamed the existing options and added a new one:
We have introduced a new process action: Extract JSON Data.
You can use it to extract specific data from a JSON object without relying on process application logic.
This connector is useful in several scenarios:
In addition to HTTP connectors and application connectors to extract relevant information from JSON data received from other systems.
When processing JSON files or other JSON data used by your application.
Using JSONPath, a query language for JSON, the extracted data can be written directly to a process variable.
Input parameters
Input - The JSON value containing the data to be extracted.
For example:
JSON Path - The JSONPath expression to load the data. Note that JSONPath is case sensitive. For more information about its syntax and capabilities, see JSONPath.
For example, to extract the email: $.result.email
Always return JSON array - Optional.
Deactivated by default, so single literal results will be unescaped, non-JSON text, and single JSON object results will not have an array wrapper.
Multiple matches will always be a JSON array.
If the input varies, the JSONPath may result in both single values and multiple values,
we recommend setting this to Yes to maintain a consistent response format and avoid problems downstream in the processing chain.
Yes extract_json_array_yes
No (default) extract_json_array_no
Output parameters
Status code:
0 Successful
-1 Unsuccesful (Unknown)
-2 Unsuccesful (No input was provided)
-3 Unsuccesful (No JSON Path was provided)
-4 Unsuccesful (Input was invalid JSON)
-5 Unsuccesful (JSONPath was invalid)
Output - The extracted literal value, JSON object, or JSON array
You can now enable word wrap in the grid for a domain using the control Multiline.
This feature was already available automatically in the form.
Word wrap ensures that text continues on the next line when the right margin is reached.
You can enable this feature in the menu Data > Domain > tab Form > tab Domain > group User Interface.
Word wrap enabled for a Multiline domain
Business logic - Exclude columns from handler logic
Community ideanew
You could already let the Software Factory automatically generate the update and insert statements for a handler.
However, there may be situations where you do not want to automatically update every column, such as trace columns.
For this reason, you can now exclude columns from the default statements.
The new settings can be found in the group Include in default handler statement and can be set separately for insert and update.
To edit them, go to the menu User Interface > Subjects > tab Subjects > tab Default/Variants > tab Columns > tab Performance.
You cannot clear the checkbox for the insert handler in the following cases:
The column is a primary key
The column is a mandatory field without a default value
Note that you must re-generate the handler control procedure after updating the checkbox before the changes become visible.
Verify your dynamic model
This change may break your dynamic model if you use select * into #col from col because these are newly added columns in the table col.
Make sure to verify your dynamic model code and add the new columns if needed.
To prevent any future mainentance regarding new columns, rewrite the select * into #col from col statement to select the columns needed for the Dynamic model code.
In the menu Business logic > Functionality > tab Assigning > tab Assigned templates, we have activated the Filter .
As a result, you can easily filter on a template assignment or part of a name.
In the 2023.3 Thinkwise Platform release, we introduced the AI code review.
We have further improved this feature.
Previously, all the results were added to one single comment. Now, each review result gets its own comment. This makes it easier to address specific feedback.
When maintaining a unit test, you may want to view its linked control procedure for extra context or maintenance purposes.
To support this, we have added a new task to the Unit tests screen (menu Quality > Unit tests).
It is called Go to control procedure in Functionality and its keyboard shortcut is Alt+C.
It opens the object in the Control procedure tab of the Functionality screen. This is only possible if the unit test has a linked control procedure.
Similar tasks are already available on other screens, such as Deploy and Code overview.
note
The task Copy unit test now uses the shortcut Ctrl+Alt+C instead of Alt+C.
We have made some improvements to the mock data in unit tests.
The first one is the addition of a new column (Mock data) on the Unit tests screen (menu Quality > Unit tests > tab List).
It indicates that the unit test uses mock data.
You can use this column to see if a failed unit test uses mock data.
A failure could mean that the mock dataset needs maintenance.
Another change is that now, only columns with a default value (query) can use a Fallback value as a column value.
In addition, we have changed some validations for mock datasets.
If primary key columns have a default value (query) configured, it is not necessary to include them in a mock dataset.
To reflect this, we have changed the code and consequence for two validations:
A primary key column is not included in the columns of a mock dataset
A primary key column has been marked to use a fallback value in a mock dataset
Note that after the upgrade, some previously successful unit tests can fail if you have situations where the value was '' (empty string)
because the inserted record now contains a null value instead of an empty string.
Hiding a validation message is now always within the scope of your current branch and will no longer be merged into other branches.
This includes hiding a validation message indefinitely or temporarily (up to a point in time) for a branch.
We have updated the task names and tooltips to reflect this change in behavior.
To hide a validation message, go to the menu Quality > Validations > tab Validation > tab Validation messages > task Hide message for this branch .
The Translation management role already allowed access to the translation features in the Software Factory but did not allow access to the tab Translation objects.
We have now made this screen available as well.
It gives a translator access to, for example, exporting and importing translation objects and their translations.
The translation screens are available in the menu User interfaces > Translations.
note
Translators are not allowed to create new translation objects.
Deployment - Improved performance when synchronizing
change
We have made some optimizations to improve the performance when synchronizing an extremely large set of variant columns to IAM.
Deployment - Added parameter to automated synchronization script
change
To allow synchronization scripts to be written to an alternate path, we have added the nullable parameter model_vrs_name to the task add_job_to_sync_to_disk.
When given a value via the API, the synchronization script will be written to, for example, \\server\base_path\model\model_vrs_name.
Without a value, the script is written to ...\branch.
Deployment - Model version extracted for database
change
In the rare event that a model version corresponding to the version rolled out to a database has been deleted,
it would be impossible to upgrade the database because the model version could not be extracted.
Now, when the model version is read from the database but does not exist in the model,
the Software Factory automatically generates a model version based on the extracted model version.
This ensures, for example, that smart upgrades work properly.
The Software Factory provides many features to help identify and manage unused items.
We have made the following changes to clarify that even though an object is no longer used in the model, it may still be used in custom code:
All prefilters for detecting unused items have been renamed to Not used in model (instead of Not used). A tooltip provides additional clarification.
Existing validations have been renamed to [Object] not used in model (instead of [Object] not used).
We also added a new validation to identify unused messages. It is not active by default.
Unlike the other not used in model prefilters, messages are often not used in the model but in template code.
However, querying the template code can take a long time and cost a lot of performance.
We recommend executing () this validation at a convenient moment.
For the same reason, we have not added a prefilter for unused messages to the screen Messages.
Validation for an unused message
Generic - Description fields for variants and references
Community ideachange
To improve usability and solve some inconsistencies, we have added Description as a field or task parameter in several places.
Descriptions for variants
To provide a clear understanding of the purpose of a variant, we have added a Description field to the following screens:
User interface > Subjects > Variants
Processes > Tasks > Variants
Processes > Reports > Variants
To be able to provide a description while creating a variant, we have added a Description parameter to the following tasks:
User interface > Subjects > task Create table variant
Processes > Tasks > task Create task variant
Processes > Reports > task Create report variant
Descriptions for lookup references
To provide a clear understanding of the purpose of a lookup reference, we have added a Description field to the following screens:
Processes > Tasks > Task look-ups
Processes > Reports > Report look-ups
Descriptions for references
To be able to provide a description while creating or modifying a reference, we have added a Description parameter to the following tasks:
Data > Data model > References > task Create reference
Data > Data model > References > task Modify reference
Data > Data model > Tables > References (details) > task Create detail reference
Data > Data model > Tables > References (details) > task Modify reference
Data > Data model > Tables > References (look-ups) > task Create look-up reference
Data > Data model > Tables > References (look-ups) > task Modify reference
When examining active conflicts, certain objects lacked a proper object description and displayed an empty string instead.
This issue was only observed with objects associated with validation messages, such as "approved" or "assigned".
Now, the last column containing data is displayed, and empty strings are no longer included.
When trying to change a menu group, an error could occur due to existing role rights, preventing the group from being changed.
Now, these role rights are preserved when changing a menu group. They are automatically applied to the new group/item combination.
If you had a table task or table report with the same name as a column in that table,
you would get an error (due to primary key violation) when adding parameters to a unit test for this table.
This has been fixed.
New and changed in the Intelligent Application Manager
When launching an end product created with the Thinkwise Platform, the model is loaded using interface views.
For the Universal GUI, we have optimized the loading performance for large sets of these views.
This significantly improves the model loading time for larger applications.
Our user interfaces used to have different types of user preferences that were configured per exact navigation location in the UI, per path.
For example, sorting invoice lines under Customer > Invoices > Invoice lines would not be shared with Invoices > Invoice lines.
On the other hand, user-defined prefilters and cube views would be shared for all occurrences of a subject in the UI
and across all occurrences of variants of a subject in the UI.
Because of that, the user-defined prefilter Pending invoices (created in the table Invoice)
would also appear in the Paid invoices variant of the Invoice table.
This behavior will remain as-is for the previous generation user interfaces.
However, user preferences for user interfaces that use Indicium (at the moment, the Universal GUI)
are moving away from path-based user preferences to user preferences per model object or model object variant.
This results in user preferences being shared among all occurrences of a subject in the UI.
User-defined prefilters and user-defined cube views are stored per model object or model object variant and are no longer automatically shared across all variants.
Migration of classic user preferences
A one-time migration of the classic structure to the new structure will be performed automatically during the IAM upgrade.
A main administrator can repeat this migration process later if you are still using a previous-generation UI.
The task for re-migration is available in two places:
menu Advanced: Administration > Re-migrate user preferences - In the popup,
the re-migration can be limited to a tenant, user, or user group, and to a model, branch, and application.
menu Authorization > Applications/Users/User groups - Quickly select a set of applications, users, or user groups to re-migrate.
warning
Any previously migrated (or created) path-based user preferences for the chosen users will be removed to make room for the migration of model-based user preferences.
Note that classic, path-based user preferences cannot always be migrated 1-to-1 to the new structure.
If a conflict occurs, the migration will choose the most relevant path, favoring user preferences configured
for more accessible paths over nested paths that are deeper in detail and lookup structures.
Re-migrate User Preferences
Both the new user preferences data as well as the classic user preferences data can be found in the menu Authorization > Users > User Preferences.
Location of the user preferences data
Users - Improved prefilters for active and inactive users
change
The prefilters showing active
or inactive users did not consider the fields Begins on and Ends on.
We have improved these prefilters so that a user is now considered inactive if the Begins on date has not yet arrived or if the Ends on date has passed.
We have expanded the rights for users with the role User administrator. In the menu Authorization > Users > tab Form, they are now authorized to add or change:
The password expiration policy if change is allowed (in the group Password)
Password expiration policy
The option to allow fallback to email (when the Login verification is Password and TOTP token > field Allow fallback to email)
Allow fallback to email
The option to select an identity provider for OpenID (when the Authentication is External > field Identity provider)
The Intelligent Application Manager now deploys without assigning rights to the Public role, a default SQL Server role.
This change ensures that data and objects in the IAM database remain inaccessible during the upgrade
and can only be accessed by users with a SQL Server role that grants sufficient rights after the upgrade.
Any previously granted rights to the Public role are automatically revoked during the upgrade to version 2024.1.
Accurate access type display in effective rights overviews
Application administrators will now see the accurate access type for Column rights, Task parameter rights, and Report parameter rights in the following locations:
menu Authorization > Users > tab Effective user rights
menu Authorization > User groups > tab Effective group rights
Previously, in certain cases where users were granted access to columns or parameters through different roles with different access levels,
the access type was displayed incorrectly.
Note that the visual error in this overview did not affect the actual effective user- and user group rights granted to the API, UI, and database roles.
Clarified authentication precedence for email address
Universal GUI
A user can log in to the Thinkwise Platform using their user ID or registered email address.
The same email address may exist for two user accounts, once as a user ID and once as an email address.
When such an email address was verified during authentication, the Thinkwise Platform would verify
the authentication credentials against either one of these user accounts.
To make this more deterministic, the Thinkwise Platform now always prefers the user ID over the email address.
If the user logs in with an email address, the Thinkwise Platform will select the user account that matches
based on the user ID over the user account that matches based on the email address.
It was not possible to delete a tenant because of related application claims.
To preserve the history of application claims, they can now exist without a valid tenant.
Data model changes for the Software Factory and IAM meta-models are listed here.
This overview can be used as a reference to fix dynamic control procedures, dynamic model code or custom validations after an upgrade.
The highlight of this release is the introduction of generative AI in the Software Factory.
We have added four Large Language Model connectors that you can use in your system flows.
This opens a world of new possibilities.
Of course, we have also implemented AI in the Software Factory.
The first use is for reviewing control procedures.
You can decide whether you want to use it or not, to support a human review.
An important change in this release is that we have improved the merging process and its screens.
Below, you can read about all the improvements and additions, including 8 Community ideas representing 111 votes.
The 2023.2 release of the Thinkwise Platform includes many improvements and additions.
One of the most visible changes is that we have revised the Result tab in the Functionality screen.
An example of a new feature is, that you can now mark a column or domain for optimistic locking,
which prevents users from editing the same record at the same time.
Because we value your input, this release also includes 29 community ideas representing 390 votes.
One idea that received many votes was a Branch diagram for your models in the Software Factory.
It provides a graphical overview of all the branches inside the model and how they interact.
Another popular Community idea was to add the Match any (OR) option to the prefilters.
This allows you to set up combinations of prefilters that were not possible before.
Update February 17, 2023 - Added information about OAuth connectors.
We are very excited to announce version 2023.1 of the Thinkwise Platform.
This release contains a major change in version control that affects a large part of the Software Factory.
Make sure you carefully read all release notes for this change, as mentioned under the topics Breaking and A new way of version control.
We are very excited to announce version 2022.2 of the Thinkwise Platform.
This release contains so many new and improved features!
For example, handler procedures for replacing GUI actions, OpenID provider registration and user provisioning, new process flow actions and connectors,
improved file storage handling, time zone support, and a lot more.
Here is an overview of everything new, changed, and fixed. Make sure to check out the breaking changes.
The 2022.1 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.
The 2021.3 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.
The 2021.2 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been
addressed.
The 2021.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 50 feature requests and issues have been addressed. The most important changes are listed in this post.
The 2020.2 release of the Thinkwise Platform features a lot of improvements and additions, and about 100 feature requests, ideas and issues have been addressed. The most important changes are listed in this post.
The 2020.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 50 feature requests and issues have been addressed. The most important changes are listed in this post.
The 2019.2 release of the Thinkwise Platform features a lot of improvements and additions, and over 70 feature requests and issues have been addressed.
The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.
The 2019.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 100 feature requests and issues have been addressed.
The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.
The 2018.3 release of the Thinkwise Platform features a lot of improvements and additions, and over 100 feature requests and issues have been addressed.
The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.
The 2018.2 release of the Thinkwise Platform features a lot of improvements and additions.
An overview of all changes can be found in the Thinkwise Community Portal.
Version 2018.1 of the Thinkwise Platform contains a lot of technical and functional changes.
A complete list of all changes can be found in the Thinkwise Community Portal.