2021.1 to 2021.2
1. Change to grantUpdate property: Insert Mode Behavior Corrected
What changed
The grantUpdate
property no longer applies when using a multipleGenericViewTemplate
in insert mode. Now, grantUpdate
only affects updates to existing data, not newly inserted data.
Why it matters
This ensures that permissions for updating are not incorrectly applied during data insertion
Recommended actions
Review any logic or permissions relying on grantUpdate
for inserts, and update processes accordingly.
2. Inserting Userhelp via Liquibase: Userhelp Initialization
What changed
Userhelp contents can now be initialized using Liquibase. To enable this, remove the comment that disables the "userhelp" context.
Why it matters
This streamlines the process for initializing user help content during deployments or migrations.
Recommended actions
Edit your Liquibase changelog to enable the "userhelp" context.
3. entities.getRows(): Output Format Applied to Display Values
What changed
The JDito method entities.getRows()
now applies the output format to display values if it is set.
Why it matters
Display values will be consistently formatted according to the specified output format, improving data presentation.
Example usage
4. Timezone Handling within Filters: Consistent and Accurate Filtering
What changed
Prior to 2021.2.0, filters used the user's timezone, which could cause time shifts when filters were shared. Now, filters store dates in UTC (00:00), and convert to the user's timezone at execution. The JditoFilter_lib was updated to match this behavior.
Why it matters
This prevents time shifts and inconsistencies when sharing filters across users in different timezones.
Recommended actions
- Update JditoFilter_lib to the latest version when upgrading to 2021.2.0.
- Be aware of the new system variable
$sys.timezone
for client timezone.
If you update to 2021.2.0, you must also update JditoFilter_lib for correct timezone handling.
The new system variable $sys.timezone
contains the current client timezone.
5. External Filter via Consumer: Initial Filters from Consumers
What changed
You can now set an initial filter externally using the externalInitFilterProcess
of a consumer. The provider can control how external and internal filters are combined using the initFilterMergeMode
property: AND
, OR
, or IGNORE
.
Why it matters
This enables flexible integration scenarios, allowing external sources to influence initial data filtering.
Recommended actions
Configure initFilterMergeMode
as needed:
- AND: Both filters must match.
- OR: Either filter may match.
- IGNORE: Ignore external filters.
Example usage
See provider and consumer configuration for externalInitFilterProcess
and initFilterMergeMode
.
6. Hourly View at Gantt Chart: Finer Time Granularity
What changed
Gantt charts now support an hourly view option.
Why it matters
Users can visualize and manage data at a finer time granularity, improving planning and resource allocation.
Example usage
Select "hourly" in the Gantt chart view options.
7. $sys.selection Excludes Consumer Data: Consumer Data Isolation
What changed
The system variable $sys.selectionRows
no longer contains consumer data (such as insertedRows
) on single row views.
Why it matters
This prevents unintentional data exposure and clarifies data sources.
Recommended actions
To access consumer-specific data, use the consumer's $field
variable, e.g., $field.<consumername>.insertedRows
.
8. New Method util.scaleImage: Image Scaling Utility
What changed
A new method util.scaleImage
was introduced for resizing or scaling images.
Why it matters
This simplifies image processing within scripts and automations.
Example usage
import("system.util");
var config = util.createConfigForScaleImage().targetHeight(1080).targetWidth(1920);
var base64 = "ABAACBACAA=="; // Example only
util.scaleImage(base64, config);
9. Load/Write Entity: Setting Locale and Timezone
What changed
Builders for load/write configs now support setting the locale and timezone, ensuring correct date handling and translations.
Why it matters
Improves consistency and localization of data operations.
Example usage
var config = entities.createConfigForLoadingRows()
.entity("Person_entity")
.locale("DE")
.timezone("America/Monterrey");
10. Web Spellchecker for HTML Editor: SCAYT Integration
What changed
The instance config now supports a ckeditorConfig
property for integrating the SCAYT web spellchecker.
Why it matters
Enables spellchecking in the HTML editor for improved content quality.
Recommended actions
Purchase a license and configure the following parameters in ckeditorConfig
:
- scayt_customerId
- scayt_serviceHost
- scayt_servicePath
- scayt_servicePort
- scayt_serviceProtocol
- scayt_srcUrl
See: https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html
This feature requires a third-party license from https://webspellchecker.com/
11. Global Tags: New Tagging System and Favorites Deprecation
What changed
ADITO now features a global tagging system, replacing the old favorites system (system.favorite
is deprecated in favor of system.tag
). Global tags start with #
and have no spaces; personal tags may have spaces and must not start with #
.
Why it matters
Tags improve searchability and categorization, and unify tagging and favorites functionality.
Recommended actions
- Migrate usages of
system.favorite
tosystem.tag
. - Use the upgrader in the designer for code migration.
- Ensure
indexGlobalTags
is set to true (default) in your index recordcontainer. - Rebuild your index for the new schema.
Example usage
Add tags to datasets for improved search via indexsearch.
To use the new index features, delete and rebuild your index for the latest schema.
12. Filters via RecordsRecipe: Modern Entity Filtering
What changed
Introduced the RecordsRecipe
as the new standard for entity filtering and selection. This allows the ADITO server to optimize queries and improves performance for large data sets. The recordsRecipeSupported
property must be enabled (default: false).
Why it matters
Enables scalable, efficient filtering and supports features like "select all" in tables and tree tables.
The variable $sys.filter
isn’t necessarily specific enough to describe the current records. A RecordsRecipe
contains more information and is therefore better suited in many situations.
Recommended actions
- Set
recordsRecipeSupported
to true in your entity. - Update JDito recordcontainers to evaluate recipes via
$sys.selectionRecordsRecipe
. - Use
$local.idvaluesExcluded
to handle exclusions. - Replace direct
$sys.selection
usages with recipe-based methods. - Migrate checks and actions as outlined below.
Example usage
var selection = vars.get("$sys.selectionsRecordsRecipe");
if (selection) {
var loadConfig = entities.createConfigForLoadingRows()
.fromEntityRecordsRecipe(selection)
.fields(["#UID"])
.startrow(0)
.count(400);
var rows = entities.getRows(loadConfig);
logging.show("rows (" + rows.length + "):\n" + JSON.stringify(rows));
}
Migration steps
- Search and open your entity.
- Find all
$sys.selection
usages (including libraries). - Replace:
- Use
MULTI
for actions needing multiple selections. - In JDito-RecordContainer, implement ID exclusion with
$local.idvaluesExcluded
. - Replace
vars.get("$sys.selection").length > 0
withvars.get("$sys.hasSelection")
. - Use
$sys.selectionRecordsRecipe
instead of explicit UID lists. - Prefer records recipes over
$sys.filter
for specificity.
- Use
- Set "recordsRecipeSupported" to
true
. - There a new methods for working with a RecordsRecipe, such as:
- neon.openContextWithRecipe
- entities.getRows, entities.getRowCount via entities.createConfigForLoadingRows().fromEntityRecordsRecipe
- notification.updateUserNotificationsStateBulk
- neonFilter.createEntityRecordsRecipeBuilder
Once complete, the select-all-records-checkbox will be available for testing.