Skip to content
This repository was archived by the owner on May 12, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 77 additions & 40 deletions src/cloud/lib/hooks/useCloudResourceModals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import { stringify } from 'querystring'
import { docPreviewCloseEvent } from './useCloudDocPreview'

export function useCloudResourceModals() {
const { openModal, closeLastModal } = useModal()
const { openModal, openContextModal, closeLastModal } = useModal()
const { messageBox } = useDialog()
const {
updateFolder,
Expand Down Expand Up @@ -71,68 +71,105 @@ export function useCloudResourceModals() {
)

const openRenameFolderForm = useCallback(
(folder: SerializedFolder) => {
openModal(
(folder: SerializedFolder, event?: React.MouseEvent<Element>) => {
let renameSubmitted = false
const updateFolderName = async (inputValue: string, emoji?: string) => {
if (renameSubmitted) {
return
}

try {
renameSubmitted = true
await updateFolder(folder, {
workspaceId: folder.workspaceId,
parentFolderId: folder.parentFolderId,
folderName: inputValue,
emoji: typeof emoji === 'string' ? emoji : null,
})
} catch (error) {
renameSubmitted = false
throw error
}
}

const content = (
<EmojiInputForm
defaultIcon={mdiFolderOutline}
defaultInputValue={folder.name}
defaultEmoji={folder.emoji}
placeholder={translate(lngKeys.FolderNamePlaceholder)}
submitButtonProps={{
label: translate(lngKeys.GeneralUpdateVerb),
}}
onSubmit={async (inputValue: string, emoji?: string) => {
await updateFolder(folder, {
workspaceId: folder.workspaceId,
parentFolderId: folder.parentFolderId,
folderName: inputValue,
emoji: typeof emoji === 'string' ? emoji : null,
})
await updateFolderName(inputValue, emoji)
closeLastModal()
}}
/>,
{
showCloseIcon: true,
title: translate(lngKeys.RenameFolder),
}
onBlur={updateFolderName}
/>
)
if (event != null) {
openContextModal(event, content, {
width: 320,
alignment: 'right',
})
return
}

openModal(content, {
showCloseIcon: false,
width: 'small',
})
},
[openModal, closeLastModal, updateFolder, translate]
[openModal, openContextModal, closeLastModal, updateFolder, translate]
)

const openRenameDocForm = useCallback(
(doc: SerializedDoc) => {
openModal(
(doc: SerializedDoc, event?: React.MouseEvent<Element>) => {
let renameSubmitted = false
const updateDocTitle = async (inputValue: string, emoji?: string) => {
if (renameSubmitted) {
return
}

try {
renameSubmitted = true
await updateDoc(doc, {
workspaceId: doc.workspaceId,
parentFolderId: doc.parentFolderId,
title: inputValue,
emoji: emoji == null ? null : emoji,
})
} catch (error) {
renameSubmitted = false
throw error
}
}

const content = (
<EmojiInputForm
defaultIcon={mdiFileDocumentOutline}
defaultInputValue={doc.title}
defaultEmoji={doc.emoji}
placeholder={translate(lngKeys.DocTitlePlaceholder)}
onSubmit={async (inputValue: string, emoji?: string) => {
await updateDoc(doc, {
workspaceId: doc.workspaceId,
parentFolderId: doc.parentFolderId,
title: inputValue,
emoji: emoji == null ? null : emoji,
})
await updateDocTitle(inputValue, emoji)
closeLastModal()
}}
onBlur={async (inputValue: string, emoji?: string) => {
await updateDoc(doc, {
workspaceId: doc.workspaceId,
parentFolderId: doc.parentFolderId,
title: inputValue,
emoji: emoji == null ? null : emoji,
})
}}
/>,
{
showCloseIcon: false,
width: 'small',
}
onBlur={updateDocTitle}
/>
)
if (event != null) {
openContextModal(event, content, {
width: 320,
alignment: 'right',
})
return
}

openModal(content, {
showCloseIcon: false,
width: 'small',
})
},
[closeLastModal, openModal, translate, updateDoc]
[closeLastModal, openModal, openContextModal, translate, updateDoc]
)

const openNewFolderForm = useCallback(
Expand Down
20 changes: 14 additions & 6 deletions src/cloud/lib/mappers/topbarBreadcrumbs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
mdiTrashCanOutline,
} from '@mdi/js'
import { TFunction } from 'i18next'
import type { MouseEvent } from 'react'
import { TopbarBreadcrumbProps } from '../../../design/components/organisms/Topbar'
import { getDocLinkHref } from '../../components/Link/DocLink'
import { getFolderHref } from '../../components/Link/FolderLink'
Expand Down Expand Up @@ -48,8 +49,11 @@ export function mapTopbarBreadcrumbs(
pageDoc?: SerializedDoc
pageFolder?: SerializedFolder
},
renameFolder?: (folder: SerializedFolder) => void,
renameDoc?: (doc: SerializedDoc) => void,
renameFolder?: (
folder: SerializedFolder,
event?: MouseEvent<Element>
) => void,
renameDoc?: (doc: SerializedDoc, event?: MouseEvent<Element>) => void,
openNewDocForm?: (
body: CloudNewResourceRequestBody,
options: UIFormOptions
Expand Down Expand Up @@ -196,7 +200,7 @@ function getDocBreadcrumb(
doc: SerializedDoc,
active: boolean,
push: (url: string) => void,
renameDoc?: (doc: SerializedDoc) => void,
renameDoc?: (doc: SerializedDoc, event?: MouseEvent<Element>) => void,
deleteDoc?: (doc: SerializedDoc) => void
): TopbarBreadcrumbProps & AddedProperties {
return {
Expand All @@ -217,7 +221,7 @@ function getDocBreadcrumb(
{
icon: mdiPencil,
label: t(lngKeys.GeneralRenameVerb),
onClick: () => renameDoc(doc),
onClick: (event: MouseEvent<Element>) => renameDoc(doc, event),
},
]
: []),
Expand Down Expand Up @@ -248,7 +252,10 @@ function getFolderBreadcrumb(
body: CloudNewResourceRequestBody,
options: UIFormOptions
) => void,
renameFolder?: (folder: SerializedFolder) => void,
renameFolder?: (
folder: SerializedFolder,
event?: MouseEvent<Element>
) => void,
deleteFolder?: (folder: SerializedFolder) => void
): TopbarBreadcrumbProps & AddedProperties {
const newResourceBody = {
Expand Down Expand Up @@ -310,7 +317,8 @@ function getFolderBreadcrumb(
{
icon: mdiPencil,
label: t(lngKeys.GeneralRenameVerb),
onClick: () => renameFolder(folder),
onClick: (event: MouseEvent<Element>) =>
renameFolder(folder, event),
},
]
: []),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ interface TopbarActionItemProps {
export interface TopbarActionItemAttrbs {
label: string
icon: string
onClick: () => void
onClick: (event: React.MouseEvent<Element>) => void
}

const TopbarActionItem = ({
Expand All @@ -40,7 +40,7 @@ const TopbarActionItem = ({
id={`tree-action-${shortid.generate()}`}
onClick={(event: React.MouseEvent) => {
event.preventDefault()
item.onClick()
item.onClick(event)
}}
onFocus={() => setFocused(true)}
tabIndex={0}
Expand Down
2 changes: 1 addition & 1 deletion src/design/components/organisms/Topbar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export interface TopbarBreadcrumbProps {
icon?: string
parentId: string
active?: boolean
controls?: { label: string; onClick: () => void; icon: string }[]
controls?: TopbarActionItemAttrbs[]
}

export type TopbarControlButtonProps = ButtonProps & {
Expand Down