mirror of
https://github.com/inventree/InvenTree.git
synced 2026-08-10 07:26:14 +00:00
[UI] Bulk Delete Enhancements (#12601)
* Add optional filtering for bulkDelete * Enhanced pre-form content
This commit is contained in:
@@ -168,6 +168,7 @@ export type RowViewProps = RowAction & RowModelProps & RowViewBehaviorProps;
|
||||
* @param tableState : TableState - State manager for the table
|
||||
* @param defaultSortColumn : string - Default column to sort by
|
||||
* @param noRecordsText : string - Text to display when no records are found
|
||||
* @param bulkDeleteFilter : (record: any) => boolean - Callback function to determine if a record is eligible for bulk deletion
|
||||
* @param enableBulkDelete : boolean - Enable bulk deletion of records
|
||||
* @param enableDownload : boolean - Enable download actions
|
||||
* @param enableFilters : boolean - Enable filter actions
|
||||
@@ -198,6 +199,7 @@ export type InvenTreeTableProps<T = any> = {
|
||||
params?: any;
|
||||
defaultSortColumn?: string;
|
||||
noRecordsText?: string;
|
||||
bulkDeleteFilter?: (record: T) => boolean;
|
||||
enableBulkDelete?: boolean;
|
||||
enableDownload?: boolean;
|
||||
enableFilters?: boolean;
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
Paper,
|
||||
Space,
|
||||
Stack,
|
||||
Text,
|
||||
Tooltip
|
||||
} from '@mantine/core';
|
||||
import {
|
||||
@@ -102,6 +103,38 @@ export default function InvenTreeTableHeader({
|
||||
searchTerm: tableState.searchTerm
|
||||
});
|
||||
|
||||
const bulkDeleteIds: number[] = useMemo(() => {
|
||||
if (!tableProps.enableBulkDelete) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const selectedRecords = tableState.selectedRecords ?? [];
|
||||
const filterFn = tableProps.bulkDeleteFilter ?? (() => true);
|
||||
|
||||
return selectedRecords
|
||||
.filter((record) => filterFn(record))
|
||||
.map(
|
||||
(record) => resolveItem(record, tableState.idAccessor || 'pk') as number
|
||||
);
|
||||
}, [
|
||||
tableProps.enableBulkDelete,
|
||||
tableProps.bulkDeleteFilter,
|
||||
tableState.idAccessor,
|
||||
tableState.selectedRecords
|
||||
]);
|
||||
|
||||
const deleteItemsText = useMemo(() => {
|
||||
const N = bulkDeleteIds.length;
|
||||
|
||||
if (N === 0) {
|
||||
return t`No items selected`;
|
||||
} else if (N === 1) {
|
||||
return t`1 selected item will be deleted`;
|
||||
} else {
|
||||
return t`${N} selected items will be deleted`;
|
||||
}
|
||||
}, [bulkDeleteIds]);
|
||||
|
||||
const deleteRecords = useDeleteApiFormModal({
|
||||
url: tableUrl ?? '',
|
||||
title: t`Delete Selected Items`,
|
||||
@@ -110,11 +143,14 @@ export default function InvenTreeTableHeader({
|
||||
color='red'
|
||||
title={t`Are you sure you want to delete the selected items?`}
|
||||
>
|
||||
{t`This action cannot be undone`}
|
||||
<Stack gap='xs'>
|
||||
<Text size='sm'>{deleteItemsText}</Text>
|
||||
<Text size='sm'>{t`This action cannot be undone`}</Text>
|
||||
</Stack>
|
||||
</Alert>
|
||||
),
|
||||
initialData: {
|
||||
items: tableState.selectedIds
|
||||
items: bulkDeleteIds
|
||||
},
|
||||
fields: {
|
||||
items: {
|
||||
|
||||
@@ -742,6 +742,10 @@ export function BomTable({
|
||||
enableSelection: isEditing && !isLocked,
|
||||
enableBulkDelete:
|
||||
isEditing && !isLocked && user.hasDeleteRole(UserRoles.bom),
|
||||
bulkDeleteFilter: (record: any) => {
|
||||
// If the BOM item is defined for a different parent, then it cannot be deleted
|
||||
return record.part === partId;
|
||||
},
|
||||
enableDownload: true,
|
||||
rowExpansion: isEditing ? undefined : rowExpansion
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user