Release Notes 4.12

What’s New

Suche

Mit dieser Version wird eine neue, modernisierte Suchfunktion eingeführt. Sowohl die Bedienoberfläche als auch die dahinter arbeitende Such-API sind komplett überarbeitet und werden als neue Bundles bereitgestellt (search-ui und search-api).

Mit der neuen Suche ist es möglich, mehrere Themen gleichzeitig zu durchsuchen, ohne vorher ein Thema festlegen zu müssen. Die Ergebnisse werden nach Themen gruppiert angezeigt. Die neue Oberfläche ist zudem besser auf mobilen Geräten nutzbar, da mehr Platz für die Ergebnisdarstellung genutzt wird und Ergebnisse mehrzeilig angezeigt werden können.

search ui

Das Bundle omnisearch steht weiterhin zur Verfügung, wir empfehlen jedoch, die neue Suche zu verwenden.

App-Editor

Die ehemalige "Manuelle Konfiguration" wird mit dieser Version vom komplett modernisierten, neuen "App-Editor" abgelöst. Der App-Editor erleichtert die Konfiguration von Apps durch Vorschlaglisten, Validierungen und Hinweise. Fehlerhafte Konfigurationen können so leichter vermieden werden. Außerdem kann zu jedem Bundle nun direkt zur passenden Dokumentation gewechselt werden. Die Funktionen "Bundles" und "Live-Konfiguration" können ab jetzt aus dem App-Editor heraus aufgerufen werden.

app editor de

Domain-Bundles effektiver nutzen

Bei der Nutzung von Domain-Bundles kann nun definiert werden, ob die dadurch zu einer App hinzugefügten Kartenlayer oberhalb oder unterhalb der in der App definierten Layer eingefügt werden. Zudem können in einer App Layerkonfigurationen überschrieben werden. Dadurch wird es zum Beispiel möglich, ein fachliches Thema effizient über ein Domain-Bundle zu vielen Apps hinzuzufügen und die dadurch hinzugefügten Kartenlayer aber nur in bestimmten Fach-Apps beim Start der App zu aktivieren und in anderen als nicht initial sichtbar zu ergänzen.

Besserer Support für OGC-Dienste

Die Unterstützung von OGC Diensten wird mit diesem Release für die folgenden zwei Dienste-Typen verbessert.

OGC API - Features - Part 2

map.apps unterstützt jetzt OGC API - Features - Part 2, wodurch die Nutzung zusätzlicher Raumbezugssysteme ermöglicht wird. Es können nun alle Layer in WGS84 und WebMercator sowie allen anderen vom Dienst unterstützen räumlichen Bezugssystemen genutzt werden.

WFS Layer

Durch einen neuen Layer-Typen ist nun die Nutzung von OGC Web Feature Services (WFS) möglich. Der genutzte Dienst muss in der Version WFS 2.0.0 vorliegen und das Ausgabeformat GeoJSON unterstützen.

Verbesserung der Karteninhaltsteuerung

Beim Aktivieren einer Karte in der Karteninhaltsteuerung wird geprüft, ob die übergeordneten Elemente ebenfalls sichtbar geschaltet sind (z.B. Gruppen-Layer). Falls dies nicht der Fall ist, werden sie automatisch aktiviert, damit die eingeschaltete Karte sofort sichtbar ist.

Neuerungen für eigene Entwicklungen

TypeScript

Mit dieser Version werden erstmals in TypeScript geschriebene Bundles ausgeliefert. Unser mittelfristiges Ziel ist die Umstellung der kompletten JavaScript Codebasis auf TypeScript.

Der Einsatz von TypeScript erfreut sich großer Beliebtheit . Für uns stehen die folgenden Gründe für die Nutzung im Vordergrund:

  • Die Typsicherheit reduziert die Wahrscheinlichkeit von Fehlern im Code.

  • Schnittstellen zur Erweiterung von map.apps (z.B. map-actions oder Stores) können explizit gemacht werden. Sie können so direkt beim Programmieren sehen, ob eine Schnittstelle richtig benutzt wird.

  • Die Programmierung gegen diese Schnittstellen wird dank einer Autovervollständigung produktiver und weniger fehleranfällig.

  • Private Implementierungsdetails können besser versteckt oder als solche gekennzeichnet werden. Dies macht die Entwicklung gegen map.apps einfacher und übersichtlicher. Außerdem werden können so Fehler vermieden werden, die bei Updates auf neuere Version auftreten könnten, weil gegen interne Schnittstellen programmiert wurde.

  • Code-Refactoring wird einfacher, da die IDE (z.B. Visual Studio Code) den Code "versteht".

  • Die von map.apps als technische Basis genutzte ArcGIS API for JavaScript ist ebenfalls komplett in TypeScript geschrieben.

Die bereits vorhandenen map.apps Typings können direkt im map.apps 4 Developers Projekt genutzt werden. Ein Blog-Artikel im Developer Network wird die Nutzung und ihre Vorteile demnächst im Detail erläutern.

Standard 'Content Security Policy' Header

Zur Erhöhung der Sicherheit sendet map.apps verschiedene Sicherheitsheader, u.a. den Content-Security-Policy Header. Zur Vermeidung von Cross-Site-Scripting wird insbesondere die Direktive script-src 'unsafe-inline' vermieden. Dies hat zur Folge, dass die direkte Nutzung von HTML <script>-Blöcken innerhalb von map.apps nicht mehr erlaubt ist.

Um die Sicherheitsheader, die map.apps mitsendet, anzupassen, lesen Sie den Abschnitt Sicherheitseinstellungen.

Neue Store-API

In map.apps werden "Stores" als Datenquellen für Funktionen wie zum Beispiel die Suche oder die räumliche Auswahl verwendet. Diese basierten bislang auf der Store-Spezifikation des Dojo Toolkits. In diesem Release werden die unterstützten Store-Schnittstellen in das neue Bundle store-api umgezogen und spezifiziert. Eine Abhängigkeit zum Dojo Toolkit besteht somit nicht mehr. Eine ausführliche Dokumentation finden Sie in der Bundle-Dokumentation .

Neues Bundle 'apprt-dom'

Das neue Bundle apprt-dom stellt Funktionen bereit mit denen Dojo Hilfsfunktionen ersetzt werden können. Wir empfehlen, bei eigenen Entwicklungen die Funktionen aus dem neuen Bundle anstelle von Dojo Funktionen zu nutzen. Eine Gegenüberstellung der alten und neuen Funktionen ist in der Bundle-Dokumentation aufgelistet.

AbortSignal

Das Bundle apprt-request unterstützt nun AbortSignal . Eine Anleitung zur Nutzung finden Sie in der Bundle-Dokumentation

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.20 aktualisiert. Dies führt zu zahlreichen Verbesserungen und Fehlerbehebungen in der Basistechnologie.

  • Die Editier-Funktionalität bietet nun ein einfaches Snapping (Fangen) auf bestehenden Stützpunkten und Kanten an.

  • Es kann nun ein timeExtent konfiguriert werden. Eine 2D- oder 3D-Ansicht zeigt dann nur die Objekte aus einem Layer an, die in den entsprechenden Zeitraum fallen.

  • Das Voroptimieren einer App kann nun über das map.apps Maven Plugin beim Upload einer App angestoßen werden.

  • Der zoomto Map Action kann nun ein expand Faktor mitgegeben werden, so dass ein größerer Kartenbereich um das Objekt herum dargestellt wird, wenn darauf gezoomt wird.

  • Es kann nun konfiguriert werden, ob Dateianhänge im Default Popup als Liste oder Vorschau angezeigt werden.

  • Die Lade-Anzeige in der Karte wird nun nicht mehr bei clientseitigen Aktionen wie zum Beispiel Sketching oder Editing angezeigt. Sie wird dadurch insgesamt seltener angezeigt.

Eine komplette Auflistung aller Änderungen finden Sie im Changelog.

