diff --git a/apiserver/plane/app/views/workspace/draft.py b/apiserver/plane/app/views/workspace/draft.py index 8930e871703..d81dd5a5032 100644 --- a/apiserver/plane/app/views/workspace/draft.py +++ b/apiserver/plane/app/views/workspace/draft.py @@ -147,6 +147,8 @@ def create(self, request, slug): "updated_at", "created_by", "updated_by", + "type_id", + "description_html", ) .first() ) diff --git a/web/core/components/issues/issue-modal/base.tsx b/web/core/components/issues/issue-modal/base.tsx index afbebcebad7..10656f11b9c 100644 --- a/web/core/components/issues/issue-modal/base.tsx +++ b/web/core/components/issues/issue-modal/base.tsx @@ -30,6 +30,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( storeType: issueStoreFromProps, isDraft = false, fetchIssueDetails = true, + moveToIssue = false, } = props; const issueStoreType = useIssueStoreType(); @@ -308,6 +309,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( isCreateMoreToggleEnabled={createMore} onCreateMoreToggleChange={handleCreateMoreToggleChange} isDraft={isDraft} + moveToIssue={moveToIssue} /> ) : ( = observer(( onSubmit={(payload) => handleFormSubmit(payload, isDraft)} projectId={activeProjectId} isDraft={isDraft} + moveToIssue={moveToIssue} /> )} diff --git a/web/core/components/issues/issue-modal/draft-issue-layout.tsx b/web/core/components/issues/issue-modal/draft-issue-layout.tsx index c3a7c180557..b542539bbc5 100644 --- a/web/core/components/issues/issue-modal/draft-issue-layout.tsx +++ b/web/core/components/issues/issue-modal/draft-issue-layout.tsx @@ -29,6 +29,7 @@ export interface DraftIssueProps { onSubmit: (formData: Partial, is_draft_issue?: boolean) => Promise; projectId: string; isDraft: boolean; + moveToIssue?: boolean; } export const DraftIssueLayout: React.FC = observer((props) => { @@ -43,6 +44,7 @@ export const DraftIssueLayout: React.FC = observer((props) => { isCreateMoreToggleEnabled, onCreateMoreToggleChange, isDraft, + moveToIssue = false, } = props; // states const [issueDiscardModal, setIssueDiscardModal] = useState(false); @@ -156,6 +158,7 @@ export const DraftIssueLayout: React.FC = observer((props) => { onSubmit={onSubmit} projectId={projectId} isDraft={isDraft} + moveToIssue={moveToIssue} /> ); diff --git a/web/core/components/issues/issue-modal/form.tsx b/web/core/components/issues/issue-modal/form.tsx index 615d935f561..215c34099ef 100644 --- a/web/core/components/issues/issue-modal/form.tsx +++ b/web/core/components/issues/issue-modal/form.tsx @@ -7,7 +7,7 @@ import { useForm } from "react-hook-form"; // editor import { EditorRefApi } from "@plane/editor"; // types -import type { TIssue, ISearchIssueResponse } from "@plane/types"; +import type { TIssue, ISearchIssueResponse, TWorkspaceDraftIssue } from "@plane/types"; // hooks import { Button, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui"; // components @@ -26,7 +26,7 @@ import { getChangedIssuefields } from "@/helpers/issue.helper"; import { getTabIndex } from "@/helpers/tab-indices.helper"; // hooks import { useIssueModal } from "@/hooks/context/use-issue-modal"; -import { useIssueDetail, useProject, useProjectState } from "@/hooks/store"; +import { useIssueDetail, useProject, useProjectState, useWorkspaceDraftIssues } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties"; // plane web components @@ -59,6 +59,7 @@ export interface IssueFormProps { onSubmit: (values: Partial, is_draft_issue?: boolean) => Promise; projectId: string; isDraft: boolean; + moveToIssue?: boolean; } export const IssueFormRoot: FC = observer((props) => { @@ -72,6 +73,7 @@ export const IssueFormRoot: FC = observer((props) => { isCreateMoreToggleEnabled, onCreateMoreToggleChange, isDraft, + moveToIssue, } = props; // states @@ -91,6 +93,7 @@ export const IssueFormRoot: FC = observer((props) => { const { getIssueTypeIdOnProjectChange, getActiveAdditionalPropertiesLength, handlePropertyValuesValidation } = useIssueModal(); const { isMobile } = usePlatformOS(); + const { moveIssue } = useWorkspaceDraftIssues(); const { issue: { getIssueById }, @@ -400,7 +403,7 @@ export const IssueFormRoot: FC = observer((props) => { Discard + {moveToIssue && ( + + )} diff --git a/web/core/components/issues/issue-modal/modal.tsx b/web/core/components/issues/issue-modal/modal.tsx index 9266cb32255..c1a27544bbe 100644 --- a/web/core/components/issues/issue-modal/modal.tsx +++ b/web/core/components/issues/issue-modal/modal.tsx @@ -20,6 +20,7 @@ export interface IssuesModalProps { storeType?: EIssuesStoreType; isDraft?: boolean; fetchIssueDetails?: boolean; + moveToIssue?: boolean; } export const CreateUpdateIssueModal: React.FC = observer( diff --git a/web/core/components/issues/workspace-draft/quick-action.tsx b/web/core/components/issues/workspace-draft/quick-action.tsx index 5a3f8268830..62fea2ea7be 100644 --- a/web/core/components/issues/workspace-draft/quick-action.tsx +++ b/web/core/components/issues/workspace-draft/quick-action.tsx @@ -42,6 +42,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC = obse parentRef, } = props; // states + const [moveToIssue, setMoveToIssue] = useState(false); const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false); const [issueToEdit, setIssueToEdit] = useState(undefined); const [deleteIssueModal, setDeleteIssueModal] = useState(false); @@ -77,7 +78,13 @@ export const WorkspaceDraftIssueQuickActions: React.FC = obse key: "move-to-issues", title: "Move to issues", icon: SquareStackIcon, - action: () => handleMoveToIssues && handleMoveToIssues(), + action: () => { + if (handleMoveToIssues) { + setMoveToIssue(true); + setIssueToEdit(issue); + setCreateUpdateIssueModal(true); + } + }, }, { key: "delete", @@ -102,6 +109,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC = obse onClose={() => { setCreateUpdateIssueModal(false); setIssueToEdit(undefined); + setMoveToIssue(false); }} data={issueToEdit ?? duplicateIssuePayload} onSubmit={async (data) => { @@ -109,6 +117,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC = obse }} storeType={EIssuesStoreType.WORKSPACE_DRAFT} fetchIssueDetails={false} + moveToIssue={moveToIssue} isDraft />