diff --git a/.github/workflows/type-build.yml b/.github/workflows/type-build.yml index 9f432753adc..1e04329fe4c 100644 --- a/.github/workflows/type-build.yml +++ b/.github/workflows/type-build.yml @@ -4,6 +4,10 @@ on: schedule: - cron: "42 21 * * 5" +env: + NODE_VERSION: "20.11.0" + PNPM_VERSION: "8.15.0" + jobs: update_types: runs-on: ubuntu-latest diff --git a/docs/app/geoview-layer/map-config/draw.io/TypeMapConfig.drawio.svg b/docs/app/geoview-layer/map-config/draw.io/TypeMapConfig.drawio.svg index a4167d14199..8b549cea01b 100644 --- a/docs/app/geoview-layer/map-config/draw.io/TypeMapConfig.drawio.svg +++ b/docs/app/geoview-layer/map-config/draw.io/TypeMapConfig.drawio.svg @@ -1097,7 +1097,7 @@
- TypeGeocoreLayerEntryConfig + TypeGeoCoreLayerEntryConfig
@@ -1106,7 +1106,7 @@ - TypeGeocoreLayerEntryConfig + TypeGeoCoreLayerEntryConfig diff --git a/packages/geoview-core/public/locales/en/translation.json b/packages/geoview-core/public/locales/en/translation.json index d36f888b48d..3a448634f78 100644 --- a/packages/geoview-core/public/locales/en/translation.json +++ b/packages/geoview-core/public/locales/en/translation.json @@ -157,7 +157,8 @@ "loadfailed": "Layer [__param__] failed to load on map __param__.", "notfound": "The sublayer __param__ of the GeoView layer __param__ does not exist on the server", "createtwice": "Can not execute twice the createGeoViewRasterLayers method for the map __param__", - "usedtwice": "Duplicate use of geoview layer identifier [__param__] on map __param__" + "usedtwice": "Duplicate use of geoview layer identifier [__param__] on map __param__", + "multipleUUID": "GeoCore layers may only have one GeoCore UUID per layer" }, "schema": { "notFound": "A schema error was found, check the console to see what is wrong.", @@ -219,4 +220,4 @@ "resizeTooltip": "Resize", "noTab": "No Tab" } -} \ No newline at end of file +} diff --git a/packages/geoview-core/public/locales/fr/translation.json b/packages/geoview-core/public/locales/fr/translation.json index ec8819a6346..e81975d2d1e 100644 --- a/packages/geoview-core/public/locales/fr/translation.json +++ b/packages/geoview-core/public/locales/fr/translation.json @@ -157,7 +157,8 @@ "loadfailed": "Le chargement de la couche [__param__] a échoué sur la carte __param__.", "notfound": "La sous couche __param__ de la couche GeoView __param__ n'existe pas sur le sereur", "createtwice": "On ne peut exécuter deux fois la méthode createGeoViewRasterLayers pour la carte __param__", - "usedtwice": "Utilisation en double de l'identifiant de couche geoview [__param__] sur la carte __param__" + "usedtwice": "Utilisation en double de l'identifiant de couche geoview [__param__] sur la carte __param__", + "multipleUUID": "Les couches GeoCore ne peuvent avoir qu'un seul UUID GeoCore par couche." }, "schema": { "notFound": "Une erreur de schéma a été trouvée, vérifiez la console pour voir ce qui ne va pas.", @@ -219,4 +220,4 @@ "resizeTooltip": "Redimensionner", "noTab": "Pas d'onglet" } -} \ No newline at end of file +} diff --git a/packages/geoview-core/public/templates/layers/geocore.html b/packages/geoview-core/public/templates/layers/geocore.html index cdfe6e93c21..dbdd59a05d8 100644 --- a/packages/geoview-core/public/templates/layers/geocore.html +++ b/packages/geoview-core/public/templates/layers/geocore.html @@ -76,20 +76,23 @@

1. Many GeoCore Layers