Update-Hinweise

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.

Domain-Bundles

Durch Verbesserungen am Domain-Bundle-System kommt es zu einer Verhaltensänderung. Zuvor wurden alle beim App-Start geladenen Themenkarten aus Domain-Bundles in ihrer Ladereihenfolge zur Karte hinzugefügt. Dies führte dazu, dass bei mehreren Domain-Bundles die zuerst geladenen Themenkarten unter den später geladenen lagen. Ab dieser Version wird dieses Verhalten umgekehrt, sodass zuerst geladene Themenkarten über später geladenen liegen.

Dieses neue Verhalten kann durch Änderungen der Option domainBundleOrder beeinflusst werden. Siehe dazu Domain-Bundles.

Erhöhung der maximalen URL-Länge für GET Anfragen (statt POST)

Die maximale Länge von URLs die per GET vom map.apps Server abgefragt werden, wird mit diesem Release von 2048 auf 3072 erhöht. Dadurch können auch in umfangreicheren Apps, die viele Bundles beinhalten, die Bundle-Dateien per GET statt POST abgefragt werden. Dies ist ein Vorteil, da nur GET Anfragen vom Browser gecacht werden können und somit die Performance beim erneuten Aufruf der App gesteigert wird.

Stellen Sie sicher, dass es auf Ihrem Server keine Beschränkungen gibt, die die Anfrage von längeren GET Anfragen unterbinden. Alternativ können Sie die Länge ab der von GET auf POST gewechselt wird, in der Property client.config.requestMaxUrlLength in der Datei application.properties verändern.

Import von map.apps Klassen

Im Zuge von Code-Modernisierungen wird der Build-Prozess für Bundles sukzessive auf rollup.js umgestellt. Dadurch können interne, nicht öffentliche Klassen von map.apps nicht mehr in eigenen Implementierungen importiert werden. Verwenden Sie stattdessen offizielle APIs von map.apps oder nutzen Sie map.apps Klassen als Vorlage für eigene Implementierungen. Ihr Feedback zu fehlenden Funktionen, APIs oder Konfigurations-Parametern nehmen wir wie immer gerne entgegen.

Import von ArcGIS API for JavaScript Klassen

Die ArcGIS API for JavaScript ist die größte Dependency in map.apps (im Browser), was die Anzahl der Module und auch deren kombinierte Größe angeht. Die API wurde bislang so in map.apps integriert, dass auch private, undokumentierte Module zur Laufzeit importiert werden können. Mit diesem Release wird die Anzahl der JavaScript-Module in der API auf das Notwendige minimiert, indem nur noch dokumentierte Module importiert werden. Die Anzahl der JavaScript-Module wurde dadurch um mehr als 55% reduziert. Dies kann zum Einen zu einem Performance-Gewinn führen und verhindert zum Anderen, dass bei eigenen Entwicklungen versehentlich gegen interne Schnittstellen der API programmiert wird. Sollte es nach einem Update auf diese Version zu Laufzeitfehlern in Ihren eigenen Entwicklungen kommen, prüfen Sie bitte, ob Sie interne Module der ArcGIS API for JavaScript verwenden.

Script-Blöcke in angepassten index.html Dateien

Die direkte Nutzung von HTML <script>-Blöcken innerhalb von map.apps ist nicht mehr erlaubt.

Wenn Sie eine angepasste index.html Datei für eine App verwenden, verwenden Sie in dieser nur noch einen einzigen <script>-Block und markieren Sie ihn wie folgt:

Beispiel eines markierten <script> Blocks
<script nonce="@@CSP_NONCE@@">
    $apprt.startApp(...)
</script>

Alternativ können Sie Skripte in JavaScript Dateien auslagern.

Umzug von Hilfsklassen aus dem Bundle ct

Im Rahmen der Einführung des neuen Bundles store-api sind die folgenden Hilfsklassen aus dem Bundle ct in das neue Bundle store-api umgezogen:

Alt Neu

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

Ändern Sie bei eigenen Entwicklungen Ihre Imports zum Beispiel wie folgt:

