New features
New interface for Reports configuration
We’ve completely redesigned our reporting configuration interface, integrating it directly into the Report manager. You can now access report properties faster, without jumping between administrative forms, thanks to a new collapsible sidebar that appears when double-clicking a template.
Not ready to switch? Don’t worry, we’re keeping the original Report Wizard available for a limited time to ensure you have a smooth transition.
Additionally, you can now add the “Description” column to the Report manager, which is useful for filtering by you have written in this property.
Arrays
An array is a data structure designed to manage collections of elements. In IQL, this means you can now handle multiple records simultaneously, opening up new workflow possibilities. For example: Imagine having a form where you can select multiple rows from a service portfolio and instantly integrate them into a quotation.
To accomplish this, we’ve introduced two major enhancements:
-
Multi-Select Table Rows: The new “Selection boxes” property in Table sections renders a checkbox column, allowing users to select multiple records.
-
IQL array functions and syntax: For the temporary storage and processing of these arrays, giving you full control over how selected data is handled.
Of course, the array can also be defined with variables or specific records, and then set actions for each of its elements with the our new foreach statement:
let @array = [@variable1, @variable2, @variable3]
foreach @id in @array do
set Field = Value
end
New interface for Notifications, E-mail and SMS rule configuration
You will be able to use this modern and user-friendly interface when you use the actions “Send a notification”, “Send a mail” and “Send an SMS” in the Rules manager, providing you with autocompletion to instantly find matching contacts, fields, or IQL expressions as you type, reducing errors and speeding up your configuration, among other benefits.
Popup messages in forms
Sometimes, system messages like “Save successful” or “Record has been created” can be confusing to end users, because they may come from a configuration used as part of a larger workflow to accomplish logic. For that, we’ve introduced the “Hide popup messages” property in the Form designer, that allows you to silence such messages in the following sections: Table, Detail, Multi detail, Repeater, Calendar, Map, and Gantt.
But here’s the best part to give you full control over the user experience: you can always configure your own messages using our popupMessage function.
call popupMessage(‘message type’, ‘message’)
There are 4 types of messages, which will define the color of the popup displayed: ‘info‘ – blue, ‘error‘ – red, ‘success‘ – green, and ‘warning‘ – orange.
For example, if you have the following configuration in a Button component, the record is saved and a blue popup box appears notifying the user that the form has been submitted:
call save()
call popupMessage(‘info’, ‘Form submitted’)
Floating toolbar in Repeater
No matter how far you scroll within a Repeater section, its toolbar will always be available to you, overlaid on the records at the top of the area where it is placed.
Repeater scaling
In previous versions it was possible to scale or stretch (i.e., fixed edges) the Repeater as long as it was limited to one column, but now it will adapt well to the screen even if configured to multiple columns.
Summary row tooltip in Table section
If you’re already using our “Summary row” feature launched last winter, please hover over it to quickly stop wondering what kind of aggregation it is: count, sum or average.
Column filter for File field
Take advantage of the filter we just added to the Table section for File columns. It has the same options as the Text fields.
Run the Record filter with keys
For those of you who love working with keyboard shortcuts, try using Alt+Enter to quickly run you basic and advanced filters when using the Record filter in forms.
Fewer clicks to draw lines in the Map component
An improvement has been implemented in the lines drawn on Maps, making it more responsive when clicking from one point to another. Previously, this action required additional clicks because the focus changed to the marker if the line was close enough, which is no longer the case.
Button and Icon tooltips
We have a new and fresh design for the tooltips of the Button and Icon components.
Improved “Run IQL” rule action
There is nothing that “Run IQL” can’t do. In previous releases, some functions and syntax were only available in the “Set the value of a field with a formula” and “Set the value of fields using IQL” actions but that’s no longer the case. Below, some of the most important examples:
| Function in “Set the value of a field with a formula” | Function in “Run IQL” |
|---|---|
RecordCreatorEmail |
getUserEmail(currentUser()) getUserEmail(CreatedUser) |
fieldCreatorEmail |
getUserEmail(CreatedUser(Field)) |
RecordUpdatorEmail |
getUserEmail(UpdatedUser) |
fieldUpdatorEmail |
getUserEmail(UpdatedUser(Field)) |
N/A |
getUserPhoneNumber() |
match(AnyTypeOfField, regular expression) |
matches ‘regular expression’ |
userLatitude |
set (@lat, @lng, @acc, @ts) = currentUserLocation() |
userLongitude |
set (@lat, @lng, @acc, @ts) = currentUserLocation() |
userLocationAccuracy |
set (@lat, @lng, @acc, @ts) = currentUserLocation() |
userLocationTimestamp |
set (@lat, @lng, @acc, @ts) = currentUserLocation() |
| Syntax in “Set the value of fields using IQL” | Syntax in “Run IQL” |
|---|---|
Name, Seniority, Manager from Employee where Project = ‘Campaign’ (with Responsible, Years of service and Current manager previously selected) |
set (Responsible, Years of service, Current manager) = Name, Seniority, Manager from Employee where Project = ‘Campaign’ Read more about our implementation of tuples |
As a result of this major improvement to “Run IQL”, it has been decided to remove all other rule actions except “Send a mail”, “Send an SMS” and “Send a notification” for applications created after this version.
Tuples in IQL
A tuple is a collection of elements as a single unit. You can use tuples in IQL to integrate multiple fields or variables into a single statement, with the syntax
set (resulting element1, resulting element2) = (source element1, source element2)
Here are some examples.
set (Dropdown, “WO Responsible”) = (Yes, ‘John Smith’)
set (Dropdown, “Grand total”) = (@type, @granTotal)
let (@var1, @var2) = (Field1, Field2)
let (@budget, @finishedDate) = sum(Price), max(DeliveryDate) from Order where Project = @proj
But not only that, you can use tuples to better handling the restApiGet function:
let (@json, @status, @statusline) = restApiGet(‘my-endpoint’, ‘/path/to/resource’)
And to use the new currentUserLocation() function, as mentioned in the previous topic:
set (@lat, @lng, @acc, @ts) = currentUserLocation()
Other new IQL functions
-
IQL functions for JSON data: The parseJson function, available since older releases, has been used to reading values of scalar string, number or boolean from a JSON object, but it was insufficient when having deep JSON structures as it was not possible to store intermediate values. That is why we introduce the following functions:
-
jsonFragment(). All matching fragments as JSON strings.
-
jsonFragments(). Single matching fragment as JSON string.
-
jsonValue(). All matching fragments parsed.
-
jsonValues(). Single matching fragment parsed (same as parseJson).
-
-
currentUserLanguage: With this function you can retrieve the user’s language. Use it together with the popupMessage() function to customize messages, like:
let @lang = currentUserLanguage() if @lang = ‘es’ then call popupMessage(‘info’, ‘Formulario enviado’) else if @lang = ‘sv’ then call popupMessage(‘info’, ‘Formulär inskickat’) else call popupMessage(‘info’, ‘Form submitted’) end end -
call downloadFile: You can now trigger file downloads via a Button component rather than clicking directly on a File field, which provides more flexibility in how users interact with and retrieve documents within your forms. To do this, configure a Button component with the following query in the “Run on click” form rule:
call downloadFile(myFileField)
Other improvements related to IQL
Copying a file with IQL: We make it possible to copy a File field from one record to another, within the same table and between tables, via “Run IQL” in the Rules manager. See our manual for more details.
List item autocompletion: Predictive text has been implemented for Drop-down List items in IQL. Try it by typing a query like “Dropdown in (“ and then pressing Ctrl+Spacebar or starting to type the first letter of the item.
Improvements to Form designer
Optional arrows in Multi detail section: Hide the navigation arrows in the Multi detail section for cases when you know only one record will be displayed; otherwise, the arrows would be pointless. You’ll find them by the “Buttons” property of this section in the Form designer.
Style to Table column header: You can now set the background and text color in each column header of the Table section.
Customizable Toolbar alignment: Use our “Toolbar buttons placement” property in the Calendar, Map, Gantt, Table and Repeater sections to align toolbars to the left or right to better suit your form’s design and user preferences.
Multi-value Relation field sorting: The content of the “Relation field” property of the Multi-value field is now sorted alphabetically to make it easy to assign the proper relation.
Clearer “Show history” in Form rules: The blocks in this tool have been labeled with “Before” and “After” to make it clear when comparing lines of code.
Icon tooltip: To make the interface easier to use, system icons (such as those in the Form designer toolbar and action icons in rendered forms, among others) will now reveal a descriptive caption when you hover over them, along with a new design.
Improvements to the Data model editor
“Open table records” with creation column: The “Record created time” system field has been included by default in the Data model editor so-called magic tables as it is a common and important property that administrators often check. Of course, it can be reset in the “Choose columns” context menu.
Easy Drop-down deletion: The task of removing this field no longer requires the initial deletion of all its stored data. Instead, you will be required to type the field name in a warning window to perform the deletion. The Record update time will not be affected, but the delete action itself and the time of deletion will still be registered in the Activity log for audit reasons.
Sorted List items: A new icon is part of the “List items” toolbar, useful for sorting your items alphabetically, which is how they will be displayed in Drop-down fields of forms.
Also, the items displayed when clicking the “Tag” icon are now sorted.
Logged deleted fields: Each deletion of fields in the Data model editor will be logged in the “Activity log” form for auditing purposes. The log will describe the field name, whether it contained data, and if so, how many records affected.
Improvements to “Rest API endpoint config” form
Trimmed Endpoint base URL: We know that it is common to paste an endpoint in the “Base url” property of the Rest API endpoint config form. To make this value error-free, we are now applying automatic trimming of whitespaces on save.
Interface details: The label “Endpoints” has been added at the top of box where they are listed. The list is sorted alphabetically. The “Description” is updated once an endpoint is selected. The order of the “Headers” does not change when adding something to a parameter.
New Trigger condition in Rules manager
Try our new Record keyword = NAME_CHANGED when you have cases where you need to perform an action based on the update of the Record name. Previously, we could only do this with other record fields, but now we can use the name itself, which will surely be very useful.
Password policy in User administration form
It’s now possible to update the policy for multiple selected users at once with the new “Assign password policy” button. Note that this button will only be available when selecting users who have the current application as their home application.
Theme designer
New properties have been implemented in this form: “Font family” and “Default size”, so you can standardize them for your entire application at once.
“Import configuration” form has changed name to “Import templates”
The reason for this decision is that the original name led to confusion as it sounded like “the import of configuration” sometimes considered to be the “Configuration bundles” form. Note that this change is reflected in the form title but not on the menu entry in existing applications.
“Form rights” view
User forms now only display the “View” right in this administrative form as the other rights were already covered by Form designer, Manage record groups and Field rights forms. This is just a visual improvement; it does not represent any change to your current configuration of rights.
Classic forms removal
Classic forms have been an essential part of our platform for 25 years, but it’s time to let them go, as we announced in our release notes last winter. There are still some applications using them, and if yours is one of them, we’ll be in touch soon to help you convert them to the current version of forms.
Bugs fixed
Form designer:
-
The IQL operator “not”, in combination with “like”, “contains”, “startsWith”, “endsWith”, and “in”, produced a different result in form rules than when applied in Rules and Filters. For example, the following behavior configured in a column of a Table section, turned empty cells red, which is incorrect, since empty values should not be considered in comparisons:
if TextField not like ‘*value*’ then set :backgroundColor = ‘red’ endThis has been aligned with the correct functioning of Rules and Filters. You may use our “Find in form” tool to make sure that queries including “not like”, “not contains”, etc. configured in Run on select, Run on click, Run on change and Behavior produce the result you intended, otherwise, adjust them accordingly. Based on the example above, if you still want those empty cells turn red, you’ll need to adjust it to:
if TextField not like ‘*value*’ or Text1 is null then set :backgroundColor = ‘red’ end -
Also, the syntax Field in (1, 2, 3), which is commonly used with Drop-down fields but is compatible with other types, worked correctly in Rules and Filters, but not in Form rules. For example, you can now use the following query in Behavior:
if Number in (1,2,3) then set :backgroundColor = ‘red’ end -
Copying-pasting numeric cells with multiple thousand/decimal separators on a field with no “Number format”, resulted in a truncated value, e.g., copying 1,234,567,890 would be pasted as 1,234. This occurred due to the use of separators based on the user’s locale. To prevent it, we have implemented the following:
-
If both , and . exist based on the user’s locale, the last separator is the decimal and all earlier separators will be grouping.
-
If only one separator exists, and it appears more than once, then all will be grouping; otherwise, it will be treated as decimal. See our manual for more information and examples.
-
-
The Multi-value field had difficulty with form rules configuration. It is now well defined that the “Run on change” event can use fields from the section Datasource table, while the “Run on click” event can use fields from the related table.
-
When setting the “Background color” property in the root of a form with “Dimensions” property defined, the entire height was not covered when scrolling.
-
The content of the “List” property was not sorted alphabetically for the Drop-down fields used as variables.
-
The value set with the IQL property “:icon” was case-sensitive, making it difficult to find the element in the icon library. Now you can use, for example, set :icon = ‘check’ or set :icon = ‘Check’ and both will find the ✓ item.
-
The Media component had required fields that were not highlighted to facilitate configuration.
-
Form rules would validate any syntax with a non-existent property, for example, set :noRealProperty = 100.
-
It was not possible to use the “Select rectangle tool” outside of a panel, and if the panel was placed on another layer.
-
Disabling “Grid size” and “Snap to grid” tools would prevent components from being placed in the exact desired position.
-
The toolbar of sections in the Form designer had a slight difference in size and position from the rendered form.
-
The “Filter: Configure” property could be applied for sections with different data source selected via Ctrl+click, leading to an error when opening the form.
Forms:
-
Calendar
-
The Side panel did not display the assigned background color.
-
When the Calendar was linked to a parent section, navigating through parent records would cause the page to automatically scroll and force focus onto the Calendar.
-
-
Gantt
-
An error message popped up when indenting records in this component.
-
Gantt components were not listed within the “Quick navigate” tool (i.e., Alt+k, to find and go to a section in the form).
-
-
Repeater
-
The Save and Delete toolbar icons overflowed when the component had a short height.
-
Data in the Multi-value field in the Repeater section was not updated when new records were added from another section unless the form was reloaded. Table section
-
Columns with Link components were not displaying the typical underline when hovering on them.
-
If the section was set to “Save automatically”, the Delete button appeared disabled after saving a new record.
-
Table section columns with :hide Behavior were placed to the far right of the section after being redisplayed.
-
-
Other issues in forms
-
An error message was caused when attempting to save a Map layer editor component with keys Alt+s.
-
The Media component was unable to display the current image in full screen in forms when changing images via form rules.
-
Users without access rights to certain records could still see their names through related records with the “Display fields” setting.
-
-
Data model editor:
-
Several options in the context menu of columns missing a Swedish translation.
-
When changing the “Record name policy” property from “Generated series” to any other policy, the form would keep the value set in “Start name at” as the “Max record name length” value.
-
-
Rules:
-
Changing the order of rules did not update the expected execution order. Rules within a “Only scheduled” group were incorrectly triggered upon update.
-
The trigger condition “Record keyword DELETED” did not work for actions configured with “Run IQL”.
-
An autogenerated Record name could not be customized within the Insert, i.e.:
insert Table1 values RecordName = ‘prefix’ || now()
-
-
Mobile:
-
The Calendar component would always display the Record filter icon in its toolbar regardless of whether you disabled it in the Form designer.
-
Repeater sections with the “Columns/Rows” property bigger than 1 and “Direction” as vertical made scrolling on the phone screen difficult. This was resolved by limiting the mobile mode display to a single column, regardless of these properties.
-
-
Imports:
-
An error occurred when queuing imports on some servers running on Windows.
-
The import execution failed when data belonged to a table that had the setting “Max record name length” equal to 1 in the Data model editor, originated from another issue.
-
-
Reports:
-
The “Report filter” information, automatically added to Excel or HTML when downloading executed reports, would not reflect filters applied with days added to Date fields, e.g., Date1 = Date2 + 3
-
The “Main record filter” property, set during the configuration of a report template, was bypassed when running the report.
-
-
Other:
-
In the Manage record groups form, the Delete group button was permanently disabled.
-
In the Theme designer, the “Background” and “Text” colors in the “Accent (selected)” property were not correctly reflected in the selected icons in toolbars.
-
In the User administration form, the message “No such resource exists” popped up every time a user was deleted.
-