From fb6171349abddcb23849fb0e1112ef5b3f1cab52 Mon Sep 17 00:00:00 2001 From: Eugen Ciur Date: Mon, 16 Sep 2024 08:00:41 +0200 Subject: [PATCH] add viewer context --- .../document/components/Contextmenu.tsx | 89 +++++++++++++++++++ .../features/document/components/Viewer.tsx | 44 ++++++++- ui2/src/types.ts | 5 ++ 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 ui2/src/features/document/components/Contextmenu.tsx diff --git a/ui2/src/features/document/components/Contextmenu.tsx b/ui2/src/features/document/components/Contextmenu.tsx new file mode 100644 index 000000000..e5fe89985 --- /dev/null +++ b/ui2/src/features/document/components/Contextmenu.tsx @@ -0,0 +1,89 @@ +import {useAppSelector} from "@/app/hooks" +import type {Coord} from "@/types" +import {Box, Menu, rem} from "@mantine/core" +import { + IconEdit, + IconRotate, + IconRotateClockwise, + IconTrash, + IconX +} from "@tabler/icons-react" +import {useContext} from "react" + +import PanelContext from "@/contexts/PanelContext" +import {selectSelectedPages} from "@/features/document/documentVersSlice" +import type {PanelMode} from "@/types" + +interface Args { + opened: boolean + onChange: (opened: boolean) => void + position: Coord +} + +export default function ContextMenu({position, opened, onChange}: Args) { + const mode: PanelMode = useContext(PanelContext) + const selectedPages = useAppSelector(s => selectSelectedPages(s, mode)) || [] + + return ( + + + + + + } + > + Change title + + {selectedPages.length > 0 && ( + + } + > + Rotate clockwise + + )} + {selectedPages.length > 0 && ( + + } + > + Rotate couter-clockwise + + )} + {selectedPages.length > 0 && ( + + } + > + Delete pages + + )} + + Danger zone + } + > + Delete Document + + + + ) +} diff --git a/ui2/src/features/document/components/Viewer.tsx b/ui2/src/features/document/components/Viewer.tsx index 2b23da4bf..99b464f68 100644 --- a/ui2/src/features/document/components/Viewer.tsx +++ b/ui2/src/features/document/components/Viewer.tsx @@ -7,15 +7,19 @@ import {useNavigate} from "react-router-dom" import Breadcrumbs from "@/components/Breadcrumbs" import PanelContext from "@/contexts/PanelContext" import {useGetDocumentQuery} from "@/features/document/apiSlice" +import {useRef, useState} from "react" +import {HIDDEN} from "@/cconstants" import { currentDocVerUpdated, currentNodeChanged, selectContentHeight, selectCurrentNodeID } from "@/features/ui/uiSlice" -import type {NType, PanelMode} from "@/types" +import type {Coord, NType, PanelMode} from "@/types" +import {useDisclosure} from "@mantine/hooks" import ActionButtons from "./ActionButtons" +import ContextMenu from "./Contextmenu" import PagesHaveChangedDialog from "./PageHaveChangedDialog" import Pages from "./Pages" import Thumbnails from "./Thumbnails" @@ -23,6 +27,9 @@ import ThumbnailsToggle from "./ThumbnailsToggle" import classes from "./Viewer.module.css" export default function Viewer() { + const ref = useRef(null) + const [contextMenuPosition, setContextMenuPosition] = useState(HIDDEN) + const [opened, {open, close}] = useDisclosure() const mode: PanelMode = useContext(PanelContext) const height = useAppSelector(s => selectContentHeight(s, mode)) const navigate = useNavigate() @@ -30,6 +37,15 @@ export default function Viewer() { const currentNodeID = useAppSelector(s => selectCurrentNodeID(s, mode)) const {currentData: doc, isSuccess} = useGetDocumentQuery(currentNodeID!) + const onContextMenu = (ev: MouseEvent) => { + ev.preventDefault() // prevents default context menu + + let new_y = ev.clientY + let new_x = ev.clientX + setContextMenuPosition({y: new_y, x: new_x}) + open() + } + const onClick = (node: NType) => { if (mode == "secondary" && node.ctype == "folder") { dispatch( @@ -41,6 +57,12 @@ export default function Viewer() { } } + const onContextMenuChange = (cmOpened: boolean) => { + if (!cmOpened) { + close() + } + } + useEffect(() => { if (doc) { const maxVerNum = Math.max(...doc.versions.map(v => v.number)) @@ -51,15 +73,33 @@ export default function Viewer() { } }, [isSuccess, doc]) + useEffect(() => { + // detect right click outside + if (ref.current) { + ref.current.addEventListener("contextmenu", onContextMenu) + } + + return () => { + if (ref.current) { + ref.current.removeEventListener("contextmenu", onContextMenu) + } + } + }, []) + return (
- + +
) diff --git a/ui2/src/types.ts b/ui2/src/types.ts index 4cc56459f..0988dfcd7 100644 --- a/ui2/src/types.ts +++ b/ui2/src/types.ts @@ -351,3 +351,8 @@ export type PaginatedArgs = { page_number?: number page_size?: number } + +export type Coord = { + x: number + y: number +}