// Deprecated:
import RQLStore from "ct/store/RQLStore";

// New:
import { RQLStore } from "store-api/rest/RQLStore";

Nicht immer ist eine 1:1 Ersetzung möglich oder sinnvoll. Für weitere Informationen zu den einzelnen Klassen und Ihrer Nutzung, prüfen Sie die API-Dokumentation .

Veränderte Antwort von apprt-request

Das Bundle apprt-request liefert apprt-core/CancelablePromise Objekte und nicht mehr dojo/promise/Promise Objekte zurück. Diese Anpassung hat zur Folge, dass die Methoden dojoPromise.isFulfilled(), dojoPromise.isResolved(), dojoPromise.isRejected(), dojoPromise.isCanceled() nicht mehr zur Verfügung stehen. Verwenden Sie als Alternative apprt-core/Promise . Zu Testzwecken kann diese Änderung über die Konfigurationsoption client.config.requestReturnDojoDeferred deaktiviert werden.

Ausgelaufene Unterstützung

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

  • Die Abhängigkeiten für das SampleProjRemote der Linie 3 wurden aus dem m2-repository des Rollout entfernt.

  • Ein eigenes Styling der Scrollbars wurde entfernt. Es werden nun die Standarddarstellungen des jeweiligen Browsers verwendet. In angepassten Layouts kann weiterhin eine individuelle Anpassung von Scrollbars erfolgen.

  • Durch Änderungen in apprt-request stehen die Methoden dojoPromise.isFulfilled(), dojoPromise.isResolved(), dojoPromise.isRejected(), dojoPromise.isCanceled() nicht mehr zur Verfügung.

Abhängigkeiten

Linie 4 Bundles

  • Esri ArcGIS API for JavaScript 4.20.2

  • ArcGIS Arcade 1.13

  • core-js 3.8.1

  • Dojo 1.16.4

  • dgrid 1.2.1

  • dstore 1.1.2

  • Moment.js 2.29.1

  • Vue.js 2.6.14

  • Vuetify.js 1.5.24

Linie 3 Bundles

  • Esri ArcGIS API for JavaScript 3.25

  • Dojo 1.13.0

  • dgrid 0.3.17

  • xstyle 0.3.2

  • put-selector 0.3.6

  • dstore 1.1.2

  • Moment.js 2.22.1

Changelog

4.12.3

Line 4 Bundles (4.12.3)

Fixed Security Issues

MAPAPPS-6177

Update to Log4j 2.16.0

4.12.2

Line 4 Bundles (4.12.2)

Fixed Security Issues

MAPAPPS-6173

Critical log4j CVE (CVE-2021-44228)

Fixed Issues

MAPAPPS-6170

[Map] valueExpression cannot be used for layer renderer

MAPAPPS-6174

Workers are blocked in Safari browsers (child-src now added to default csp headers)

4.12.1

Line 4 Bundles (4.12.1)

New Features

MAPAPPS-6092

Allow to configure database connection timeout

MAPAPPS-6053

[app-mgmt-service] Send Last-Modified header to allow conditional caching of app resources

Fixed Issues

MAPAPPS-6077

CSP header not added to /manager sites in tomcat

MAPAPPS-6095

Login dialog sometimes remains visible although a login was successful

MAPAPPS-6073

Splashscreen in exported standalone app differs from default map.apps

MAPAPPS-6102

[apprt] Optional dependencies with disabled autostart should not be started

MAPAPPS-6091

[Editing] No snapping on feature layers which are part of a group layer

MAPAPPS-6065

[Layout] ct-main-app-menu layout dependent on id

MAPAPPS-6107

[Layout] ctToolProcessing css class not removed

MAPAPPS-6101

[Legend] Request for secured ArcGIS Server WMS fails

MAPAPPS-6094

[Manager] BundleUpdateChecker not displayed

MAPAPPS-6087

[Map] WMS Sublayers cannot be reconfigured

MAPAPPS-5712

