Release Notes 4.14

What’s New

New Result Center

With this release, a new table component is introduced that replaces the old result center. Both the user interface and the API working underneath are completely reworked and provided as new bundles (result-ui and result-api).

With the new result center, results from different sources, such as spatial selections, can be displayed in a modernized, highly configurable user interface. Data may be added programmatically as well, allowing an easy integration with other query or selection operations such as the query builder . Actions can be used to interact with individual or multiple entries in the table. With an API it is possible to add actions programmatically. Several actions for standard use cases like "Zoom to" or "CSV Export" are already available.

result ui

The bundles resultcenter and selection-resultcenter are still available, but we recommend to use the new ones.

Accessibility improvements

The accessibility of UI elements has been improved in several aspects. These include better keyboard navigation options and accessibility for screen readers.

App Editor improvements

Bundles are now suggested in the App Editor in map.apps Manager based on their metadata. Additionally, bundles can be deprecated via metadata and are marked accordingly in the editor. This allows bundle developers to decide how their bundles are handled in the app editor.

Log level for apps

It is now possible to globally configure bundle log levels for the browser console. This configuration can be overridden per app.

Innovations for developers

New request bundle

The bundle apprt-fetch was introduced to replace the old apprt-request bundle in upcoming releases. The new bundle uses the native browser Fetch API instead of Dojo/request.

Typescript

Several bundles have been migrated to typescript resulting in better API documentation and type definitions for bundle developers.

Rollup

All bundles are now built with Rollup, resulting in more specific entry points for bundles. Note, that not all possible files can be imported anymore. This results in more clear, specific and stable interfaces.

Map actions

The map actions for "highlight" and "zoom" are now able to handle multiple geometries. It is also possible to define an order in which different map actions are executed.

Automatic i18n imports

It is no longer required to import dojo/i18n!nls/bundle in a bundle. Instead i18n: [“bundle”] can be added to the manifest.json file.

Sourcemaps

map.apps now ships sourcemaps as .js.map files to the client. This may be disabled via configuration.

Further new functions and improvements

  • The ArcGIS API for JavaScript used by map.apps as technical basis is updated to version 4.24 with this release. This results in numerous improvements and bug fixes in the base technology.

  • A search started via a URL parameter can now display multiple results. This behavior must be enabled by configuration.

  • You can now configure a typing delay for the search-ui bundle to prevent too many server requests.

  • For TileLayers that offer a query interface, stores (e.g. for search or selection) can now also be registered.

  • A new configuration option autoExpandLegend can be used to automatically expand the legend in the TOC.

A complete list of all changes can be found in Changelog.

Update Notes

If you skip several versions during the update, please also follow all update notes of the intervening versions.

Updated default app

The template for the default app is updated. If you have not made any customizations, remove the file default-app-4.zip from the working directory. The path to this directory is defined in the parameter data.directory.location in the file %TOMCAT%\webapps\mapapps\WEB-INF\classes\custom-application.properties.

Editor widget

With the upgrade of the Esri ArcGIS API for JavaScript the editing bundle of map.apps will provide a completely new Editor widget. Accordingly, the config option allowedWorkflows:["create"] is deprecated and should not be used in favor of allowedWorkflows:["create-features"].

DGrid

DGrid was affected by a design flaw in its API that could be used as an attack vector for JavaScript injection. The dependency was updated to version 1.3.3 which includes a fix for this problem.

This update comes with a breaking change concerning custom formatters: whereas values returned from a formatter were previously always interpreted as HTML, return values will now be escaped appropriately by default. Only when explicitly returning { html: "…​string…​" } will the value be interpreted as HTML. More details are described in this Github issue .

Example:

// Before:
function makeRed(value) {
    // Was vulnerable before, will now be escaped:
    return `<span class="red">${value}</span>`
}

// After:
function makeRed(value) {
    // Ensure that value is either trusted or escaped correctly!
    return {
        html: `<span class="red">${escapeHtml(value)}</span>`
    }
}

