chore workspace draft issue improvements (#5808)

This commit is contained in:
Anmol Singh Bhatia 2024-10-11 19:51:38 +05:30 committed by GitHub
parent e7065af358
commit c9580ab794
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 38 additions and 4 deletions

View file

@ -147,6 +147,8 @@ class WorkspaceDraftIssueViewSet(BaseViewSet):
"updated_at", "updated_at",
"created_by", "created_by",
"updated_by", "updated_by",
"type_id",
"description_html",
) )
.first() .first()
) )

View file

@ -30,6 +30,7 @@ export const CreateUpdateIssueModalBase: React.FC<IssuesModalProps> = observer((
storeType: issueStoreFromProps, storeType: issueStoreFromProps,
isDraft = false, isDraft = false,
fetchIssueDetails = true, fetchIssueDetails = true,
moveToIssue = false,
} = props; } = props;
const issueStoreType = useIssueStoreType(); const issueStoreType = useIssueStoreType();
@ -308,6 +309,7 @@ export const CreateUpdateIssueModalBase: React.FC<IssuesModalProps> = observer((
isCreateMoreToggleEnabled={createMore} isCreateMoreToggleEnabled={createMore}
onCreateMoreToggleChange={handleCreateMoreToggleChange} onCreateMoreToggleChange={handleCreateMoreToggleChange}
isDraft={isDraft} isDraft={isDraft}
moveToIssue={moveToIssue}
/> />
) : ( ) : (
<IssueFormRoot <IssueFormRoot
@ -324,6 +326,7 @@ export const CreateUpdateIssueModalBase: React.FC<IssuesModalProps> = observer((
onSubmit={(payload) => handleFormSubmit(payload, isDraft)} onSubmit={(payload) => handleFormSubmit(payload, isDraft)}
projectId={activeProjectId} projectId={activeProjectId}
isDraft={isDraft} isDraft={isDraft}
moveToIssue={moveToIssue}
/> />
)} )}
</ModalCore> </ModalCore>

View file

