Domain-Bundles
Motivation
Die vorausgehenden Abschnitte stellen dar, auf welche Weise verschiedene Aspekte einzelner Apps — wie z.B. die Grundkarte(n), Themenkarten oder die Suche — angepasst werden können.
Es gibt jedoch Situationen, in denen zahlreiche Apps mit den selben Konfigurationsoptionen bedient werden sollen. Zum Beispiel, wenn sich mehrere Apps dieselben Dienste für Hintergrund- oder Themenkarten teilen. Dabei kann es vorkommen, dass sich zwar viele Apps einen Teil der Konfigurationsoptionen teilen, jedoch nicht alle dieselben.
Mit Hilfe von Domain-Bundles ist es möglich, diese Konfigurationsoptionen in einem eigenen Bundle zu verpacken. Dieses kann dann in vielen Apps wiederverwendet werden. Darüber hinaus können Konfigurationsoptionen für verschiedene Funktionen einer App in einem Domain-Bundle zusammengefasst werden. So lassen sich alle Aspekte einer Fachdomäne gebündelt konfigurieren.
Die Bereitstellung als Bundle unterstützt dabei, die enthaltenen Konfigurationsoptionen in zahlreichen Apps auf verschiedene Weise beliebig zu kombinieren. Außerdem bieten Bundles von Hause aus die Möglichkeit der Versionierung. So können Updates an der Konfiguration einer oder mehrerer Apps gezielt verteilt und angewandt werden.
Domain-Bundles erstellen
Die Konfiguration in einem Domain-Bundle ist analog zur app.json
aufgebaut.
Aufbau und Möglichkeiten
Im einfachsten Fall besteht ein Domain-Bundle lediglich aus einer JSON-Datei (manifest.json
), in der ein oder mehrere Konfigurationsfragmente abgelegt sind.
Alle Konfigurationsfragmente werden in JSON innerhalb des Schlüsselworts domain-config
beschrieben.
Es ist möglich ein oder mehrere dieser Fragmente gleichzeitig in einem Domain-Bundle zu konfigurieren.
Die folgende manifest.json
zeigt beispielhaft eine leere Konfiguration aller möglichen Fragmente:
{
"name": "domain-yourCustomDomainBundleName",
"version": "1.0.0",
"dependencies": {
"domains-system": "^4.4.0"
},
"main": "",
"layer": "",
"i18n": [],
"domain-config": {
"map-basemaps": [],
"map-layers": [],
"ags-stores": [],
"report-mappings": []
}
}
Jedes Fragment hat sein eigenes Schlüsselwort und eine Konfiguration, die einem Teil der App-Konfigurationsdatei (app.json
) entspricht.
Die folgende Tabelle listet die möglichen Fragmente der Domain-Bundle-Konfiguration auf:
Fragment | Schlüsselwort in domain-config |
Entsprechung in der app.json |
---|---|---|
|
|
|
|
|
|
Quellen für Suche und räumliche Auswahl |
|
|
|
|
Vollständiges Beispiel
Das folgende Beispiel zeigt eine Domain-Bundle-Konfiguration, die alle verfügbaren Konfigurationsfragmente verwendet:
{
"name": "domain-yourCustomDomainBundleName",
"version": "1.0.0",
"dependencies": {
"domains-system": "^4.4.0"
},
"main": "",
"layer": "",
"i18n": [],
"domain-config": {
"map-basemaps": [
{
"id": "esri_street",
"title": "Streets",
"thumbnailUrl": "resource('images/thumbnailImage.png')",
"basemap": "gray-vector"
}
],
"map-layers": [
{
"id": "koeln3",
"title": "Koeln",
"url": "https://services.conterra.de/arcgis/rest/services/common/koeln/MapServer",
"coverImage": "resource('images/coverImage.png')",
"type": "AGS_DYNAMIC",
"visible": true
}
],
"ags-stores": [
{
"id": "store01",
"title": "Adressen",
"url": "https://services.conterra.de/arcgis/rest/services/common/koeln_adressen/MapServer/0",
"omniSearchSearchAttr": "ADRESSE",
"omniSearchDefaultLabel": "Adressen"
}
],
"report-mappings": [
{
"storeId": "store01",
"reportId": "report01",
"fileName": "Report.pdf"
}
]
}
}
Domain-Bundles verwenden
Die Installation und Nutzung von Domain-Bundles erfolgt analog zu anderen Bundles (siehe Verwalten von Funktionen (Bundles)).
Dabei können Domain-Bundles in einer oder mehreren Apps verwendet und beliebig kombiniert werden. Die Konfigurations-Fragmente der Domain-Bundles werden neben der bestehenden App-Konfiguration angewandt, wofür je nach Aspekt die im Folgenden beschriebenen Rahmenbedingungen gelten.
Auswirkungen auf die App
Jeder Aspekt, der mit einem Domain-Bundle konfiguriert wird (z.B. Karte oder Suche), wirkt sich auf die App und ihre Konfiguration aus. Im folgenden ist je nach Aspekt beschrieben, wie sich Domain-Bundle-Konfigurationen auf eine App auswirken.
Grundkarten
Grundkarten werden innerhalb des Schlüsselwortes "map-basemaps"
analog zur app.json
konfiguriert.
Die aktive Grundkarte wird über die Eigenschaft "selected":true
festgelegt.
Hier ein Beispiel:
{
"map-basemaps": [
{
"id": "esri_street",
"title": "Streets",
"thumbnailUrl": "resource('images/thumbnailImage.png')",
"basemap": "gray-vector",
"selected": true
}
]
}
Aus der folgenden Tabelle kann entnommen werden wie sich über Domain-Bundles bereitgestellte Grundkarten auf die App bwz. App-Konfiguration auswirken:
Verhalten bei … | Beschreibung | Beispiele |
---|---|---|
… Anwendung der Konfiguration |
Grundkarten aus Domain-Bundles werden der App hinzugefügt und stehen nach dem Laden des Bundles zur Auswahl zur Verfügung. |
Grundkarten mit eindeutigen IDs werden der Karte hinzugefügt. Da nur eine Grundkarte selektiert sein kann, wird die Grundkarte aus einem Domain-Bundle nur dann selektiert, wenn es keine selektierte Grundkarte in der App gibt und nicht zuvor ein anderes Domain-Bundle eine Grundkarte selektiert hat. |
… festgelegter Reihenfolge |
Grundkarten werden in der Reihenfolge der geladenen Domain-Bundles hinzugefügt. |
In der Karte ist nur eine Grundkarte gleichzeitig aktiv. Allerdings hat die Reihenfolge z.B. Einfluss auf die Darstellung im Basemap-Toggler. |
… Duplikaten |
Bereits geladene Grundkarten werden nicht überschrieben. Dabei gilt: App-Konfiguration geht vor Domain-Bundle-Konfiguration. |
Die zu ladende Grundkarte wird nicht übernommen, wenn bereits eine in der App konfigurierte oder eine zuvor über ein anderes Domain-Bundle geladene Grundkarte über dieselbe ID verfügt. |
Themenkarten
Die Konfiguration von Themenkarten mit dem "map-layers"
Schlüsselwort in Domain-Bundles entspricht der Konfiguration der map.layers
Eigenschaft in der map-init
Bundle-Konfiguration.
{
"map-layers": [
{
"id": "koeln3",
"title": "Koeln",
"url": "https://services.conterra.de/arcgis/rest/services/common/koeln/MapServer",
"coverImage": "resource('images/coverImage.png')",
"type": "AGS_DYNAMIC",
"visible": true
}
]
}
Themenkarten aus Domain-Bundles werden auf ähnliche Weise in die Karte übernommen, als wären sie direkt in der App konfiguriert. Die folgende Tabelle stellt situationsbezogene Besonderheiten dar:
Verhalten bei … | Beschreibung | Beispiele |
---|---|---|
… Anwendung der Konfiguration |
Themenkarten, Sublayer, popupTemplates und andere Konfigurationen werden in die Karte übernommen, sobald das Domain-Bundle geladen wird. |
|
… festgelegter Reihenfolge |
Themenkarten werden in festgelegter Reihenfolge der Karte hinzugefügt. Die Layer von zuerst geladenen Domain-Bundles werden der Karte in gleicher Reihenfolge von unten nach oben zugefügt. |
Die Reihenfolge beeinflusst nicht nur die Anordnung der Themen-Kacheln im TOC, sondern auch die Darstellungsreihenfolge - und Überlagerung - von Layern in der Karte. |
… Duplikaten |
Themenkarten aus einem Domain-Bundle mit IDs, die bereits der Karte hinzugefügt wurden, werden nicht übernommen. |
Es werden keine Konfigurationsoptionen eines Layers übernommen, dessen ID bereits in der Karte vorhanden ist - dementsprechend werden Einstellungen nicht zusammengeführt. |
Quellen für Suche und räumliche Auswahl
Quellen für Suche und räumliche Auswahl werden unterhalb des Schlüsselworts "ags-stores"
konfiguriert - analog zur Konfiguration von AGSStore
für das agssearch
Bundle in der app.json
.
Um diese Funktion zu nutzen, muss das Domain-Bundle eine Abhängigkeit auf das Bundle agssearch
haben.
Alternativ kann das Bundle über die App geladen werden.
{
"ags-stores": [
{
"id": "store01",
"title": "Adressen",
"url": "https://services.conterra.de/arcgis/rest/services/common/koeln_adressen/MapServer/0",
"omniSearchSearchAttr": "ADRESSE",
"omniSearchDefaultLabel": "Adressen"
}
]
}
Verhalten bei … | Beschreibung | Beispiele |
---|---|---|
… Anwendung der Konfiguration |
Quellen aus Domain-Bundles werden im System registriert und stehen wie gewohnt ihrer Konfiguration der |
So kann über ein Domain-Bundle die Räumliche Auswahl und die Suche um Quellen erweitert werden. |
… festgelegter Reihenfolge |
Auf die Funktionalität hat die Reihenfolge keine Auswirkung. |
Allerdings hat die Lade-Reihenfolge Auswirkungen auf die in der Quellen-Liste der räumlichen Auswahl. |
… Duplikaten |
Es gibt keine Prüfung auf Duplikate bzw. bereits vorhandene StoreQuellen. |
Quellen aus einem Domain-Bundle mit ID oder URL, die bereits bei registrierten Quellen vorkommen, werden der App hinzugefügt. |
Report Mappings
Report Mapping werden unterhalb des Schlüsselworts "report-mappings"
konfiguriert - analog zur Konfiguration der Mappings des ReportTask für das Bundle reporttool
in der app.json
.
Um diese Funktion zu nutzen, muss das Domain-Bundle eine Abhängigkeit auf das Bundle reporttool
haben.
Alternativ kann das Bundle über die App geladen werden.
{
"report-mappings": [
{
"storeId": "store01",
"reportId": "report01",
"fileName": "Report.pdf"
}
]
}
Verhalten bei … | Beschreibung | Beispiele |
---|---|---|
… Anwendung der Konfiguration |
Mappings aus Domain-Bundles ergänzen die bereits bestehenden Mappings. |
Ein Domain-Bundle kann hierüber eigene Report Mappings definieren. |
… festgelegter Reihenfolge |
Auf die Funktionalität hat die Reihenfolge keine Auswirkung. |
Bei Duplikaten wird das zuerst registrierte Mapping verwendet. |
… Duplikaten |
Die Prüfung auf Duplikate erfolgt über die |
Ein Mapping aus einem Domain-Bundle mit einer StoreId, die bereits in registrierten Mappings vorkommt, wird der App nicht hinzugefügt. |
Reihenfolge der Auswertung
Wie den voran gegangenen Beschreibungen der Auswirkungen von Domain-Bundles auf das App-Verhalten entnommen werden kann, ist die Reihenfolge, in der Domain-Bundles geladen werden, in vielen Fällen ausschlaggebend. Daher besteht die Möglichkeit, diese Reihenfolge anzupassen. Auf diese Weise kann z.B. die Darstellungsreihenfolge von Themenkarten beeinflusst werden. Außerdem lässt sich so sicherstellen, dass im Falle von uneindeutigen IDs die wichtigeren Domain-Bundles zuerst geladen werden.
Der folgende Auszug aus einer app.json
Konfiguration zeigt, wie die Reihenfolge, in der Domain-Bundles geladen und angewandt werden, beeinflusst werden kann.
Geben Sie die Bundlenamen in der Reihenfolge an, in der Sie geladen werden sollen.
Es reicht aus, diejenigen Bundlenamen anzugeben, für die eine Reihenfolge wichtig ist.
Nicht aufgeführte Bundles werden nach den aufgeführten in zufälliger Reihenfolge geladen und angewandt.
"domains-system": {
"Config": {
"domainBundleOrder": ["domain-domainBundleForBasmaps", "domain-domainBundleForMapLayers"]
}
}
Die Reihenfolge, in der Domain-Bundles geladen werden, wird beim Starten der App ausgewertet. Beim dynamischen Starten oder Stoppen eines Domain-Bundles wird die Reihenfolge nicht berücksichtigt. |