Note that map.apps installations are safe against this vulnerability when using default settings: the Content-Security-Policy headers prevent execution of inline scripts (unsafe-inline).

seasons-template

Removing Dijit Layout Containers

The Dijit BorderContainer/ContentPane-based layout has been replaced by a modern CSS-Grid . This gives much more possibilities to customize the layout via CSS (also later via app.css) without having to change the underlying HTML.

The change described above also removes the CSS classes .dijitContentPane and dijitBorderContainer. If you use an app.css, check if there are corresponding style statements. There are two cases to distinguish:

  • The style statement is no longer necessary (paddings of .dijitContentPane and .dijitBorderContainer).

  • The style statement no longer applies because it contains .dijitContentPane or .dijitBorderContainer in the selector.

/*before*/
.ctAppRoot .ct-application-footer.dijitContentPane {
    height: 80px;
}

/*after*/
.ctAppRoot .ct-application-footer {
    height: 80px;
}

Harmonization of attach-points for widgets

The naming of attach-points for widgets has been revised. As a result, all attach-points are available under the same name in all sub-layouts. In the mobile landscape layout (mobile_landscape), the dockingbarLeft has been renamed to dockingbarBottomLeft. You can update app.json files by search and replace. Without this adjustment, tools may not be displayed in the mobile landscape view.

Themes and theme-extensions

The naming of the manifest.json properties CSS-Themes and CSS-Themes-Extension was changed to cssThemes and cssThemesExtension. The old values are deprecated and should be replaced with the new ones. This is only relevant when you have custom bundles, that provide their own css, theme bundles or theme-extension bundles.

Discontinued Features

The following features are discontinued with this release:

  • The aceeditor bundle has been removed.

Deprecated Features

The following are deprecated and will be removed in a future release. Also note the additional information in the system requirements.

  • map.apps Manager and app configuration:

    • Live configuration is no longer being developed and will be removed in an upcoming release. Instead, use the app-editor to configure apps. You can already hide the live configuration for your users by setting the configuration option manager.config.editor.showLiveConfigButton to false.

    • Compatibility mode in map.apps Manager has been deprecated since version 4.6 and will be removed in version 4.15.

    • App and app template synchronization has been deprecated since version 4.8 and will be removed in version 4.15. Use domain-bundles instead.

    • The allowedWorkflows:["create"] configuration option in the editing bundle will be removed soon. Use allowedWorkflows:["create-features"] instead.

  • Bundles:

    • The js-beautify bundle will be removed in an upcoming release.

    • The app-uitest-support bundle will be removed in an upcoming release.

    • The omnisearch bundle is no longer developed. Use the search-ui bundle instead.

    • The resultcenter and selection-resultcenter bundles are no longer developed. Use the result-ui bundle instead.

    • The locateme-gpsgate bundle will be removed in map.apps 4.15.

  • Development:

    • Support for module.exports in JavaScript files will be removed soon. Use the ECMAScript keywords export or export default instead.

    • To simplify a future migration from AMD to another module system, JavaScript files should be written as ECMAScript modules only, if possible, and then transpiled.

    • Support for cancel in return values of store queries (QueryResult) will be removed soon. The goal is to simplify the store-api.Store interface. Please use a AbortController , described in Usage of an AsyncStore to cancel pending queries.

      ```js
      const aborter = new AbortController();
      store.query({name: "Test"}, { signal: aborter.signal })
          .then((resultItems)=>{
           ...
          }, (e)=>{
            if (e.name === "AbortError"){
                // aborted
            }
      })
      // trigger abort
      aborter.abort();
      ```
    • The class ct/mapping/store/MapServerLayerStore is replaced by a new class LayerStore in the agssearch bundle. The LayerStore class is stored with an ArcGIS FeatureLayer instance and is therefore consistent with the map content. The agssearch bundle now creates LayerStore instances by default in the AGSStoreFactory class and the AutoStoreRegistration and AGSStore configuration options. The old behavior can be restored during the transition phase with the legacyImplementation option.

    • The use of data-template-window and data-template-window-events in template files will not be supported in the future. Instead, make window definitions in manifest.json files.

    • The following classes will be removed in one of the next releases:

Deprecated class Alternative

ct/array

native JavaScript Funktionen

ct/async

apprt-core/async

ct/_when

apprt-core/when

ct/_compare

apprt-core/comparators

ct/mapping/store/MapServerLayerStore

AGSStoreFactory.createStore

ct/store/_RestStore

store-api/rest/BaseWriteableRestStore

ct/store/ComplexMemory

store-api/InMemoryStore

ct/store/ComplexQuery

store-api/ComplexQuery

ct/store/ComplexQueryEngine

store-api/utils.createComplexQueryEngine

ct/store/ComplexQueryToRQL

store-api/rest/RQLStore

ct/store/ComplexQueryToSolrQL

store-api/rest/ComplexQueryToSolrQL

ct/store/ComplexQueryToSQL

store-api/rest/ComplexQueryToSQL

ct/store/Filter.filterMetaData

store-api/utils.mergeMetadata

ct/store/RQLStore

store-api/rest/RQLStore

ct/store/SpatialQuery

store-api/SpatialQuery

ct/store/SQLStore

store-api/rest/SQLStore

ct/store/StoreUtil

store-api/utils

ct/ui/controls/mobile/Drawer

-

Known Limitations

MAPAPPS-5654

[Map] Zoom via mousewheel does not allow to zoom to the full max or min extent in some situations

MAPAPPS-6377

[Printing] Printing of line measurement not possible with PrintTask published from ArcMap

Dependencies

  • Esri ArcGIS API for JavaScript 4.24.7

  • ArcGIS Arcade 1.17

  • Moment.js 2.29.4

  • Vue.js 2.7.8

  • Vuetify.js 1.5.24

Changelog

4.14.3

Fixed Issues

MAPAPPS-6684

[Documentation] Incorrect cross-reference in map.apps documentation ("Filtering of references")

MAPAPPS-6602

[integration-map] Bundle depends on fixed version

MAPAPPS-6685

[Layout] Opening a window by toggle tool breaks layout

MAPAPPS-6680

[Layout] Sublayout templates for iOS Safari and Chrome are not selected correctly

MAPAPPS-6642

[TOC] Context menu is not fully visible in some situations when opened for the first time

4.14.2

Fixed Issues

MAPAPPS-6575

[Accessibility] Missing focus indicator in printing dialog

MAPAPPS-6629

[Accessibility] Poor screenreader support for drop down and update checker buttons in manager

MAPAPPS-6634

[Accessibility] Some content not well recognizable in high contrast mode

MAPAPPS-6550

[Accessibility] TOC expand/collapse button loses focus when toggling in screen reader mode

MAPAPPS-6612

[apprt-fetch] ct-identity token not send on early requests

MAPAPPS-6607

[Domain Bundles] Timing issue when loading basemaps via domain-system

MAPAPPS-6597

[Manager] Test bundles not assigned to map.apps product group

MAPAPPS-6599

[Manager] Update hints for certain bundles may not be displayed

MAPAPPS-6594

[result-ui] Autofocus opens keyboard on mobile devices

MAPAPPS-6606

[result-ui] FormattingInfo align center not working

MAPAPPS-6603

[v-tooltip] Missing z-index for vuetify-tooltips base element

4.14.1

New Features

MAPAPPS-6548

[Accessibility] Add tooltips in TOC

MAPAPPS-6547

[Accessibility] Improve layer options menu in TOC

MAPAPPS-6541

[Accessibility] Increase accessibility for keyboard navigation and screen reader in selection UI

MAPAPPS-6574

[LayerStore] Add support for Tile-Layers

MAPAPPS-6389

[TOC] Do not show icon with visibility hints as disabled icon

MAPAPPS-6540

[TOC] Initially expand the layer legend

Fixed Issues

MAPAPPS-6570

[apprt-binding] Model change on Mutable when bound to Vue model is not effective under certain condition

MAPAPPS-6563

