From 22b6dcd6cc413e95b51d489617c4709b41966477 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Thu, 1 May 2025 20:19:27 +0200 Subject: [PATCH] feat: add action to remove all pending tasks (#9600) --- src/backend/InvenTree/InvenTree/api.py | 8 +++- .../src/tables/settings/PendingTasksTable.tsx | 43 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api.py b/src/backend/InvenTree/InvenTree/api.py index e4da445cb4..e5535e26f5 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -422,10 +422,11 @@ class BulkOperationMixin: items = request.data.pop('items', None) filters = request.data.pop('filters', None) + all_filter = request.GET.get('all', None) queryset = model.objects.all() - if not items and not filters: + if not items and not filters and all_filter is None: raise ValidationError({ 'non_field_errors': _( 'List of items or filters must be provided for bulk operation' @@ -459,6 +460,11 @@ class BulkOperationMixin: 'non_field_errors': _('Invalid filters provided') }) + if all_filter and not helpers.str2bool(all_filter): + raise ValidationError({ + 'non_field_errors': _('All filter must only be used with true') + }) + if queryset.count() == 0: raise ValidationError({ 'non_field_errors': _('No items match the provided criteria') diff --git a/src/frontend/src/tables/settings/PendingTasksTable.tsx b/src/frontend/src/tables/settings/PendingTasksTable.tsx index 0c18fe78b8..82478c1290 100644 --- a/src/frontend/src/tables/settings/PendingTasksTable.tsx +++ b/src/frontend/src/tables/settings/PendingTasksTable.tsx @@ -3,6 +3,11 @@ import { useMemo } from 'react'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { apiUrl } from '@lib/functions/Api'; +import { UserRoles } from '@lib/index'; +import { notifications, showNotification } from '@mantine/notifications'; +import { IconTrashXFilled, IconX } from '@tabler/icons-react'; +import { api } from '../../App'; +import { ActionButton } from '../../components/buttons/ActionButton'; import { useTable } from '../../hooks/UseTable'; import { useUserState } from '../../states/UserState'; import type { TableColumn } from '../Column'; @@ -48,6 +53,41 @@ export default function PendingTasksTable({ ]; }, []); + const tableActions = useMemo(() => { + return [ + } + tooltip={t`Remove all pending tasks`} + onClick={() => { + api + .delete(`${apiUrl(ApiEndpoints.task_pending_list)}?all=true`) + .then(() => { + notifications.show({ + id: 'notes', + title: t`Success`, + message: t`All pending tasks deleted`, + color: 'green' + }); + table.refreshTable(); + }) + .catch((err) => { + showNotification({ + title: t`Error while deleting all pending tasks`, + message: + err.response.data?.non_field_errors ?? + err.message ?? + t`Unknown error`, + color: 'red', + icon: + }); + }); + }} + hidden={!user.hasAddRole(UserRoles.admin)} + /> + ]; + }, [user]); + return ( );