Release Notes 4.14

What’s New

Neues Result Center

Mit dieser Version wird eine neue Tabellen-Komponente eingeführt, die das alte Result Center ersetzt. Sowohl die Benutzeroberfläche als auch die darunter liegende API wurden komplett überarbeitet und als neue Bundles (result-ui und result-api) bereitgestellt.

Mit dem neuen Result Center können Ergebnisse aus verschiedenen Quellen, wie z.B. räumliche Selektionen, in einer modernisierten, hoch konfigurierbaren Benutzeroberfläche angezeigt werden. Daten können auch programmatisch hinzugefügt werden, was eine einfache Integration mit anderen Abfrage- oder Auswahloperationen wie zum Beispiel dem Query Builder ermöglicht. Sogenannte Actions können verwendet werden, um mit einzelnen oder mehreren Einträgen in der Tabelle zu interagieren. Mehrere Aktionen für Standardanwendungsfälle wie "Zoom to" oder "CSV Export" sind bereits verfügbar. Mit einer API ist es möglich, Aktionen programmatisch hinzuzufügen.

result ui

Die Bundles resultcenter und selection-resultcenter sind weiterhin verfügbar, wir empfehlen aber die neuen Bundles zu verwenden.

Verbesserungen der Accessibility (Barrierearmut)

Die Zugänglichkeit der UI-Elemente wurde in mehreren Punkten verbessert. Dazu gehören bessere Möglichkeiten zur Tastaturnavigation und die Zugänglichkeit für Screenreader.

Verbesserungen im App-Editor

Bundles werden jetzt im App-Editor im map.apps Manager auf Grundlage ihrer Metadaten in der Vorschlagliste angezeigt. Zusätzlich können Bundles über Metadaten als veraltet gekennzeichnet werden und werden im Editor entsprechend markiert. Damit können Bundle-Entwickler entscheiden, wie ihre Bundles im App-Editor behandelt werden.

Log-Level für Apps

Es ist nun möglich, die Bundle Log-Level für die Browser-Konsole global zu konfigurieren. Diese Konfiguration kann pro App überschrieben werden.

Neuerungen für Entwickler

Neues request Bundle

Das Bundle apprt-fetch wurde eingeführt, um das alte apprt-request Bundle in kommenden Versionen zu ersetzen. Das neue Bundle verwendet die native Browser Fetch API anstelle von Dojo/request.

Typescript

Mehrere Bundles wurden nach Typescript migriert, was zu einer besseren API-Dokumentation und Typdefinitionen für Bundle-Entwickler führt.

Rollup

Alle Bundles werden nun mit Rollup erstellt, was zu spezifischeren Einstiegspunkten für Bundles führt. Beachten Sie, dass nicht mehr alle möglichen Dateien importiert werden können. Dies führt zu klareren, spezifischeren und stabileren Schnittstellen.

Karten-Aktionen

Die Kartenaktionen für "highlight" und "zoom" können nun mehrere Geometrien verarbeiten. Es ist zudem möglich, eine Reihenfolge zu definieren, in der verschiedene Kartenaktionen ausgeführt werden.

Automatische i18n-Importe

Es ist nicht mehr erforderlich, dojo/i18n!nls/bundle in einem Bundle zu importieren. Stattdessen kann i18n: ["bundle"] zur manifest.json Datei hinzugefügt werden.

Sourcemaps

map.apps sendet nun sourcemaps als .js.map-Dateien an den Client. Dies kann über die Konfiguration deaktiviert werden.

Weitere neue Funktionen und Verbesserungen

  • Die von map.apps als technische Basis genutzte ArcGIS API for JavaScript wird mit diesem Release auf die Version 4.24 aktualisiert. Dies führt zu zahlreichen Verbesserungen und Fehlerbehebungen in der Basistechnologie.

  • Eine Suche die über einen URL-Parameter gestartet wurde, kann nun auch mehrere Ergebnisse anzeigen. Dieses Verhalten muss per Konfiguration angeschaltet werden.

  • Sie können nun eine Verzögerung im search-ui Bundle konfigurieren nach der eine Suche gestartet wird, um zu viele Serveranfragen zu vermeiden.

  • Für TileLayer, die eine Query-Schnittstelle anbieten, können nun auch Stores (z.B. für Suche oder Selektion) registriert werden.

  • Über eine neue Konfigurationsoption autoExpandLegend kann die Legende im TOC automatisch ausgeklappt werden.