[apprt-fetch] Unexpected proxy fallback on same site requests

MAPAPPS-6557

[apprt-tokens] No token looked up, when relative url is used inside apprt-request

MAPAPPS-6559

[apprt] Errors during bundle start are not logged

MAPAPPS-6572

[Coordinate Conversion] Coordinate search not working in some coordinate systems

MAPAPPS-6566

[jsregistry] Brace detection and comment removal broken by regular expression

MAPAPPS-6552

[Map] Browser window freezes when switching SRS with WMTS service

MAPAPPS-6564

[search-ui] Search-UI with main-app-menu is missaligned with default window configurations

MAPAPPS-6561

[search-ui] Special characters are not supported in searchLabel fields

4.14.0

New Features

MAPAPPS-6339

[Accessibility] Allow to set alt text for image in banner widget

MAPAPPS-6310

[Accessibility] Improve HTML element heading structure

MAPAPPS-6298

[Accessibility] Make login dialog accessible via screenreader

MAPAPPS-6299

[Accessibility] Make notifier information accessible via screenreader

MAPAPPS-6193

[Accessibility] Make Vuetify select element readable and useable in a screenreader

MAPAPPS-6322

[Accessibility] Remove focus from empty tool container in toolbar in window widget

MAPAPPS-6317

[Accessibility] Use checkboxes instead of buttons in TOC for proper recognition in screen readers

MAPAPPS-6507

[Accessibility] v-select/v-menu/v-list: backport aria improvements from Vuetify 2.x

MAPAPPS-6418

[AGS Search] Set default search attribute/ title attribute for search-ui

MAPAPPS-6043

[App Editor] Exclude bundles from autocompletion in allowedBundles based on bundle metadata

MAPAPPS-6427

[App Editor] Introduce mechanism to deprecate bundles and show hints in editor

MAPAPPS-6415

[apprt-core] Add utility to encode/decode base64 strings

MAPAPPS-6417

[apprt-core] Locale support conversion into Intl.Locale and access to locale string

MAPAPPS-6399

[apprt-dom] Add getMarginBox, setMarginBox and getMarginSize helpers

MAPAPPS-6357

[apprt-esri-init] Strip https?:// prefix from proxy rule if configured

MAPAPPS-6336

[ct-proxy] Support configuration of additional HTTP headers to forward to proxied services

MAPAPPS-6510

[Documentation] Add reference to bundle "parametersearch"

MAPAPPS-6435

[Documentation] Describe visibilityMode exclusive

MAPAPPS-6386

[Documentation] Typo in measurement-3d constraints

MAPAPPS-6445

[jsregistry] Add 'jsregistry.sourcemaps.enabled' config option to prevent delivering of '.js.map' files

MAPAPPS-6428

[Manager] Hide Live Configuration by configuration property

MAPAPPS-6487

[map-actions] Execute actions in order and sequentially by default

MAPAPPS-6297

[map-actions] Highlight and zoom to actions should react to multiple results

MAPAPPS-6143

[Map] Allow to disable sandbox flag on WMS layers

MAPAPPS-6440

[maven-plugin] Add includePattern option to deployApps goal

MAPAPPS-6367

[Native Export] Add disableProxySupport:true to config.js

MAPAPPS-6488

[Parameter Search] Add config option that only first result is used

MAPAPPS-6372

[Popups] Allow promise as return value in getTypes() method of popups.ActionFactory

MAPAPPS-6489

[Result Center] Action to create PDF report

MAPAPPS-6373

[Result Center] Add results to existing result set

MAPAPPS-6533

[Result Center] Configure highlight colors

MAPAPPS-5843

[Result Center] Do not show store selection pane when only results from one store are shown

MAPAPPS-5679

[Result Center] Ensure that popup is not hidden by result center

MAPAPPS-6196

[Result Center] Export data from result center

MAPAPPS-6455

[Result Center] Filter results of one store

MAPAPPS-6469

[Result Center] Hide empty result topics

MAPAPPS-6485

[Result Center] Highlight object when hovering table row

MAPAPPS-6470

