11import { useTranslation } from 'react-i18next'
22import type { AdminDetails } from '@/service/api'
3- import { useActivateAllDisabledUsers , useDisableAllActiveUsers , useGetAdmins , useRemoveAllUsers } from '@/service/api'
3+ import { useActivateAllDisabledUsers , useBulkDeleteAdmins , useDisableAllActiveUsers , useGetAdmins , useRemoveAllUsers } from '@/service/api'
44import { DataTable } from './data-table'
55import { setupColumns } from './columns'
66import { Filters } from './filters'
@@ -14,6 +14,8 @@ import { toast } from 'sonner'
1414import { useAdmin } from '@/hooks/use-admin'
1515import { patchAdminInAdminsCache } from '@/utils/adminsCache'
1616import { useQueryClient } from '@tanstack/react-query'
17+ import { BulkActionsBar } from '@/components/users/bulk-actions-bar'
18+ import { BulkActionAlertDialog } from '@/components/users/bulk-action-alert-dialog'
1719
1820interface AdminFilters {
1921 sort ?: string
@@ -187,11 +189,15 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
187189 const [ resetUsersUsageDialogOpen , setResetUsersUsageDialogOpen ] = useState ( false )
188190 const [ bulkUsersStatusDialogOpen , setBulkUsersStatusDialogOpen ] = useState ( false )
189191 const [ removeAllUsersDialogOpen , setRemoveAllUsersDialogOpen ] = useState ( false )
192+ const [ selectedAdminUsernames , setSelectedAdminUsernames ] = useState < string [ ] > ( [ ] )
193+ const [ resetSelectionKey , setResetSelectionKey ] = useState ( 0 )
194+ const [ bulkAction , setBulkAction ] = useState < 'delete' | null > ( null )
190195 const [ adminToDelete , setAdminToDelete ] = useState < AdminDetails | null > ( null )
191196 const [ adminToToggleStatus , setAdminToToggleStatus ] = useState < AdminDetails | null > ( null )
192197 const [ adminToReset , setAdminToReset ] = useState < string | null > ( null )
193198 const [ bulkUsersStatusAction , setBulkUsersStatusAction ] = useState < { username : string ; actionType : BulkUsersActionType } | null > ( null )
194199 const [ adminToRemoveAllUsers , setAdminToRemoveAllUsers ] = useState < string | null > ( null )
200+ const bulkDeleteAdminsMutation = useBulkDeleteAdmins ( )
195201
196202 const {
197203 data : adminsResponse ,
@@ -277,6 +283,11 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
277283 setDeleteDialogOpen ( true )
278284 }
279285
286+ const clearSelection = ( ) => {
287+ setResetSelectionKey ( prev => prev + 1 )
288+ setSelectedAdminUsernames ( [ ] )
289+ }
290+
280291 const handleStatusToggleClick = ( admin : AdminDetails ) => {
281292 setAdminToToggleStatus ( admin )
282293 setStatusToggleDialogOpen ( true )
@@ -329,7 +340,8 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
329340 toast . success ( t ( 'success' , { defaultValue : 'Success' } ) , {
330341 description : t ( actionType === 'disable' ? 'admins.disableAllActiveUsersSuccess' : 'admins.activateAllDisabledUsersSuccess' , {
331342 name : username ,
332- defaultValue : actionType === 'disable' ? `All active users under admin "${ username } " have been disabled successfully` : `All disabled users under admin "${ username } " have been activated successfully` ,
343+ defaultValue :
344+ actionType === 'disable' ? `All active users under admin "${ username } " have been disabled successfully` : `All disabled users under admin "${ username } " have been activated successfully` ,
333345 } ) ,
334346 } )
335347 closeBulkUsersStatusDialog ( )
@@ -431,6 +443,36 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
431443 }
432444 }
433445
446+ const handleBulkDelete = async ( ) => {
447+ if ( ! selectedAdminUsernames . length ) return
448+
449+ try {
450+ const response = await bulkDeleteAdminsMutation . mutateAsync ( {
451+ data : {
452+ usernames : selectedAdminUsernames ,
453+ } ,
454+ } )
455+ toast . success ( t ( 'success' , { defaultValue : 'Success' } ) , {
456+ description : t ( 'admins.bulkDeleteSuccess' , {
457+ count : response . count ,
458+ defaultValue : '{{count}} admins deleted successfully.' ,
459+ } ) ,
460+ } )
461+ clearSelection ( )
462+ setBulkAction ( null )
463+ queryClient . invalidateQueries ( { queryKey : [ '/api/admins' ] } )
464+ } catch ( error : any ) {
465+ toast . error ( t ( 'error' , { defaultValue : 'Error' } ) , {
466+ description :
467+ error ?. data ?. detail ||
468+ error ?. message ||
469+ t ( 'admins.bulkDeleteFailed' , {
470+ defaultValue : 'Failed to delete selected admins.' ,
471+ } ) ,
472+ } )
473+ }
474+ }
475+
434476 const columns = setupColumns ( {
435477 t,
436478 handleSort,
@@ -451,6 +493,7 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
451493 return (
452494 < div >
453495 < Filters filters = { filters } onFilterChange = { handleFilterChange } handleSort = { handleSort } refetch = { handleManualRefresh } />
496+ < BulkActionsBar selectedCount = { selectedAdminUsernames . length } onClear = { clearSelection } onDelete = { selectedAdminUsernames . length > 0 ? ( ) => setBulkAction ( 'delete' ) : undefined } />
454497 < DataTable
455498 columns = { columns }
456499 data = { adminsData || [ ] }
@@ -461,6 +504,8 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
461504 onDisableAllActiveUsers = { handleDisableAllActiveUsersClick }
462505 onActivateAllDisabledUsers = { handleActivateAllDisabledUsersClick }
463506 onRemoveAllUsers = { handleRemoveAllUsersClick }
507+ onSelectionChange = { setSelectedAdminUsernames }
508+ resetSelectionKey = { resetSelectionKey }
464509 currentAdminUsername = { currentAdmin ?. username }
465510 setStatusToggleDialogOpen = { setStatusToggleDialogOpen }
466511 isLoading = { isCurrentlyLoading && isFirstLoadRef . current }
@@ -504,6 +549,19 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
504549 onClose = { ( ) => setRemoveAllUsersDialogOpen ( false ) }
505550 />
506551 ) }
552+ < BulkActionAlertDialog
553+ open = { bulkAction === 'delete' }
554+ onOpenChange = { open => setBulkAction ( open ? 'delete' : null ) }
555+ title = { t ( 'admins.bulkDeleteTitle' , { defaultValue : 'Delete Selected Admins' } ) }
556+ description = { t ( 'admins.bulkDeletePrompt' , {
557+ count : selectedAdminUsernames . length ,
558+ defaultValue : 'Are you sure you want to delete {{count}} selected admins? This action cannot be undone.' ,
559+ } ) }
560+ actionLabel = { t ( 'delete' ) }
561+ onConfirm = { handleBulkDelete }
562+ isPending = { bulkDeleteAdminsMutation . isPending }
563+ destructive
564+ />
507565 </ div >
508566 )
509567}
0 commit comments