From e33a1c27c7d2ede7a3160f16b8a42af107691711 Mon Sep 17 00:00:00 2001 From: lgalis Date: Mon, 13 May 2024 16:26:35 -0400 Subject: [PATCH] Bulk delete for credential types (#2268) --- .../hooks/useCredentialTypeActions.tsx | 1 - .../hooks/useDeleteCredentialTypes.tsx | 69 ++++++++++++------- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/frontend/eda/access/credential-types/hooks/useCredentialTypeActions.tsx b/frontend/eda/access/credential-types/hooks/useCredentialTypeActions.tsx index 0465a44ddb..fba3228eba 100644 --- a/frontend/eda/access/credential-types/hooks/useCredentialTypeActions.tsx +++ b/frontend/eda/access/credential-types/hooks/useCredentialTypeActions.tsx @@ -36,7 +36,6 @@ export function useCredentialTypeToolbarActions( selection: PageActionSelection.Multiple, icon: TrashIcon, label: t('Delete selected credential types'), - isDisabled: () => 'Not implemented', onClick: deleteCredentialTypes, isDanger: true, }, diff --git a/frontend/eda/access/credential-types/hooks/useDeleteCredentialTypes.tsx b/frontend/eda/access/credential-types/hooks/useDeleteCredentialTypes.tsx index 92de275707..c35bdb9d2d 100644 --- a/frontend/eda/access/credential-types/hooks/useDeleteCredentialTypes.tsx +++ b/frontend/eda/access/credential-types/hooks/useDeleteCredentialTypes.tsx @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { compareStrings } from '../../../../../framework'; import { useNameColumn } from '../../../../common/columns'; @@ -16,27 +16,50 @@ export function useDeleteCredentialTypes( const confirmationColumns = useCredentialTypesColumns(); const deleteActionNameColumn = useNameColumn({ disableLinks: true, disableSort: true }); const actionColumns = useMemo(() => [deleteActionNameColumn], [deleteActionNameColumn]); + + const cannotDeleteManagedCredentialType = (credentialType: EdaCredentialType) => + credentialType.managed + ? t(`The credential type is provided by the system and is read-only.`) + : ''; const bulkAction = useEdaBulkConfirmation(); - return useCallback( - (credentialTypes: EdaCredentialType[]) => { - bulkAction({ - title: t('Permanently delete credential types', { count: credentialTypes.length }), - confirmText: t('Yes, I confirm that I want to delete these {{count}} credential types.', { - count: credentialTypes.length, - }), - actionButtonText: t('Delete credential types', { count: credentialTypes.length }), - items: credentialTypes.sort((l, r) => compareStrings(l.name, r.name)), - keyFn: idKeyFn, - isDanger: true, - confirmationColumns, - actionColumns, - onComplete, - actionFn: (credentialType: EdaCredentialType, signal) => { - const url = edaAPI`/credential-types/${credentialType.id.toString()}/`; - return requestDelete(url, signal); - }, - }); - }, - [actionColumns, bulkAction, confirmationColumns, onComplete, t] - ); + const deleteCredentialTypes = (credentialTypes: EdaCredentialType[]) => { + const undeletableManagedCredentialTypes: EdaCredentialType[] = credentialTypes.filter( + (credentialType) => credentialType.managed + ); + + bulkAction({ + title: t('Permanently delete credential types', { count: credentialTypes.length }), + confirmText: t('Yes, I confirm that I want to delete these {{count}} credential types.', { + count: credentialTypes.length, + }), + actionButtonText: t('Delete credential types', { count: credentialTypes.length }), + items: credentialTypes.sort((l, r) => compareStrings(l.name, r.name)), + alertPrompts: undeletableManagedCredentialTypes.length + ? [ + ...(undeletableManagedCredentialTypes.length + ? [ + t( + '{{count}} of the selected credential types cannot be deleted because they are read-only.', + { + count: undeletableManagedCredentialTypes.length, + } + ), + ] + : []), + ] + : undefined, + isItemNonActionable: (credentialType: EdaCredentialType) => + cannotDeleteManagedCredentialType(credentialType), + keyFn: idKeyFn, + isDanger: true, + confirmationColumns, + actionColumns, + onComplete, + actionFn: (credentialType: EdaCredentialType, signal) => { + const url = edaAPI`/credential-types/${credentialType.id.toString()}/`; + return requestDelete(url, signal); + }, + }); + }; + return deleteCredentialTypes; }