made drag and drop handler global
This commit is contained in:
parent
c12181fe16
commit
06b7c323ae
@ -8,7 +8,7 @@ import uploadFile from "../functions/uploadFile"
|
|||||||
import { useCopyMutation, useCreateDirMutation, useDeleteDirMutation, useDeleteFileMutation, useMoveMutation, useOpenDirQuery } from "../generated/graphql"
|
import { useCopyMutation, useCreateDirMutation, useDeleteDirMutation, useDeleteFileMutation, useMoveMutation, useOpenDirQuery } from "../generated/graphql"
|
||||||
import Breadcrum from "./Breadcrum"
|
import Breadcrum from "./Breadcrum"
|
||||||
import CreateDirButton from "./CreateDirButton"
|
import CreateDirButton from "./CreateDirButton"
|
||||||
import DragAndDrop from "./DragAndDrop"
|
import GlobalDragAndDrop from "./GlobalDragAndDrop"
|
||||||
import FileBrowserContextMenu, { Action, CONTEXT_MENU_DIR, CONTEXT_MENU_FILE } from "./FileBrowserContextMenu"
|
import FileBrowserContextMenu, { Action, CONTEXT_MENU_DIR, CONTEXT_MENU_FILE } from "./FileBrowserContextMenu"
|
||||||
import FileOpen from "./FileOpen"
|
import FileOpen from "./FileOpen"
|
||||||
import FileUploadButton from "./FileUploadButton"
|
import FileUploadButton from "./FileUploadButton"
|
||||||
@ -103,84 +103,82 @@ const FileBrowser: React.FC<RouteComponentProps> = (props) => {
|
|||||||
onSelect={onContextSelect}
|
onSelect={onContextSelect}
|
||||||
pasteActive={!!srcID}
|
pasteActive={!!srcID}
|
||||||
/>
|
/>
|
||||||
<DragAndDrop
|
<GlobalDragAndDrop
|
||||||
handleDrop={async (files)=>{
|
handleDrop={async (files)=>{
|
||||||
await handleDrop(files)
|
await handleDrop(files)
|
||||||
}}
|
}}/>
|
||||||
>
|
<div className="flex justify-between h-12">
|
||||||
<div className="flex justify-between h-12">
|
<Breadcrum path={path} onDirClick={(newPath)=>{
|
||||||
<Breadcrum path={path} onDirClick={(newPath)=>{
|
props.history.push(newPath.toURI())
|
||||||
props.history.push(newPath.toURI())
|
}}/>
|
||||||
}}/>
|
<div className="ml-auto">
|
||||||
<div className="ml-auto">
|
<CreateDirButton
|
||||||
<CreateDirButton
|
onPressed={async (dirName)=>{
|
||||||
onPressed={async (dirName)=>{
|
const dirID = new ObjID(path.bucket,path.key + dirName + "/")
|
||||||
const dirID = new ObjID(path.bucket,path.key + dirName + "/")
|
await createDirMutation({variables:{path: dirID}})
|
||||||
await createDirMutation({variables:{path: dirID}})
|
refetchDir()
|
||||||
refetchDir()
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FileUploadButton
|
|
||||||
onUpload={(files)=>handleDrop(files)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<MoreMenu />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FileBrowserList
|
|
||||||
directorys={data?.directories || []}
|
|
||||||
files={data?.files || []}
|
|
||||||
|
|
||||||
onDirClick={(e,path)=>{
|
|
||||||
props.history.push(path.toURI())
|
|
||||||
}}
|
|
||||||
|
|
||||||
onDirContext={(e,path)=>{
|
|
||||||
e.preventDefault()
|
|
||||||
showDirContext(e,{props:{id:path}})
|
|
||||||
}}
|
|
||||||
|
|
||||||
onFileClick={(e,id)=>{
|
|
||||||
setOpenFileId(id)
|
|
||||||
setShowFile(true)
|
|
||||||
}}
|
|
||||||
|
|
||||||
onFileContext={(e,id)=>{
|
|
||||||
e.preventDefault()
|
|
||||||
showFileContext(e,{props:{id}})
|
|
||||||
}}
|
|
||||||
|
|
||||||
editId={editID}
|
|
||||||
editEnable={editEnable}
|
|
||||||
|
|
||||||
onRenameDone={async (id,changed,newName)=>{
|
|
||||||
setEditEnable(false)
|
|
||||||
if (changed){
|
|
||||||
// TODO: maybe change the name on client so it seems more smooth rather then haveing it refetch
|
|
||||||
// TODO: input check & error handling
|
|
||||||
await moveMutation({variables:{
|
|
||||||
src:id,
|
|
||||||
dest: id.rename(newName)
|
|
||||||
}})
|
|
||||||
refetchDir()
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{loading &&
|
|
||||||
<div className="flex justify-center mt-4">
|
|
||||||
<Spinner className="animate-spin h-6 w-6 dark:text-white" />
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
<FileOpen id={openFileId} show={showFile} onCloseClick={()=>{
|
<div>
|
||||||
setShowFile(false)
|
<FileUploadButton
|
||||||
}} />
|
onUpload={(files)=>handleDrop(files)}
|
||||||
</DragAndDrop>
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<MoreMenu />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<FileBrowserList
|
||||||
|
directorys={data?.directories || []}
|
||||||
|
files={data?.files || []}
|
||||||
|
|
||||||
|
onDirClick={(e,path)=>{
|
||||||
|
props.history.push(path.toURI())
|
||||||
|
}}
|
||||||
|
|
||||||
|
onDirContext={(e,path)=>{
|
||||||
|
e.preventDefault()
|
||||||
|
showDirContext(e,{props:{id:path}})
|
||||||
|
}}
|
||||||
|
|
||||||
|
onFileClick={(e,id)=>{
|
||||||
|
setOpenFileId(id)
|
||||||
|
setShowFile(true)
|
||||||
|
}}
|
||||||
|
|
||||||
|
onFileContext={(e,id)=>{
|
||||||
|
e.preventDefault()
|
||||||
|
showFileContext(e,{props:{id}})
|
||||||
|
}}
|
||||||
|
|
||||||
|
editId={editID}
|
||||||
|
editEnable={editEnable}
|
||||||
|
|
||||||
|
onRenameDone={async (id,changed,newName)=>{
|
||||||
|
setEditEnable(false)
|
||||||
|
if (changed){
|
||||||
|
// TODO: maybe change the name on client so it seems more smooth rather then haveing it refetch
|
||||||
|
// TODO: input check & error handling
|
||||||
|
await moveMutation({variables:{
|
||||||
|
src:id,
|
||||||
|
dest: id.rename(newName)
|
||||||
|
}})
|
||||||
|
refetchDir()
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{loading &&
|
||||||
|
<div className="flex justify-center mt-4">
|
||||||
|
<Spinner className="animate-spin h-6 w-6 dark:text-white" />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<FileOpen id={openFileId} show={showFile} onCloseClick={()=>{
|
||||||
|
setShowFile(false)
|
||||||
|
}} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -10,12 +10,10 @@ interface Props {
|
|||||||
handleDrop?: (files: FileList)=>void
|
handleDrop?: (files: FileList)=>void
|
||||||
}
|
}
|
||||||
|
|
||||||
const DragAndDrop: React.FC<Props> = (props) => {
|
const GlobalDragAndDrop: React.FC<Props> = (props) => {
|
||||||
const dropRef = React.createRef<HTMLDivElement>()
|
|
||||||
const [hover,setHover] = useState(false)
|
const [hover,setHover] = useState(false)
|
||||||
|
|
||||||
function handleDragEnter(event: DragEvent) {
|
function handleDragEnter(event: DragEvent) {
|
||||||
// console.debug("dragenter",event)
|
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setHover(true)
|
setHover(true)
|
||||||
@ -23,7 +21,6 @@ const DragAndDrop: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleDragLeave(event: DragEvent) {
|
function handleDragLeave(event: DragEvent) {
|
||||||
// console.debug("dragleave",event)
|
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setHover(false)
|
setHover(false)
|
||||||
@ -38,7 +35,6 @@ const DragAndDrop: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleDrop(event: DragEvent) {
|
function handleDrop(event: DragEvent) {
|
||||||
console.debug("drop",event)
|
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setHover(false)
|
setHover(false)
|
||||||
@ -49,31 +45,25 @@ const DragAndDrop: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(dropRef.current){
|
document.addEventListener("dragenter",handleDragEnter)
|
||||||
dropRef.current.addEventListener("dragenter",handleDragEnter)
|
document.addEventListener("dragleave",handleDragLeave)
|
||||||
dropRef.current.addEventListener("dragleave",handleDragLeave)
|
document.addEventListener("dragover",handleDragOver)
|
||||||
dropRef.current.addEventListener("dragover",handleDragOver)
|
document.addEventListener("drop",handleDrop)
|
||||||
dropRef.current.addEventListener("drop",handleDrop)
|
|
||||||
|
return ()=>{
|
||||||
|
document.removeEventListener("dragenter",handleDragEnter)
|
||||||
|
document.removeEventListener("dragleave",handleDragLeave)
|
||||||
|
document.removeEventListener("dragover",handleDragOver)
|
||||||
|
document.removeEventListener("drop",handleDrop)
|
||||||
|
|
||||||
return ()=>{
|
|
||||||
if (dropRef.current){
|
|
||||||
dropRef.current.removeEventListener("dragenter",handleDragEnter)
|
|
||||||
dropRef.current.removeEventListener("dragleave",handleDragLeave)
|
|
||||||
dropRef.current.removeEventListener("dragover",handleDragOver)
|
|
||||||
dropRef.current.removeEventListener("drop",handleDrop)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},[])
|
},[])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={dropRef}
|
<div className={`fixed top-0 left-0 w-full h-full z-10 pointer-events-none
|
||||||
className={`fixed top-0 left-0 w-full h-full z-10
|
${hover? "border-dashed border-gray-600 border-4":""}`} />
|
||||||
${hover? "border-dashed border-gray-600 border-4":""}`}
|
|
||||||
>
|
|
||||||
{props.children}
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default DragAndDrop
|
export default GlobalDragAndDrop
|
Loading…
Reference in New Issue
Block a user