'listOfGeoviewLayerConfig': [ { 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'airborneRad', 'listOfLayerEntryConfig': [ { - 'layerId': '0fe65119-e96e-4a57-8bfe-9d9245fba06b', - 'geocoreLayerName': { 'en': 'HRDEM Mosaic Hillshade' }, + 'layerId': '21b821cf-0f1c-40ee-8925-eab12d357668', + 'geocoreLayerName': { 'en': 'Airborne Radioactivity' }, 'listOfLayerEntryConfig': [ { - 'layerId': 'dsm-hillshade', - 'layerName': { 'en': 'Map' }, - 'source': { - 'style': 'hillshade' - } + 'layerId': '0' } ] - }, + } + ] + }, + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'commem', + 'listOfLayerEntryConfig': [ { 'layerId': 'ccc75c12-5acc-4a6a-959f-ef6f621147b9', 'geocoreLayerName': { 'en': 'Commemorative Map' }, @@ -98,7 +101,13 @@

1. Many GeoCore Layers

'layerId': '0' } ] - }, + } + ] + }, + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'MWQ', + 'listOfLayerEntryConfig': [ { 'layerId': '0fca08b5-e9d0-414b-a3c4-092ff9c5e326', 'geocoreLayerName': { 'en': 'Marine Water Quality' }, @@ -107,8 +116,13 @@

1. Many GeoCore Layers

'layerId': '6' } ] - - }, + } + ] + }, + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'napl', + 'listOfLayerEntryConfig': [ { 'layerId': '03ccfb5c-a06e-43e3-80fd-09d4f8f69703', 'geocoreLayerName': { 'en': 'NAPL Temporal Series' }, @@ -160,65 +174,86 @@

2. GeoCore Layers - with footer bar

triggerReadyCallback="true" data-lang="en" data-config="{ - 'map': { - 'interaction': 'dynamic', - 'viewSettings': { - 'zoom': 4, - 'center': [-100, 60], - 'projection': 3978 + 'map': { + 'interaction': 'dynamic', + 'viewSettings': { + 'zoom': 4, + 'center': [-100, 60], + 'projection': 3978 + }, + 'basemapOptions': { + 'basemapId': 'transport', + 'shaded': false, + 'labeled': true + }, + 'listOfGeoviewLayerConfig': [ + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'airborneRad', + 'listOfLayerEntryConfig': [ + { + 'layerId': '21b821cf-0f1c-40ee-8925-eab12d357668', + 'geocoreLayerName': { 'en': 'Airborne Radioactivity' }, + 'listOfLayerEntryConfig': [ + { + 'layerId': '0' + } + ] + } + ] }, - 'basemapOptions': { - 'basemapId': 'transport', - 'shaded': false, - 'labeled': true + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'commem', + 'listOfLayerEntryConfig': [ + { + 'layerId': 'ccc75c12-5acc-4a6a-959f-ef6f621147b9', + 'geocoreLayerName': { 'en': 'Commemorative Map' }, + 'listOfLayerEntryConfig': [ + { + 'layerId': '0' + } + ] + } + ] }, - 'listOfGeoviewLayerConfig': [ - { - 'geoviewLayerType': 'geoCore', - 'listOfLayerEntryConfig': [ - { - 'layerId': 'ccc75c12-5acc-4a6a-959f-ef6f621147b9', - 'geocoreLayerName': { 'en': 'Commemorative Map' }, - 'listOfLayerEntryConfig': [ - { - 'layerId': '0' - } - ] - }, - { - 'layerId': '0fca08b5-e9d0-414b-a3c4-092ff9c5e326', - 'geocoreLayerName': { 'en': 'Marine Water Quality' }, - 'listOfLayerEntryConfig': [ - { - 'layerId': '6' - } - ] - - }, - { - 'layerId': '03ccfb5c-a06e-43e3-80fd-09d4f8f69703', - 'geocoreLayerName': { 'en': 'NAPL Temporal Series' }, - 'listOfLayerEntryConfig': [ - { - 'layerId': 'regina', - 'layerName': { 'en': 'Map of Regina' } - } - ] - } - ] - } - ] - }, - 'components': ['overview-map'], - 'footerBar': { - 'tabs': { - 'core': ['legend', 'layers', 'details', 'data-table'] + { + 'geoviewLayerType': 'geoCore', + 'geoviewLayerId': 'MWQ', + 'listOfLayerEntryConfig': [ + { + 'layerId': '0fca08b5-e9d0-414b-a3c4-092ff9c5e326', + 'geocoreLayerName': { 'en': 'Marine Water Quality' }, + 'listOfLayerEntryConfig': [ + { + 'layerId': '6' + } + ] + }, + { + 'layerId': '03ccfb5c-a06e-43e3-80fd-09d4f8f69703', + 'geocoreLayerName': { 'en': 'NAPL Temporal Series' }, + 'listOfLayerEntryConfig': [ + { + 'layerId': 'regina', + 'layerName': { 'en': 'Map of Regina' } + } + ] + } + ] } - }, - 'corePackages': [], - 'theme': 'geo.ca', - 'suportedLanguages': ['en'] - }" + ] + }, + 'components': ['overview-map'], + 'footerBar': { + 'tabs': { + 'core': ['legend', 'layers', 'details', 'data-table'] + } + }, + 'corePackages': [], + 'theme': 'geo.ca', + 'suportedLanguages': ['en'] + }" > diff --git a/packages/geoview-core/schema.json b/packages/geoview-core/schema.json index a96ecf9408c..86170f9c375 100644 --- a/packages/geoview-core/schema.json +++ b/packages/geoview-core/schema.json @@ -1110,7 +1110,7 @@ }, "required": ["schemaTag", "entryType", "layerId"] }, - "TypeGeocoreLayerEntryConfig": { + "TypeGeoCoreLayerEntryConfig": { "additionalProperties": false, "type": "object", "description": "Layer where configration is extracted by a configuration snippet stored on a server. The server configuration will handle bilangual informations.", @@ -1221,7 +1221,7 @@ "$ref": "#/definitions/TypeTileLayerEntryConfig" }, { - "$ref": "#/definitions/TypeGeocoreLayerEntryConfig" + "$ref": "#/definitions/TypeGeoCoreLayerEntryConfig" } ] }, @@ -1396,7 +1396,7 @@ "$ref": "#/definitions/TypeLayerGroupEntryConfig" }, { - "$ref": "#/definitions/TypeGeocoreLayerEntryConfig" + "$ref": "#/definitions/TypeGeoCoreLayerEntryConfig" } ] } diff --git a/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts b/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts index dbcdb0d70dc..947a228aa7a 100644 --- a/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts +++ b/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts @@ -416,15 +416,20 @@ export class MapEventProcessor extends AbstractEventProcessor { * * @param {string} mapId The ID of the map to add the layer to. * @param {TypeGeoviewLayerConfig} geoviewLayerConfig The config of the layer to add. + * @param {string} layerPathToReplace The layerPath of the info to replace. * @return {void} */ - static replaceOrderedLayerInfo(mapId: string, geoviewLayerConfig: TypeGeoviewLayerConfig | TypeLayerEntryConfig): void { + static replaceOrderedLayerInfo( + mapId: string, + geoviewLayerConfig: TypeGeoviewLayerConfig | TypeLayerEntryConfig, + layerPathToReplace?: string + ): void { const { orderedLayerInfo } = this.getMapStateProtected(mapId); const layerPath = (geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerId ? `${(geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerId}/${(geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerId}` : (geoviewLayerConfig as TypeLayerEntryConfig).layerPath; - const index = this.getMapIndexFromOrderedLayerInfo(mapId, layerPath); - const replacedLayers = orderedLayerInfo.filter((layerInfo) => layerInfo.layerPath.startsWith(layerPath)); + const index = this.getMapIndexFromOrderedLayerInfo(mapId, layerPathToReplace || layerPath); + const replacedLayers = orderedLayerInfo.filter((layerInfo) => layerInfo.layerPath.startsWith(layerPathToReplace || layerPath)); const newOrderedLayerInfo = api.maps[mapId].layer.generateArrayOfLayerOrderInfo(geoviewLayerConfig); orderedLayerInfo.splice(index, replacedLayers.length, ...newOrderedLayerInfo); this.setMapOrderedLayerInfo(mapId, orderedLayerInfo); diff --git a/packages/geoview-core/src/core/components/layers/hooks/helpers.ts b/packages/geoview-core/src/core/components/layers/hooks/helpers.ts index 165edb9c154..bb96586bc0f 100644 --- a/packages/geoview-core/src/core/components/layers/hooks/helpers.ts +++ b/packages/geoview-core/src/core/components/layers/hooks/helpers.ts @@ -1,3 +1,4 @@ +// TODO Remove when no longer needed import _ from 'lodash'; import { TypeVectorLayerStyles } from '@/geo/layer/geoview-layers/abstract-geoview-layers'; import { api } from '@/app'; 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 9a483d1f75c..63943c59c53 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 @@ -415,11 +415,11 @@ export function AddNewLayer(): JSX.Element { const geoCoreGeoviewLayerInstance = new GeoCore(mapId); const layers = await geoCoreGeoviewLayerInstance.createLayersFromUUID(layerURL); if (layers.length === 1) { - if (layers[0].length === 1) { - setLayerName(layers[0][0].geoviewLayerName!.en! as string); - setLayerEntries(layers[0]); + if (layers.length === 1) { + setLayerName(layers[0].geoviewLayerName!.en! as string); + setLayerEntries(layers); } else { - setLayerList(layers[0]); + setLayerList(layers); } } } catch (err) { diff --git a/packages/geoview-core/src/geo/layer/geoview-layers/abstract-geoview-layers.ts b/packages/geoview-core/src/geo/layer/geoview-layers/abstract-geoview-layers.ts index 4b4fbd25768..1bbb7e3fc8a 100644 --- a/packages/geoview-core/src/geo/layer/geoview-layers/abstract-geoview-layers.ts +++ b/packages/geoview-core/src/geo/layer/geoview-layers/abstract-geoview-layers.ts @@ -249,7 +249,7 @@ export const CONST_GEOVIEW_SCHEMA_BY_TYPE: Record esriFeature: 'TypeVectorLayerEntryConfig', esriImage: 'TypeEsriImageLayerEntryConfig', GeoJSON: 'TypeVectorLayerEntryConfig', - geoCore: 'TypeGeocoreLayerEntryConfig', + geoCore: 'TypeGeoCoreLayerEntryConfig', GeoPackage: 'TypeVectorLayerEntryConfig', xyzTiles: 'TypeTileLayerEntryConfig', vectorTiles: 'TypeTileLayerEntryConfig', diff --git a/packages/geoview-core/src/geo/layer/layer.ts b/packages/geoview-core/src/geo/layer/layer.ts index 52862d680fe..42fc30201fa 100644 --- a/packages/geoview-core/src/geo/layer/layer.ts +++ b/packages/geoview-core/src/geo/layer/layer.ts @@ -9,7 +9,7 @@ import { EVENT_NAMES } from '@/api/events/event-types'; import { MapEventProcessor } from '@/api/event-processors/event-processor-children/map-event-processor'; import { Config } from '@/core/utils/config/config'; -import { generateId, showError, replaceParams, getLocalizedMessage, whenThisThen } from '@/core/utils/utilities'; +import { generateId, showError, replaceParams, getLocalizedMessage, whenThisThen, addNotificationError } from '@/core/utils/utilities'; import { layerConfigPayload, payloadIsALayerConfig, @@ -21,6 +21,7 @@ import { AbstractGeoViewLayer } from '@/geo/layer/geoview-layers/abstract-geovie import { TypeGeoviewLayerConfig, TypeLayerEntryConfig, + TypeListOfGeoviewLayerConfig, TypeListOfLocalizedLanguages, layerEntryIsGroupLayer, } from '@/geo/map/map-schema-types'; @@ -100,11 +101,9 @@ export class Layer { if (layerConfigIsGeoCore(layerConfig)) { const geoCore = new GeoCore(this.mapId); - geoCore.createLayers(layerConfig).then((arrayOfListOfGeoviewLayerConfig) => { - arrayOfListOfGeoviewLayerConfig.forEach((listOfGeoviewLayerConfig) => { - listOfGeoviewLayerConfig.forEach((geoviewLayerConfig) => { - this.addGeoviewLayer(geoviewLayerConfig); - }); + geoCore.createLayers(layerConfig).then((listOfGeoviewLayerConfig: TypeListOfGeoviewLayerConfig) => { + listOfGeoviewLayerConfig.forEach((geoviewLayerConfig) => { + this.addGeoviewLayer(geoviewLayerConfig); }); }); } else if (layerConfigIsGeoJSON(layerConfig)) { @@ -202,9 +201,23 @@ export class Layer { * @returns {TypeOrderedLayerInfo[]} The array of ordered layer info. */ generateArrayOfLayerOrderInfo(geoviewLayerConfig: TypeGeoviewLayerConfig | TypeLayerEntryConfig): TypeOrderedLayerInfo[] { - // TODO Add placeholder for geocore and the replacement when the layer is created in geocore.ts - if ((geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerType === 'geoCore') return []; - const newOrderedLayerInfos = []; + const newOrderedLayerInfos: TypeOrderedLayerInfo[] = []; + + if ((geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerType === 'geoCore') { + geoviewLayerConfig.listOfLayerEntryConfig?.forEach((layerEntryConfig) => { + const layerInfo: TypeOrderedLayerInfo = { + layerPath: layerEntryConfig.layerId, + alwaysVisible: false, + visible: true, + removable: true, + queryable: true, + hoverable: true, + }; + newOrderedLayerInfos.push(layerInfo); + }); + return newOrderedLayerInfos; + } + const addSubLayerPathToLayerOrder = (layerEntryConfig: TypeLayerEntryConfig, layerPath: string): void => { const subLayerPath = layerPath.endsWith(layerEntryConfig.layerId) ? layerPath : `${layerPath}/${layerEntryConfig.layerId}`; const layerInfo: TypeOrderedLayerInfo = { @@ -222,6 +235,7 @@ export class Layer { }); } }; + if ((geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerId) { if ((geoviewLayerConfig as TypeGeoviewLayerConfig).listOfLayerEntryConfig.length > 1) { const layerPath = `${(geoviewLayerConfig as TypeGeoviewLayerConfig).geoviewLayerId}/${ @@ -257,10 +271,15 @@ export class Layer { // set order for layers to appear on the map according to config const orderedLayerInfos: TypeOrderedLayerInfo[] = []; validGeoviewLayerConfigs.forEach((geoviewLayerConfig) => { - const layerInfos = this.generateArrayOfLayerOrderInfo(geoviewLayerConfig); - orderedLayerInfos.push(...layerInfos); + if (layerConfigIsGeoCore(geoviewLayerConfig) && geoviewLayerConfig.listOfLayerEntryConfig.length > 1) { + logger.logError('GeoCore layers may only have one GeoCore UUID per layer'); + addNotificationError(this.mapId, getLocalizedMessage(this.mapId, 'validation.layer.multipleUUID')); + } else { + const layerInfos = this.generateArrayOfLayerOrderInfo(geoviewLayerConfig); + orderedLayerInfos.push(...layerInfos); - api.event.emit(layerConfigPayload(EVENT_NAMES.LAYER.EVENT_ADD_LAYER, this.mapId, geoviewLayerConfig)); + api.event.emit(layerConfigPayload(EVENT_NAMES.LAYER.EVENT_ADD_LAYER, this.mapId, geoviewLayerConfig)); + } }); MapEventProcessor.setMapOrderedLayerInfo(this.mapId, orderedLayerInfos); } @@ -442,7 +461,7 @@ export class Layer { addGeoviewLayerByGeoCoreUUID = async (uuid: string): Promise => { const geoCoreGeoviewLayerInstance = new GeoCore(this.mapId); const layers = await geoCoreGeoviewLayerInstance.createLayersFromUUID(uuid); - layers[0].forEach((geoviewLayerConfig) => { + layers.forEach((geoviewLayerConfig) => { api.maps[this.mapId].layer.addGeoviewLayer(geoviewLayerConfig); }); }; diff --git a/packages/geoview-core/src/geo/layer/other/geocore.ts b/packages/geoview-core/src/geo/layer/other/geocore.ts index 78046d5483a..96d49c4f9c8 100644 --- a/packages/geoview-core/src/geo/layer/other/geocore.ts +++ b/packages/geoview-core/src/geo/layer/other/geocore.ts @@ -10,7 +10,7 @@ import { MapEventProcessor } from '@/api/event-processors/event-processor-childr import { TypeLayerEntryConfig, TypeGeoviewLayerConfig, - TypeGeocoreLayerEntryConfig, + TypeGeoCoreLayerEntryConfig, TypeListOfGeoviewLayerConfig, TypeLocalizedString, layerEntryIsGroupLayer, @@ -21,11 +21,11 @@ import { CONST_LAYER_TYPES, TypeGeoviewLayerType } from '../geoview-layers/abstr export interface TypeGeoCoreLayerConfig extends Omit { geoviewLayerType: 'geoCore'; - listOfLayerEntryConfig: TypeGeocoreLayerEntryConfig[]; + listOfLayerEntryConfig: TypeGeoCoreLayerEntryConfig[]; } /** ***************************************************************************************************************************** - * type guard function that redefines a TypeLayerEntryConfig as a TypeGeocoreLayerEntryConfig if the geoviewLayerType attribute of + * type guard function that redefines a TypeLayerEntryConfig as a TypeGeoCoreLayerEntryConfig if the geoviewLayerType attribute of * the verifyIfGeoViewEntry.geoviewLayerConfig attribute is GEOCORE. The type ascention applies only to the true block of the if * clause that use this function. * @@ -34,7 +34,7 @@ export interface TypeGeoCoreLayerConfig extends Omit { +export const geoviewEntryIsGeoCore = (verifyIfGeoViewEntry: TypeLayerEntryConfig): verifyIfGeoViewEntry is TypeGeoCoreLayerEntryConfig => { return verifyIfGeoViewEntry?.geoviewLayerConfig?.geoviewLayerType === CONST_LAYER_TYPES.GEOCORE; }; @@ -81,12 +81,12 @@ export class GeoCore { geoviewLayerId: generateId(), geoviewLayerType: 'geoCore', listOfLayerEntryConfig: [ - new TypeGeocoreLayerEntryConfig({ + new TypeGeoCoreLayerEntryConfig({ schemaTag: 'geoCore' as TypeGeoviewLayerType, entryType: 'geoCore' as TypeLayerEntryType, layerId: uuid, - } as TypeGeocoreLayerEntryConfig), - ] as TypeGeocoreLayerEntryConfig[], + } as TypeGeoCoreLayerEntryConfig), + ] as TypeGeoCoreLayerEntryConfig[], } as TypeGeoCoreLayerConfig; } @@ -96,7 +96,7 @@ export class GeoCore { * @param {string} uuid the given uuid to build the Geocore Layer Config with * @returns {Promise} the GeoCore Layer Config promise */ - createLayersFromUUID(uuid: string): Promise { + createLayersFromUUID(uuid: string): Promise { // Create the config const geocoreConfig = GeoCore.buildGeocoreLayerConfigFromUUID(uuid); @@ -107,65 +107,58 @@ export class GeoCore { /** * Gets GeoView layer configurations list from the UUIDs of the list of layer entry configurations. * - * @param {TypeGeocoreLayerEntryConfig} geocoreLayerConfig the layer configuration + * @param {TypeGeoCoreLayerEntryConfig} geocoreLayerConfig the layer configuration * @returns {Promise} list of layer configurations to add to the map */ - async createLayers(geocoreLayerConfig: TypeGeoCoreLayerConfig): Promise { + async createLayers(geocoreLayerConfig: TypeGeoCoreLayerConfig): Promise { // Get the map config const mapConfig = MapEventProcessor.getGeoViewMapConfig(this.mapId); - // For each layer entry config in the list - const listOfLayerCreated: TypeListOfGeoviewLayerConfig[] = []; - for (let i = 0; i < geocoreLayerConfig.listOfLayerEntryConfig.length; i++) { - // Get the config - const layerConfig = geocoreLayerConfig.listOfLayerEntryConfig[i]; - - // Get the language - const lang = api.maps[this.mapId].getDisplayLanguage(); - - // Generate the url using metadataAccessPath when specified or using the geocore url - const url = geocoreLayerConfig.metadataAccessPath?.[lang] || `${mapConfig!.serviceUrls.geocoreUrl}`; - const uuid = layerConfig.layerId; - - try { - // Get the GV config from UUID and await even if within loop - // eslint-disable-next-line no-await-in-loop - const response = await UUIDmapConfigReader.getGVConfigFromUUIDs(url, lang, [uuid]); - - // Cumulate - listOfLayerCreated.push(response.layers); - - // For each found layer associated with the Geocore UUIDs - response.layers.forEach((geoviewLayerConfig) => { - this.copyConfigSettingsOverGeocoreSettings(layerConfig, geoviewLayerConfig); - }); - this.configValidation.validateListOfGeoviewLayerConfig(AppEventProcessor.getSupportedLanguages(this.mapId), response.layers); - - // For each found geochart associated with the Geocore UUIDs - response.geocharts?.forEach((geochartConfig) => { - // Add a GeoChart - GeochartEventProcessor.addGeochartChart(this.mapId, geochartConfig.layers[0].layerId as string, geochartConfig); - }); - } catch (error) { - // Log - logger.logError(`Failed to get the GeoView layer from UUI ${uuid}`, error); - const message = replaceParams([error as TypeJsonValue, this.mapId], getLocalizedMessage(this.mapId, 'validation.layer.loadfailed')); - showError(this.mapId, message); - } + // Get the config + const layerConfig = geocoreLayerConfig.listOfLayerEntryConfig[0]; + + // Get the language + const lang = api.maps[this.mapId].getDisplayLanguage(); + + // Generate the url using metadataAccessPath when specified or using the geocore url + const url = geocoreLayerConfig.metadataAccessPath?.[lang] || `${mapConfig!.serviceUrls.geocoreUrl}`; + const uuid = layerConfig.layerId; + + try { + // Get the GV config from UUID and await even if within loop + // eslint-disable-next-line no-await-in-loop + const response = await UUIDmapConfigReader.getGVConfigFromUUIDs(url, lang, [uuid]); + + // For each found layer associated with the Geocore UUIDs + response.layers.forEach((geoviewLayerConfig) => { + this.copyConfigSettingsOverGeocoreSettings(layerConfig, geoviewLayerConfig); + }); + this.configValidation.validateListOfGeoviewLayerConfig(AppEventProcessor.getSupportedLanguages(this.mapId), response.layers); + + // For each found geochart associated with the Geocore UUIDs + response.geocharts?.forEach((geochartConfig) => { + // Add a GeoChart + GeochartEventProcessor.addGeochartChart(this.mapId, geochartConfig.layers[0].layerId as string, geochartConfig); + }); + + return response.layers; + } catch (error) { + // Log + logger.logError(`Failed to get the GeoView layer from UUI ${uuid}`, error); + const message = replaceParams([error as TypeJsonValue, this.mapId], getLocalizedMessage(this.mapId, 'validation.layer.loadfailed')); + showError(this.mapId, message); } - - // Return the created layers - return listOfLayerCreated; + return Promise.resolve([]); } /** * Copies the config settings over the geocore values (config values have priority). * - * @param {TypeGeocoreLayerEntryConfig} geocoreLayerEntryConfig The config file settings + * @param {TypeGeoCoreLayerEntryConfig} geocoreLayerEntryConfig The config file settings * @param {TypeGeoviewLayerConfig} geoviewLayerConfig The settings returned by the geocore service */ private copyConfigSettingsOverGeocoreSettings( - geocoreLayerEntryConfig: TypeGeocoreLayerEntryConfig, + geocoreLayerEntryConfig: TypeGeoCoreLayerEntryConfig, geoviewLayerConfig: TypeGeoviewLayerConfig ) { if (geocoreLayerEntryConfig.geocoreLayerName) 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 5c9c44bb9f6..4ef6ddb67ce 100644 --- a/packages/geoview-core/src/geo/map/map-schema-types.ts +++ b/packages/geoview-core/src/geo/map/map-schema-types.ts @@ -611,7 +611,7 @@ export const layerEntryIsRasterTile = (verifyIfLayer: TypeLayerEntryConfig): ver }; /** ****************************************************************************************************************************** - * type guard function that redefines a TypeLayerEntryConfig as a TypeGeocoreLayerEntryConfig if the entryType attribute of + * type guard function that redefines a TypeLayerEntryConfig as a TypeGeoCoreLayerEntryConfig if the entryType attribute of * the verifyIfLayer parameter is 'geocore'. The type ascention applies only to the true block of the if clause that use * this function. * @@ -619,7 +619,7 @@ export const layerEntryIsRasterTile = (verifyIfLayer: TypeLayerEntryConfig): ver * * @returns {boolean} true if the type ascention is valid. */ -export const layerEntryIsGeocore = (verifyIfLayer: TypeLayerEntryConfig): verifyIfLayer is TypeGeocoreLayerEntryConfig => { +export const layerEntryIsGeocore = (verifyIfLayer: TypeLayerEntryConfig): verifyIfLayer is TypeGeoCoreLayerEntryConfig => { return verifyIfLayer?.entryType === ('geoCore' as TypeLayerEntryType); }; @@ -1318,7 +1318,7 @@ export class TypeTileLayerEntryConfig extends TypeBaseLayerEntryConfig { * Type used to define a GeoView layer where configration is extracted by a configuration snippet stored on a server. The server * configuration will handle bilangual informations. */ -export class TypeGeocoreLayerEntryConfig extends ConfigBaseClass { +export class TypeGeoCoreLayerEntryConfig extends ConfigBaseClass { /** This attribute from ConfigBaseClass is not used by groups. */ declare layerStatus: never; @@ -1357,9 +1357,9 @@ export class TypeGeocoreLayerEntryConfig extends ConfigBaseClass { /** * The class constructor. - * @param {TypeGeocoreLayerEntryConfig} layerConfig The layer configuration we want to instanciate. + * @param {TypeGeoCoreLayerEntryConfig} layerConfig The layer configuration we want to instanciate. */ - constructor(layerConfig: TypeGeocoreLayerEntryConfig) { + constructor(layerConfig: TypeGeoCoreLayerEntryConfig) { super(layerConfig); Object.assign(this, layerConfig); } @@ -1476,7 +1476,7 @@ export type TypeLayerEntryConfig = | TypeImageStaticLayerEntryConfig | TypeTileLayerEntryConfig | TypeLayerGroupEntryConfig - | TypeGeocoreLayerEntryConfig; + | TypeGeoCoreLayerEntryConfig; /** ****************************************************************************************************************************** * List of layers. Corresponds to the layerList defined in the schema. diff --git a/packages/geoview-core/src/geo/utils/layer-set.ts b/packages/geoview-core/src/geo/utils/layer-set.ts index 1c083a61717..d5726aec07b 100644 --- a/packages/geoview-core/src/geo/utils/layer-set.ts +++ b/packages/geoview-core/src/geo/utils/layer-set.ts @@ -136,7 +136,9 @@ export class LayerSet { api.event.emit( LayerSetPayload.createLayerSetUpdatedPayload(`${mapId}/LegendsLayerSetStatusChanged`, this.resultsSet, layerPath) ); - if (MapEventProcessor.getMapIndexFromOrderedLayerInfo(this.mapId, layerPath) === -1) { + if (MapEventProcessor.getMapIndexFromOrderedLayerInfo(this.mapId, layerPath.split('.')[1]) !== -1) { + MapEventProcessor.replaceOrderedLayerInfo(this.mapId, layerConfig, layerPath.split('.')[1]); + } else if (MapEventProcessor.getMapIndexFromOrderedLayerInfo(this.mapId, layerPath) === -1) { if (layerConfig.parentLayerConfig) { const parentLayerPathArray = layerPath.split('/'); parentLayerPathArray.pop();