From 8debe267264a55589e02b65cc6bbd1efd04a41eb Mon Sep 17 00:00:00 2001 From: Vipin Chaudhary Date: Tue, 18 Nov 2025 18:16:49 +0530 Subject: [PATCH] [WIKI-782] feat: integrate EditorRefApi into initiative components for isAnyDropbarOpen detection (#4787) --- .../initiatives/details/main/info-section-root.tsx | 5 ++++- .../ee/components/initiatives/details/main/root.tsx | 6 +++++- .../components/initiatives/peek-overview/view.tsx | 13 +++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/web/ee/components/initiatives/details/main/info-section-root.tsx b/apps/web/ee/components/initiatives/details/main/info-section-root.tsx index e374dafc98..96dc0667c2 100644 --- a/apps/web/ee/components/initiatives/details/main/info-section-root.tsx +++ b/apps/web/ee/components/initiatives/details/main/info-section-root.tsx @@ -4,6 +4,7 @@ import type { FC } from "react"; import { useState } from "react"; import { observer } from "mobx-react"; // plane imports +import type { EditorRefApi } from "@plane/editor"; import { EmojiIconPickerTypes, EmojiPicker, Logo } from "@plane/propel/emoji-icon-picker"; import { InitiativeIcon } from "@plane/propel/icons"; import { EFileAssetType } from "@plane/types"; @@ -17,6 +18,7 @@ import { InitiativeInfoActionItems } from "./info-section/action-items"; import { InitiativeInfoIndicatorItem } from "./info-section/indicator-item"; type Props = { + editorRef?: React.RefObject; workspaceSlug: string; initiativeId: string; disabled?: boolean; @@ -25,7 +27,7 @@ type Props = { }; export const InitiativeInfoSection: FC = observer((props) => { - const { workspaceSlug, initiativeId, disabled = false, toggleProjectModal, toggleEpicModal } = props; + const { editorRef, workspaceSlug, initiativeId, disabled = false, toggleProjectModal, toggleEpicModal } = props; const [isOpen, setIsOpen] = useState(false); // store hooks const { @@ -43,6 +45,7 @@ export const InitiativeInfoSection: FC = observer((props) => { return ( ; workspaceSlug: string; initiativeId: string; disabled?: boolean; @@ -22,13 +25,14 @@ type Props = { }; export const InitiativeMainContentRoot: FC = observer((props) => { - const { workspaceSlug, initiativeId, disabled = false, toggleEpicModal, toggleProjectModal } = props; + const { editorRef, workspaceSlug, initiativeId, disabled = false, toggleEpicModal, toggleProjectModal } = props; // store hooks const { initiativesSidebarCollapsed } = useAppTheme(); return ( = observer((props) => { const [peekMode, setPeekMode] = useState("side-peek"); // ref const initiativePeekOverviewRef = useRef(null); + const editorRef = useRef(null); // store hooks const { initiative: { isAnyModalOpen, setPeekInitiative, getInitiativeById }, @@ -67,8 +69,9 @@ export const InitiativeView: FC = observer((props) => { usePeekOverviewOutsideClickDetector( initiativePeekOverviewRef, () => { - // Don't close peek overview if any modal is open - if (!isAnyModalOpen && !isProjectsModalOpen && !isEpicModalOpen) { + const isAnyDropbarOpen = editorRef.current?.isAnyDropbarOpen(); + // Don't close peek overview if any modal is open or if any dropbar is open + if (!isAnyModalOpen && !isProjectsModalOpen && !isEpicModalOpen && !isAnyDropbarOpen) { removeRoutePeekId(); } }, @@ -77,8 +80,9 @@ export const InitiativeView: FC = observer((props) => { const handleKeyDown = () => { const dropdownElement = document.activeElement?.tagName === "INPUT"; - // Don't close peek overview if any modal is open or if input is focused - if (!dropdownElement && !isAnyModalOpen && !isProjectsModalOpen && !isEpicModalOpen) { + const isAnyDropbarOpen = editorRef.current?.isAnyDropbarOpen(); + // Don't close peek overview if any modal is open, if input is focused, or if any dropbar is open + if (!dropdownElement && !isAnyModalOpen && !isProjectsModalOpen && !isEpicModalOpen && !isAnyDropbarOpen) { removeRoutePeekId(); const initiativeElement = document.getElementById(`initiative-${initiativeId}`); if (initiativeElement) initiativeElement?.focus(); @@ -131,6 +135,7 @@ export const InitiativeView: FC = observer((props) => {