From 094a67296f6c67f2572165dcb12728956663eef3 Mon Sep 17 00:00:00 2001 From: Mohamed Hamou Date: Tue, 25 Jun 2024 17:50:24 +0200 Subject: [PATCH 1/2] Update configuration using FGA base on each collection --- .../configurationUpdater.service.ts | 195 ++++++++++++------ .../services/startup/contributorBuilder.ts | 21 ++ .../lib/services/startup/startup.service.ts | 25 +-- .../tools/contributors/contributor-utils.ts | 0 4 files changed, 167 insertions(+), 74 deletions(-) create mode 100644 projects/arlas-toolkit/src/lib/tools/contributors/contributor-utils.ts diff --git a/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts b/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts index 45ba2f85..bb1ccc4f 100644 --- a/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts +++ b/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts @@ -18,7 +18,7 @@ */ import { Aggregation } from 'arlas-api'; -import { LayerSourceConfig } from 'arlas-web-contributors'; +import { FieldsConfiguration, LayerSourceConfig } from 'arlas-web-contributors'; import { VisualisationSetConfig } from 'arlas-web-components'; export class ArlasConfigurationUpdaterService { @@ -29,37 +29,23 @@ export class ArlasConfigurationUpdaterService { /** * Parses the configuration and returns a list of contributors that should be removed from the config. * @param data configuration object - * @param availableFields list of fields available for exploration + * @param availableFieldsPerCollection list of fields available for exploration for each collection. * @returns configuration object */ - public getContributorsToRemove(data, availableFields: Set): Set { + public getContributorsToRemove(data, availableFieldsPerCollection: Map>): Set { const contributorsToRemove = new Set(); if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { /** the conf is validated before; therefore, `arlas.web.contributors` is defined */ data.arlas.web.contributors.forEach(contributor => { - /** check if aggregation model has a non-available field (in bucket aggregation AND metrics) */ - if (contributor.aggregationmodels) { - contributor.aggregationmodels.forEach((am: Aggregation) => { - if (!availableFields.has(am.field)) { - contributorsToRemove.add(contributor.identifier); - } - if (am.metrics) { - am.metrics.forEach(m => { - if (!availableFields.has(m.collect_field)) { - contributorsToRemove.add(contributor.identifier); - } - }); - } - }); - } - /** Compute contributors have metrics */ - if (contributor.metrics && contributor.metrics.find(m => !availableFields.has(m.field) && m.metric !== 'count')) { + /** Remove contributors which collection is not available. */ + if (contributor.collection && !availableFieldsPerCollection.has(contributor.collection)) { contributorsToRemove.add(contributor.identifier); } - /** swimlanes contributors have a specific structure for `aggregationmodels` */ - if (contributor.swimlanes) { - contributor.swimlanes.forEach(swimlane => { - swimlane.aggregationmodels.forEach((am: Aggregation) => { + /** check if aggregation model has a non-available field (in bucket aggregation AND metrics) */ + if (contributor.aggregationmodels) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection) ) { + const availableFields = availableFieldsPerCollection.get(contributor.collection); + contributor.aggregationmodels.forEach((am: Aggregation) => { if (!availableFields.has(am.field)) { contributorsToRemove.add(contributor.identifier); } @@ -71,19 +57,71 @@ export class ArlasConfigurationUpdaterService { }); } }); - /** swimlanes don't have xAxisField AND termField anymore */ - }); + } else { + /** The contributor.collection is always defined. However this code is added to secure the case where it could happen. + * In that case, the contributor is removed. + */ + contributorsToRemove.add(contributor.identifier); + } + } + /** Compute contributors have metrics */ + if (contributor.type === 'compute' && contributor.metrics) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { + const availableFields = availableFieldsPerCollection.get(contributor.collection); + if (contributor.metrics.find(m => !availableFields.has(m.field) && m.metric !== 'count')) { + contributorsToRemove.add(contributor.identifier); + } + } else { + contributorsToRemove.add(contributor.identifier); + } + } + /** swimlanes contributors have a specific structure for `aggregationmodels` */ + if (contributor.type === 'swimlane' && contributor.swimlanes) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { + const availableFields = availableFieldsPerCollection.get(contributor.collection); + contributor.swimlanes.forEach(swimlane => { + swimlane.aggregationmodels.forEach((am: Aggregation) => { + if (!availableFields.has(am.field)) { + contributorsToRemove.add(contributor.identifier); + } + if (am.metrics) { + am.metrics.forEach(m => { + if (!availableFields.has(m.collect_field)) { + contributorsToRemove.add(contributor.identifier); + } + }); + } + }); + /** swimlanes don't have xAxisField AND termField anymore */ + }); + } else { + contributorsToRemove.add(contributor.identifier); + } } /** chipssearch contributor */ - if (contributor.search_field && !availableFields.has(contributor.search_field)) { - contributorsToRemove.add(contributor.identifier); + if (contributor.type = 'chipssearch' && contributor.search_field) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { + const availableFields = availableFieldsPerCollection.get(contributor.collection); + if (!availableFields.has(contributor.search_field)) { + contributorsToRemove.add(contributor.identifier); + } + } else { + contributorsToRemove.add(contributor.identifier); + } } /** resultlist contributor */ - if (contributor.fieldsConfiguration && contributor.fieldsConfiguration.idFieldName - && !availableFields.has(contributor.fieldsConfiguration.idFieldName)) { - contributorsToRemove.add(contributor.identifier); + if (contributor.type = 'resultlist' && contributor.fieldsConfiguration) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { + const availableFields = availableFieldsPerCollection.get(contributor.collection); + if (contributor.fieldsConfiguration.idFieldName + && !availableFields.has(contributor.fieldsConfiguration.idFieldName)) { + contributorsToRemove.add(contributor.identifier); + } + } else { + contributorsToRemove.add(contributor.identifier); + } } }); /** remove detailed contributors */ @@ -92,7 +130,12 @@ export class ArlasConfigurationUpdaterService { contributorsToRemove.add(contributor.identifier); } }); - + /** remove shortcuts contributors */ + data.arlas.web.contributors.filter(contributor => contributor.linkedContributorId).forEach(contributor => { + if (contributorsToRemove.has(contributor.linkedContributorId)) { + contributorsToRemove.add(contributor.identifier); + } + }); } return contributorsToRemove; } @@ -156,30 +199,28 @@ export class ArlasConfigurationUpdaterService { /** * Removes the properties -from all contributors- including fields that are not available for exploration * @param data configuration object - * @param availableFields List of available fields for exploration + * @param availableFieldsPerCollection List of available fields for exploration * @returns configuration object */ - public updateContributors(data, availableFields: Set): any { - let updatedConfig = this.updateResultListContributor(data, availableFields); - updatedConfig = this.updateMapContributors(updatedConfig, availableFields); - updatedConfig = this.updateChipSearchContributors(updatedConfig, availableFields); + public updateContributors(data, availableFieldsPerCollection: Map>): any { + let updatedConfig = this.updateResultListContributors(data, availableFieldsPerCollection); + updatedConfig = this.updateMapContributors(updatedConfig, availableFieldsPerCollection); + updatedConfig = this.updateHistogramContributors(updatedConfig, availableFieldsPerCollection); + updatedConfig = this.updateChipSearchContributors(updatedConfig, availableFieldsPerCollection); return updatedConfig; } /** * Removes the properties -from map component - including fields that are not available for exploration * @param data configuration object - * @param availableFields List of available fields for exploration + * @param availableFieldsPerCollection List of available fields for exploration for each collection. * @returns configuration object */ - public updateMapComponent(data, availableFields: Set): any { + public updateMapComponent(data, availableFieldsPerCollection: Map>): any { if (data && data.arlas && data.arlas.web && data.arlas.web.components) { const mapComponentConfig = data.arlas.web.components.mapgl; if (mapComponentConfig && mapComponentConfig.input) { - const idFeatureField = mapComponentConfig.input.idFieldName; - if (idFeatureField && !availableFields.has(idFeatureField)) { - delete mapComponentConfig.input.idFieldName; - } + /** idFieldName is no longer used !! */ const layerSources = data.arlas.web.contributors.filter(contributor => contributor.type === 'map') .map(l => l.layers_sources).reduce((l1, l2) => new Array(...l1, ...l2)); /** remove layers from visualisation sets if their correponding source is removed from the contributor */ @@ -205,24 +246,16 @@ export class ArlasConfigurationUpdaterService { /** * Removes the properties -from ResultListContributor- that define fields not available for exploration * @param data configuration object - * @param availableFields List of available fields for exploration + * @param availableFieldsPerCollection List of available fields for exploration for each collection. * @returns configuration object */ - public updateResultListContributor(data, availableFields: Set): any { + public updateResultListContributors(data, availableFieldsPerCollection: Map>): any { if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { data.arlas.web.contributors.filter(contributor => contributor.type === 'resultlist').forEach(contributor => { + const availableFields = availableFieldsPerCollection.get(contributor.collection); if (contributor.fieldsConfiguration) { - const fc = contributor.fieldsConfiguration; - /** remove imageFieldName */ - if (fc.imageFieldName && !availableFields.has(fc.imageFieldName)) { - delete fc.imageFieldName; - delete fc.urlImageTemplate; - } - /** remove thumbnailFieldName */ - if (fc.thumbnailFieldName && !availableFields.has(fc.thumbnailFieldName)) { - delete fc.thumbnailFieldName; - delete fc.urlThumbnailTemplate; - } + const fc = contributor.fieldsConfiguration as FieldsConfiguration; + /** imageFieldName && urlImageTemplate were removed in v20.x.x*/ /** remove urlImageTemplate */ if (fc.urlImageTemplate) { const url = fc.urlImageTemplate; @@ -231,10 +264,22 @@ export class ArlasConfigurationUpdaterService { url.lastIndexOf('}') ); if (eventualField && eventualField.length > 0 && !availableFields.has(eventualField)) { - delete fc.imageEnabled; delete fc.urlImageTemplate; } } + /** remove urlImageTemplates */ + if (fc.urlImageTemplates) { + fc.urlImageTemplates = fc.urlImageTemplates.filter(urlImageTemplate => { + const url = urlImageTemplate.url; + const eventualField = url.substring( + url.lastIndexOf('{') + 1, + url.lastIndexOf('}') + ); + const isEventualFieldToRemove = eventualField && eventualField.length > 0 && !availableFields.has(eventualField); + const hasFieldToRemove = urlImageTemplate.filter?.field && !availableFields.has(urlImageTemplate.filter?.field); + return !isEventualFieldToRemove && !hasFieldToRemove; + }); + } /** remove urlThumbnailTemplate */ if (fc.urlThumbnailTemplate) { const url = fc.urlThumbnailTemplate; @@ -243,7 +288,6 @@ export class ArlasConfigurationUpdaterService { url.lastIndexOf('}') ); if (eventualField && eventualField.length > 0 && !availableFields.has(eventualField)) { - delete fc.thumbnailEnabled; delete fc.urlThumbnailTemplate; } } @@ -291,15 +335,41 @@ export class ArlasConfigurationUpdaterService { return data; } + /** + * Removes the properties -from ResultListContributor- that define fields not available for exploration + * @param data configuration object + * @param availableFieldsPerCollection List of available fields for exploration for each collection. + * @returns configuration object + */ + public updateHistogramContributors(data, availableFieldsPerCollection: Map>): any { + if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { + data.arlas.web.contributors.filter(contributor => contributor.type === 'histogram').forEach(contributor => { + if (contributor.additionalCollections) { + contributor.additionalCollections = contributor.additionalCollections.filter(ac =>{ + const availableFields = availableFieldsPerCollection.get(contributor.collection); + const hasCollection = availableFieldsPerCollection.has(contributor.collection); + const hasField = hasCollection && availableFields.has(ac.field); + return hasField; + }); + } + }); + } + return data; + } + + + + /** * Removes the properties -from MapConributor- that define fields not available for exploration * @param data configuration object - * @param availableFields List of available fields for exploration + * @param availableFieldsPerCollection List of available fields for exploration for each collection. * @returns configuration object */ - public updateMapContributors(data, availableFields: Set): any { + public updateMapContributors(data, availableFieldsPerCollection: Map>): any { if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { data.arlas.web.contributors.filter(contributor => contributor.type === 'map').forEach(contributor => { + const availableFields = availableFieldsPerCollection.get(contributor.collection); if (contributor.layers_sources) { const updatedLayersSources: Array = []; contributor.layers_sources.forEach((ls: LayerSourceConfig) => { @@ -363,12 +433,13 @@ export class ArlasConfigurationUpdaterService { /** * Removes the properties -from ChipsearchContributor- that define fields not available for exploration * @param data configuration object - * @param availableFields List of available fields for exploration + * @param availableFieldsPerCollection List of available fields for exploration for each collection. * @returns configuration object */ - public updateChipSearchContributors(data, availableFields: Set): any { + public updateChipSearchContributors(data, availableFieldsPerCollection: Map>): any { if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { data.arlas.web.contributors.filter(contributor => contributor.type === 'chipssearch').forEach(contributor => { + const availableFields = availableFieldsPerCollection.get(contributor.collection); if (contributor.autocomplete_field && !availableFields.has(contributor.autocomplete_field)) { delete contributor.autocomplete_field; } diff --git a/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts b/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts index dd602d7d..8dc589b0 100644 --- a/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts +++ b/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts @@ -113,4 +113,25 @@ export class ContributorBuilder { contributor.updateData = false; return contributor; } + + /** Returns all the collections that are configured in each type of contributor. */ + public static getCollections(contributorsConfig: any[]): Set { + const collections = new Set(); + contributorsConfig.forEach(contributor => { + if (contributor.collection) { + collections.add(contributor.collection); + } + /** For histograms, multi-collection is possible. We need to check the 'additionalCollections' attribute.*/ + if (contributor.type === 'histogram') { + if (contributor.additionalCollections && Array.isArray(contributor.additionalCollections)) { + contributor.additionalCollections.forEach(ac => { + collections.add(ac.collectionName); + }); + } + } + }); + + return collections; + } } + diff --git a/projects/arlas-toolkit/src/lib/services/startup/startup.service.ts b/projects/arlas-toolkit/src/lib/services/startup/startup.service.ts index 2cfe7fce..4bf832f0 100644 --- a/projects/arlas-toolkit/src/lib/services/startup/startup.service.ts +++ b/projects/arlas-toolkit/src/lib/services/startup/startup.service.ts @@ -294,7 +294,7 @@ export class ArlasStartupService { public validateSettings(settings) { return new Promise((resolve, reject) => { - const ajvObj = new Ajv({allowUnionTypes:true}); + const ajvObj = new Ajv({ allowUnionTypes: true }); ajvKeywords(ajvObj, 'uniqueItemProperties'); const validateConfig = ajvObj .addMetaSchema(draftSchema.default) @@ -314,7 +314,7 @@ export class ArlasStartupService { public validateConfiguration(data) { return new Promise((resolve, reject) => { - const ajvObj = new Ajv({allowUnionTypes:true}); + const ajvObj = new Ajv({ allowUnionTypes: true }); ajvKeywords(ajvObj, 'uniqueItemProperties'); const validateConfig = ajvObj .addMetaSchema(draftSchema.default) @@ -401,7 +401,7 @@ export class ArlasStartupService { * @param availableFields list of fields that are available for exploration * @returns the updated configuration object */ - public updateConfiguration(data, availableFields: Set): any { + public updateConfiguration(data, availableFields: Map>): any { if (!this.emptyMode) { const contributorsToRemove: Set = this.configurationUpdaterService.getContributorsToRemove(data, availableFields); let updatedConfig = this.configurationUpdaterService.removeContributors(data, contributorsToRemove); @@ -422,11 +422,10 @@ export class ArlasStartupService { public applyFGA(data) { if (!this.emptyMode) { const defaultCollection = this.configService.getValue('arlas.server.collection.name'); - const collectionNames: Set = new Set(this.configService.getValue('arlas.web.contributors') - .map(c => (c.collection as string))); + const collectionNames: Set = ContributorBuilder.getCollections(this.configService.getValue('arlas.web.contributors')); collectionNames.add(defaultCollection); return this.listAvailableFields(collectionNames) - .then((availableFields: Set) => this.updateConfiguration(data[0], availableFields)) + .then((availableFieldsPerCollection: Map>) => this.updateConfiguration(data[0], availableFieldsPerCollection)) .then((d) => { this.configService.setConfig(d); return d; @@ -751,17 +750,18 @@ export class ArlasStartupService { } } /** - * Lists the fields of `collectionName` that are available for exploration with `arlasExploreApi` - * @param collectionName collection name - * @returns available fields + * Lists the fields for each collection in `collectionNames` list; that are available for exploration with `arlasExploreApi` + * @param collectionNames collection names + * @returns available fields per collection */ - public listAvailableFields(collectionNames: Set): Promise> { - const availableFields = new Set(); + public listAvailableFields(collectionNames: Set): Promise>> { + const availableFieldsPerCollection = new Map>(); const hiddenAvailableFields = []; return this.collaborativesearchService.list().toPromise().then( (collectionDescriptions: Array) => { collectionDescriptions.filter((cd: CollectionReferenceDescription) => collectionNames.has(cd.collection_name)) .forEach((cd: CollectionReferenceDescription) => { + const availableFields = new Set(); getFieldProperties(cd.properties).map(p => { if (p.type === 'GEO_POINT') { hiddenAvailableFields.push(p.label + '.lon'); @@ -774,8 +774,9 @@ export class ArlasStartupService { availableFields.add(cd.params.geometry_path); availableFields.add(cd.params.centroid_path); hiddenAvailableFields.forEach(f => availableFields.add(f)); + availableFieldsPerCollection.set(cd.collection_name, availableFields); }); - return availableFields; + return availableFieldsPerCollection; }); } diff --git a/projects/arlas-toolkit/src/lib/tools/contributors/contributor-utils.ts b/projects/arlas-toolkit/src/lib/tools/contributors/contributor-utils.ts new file mode 100644 index 00000000..e69de29b From 2cb991bec15757ddd2d97e6d853f6dddc4ac8370 Mon Sep 17 00:00:00 2001 From: Mohamed Hamou Date: Wed, 26 Jun 2024 15:33:00 +0200 Subject: [PATCH 2/2] Fix fga when no collection is available --- .../filter-shortcut.component.html | 2 +- .../filter-shortcut.component.ts | 8 +++--- .../components/search/search.component.html | 2 +- .../lib/components/search/search.component.ts | 8 +++--- .../configurationUpdater.service.ts | 25 ++++++++++++------- .../services/startup/contributorBuilder.ts | 1 - 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.html b/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.html index 5f42e209..c40d2d94 100644 --- a/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.html +++ b/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.html @@ -1,4 +1,4 @@ - +
diff --git a/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.ts b/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.ts index 7061a415..d4372c70 100644 --- a/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.ts +++ b/projects/arlas-toolkit/src/lib/components/filter-shortcut/filter-shortcut.component.ts @@ -82,7 +82,7 @@ export class FilterShortcutComponent implements OnInit { if (this.isOpen) { this.activateContributor(); } - this.inputs = Object.assign({}, this.shortcut.component.input); + this.inputs = Object.assign({}, this.shortcut?.component?.input); this.setHistogramInput(); this.setPowerbarsInput(); } @@ -96,8 +96,10 @@ export class FilterShortcutComponent implements OnInit { } private activateContributor(): Contributor { - const contributor: Contributor = this.collaborativeSearchService.registry.get(this.shortcut.component.contributorId); - contributor.updateData = true; + const contributor: Contributor = this.collaborativeSearchService.registry.get(this.shortcut?.component?.contributorId); + if (contributor) { + contributor.updateData = true; + } return contributor; } diff --git a/projects/arlas-toolkit/src/lib/components/search/search.component.html b/projects/arlas-toolkit/src/lib/components/search/search.component.html index 03363f33..39f6dc27 100644 --- a/projects/arlas-toolkit/src/lib/components/search/search.component.html +++ b/projects/arlas-toolkit/src/lib/components/search/search.component.html @@ -1,4 +1,4 @@ -
+
search
{{ searchValue }} diff --git a/projects/arlas-toolkit/src/lib/components/search/search.component.ts b/projects/arlas-toolkit/src/lib/components/search/search.component.ts index 835699a4..074752be 100644 --- a/projects/arlas-toolkit/src/lib/components/search/search.component.ts +++ b/projects/arlas-toolkit/src/lib/components/search/search.component.ts @@ -79,10 +79,10 @@ export class SearchComponent implements OnInit, OnDestroy, OnChanges { public ngOnInit(): void { // Retrieve value from the url and future collaborations this.retrieveSearchValueSub = this.collaborativeService.collaborationBus.pipe( - filter(e => this.searchContributor.isMyOwnCollaboration(e) || e.id === 'url' || e.id === 'all') + filter(e => this.searchContributor?.isMyOwnCollaboration(e) || e.id === 'url' || e.id === 'all') ).subscribe( e => { - const collaboration = this.collaborativeService.getCollaboration(this.searchContributor.identifier); + const collaboration = this.collaborativeService.getCollaboration(this.searchContributor?.identifier); if (collaboration) { collaboration.filters.forEach((f, collection) => { let initSearchValue = ''; @@ -129,7 +129,7 @@ export class SearchComponent implements OnInit, OnDestroy, OnChanges { enabled: true }; - this.collaborativeService.setFilter(this.searchContributor.identifier, collaboration); + this.collaborativeService.setFilter(this.searchContributor?.identifier, collaboration); } } @@ -161,7 +161,7 @@ export class SearchComponent implements OnInit, OnDestroy, OnChanges { public clearSearch() { this.searchValue = this.searchPlaceholder; - this.collaborativeService.removeFilter(this.searchContributor.identifier); + this.collaborativeService.removeFilter(this.searchContributor?.identifier); } } diff --git a/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts b/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts index bb1ccc4f..8e615a25 100644 --- a/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts +++ b/projects/arlas-toolkit/src/lib/services/configuration-updater/configurationUpdater.service.ts @@ -43,7 +43,7 @@ export class ArlasConfigurationUpdaterService { } /** check if aggregation model has a non-available field (in bucket aggregation AND metrics) */ if (contributor.aggregationmodels) { - if (contributor.collection && availableFieldsPerCollection.has(contributor.collection) ) { + if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { const availableFields = availableFieldsPerCollection.get(contributor.collection); contributor.aggregationmodels.forEach((am: Aggregation) => { if (!availableFields.has(am.field)) { @@ -100,7 +100,7 @@ export class ArlasConfigurationUpdaterService { } /** chipssearch contributor */ - if (contributor.type = 'chipssearch' && contributor.search_field) { + if (contributor.type === 'chipssearch' && contributor.search_field) { if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { const availableFields = availableFieldsPerCollection.get(contributor.collection); if (!availableFields.has(contributor.search_field)) { @@ -112,7 +112,7 @@ export class ArlasConfigurationUpdaterService { } /** resultlist contributor */ - if (contributor.type = 'resultlist' && contributor.fieldsConfiguration) { + if (contributor.type === 'resultlist' && contributor.fieldsConfiguration) { if (contributor.collection && availableFieldsPerCollection.has(contributor.collection)) { const availableFields = availableFieldsPerCollection.get(contributor.collection); if (contributor.fieldsConfiguration.idFieldName @@ -221,8 +221,13 @@ export class ArlasConfigurationUpdaterService { const mapComponentConfig = data.arlas.web.components.mapgl; if (mapComponentConfig && mapComponentConfig.input) { /** idFieldName is no longer used !! */ - const layerSources = data.arlas.web.contributors.filter(contributor => contributor.type === 'map') - .map(l => l.layers_sources).reduce((l1, l2) => new Array(...l1, ...l2)); + let layerSources = []; + const layerSourcesList = data.arlas.web.contributors.filter(contributor => contributor.type === 'map') + .map(l => l.layers_sources); + if (layerSourcesList && layerSourcesList.length > 0) { + /** reduce cannot be applied on an empty list. */ + layerSources = layerSourcesList.reduce((l1, l2) => new Array(...l1, ...l2)); + } /** remove layers from visualisation sets if their correponding source is removed from the contributor */ if (layerSources) { const layers = new Set(layerSources.map(ls => ls.id)); @@ -343,11 +348,13 @@ export class ArlasConfigurationUpdaterService { */ public updateHistogramContributors(data, availableFieldsPerCollection: Map>): any { if (data && data.arlas && data.arlas.web && data.arlas.web.contributors) { - data.arlas.web.contributors.filter(contributor => contributor.type === 'histogram').forEach(contributor => { + data.arlas.web.contributors.filter(contributor => contributor.type === 'histogram' || + contributor.type === 'detailedhistogram' + ).forEach(contributor => { if (contributor.additionalCollections) { - contributor.additionalCollections = contributor.additionalCollections.filter(ac =>{ - const availableFields = availableFieldsPerCollection.get(contributor.collection); - const hasCollection = availableFieldsPerCollection.has(contributor.collection); + contributor.additionalCollections = contributor.additionalCollections.filter(ac => { + const availableFields = availableFieldsPerCollection.get(ac.collectionName); + const hasCollection = availableFieldsPerCollection.has(ac.collectionName); const hasField = hasCollection && availableFields.has(ac.field); return hasField; }); diff --git a/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts b/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts index 8dc589b0..7c36edf5 100644 --- a/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts +++ b/projects/arlas-toolkit/src/lib/services/startup/contributorBuilder.ts @@ -130,7 +130,6 @@ export class ContributorBuilder { } } }); - return collections; } }