Skip to content
This repository was archived by the owner on May 12, 2026. It is now read-only.

Commit 23012ac

Browse files
committed
fix: show rename form as topbar popup
1 parent 6a3002d commit 23012ac

4 files changed

Lines changed: 58 additions & 29 deletions

File tree

src/cloud/lib/hooks/useCloudResourceModals.tsx

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { stringify } from 'querystring'
3636
import { docPreviewCloseEvent } from './useCloudDocPreview'
3737

3838
export function useCloudResourceModals() {
39-
const { openModal, closeLastModal } = useModal()
39+
const { openModal, openContextModal, closeLastModal } = useModal()
4040
const { messageBox } = useDialog()
4141
const {
4242
updateFolder,
@@ -71,16 +71,13 @@ export function useCloudResourceModals() {
7171
)
7272

7373
const openRenameFolderForm = useCallback(
74-
(folder: SerializedFolder) => {
75-
openModal(
74+
(folder: SerializedFolder, event?: React.MouseEvent<Element>) => {
75+
const content = (
7676
<EmojiInputForm
7777
defaultIcon={mdiFolderOutline}
7878
defaultInputValue={folder.name}
7979
defaultEmoji={folder.emoji}
8080
placeholder={translate(lngKeys.FolderNamePlaceholder)}
81-
submitButtonProps={{
82-
label: translate(lngKeys.GeneralUpdateVerb),
83-
}}
8481
onSubmit={async (inputValue: string, emoji?: string) => {
8582
await updateFolder(folder, {
8683
workspaceId: folder.workspaceId,
@@ -90,19 +87,35 @@ export function useCloudResourceModals() {
9087
})
9188
closeLastModal()
9289
}}
93-
/>,
94-
{
95-
showCloseIcon: true,
96-
title: translate(lngKeys.RenameFolder),
97-
}
90+
onBlur={async (inputValue: string, emoji?: string) => {
91+
await updateFolder(folder, {
92+
workspaceId: folder.workspaceId,
93+
parentFolderId: folder.parentFolderId,
94+
folderName: inputValue,
95+
emoji: typeof emoji === 'string' ? emoji : null,
96+
})
97+
}}
98+
/>
9899
)
100+
if (event != null) {
101+
openContextModal(event, content, {
102+
width: 320,
103+
alignment: 'right',
104+
})
105+
return
106+
}
107+
108+
openModal(content, {
109+
showCloseIcon: false,
110+
width: 'small',
111+
})
99112
},
100-
[openModal, closeLastModal, updateFolder, translate]
113+
[openModal, openContextModal, closeLastModal, updateFolder, translate]
101114
)
102115

103116
const openRenameDocForm = useCallback(
104-
(doc: SerializedDoc) => {
105-
openModal(
117+
(doc: SerializedDoc, event?: React.MouseEvent<Element>) => {
118+
const content = (
106119
<EmojiInputForm
107120
defaultIcon={mdiFileDocumentOutline}
108121
defaultInputValue={doc.title}
@@ -125,14 +138,22 @@ export function useCloudResourceModals() {
125138
emoji: emoji == null ? null : emoji,
126139
})
127140
}}
128-
/>,
129-
{
130-
showCloseIcon: false,
131-
width: 'small',
132-
}
141+
/>
133142
)
143+
if (event != null) {
144+
openContextModal(event, content, {
145+
width: 320,
146+
alignment: 'right',
147+
})
148+
return
149+
}
150+
151+
openModal(content, {
152+
showCloseIcon: false,
153+
width: 'small',
154+
})
134155
},
135-
[closeLastModal, openModal, translate, updateDoc]
156+
[closeLastModal, openModal, openContextModal, translate, updateDoc]
136157
)
137158

138159
const openNewFolderForm = useCallback(

src/cloud/lib/mappers/topbarBreadcrumbs.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
mdiTrashCanOutline,
99
} from '@mdi/js'
1010
import { TFunction } from 'i18next'
11+
import type { MouseEvent } from 'react'
1112
import { TopbarBreadcrumbProps } from '../../../design/components/organisms/Topbar'
1213
import { getDocLinkHref } from '../../components/Link/DocLink'
1314
import { getFolderHref } from '../../components/Link/FolderLink'
@@ -48,8 +49,11 @@ export function mapTopbarBreadcrumbs(
4849
pageDoc?: SerializedDoc
4950
pageFolder?: SerializedFolder
5051
},
51-
renameFolder?: (folder: SerializedFolder) => void,
52-
renameDoc?: (doc: SerializedDoc) => void,
52+
renameFolder?: (
53+
folder: SerializedFolder,
54+
event?: MouseEvent<Element>
55+
) => void,
56+
renameDoc?: (doc: SerializedDoc, event?: MouseEvent<Element>) => void,
5357
openNewDocForm?: (
5458
body: CloudNewResourceRequestBody,
5559
options: UIFormOptions
@@ -196,7 +200,7 @@ function getDocBreadcrumb(
196200
doc: SerializedDoc,
197201
active: boolean,
198202
push: (url: string) => void,
199-
renameDoc?: (doc: SerializedDoc) => void,
203+
renameDoc?: (doc: SerializedDoc, event?: MouseEvent<Element>) => void,
200204
deleteDoc?: (doc: SerializedDoc) => void
201205
): TopbarBreadcrumbProps & AddedProperties {
202206
return {
@@ -217,7 +221,7 @@ function getDocBreadcrumb(
217221
{
218222
icon: mdiPencil,
219223
label: t(lngKeys.GeneralRenameVerb),
220-
onClick: () => renameDoc(doc),
224+
onClick: (event: MouseEvent<Element>) => renameDoc(doc, event),
221225
},
222226
]
223227
: []),
@@ -248,7 +252,10 @@ function getFolderBreadcrumb(
248252
body: CloudNewResourceRequestBody,
249253
options: UIFormOptions
250254
) => void,
251-
renameFolder?: (folder: SerializedFolder) => void,
255+
renameFolder?: (
256+
folder: SerializedFolder,
257+
event?: MouseEvent<Element>
258+
) => void,
252259
deleteFolder?: (folder: SerializedFolder) => void
253260
): TopbarBreadcrumbProps & AddedProperties {
254261
const newResourceBody = {
@@ -310,7 +317,8 @@ function getFolderBreadcrumb(
310317
{
311318
icon: mdiPencil,
312319
label: t(lngKeys.GeneralRenameVerb),
313-
onClick: () => renameFolder(folder),
320+
onClick: (event: MouseEvent<Element>) =>
321+
renameFolder(folder, event),
314322
},
315323
]
316324
: []),

src/design/components/organisms/Topbar/atoms/TopbarActionItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ interface TopbarActionItemProps {
1414
export interface TopbarActionItemAttrbs {
1515
label: string
1616
icon: string
17-
onClick: () => void
17+
onClick: (event: React.MouseEvent<Element>) => void
1818
}
1919

2020
const TopbarActionItem = ({
@@ -40,7 +40,7 @@ const TopbarActionItem = ({
4040
id={`tree-action-${shortid.generate()}`}
4141
onClick={(event: React.MouseEvent) => {
4242
event.preventDefault()
43-
item.onClick()
43+
item.onClick(event)
4444
}}
4545
onFocus={() => setFocused(true)}
4646
tabIndex={0}

src/design/components/organisms/Topbar/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface TopbarBreadcrumbProps {
2020
icon?: string
2121
parentId: string
2222
active?: boolean
23-
controls?: { label: string; onClick: () => void; icon: string }[]
23+
controls?: TopbarActionItemAttrbs[]
2424
}
2525

2626
export type TopbarControlButtonProps = ButtonProps & {

0 commit comments

Comments
 (0)