Eine komplette Auflistung aller Änderungen finden Sie im Changelog.

Update-Hinweise

Falls Sie bei dem Update mehrere Versionen überspringen, befolgen Sie bitte auch alle Update-Hinweise der dazwischenliegenden Versionen.

Aktualisierte Standard-App

Die Vorlage für die Standard-App wurde aktualisiert. Sofern Sie keine eigenen Anpassungen vorgenommen haben, entfernen Sie die Datei default-app-4.zip aus dem Arbeitsverzeichnis. Der Pfad zu diesem Verzeichnis ist im Parameter data.directory.location in der Datei %TOMCAT%\webapps\mapapps\WEBINF\classes\custom-application.properties festgelegt.

Editor Widget

Mit Upgrade der Esri ArcGIS API for JavaScript wird mit dem editing Bundle in map.apps ein komplett überarbeitetes Editing Widget bereit gestellt. Im Zuge dessen wird die Konfigurationsoption allowedWorkflows:["create"] abgekündigt. Stattdessen sollte allowedWorkflows:["create-features"] benutzt werden.

DGrid

DGrid war von einem Design-Fehler in seiner API betroffen, der als Angriffsvektor für JavaScript-Injection genutzt werden konnte. Die genutzte Bibliothek wurde auf Version 1.3.3 aktualisiert, die einen Fix für dieses Problem enthält.

