From 38f51e0f83c6b6faf765ab3b693250b451f1b430 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <p.gawron@atcomp.pl>
Date: Wed, 11 Dec 2024 12:11:05 +0100
Subject: [PATCH 1/2] provide info about entries when returning list of visible
 data overlays

---
 CHANGELOG                                     |  2 +
 .../map/overlays/getVisibleDataOverlays.ts    | 40 ++++++++++++++++-
 .../map/overlays/types/DataOverlay.ts         | 44 +++++++++++++++++++
 .../map/overlays/types/DataOverlayEntry.ts    | 27 ++++++++++++
 4 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 src/services/pluginsManager/map/overlays/types/DataOverlay.ts
 create mode 100644 src/services/pluginsManager/map/overlays/types/DataOverlayEntry.ts

diff --git a/CHANGELOG b/CHANGELOG
index 52071d51..a58b1598 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.ts b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts
index 6224d3ff..5f570436 100644
--- a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts
+++ b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts
@@ -1,9 +1,47 @@
-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[] => {
   const activeOverlays = activeOverlaysSelector(store.getState());
+  const overlayData = overlayBioEntityDataSelector(store.getState());
+
+  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 activeOverlays;
 };
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 00000000..e79d88ba
--- /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 00000000..2627887c
--- /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;
+  }
+}
-- 
GitLab


From 671676199d1103df8c61c819689ba082907f5b93 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <p.gawron@atcomp.pl>
Date: Wed, 11 Dec 2024 12:58:29 +0100
Subject: [PATCH 2/2] provide data overlay entries for plugins in new interface

---
 .../map/overlays/getVisibleDataOverlays.test.ts              | 5 ++++-
 .../pluginsManager/map/overlays/getVisibleDataOverlays.ts    | 5 ++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.test.ts
index 036a668b..c0f486b9 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 5f570436..14a69d51 100644
--- a/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts
+++ b/src/services/pluginsManager/map/overlays/getVisibleDataOverlays.ts
@@ -3,12 +3,11 @@ import {
   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());
 
@@ -43,5 +42,5 @@ export const getVisibleDataOverlays = (): MapOverlay[] => {
     }
   });
 
-  return activeOverlays;
+  return dataOverlays;
 };
-- 
GitLab