[Popups] Domains not applied for popup defined on store when opened from result center

MAPAPPS-6112

[Result Center] Typo in fireDataChanged helper

MAPAPPS-6093

[selection-resultcenter] ID property of MemoryStore is not filled

MAPAPPS-6052

[store-api] ComplexQuery.encode does corrupt $not expression

4.12.0

Line 4 Bundles (4.12.0)

Fixed Security Issues

MAPAPPS-6015

Clickjacking prevention issue

MAPAPPS-6029

[MSSQL] Security issue with app starts

MAPAPPS-5983

[Reporting] Jasper exceptions are exposed unfiltered in the client

New Features

MAPAPPS-5993

[AGS Search] Disable notification about metadata fetching errors by default

MAPAPPS-5918

[App Editor] Add link to bundle documentation

MAPAPPS-6027

[App Editor] Add sub schema for map-init bundle config validation

MAPAPPS-6028

[App Editor] Automatically show list of available bundles when writing in allowedBundles array

MAPAPPS-5916

[App Editor] Check if allowed bundles are available in registry

MAPAPPS-6023

[App Editor] Detect duplicate bundles listed in allowedBundles

MAPAPPS-6017

[App Editor] Make save button a primary button in app editor only when file is changed

MAPAPPS-5923

[App Editor] Optimize usage of available space in app editor

MAPAPPS-6009

[App Editor] Prevent user from accidentally closing browser tab while app editor is opened

MAPAPPS-5885

[apprt-core] Add apprt-core/assign helper to replace usage of dojo/_base/lang#mixin

MAPAPPS-5871

[apprt-core] Add apprt-core/url-utils helper to replace usage of dojo/io-query

MAPAPPS-5956

[apprt-core] Add support for Promise.allSettled and Promise.any to apprt-core/Promise

MAPAPPS-5970

[apprt-core] Move 'ct/_string.stringPatternToRegExp' to 'apprt-core/string-pattern'

MAPAPPS-5974

[apprt-core] Provide 'equal' helper function in apprt-core as replacement for ct/_equal

MAPAPPS-5874

[apprt-dom] Introduce apprt-dom bundle

MAPAPPS-5958

[apprt-polyfill] Upgrade to apprt-polyfill 1.0.1 to support latest version for older browsers

MAPAPPS-5973

[apprt-request] Change default value for url length to 3072, allow configuration via application.properties

MAPAPPS-5950

[apprt-request] Return Promises (apprt-core/CancelablePromise) instances instead of dojo/Deferreds

MAPAPPS-5949

[apprt-request] Support AbortSignal as query option

MAPAPPS-5523

[Domain Bundles] Allow to overwrite layer properties in single apps

MAPAPPS-5895

[Domain Bundles] Configure if domain bundle layers are added on top or below app layers

MAPAPPS-5919

[Editor] Allow to enable snapping

MAPAPPS-5994

[esri] Migrate imports from esri/tasks to esri/rest

MAPAPPS-5922

[jsregistry] Do not autoinclude "main" files in layer.js

MAPAPPS-5915

[jsregistry] Ensure recursive templatestrings are recognized correctly

MAPAPPS-5924

[jsregistry] Use same location for root/packages.json and root/bundles.json

MAPAPPS-5946

[Manager] Move "bundles" button to app editor dialog

MAPAPPS-5938

[Manager] Move "live configuration" button to app editor dialog

MAPAPPS-5867

[Manager] Replace ACE Editor with Monaco editor

MAPAPPS-5853

[map actions] Allow to add expand to zoomto action

MAPAPPS-5985

[Map] Do not show progress indicator if graphics are drawn on the map (selection, redlining)

MAPAPPS-5914

[Map] Support "timeExtent" at MapWidgetModel

MAPAPPS-5838

[mapapps-maven-plugin] Add support to trigger pre-optimize after app upload

MAPAPPS-5947

[MapServerLayerStore] Support canceling of requests

MAPAPPS-6026

[Performance] Compress layer.js and bundles.json request parameters to avoid switching to POST

