import { User } from 'lucide-react'; import { useRouter } from '@uirouter/react'; import { useMemo } from 'react'; import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; import { Authorized } from '@/react/hooks/useUser'; import { notifyError, notifySuccess } from '@/portainer/services/notifications'; import { SystemResourceDescription } from '@/react/kubernetes/datatables/SystemResourceDescription'; import { DefaultDatatableSettings, TableSettings as KubeTableSettings, } from '@/react/kubernetes/datatables/DefaultDatatableSettings'; import { CreateFromManifestButton } from '@/react/kubernetes/components/CreateFromManifestButton'; import { useKubeStore } from '@/react/kubernetes/datatables/default-kube-datatable-store'; import { Datatable, TableSettingsMenu } from '@@/datatables'; import { DeleteButton } from '@@/buttons/DeleteButton'; import { type FilteredColumnsTableSettings, filteredColumnsSettings, } from '@@/datatables/types'; import { ServiceAccount } from '../types'; import { columns } from './columns'; import { useDeleteServiceAccountsMutation } from './queries/useDeleteServiceAccountsMutation'; import { useGetAllServiceAccountsQuery } from './queries/useGetAllServiceAccountsQuery'; const storageKey = 'serviceAccounts'; interface TableSettings extends KubeTableSettings, FilteredColumnsTableSettings {} export function ServiceAccountsDatatable() { const environmentId = useEnvironmentId(); const tableState = useKubeStore( storageKey, undefined, (set) => ({ ...filteredColumnsSettings(set), }) ); const serviceAccountsQuery = useGetAllServiceAccountsQuery(environmentId, { refetchInterval: tableState.autoRefreshRate * 1000, }); const filteredServiceAccounts = useMemo( () => tableState.showSystemResources ? serviceAccountsQuery.data : serviceAccountsQuery.data?.filter((sa) => !sa.isSystem), [serviceAccountsQuery.data, tableState.showSystemResources] ); return ( row.uid} isRowSelectable={(row) => !row.original.isSystem} renderTableActions={(selectedRows) => ( )} renderTableSettings={() => ( )} description={ } data-cy="k8s-service-accounts-datatable" /> ); } interface SelectedServiceAccount { namespace: string; name: string; } type TableActionsProps = { selectedItems: ServiceAccount[]; }; function TableActions({ selectedItems }: TableActionsProps) { const environmentId = useEnvironmentId(); const deleteServiceAccountsMutation = useDeleteServiceAccountsMutation(environmentId); const router = useRouter(); return ( handleRemoveClick(selectedItems)} confirmMessage={ <>

Are you sure you want to delete the selected service account(s)?

    {selectedItems.map((s, index) => (
  • {s.namespace}/{s.name}
  • ))}
} data-cy="k8s-service-accounts-datatable-remove-button" />
); async function handleRemoveClick(serviceAccounts: SelectedServiceAccount[]) { const payload: Record = {}; serviceAccounts.forEach((sa) => { payload[sa.namespace] = payload[sa.namespace] || []; payload[sa.namespace].push(sa.name); }); deleteServiceAccountsMutation.mutate( { environmentId, data: payload }, { onSuccess: () => { notifySuccess( 'Service account(s) successfully removed', serviceAccounts.map((sa) => `${sa.namespace}/${sa.name}`).join(', ') ); router.stateService.reload(); }, onError: (error) => { notifyError( 'Unable to delete service account(s)', error as Error, serviceAccounts.map((sa) => `${sa.namespace}/${sa.name}`).join(', ') ); }, } ); } }