diff --git a/specifyweb/frontend/js_src/lib/components/DataViews/index.tsx b/specifyweb/frontend/js_src/lib/components/DataViews/index.tsx index 14caa258c3b..c8b28396e5c 100644 --- a/specifyweb/frontend/js_src/lib/components/DataViews/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/DataViews/index.tsx @@ -200,6 +200,15 @@ function LoadedDataViewFromTable({ restoreScrollTopRef.current = resultsScrollRef.current.scrollTop; setRefreshToken((token) => token + 1); }, []); + const handleMerged = React.useCallback((): void => { + /* + * Merging removes the selected records. Clear the preview before the + * refreshed results arrive so it does not try to load deleted records. + */ + setSelectedIds([]); + setSelectedIndex(0); + handleRefresh(); + }, [handleRefresh]); const handleCloseQueryEditor = (): void => setQueryData(undefined); const handleOpenQueryEditor = (): void => { setIsQueryDirty(false); @@ -282,6 +291,11 @@ function LoadedDataViewFromTable({ createRecordSet={undefined} extraButtons={undefined} onReRun={handleRefresh} + onDeleted={(): void => { + setSelectedIds([]); + setSelectedIndex(0); + }} + onMerged={handleMerged} onSortChange={(newFields): void => { setRuntimeFields(unParseQueryFields(table.name, newFields)); setQueryRunCount((count) => count + 1); diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx index 4425b871b31..d673aade458 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Results.tsx @@ -91,6 +91,8 @@ export type QueryResultsProps = { readonly tableClassName?: string; readonly selectedRows: GetSet>; readonly onResults?: (results: RA) => void; + readonly onDeleted?: (recordId: number) => void; + readonly onMerged?: () => void; readonly scrollRef?: React.MutableRefObject; readonly restoreScrollTopRef?: React.MutableRefObject; readonly refreshToken?: number; @@ -113,12 +115,14 @@ export function QueryResults(props: QueryResultsProps): JSX.Element { onSelected: handleSelected, onSortChange: handleSortChange, onReRun: handleReRun, + onMerged: handleMerged, createRecordSet, extraButtons, containerClassName = '', tableClassName = '', selectedRows: [selectedRows, setSelectedRows], onResults: handleResults, + onDeleted: handleDeleted, scrollRef, restoreScrollTopRef, refreshToken, @@ -497,8 +501,11 @@ export function QueryResults(props: QueryResultsProps): JSX.Element { { + handleDelete(recordId); + handleDeleted?.(recordId); + }} + onMerged={handleMerged ?? handleReRun} /> ) : undefined} {hasToolPermission('recordSets', 'create') && totalCount !== 0 ? ( diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/ResultsWrapper.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/ResultsWrapper.tsx index d235b929fdf..fbb3aaea887 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/ResultsWrapper.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/ResultsWrapper.tsx @@ -34,7 +34,9 @@ export function QueryResultsWrapper({ extraButtons, onSelected: handleSelected, onResults: handleResults, + onDeleted: handleDeleted, onReRun: handleReRun, + onMerged: handleMerged, refreshToken, splitPane, splitHorizontal, @@ -66,9 +68,11 @@ export function QueryResultsWrapper({ @@ -109,6 +113,8 @@ type ResultsProps = { readonly containerClassName?: string; readonly tableClassName?: string; readonly onResults?: (results: RA) => void; + readonly onDeleted?: (recordId: number) => void; + readonly onMerged?: () => void; readonly scrollRef?: React.MutableRefObject; readonly restoreScrollTopRef?: React.MutableRefObject; readonly resultsRef?: React.MutableRefObject< @@ -177,6 +183,7 @@ export function useQueryResultsWrapper({ tableClassName, onSortChange: handleSortChange, onResults: handleResults, + onMerged: handleMerged, selectedRows: [selectedRows, setSelectedRows], scrollRef, restoreScrollTopRef, @@ -260,6 +267,7 @@ export function useQueryResultsWrapper({ fieldSpecs, initialData, onResults: handleResults, + onMerged: handleMerged, scrollRef, restoreScrollTopRef, sortConfig: queryFields @@ -297,6 +305,7 @@ export function useQueryResultsWrapper({ queryResource, queryRunCount, recordSetId, + handleMerged, ]); return props === undefined