diff --git a/CHANGELOG b/CHANGELOG index 52071d512097f1957a207502fa468eb985d4233f..a58b159879c532de075d513cfa4fff72590cb55a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ minerva-front (18.0.7) stable; urgency=medium * Bug fix: export to image did not include overlays (#326) * Bug fix: missing logos added (#329) + * Bug fix: plugin API did not provide overlay entries when returning list of + visible overlays (#332) -- Piotr Gawron <piotr.gawron@uni.lu> Wed, 11 Dec 2024 13:00:00 +0200 diff --git a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts index 036a668b22bf45829ccc22e4767a40ff0c184697..c0f486b95bf1c15209090f56863fffdbeb120b73 100644 --- a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts +++ b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts @@ -3,6 +3,7 @@ import { overlaysFixture } from '@/models/fixtures/overlaysFixture'; import { OVERLAYS_INITIAL_STATE_MOCK } from '@/redux/overlays/overlays.mock'; import { RootState, store } from '@/redux/store'; import { OVERLAY_BIO_ENTITY_INITIAL_STATE_MOCK } from '@/redux/overlayBioEntity/overlayBioEntity.mock'; +import { DataOverlay } from '@/services/pluginsManager/map/overlays/types/DataOverlay'; import { getVisibleDataOverlays } from './getVisibleDataOverlays'; const ACTIVE_OVERLAYS_IDS = overlaysFixture.map(overlay => overlay.idObject); @@ -34,7 +35,9 @@ describe('getVisibleDataOverlays', () => { }) as RootState, ); - expect(getVisibleDataOverlays()).toEqual(overlaysFixture); + expect(getVisibleDataOverlays()).toEqual( + overlaysFixture.map(overlay => new DataOverlay(overlay)), + ); }); it('should return empty array if no active overlays', () => { diff --git a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts index 6224d3ffe50af7b5e79591e464a76571ed3b0422..14a69d51ac535c543ed55d85b2d06b7e7b41a7fc 100644 --- a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts +++ b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts @@ -1,9 +1,46 @@ -import { activeOverlaysSelector } from '@/redux/overlayBioEntity/overlayBioEntity.selector'; +import { + activeOverlaysSelector, + overlayBioEntityDataSelector, +} from '@/redux/overlayBioEntity/overlayBioEntity.selector'; import { store } from '@/redux/store'; -import { MapOverlay } from '@/types/models'; +import { DataOverlay } from '@/services/pluginsManager/map/overlays/types/DataOverlay'; +import { modelsDataSelector } from '@/redux/models/models.selectors'; +import { DataOverlayEntry } from '@/services/pluginsManager/map/overlays/types/DataOverlayEntry'; -export const getVisibleDataOverlays = (): MapOverlay[] => { +export const getVisibleDataOverlays = (): DataOverlay[] => { const activeOverlays = activeOverlaysSelector(store.getState()); + const overlayData = overlayBioEntityDataSelector(store.getState()); - return activeOverlays; + const models = modelsDataSelector(store.getState()); + + const dataOverlays = activeOverlays.map(mapOverlay => new DataOverlay(mapOverlay)); + + dataOverlays.forEach(dataOverlay => { + const mapOverlayData = overlayData[dataOverlay.id]; + if (mapOverlayData) { + models.forEach(model => { + const entries = mapOverlayData[model.idObject]; + if (entries) { + entries.forEach(dataEntry => { + if (dataEntry.type === 'submap-link') { + dataOverlay.addEntry( + new DataOverlayEntry( + Number(dataEntry.id), + 'ALIAS', + dataEntry.modelId, + dataEntry.color, + dataEntry.value, + ), + ); + } else { + // eslint-disable-next-line no-console + console.log(`${dataEntry.type} not supported`); + } + }); + } + }); + } + }); + + return dataOverlays; }; diff --git a/src/services/pluginsManager/map/overlays/types/DataOverlay.ts b/src/services/pluginsManager/map/overlays/types/DataOverlay.ts new file mode 100644 index 0000000000000000000000000000000000000000..e79d88ba577df7f5e6881aa5181795db9151d119 --- /dev/null +++ b/src/services/pluginsManager/map/overlays/types/DataOverlay.ts @@ -0,0 +1,44 @@ +import { MapOverlay } from '@/types/models'; +import { DataOverlayEntry } from '@/services/pluginsManager/map/overlays/types/DataOverlayEntry'; + +export class DataOverlay { + id: number; + + idObject: number; + + name: string; + + order: number; + + creator: string; + + description: string; + + genomeType: string | null; + + genomeVersion: string | null; + + publicOverlay: boolean; + + type: string; + + entries: DataOverlayEntry[]; + + constructor(mapOverlay: MapOverlay) { + this.id = mapOverlay.idObject; + this.idObject = mapOverlay.idObject; + this.name = mapOverlay.name; + this.order = mapOverlay.order; + this.creator = mapOverlay.creator; + this.description = mapOverlay.description; + this.genomeType = mapOverlay.genomeType; + this.genomeVersion = mapOverlay.genomeVersion; + this.publicOverlay = mapOverlay.publicOverlay; + this.type = mapOverlay.type; + this.entries = []; + } + + public addEntry(entry: DataOverlayEntry): void { + this.entries.push(entry); + } +} diff --git a/src/services/pluginsManager/map/overlays/types/DataOverlayEntry.ts b/src/services/pluginsManager/map/overlays/types/DataOverlayEntry.ts new file mode 100644 index 0000000000000000000000000000000000000000..2627887c2cde9f251137a816fac4656a50161fdc --- /dev/null +++ b/src/services/pluginsManager/map/overlays/types/DataOverlayEntry.ts @@ -0,0 +1,27 @@ +import { Color } from '@/types/models'; + +export class DataOverlayEntry { + bioEntityId: number; + + bioEntityType: string; + + bioEntityModelId: number; + + color: Color | null; + + value: number | null; + + constructor( + bioEntityId: number, + bioEntityType: string, + bioEntityModelId: number, + color: Color | null, + value: number | null, + ) { + this.bioEntityId = bioEntityId; + this.color = color; + this.value = value; + this.bioEntityType = bioEntityType; + this.bioEntityModelId = bioEntityModelId; + } +}