[Result Center] Provide API to show results

MAPAPPS-6506

[Result Center] Remove results from existing result set

MAPAPPS-6524

[Result Center] Remove single result

MAPAPPS-6503

[Result Center] Show or hide actions based on rules

MAPAPPS-6197

[Result Center] Show result items of spatial selection in map

MAPAPPS-6195

[Result Center] Show results of spatial selection

MAPAPPS-6468

[Result Center] Zoom to selected items

MAPAPPS-6477

[Result Center] Zoom to single result

MAPAPPS-6381

[rollup-build] Emit error when importing a JavaScript module from a bundle that is not listed as a dependency

MAPAPPS-6451

[Search UI] Add screen reader support for result list

MAPAPPS-6332

[Search UI] Add tooltip to delete button

MAPAPPS-6539

[Search UI] Configurable Typing Delay

MAPAPPS-6421

[System] Update ArcGIS API for JavaScript to version 4.24

MAPAPPS-6400

Allow to configure log level for apps globally

MAPAPPS-6360

Provide license-folder as separate artefact

MAPAPPS-6358

Support sub path in proxy.use.rules to control more explicitly for which services the proxy is required

Fixed Issues

MAPAPPS-6392

[AGS Search] Configuring filterOptions has no effect

MAPAPPS-6432

[AGS Search] popupEnabled on AGSStore triggers default popup on search and spatial selection

MAPAPPS-6509

[apprt-core/Mutable] A watch handler should not be informed about pending change events

MAPAPPS-6446

[apprt-esri-init] Error code 'identity-manager:unknown-resource' thrown instead of real request error

MAPAPPS-6537

[apprt-request] Endless loop with certain URLs when falling back from CORS to proxy servlet

MAPAPPS-6362

[AppsOverview] Switching to POST leads to failed requests

MAPAPPS-6342

[ct-proxy] X-Forwarded-For Header has missing space after comma

MAPAPPS-6457

[Documentation] Incomplete documentation for implementing a custom ToolRuleProcessor

MAPAPPS-6536

[Domain Bundles] Timing issue when registering AGSStore via domain-system

MAPAPPS-6416

[Integration API] Map manipulation methods not available on app start

MAPAPPS-6516

[Layout] Sublayout templates for iPad Safari and Chrome are not selected correctly

MAPAPPS-6312

[Layout] UI can be broken by tabbing

MAPAPPS-6341

[Manager] Obsolete $ in bundle delete dialog

MAPAPPS-6492

[Map] ID of basemap layer is interpreted as well known basemap name

MAPAPPS-6520

[Map] Inconsistent removal of blocked layers between different browsers

MAPAPPS-6353

[Map] WMS GetFeatureInfo not routed over /roxy

MAPAPPS-6347

[Measurement] Copy to clipboard button has no tool tip

MAPAPPS-6331

[Measurement] Tools not working in map views other than WebMercator or WGS84 based

MAPAPPS-6504

[OAuth] Cross Domain Login not possible

MAPAPPS-6434

[Parameter Search] Esri Locator items not correctly displayed

MAPAPPS-6543

[Reporting] Static report fails for non MapServerLayerStores

MAPAPPS-6412

[Result Center] No update if values in store change and fireDataChanged is called

MAPAPPS-6229

[Search UI] Wrong mobile result layout when switching from portrait to landscape

MAPAPPS-6398

[Search] SearchServiceImpl does not ensure that event service is available

MAPAPPS-6505

[TOC] supportsSublayerVisibility not handled

MAPAPPS-6376

[TOC] Tooltip not correctly read from screen reader

MAPAPPS-6329

Compressed build introduces unsupported javascript constructs

MAPAPPS-6361

Deadlock on bundle upload

MAPAPPS-6420

Languages with country codes like de-CH are not supported correctly

MAPAPPS-6355

LayerStore created for MapServer sublayer does not honor definition expression

MAPAPPS-6289

Layout issues with tool tips in embedded integration

MAPAPPS-6363

Whole app does not start if one bundle fails to start