import { UISref } from '@uirouter/react'; import { UIRouterContextComponent } from '@uirouter/react-hybrid'; import type { FormikProps } from 'formik'; import { Form } from 'formik'; import React, { useState } from 'react'; import { Button, Modal } from 'react-bootstrap'; import type { Application, IModalComponentProps, IModalProps } from '@spinnaker/core'; import { ManifestWriter, ModalClose, robotToHuman, SpinFormik, SubmitButton, TaskMonitorWrapper, TaskReason, UserVerification, useTaskMonitor, ValidationMessage, } from '@spinnaker/core'; import type { IDeleteOptions } from './delete.controller'; import type { IAnyKubernetesResource } from '../../interfaces'; import DeleteManifestOptionsForm from '../../pipelines/stages/deleteManifest/DeleteManifestOptionsForm'; export interface IKubernetesDeleteModalProps extends Pick, Pick { application: Application; resource: IAnyKubernetesResource; manifestController: string | undefined; } export interface IKubernetesDeleteValues extends IDeleteOptions { reason?: string; } export function DeleteModal({ application, resource, manifestController, isOpen, dismissModal, }: IKubernetesDeleteModalProps) { const initialValues: IKubernetesDeleteValues = { cascading: true, }; const [verified, setVerified] = useState(false); const taskMonitor = useTaskMonitor( { application, title: `Deleting ${resource.name}`, onTaskComplete: () => application.serverGroups.refresh(true), }, dismissModal, ); const submit = (values: IKubernetesDeleteValues): void => { const payload = { cloudProvider: 'kubernetes', manifestName: resource.name, location: resource.namespace, account: resource.account, reason: values.reason, options: { gracePeriodSeconds: values.gracePeriodSeconds, orphanDependants: !values.cascading, }, }; return taskMonitor.submit(() => ManifestWriter.deleteManifest(payload, application)); }; const onOptionChange = (formik: FormikProps, values: IKubernetesDeleteValues): void => { formik.setFieldValue('gracePeriodSeconds', values.gracePeriodSeconds); formik.setFieldValue('cascading', values.cascading); }; return ( initialValues={initialValues} onSubmit={submit} render={(formik) => ( <> Delete {robotToHuman(resource.name)} in {resource.namespace} {manifestController && (
Manifest is controlled by{' '} {robotToHuman(manifestController)} {' '} and may be recreated after deletion.
)}
onOptionChange(formik, options)} options={{ gracePeriodSeconds: formik.values.gracePeriodSeconds, cascading: formik.values.cascading, }} /> formik.setFieldValue('reason', val)} /> {formik.status?.error && (
Something went wrong: {formik.status.error.message && {formik.status.error.message}} } />
)}
submit(formik.values)} isDisabled={!formik.isValid || formik.isSubmitting || !verified} isFormSubmit={true} submitting={formik.isSubmitting} label={`Delete ${resource.name}`} /> )} />
); }