diff --git a/src/components/chat/GlobalChatbox.tsx b/src/components/chat/GlobalChatbox.tsx index 9d1ee1b..c7e8d1f 100644 --- a/src/components/chat/GlobalChatbox.tsx +++ b/src/components/chat/GlobalChatbox.tsx @@ -789,12 +789,27 @@ export const GlobalChatbox: React.FC = ({ open, onClose }) => { } // Other frontend tools → dispatch to chatToolStore immediately + const normalizeIds = (): string[] => { + const rawIds = params.ids; + if (Array.isArray(rawIds)) { + return rawIds + .map((id) => String(id).trim()) + .filter(Boolean); + } + if (typeof rawIds === "string") { + return rawIds + .split(",") + .map((id) => id.trim()) + .filter(Boolean); + } + return []; + }; const buildLocateFeaturesAction = ( layer: string, geometryKind: "point" | "line", ): ChatToolAction => ({ type: "locate_features" as const, - ids: (params.ids as string[]) ?? [], + ids: normalizeIds(), layer, geometryKind, }); diff --git a/src/utils/mapQueryService.ts b/src/utils/mapQueryService.ts index 71db93b..7822b5e 100644 --- a/src/utils/mapQueryService.ts +++ b/src/utils/mapQueryService.ts @@ -224,11 +224,16 @@ const queryFeaturesByIds = async ( ids: string[], layer?: string ): Promise => { - if (!ids.length) { + const normalizedIds = ids + .map((id) => String(id).trim()) + .filter((id) => id.length > 0); + + if (!normalizedIds.length) { return []; } - const orFilter = ids.map((id) => `id='${id}'`).join(" OR "); + const escapedIds = normalizedIds.map((id) => id.replace(/'/g, "''")); + const orFilter = escapedIds.map((id) => `id='${id}'`).join(" OR "); try { if (!layer) {