Skip to main content

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

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.

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​

OutputFormat_202120


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.

  • 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.
warning

If you update to 2021.2.0, you must also update JditoFilter_lib for correct timezone handling.

note

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.

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.

externalFilterProcess Provider_InitFilter_Merge


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.

Gantt_Hours


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.

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.

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

warning

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.

  • Migrate usages of system.favorite to system.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.

JDitoUpgrader_system_favorite GlobalTags_Index

warning

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.

  • 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​

  1. Search and open your entity.
  2. Find all $sys.selection usages (including libraries).
  3. Replace:
    • Use MULTI for actions needing multiple selections.
    • In JDito-RecordContainer, implement ID exclusion with $local.idvaluesExcluded.
    • Replace vars.get("$sys.selection").length > 0 with vars.get("$sys.hasSelection").
    • Use $sys.selectionRecordsRecipe instead of explicit UID lists.
    • Prefer records recipes over $sys.filter for specificity.
  4. Set "recordsRecipeSupported" to true.
  5. 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.