Dieses Update bringt eine wichtige Änderung in Bezug auf benutzerdefinierte Formatierer mit sich: Während Werte die von einem Formatierer zurückgegeben wurden, bisher immer als HTML interpretiert wurden, werden die Rückgabewerte nun standardmäßig angemessen escaped. Nur wenn explizit { html: "…​string…​" } zurückgegeben wird, wird der Wert als HTML interpretiert. Weitere Details stehen in diesem 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>`
    }
}

Beachten Sie, dass map.apps-Installationen gegen diese Sicherheitslücke sicher sind, wenn Sie die Standardeinstellungen verwenden: Die Content-Security-Policy-Header verhindern die Ausführung von Inline-Skripten (unsafe-inline).

seasons-template

Entfernen von Dijit Layout Containern

Das Dijit BorderContainer-/ContentPane-basierte Layout wurde durch ein modernes CSS-Grid ersetzt. Dadurch ergeben sich deutlich mehr Möglichkeiten, das Layout per CSS (auch nachträglich per app.css) anzupassen ohne das zugrundeliegende HTML ändern zu müssen.

Durch die oben beschriebene Änderung fallen auch die CSS-Klassen .dijitContentPane und dijitBorderContainer weg. Wenn Sie eine app.css verwenden, prüfen Sie, ob es entsprechende Style-Anweisungen gibt. Hierbei sind zwei Fälle zu unterscheiden:

  • Die Style-Anweisung ist nicht mehr notwendig (paddings von .dijitContentPane und .dijitBorderContainer).

  • Die Style-Anweisung greift nicht mehr, weil sie .dijitContentPane oder .dijitBorderContainer im Selector enthält.

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

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

Harmonisierung der Attach-Points für Widgets

Die Benennung der Einhängepunkte (attach-points) für Widgets wurde überarbeitet. Dadurch stehen alle attach-points unter gleichem Namen in allen Sublayouts zur Verfügung. Im mobilen Querformat-Layout (mobile_landscape) wurde die dockingbarLeft in dockingbarBottomLeft umbenannt. app.json Dateien können Sie per Suchen und Ersetzen anpassen. Ohne diese Anpassung werden Werkzeuge in der mobilen Querformat-Ansicht ggf. nicht mehr dargestellt.

Themes und Theme-Extensions

Die manifest.json Eigenschaften CSS-Themes und CSS-Themes-Extension wurde in cssThemes und cssThemesExtension umbenannt. Die alten Werte sind abgekündigt und werden in einem der nächsten Releases nicht mehr unterstützt. Daher sind sie die neuen Werte zu ersetzen. Dies ist nur relevant, wenn Sie benutzerdefinierte Bundles haben, die ihr eigenes Css, Theme-Bundles oder Theme-Extension-Bundles bereitstellen.

Ausgelaufene Unterstützung

Die Unterstützung für die folgenden Funktionen ist mit diesem Release ausgelaufen:

  • Das Bundle aceeditor wurde entfernt.

Abkündigungen

Für folgende Features wird die Weiterentwicklung eingestellt und das Ende der Unterstützung für die Zukunft angekündigt. Beachten Sie außerdem die Hinweise in den Systemanforderungen.

  • map.apps Manager und App-Konfiguration:

    • Die Live-Konfiguration wird nicht mehr weiterentwickelt und wird in einer der kommenden Versionen entfernt. Verwenden Sie stattdessen den App-Editor zur Konfiguration von Apps. Sie können die Live-Konfiguration bereits jetzt für Ihre Nutzer ausblenden, indem Sie die Konfigurations-Option manager.config.editor.showLiveConfigButton auf false setzen.

    • Der Kompatibilitätsmodus im map.apps Manager wurde seit Version 4.6 abgekündigt und wird in Version 4.15 entfernt.

    • Die Synchronisierung von Apps und App-Vorlagen wurde seit Version 4.8 abgekündigt und wird in Version 4.15 entfernt. Verwenden Sie stattdessen Domain-Bundles.

    • Die Konfigurationsoption allowedWorkflows:["create"] im Bundle editing wird demnächst entfernt. Verwenden Sie stattdessen allowedWorkflows:["create-features"].

  • Bundles:

    • Das Bundle js-beautify wird in einem der kommenden Releases entfernt.

    • Das Bundle app-uitest-support wird in einem der kommenden Releases entfernt.

    • Das Bundle omnisearch wird nicht mehr weiterentwickelt. Verwenden Sie stattdessen das Bundle search-ui.

    • Die Bundles resultcenter und selection-resultcenter werden nicht mehr weiterentwickelt. Verwenden Sie stattdessen das Bundle result-ui.

    • Das Bundle locateme-gpsgate wird in map.apps 4.15 entfernt.

  • Entwicklung:

    • Die Unterstützung von module.exports in JavaScript-Dateien wird demnächst entfernt. Benutzen Sie stattdessen die ECMAScript Keywords export bzw. export default.

    • Um eine zukünftige Migration von AMD zu einem anderem Modulsystem zu erleichtern sollten JavaScript-Dateien nach Möglichkeit nur noch als ECMAScript Module verfasst und anschließend transpiliert werden.

    • Die Unterstützung von cancel in der Rückgabe der Abfrageergebnisse (QueryResult) eines Stores wird demnächst entfernt. Ziel ist es die Komplexität der store-api.Store Api zur reduzieren. Bitte benutzen Sie stattdessen einen AbortController , wie unter Nutzung eines AsyncStore beschrieben.

      ```js
      const aborter = new AbortController();
      store.query({name: "Test"}, { signal: aborter.signal })
          .then((resultItems)=>{
           ...
          }, (e)=>{
            if (e.name === "AbortError"){
                // aborted
            }
      })
      // trigger abort
      aborter.abort();
      ```
    • Die Klasse ct/mapping/store/MapServerLayerStore wird durch eine neue Klasse LayerStore im agssearch-Bundle ersetzt. Die Klasse LayerStore wird mit einer ArcGIS FeatureLayer Instanz hinterlegt und ist daher konsistent mit dem Inhalt der Karte. Das agssearch-Bundle erzeugt nun standardmäßig LayerStore-Instanzen in der Klasse AGSStoreFactory und den Konfigurationsoptionen AutoStoreRegistration und AGSStore. Das alte Verhalten kann während der Übergangsphase mit der Option legacyImplementation wiederhergestellt werden.

    • Die Verwendung von data-template-window und data-template-window-events in template files wird zukünftig nicht mehr unterstützt. Nehmen Sie stattdessen Fenster-Definitionen in manifest.json Dateien vor.

    • Die folgenden Klassen werden in einem der nächsten Releases entfernt:

Abgekündigte Klasse 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

-

Bekannte Einschränkungen

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

Abhängigkeiten

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