mirror of
https://github.com/sasjs/server.git
synced 2025-12-11 03:34:35 +00:00
chore(web-refactor): state uplifted for drive container in web component
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState, useEffect, useCallback } from 'react'
|
||||||
|
import { useLocation } from 'react-router-dom'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
import CssBaseline from '@mui/material/CssBaseline'
|
import CssBaseline from '@mui/material/CssBaseline'
|
||||||
import Box from '@mui/material/Box'
|
import Box from '@mui/material/Box'
|
||||||
@@ -6,12 +8,56 @@ import Box from '@mui/material/Box'
|
|||||||
import SideBar from './sideBar'
|
import SideBar from './sideBar'
|
||||||
import Main from './main'
|
import Main from './main'
|
||||||
|
|
||||||
|
export interface TreeNode {
|
||||||
|
name: string
|
||||||
|
relativePath: string
|
||||||
|
absolutePath: string
|
||||||
|
children: Array<TreeNode>
|
||||||
|
}
|
||||||
|
|
||||||
const Drive = () => {
|
const Drive = () => {
|
||||||
|
const location = useLocation()
|
||||||
|
const baseUrl = window.location.origin
|
||||||
|
|
||||||
const [selectedFilePath, setSelectedFilePath] = useState('')
|
const [selectedFilePath, setSelectedFilePath] = useState('')
|
||||||
|
const [directoryData, setDirectoryData] = useState<TreeNode | null>(null)
|
||||||
|
|
||||||
|
const setFilePathOnMount = useCallback(() => {
|
||||||
|
const queryParams = new URLSearchParams(location.search)
|
||||||
|
setSelectedFilePath(queryParams.get('filePath') ?? '')
|
||||||
|
}, [location.search])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
axios
|
||||||
|
.get(`/SASjsApi/drive/fileTree`)
|
||||||
|
.then((res: any) => {
|
||||||
|
if (res.data && res.data?.status === 'success') {
|
||||||
|
setDirectoryData(res.data.tree)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
setFilePathOnMount()
|
||||||
|
}, [setFilePathOnMount])
|
||||||
|
|
||||||
|
const handleSelect = (node: TreeNode) => {
|
||||||
|
if (node.children.length) return
|
||||||
|
|
||||||
|
if (!node.name.includes('.')) return
|
||||||
|
|
||||||
|
window.history.pushState(
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
`${baseUrl}/#/SASjsDrive?filePath=${node.relativePath}`
|
||||||
|
)
|
||||||
|
setSelectedFilePath(node.relativePath)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{ display: 'flex' }}>
|
<Box sx={{ display: 'flex' }}>
|
||||||
<CssBaseline />
|
<CssBaseline />
|
||||||
<SideBar setSelectedFilePath={setSelectedFilePath} />
|
<SideBar directoryData={directoryData} handleSelect={handleSelect} />
|
||||||
<Main selectedFilePath={selectedFilePath} />
|
<Main selectedFilePath={selectedFilePath} />
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import React, { useState, useEffect, useCallback } from 'react'
|
import React from 'react'
|
||||||
import axios from 'axios'
|
|
||||||
import { useLocation } from 'react-router-dom'
|
|
||||||
|
|
||||||
import { makeStyles } from '@mui/styles'
|
import { makeStyles } from '@mui/styles'
|
||||||
|
|
||||||
@@ -16,12 +14,7 @@ import TreeItem from '@mui/lab/TreeItem'
|
|||||||
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
|
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
|
||||||
import ChevronRightIcon from '@mui/icons-material/ChevronRight'
|
import ChevronRightIcon from '@mui/icons-material/ChevronRight'
|
||||||
|
|
||||||
interface TreeNode {
|
import { TreeNode } from '.'
|
||||||
name: string
|
|
||||||
relativePath: string
|
|
||||||
absolutePath: string
|
|
||||||
children: Array<TreeNode>
|
|
||||||
}
|
|
||||||
|
|
||||||
const useStyles = makeStyles(() => ({
|
const useStyles = makeStyles(() => ({
|
||||||
root: {
|
root: {
|
||||||
@@ -36,46 +29,14 @@ const useStyles = makeStyles(() => ({
|
|||||||
|
|
||||||
const drawerWidth = 240
|
const drawerWidth = 240
|
||||||
|
|
||||||
const SideBar = (props: any) => {
|
type Props = {
|
||||||
const location = useLocation()
|
directoryData: TreeNode | null
|
||||||
const baseUrl = window.location.origin
|
handleSelect: (node: TreeNode) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const SideBar = ({ directoryData, handleSelect }: Props) => {
|
||||||
const classes = useStyles()
|
const classes = useStyles()
|
||||||
|
|
||||||
const { setSelectedFilePath } = props
|
|
||||||
const [directoryData, setDirectoryData] = useState<TreeNode | null>(null)
|
|
||||||
|
|
||||||
const setFilePathOnMount = useCallback(() => {
|
|
||||||
const queryParams = new URLSearchParams(location.search)
|
|
||||||
setSelectedFilePath(queryParams.get('filePath'))
|
|
||||||
}, [location.search, setSelectedFilePath])
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
axios
|
|
||||||
.get(`/SASjsApi/drive/fileTree`)
|
|
||||||
.then((res: any) => {
|
|
||||||
if (res.data && res.data?.status === 'success') {
|
|
||||||
setDirectoryData(res.data.tree)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log(err)
|
|
||||||
})
|
|
||||||
setFilePathOnMount()
|
|
||||||
}, [setFilePathOnMount])
|
|
||||||
|
|
||||||
const handleSelect = (node: TreeNode) => {
|
|
||||||
if (node.children.length) return
|
|
||||||
|
|
||||||
if (!node.name.includes('.')) return
|
|
||||||
|
|
||||||
window.history.pushState(
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
`${baseUrl}/#/SASjsDrive?filePath=${node.relativePath}`
|
|
||||||
)
|
|
||||||
setSelectedFilePath(node.relativePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
const renderTree = (nodes: TreeNode) => (
|
const renderTree = (nodes: TreeNode) => (
|
||||||
<TreeItem
|
<TreeItem
|
||||||
classes={{ root: classes.root }}
|
classes={{ root: classes.root }}
|
||||||
|
|||||||
Reference in New Issue
Block a user