MAPAPPS-5846

[popups-default] Allow configuration of attachment’s displayType

MAPAPPS-1976

[Search] New search interface that allows searching on multiple stores at once ('Search All' option)

MAPAPPS-5906

[Security] Add and document default values for common security headers

MAPAPPS-5868

[Security] Ensure that SSO cookie appends SameSite=None if secure is true and samesite is false

MAPAPPS-5969

[store-api] Document what a store in map.apps is

MAPAPPS-5951

[System] Update ArcGIS API for JavaScript to version 4.20

MAPAPPS-6013

[Templates] Move drawer button widget config from default app to template manifest

MAPAPPS-5866

[TOC] Enable parent layers when activating nested layers

MAPAPPS-5941

[Vue.js] Update to vue 2.6.14

Fixed Issues

MAPAPPS-5870

ArcGIS Server tokens are not deleted during logout

MAPAPPS-6044

Certain strings trigger replacement in returnURLs

MAPAPPS-5841

[AGOL Authn] Login not working if apprt-esri-init not listed explicite

MAPAPPS-5881

[AGS Search] Store is registered if service is protected and usage of layer not authorized

MAPAPPS-5836

[Apps Overview] No apps displayed when using pre-optimized state

MAPAPPS-5999

[Authentication] Logout timer shows negative remaining time

MAPAPPS-6035

[Configuration] App does not start with invalid properties in app.json

MAPAPPS-5887

[Custominfo] Property toolClass does not set predefined icons

MAPAPPS-5837

[Docker] Internal https requests fail when using the self signed test certificate

MAPAPPS-5834

[Editing] Data changes ignored if geometry is changed afterwards

MAPAPPS-5892

[Editing] Discard feature button text is invisible in some themes

MAPAPPS-5739

[Editing] Undo action executed using 'z' key on keyboard is not respected

MAPAPPS-5872

[Live Configuration] Dialog broken when trying to adjust map content

MAPAPPS-6045

[Live Configuration] Toolset position incorrectly resets to 'top/left'

MAPAPPS-4860

[Manager] Editing in package.json is possible although it cannot be saved

MAPAPPS-5842

[Manager] Synchronization of apps not working

MAPAPPS-5908

[Manager] User with role maEditor cannot use "Export for Native App"

MAPAPPS-5860

[Native App] Browser locale is not respected on page load

MAPAPPS-5911

[Notifier] Close and pin icons are not shown

MAPAPPS-5913

[Notifier] Error messages for non-authorized layers

MAPAPPS-5955

[Omnisearch] Error is logged if result item has no geometry

MAPAPPS-5942

[Parameter Manager] Changes on base layer visibility are encoded in layer visibility parameter

MAPAPPS-5849

[Popups] MapView’s timeExtent property is ignored by MapImageLayer popups

MAPAPPS-5839

[Pre-Optimize] App still recognized as pre-optimized after upload

MAPAPPS-5882

[Result Center] Domain values are not resolved correctly

MAPAPPS-5925

[Selection] Available selection actions are not updated

MAPAPPS-5899

[Selection] No way to go back to the tool with too many layer choices

MAPAPPS-5854

[Selection] Polygon not visible after setting the first point

MAPAPPS-6003

[TOC] Enable/disable all items changes visibility of "exclusive" layers

MAPAPPS-6002

[TOC] Enable/disable all items sets visibility on hidden layers

MAPAPPS-5901

[TOC] Missing keyboard support for basemap selection

MAPAPPS-5894

[TOC] Missing keyboard support for expanding and collapsing layers

MAPAPPS-5926

[TOC] Missing keyboard support for navigation in layer menu

MAPAPPS-5888

[TOC] Wrong indentation of child elements

MAPAPPS-5862

[Themes] Incorrect icon for "share-link" tool in collapsable toolset

MAPAPPS-5893

[Tools] Using an esri icon and launching the tool on app startup destroys the view

Line 3 Bundles (3.10.10)

New Features

MAPAPPS-6040

Ensure support for new default CSP headers