diff --git a/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx index 38b6c4357..54768992a 100644 --- a/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx @@ -1,11 +1,16 @@ import { ReactElement } from 'react'; import { useMutation } from 'urql'; import { Button } from '@/components/ui/button'; -import { Heading } from '@/components/ui/heading'; -import { Modal } from '@/components/v2'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { useToast } from '@/components/ui/use-toast'; import { graphql } from '@/gql'; -import { useNotifications } from '@/lib/hooks'; -import { TrashIcon } from '@radix-ui/react-icons'; const DeleteOperationMutation = graphql(` mutation DeleteOperation($selector: TargetSelectorInput!, $id: ID!) { @@ -42,51 +47,81 @@ const DeleteOperationMutation = graphql(` export type DeleteOperationMutationType = typeof DeleteOperationMutation; export function DeleteOperationModal(props: { - close: () => void; + isOpen: boolean; + toggleModalOpen: () => void; operationId: string; organizationId: string; projectId: string; targetId: string; }): ReactElement { - const { close, operationId } = props; + const { toast } = useToast(); + const { isOpen, toggleModalOpen, operationId } = props; const [, mutate] = useMutation(DeleteOperationMutation); - const notify = useNotifications(); + + const handleDelete = async () => { + const { error } = await mutate({ + id: operationId, + selector: { + target: props.targetId, + organization: props.organizationId, + project: props.projectId, + }, + }); + toggleModalOpen(); + if (error) { + toast({ + title: 'Error', + description: error.message, + variant: 'destructive', + }); + } else { + toast({ + title: 'Operation Deleted', + description: 'The operation has been successfully deleted.', + variant: 'default', + }); + } + }; return ( - - - Delete Operation -

- Are you sure you wish to delete this operation? This action is irreversible! -

-
- - -
-
+ + ); +} + +export function DeleteOperationModalContent(props: { + isOpen: boolean; + toggleModalOpen: () => void; + handleDelete: () => void; +}): ReactElement { + return ( + + + + Delete Operation + Do you really want to delete this operation? + + This action is irreversible! + + + + + + + + ); } diff --git a/packages/web/app/src/pages/target-laboratory.tsx b/packages/web/app/src/pages/target-laboratory.tsx index d9f645e18..5cb7d56b2 100644 --- a/packages/web/app/src/pages/target-laboratory.tsx +++ b/packages/web/app/src/pages/target-laboratory.tsx @@ -168,6 +168,7 @@ const CreateOperationMutation = graphql(` const CollectionItem = (props: { node: { id: string; name: string }; + toggleDeleteOperationModalOpen: () => void; canDelete: boolean; canEdit: boolean; onDelete: (operationId: string) => void; @@ -237,6 +238,7 @@ const CollectionItem = (props: { { props.onDelete(props.node.id); + props.toggleDeleteOperationModalOpen(); }} className="text-red-500" > @@ -323,6 +325,7 @@ function useOperationCollectionsPlugin(props: { }); const [collectionId, setCollectionId] = useState(''); const [isDeleteCollectionModalOpen, toggleDeleteCollectionModalOpen] = useToggle(); + const [isDeleteOperationModalOpen, toggleDeleteOperationModalOpen] = useToggle(); const [operationToDeleteId, setOperationToDeleteId] = useState(null); const [operationToEditId, setOperationToEditId] = useState(null); const { clearOperation, savedOperation, setSavedOperation } = useSyncOperationState({ @@ -565,6 +568,7 @@ function useOperationCollectionsPlugin(props: { node={node} canDelete={props.canDelete} canEdit={props.canEdit} + toggleDeleteOperationModalOpen={toggleDeleteOperationModalOpen} onDelete={setOperationToDeleteId} onEdit={setOperationToEditId} isChanged={!isSame && node.id === queryParamsOperationId} @@ -630,7 +634,8 @@ function useOperationCollectionsPlugin(props: { organizationId={props.organizationId} projectId={props.projectId} targetId={props.targetId} - close={() => setOperationToDeleteId(null)} + isOpen={isDeleteOperationModalOpen} + toggleModalOpen={toggleDeleteOperationModalOpen} operationId={operationToDeleteId} /> )} diff --git a/packages/web/app/src/stories/delete-operation-modal.stories.tsx b/packages/web/app/src/stories/delete-operation-modal.stories.tsx new file mode 100644 index 000000000..1c34f06ed --- /dev/null +++ b/packages/web/app/src/stories/delete-operation-modal.stories.tsx @@ -0,0 +1,33 @@ +import { DeleteOperationModalContent } from '@/components/target/laboratory/delete-operation-modal'; +import { Meta, StoryFn, StoryObj } from '@storybook/react'; + +const meta: Meta = { + title: 'Modals/Delete Operation Modal', + component: DeleteOperationModalContent, + argTypes: { + isOpen: { + control: 'boolean', + }, + toggleModalOpen: { + action: 'toggleModalOpen', + }, + handleDelete: { + action: 'onSubmit', + }, + }, +}; + +export default meta; + +type Story = StoryObj; + +const Template: StoryFn = args => { + return ; +}; + +export const Delete: Story = Template.bind({}); +Delete.args = { + isOpen: true, + toggleModalOpen: () => console.log('Close'), + handleDelete: () => console.log('Delete'), +};