1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-23 15:29:42 +02:00
portainer/app/react/edge/edge-devices/WaitingRoomView/Datatable/TableActions.tsx
matias-portainer 9e0e0a12fa
Some checks are pending
ci / build_images (map[arch:amd64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
ci / build_images (map[arch:arm platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:arm64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:ppc64le platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:s390x platform:linux version:]) (push) Waiting to run
ci / build_manifests (push) Blocked by required conditions
/ triage (push) Waiting to run
Lint / Run linters (push) Waiting to run
Test / test-client (push) Waiting to run
Test / test-server (map[arch:amd64 platform:linux]) (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
Test / test-server (map[arch:arm64 platform:linux]) (push) Waiting to run
fix(waiting-room): add support for bulk deletion in waiting room EE-7136 (#11879)
2024-05-28 17:18:23 -03:00

135 lines
3.8 KiB
TypeScript

import { Check, CheckCircle } from 'lucide-react';
import { notifySuccess } from '@/portainer/services/notifications';
import { useDeleteEnvironmentsMutation } from '@/react/portainer/environments/ListView/useDeleteEnvironmentsMutation';
import { Environment } from '@/react/portainer/environments/types';
import { withReactQuery } from '@/react-tools/withReactQuery';
import { useIsPureAdmin } from '@/react/hooks/useUser';
import { Button } from '@@/buttons';
import { openModal } from '@@/modals';
import { TooltipWithChildren } from '@@/Tip/TooltipWithChildren';
import { DeleteButton } from '@@/buttons/DeleteButton';
import { useAssociateDeviceMutation, useLicenseOverused } from '../queries';
import { WaitingRoomEnvironment } from '../types';
import { AssignmentDialog } from './AssignmentDialog/AssignmentDialog';
const overusedTooltip = (
<>
Associating devices is disabled as your node count exceeds your license
limit
</>
);
export function TableActions({
selectedRows,
}: {
selectedRows: WaitingRoomEnvironment[];
}) {
const isPureAdmin = useIsPureAdmin();
const associateMutation = useAssociateDeviceMutation();
const removeMutation = useDeleteEnvironmentsMutation();
const licenseOverused = useLicenseOverused(selectedRows.length);
return (
<>
<DeleteButton
onConfirmed={() => handleRemoveDevice(selectedRows)}
disabled={selectedRows.length === 0}
data-cy="remove-device-button"
confirmMessage="You're about to remove edge device(s) from waiting room, which will not be shown until next agent startup."
>
Remove Device
</DeleteButton>
<TooltipWithChildren
message={
licenseOverused ? (
overusedTooltip
) : (
<>
Associate device(s) and assigning edge groups, group and tags with
overriding options
</>
)
}
>
<span>
<Button
onClick={() => handleAssociateAndAssign(selectedRows)}
data-cy="associate-and-assign-button"
disabled={
selectedRows.length === 0 || licenseOverused || !isPureAdmin
}
color="secondary"
icon={CheckCircle}
>
Associate and assignment
</Button>
</span>
</TooltipWithChildren>
<TooltipWithChildren
message={
licenseOverused ? (
overusedTooltip
) : (
<>
Associate device(s) based on their pre-assigned edge groups, group
and tags
</>
)
}
>
<span>
<Button
onClick={() => handleAssociateDevice(selectedRows)}
data-cy="associate-device-button"
disabled={selectedRows.length === 0 || licenseOverused}
icon={Check}
>
Associate Device
</Button>
</span>
</TooltipWithChildren>
</>
);
async function handleAssociateAndAssign(
environments: WaitingRoomEnvironment[]
) {
const assigned = await openModal(withReactQuery(AssignmentDialog), {
environments,
});
if (!assigned) {
return;
}
handleAssociateDevice(environments);
}
function handleAssociateDevice(devices: Environment[]) {
associateMutation.mutate(
devices.map((d) => d.Id),
{
onSuccess() {
notifySuccess('Success', 'Edge devices associated successfully');
},
}
);
}
async function handleRemoveDevice(devices: Environment[]) {
removeMutation.mutate(
devices.map((d) => ({ id: d.Id, name: d.Name })),
{
onSuccess() {
notifySuccess('Success', 'Edge devices were hidden successfully');
},
}
);
}
}