diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx index 5e46eb601d8..fec68b2db76 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx @@ -150,12 +150,17 @@ export function QueryResults(props: QueryResultsProps): JSX.Element { undefinedResult === -1 ? results : results?.slice(0, undefinedResult) ) as RA | undefined; + const deletingRef = React.useRef>(new Set()); // Track recent deleted IDs to prevent duplicate deletion + // TEST: try deleting while records are being fetched /** * Note: this may be called with a recordId that is not part of query results */ const handleDelete = React.useCallback( (recordId: number): void => { + if (deletingRef.current.has(recordId)) return; // Prevents duplicate deletion calls for the same record + deletingRef.current.add(recordId); + let removeCount = 0; function newResults(results: RA | undefined) { if (!Array.isArray(results) || totalCount === undefined) return; @@ -167,13 +172,18 @@ export function QueryResults(props: QueryResultsProps): JSX.Element { return newResults; } setResults(newResults(results)); - if (removeCount === 0) return; + // Delete deletingRef if no records are able to be removed + if (removeCount === 0) { + deletingRef.current.delete(recordId); + return; + } setTotalCount((totalCount) => - totalCount === undefined ? undefined : totalCount - removeCount + totalCount === undefined ? undefined : Math.max(0, totalCount - removeCount) ); const newSelectedRows = (selectedRows: ReadonlySet) => new Set(Array.from(selectedRows).filter((id) => id !== recordId)); setSelectedRows(newSelectedRows(selectedRows)); + setTimeout(() => deletingRef.current.delete(recordId), 100); // Remove the record from the deletingRef }, [setResults, setTotalCount, totalCount] );