From 177675bc897416f7994dd849dc7bb11ba072efe9 Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Tue, 19 Jul 2022 22:49:34 +0500 Subject: [PATCH] feat: implemented delete file/folder functionality --- web/src/components/tree.tsx | 49 +++++++++++++++++++++------ web/src/containers/Studio/editor.tsx | 2 ++ web/src/containers/Studio/index.tsx | 7 ++++ web/src/containers/Studio/sideBar.tsx | 25 ++++++++++++-- 4 files changed, 70 insertions(+), 13 deletions(-) diff --git a/web/src/components/tree.tsx b/web/src/components/tree.tsx index f8c7376..9b7db0f 100644 --- a/web/src/components/tree.tsx +++ b/web/src/components/tree.tsx @@ -3,12 +3,15 @@ import { Menu, MenuItem } from '@mui/material' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import ChevronRightIcon from '@mui/icons-material/ChevronRight' +import DeleteConfirmationModal from './deleteConfirmationModal' + import { TreeNode } from '../utils/types' -type TreeViewProps = { +type Props = { node: TreeNode selectedFilePath: string handleSelect: (filePath: string) => void + deleteNode: (path: string, isFolder: boolean) => void defaultExpanded?: string[] } @@ -16,8 +19,9 @@ const TreeView = ({ node, selectedFilePath, handleSelect, + deleteNode, defaultExpanded -}: TreeViewProps) => { +}: Props) => { return ( @@ -38,19 +43,17 @@ const TreeView = ({ export default TreeView -type TreeViewNodeProps = { - node: TreeNode - selectedFilePath: string - handleSelect: (filePath: string) => void - defaultExpanded?: string[] -} - const TreeViewNode = ({ node, selectedFilePath, handleSelect, + deleteNode, defaultExpanded -}: TreeViewNodeProps) => { +}: Props) => { + const [deleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = + useState(false) + const [deleteConfirmationModalMessage, setDeleteConfirmationModalMessage] = + useState('') const [childVisible, setChildVisibility] = useState(false) const [contextMenu, setContextMenu] = useState<{ mouseX: number @@ -90,6 +93,21 @@ const TreeViewNode = ({ } }, [defaultExpanded, node.relativePath]) + const handleDeleteItemClick = () => { + setContextMenu(null) + setDeleteConfirmationModalOpen(true) + setDeleteConfirmationModalMessage( + `Are you sure you want to delete ${node.isFolder ? 'folder' : 'file'} "${ + node.relativePath + }"?` + ) + } + + const deleteConfirm = () => { + setDeleteConfirmationModalOpen(false) + deleteNode(node.relativePath, node.isFolder) + } + return (
  • @@ -112,10 +130,17 @@ const TreeViewNode = ({ node={child} selectedFilePath={selectedFilePath} handleSelect={handleSelect} + deleteNode={deleteNode} defaultExpanded={defaultExpanded} /> ))}
  • + setContextMenu(null)} @@ -131,7 +156,9 @@ const TreeViewNode = ({ {item} ))} Rename - Delete + + Delete +
    ) diff --git a/web/src/containers/Studio/editor.tsx b/web/src/containers/Studio/editor.tsx index 4889282..a3b0be0 100644 --- a/web/src/containers/Studio/editor.tsx +++ b/web/src/containers/Studio/editor.tsx @@ -107,6 +107,8 @@ const SASjsEditor = ({ setOpenModal(true) }) .finally(() => setIsLoading(false)) + } else { + setFileContent('') } }, [selectedFilePath]) diff --git a/web/src/containers/Studio/index.tsx b/web/src/containers/Studio/index.tsx index 5d556ca..1dd7051 100644 --- a/web/src/containers/Studio/index.tsx +++ b/web/src/containers/Studio/index.tsx @@ -56,6 +56,12 @@ const Studio = () => { ) => { if (node.relativePath === path) { removeNodeFromParent(parentNode, path) + // reset selected file path and file path query param + if ( + node.relativePath === selectedFilePath || + selectedFilePath.startsWith(node.relativePath) + ) + setSearchParams({}) return true } if (Array.isArray(node.children)) { @@ -81,6 +87,7 @@ const Studio = () => { selectedFilePath={selectedFilePath} directoryData={directoryData} handleSelect={handleSelect} + removeFileFromTree={removeFileFromTree} /> void + removeFileFromTree: (filePath: string) => void } -const SideBar = ({ selectedFilePath, directoryData, handleSelect }: Props) => { +const SideBar = ({ + selectedFilePath, + directoryData, + handleSelect, + removeFileFromTree +}: Props) => { const defaultExpanded = useMemo(() => { const splittedPath = selectedFilePath.split('/') const arr = [''] @@ -27,6 +33,20 @@ const SideBar = ({ selectedFilePath, directoryData, handleSelect }: Props) => { return arr }, [selectedFilePath]) + const deleteNode = (path: string, isFolder: boolean) => { + const axiosPromise = axios.delete( + `/SASjsApi/drive/${ + isFolder ? `folder?_folderPath=${path}` : `file?_filePath=${path}` + }` + ) + + axiosPromise + .then(() => removeFileFromTree(path)) + .catch((err) => { + console.log(err) + }) + } + return ( { node={directoryData} selectedFilePath={selectedFilePath} handleSelect={handleSelect} + deleteNode={deleteNode} defaultExpanded={defaultExpanded} /> )}