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 Konfiguration in einer app.json
Datei 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
Datei 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 Datei |
---|---|---|
|
|
|
|
|
|
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",
"searchAttribute": "ADRESSE",
"searchLabel": "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 Konfiguration in einer app.json
Datei konfiguriert.
Um die aktive Grundkarte zu definieren, verwenden Sie die Eigenschaft "selected":true
.
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. Alle Themenkarten aus Domain-Bundles, die zum App-Start verfügbar sind, werden als Block zur Karte hinzugefügt. Dabei liegen die Themenkarten aus zuerst geladenen Domain-Bundles oben, zuletzt geladene am unteren Ende des Blocks. Themenkarten aus später geladenen Domain-Bundles werden separat oberhalb bzw. unterhalb vorhandener Themenkarten eingefügt. Ob die Themenkarten vor oder nach den bereits in der App vorhandenen Themenkarten eingefügt werden, kann per Konfiguration festgelegt werden. |
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. |
Themenkartenkonfiguration in Apps überschreiben
Innerhalb einer App ist es möglich, die Konfiguration von Themenkarten, die in einem Domain-Bundle definiert sind, für die jeweilige App zu überschreiben.
Die Eigenschaften, die überschrieben werden sollen, werden dabei im Parameter map-layers-override
je Layer festgelegt.
Beispielsweise kann auf diese Art und Weise die initiale Sichtbarkeit von Themenkarten aus einem Domain-Bundle in der jeweiligen App gesteuert werden:
"domains-system": {
"Config": {
"map-layers-override": {
"trees": {
"visible": false
}
}
}
}
Die Id`s der Layer, die angepasst werden sollen, werden als Schlüssel innerhalb von map-layers-override
verwendet.
Im obigen Beispiel wird die initiale Sichtbarkeit des Layers trees
auf false
gesetzt.
Ebenso ist es möglich, Eigenschaften von Sublayern der Themenkarten zu überschreiben.
Die Eigenschaften von Sublayern werden innerhalb des Elements sublayers-override
wie folgt festgelegt:
"domains-system": {
"Config": {
"map-layers-override": {
"trees": {
"sublayers-override": {
"1": {
"visible": false
}
}
}
}
}
}
Auch innerhalb von sublayers-override
werden die Id`s der zu ändernden Sublayer als Schlüssel verwendet.
Themenkarten unterhalb oder oberhalb bereits vorhandener Themenkarten einfügen
Standardmäßig werden Themenkarten, die in Domain-Bundles konfiguriert sind, oberhalb der in der app.json
Datei konfigurierten Themenkarten eingefügt.
Um die Themenkarten aus den Domain-Bundles unterhalb derer aus der App-Konfiguration einzufügen, setzen Sie folgende Konfiguration:
bundles
-Sektion der app.json
Datei"domains-system": {
"Config": {
"domainLayersOnTop": false
}
}
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
Datei.
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",
"searchAttribute": "ADRESSE",
"searchLabel": "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
Datei.
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 der Konfiguration einer app.json
Datei 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.
bundles
-Sektion der app.json
Datei"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. |