diff --git a/src/components/DeleteScenarioModal/DeleteScenarioModal.js b/src/components/DeleteScenarioModal/DeleteScenarioModal.js new file mode 100644 index 000000000..ff71ef6b2 --- /dev/null +++ b/src/components/DeleteScenarioModal/DeleteScenarioModal.js @@ -0,0 +1,131 @@ +// Copyright (c) Cosmo Tech. +// Licensed under the MIT license. +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import PropTypes from 'prop-types'; +import { Box, Button, Dialog, IconButton, Stack, Typography } from '@mui/material'; +import { Icon } from '../Icon'; + +export const DeleteScenarioModal = ({ open, onClose, onConfirm, scenarioName }) => { + const { t } = useTranslation(); + + const handleConfirm = () => { + onConfirm(); + onClose(); + }; + + return ( + + + + theme.palette.secondary.main, + }} + > + {t('components.deleteScenarioModal.title', 'Delete Scenario')} + + + + + + + theme.palette.background.default, + borderRadius: '8px', + p: 3, + }} + > + theme.palette.secondary.main, + mb: 1, + }} + > + {scenarioName} + + theme.palette.text.secondary, + }} + > + {t('components.deleteScenarioModal.message', 'Are you sure you want to delete this scenario?')} + + + + + + + + + + ); +}; + +DeleteScenarioModal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, + scenarioName: PropTypes.string, +}; + +DeleteScenarioModal.defaultProps = { + scenarioName: '', +}; diff --git a/src/components/DeleteScenarioModal/index.js b/src/components/DeleteScenarioModal/index.js new file mode 100644 index 000000000..4a50af5d3 --- /dev/null +++ b/src/components/DeleteScenarioModal/index.js @@ -0,0 +1,4 @@ +// Copyright (c) Cosmo Tech. +// Licensed under the MIT license. + +export { DeleteScenarioModal } from './DeleteScenarioModal'; diff --git a/src/components/Icon/Icon.js b/src/components/Icon/Icon.js index 27a80e9ee..f5d8a18fa 100644 --- a/src/components/Icon/Icon.js +++ b/src/components/Icon/Icon.js @@ -1,6 +1,5 @@ // Copyright (c) Cosmo Tech. // Licensed under the MIT license. -// src/components/Icon/Icon.jsx import * as Icons from 'lucide-react'; import React from 'react'; import PropTypes from 'prop-types'; @@ -16,7 +15,7 @@ export const Icon = ({ name, size = 16, color, className, strokeWidth = 1.5 }) = }; Icon.propTypes = { - name: PropTypes.oneOf(Object.keys(Icons)).isRequired, + name: PropTypes.string.isRequired, size: PropTypes.number, color: PropTypes.string, className: PropTypes.string, diff --git a/src/components/index.js b/src/components/index.js index 4c3325c79..cd3161542 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -30,4 +30,5 @@ export { default as LoadingBackdrop } from './LoadingBackdrop'; export { default as StatusBar } from './StatusBar'; export { ModalWindow } from './ModalWindow'; export { PageHeader } from './PageHeader'; +export { DeleteScenarioModal } from './DeleteScenarioModal'; export { Icon } from './Icon'; diff --git a/src/views/ScenariosListing/ScenariosListingView.js b/src/views/ScenariosListing/ScenariosListingView.js index 216af1bed..e56232c28 100644 --- a/src/views/ScenariosListing/ScenariosListingView.js +++ b/src/views/ScenariosListing/ScenariosListingView.js @@ -1,14 +1,20 @@ // Copyright (c) Cosmo Tech. // Licensed under the MIT license. -import React, { useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import { Box } from '@mui/material'; +import { DeleteScenarioModal } from '../../components'; import { useCreateScenarioButton } from '../../components/CreateScenarioButton/CreateScenarioButtonHook'; import { ScenarioListing } from '../../components/ScenarioListing'; import { useSortedScenarioList } from '../../hooks/ScenarioListHooks'; +import { useDeleteRunner } from '../../state/runner/hooks'; export const ScenariosListingView = () => { const sortedScenarioList = useSortedScenarioList(); const { createScenario, workspaceId } = useCreateScenarioButton({}); + const deleteRunner = useDeleteRunner(); + + const [deleteModalOpen, setDeleteModalOpen] = useState(false); + const [scenarioToDelete, setScenarioToDelete] = useState(null); const handleCreateScenario = (form) => { const scenarioData = { @@ -27,6 +33,23 @@ export const ScenariosListingView = () => { console.log('TODO: open Share modal:', dataset); }, []); + const handleDeleteScenario = useCallback((scenario) => { + setScenarioToDelete(scenario); + setDeleteModalOpen(true); + }, []); + + const handleConfirmDelete = useCallback(() => { + if (scenarioToDelete) { + deleteRunner(scenarioToDelete.id); + setScenarioToDelete(null); + } + }, [deleteRunner, scenarioToDelete]); + + const handleCloseDeleteModal = useCallback(() => { + setDeleteModalOpen(false); + setScenarioToDelete(null); + }, []); + return ( { onCreateScenario={handleCreateScenario} onEditDataset={handleEditDataset} onShareDataset={handleShareDataset} + onDeleteScenario={handleDeleteScenario} + /> + );