From 490fda6502bb15dd1ed725a7663c40c31ad51b0d Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Wed, 17 Sep 2025 14:29:46 +0530 Subject: [PATCH 1/6] fix : block menu for rich editor --- .../components/editors/rich-text/editor.tsx | 9 +- .../src/core/components/menus/block-menu.tsx | 230 ++++++++++++------ 2 files changed, 162 insertions(+), 77 deletions(-) diff --git a/packages/editor/src/core/components/editors/rich-text/editor.tsx b/packages/editor/src/core/components/editors/rich-text/editor.tsx index f110c789b2b..dcdb8c295f9 100644 --- a/packages/editor/src/core/components/editors/rich-text/editor.tsx +++ b/packages/editor/src/core/components/editors/rich-text/editor.tsx @@ -1,7 +1,7 @@ import { forwardRef, useCallback } from "react"; // components import { EditorWrapper } from "@/components/editors"; -import { EditorBubbleMenu } from "@/components/menus"; +import { BlockMenu, EditorBubbleMenu } from "@/components/menus"; // extensions import { SideMenuExtension } from "@/extensions"; // plane editor imports @@ -40,7 +40,12 @@ const RichTextEditor: React.FC = (props) => { return ( - {(editor) => <>{editor && bubbleMenuEnabled && }} + {(editor) => ( + <> + {editor && bubbleMenuEnabled && }{" "} + + + )} ); }; diff --git a/packages/editor/src/core/components/menus/block-menu.tsx b/packages/editor/src/core/components/menus/block-menu.tsx index 43c0193c715..612d681549f 100644 --- a/packages/editor/src/core/components/menus/block-menu.tsx +++ b/packages/editor/src/core/components/menus/block-menu.tsx @@ -1,8 +1,18 @@ +import { + useFloating, + offset, + flip, + shift, + autoUpdate, + useDismiss, + useInteractions, + FloatingPortal, +} from "@floating-ui/react"; import type { Editor } from "@tiptap/react"; import { Copy, LucideIcon, Trash2 } from "lucide-react"; -import { useCallback, useEffect, useRef } from "react"; -import tippy, { Instance } from "tippy.js"; +import { useCallback, useEffect, useRef, useState } from "react"; // constants +import { cn } from "@plane/utils"; import { CORE_EXTENSIONS } from "@/constants/extension"; import { IEditorProps } from "@/types"; @@ -14,62 +24,94 @@ type Props = { export const BlockMenu = (props: Props) => { const { editor } = props; - const menuRef = useRef(null); - const popup = useRef(null); + const [isOpen, setIsOpen] = useState(false); + const [isAnimatedIn, setIsAnimatedIn] = useState(false); + const menuRef = useRef(null); + const virtualReferenceRef = useRef<{ getBoundingClientRect: () => DOMRect }>({ + getBoundingClientRect: () => new DOMRect(), + }); + // const { t } = useTranslation(); - const handleClickDragHandle = useCallback((event: MouseEvent) => { - const target = event.target as HTMLElement; - if (target.matches("#drag-handle")) { - event.preventDefault(); + // Set up Floating UI with virtual reference element + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [offset({ crossAxis: -10 }), flip(), shift()], + whileElementsMounted: autoUpdate, + placement: "left-start", + }); - popup.current?.setProps({ - getReferenceClientRect: () => target.getBoundingClientRect(), - }); + const dismiss = useDismiss(context); + const { getFloatingProps } = useInteractions([dismiss]); - popup.current?.show(); - return; - } + // Handle click on drag handle + const handleClickDragHandle = useCallback( + (event: MouseEvent) => { + const target = event.target as HTMLElement; + const dragHandle = target.closest("#drag-handle"); - popup.current?.hide(); - return; - }, []); + if (dragHandle) { + event.preventDefault(); - useEffect(() => { - if (menuRef.current) { - menuRef.current.remove(); - menuRef.current.style.visibility = "visible"; - - // @ts-expect-error - Tippy types are incorrect - popup.current = tippy(document.body, { - getReferenceClientRect: null, - content: menuRef.current, - appendTo: () => document.querySelector(".frame-renderer"), - trigger: "manual", - interactive: true, - arrow: false, - placement: "left-start", - animation: "shift-away", - maxWidth: 500, - hideOnClick: true, - onShown: () => { - menuRef.current?.focus(); - }, - }); - } + // Update virtual reference with current drag handle position + virtualReferenceRef.current = { + getBoundingClientRect: () => dragHandle.getBoundingClientRect(), + }; - return () => { - popup.current?.destroy(); - popup.current = null; - }; - }, []); + // Set the virtual reference as the reference element + refs.setReference(virtualReferenceRef.current); + + // Show the menu + setIsOpen(true); + return; + } + + // If clicking outside and not on a menu item, hide the menu + if (menuRef.current && !menuRef.current.contains(target)) { + setIsOpen(false); + } + }, + [refs] + ); + + // useEffect(() => { + // if (menuRef.current) { + // menuRef.current.remove(); + // menuRef.current.style.visibility = "visible"; + + // // @ts-expect-error - Tippy types are incorrect + // popup.current = tippy(document.body, { + // getReferenceClientRect: null, + // content: menuRef.current, + // appendTo: () => document.querySelector(".frame-renderer"), + // trigger: "manual", + // interactive: true, + // arrow: false, + // placement: "left-start", + // animation: "shift-away", + // maxWidth: 500, + // hideOnClick: true, + // onShown: () => { + // menuRef.current?.focus(); + // }, + // }); + // } + + // return () => { + // popup.current?.destroy(); + // popup.current = null; + // }; + // }, []); useEffect(() => { - const handleKeyDown = () => { - popup.current?.hide(); + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setIsOpen(false); + } }; const handleScroll = () => { - popup.current?.hide(); + setIsOpen(false); }; document.addEventListener("click", handleClickDragHandle); document.addEventListener("contextmenu", handleClickDragHandle); @@ -84,6 +126,23 @@ export const BlockMenu = (props: Props) => { }; }, [handleClickDragHandle]); + // Animation effect + useEffect(() => { + if (isOpen) { + setIsAnimatedIn(false); + // Add a small delay before starting the animation + const timeout = setTimeout(() => { + requestAnimationFrame(() => { + setIsAnimatedIn(true); + }); + }, 50); + + return () => clearTimeout(timeout); + } else { + setIsAnimatedIn(false); + } + }, [isOpen]); + const MENU_ITEMS: { icon: LucideIcon; key: string; @@ -96,10 +155,13 @@ export const BlockMenu = (props: Props) => { key: "delete", label: "Delete", onClick: (e) => { - editor.chain().deleteSelection().focus().run(); - popup.current?.hide(); e.preventDefault(); e.stopPropagation(); + + // Execute the delete action + editor.chain().deleteSelection().focus().run(); + + setIsOpen(false); }, }, { @@ -146,36 +208,54 @@ export const BlockMenu = (props: Props) => { console.error(error.message); } } - - popup.current?.hide(); + setIsOpen(false); }, }, ]; + if (!isOpen) { + return null; + } return ( -
- {MENU_ITEMS.map((item) => { - // Skip rendering the button if it should be disabled - if (item.isDisabled && item.key === "duplicate") { - return null; - } - - return ( - - ); - })} -
+ +
{ + refs.setFloating(node); + menuRef.current = node; + }} + style={{ + ...floatingStyles, + zIndex: 99, + animationFillMode: "forwards", + transitionTimingFunction: "cubic-bezier(0.16, 1, 0.3, 1)", // Expo ease out + }} + className={cn( + "z-20 max-h-60 min-w-[7rem] overflow-y-scroll rounded-lg border border-custom-border-200 bg-custom-background-100 p-1.5 shadow-custom-shadow-rg", + "transition-all duration-300 transform origin-top-right", + isAnimatedIn ? "opacity-100 scale-100" : "opacity-0 scale-75" + )} + data-prevent-outside-click + {...getFloatingProps()} + > + {MENU_ITEMS.map((item) => { + if (item.isDisabled) { + return null; + } + return ( + + ); + })} +
+
); }; From cbf167acb21e59407f51342c8dc3d66ef6bb17d3 Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Wed, 17 Sep 2025 14:33:30 +0530 Subject: [PATCH 2/6] chore: remove comments --- .../src/core/components/menus/block-menu.tsx | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/packages/editor/src/core/components/menus/block-menu.tsx b/packages/editor/src/core/components/menus/block-menu.tsx index 612d681549f..daf132e870c 100644 --- a/packages/editor/src/core/components/menus/block-menu.tsx +++ b/packages/editor/src/core/components/menus/block-menu.tsx @@ -30,7 +30,6 @@ export const BlockMenu = (props: Props) => { const virtualReferenceRef = useRef<{ getBoundingClientRect: () => DOMRect }>({ getBoundingClientRect: () => new DOMRect(), }); - // const { t } = useTranslation(); // Set up Floating UI with virtual reference element const { refs, floatingStyles, context } = useFloating({ @@ -74,35 +73,6 @@ export const BlockMenu = (props: Props) => { [refs] ); - // useEffect(() => { - // if (menuRef.current) { - // menuRef.current.remove(); - // menuRef.current.style.visibility = "visible"; - - // // @ts-expect-error - Tippy types are incorrect - // popup.current = tippy(document.body, { - // getReferenceClientRect: null, - // content: menuRef.current, - // appendTo: () => document.querySelector(".frame-renderer"), - // trigger: "manual", - // interactive: true, - // arrow: false, - // placement: "left-start", - // animation: "shift-away", - // maxWidth: 500, - // hideOnClick: true, - // onShown: () => { - // menuRef.current?.focus(); - // }, - // }); - // } - - // return () => { - // popup.current?.destroy(); - // popup.current = null; - // }; - // }, []); - useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { @@ -251,7 +221,6 @@ export const BlockMenu = (props: Props) => { > {item.label} - {/* {t(item.label)} */} ); })} From 4074a9f1ac1ba4e057ebad5cb0026eae5da03ce2 Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Thu, 25 Sep 2025 13:10:40 +0530 Subject: [PATCH 3/6] chore: core files changes --- apps/web/ce/hooks/editor/use-editor-config.ts | 7 +++ .../core/hooks/editor/use-editor-config.ts | 5 ++ apps/web/core/services/file.service.ts | 54 +++++++++++++++++++ packages/editor/src/ce/types/config.ts | 1 + packages/editor/src/ce/types/index.ts | 1 + .../editor/src/core/plugins/drag-handle.ts | 1 + packages/editor/src/core/types/config.ts | 3 +- 7 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 apps/web/ce/hooks/editor/use-editor-config.ts create mode 100644 packages/editor/src/ce/types/config.ts diff --git a/apps/web/ce/hooks/editor/use-editor-config.ts b/apps/web/ce/hooks/editor/use-editor-config.ts new file mode 100644 index 00000000000..7de493f5f4f --- /dev/null +++ b/apps/web/ce/hooks/editor/use-editor-config.ts @@ -0,0 +1,7 @@ +export type TExtendedEditorConfigArgs = { + projectId?: string; + workspaceSlug: string; +}; + +export type TExtendedEditorConfig = object; +export const extendedEditorConfig = (_args: TExtendedEditorConfigArgs): TExtendedEditorConfig => ({}); diff --git a/apps/web/core/hooks/editor/use-editor-config.ts b/apps/web/core/hooks/editor/use-editor-config.ts index 99137f5e097..d6d8a8a7b55 100644 --- a/apps/web/core/hooks/editor/use-editor-config.ts +++ b/apps/web/core/hooks/editor/use-editor-config.ts @@ -8,6 +8,7 @@ import { useEditorAsset } from "@/hooks/store/use-editor-asset"; import { useFileSize } from "@/plane-web/hooks/use-file-size"; // services import { FileService } from "@/services/file.service"; +import { extendedEditorConfig } from "@/plane-web/hooks/editor/use-editor-config"; const fileService = new FileService(); type TArgs = { @@ -86,6 +87,10 @@ export const useEditorConfig = () => { validation: { maxFileSize, }, + ...extendedEditorConfig({ + projectId, + workspaceSlug, + }), }; }, [assetsUploadPercentage, maxFileSize] diff --git a/apps/web/core/services/file.service.ts b/apps/web/core/services/file.service.ts index 5de44bab619..2f3f27956fc 100644 --- a/apps/web/core/services/file.service.ts +++ b/apps/web/core/services/file.service.ts @@ -273,7 +273,61 @@ export class FileService extends APIService { throw err?.response?.data; }); } + async reuploadWorkspaceAsset( + workspaceSlug: string, + assetId: string, + file: File, + uploadProgressHandler?: AxiosRequestConfig["onUploadProgress"] + ): Promise { + const fileMetaData = getFileMetaDataForUpload(file); + return this.post(`/api/assets/v2/workspaces/${workspaceSlug}/reupload/${assetId}/`, { + type: fileMetaData.type, + size: fileMetaData.size, + }) + .then(async (response) => { + const signedURLResponse: TFileSignedURLResponse = response?.data; + const fileUploadPayload = generateFileUploadPayload(signedURLResponse, file); + await this.fileUploadService.uploadFile( + signedURLResponse.upload_data.url, + fileUploadPayload, + uploadProgressHandler + ); + await this.updateWorkspaceAssetUploadStatus(workspaceSlug, signedURLResponse.asset_id); + return signedURLResponse; + }) + .catch((error) => { + throw error?.response?.data; + }); + } + async reuploadProjectAsset( + workspaceSlug: string, + projectId: string, + assetId: string, + file: File, + uploadProgressHandler?: AxiosRequestConfig["onUploadProgress"] + ): Promise { + const fileMetaData = getFileMetaDataForUpload(file); + + return this.post(`/api/assets/v2/workspaces/${workspaceSlug}/projects/${projectId}/reupload/${assetId}/`, { + type: fileMetaData.type, + size: fileMetaData.size, + }) + .then(async (response) => { + const signedURLResponse: TFileSignedURLResponse = response?.data; + const fileUploadPayload = generateFileUploadPayload(signedURLResponse, file); + await this.fileUploadService.uploadFile( + signedURLResponse.upload_data.url, + fileUploadPayload, + uploadProgressHandler + ); + await this.updateProjectAssetUploadStatus(workspaceSlug, projectId, signedURLResponse.asset_id); + return signedURLResponse; + }) + .catch((error) => { + throw error?.response?.data; + }); + } async getProjectCoverImages(): Promise { return this.get(`/api/project-covers/`) .then((res) => res?.data) diff --git a/packages/editor/src/ce/types/config.ts b/packages/editor/src/ce/types/config.ts new file mode 100644 index 00000000000..b8bc6d13c8c --- /dev/null +++ b/packages/editor/src/ce/types/config.ts @@ -0,0 +1 @@ +export type TExtendedFileHandler = null; diff --git a/packages/editor/src/ce/types/index.ts b/packages/editor/src/ce/types/index.ts index 7efa23c054e..c2c5d6dfaf7 100644 --- a/packages/editor/src/ce/types/index.ts +++ b/packages/editor/src/ce/types/index.ts @@ -1,2 +1,3 @@ export * from "./issue-embed"; export * from "./editor-extended"; +export * from "./config"; diff --git a/packages/editor/src/core/plugins/drag-handle.ts b/packages/editor/src/core/plugins/drag-handle.ts index bf04ba45ad4..f64b3515f28 100644 --- a/packages/editor/src/core/plugins/drag-handle.ts +++ b/packages/editor/src/core/plugins/drag-handle.ts @@ -22,6 +22,7 @@ const generalSelectors = [ ".image-upload-component", ".editor-callout-component", ".editor-embed-component", + ".editor-drawio-component", ].join(", "); const maxScrollSpeed = 20; diff --git a/packages/editor/src/core/types/config.ts b/packages/editor/src/core/types/config.ts index 5a1402332e6..b7fe70bc58b 100644 --- a/packages/editor/src/core/types/config.ts +++ b/packages/editor/src/core/types/config.ts @@ -1,5 +1,6 @@ // plane imports import { TWebhookConnectionQueryParams } from "@plane/types"; +import { TExtendedFileHandler } from "@/plane-editor/types/config"; export type TFileHandler = { assetsUploadStatus: Record; // blockId => progress percentage @@ -16,7 +17,7 @@ export type TFileHandler = { * @example enter 5242880(5 * 1024 * 1024) for 5MB */ maxFileSize: number; - }; + } & TExtendedFileHandler; }; export type TEditorFontStyle = "sans-serif" | "serif" | "monospace"; From ca60d46935f5f9b0d0c019ca68f72740ba5239f6 Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Fri, 26 Sep 2025 12:53:43 +0530 Subject: [PATCH 4/6] chore : update types --- apps/web/ce/hooks/editor/use-editor-config.ts | 7 ------ .../editor/use-extended-editor-config.ts | 23 +++++++++++++++++++ apps/web/ce/hooks/use-editor-flagging.ts | 2 ++ .../components/pages/editor/editor-body.tsx | 5 ++-- .../core/hooks/editor/use-editor-config.ts | 10 ++++---- packages/editor/src/ce/types/config.ts | 2 +- 6 files changed, 33 insertions(+), 16 deletions(-) delete mode 100644 apps/web/ce/hooks/editor/use-editor-config.ts create mode 100644 apps/web/ce/hooks/editor/use-extended-editor-config.ts diff --git a/apps/web/ce/hooks/editor/use-editor-config.ts b/apps/web/ce/hooks/editor/use-editor-config.ts deleted file mode 100644 index 7de493f5f4f..00000000000 --- a/apps/web/ce/hooks/editor/use-editor-config.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type TExtendedEditorConfigArgs = { - projectId?: string; - workspaceSlug: string; -}; - -export type TExtendedEditorConfig = object; -export const extendedEditorConfig = (_args: TExtendedEditorConfigArgs): TExtendedEditorConfig => ({}); diff --git a/apps/web/ce/hooks/editor/use-extended-editor-config.ts b/apps/web/ce/hooks/editor/use-extended-editor-config.ts new file mode 100644 index 00000000000..9ca7b74a08d --- /dev/null +++ b/apps/web/ce/hooks/editor/use-extended-editor-config.ts @@ -0,0 +1,23 @@ +import { useCallback } from "react"; +// plane imports +import type { TExtendedFileHandler } from "@plane/editor"; + +export type TExtendedEditorFileHandlersArgs = { + projectId?: string; + workspaceSlug: string; +}; + +export type TExtendedEditorConfig = { + getExtendedEditorFileHandlers: (args: TExtendedEditorFileHandlersArgs) => TExtendedFileHandler; +}; + +export const useExtendedEditorConfig = (): TExtendedEditorConfig => { + const getExtendedEditorFileHandlers: TExtendedEditorConfig["getExtendedEditorFileHandlers"] = useCallback( + () => ({}), + [] + ); + + return { + getExtendedEditorFileHandlers, + }; +}; diff --git a/apps/web/ce/hooks/use-editor-flagging.ts b/apps/web/ce/hooks/use-editor-flagging.ts index 0fc8a6eb4c6..e2491e104c6 100644 --- a/apps/web/ce/hooks/use-editor-flagging.ts +++ b/apps/web/ce/hooks/use-editor-flagging.ts @@ -15,6 +15,7 @@ export type TEditorFlaggingHookReturnType = { disabled: TExtensions[]; flagged: TExtensions[]; }; + isLoadingIntegrations: boolean; }; export type TEditorFlaggingHookProps = { @@ -38,4 +39,5 @@ export const useEditorFlagging = (props: TEditorFlaggingHookProps): TEditorFlagg disabled: ["ai", "collaboration-cursor"], flagged: [], }, + isLoadingIntegrations: false, }); diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index a57f44058d5..d4d4eb25a8a 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -97,7 +97,7 @@ export const PageEditorBody: React.FC = observer((props) => { searchEntity: handlers.fetchEntity, }); // editor flaggings - const { document: documentEditorExtensions } = useEditorFlagging({ + const { document: documentEditorExtensions, isLoadingIntegrations } = useEditorFlagging({ workspaceSlug, storeType, }); @@ -179,7 +179,8 @@ export const PageEditorBody: React.FC = observer((props) => { } ); - if (pageId === undefined || !realtimeConfig) return ; + if (pageId === undefined || !realtimeConfig || isLoadingIntegrations) + return ; return ( { const { assetsUploadPercentage } = useEditorAsset(); // file size const { maxFileSize } = useFileSize(); + const { getExtendedEditorFileHandlers } = useExtendedEditorConfig(); const getEditorFileHandlers = useCallback( (args: TArgs): TFileHandler => { @@ -87,13 +88,10 @@ export const useEditorConfig = () => { validation: { maxFileSize, }, - ...extendedEditorConfig({ - projectId, - workspaceSlug, - }), + ...getExtendedEditorFileHandlers({ projectId, workspaceSlug }), }; }, - [assetsUploadPercentage, maxFileSize] + [assetsUploadPercentage, getExtendedEditorFileHandlers, maxFileSize] ); return { diff --git a/packages/editor/src/ce/types/config.ts b/packages/editor/src/ce/types/config.ts index b8bc6d13c8c..29693e99575 100644 --- a/packages/editor/src/ce/types/config.ts +++ b/packages/editor/src/ce/types/config.ts @@ -1 +1 @@ -export type TExtendedFileHandler = null; +export type TExtendedFileHandler = object; From 17d8cb7452432de6eea567fe89b25c96c731dd99 Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Fri, 26 Sep 2025 19:32:33 +0530 Subject: [PATCH 5/6] remove : reupload methods --- apps/web/core/services/file.service.ts | 55 -------------------------- 1 file changed, 55 deletions(-) diff --git a/apps/web/core/services/file.service.ts b/apps/web/core/services/file.service.ts index 2f3f27956fc..c18960cdbe3 100644 --- a/apps/web/core/services/file.service.ts +++ b/apps/web/core/services/file.service.ts @@ -273,61 +273,6 @@ export class FileService extends APIService { throw err?.response?.data; }); } - async reuploadWorkspaceAsset( - workspaceSlug: string, - assetId: string, - file: File, - uploadProgressHandler?: AxiosRequestConfig["onUploadProgress"] - ): Promise { - const fileMetaData = getFileMetaDataForUpload(file); - return this.post(`/api/assets/v2/workspaces/${workspaceSlug}/reupload/${assetId}/`, { - type: fileMetaData.type, - size: fileMetaData.size, - }) - .then(async (response) => { - const signedURLResponse: TFileSignedURLResponse = response?.data; - const fileUploadPayload = generateFileUploadPayload(signedURLResponse, file); - await this.fileUploadService.uploadFile( - signedURLResponse.upload_data.url, - fileUploadPayload, - uploadProgressHandler - ); - await this.updateWorkspaceAssetUploadStatus(workspaceSlug, signedURLResponse.asset_id); - return signedURLResponse; - }) - .catch((error) => { - throw error?.response?.data; - }); - } - - async reuploadProjectAsset( - workspaceSlug: string, - projectId: string, - assetId: string, - file: File, - uploadProgressHandler?: AxiosRequestConfig["onUploadProgress"] - ): Promise { - const fileMetaData = getFileMetaDataForUpload(file); - - return this.post(`/api/assets/v2/workspaces/${workspaceSlug}/projects/${projectId}/reupload/${assetId}/`, { - type: fileMetaData.type, - size: fileMetaData.size, - }) - .then(async (response) => { - const signedURLResponse: TFileSignedURLResponse = response?.data; - const fileUploadPayload = generateFileUploadPayload(signedURLResponse, file); - await this.fileUploadService.uploadFile( - signedURLResponse.upload_data.url, - fileUploadPayload, - uploadProgressHandler - ); - await this.updateProjectAssetUploadStatus(workspaceSlug, projectId, signedURLResponse.asset_id); - return signedURLResponse; - }) - .catch((error) => { - throw error?.response?.data; - }); - } async getProjectCoverImages(): Promise { return this.get(`/api/project-covers/`) .then((res) => res?.data) From e54f47e77fe6693cc0c8badc816613be9262849a Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Tue, 30 Sep 2025 15:36:32 +0530 Subject: [PATCH 6/6] chore : update plane ce --- apps/web/ce/hooks/use-editor-flagging.ts | 2 -- apps/web/core/components/pages/editor/editor-body.tsx | 5 ++--- packages/editor/src/core/components/menus/block-menu.tsx | 9 +++++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/web/ce/hooks/use-editor-flagging.ts b/apps/web/ce/hooks/use-editor-flagging.ts index e2491e104c6..0fc8a6eb4c6 100644 --- a/apps/web/ce/hooks/use-editor-flagging.ts +++ b/apps/web/ce/hooks/use-editor-flagging.ts @@ -15,7 +15,6 @@ export type TEditorFlaggingHookReturnType = { disabled: TExtensions[]; flagged: TExtensions[]; }; - isLoadingIntegrations: boolean; }; export type TEditorFlaggingHookProps = { @@ -39,5 +38,4 @@ export const useEditorFlagging = (props: TEditorFlaggingHookProps): TEditorFlagg disabled: ["ai", "collaboration-cursor"], flagged: [], }, - isLoadingIntegrations: false, }); diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index d4d4eb25a8a..a57f44058d5 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -97,7 +97,7 @@ export const PageEditorBody: React.FC = observer((props) => { searchEntity: handlers.fetchEntity, }); // editor flaggings - const { document: documentEditorExtensions, isLoadingIntegrations } = useEditorFlagging({ + const { document: documentEditorExtensions } = useEditorFlagging({ workspaceSlug, storeType, }); @@ -179,8 +179,7 @@ export const PageEditorBody: React.FC = observer((props) => { } ); - if (pageId === undefined || !realtimeConfig || isLoadingIntegrations) - return ; + if (pageId === undefined || !realtimeConfig) return ; return ( { // Set the virtual reference as the reference element refs.setReference(virtualReferenceRef.current); + // Ensure the targeted block is selected + const rect = dragHandle.getBoundingClientRect(); + const coords = { left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 }; + const posAtCoords = editor.view.posAtCoords(coords); + if (posAtCoords) { + const $pos = editor.state.doc.resolve(posAtCoords.pos); + const nodePos = $pos.before($pos.depth); + editor.chain().setNodeSelection(nodePos).run(); + } // Show the menu setIsOpen(true); return;