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.