mirror of
https://github.com/Dispatcharr/Dispatcharr.git
synced 2026-08-02 06:42:32 +00:00
Fix header checkbox not clearing on bulk delete in logo tables.
This commit is contained in:
parent
860c671f8c
commit
6037c158f4
2 changed files with 47 additions and 16 deletions
|
|
@ -115,6 +115,7 @@ const LogosTable = () => {
|
|||
pageSize: pageSize,
|
||||
});
|
||||
const [paginationString, setPaginationString] = useState('');
|
||||
const tableRef = React.useRef(null);
|
||||
|
||||
// Debounce the name filter
|
||||
useEffect(() => {
|
||||
|
|
@ -162,6 +163,14 @@ const LogosTable = () => {
|
|||
/**
|
||||
* Functions
|
||||
*/
|
||||
const clearSelections = useCallback(() => {
|
||||
setSelectedRows(new Set());
|
||||
// Clear table's internal selection state if table is initialized
|
||||
if (tableRef.current?.setSelectedTableIds) {
|
||||
tableRef.current.setSelectedTableIds([]);
|
||||
}
|
||||
}, []);
|
||||
|
||||
const executeDeleteLogo = useCallback(
|
||||
async (id, deleteFile = false) => {
|
||||
setIsLoading(true);
|
||||
|
|
@ -185,10 +194,10 @@ const LogosTable = () => {
|
|||
setDeleteTarget(null);
|
||||
setLogoToDelete(null);
|
||||
setIsBulkDelete(false);
|
||||
setSelectedRows(new Set()); // Clear selections
|
||||
clearSelections(); // Clear selections
|
||||
}
|
||||
},
|
||||
[fetchAllLogos]
|
||||
[fetchAllLogos, clearSelections]
|
||||
);
|
||||
|
||||
const executeBulkDelete = useCallback(
|
||||
|
|
@ -215,10 +224,10 @@ const LogosTable = () => {
|
|||
setIsLoading(false);
|
||||
setConfirmDeleteOpen(false);
|
||||
setIsBulkDelete(false);
|
||||
setSelectedRows(new Set()); // Clear selections
|
||||
clearSelections(); // Clear selections
|
||||
}
|
||||
},
|
||||
[selectedRows, fetchAllLogos]
|
||||
[selectedRows, fetchAllLogos, clearSelections]
|
||||
);
|
||||
|
||||
const executeCleanupUnused = useCallback(
|
||||
|
|
@ -249,10 +258,10 @@ const LogosTable = () => {
|
|||
} finally {
|
||||
setIsCleaningUp(false);
|
||||
setConfirmCleanupOpen(false);
|
||||
setSelectedRows(new Set()); // Clear selections after cleanup
|
||||
clearSelections(); // Clear selections after cleanup
|
||||
}
|
||||
},
|
||||
[fetchAllLogos]
|
||||
[fetchAllLogos, clearSelections]
|
||||
);
|
||||
|
||||
const editLogo = useCallback(async (logo = null) => {
|
||||
|
|
@ -289,10 +298,10 @@ const LogosTable = () => {
|
|||
if (checked) {
|
||||
setSelectedRows(new Set(data.map((logo) => logo.id)));
|
||||
} else {
|
||||
setSelectedRows(new Set());
|
||||
clearSelections();
|
||||
}
|
||||
},
|
||||
[data]
|
||||
[data, clearSelections]
|
||||
);
|
||||
|
||||
const deleteBulkLogos = useCallback(() => {
|
||||
|
|
@ -310,8 +319,8 @@ const LogosTable = () => {
|
|||
|
||||
// Clear selections when logos data changes (e.g., after filtering)
|
||||
useEffect(() => {
|
||||
setSelectedRows(new Set());
|
||||
}, [data.length]);
|
||||
clearSelections();
|
||||
}, [data.length, clearSelections]);
|
||||
|
||||
// Update pagination when pageSize changes
|
||||
useEffect(() => {
|
||||
|
|
@ -616,6 +625,11 @@ const LogosTable = () => {
|
|||
},
|
||||
});
|
||||
|
||||
// Store table reference for clearing selections
|
||||
React.useEffect(() => {
|
||||
tableRef.current = table;
|
||||
}, [table]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Box
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ export default function VODLogosTable() {
|
|||
const [confirmCleanupOpen, setConfirmCleanupOpen] = useState(false);
|
||||
const [paginationString, setPaginationString] = useState('');
|
||||
const [isCleaningUp, setIsCleaningUp] = useState(false);
|
||||
const tableRef = React.useRef(null);
|
||||
|
||||
// Calculate unused logos count
|
||||
const unusedLogosCount = useMemo(() => {
|
||||
|
|
@ -129,6 +130,14 @@ export default function VODLogosTable() {
|
|||
setSelectedRows(new Set(newSelection));
|
||||
}, []);
|
||||
|
||||
const clearSelections = useCallback(() => {
|
||||
setSelectedRows(new Set());
|
||||
// Clear table's internal selection state if table is initialized
|
||||
if (tableRef.current?.setSelectedTableIds) {
|
||||
tableRef.current.setSelectedTableIds([]);
|
||||
}
|
||||
}, []);
|
||||
|
||||
const handleConfirmDelete = async () => {
|
||||
try {
|
||||
if (deleteTarget.length === 1) {
|
||||
|
|
@ -146,15 +155,17 @@ export default function VODLogosTable() {
|
|||
color: 'green',
|
||||
});
|
||||
}
|
||||
setSelectedRows(new Set());
|
||||
setConfirmDeleteOpen(false);
|
||||
setDeleteTarget(null);
|
||||
} catch (error) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error.message || 'Failed to delete VOD logos',
|
||||
color: 'red',
|
||||
});
|
||||
} finally {
|
||||
// Always clear selections and close dialog, even on error
|
||||
clearSelections();
|
||||
setConfirmDeleteOpen(false);
|
||||
setDeleteTarget(null);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -171,7 +182,6 @@ export default function VODLogosTable() {
|
|||
message: `Cleaned up ${result.deleted_count} unused VOD logos`,
|
||||
color: 'green',
|
||||
});
|
||||
setConfirmCleanupOpen(false);
|
||||
} catch (error) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
|
|
@ -180,13 +190,15 @@ export default function VODLogosTable() {
|
|||
});
|
||||
} finally {
|
||||
setIsCleaningUp(false);
|
||||
setConfirmCleanupOpen(false);
|
||||
clearSelections(); // Clear selections after cleanup
|
||||
}
|
||||
};
|
||||
|
||||
// Clear selections only when filters change (not on every data fetch)
|
||||
useEffect(() => {
|
||||
setSelectedRows(new Set());
|
||||
}, [nameFilter, usageFilter]);
|
||||
clearSelections();
|
||||
}, [nameFilter, usageFilter, clearSelections]);
|
||||
|
||||
useEffect(() => {
|
||||
const startItem = (currentPage - 1) * pageSize + 1;
|
||||
|
|
@ -395,6 +407,11 @@ export default function VODLogosTable() {
|
|||
},
|
||||
});
|
||||
|
||||
// Store table reference for clearing selections
|
||||
React.useEffect(() => {
|
||||
tableRef.current = table;
|
||||
}, [table]);
|
||||
|
||||
return (
|
||||
<Box
|
||||
style={{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue