import { useRouter } from '@uirouter/react'; import type { Environment } from '@/portainer/environments/types'; import { confirmAsync, confirmDestructiveAsync, } from '@/portainer/services/modal.service/confirm'; import { promptAsync } from '@/portainer/services/modal.service/prompt'; import * as notifications from '@/portainer/services/notifications'; import { activateDevice } from '@/portainer/hostmanagement/open-amt/open-amt.service'; import { deleteEndpoint } from '@/portainer/environments/environment.service'; import { Button } from '@@/buttons'; import { Link } from '@@/Link'; interface Props { selectedItems: Environment[]; isFDOEnabled: boolean; isOpenAMTEnabled: boolean; setLoadingMessage(message: string): void; showWaitingRoomLink: boolean; } enum DeployType { FDO = 'FDO', MANUAL = 'MANUAL', } export function EdgeDevicesDatatableActions({ selectedItems, isOpenAMTEnabled, isFDOEnabled, setLoadingMessage, showWaitingRoomLink, }: Props) { const router = useRouter(); return (
{isOpenAMTEnabled && ( )} {showWaitingRoomLink && ( )}
); async function onDeleteEdgeDeviceClick() { const confirmed = await confirmDestructiveAsync({ title: 'Are you sure ?', message: 'This action will remove all configurations associated to your environment(s). Continue?', buttons: { confirm: { label: 'Remove', className: 'btn-danger', }, }, }); if (!confirmed) { return; } await Promise.all( selectedItems.map(async (environment) => { try { await deleteEndpoint(environment.Id); notifications.success( 'Environment successfully removed', environment.Name ); } catch (err) { notifications.error( 'Failure', err as Error, 'Unable to remove environment' ); } }) ); await router.stateService.reload(); } async function onAddNewDeviceClick() { const result = isFDOEnabled ? await promptAsync({ title: 'How would you like to add an Edge Device?', inputType: 'radio', inputOptions: [ { text: 'Provision bare-metal using Intel FDO', value: DeployType.FDO, }, { text: 'Deploy agent manually', value: DeployType.MANUAL, }, ], buttons: { confirm: { label: 'Confirm', className: 'btn-primary', }, }, }) : DeployType.MANUAL; switch (result) { case DeployType.FDO: router.stateService.go('portainer.endpoints.importDevice'); break; case DeployType.MANUAL: router.stateService.go('portainer.wizard.endpoints', { edgeDevice: true, }); break; default: break; } } async function onAssociateOpenAMTClick(selectedItems: Environment[]) { const selectedEnvironment = selectedItems[0]; const confirmed = await confirmAsync({ title: '', message: `Associate ${selectedEnvironment.Name} with OpenAMT`, buttons: { cancel: { label: 'Cancel', className: 'btn-default', }, confirm: { label: 'Confirm', className: 'btn-primary', }, }, }); if (!confirmed) { return; } try { setLoadingMessage( 'Activating Active Management Technology on selected device...' ); await activateDevice(selectedEnvironment.Id); notifications.success( 'Successfully associated with OpenAMT', selectedEnvironment.Name ); } catch (err) { notifications.error( 'Failure', err as Error, 'Unable to associate with OpenAMT' ); } finally { setLoadingMessage(''); } } }