added spectre css
This commit is contained in:
parent
2aea95c6ab
commit
abbcaf9166
@ -17,6 +17,7 @@
|
|||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-scripts": "4.0.3",
|
"react-scripts": "4.0.3",
|
||||||
|
"spectre.css": "^0.5.9",
|
||||||
"typescript": "^4.1.2",
|
"typescript": "^4.1.2",
|
||||||
"web-vitals": "^1.0.1"
|
"web-vitals": "^1.0.1"
|
||||||
},
|
},
|
||||||
@ -57,5 +58,6 @@
|
|||||||
"apollo": "^2.33.4",
|
"apollo": "^2.33.4",
|
||||||
"eslint": "^7.31.0",
|
"eslint": "^7.31.0",
|
||||||
"eslint-plugin-react": "^7.24.0"
|
"eslint-plugin-react": "^7.24.0"
|
||||||
}
|
},
|
||||||
|
"proxy": "http://localhost:8080"
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@ import FileBrowser from "./components/FileBrowser"
|
|||||||
|
|
||||||
const App: React.FC = () => {
|
const App: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="container">
|
||||||
<FileBrowser></FileBrowser>
|
<FileBrowser/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
36
src/components/Breadcrum.tsx
Normal file
36
src/components/Breadcrum.tsx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import React from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
|
||||||
|
interface Props{
|
||||||
|
path: string
|
||||||
|
onDirClick?: (path: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const Breadcrum: React.FC<Props> = (props) => {
|
||||||
|
const parts = props.path.split("/").filter(e=>e.length > 0)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ul className="breadcrumb">
|
||||||
|
<li className="breadcrumb-item">
|
||||||
|
<a onClick={()=>{
|
||||||
|
props.onDirClick?.("/")
|
||||||
|
}}>
|
||||||
|
Root
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{parts.map((e,i,arr)=>(
|
||||||
|
<li key={e} className="breadcrumb-item">
|
||||||
|
<a onClick={()=>{
|
||||||
|
props.onDirClick?.("/"+arr.slice(0,i-1).join("/"))
|
||||||
|
}}>{e}</a>
|
||||||
|
</li>))}
|
||||||
|
</ul>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Breadcrum.propTypes = {
|
||||||
|
path: PropTypes.string.isRequired,
|
||||||
|
onDirClick: PropTypes.func
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Breadcrum
|
@ -8,9 +8,14 @@ interface Props {
|
|||||||
|
|
||||||
const DirectoryElement: React.FC<Props> = (props) => {
|
const DirectoryElement: React.FC<Props> = (props) => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<>
|
||||||
📂 {props.dir.name}
|
<td>
|
||||||
</div>
|
📂
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{props.dir.name}
|
||||||
|
</td>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,17 +1,9 @@
|
|||||||
import React from "react"
|
import React from "react"
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
import { useOpenDirQuery } from "../generated/graphql"
|
import { useOpenDirQuery } from "../generated/graphql"
|
||||||
|
import Breadcrum from "./Breadcrum"
|
||||||
import FileBrowserElement from "./FileBrowserElement"
|
import FileBrowserElement from "./FileBrowserElement"
|
||||||
|
|
||||||
function parentDir(path:string): string {
|
|
||||||
if(path.endsWith("/")){
|
|
||||||
path = path.substr(0,path.length - 1)
|
|
||||||
}
|
|
||||||
const paths = path.split("/")
|
|
||||||
paths.pop()
|
|
||||||
return paths.join("/")
|
|
||||||
}
|
|
||||||
|
|
||||||
const FileBrowser: React.FC = () => {
|
const FileBrowser: React.FC = () => {
|
||||||
const [path,setPath] = useState("/")
|
const [path,setPath] = useState("/")
|
||||||
|
|
||||||
@ -23,24 +15,34 @@ const FileBrowser: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div onClick={()=>{
|
<Breadcrum path={path} onDirClick={(newPath)=>{
|
||||||
setPath(parentDir(path))
|
console.debug(newPath)
|
||||||
}}>
|
setPath(newPath)
|
||||||
..
|
}}/>
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
{ data?.files.map(v => (<FileBrowserElement
|
<table className="table table-striped table-hover">
|
||||||
key={v?.id}
|
<thead>
|
||||||
file={v}
|
<tr>
|
||||||
/>))}
|
<th>Icon</th>
|
||||||
|
<th>Name</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
{ data?.directorys.map(v => (<FileBrowserElement
|
{ data?.directorys.map(v => (<FileBrowserElement
|
||||||
key={v?.id}
|
key={v?.id}
|
||||||
dir={v}
|
dir={v}
|
||||||
onClick={(data)=>{
|
onClick={(data)=>{
|
||||||
setPath(data.id)
|
setPath(data.id)
|
||||||
}}
|
}}
|
||||||
/>))}
|
/>))}
|
||||||
|
|
||||||
|
{ data?.files.map(v => (<FileBrowserElement
|
||||||
|
key={v?.id}
|
||||||
|
file={v}
|
||||||
|
/>))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
@ -12,7 +12,7 @@ interface Props {
|
|||||||
|
|
||||||
const FileBrowserElement: React.FC<Props> = (props) => {
|
const FileBrowserElement: React.FC<Props> = (props) => {
|
||||||
return (
|
return (
|
||||||
<div onClick={()=>{
|
<tr onClick={()=>{
|
||||||
if(props.file){
|
if(props.file){
|
||||||
props.onClick?.(props.file)
|
props.onClick?.(props.file)
|
||||||
}else if(props.dir){
|
}else if(props.dir){
|
||||||
@ -20,7 +20,7 @@ const FileBrowserElement: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
}}>
|
}}>
|
||||||
{(props.file) ? <FileElement file={props.file}/>:(props.dir)?<DirectoryComponent dir={props.dir} />:<></>}
|
{(props.file) ? <FileElement file={props.file}/>:(props.dir)?<DirectoryComponent dir={props.dir} />:<></>}
|
||||||
</div>
|
</tr>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,9 +8,14 @@ interface Props {
|
|||||||
|
|
||||||
const FileElement: React.FC<Props> = (props) => {
|
const FileElement: React.FC<Props> = (props) => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<>
|
||||||
📄 {props.file.name}
|
<td>
|
||||||
</div>
|
📄
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{props.file.name}
|
||||||
|
</td>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,10 @@ import ReactDOM from "react-dom"
|
|||||||
import "./index.scss"
|
import "./index.scss"
|
||||||
import App from "./App"
|
import App from "./App"
|
||||||
import { ApolloClient, ApolloProvider, InMemoryCache } from "@apollo/client"
|
import { ApolloClient, ApolloProvider, InMemoryCache } from "@apollo/client"
|
||||||
|
import "spectre.css"
|
||||||
|
|
||||||
const client = new ApolloClient({
|
const client = new ApolloClient({
|
||||||
uri: "http://localhost:8080/graphql",
|
uri: "/graphql",
|
||||||
cache: new InMemoryCache()
|
cache: new InMemoryCache()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -12959,6 +12959,11 @@ spdy@^4.0.2:
|
|||||||
select-hose "^2.0.0"
|
select-hose "^2.0.0"
|
||||||
spdy-transport "^3.0.0"
|
spdy-transport "^3.0.0"
|
||||||
|
|
||||||
|
spectre.css@^0.5.9:
|
||||||
|
version "0.5.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/spectre.css/-/spectre.css-0.5.9.tgz#86c732d093036d9fdc0a2ba570f005e4023ae6ca"
|
||||||
|
integrity sha512-9jUqwZmCnvflrxFGcK+ize43TvjwDjqMwZPVubEtSIHzvinH0TBUESm1LcOJx3Ur7bdPaeOHQIjOqBl1Y5kLFw==
|
||||||
|
|
||||||
split-on-first@^1.0.0:
|
split-on-first@^1.0.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz"
|
resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz"
|
||||||
|
Loading…
Reference in New Issue
Block a user