Skip to content

Commit 03a7693

Browse files
authored
fix viewer context menu actions (#687)
1 parent 58f6b57 commit 03a7693

38 files changed

+758
-809
lines changed

frontend/apps/kommon.dev/src/components/NavBar/NavBar.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ export default function Navbar() {
88
<NavLink to="/" end>
99
&lt;SubmitButton /&gt;
1010
</NavLink>
11+
<NavLink to="/edit-node-modal" end>
12+
&lt;EditNodeTitleModal /&gt;
13+
</NavLink>
1114
</Stack>
1215
</nav>
1316
)

frontend/apps/kommon.dev/src/index.css

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ a:hover {
2323
}
2424

2525
body {
26-
margin: 0;
27-
display: flex;
28-
place-items: center;
2926
min-width: 320px;
3027
min-height: 100vh;
3128
}

frontend/apps/kommon.dev/src/main.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {createRoot} from "react-dom/client"
44
import {BrowserRouter, Route, Routes} from "react-router"
55
import AppShell from "./app/AppShell"
66
import "./index.css"
7+
import EditNodeTitleModal from "./pages/EditNodeTitle"
78
import SubmitButton from "./pages/SubmitButton"
89

910
createRoot(document.getElementById("root")!).render(
@@ -13,6 +14,7 @@ createRoot(document.getElementById("root")!).render(
1314
<Routes>
1415
<Route path="/" element={<AppShell />}>
1516
<Route index element={<SubmitButton />} />
17+
<Route path="edit-node-modal" element={<EditNodeTitleModal />} />
1618
</Route>
1719
</Routes>
1820
</BrowserRouter>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {Button, Checkbox, Group, Stack} from "@mantine/core"
2+
import {EditNodeTitleModal} from "kommon"
3+
import {useState} from "react"
4+
5+
export default function EditNodeTitleContainer() {
6+
const [inProgress, setInProgress] = useState<boolean>(false)
7+
const [opened, setOpened] = useState<boolean>(false)
8+
9+
return (
10+
<Stack>
11+
<Group>
12+
<Button onClick={() => setOpened(!opened)}>Toggle</Button>
13+
<Checkbox
14+
label="Is Loading"
15+
onClick={() => setInProgress(!inProgress)}
16+
/>
17+
</Group>
18+
<EditNodeTitleModal
19+
inProgress={inProgress}
20+
onCancel={() => setOpened(false)}
21+
value={"letter.pdf"}
22+
opened={opened}
23+
/>
24+
</Stack>
25+
)
26+
}

frontend/apps/ui/public/localization/de/_default.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,29 @@
3535
"allowedExtentions": "Erlaubte Dateiendungen:",
3636
"caseSensitivity": "Groß- und Kleinschreibung spielt keine Rolle."
3737
},
38+
"editNodeTitleModal": {
39+
"title": "Dokumenttitel bearbeiten",
40+
"newTitleLabel": "Neuer Dokumenttitel",
41+
"placeholder": "Titel"
42+
},
43+
"viewerContextMenu": {
44+
"changeTitle": "Titel ändern",
45+
"ocrText": "OCR-Text",
46+
"rotateClockwise": "Im Uhrzeigersinn drehen",
47+
"rotateCounterClockwise": "Gegen den Uhrzeigersinn drehen",
48+
"resetChanges": "Änderungen zurücksetzen",
49+
"saveChanges": "Änderungen speichern",
50+
"moveDocument": "Dokument verschieben",
51+
"extractPages": "Seiten extrahieren",
52+
"deletePages": "Seiten löschen",
53+
"deleteDocument": "Dokument löschen",
54+
"dangerZone": "Gefahrenzone"
55+
},
56+
"deleteEntireDocumentConfirmDialog": {
57+
"title": "Dokument löschen",
58+
"mainMessage": "Möchtest du dieses Dokument wirklich löschen?",
59+
"confirmButtonText": "Ja, lösche diese Dokument"
60+
},
3861
"load-more": "Mehr anzeigen",
3962
"app.version": "Version",
4063
"me": "Ich",

frontend/apps/ui/public/localization/en/_default.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,29 @@
3535
"allowedExtentions": "Allowed extensions:",
3636
"caseSensitivity": "Uppercase and lowercase letters don't matter."
3737
},
38+
"editNodeTitleModal": {
39+
"title": "Edit Title",
40+
"newTitleLabel": "New Title",
41+
"placeholder": "Title"
42+
},
43+
"viewerContextMenu": {
44+
"changeTitle": "Change Title",
45+
"ocrText": "OCR Text",
46+
"rotateClockwise": "Rotate clockwise",
47+
"rotateCounterClockwise": "Rotate counter-clockwise",
48+
"resetChanges": "Reset changes",
49+
"saveChanges": "Save changes",
50+
"moveDocument": "Move Document",
51+
"extractPages": "Extract Pages",
52+
"deletePages": "Delete pages",
53+
"deleteDocument": "Delete document",
54+
"dangerZone": "Danger Zone"
55+
},
56+
"deleteEntireDocumentConfirmDialog": {
57+
"title": "Document Delete",
58+
"mainMessage": "Do you really want to delete this document?",
59+
"confirmButtonText": "Yes, delete this document"
60+
},
3861
"load-more": "Load more",
3962
"app.version": "Version",
4063
"me": "Me",
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import {useRenameFolderMutation} from "@/features/nodes/apiSlice"
2+
import type {EditEntityTitle} from "@/types"
3+
import type {I18NEditNodeTitleModal} from "kommon"
4+
import {EditNodeTitleModal} from "kommon"
5+
import {ChangeEvent, useEffect, useState} from "react"
6+
7+
import {useTranslation} from "react-i18next"
8+
import {useEnterSubmit} from "./useEnterSubmit"
9+
10+
interface Args {
11+
node: EditEntityTitle
12+
opened: boolean
13+
onSubmit: () => void
14+
onCancel: () => void
15+
}
16+
17+
export const EditNodeTitleModalContainer = ({
18+
node,
19+
onSubmit,
20+
onCancel,
21+
opened
22+
}: Args) => {
23+
const txt = useI18nText()
24+
const [renameFolder, {isLoading}] = useRenameFolderMutation()
25+
const [title, setTitle] = useState(node.title)
26+
const [error, setError] = useState("")
27+
28+
const handleTitleChanged = (event: ChangeEvent<HTMLInputElement>) => {
29+
let value = event.currentTarget.value
30+
setTitle(value)
31+
}
32+
33+
const onLocalSubmit = async () => {
34+
const data = {
35+
title: title,
36+
id: node.id
37+
}
38+
39+
try {
40+
await renameFolder(data)
41+
onSubmit()
42+
reset() // sets error message back to empty string
43+
} catch (error: any) {
44+
setError(error?.data?.detail ?? "Something went wrong")
45+
}
46+
}
47+
48+
useEnterSubmit(onLocalSubmit)
49+
50+
const onLocalCancel = () => {
51+
onCancel()
52+
reset()
53+
}
54+
55+
const reset = () => {
56+
setError("")
57+
}
58+
59+
return (
60+
<EditNodeTitleModal
61+
inProgress={isLoading}
62+
onCancel={onLocalCancel}
63+
onSubmit={onLocalSubmit}
64+
onTitleChange={handleTitleChanged}
65+
value={title}
66+
error={error}
67+
opened={opened}
68+
txt={txt}
69+
/>
70+
)
71+
}
72+
73+
function useI18nText(): I18NEditNodeTitleModal | undefined {
74+
const {t, i18n} = useTranslation()
75+
const [txt, setTxt] = useState<I18NEditNodeTitleModal>()
76+
77+
useEffect(() => {
78+
if (i18n.isInitialized) {
79+
setTxt({
80+
editTitle: t("editNodeTitleModal.title"),
81+
newTitleLabel: t("editNodeTitleModal.newTitleLabel"),
82+
placeholder: t("editNodeTitleModal.placeholder"),
83+
cancel: t("common.cancel"),
84+
submit: t("common.submit")
85+
})
86+
} else {
87+
setTxt(undefined)
88+
}
89+
}, [i18n.isInitialized, t])
90+
91+
return txt
92+
}
93+
94+
export default EditNodeTitleModalContainer
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import EditNodeTitelModal from "./EditNodeTitleModal"
2+
3+
export default EditNodeTitelModal
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {useEffect} from "react"
2+
3+
export function useEnterSubmit(callback: () => Promise<void> | void) {
4+
useEffect(() => {
5+
const handleKeydown = (e: KeyboardEvent) => {
6+
if (e.code === "Enter") {
7+
callback()
8+
}
9+
}
10+
11+
document.addEventListener("keydown", handleKeydown)
12+
return () => {
13+
document.removeEventListener("keydown", handleKeydown)
14+
}
15+
}, [callback])
16+
}

0 commit comments

Comments
 (0)