From ea44057cfefe9231a706ec13b2a165dc06bdfe8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mi=C5=82osz=20Grocholewski?= <m.grocholewski@atcomp.pl>
Date: Fri, 22 Nov 2024 12:14:29 +0100
Subject: [PATCH] feat(vector-map): skip handle click on elements with negative
 zIndex

---
 .../mouseClick/mouseLeftClick/onMapLeftClick.test.ts   | 10 +++++++---
 .../mouseClick/mouseLeftClick/onMapLeftClick.ts        |  4 ++--
 .../mouseClick/mouseRightClick/onMapRightClick.ts      |  7 ++++++-
 .../utils/shapes/elements/BaseMultiPolygon.ts          |  1 +
 .../MapViewerVector/utils/shapes/elements/Glyph.ts     |  1 +
 .../utils/shapes/elements/getArrowFeature.ts           |  1 +
 .../MapViewerVector/utils/shapes/reaction/Reaction.ts  |  3 +++
 7 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.test.ts b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.test.ts
index 212465ce..fb720a27 100644
--- a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.test.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.test.ts
@@ -51,7 +51,11 @@ describe('onMapLeftClick', () => {
   it('dispatches updateLastClick and resets data if no feature at pixel', async () => {
     const dispatch = jest.fn();
     jest.spyOn(mapInstance, 'forEachFeatureAtPixel').mockImplementation((_, callback) => {
-      callback(new Feature({}), null as unknown as Layer, null as unknown as SimpleGeometry);
+      callback(
+        new Feature({ zIndex: 1 }),
+        null as unknown as Layer,
+        null as unknown as SimpleGeometry,
+      );
     });
     await onMapLeftClick(
       mapSize,
@@ -74,7 +78,7 @@ describe('onMapLeftClick', () => {
     const dispatch = jest.fn(() => ({
       unwrap: jest.fn().mockResolvedValue(mockBioEntities),
     }));
-    const feature = new Feature({ id: 1, type: FEATURE_TYPE.ALIAS });
+    const feature = new Feature({ id: 1, type: FEATURE_TYPE.ALIAS, zIndex: 1 });
     jest.spyOn(mapInstance, 'forEachFeatureAtPixel').mockImplementation((_, callback) => {
       callback(feature, null as unknown as Layer, null as unknown as SimpleGeometry);
     });
@@ -98,7 +102,7 @@ describe('onMapLeftClick', () => {
     const dispatch = jest.fn(() => ({
       unwrap: jest.fn().mockResolvedValue(mockBioEntities),
     }));
-    const feature = new Feature({ id: 1, type: FEATURE_TYPE.REACTION });
+    const feature = new Feature({ id: 1, type: FEATURE_TYPE.REACTION, zIndex: 1 });
     jest.spyOn(mapInstance, 'forEachFeatureAtPixel').mockImplementation((_, callback) => {
       callback(feature, null as unknown as Layer, null as unknown as SimpleGeometry);
     });
diff --git a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.ts b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.ts
index d5fca4ab..be79fe07 100644
--- a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseLeftClick/onMapLeftClick.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-magic-numbers */
 import { MapSize } from '@/redux/map/map.types';
 import { AppDispatch } from '@/redux/store';
 import { Map, MapBrowserEvent } from 'ol';
@@ -26,13 +27,12 @@ export const onMapLeftClick =
 
       let featureAtPixel: FeatureLike | undefined;
       mapInstance.forEachFeatureAtPixel(pixel, (feature, ) => {
-        if(feature.get('id') && [...Object.values(FEATURE_TYPE)].includes(feature.get('type'))) {
+        if(feature.get('id') && [...Object.values(FEATURE_TYPE)].includes(feature.get('type')) && feature.get('zIndex') >= 0) {
           featureAtPixel = feature;
           return true;
         }
         return false;
       }, {hitTolerance: 10});
-
       if(!featureAtPixel) {
         if (isResultDrawerOpen) {
           dispatch(closeDrawer());
diff --git a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseRightClick/onMapRightClick.ts b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseRightClick/onMapRightClick.ts
index d781719b..38a214a5 100644
--- a/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseRightClick/onMapRightClick.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/listeners/mouseClick/mouseRightClick/onMapRightClick.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-magic-numbers */
 import { MapSize } from '@/redux/map/map.types';
 import { AppDispatch } from '@/redux/store';
 import { Feature, Map, MapBrowserEvent } from 'ol';
@@ -30,7 +31,11 @@ export const onMapRightClick =
             const source = layer.getSource();
             if (source instanceof VectorSource) {
               foundFeature = source.getClosestFeatureToCoordinate(coordinate, (feature) => {
-                return [FEATURE_TYPE.ALIAS, FEATURE_TYPE.REACTION, FEATURE_TYPE.GLYPH].includes(feature.get('type'));
+                return [
+                  FEATURE_TYPE.ALIAS,
+                  FEATURE_TYPE.REACTION,
+                  FEATURE_TYPE.GLYPH
+                ].includes(feature.get('type')) && feature.get('zIndex') >= 0;
               });
             }
           }
diff --git a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/BaseMultiPolygon.ts b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/BaseMultiPolygon.ts
index 5997a743..135bd839 100644
--- a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/BaseMultiPolygon.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/BaseMultiPolygon.ts
@@ -178,6 +178,7 @@ export default abstract class BaseMultiPolygon {
       },
       id: this.id,
       type: this.type,
+      zIndex: this.zIndex,
     });
 
     this.feature.setStyle(this.getStyle.bind(this));
diff --git a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/Glyph.ts b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/Glyph.ts
index ede963f1..60318446 100644
--- a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/Glyph.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/Glyph.ts
@@ -92,6 +92,7 @@ export default class Glyph {
       geometry: polygon,
       id: elementId,
       type: FEATURE_TYPE.GLYPH,
+      zIndex,
       getImageScale: (resolution: number): number => {
         if (mapInstance) {
           return mapInstance.getView().getMinResolution() / resolution;
diff --git a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/getArrowFeature.ts b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/getArrowFeature.ts
index 97168e2d..02e0ab19 100644
--- a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/getArrowFeature.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/elements/getArrowFeature.ts
@@ -60,6 +60,7 @@ export default function getArrowFeature({
   const arrowFeature = new Feature({
     geometry: new MultiPolygon(arrowPolygons),
     style: arrowStyles,
+    zIndex,
   });
   arrowFeature.setStyle(arrowStyles);
   return arrowFeature;
diff --git a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/reaction/Reaction.ts b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/reaction/Reaction.ts
index f8140764..a3878b53 100644
--- a/src/components/Map/MapViewer/MapViewerVector/utils/shapes/reaction/Reaction.ts
+++ b/src/components/Map/MapViewer/MapViewerVector/utils/shapes/reaction/Reaction.ts
@@ -213,6 +213,7 @@ export default class Reaction {
       id: this.id,
       type: FEATURE_TYPE.REACTION,
       elementType: REACTION_ELEMENT_TYPES.LINE,
+      zIndex: this.zIndex,
     });
     lineFeature.setStyle(this.getStyle.bind(this));
 
@@ -262,6 +263,7 @@ export default class Reaction {
       id: this.id,
       type: FEATURE_TYPE.REACTION,
       elementType: REACTION_ELEMENT_TYPES.SQUARE,
+      zIndex: this.zIndex,
     });
     squareFeature.setStyle(this.getStyle.bind(this));
     return squareFeature;
@@ -318,6 +320,7 @@ export default class Reaction {
       type: FEATURE_TYPE.REACTION,
       elementType: REACTION_ELEMENT_TYPES.OPERATOR,
       fontSize: 10,
+      zIndex: this.zIndex,
     });
     circleFeature.setStyle(this.getStyle.bind(this));
     return circleFeature;
-- 
GitLab