From 2476c3b17ecbe1a50022afb3e6b5434a09c801c5 Mon Sep 17 00:00:00 2001 From: keiya sasaki Date: Thu, 12 Oct 2023 09:41:30 +0900 Subject: [PATCH] chore(web): fix some bugs around feature selection functionality (#736) --- web/src/beta/lib/core/engines/Cesium/hooks.ts | 8 +++++--- web/src/beta/lib/core/engines/Cesium/pickMany.ts | 2 +- web/src/beta/lib/core/engines/Cesium/utils.ts | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/web/src/beta/lib/core/engines/Cesium/hooks.ts b/web/src/beta/lib/core/engines/Cesium/hooks.ts index 6bea89ec1..8e92c7e18 100644 --- a/web/src/beta/lib/core/engines/Cesium/hooks.ts +++ b/web/src/beta/lib/core/engines/Cesium/hooks.ts @@ -317,8 +317,6 @@ export default ({ const prevSelectedEntity = useRef(); // manage layer selection useEffect(() => { - if (!(featureFlags & FEATURE_FLAGS.SINGLE_SELECTION)) return; - const viewer = cesium.current?.cesiumElement; if (!viewer || viewer.isDestroyed()) return; @@ -337,10 +335,12 @@ export default ({ const entity = findEntity(viewer, undefined, selectedLayerId?.featureId) || findEntity(viewer, selectedLayerId?.layerId); + + if (prevSelectedEntity.current === entity) return; + if (!entity || entity instanceof Entity) { viewer.selectedEntity = entity; } - if (prevSelectedEntity.current === entity) return; prevSelectedEntity.current = entity; // TODO: Support layers.selectFeature API for MVT @@ -512,6 +512,8 @@ export default ({ const viewer = cesium.current?.cesiumElement; if (!viewer || viewer.isDestroyed()) return; + viewer.selectedEntity = undefined; + if (target && "id" in target && target.id instanceof Entity && isSelectable(target.id)) { const tag = getTag(target.id); const layer = tag?.layerId diff --git a/web/src/beta/lib/core/engines/Cesium/pickMany.ts b/web/src/beta/lib/core/engines/Cesium/pickMany.ts index bfee2dc93..d26d0ed70 100644 --- a/web/src/beta/lib/core/engines/Cesium/pickMany.ts +++ b/web/src/beta/lib/core/engines/Cesium/pickMany.ts @@ -296,7 +296,7 @@ export const pickManyFromViewportAsFeature = ( for (const obj of objs) { const [layerId, f] = convertObjToComputedFeature(viewer, obj) ?? []; const pickedFeature = f ? { ...f, layerId } : undefined; - if (!pickedFeature || !condition?.(pickedFeature)) { + if (!pickedFeature || (condition && !condition(pickedFeature))) { continue; } result.push(pickedFeature); diff --git a/web/src/beta/lib/core/engines/Cesium/utils.ts b/web/src/beta/lib/core/engines/Cesium/utils.ts index 7003978c9..255e4a0fb 100644 --- a/web/src/beta/lib/core/engines/Cesium/utils.ts +++ b/web/src/beta/lib/core/engines/Cesium/utils.ts @@ -368,14 +368,15 @@ export const convertObjToComputedFeature = ( ]; } - if (obj instanceof Entity) { - const tag = getTag(obj); + if (obj instanceof Entity || ("id" in obj && obj.id instanceof Entity)) { + const entity = (obj instanceof Entity ? obj : obj.id) as Entity; + const tag = getTag(entity); return [ tag?.layerId, tag?.computedFeature ?? { type: "computedFeature", id: tag?.featureId ?? "", - properties: convertEntityProperties(viewer, obj), + properties: convertEntityProperties(viewer, entity), }, ]; }