diff --git a/web/ce/components/issues/issue-details/index.ts b/web/ce/components/issues/issue-details/index.ts index 3979faf9488..e23fbe531e2 100644 --- a/web/ce/components/issues/issue-details/index.ts +++ b/web/ce/components/issues/issue-details/index.ts @@ -2,3 +2,4 @@ export * from "./issue-identifier"; export * from "./issue-properties-activity"; export * from "./issue-type-switcher"; export * from "./issue-type-activity"; +export * from "./parent-select-root"; diff --git a/web/ce/components/issues/issue-details/parent-select-root.tsx b/web/ce/components/issues/issue-details/parent-select-root.tsx new file mode 100644 index 00000000000..820a578e170 --- /dev/null +++ b/web/ce/components/issues/issue-details/parent-select-root.tsx @@ -0,0 +1,82 @@ +"use client"; + +import React from "react"; +import { observer } from "mobx-react"; +import { useTranslation } from "@plane/i18n"; +// ui +import { TOAST_TYPE, setToast } from "@plane/ui"; +// components +import { IssueParentSelect, TIssueOperations } from "@/components/issues"; +// hooks +import { useIssueDetail } from "@/hooks/store"; + +type TIssueParentSelect = { + className?: string; + disabled?: boolean; + issueId: string; + issueOperations: TIssueOperations; + projectId: string; + workspaceSlug: string; +}; + +export const IssueParentSelectRoot: React.FC = observer((props) => { + const { issueId, issueOperations, projectId, workspaceSlug } = props; + const { t } = useTranslation(); + // store hooks + const { + issue: { getIssueById }, + } = useIssueDetail(); + const { + toggleParentIssueModal, + removeSubIssue, + subIssues: { setSubIssueHelpers, fetchSubIssues }, + } = useIssueDetail(); + + // derived values + const issue = getIssueById(issueId); + const parentIssue = issue?.parent_id ? getIssueById(issue.parent_id) : undefined; + + const handleParentIssue = async (_issueId: string | null = null) => { + try { + await issueOperations.update(workspaceSlug, projectId, issueId, { parent_id: _issueId }); + await issueOperations.fetch(workspaceSlug, projectId, issueId, false); + if (_issueId) await fetchSubIssues(workspaceSlug, projectId, _issueId); + toggleParentIssueModal(null); + } catch (error) { + console.error("something went wrong while fetching the issue"); + } + }; + + const handleRemoveSubIssue = async ( + workspaceSlug: string, + projectId: string, + parentIssueId: string, + issueId: string + ) => { + try { + setSubIssueHelpers(parentIssueId, "issue_loader", issueId); + await removeSubIssue(workspaceSlug, projectId, parentIssueId, issueId); + await fetchSubIssues(workspaceSlug, projectId, parentIssueId); + setSubIssueHelpers(parentIssueId, "issue_loader", issueId); + } catch (error) { + setToast({ + type: TOAST_TYPE.ERROR, + title: t("common.error.label"), + message: t("common.something_went_wrong"), + }); + } + }; + + const workItemLink = `/${workspaceSlug}/projects/${parentIssue?.project_id}/issues/${parentIssue?.id}`; + + if (!issue) return <>; + + return ( + + ); +}); diff --git a/web/core/components/issues/issue-detail/parent-select.tsx b/web/core/components/issues/issue-detail/parent-select.tsx index 72c0de41287..59cb3808a5c 100644 --- a/web/core/components/issues/issue-detail/parent-select.tsx +++ b/web/core/components/issues/issue-detail/parent-select.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; import { Pencil, X } from "lucide-react"; import { useTranslation } from "@plane/i18n"; // ui -import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { Tooltip } from "@plane/ui"; // components import { ParentIssuesListModal } from "@/components/issues"; // helpers @@ -17,31 +17,41 @@ import { usePlatformOS } from "@/hooks/use-platform-os"; // plane web components import { IssueIdentifier } from "@/plane-web/components/issues"; // types -import { TIssueOperations } from "./root"; type TIssueParentSelect = { className?: string; disabled?: boolean; issueId: string; - issueOperations: TIssueOperations; projectId: string; workspaceSlug: string; + handleParentIssue: (_issueId?: string | null) => Promise; + handleRemoveSubIssue: ( + workspaceSlug: string, + projectId: string, + parentIssueId: string, + issueId: string + ) => Promise; + workItemLink: string; }; export const IssueParentSelect: React.FC = observer((props) => { - const { className = "", disabled = false, issueId, issueOperations, projectId, workspaceSlug } = props; + const { + className = "", + disabled = false, + issueId, + projectId, + workspaceSlug, + handleParentIssue, + handleRemoveSubIssue, + workItemLink, + } = props; const { t } = useTranslation(); // store hooks const { getProjectById } = useProject(); const { issue: { getIssueById }, } = useIssueDetail(); - const { - isParentIssueModalOpen, - toggleParentIssueModal, - removeSubIssue, - subIssues: { setSubIssueHelpers, fetchSubIssues }, - } = useIssueDetail(); + const { isParentIssueModalOpen, toggleParentIssueModal } = useIssueDetail(); // derived values const issue = getIssueById(issueId); @@ -49,36 +59,6 @@ export const IssueParentSelect: React.FC = observer((props) const parentIssueProjectDetails = parentIssue && parentIssue.project_id ? getProjectById(parentIssue.project_id) : undefined; const { isMobile } = usePlatformOS(); - const handleParentIssue = async (_issueId: string | null = null) => { - try { - await issueOperations.update(workspaceSlug, projectId, issueId, { parent_id: _issueId }); - await issueOperations.fetch(workspaceSlug, projectId, issueId, false); - _issueId && (await fetchSubIssues(workspaceSlug, projectId, _issueId)); - toggleParentIssueModal(null); - } catch (error) { - console.error("something went wrong while fetching the issue"); - } - }; - - const handleRemoveSubIssue = async ( - workspaceSlug: string, - projectId: string, - parentIssueId: string, - issueId: string - ) => { - try { - setSubIssueHelpers(parentIssueId, "issue_loader", issueId); - await removeSubIssue(workspaceSlug, projectId, parentIssueId, issueId); - await fetchSubIssues(workspaceSlug, projectId, parentIssueId); - setSubIssueHelpers(parentIssueId, "issue_loader", issueId); - } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: t("common.error.label"), - message: t("common.something_went_wrong"), - }); - } - }; if (!issue) return <>; @@ -109,12 +89,7 @@ export const IssueParentSelect: React.FC = observer((props) {issue.parent_id && parentIssue ? (
- e.stopPropagation()} - > + e.stopPropagation()}> {parentIssue?.project_id && parentIssueProjectDetails && ( = observer((props) => { {t("common.parent")}
- = observer((pro

{t("common.parent")}

-