diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx index 860242dc5bf..2a29a72c768 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx @@ -11,6 +11,7 @@ export default function WorkspaceLayout({ children }: { children: React.ReactNod
+
diff --git a/apps/web/core/components/analytics/work-items/modal/index.tsx b/apps/web/core/components/analytics/work-items/modal/index.tsx index 78b07161ec4..06d09aa1e9b 100644 --- a/apps/web/core/components/analytics/work-items/modal/index.tsx +++ b/apps/web/core/components/analytics/work-items/modal/index.tsx @@ -1,8 +1,9 @@ import React, { useEffect, useState } from "react"; import { observer } from "mobx-react"; -import { Dialog, Transition } from "@headlessui/react"; // plane package imports +import { createPortal } from "react-dom"; import { ICycle, IModule, IProject } from "@plane/types"; +import { cn } from "@plane/utils"; import { useAnalytics } from "@/hooks/store"; // plane web components import { WorkItemsModalMainContent } from "./content"; @@ -23,6 +24,7 @@ export const WorkItemsModal: React.FC = observer((props) => { const [fullScreen, setFullScreen] = useState(false); const handleClose = () => { + setFullScreen(false); onClose(); }; @@ -30,50 +32,40 @@ export const WorkItemsModal: React.FC = observer((props) => { updateIsEpic(isEpic ?? false); }, [isEpic, updateIsEpic]); - return ( - - - +
+
-
- -
-
- - -
-
-
-
- -
-
+ + +
+
+
); + + return fullScreen && portalContainer ? createPortal(content, portalContainer) : content; }); diff --git a/apps/web/core/components/gantt-chart/chart/root.tsx b/apps/web/core/components/gantt-chart/chart/root.tsx index edc10ce52d7..11bc0ee5469 100644 --- a/apps/web/core/components/gantt-chart/chart/root.tsx +++ b/apps/web/core/components/gantt-chart/chart/root.tsx @@ -1,4 +1,5 @@ import { FC, useEffect, useState } from "react"; +import { createPortal } from "react-dom"; import { observer } from "mobx-react"; // plane imports // components @@ -176,10 +177,12 @@ export const ChartViewRoot: FC = observer((props) => { scrollContainer.scrollLeft = scrollWidth; }; - return ( + const portalContainer = document.getElementById("full-screen-portal") as HTMLElement; + + const content = (
@@ -217,4 +220,6 @@ export const ChartViewRoot: FC = observer((props) => { />
); + + return fullScreenMode && portalContainer ? createPortal(content, portalContainer) : content; }); diff --git a/apps/web/core/components/issues/peek-overview/view.tsx b/apps/web/core/components/issues/peek-overview/view.tsx index c30a40fb54c..8e2c1e20072 100644 --- a/apps/web/core/components/issues/peek-overview/view.tsx +++ b/apps/web/core/components/issues/peek-overview/view.tsx @@ -23,6 +23,7 @@ import useKeypress from "@/hooks/use-keypress"; import usePeekOverviewOutsideClickDetector from "@/hooks/use-peek-overview-outside-click"; // store hooks import { IssueActivity } from "../issue-detail/issue-activity"; +import { createPortal } from "react-dom"; interface IIssueView { workspaceSlug: string; @@ -108,15 +109,151 @@ export const IssueView: FC = observer((props) => { const peekOverviewIssueClassName = cn( !embedIssue - ? "fixed z-20 flex flex-col overflow-hidden rounded border border-custom-border-200 bg-custom-background-100 transition-all duration-300" + ? "fixed z-[25] flex flex-col overflow-hidden rounded border border-custom-border-200 bg-custom-background-100 transition-all duration-300" : `w-full h-full`, !embedIssue && { "bottom-0 right-0 top-0 w-full md:w-[50%] border-0 border-l": peekMode === "side-peek", "size-5/6 top-[8.33%] left-[8.33%]": peekMode === "modal", - "inset-0 m-4": peekMode === "full-screen", + "inset-0 m-4 absolute": peekMode === "full-screen", } ); + const shouldUsePortal = !embedIssue && peekMode === "full-screen"; + + const portalContainer = document.getElementById("full-screen-portal") as HTMLElement; + + const content = ( +
+ {issueId && ( +
+ {isError ? ( +
+ +
+ ) : ( + isLoading && + )} + {!isLoading && !isError && issue && ( + <> + {/* header */} + setPeekMode(value)} + removeRoutePeekId={removeRoutePeekId} + toggleDeleteIssueModal={toggleDeleteIssueModal} + toggleArchiveIssueModal={toggleArchiveIssueModal} + handleRestoreIssue={handleRestore} + isArchived={is_archived} + issueId={issueId} + workspaceSlug={workspaceSlug} + projectId={projectId} + isSubmitting={isSubmitting} + disabled={disabled} + embedIssue={embedIssue} + /> + {/* content */} +
+ {["side-peek", "modal"].includes(peekMode) ? ( +
+ setIsSubmitting(value)} + /> + +
+ +
+ + + + +
+ ) : ( +
+
+
+ setIsSubmitting(value)} + /> + +
+ +
+ + +
+
+
+ +
+
+ )} +
+ + )} +
+ )} +
+ ); + return ( <> {issue && !is_archived && ( @@ -142,135 +279,7 @@ export const IssueView: FC = observer((props) => { /> )} -
- {issueId && ( -
- {isError ? ( -
- -
- ) : ( - isLoading && - )} - {!isLoading && !isError && issue && ( - <> - {/* header */} - setPeekMode(value)} - removeRoutePeekId={removeRoutePeekId} - toggleDeleteIssueModal={toggleDeleteIssueModal} - toggleArchiveIssueModal={toggleArchiveIssueModal} - handleRestoreIssue={handleRestore} - isArchived={is_archived} - issueId={issueId} - workspaceSlug={workspaceSlug} - projectId={projectId} - isSubmitting={isSubmitting} - disabled={disabled} - embedIssue={embedIssue} - /> - {/* content */} -
- {["side-peek", "modal"].includes(peekMode) ? ( -
- setIsSubmitting(value)} - /> - -
- -
- - - - -
- ) : ( -
-
-
- setIsSubmitting(value)} - /> - -
- -
- - -
-
-
- -
-
- )} -
- - )} -
- )} -
+ {shouldUsePortal && portalContainer ? createPortal(content, portalContainer) : content} ); });