From c3820481551b3bb0c42feb2b97d29c94f9e7abbb Mon Sep 17 00:00:00 2001 From: MatthewMuehlhauserNRCan Date: Wed, 15 Jan 2025 13:56:29 -0500 Subject: [PATCH] 2608 geo core initial settings (#2651) * Issue #2608 - GeoCore Initial Settings * rename/match config parameter * Set initial geocore layer name 793 * Better initial settings * Partial - GeoCore config testing * Activate code for creating config * Use Config Utils to get valid LayerConfig * Slight adjustment to config on 27-geocore-custom * Add Demo Page * Slight correction to config * Configuration corrections and Initial Settings handled * Small cleanup * Correctly name added layers * Change Opacity value * Remove incorrect part from config --- .../28-geocore-custom-inline-config.json | 188 ++++++++++++++++++ .../public/templates/demos-navigator.html | 1 + .../add-new-layer/add-new-layer.tsx | 15 +- .../src/core/utils/config/config.ts | 1 + packages/geoview-core/src/geo/layer/layer.ts | 5 +- .../src/geo/layer/other/geocore.ts | 20 +- .../src/geo/map/map-schema-types.ts | 6 + 7 files changed, 229 insertions(+), 7 deletions(-) create mode 100644 packages/geoview-core/public/configs/navigator/28-geocore-custom-inline-config.json diff --git a/packages/geoview-core/public/configs/navigator/28-geocore-custom-inline-config.json b/packages/geoview-core/public/configs/navigator/28-geocore-custom-inline-config.json new file mode 100644 index 00000000000..b949e34f01f --- /dev/null +++ b/packages/geoview-core/public/configs/navigator/28-geocore-custom-inline-config.json @@ -0,0 +1,188 @@ +{ + "map": { + "interaction": "dynamic", + "viewSettings": { + "projection": 3978 + }, + "basemapOptions": { + "basemapId": "transport", + "shaded": true, + "labeled": false + }, + "listOfGeoviewLayerConfig": [ + { + "geoviewLayerType": "geoCore", + "geoviewLayerId": "21b821cf-0f1c-40ee-8925-eab12d357668", + "listOfLayerEntryConfig": [ + { + "layerId": "0", + "entryType": "group", + "layerName": "Airborne Radioactivity - Main Group", + "listOfLayerEntryConfig": [ + { + "layerId": "1", + "layerName": "Airborne Radioactivity - Feature Layer", + "initialSettings": { + "states": { + "visible": false + } + } + } + ] + } + ] + }, + { + "geoviewLayerType": "geoCore", + "geoviewLayerId": "0fca08b5-e9d0-414b-a3c4-092ff9c5e326", + "listOfLayerEntryConfig": [ + { + "layerId": "6", + "layerName": "NS Marine Water Quality Data", + "initialSettings": { + "states": { + "hoverable": true, + "legendCollapsed": false, + "opacity": 0.3, + "queryable": true, + "visible": true + } + } + } + ] + }, + { + "geoviewLayerType": "geoCore", + "geoviewLayerId": "03ccfb5c-a06e-43e3-80fd-09d4f8f69703", + "listOfLayerEntryConfig": [ + { + "layerId": "regina", + "layerName": "Temporal Series of the National Air Photo Library (NAPL) - Regina, Saskatchewan (1947-1967) / Série temporelle de la photothèque nationale de l'air (PNA) - Regina, Saskatchewan (1947-1967)", + "initialSettings": { + "states": { + "opacity": 0.5 + }, + "controls": { + "highlight": false, + "hover": false, + "opacity": true, + "query": false, + "remove": true, + "table": false, + "visibility": true, + "zoom": true + } + } + } + ] + }, + { + "geoviewLayerType": "geoCore", + "geoviewLayerId": "ccc75c12-5acc-4a6a-959f-ef6f621147b9", + "listOfLayerEntryConfig": [ + { + "layerId": "0", + "layerStyle": { + "Point": { + "type": "uniqueValue", + "hasDefault": false, + "fields": ["SYMBOL_EN"], + "info": [ + { + "label": "Confederation to 1914", + "visible": true, + "values": ["Confederation to 1914"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAahJREFUKJGd0ksoRFEcBvDvjMvci3E9GkxMxttYIIQo8igWHkmsRikLoSxlbSVZjKasyIIFmhQa5JmFZOGxMHYjeSQLxsw05ozhHgtcMWYWvjqbU7/zP9/pcPhnuN8blDqiGSONBCQHYG8gOPV62ZooijQgpB5XtySxsZvLu+j72weEcApoUzVQJ8TeejyuHkFQWfwgpc6BpwfH+PToCs4Xrn/com6oIKm1q26ZUmc7z0ctypBSZ7qX+sZMg3O42nn067M1cgoffVUYBpomKXXs8rxo5wCAMfQc7VtD/0Jf2TOeoaq5OEabmmgAYOIAgABlZ4e2wE/4GZv1ClqdpkyGAAl/dtGg6KPSCwAWLndkgE2bpS6y4joojE+KAwi5kCEBzKXVeR3rw8cBkSqbhz4/DYzBLEMlH2lOTtHsd07UVsz0bfuhsIQQ9BvbwAv8vCCoDr4nEsJe3O62yoaSVY0lvnB36QjWzUsoxVAU1megpqUU6sTYDUlSdH8dJn+AsIiIe8bs5Zm5ut5Mvc6AIegBvAE4AcGUUhk5SwiR/ODH5BgvAOPnCpp3ofqRTtNnzMYAAAAASUVORK5CYII=", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + }, + { + "label": "First World War", + "visible": false, + "values": ["First World War"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAZ5JREFUKJGd0ssvA1EUBvDvjqmZelUH7UwkbZQFQSKqImw8dtLEomFlZ9HY+EssiC07G1IWBInEYyMWgiZeG7owI6lE23REemdavRZqhCqJLzmbm/zuOefm8vhn+O8HlKZrGSNBAtIKsFcQRA2D7TgcDloS0szzFMuz2Xg8XvuUSILjOCiyDElyPmQyz2G7vXqrCFKqz+hpfX5jcweapn2Zoqurs3FkeGiDUn1cFGvWLUip3mwY2dmV1TUkEsmifaLRC+SyOS4YHF2kNH0gio4UDwCMIXx9fWP7CX3k8uoG/p5up6K4JwEs8ABAgL6721jpJyzk/l6FIst9FgRIhWGaf0LTNAGwCmtHBty5XPV+VdV+hXV1EkBIzIIEiHR0tE+cnkZLIkEQ4PM1gTFELCiIVRFFlo9GhgcH9vYPi5DNxiMUGoMgiCt2e/XxZ0dCmPnyEgoE/Nsud0P3yckZVFUDz5ehpcWH3t4AJMm5m89zUx+XWR+gvLLykbFUv9frmfZ6PJMA2gC8AjgHwZIgVC0TQvJF8L2z0wAwV6hf8waIeZGd6U5WcwAAAABJRU5ErkJggg==", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + }, + { + "label": "Second World War", + "visible": true, + "values": ["Second World War"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAZ5JREFUKJGd0EsoRFEYB/D/GZe511zzyhhiMTMiQxI2YsPKMylRSkqKlFhpSspGSRSSjcdOpAalPGJhpUkWrFiI2RiSzDTX454rc48FrhiP8q9TX6d+fQ8O/wz39YPSsJkxUkNAsgAWAcGRorBNk8lEf4RUvmtjqjoa8vvN94FL6LgYmF0uiHZ7QJbvOgQhYT0KUip1y7fBicOhEUgzC5+mSBnuT81pbVmjVGrgeeOKBimV0p+pMnrQ68Hj8nbUPleeQahU0eX3dM1SGt7leVOIAwDG0HGx54v9Dr3nemAEwdpqi9XlaAYwyQEAAYpufPs/n/AtweMTWJ3OIg0CJP5ZCv8JI7IMgMVrOzLgTMzKLPyLGtJSAULONUgAb1pZaWPgF8QV5iApLxeMwatBPS96LQ7nXsbidMlpU3sUinHYkDc1hljBsCQICb6PjoSwp4eH+vTK8g2jb6vAv7oGaWMHxGpEYlUFXHW1EJPt26qqa9MmeC/iDIZrxkLFtmx3p83tbkafxw0gAuAQBHN6vThPCFGj4GtniwJg/O39mhf/K5CfkLtGyAAAAABJRU5ErkJggg==", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + }, + { + "label": "Korean War", + "visible": false, + "values": ["Korean War"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAYtJREFUKJGdz79rU2EUxvHvSa+5N2libixtwEpTEYkZjKBLsItQapfiInYKXTIEQd0U/AdcTKG2a91cxCCoVEEonSTiYkEIVKiIYCQdDEkoeW+09zioVzTGgg+8cHjhc35Y/GesPz+MabmqMifICdA9hE3P02eJRMIMhKbbKeL7Zdl572qzDkNDMHoU20197HY7pUgkvtYHjWlfo/P5jr++CI0Hv6+RuT4uUwuPjWlfcpyDDwNoTPsYPa/sr92E1kbfPbp1G756IZm+smpMa8NxEk0LQJUSb6sH/oYCvL0MJ+eSkkoXgBULQCCvH14NREHqNRibzAcQJKq99v7wiwE0GtyosC0jx89oYx/oHgaRdwEUqGjm3Dy1W4ORnYF0DlUqAbSdWMUbnXxBfmVKX17tR9YhZKYM4ej9SCRe/TVRRHu7uxf93OxTRh6d1jdP4NM6WHFk4jycugBu6rnvh4pBr59FeHi4odo86x3JXpbxbAFuZIE94DXCXduO3RMRvw9+n5z0gKUf75/5BuXZh6Fohy1dAAAAAElFTkSuQmCC", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + }, + { + "label": "Peacekeeping", + "visible": true, + "values": ["Peacekeeping"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAatJREFUKJGd0jFoE1Ecx/HvP7kmd03iJSElwaLYq4OpRSQKFgUFt0IpFNGpkx2Ki1hcHNxdCio6OOjmoBAiiFZwEYTSrRYpioNBtLYErUlzxHuJ5p6D7YnGVPAH/+XB5/3//8cz+M8Yfx4otZHUWsYE2Qe6jbDUbOontm2rrlB57pTv69l3lVpyZb1BOCwMZm1yqfhHz3OnLSvxuAMqVT+/Xv96/crcMjfX3N+muDqc7T97Iv9Qqfpp09xRCqBS9UHVas9eLC1xr+p17DOzXKH5zQ9dGD1wW6mNZ6ZpVw0ArZmef73a8ze0lUtvPjFeqKWcnD0J3DAABEYWyp+7P+FmXn34gpNNjgQQpLfW+v5P6LXagO4NdtTwNp+JH2LV3Rb2p2MgUg6gQPHk/p1neLnWFR2JGBx0+tCaYgCjZrw4kGX+wXHn2MTzcgfaGw5xa3wYK9Jz37ISC786iuhWo3FqtDAwt9iXKJQW3/NoxSVtCGNOmonDe8ilYk99PzS1dVnwASKxWEXr6tGh3ZlzQ7syk5chD7SBFwh3otH4XRHxO+DPzqkmcG2zts0PBFWRZ33W55YAAAAASUVORK5CYII=", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + }, + { + "label": "Afghanistan", + "visible": false, + "values": ["Afghanistan"], + "settings": { + "type": "iconSymbol", + "mimeType": "image/png", + "src": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAadJREFUKJGd0ksoRFEYB/D/MZe5dzzGlccUxjOZsRksyLBRkkghVlZmISWRzSzsWShkFhQ7CzKNyCsbG1KTmBSJvMpzYYaZpjl35B4L44oxlH99m1O/833f6XD4Z7jvB5Q+JzJGGghIIcBeQeCSJLam1WppREgDPossy8OXD1eJ1+57qFQq5KVmQyem3AQCvk5BiF8Jg5R6ex59nrHB9UnY7pxfphgpak7vqGpbotTbyvMJDgVS6s2jweBw/+IQZt2nYfv0HTogvUhRvbWWKUqfN3le6+EAgDF0bh87o39CH7GerKDRVCPm6jLbAYxzAECA8p0LV+QnDOXo5gS5afpyBQJE8/Ti/xMGghQA0yg7MuDMkJxVilvnrzBd1AGEnCuQAPZqg7kNB/MRUZlahCnHCMZgV6Caj7PnpOq3Fyq7zU1btjCUz/GYqLdCiNHMCUL8zmdHQljQ72+pK65e3UvOKHG4NrB8u4skjkdDthlNJbXQiSkbshxl+bhM+QAxsbEPjHkqjPqCLmNmQfsAYADwCmAfBNNqddwMIUQOg++dRQnAaKh+zRtAE5CN4Z5HEQAAAABJRU5ErkJggg==", + "rotation": 0, + "opacity": 1, + "offset": [0, 0] + } + } + ] + } + } + } + ] + } + ] + }, + "components": ["overview-map"], + "overviewMap": { + "hideOnZoom": 7 + }, + "footerBar": { + "tabs": { + "core": ["legend", "layers", "details", "geochart", "data-table"] + } + }, + "corePackages": [], + "theme": "geo.ca" +} diff --git a/packages/geoview-core/public/templates/demos-navigator.html b/packages/geoview-core/public/templates/demos-navigator.html index d90fe683a05..928c4fa6052 100644 --- a/packages/geoview-core/public/templates/demos-navigator.html +++ b/packages/geoview-core/public/templates/demos-navigator.html @@ -148,6 +148,7 @@

Configurations Navigator

+ diff --git a/packages/geoview-core/src/core/components/layers/left-panel/add-new-layer/add-new-layer.tsx b/packages/geoview-core/src/core/components/layers/left-panel/add-new-layer/add-new-layer.tsx index 10389f713cd..67315f432bc 100644 --- a/packages/geoview-core/src/core/components/layers/left-panel/add-new-layer/add-new-layer.tsx +++ b/packages/geoview-core/src/core/components/layers/left-panel/add-new-layer/add-new-layer.tsx @@ -883,8 +883,19 @@ export function AddNewLayer(): JSX.Element { }); } else if (layerEntries.length > 0) { (layerEntries as TypeGeoviewLayerConfig[]).forEach((geoviewLayerConfig) => { - const addedLayer = api.maps[mapId].layer.addGeoviewLayer(geoviewLayerConfig); - if (addedLayer) addedLayers.push(addedLayer); + if (layerName !== geoviewLayerConfig.geoviewLayerName) { + const tempConfig = geoviewLayerConfig; + if (tempConfig.listOfLayerEntryConfig.length > 1) { + tempConfig.geoviewLayerName = layerName; + } else { + tempConfig.listOfLayerEntryConfig[0].layerName = layerName; + } + const addedLayer = api.maps[mapId].layer.addGeoviewLayer(tempConfig); + if (addedLayer) addedLayers.push(addedLayer); + } else { + const addedLayer = api.maps[mapId].layer.addGeoviewLayer(geoviewLayerConfig); + if (addedLayer) addedLayers.push(addedLayer); + } }); } diff --git a/packages/geoview-core/src/core/utils/config/config.ts b/packages/geoview-core/src/core/utils/config/config.ts index becde9386e6..ea7f6c62968 100644 --- a/packages/geoview-core/src/core/utils/config/config.ts +++ b/packages/geoview-core/src/core/utils/config/config.ts @@ -55,6 +55,7 @@ export class Config { listOfGeoviewLayerConfig.forEach((geoviewLayerEntry) => { if (mapConfigLayerEntryIsGeoCore(geoviewLayerEntry)) { // Skip it, because we don't validate the GeoCore configuration anymore. Not the same way as typical GeoView Layer Types at least. + // TODO Why not do GeoCore request here? Then could easily replace listOfLayerEntries and validate / process along with other layers } else if (Object.values(CONST_LAYER_TYPES).includes((geoviewLayerEntry as TypeGeoviewLayerConfig).geoviewLayerType)) { const geoViewLayerEntryCasted = geoviewLayerEntry as TypeGeoviewLayerConfig; this.#setLayerEntryType(geoViewLayerEntryCasted.listOfLayerEntryConfig!, geoViewLayerEntryCasted.geoviewLayerType); diff --git a/packages/geoview-core/src/geo/layer/layer.ts b/packages/geoview-core/src/geo/layer/layer.ts index 403649deb85..1db09858a60 100644 --- a/packages/geoview-core/src/geo/layer/layer.ts +++ b/packages/geoview-core/src/geo/layer/layer.ts @@ -24,6 +24,7 @@ import { mapConfigLayerEntryIsGeoCore, layerEntryIsGroupLayer, TypeLayerStatus, + GeoCoreLayerConfig, } from '@/geo/map/map-schema-types'; import { GeoJSON, layerConfigIsGeoJSON } from '@/geo/layer/geoview-layers/vector/geojson'; import { GeoPackage, layerConfigIsGeoPackage } from '@/geo/layer/geoview-layers/vector/geopackage'; @@ -371,7 +372,9 @@ export class LayerApi { const geoCore = new GeoCore(this.getMapId(), this.mapViewer.getDisplayLanguage()); // Create the layers from the UUID - promisesOfGeoCoreGeoviewLayers.push(geoCore.createLayersFromUUID(geoviewLayerConfig.geoviewLayerId)); + promisesOfGeoCoreGeoviewLayers.push( + geoCore.createLayersFromUUID(geoviewLayerConfig.geoviewLayerId, geoviewLayerConfig as GeoCoreLayerConfig) + ); } else { // Add a resolved promise for a regular Geoview Layer Config promisesOfGeoCoreGeoviewLayers.push(Promise.resolve([geoviewLayerConfig as TypeGeoviewLayerConfig])); diff --git a/packages/geoview-core/src/geo/layer/other/geocore.ts b/packages/geoview-core/src/geo/layer/other/geocore.ts index b7f74d0d3af..7b9e950ee6b 100644 --- a/packages/geoview-core/src/geo/layer/other/geocore.ts +++ b/packages/geoview-core/src/geo/layer/other/geocore.ts @@ -1,12 +1,13 @@ import { TypeDisplayLanguage } from '@config/types/map-schema-types'; import { UUIDmapConfigReader } from '@/core/utils/config/reader/uuid-config-reader'; +import { Config } from '@/core/utils/config/config'; import { ConfigValidation } from '@/core/utils/config/config-validation'; import { GeochartEventProcessor } from '@/api/event-processors/event-processor-children/geochart-event-processor'; import { logger } from '@/core/utils/logger'; import { MapEventProcessor } from '@/api/event-processors/event-processor-children/map-event-processor'; -import { TypeGeoviewLayerConfig } from '@/geo/map/map-schema-types'; +import { GeoCoreLayerConfig, TypeGeoviewLayerConfig } from '@/geo/map/map-schema-types'; import { TypeJsonValue } from '@/core/types/global-types'; import { api } from '@/app'; @@ -32,11 +33,11 @@ export class GeoCore { /** * Gets GeoView layer configurations list from the UUIDs of the list of layer entry configurations. - * - * @param {GeoCoreLayerEntryConfig} geocoreLayerConfig the layer configuration + * @param {string} uuid the UUID of the layer + * @param {GeoCoreLayerConfig} layerConfig the layer configuration * @returns {Promise} list of layer configurations to add to the map */ - async createLayersFromUUID(uuid: string): Promise { + async createLayersFromUUID(uuid: string, layerConfig?: GeoCoreLayerConfig): Promise { // Get the map config const mapConfig = MapEventProcessor.getGeoViewMapConfig(this.#mapId); @@ -47,6 +48,17 @@ export class GeoCore { // Get the GV config from UUID and await const response = await UUIDmapConfigReader.getGVConfigFromUUIDs(url, this.#displayLanguage, [uuid]); + // Use user supplied listOfLayerEntryConfig if provided + if (layerConfig?.listOfLayerEntryConfig || layerConfig?.initialSettings) { + const tempLayerConfig = { ...layerConfig } as unknown as TypeGeoviewLayerConfig; + tempLayerConfig.metadataAccessPath = response.layers[0].metadataAccessPath; + tempLayerConfig.geoviewLayerType = response.layers[0].geoviewLayerType; + + const config = new Config(this.#displayLanguage); + const newLayerConfig = config.getValidMapConfig([tempLayerConfig]); + return newLayerConfig as TypeGeoviewLayerConfig[]; + } + // Validate the generated Geoview Layer Config ConfigValidation.validateListOfGeoviewLayerConfig(this.#displayLanguage, response.layers); diff --git a/packages/geoview-core/src/geo/map/map-schema-types.ts b/packages/geoview-core/src/geo/map/map-schema-types.ts index 7de93eb05c9..300954bde52 100644 --- a/packages/geoview-core/src/geo/map/map-schema-types.ts +++ b/packages/geoview-core/src/geo/map/map-schema-types.ts @@ -404,6 +404,12 @@ export type GeoCoreLayerConfig = { // TO.DOCONT: For this we will need a little trick because when we create the config the setting are set at the root level and in our config it will take it from the layerID. // TO.DOCONT: There is refactor to do to make this work for all layer type. Global setting should be cascade to child of the root layer. geoviewLayerName: string; + + /** Initial settings to apply to the GeoCore layer at creation time. */ + initialSettings?: TypeLayerInitialSettings; + + /** The layer entries to use from the GeoCore layer. */ + listOfLayerEntryConfig?: TypeLayerEntryConfig[]; }; /**