@ -29,6 +29,7 @@ export interface DraftIssueProps {
onSubmit: (formData: Partial<TIssue>, is_draft_issue?: boolean) => Promise<void>; onSubmit: (formData: Partial<TIssue>, is_draft_issue?: boolean) => Promise<void>;
projectId: string; projectId: string;
isDraft: boolean; isDraft: boolean;
moveToIssue?: boolean;
} }
export const DraftIssueLayout: React.FC<DraftIssueProps> = observer((props) => { export const DraftIssueLayout: React.FC<DraftIssueProps> = observer((props) => {
@ -43,6 +44,7 @@ export const DraftIssueLayout: React.FC<DraftIssueProps> = observer((props) => {
isCreateMoreToggleEnabled, isCreateMoreToggleEnabled,
onCreateMoreToggleChange, onCreateMoreToggleChange,
isDraft, isDraft,
moveToIssue = false,
} = props; } = props;
// states // states
const [issueDiscardModal, setIssueDiscardModal] = useState(false); const [issueDiscardModal, setIssueDiscardModal] = useState(false);
@ -156,6 +158,7 @@ export const DraftIssueLayout: React.FC<DraftIssueProps> = observer((props) => {
onSubmit={onSubmit} onSubmit={onSubmit}
projectId={projectId} projectId={projectId}
isDraft={isDraft} isDraft={isDraft}
moveToIssue={moveToIssue}
/> />
</> </>
); );

View file

@ -7,7 +7,7 @@ import { useForm } from "react-hook-form";
// editor // editor
import { EditorRefApi } from "@plane/editor"; import { EditorRefApi } from "@plane/editor";
// types // types
import type { TIssue, ISearchIssueResponse } from "@plane/types"; import type { TIssue, ISearchIssueResponse, TWorkspaceDraftIssue } from "@plane/types";
// hooks // hooks
import { Button, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui";
// components // components
@ -26,7 +26,7 @@ import { getChangedIssuefields } from "@/helpers/issue.helper";
import { getTabIndex } from "@/helpers/tab-indices.helper"; import { getTabIndex } from "@/helpers/tab-indices.helper";
// hooks // hooks
import { useIssueModal } from "@/hooks/context/use-issue-modal"; 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 { usePlatformOS } from "@/hooks/use-platform-os";
import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties"; import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties";
// plane web components // plane web components
@ -59,6 +59,7 @@ export interface IssueFormProps {
onSubmit: (values: Partial<TIssue>, is_draft_issue?: boolean) => Promise<void>; onSubmit: (values: Partial<TIssue>, is_draft_issue?: boolean) => Promise<void>;
projectId: string; projectId: string;
isDraft: boolean; isDraft: boolean;
moveToIssue?: boolean;
} }
export const IssueFormRoot: FC<IssueFormProps> = observer((props) => { export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
@ -72,6 +73,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
isCreateMoreToggleEnabled, isCreateMoreToggleEnabled,
onCreateMoreToggleChange, onCreateMoreToggleChange,
isDraft, isDraft,
moveToIssue,
} = props; } = props;
// states // states
@ -91,6 +93,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
const { getIssueTypeIdOnProjectChange, getActiveAdditionalPropertiesLength, handlePropertyValuesValidation } = const { getIssueTypeIdOnProjectChange, getActiveAdditionalPropertiesLength, handlePropertyValuesValidation } =
useIssueModal(); useIssueModal();
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();
const { moveIssue } = useWorkspaceDraftIssues();
const { const {
issue: { getIssueById }, issue: { getIssueById },
@ -400,7 +403,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
Discard Discard
</Button> </Button>
<Button <Button
variant="primary" variant={moveToIssue ? "neutral-primary" : "primary"}
type="submit" type="submit"
size="sm" size="sm"
ref={submitBtnRef} ref={submitBtnRef}
@ -417,6 +420,19 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
? "Create draft issue" ? "Create draft issue"
: "Create"} : "Create"}
</Button> </Button>
{moveToIssue && (
<Button
variant="primary"
type="button"
size="sm"
loading={isSubmitting}
onClick={() =>
data?.id && data && moveIssue(workspaceSlug.toString(), data?.id, data as TWorkspaceDraftIssue)
}
>
Add to project
</Button>
)}
</div> </div>
</div> </div>
</div> </div>

View file

@ -20,6 +20,7 @@ export interface IssuesModalProps {
storeType?: EIssuesStoreType; storeType?: EIssuesStoreType;
isDraft?: boolean; isDraft?: boolean;
fetchIssueDetails?: boolean; fetchIssueDetails?: boolean;
moveToIssue?: boolean;
} }
export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer( export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer(

View file

@ -42,6 +42,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC<IQuickActionProps> = obse
parentRef, parentRef,
} = props; } = props;
// states // states
const [moveToIssue, setMoveToIssue] = useState(false);
const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false); const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false);
const [issueToEdit, setIssueToEdit] = useState<TWorkspaceDraftIssue | undefined>(undefined); const [issueToEdit, setIssueToEdit] = useState<TWorkspaceDraftIssue | undefined>(undefined);
const [deleteIssueModal, setDeleteIssueModal] = useState(false); const [deleteIssueModal, setDeleteIssueModal] = useState(false);
@ -77,7 +78,13 @@ export const WorkspaceDraftIssueQuickActions: React.FC<IQuickActionProps> = obse
key: "move-to-issues", key: "move-to-issues",
title: "Move to issues", title: "Move to issues",
icon: SquareStackIcon, icon: SquareStackIcon,
action: () => handleMoveToIssues && handleMoveToIssues(), action: () => {
if (handleMoveToIssues) {
setMoveToIssue(true);
setIssueToEdit(issue);
setCreateUpdateIssueModal(true);
}
},
}, },
{ {
key: "delete", key: "delete",
@ -102,6 +109,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC<IQuickActionProps> = obse
onClose={() => { onClose={() => {
setCreateUpdateIssueModal(false); setCreateUpdateIssueModal(false);
setIssueToEdit(undefined); setIssueToEdit(undefined);
setMoveToIssue(false);
}} }}
data={issueToEdit ?? duplicateIssuePayload} data={issueToEdit ?? duplicateIssuePayload}
onSubmit={async (data) => { onSubmit={async (data) => {
@ -109,6 +117,7 @@ export const WorkspaceDraftIssueQuickActions: React.FC<IQuickActionProps> = obse
}} }}
storeType={EIssuesStoreType.WORKSPACE_DRAFT} storeType={EIssuesStoreType.WORKSPACE_DRAFT}
fetchIssueDetails={false} fetchIssueDetails={false}
moveToIssue={moveToIssue}
isDraft isDraft
/> />
<ContextMenu parentRef={parentRef} items={MENU_ITEMS} /> <ContextMenu parentRef={parentRef} items={MENU_ITEMS} />