mirror of
https://github.com/get-drexa/drive.git
synced 2025-12-01 05:51:39 +00:00
fix: directory content table context menu
fix radix throwing event.preventDefault is not a function error on right click in DirectoryContentTable Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
@@ -39,12 +39,14 @@ import { TextFileIcon } from "../../components/icons/text-file-icon"
|
|||||||
import { type FileDragInfo, useFileDrop } from "../../files/use-file-drop"
|
import { type FileDragInfo, useFileDrop } from "../../files/use-file-drop"
|
||||||
import { cn } from "../../lib/utils"
|
import { cn } from "../../lib/utils"
|
||||||
import { DirectoryPageContext } from "./context"
|
import { DirectoryPageContext } from "./context"
|
||||||
import { contextMenuTargeItemsAtom } from "./state"
|
|
||||||
|
|
||||||
type DirectoryContentTableProps = {
|
type DirectoryContentTableProps = {
|
||||||
filterFn: (item: FileSystemItem) => boolean
|
filterFn: (item: FileSystemItem) => boolean
|
||||||
fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null>
|
fileDragInfoAtom: PrimitiveAtom<FileDragInfo | null>
|
||||||
onContextMenu: (items: FileSystemItem[]) => void
|
onContextMenu: (
|
||||||
|
row: Row<FileSystemItem>,
|
||||||
|
table: TableType<FileSystemItem>,
|
||||||
|
) => void
|
||||||
onOpenFile: (file: Doc<"files">) => void
|
onOpenFile: (file: Doc<"files">) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,15 +146,7 @@ function useTableColumns(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function DirectoryContentTable(props: DirectoryContentTableProps) {
|
export function DirectoryContentTable({
|
||||||
return (
|
|
||||||
<div className="w-full">
|
|
||||||
<DirectoryContentTableContent {...props} />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function DirectoryContentTableContent({
|
|
||||||
filterFn,
|
filterFn,
|
||||||
onContextMenu,
|
onContextMenu,
|
||||||
fileDragInfoAtom,
|
fileDragInfoAtom,
|
||||||
@@ -190,17 +184,10 @@ export function DirectoryContentTableContent({
|
|||||||
row: Row<FileSystemItem>,
|
row: Row<FileSystemItem>,
|
||||||
_event: React.MouseEvent,
|
_event: React.MouseEvent,
|
||||||
) => {
|
) => {
|
||||||
const target = store.get(contextMenuTargeItemsAtom)
|
if (!row.getIsSelected()) {
|
||||||
if (target.length > 0) {
|
|
||||||
onContextMenu(target)
|
|
||||||
} else if (row.getIsSelected()) {
|
|
||||||
onContextMenu(
|
|
||||||
table.getSelectedRowModel().rows.map((row) => row.original),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
selectRow(row)
|
selectRow(row)
|
||||||
onContextMenu([row.original])
|
|
||||||
}
|
}
|
||||||
|
onContextMenu(row, table)
|
||||||
}
|
}
|
||||||
|
|
||||||
const selectRow = (row: Row<FileSystemItem>) => {
|
const selectRow = (row: Row<FileSystemItem>) => {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
} from "@fileone/convex/model/filesystem"
|
} from "@fileone/convex/model/filesystem"
|
||||||
import { useMutation } from "@tanstack/react-query"
|
import { useMutation } from "@tanstack/react-query"
|
||||||
import { createFileRoute } from "@tanstack/react-router"
|
import { createFileRoute } from "@tanstack/react-router"
|
||||||
|
import type { Row, Table } from "@tanstack/react-table"
|
||||||
import {
|
import {
|
||||||
useMutation as useContextMutation,
|
useMutation as useContextMutation,
|
||||||
useMutation as useConvexMutation,
|
useMutation as useConvexMutation,
|
||||||
@@ -98,6 +99,19 @@ function RouteComponent() {
|
|||||||
[setOpenedFile],
|
[setOpenedFile],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const handleContextMenuRequest = (
|
||||||
|
row: Row<FileSystemItem>,
|
||||||
|
table: Table<FileSystemItem>,
|
||||||
|
) => {
|
||||||
|
if (row.getIsSelected()) {
|
||||||
|
setContextMenuTargetItems(
|
||||||
|
table.getSelectedRowModel().rows.map((row) => row.original),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
setContextMenuTargetItems([row.original])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!directory || !directoryContent || !rootDirectory) {
|
if (!directory || !directoryContent || !rootDirectory) {
|
||||||
return <DirectoryPageSkeleton />
|
return <DirectoryPageSkeleton />
|
||||||
}
|
}
|
||||||
@@ -114,16 +128,17 @@ function RouteComponent() {
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div className="w-full">
|
{/* DirectoryContentContextMenu must wrap div instead of DirectoryContentTable, otherwise radix will throw "event.preventDefault is not a function" error, idk why */}
|
||||||
<DirectoryContentContextMenu>
|
<DirectoryContentContextMenu>
|
||||||
|
<div className="w-full">
|
||||||
<DirectoryContentTable
|
<DirectoryContentTable
|
||||||
filterFn={tableFilter}
|
filterFn={tableFilter}
|
||||||
fileDragInfoAtom={fileDragInfoAtom}
|
fileDragInfoAtom={fileDragInfoAtom}
|
||||||
onContextMenu={setContextMenuTargetItems}
|
onContextMenu={handleContextMenuRequest}
|
||||||
onOpenFile={openFile}
|
onOpenFile={openFile}
|
||||||
/>
|
/>
|
||||||
</DirectoryContentContextMenu>
|
|
||||||
</div>
|
</div>
|
||||||
|
</DirectoryContentContextMenu>
|
||||||
|
|
||||||
<WithAtom atom={newFileTypeAtom}>
|
<WithAtom atom={newFileTypeAtom}>
|
||||||
{(newFileType, setNewFileType) => (
|
{(newFileType, setNewFileType) => (
|
||||||
@@ -168,6 +183,7 @@ function DirectoryContentContextMenu({
|
|||||||
const [target, setTarget] = useAtom(contextMenuTargetItemsAtom)
|
const [target, setTarget] = useAtom(contextMenuTargetItemsAtom)
|
||||||
const setOptimisticDeletedItems = useSetAtom(optimisticDeletedItemsAtom)
|
const setOptimisticDeletedItems = useSetAtom(optimisticDeletedItemsAtom)
|
||||||
const moveToTrashMutation = useContextMutation(api.filesystem.moveToTrash)
|
const moveToTrashMutation = useContextMutation(api.filesystem.moveToTrash)
|
||||||
|
|
||||||
const { mutate: moveToTrash } = useMutation({
|
const { mutate: moveToTrash } = useMutation({
|
||||||
mutationFn: moveToTrashMutation,
|
mutationFn: moveToTrashMutation,
|
||||||
onMutate: ({ handles }) => {
|
onMutate: ({ handles }) => {
|
||||||
@@ -205,6 +221,8 @@ function DirectoryContentContextMenu({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("target", target)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ContextMenu
|
<ContextMenu
|
||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
@@ -214,7 +232,7 @@ function DirectoryContentContextMenu({
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ContextMenuTrigger asChild>{children}</ContextMenuTrigger>
|
<ContextMenuTrigger asChild>{children}</ContextMenuTrigger>
|
||||||
{target && (
|
{target.length > 0 && (
|
||||||
<ContextMenuContent>
|
<ContextMenuContent>
|
||||||
<RenameMenuItem />
|
<RenameMenuItem />
|
||||||
<ContextMenuItem onClick={handleDelete}>
|
<ContextMenuItem onClick={handleDelete}>
|
||||||
|
|||||||
Reference in New Issue
Block a user