diff --git a/packages/types/src/issues/issue.d.ts b/packages/types/src/issues/issue.d.ts index d86ab24d23..577b865c1f 100644 --- a/packages/types/src/issues/issue.d.ts +++ b/packages/types/src/issues/issue.d.ts @@ -84,7 +84,7 @@ export type TIssuesResponse = { total_pages: number; extra_stats: null; results: TIssueResponseResults; -} +}; export type TBulkIssueProperties = Pick< TIssue, @@ -100,3 +100,9 @@ export type TBulkOperationsPayload = { issue_ids: string[]; properties: Partial; }; + +export type TIssueDetailWidget = + | "sub-issues" + | "relations" + | "links" + | "attachments"; diff --git a/packages/ui/src/collapsible/collapsible-button.tsx b/packages/ui/src/collapsible/collapsible-button.tsx index 92b7ef90ac..a56a724b4c 100644 --- a/packages/ui/src/collapsible/collapsible-button.tsx +++ b/packages/ui/src/collapsible/collapsible-button.tsx @@ -13,7 +13,7 @@ type Props = { export const CollapsibleButton: FC = (props) => { const { isOpen, title, hideChevron = false, indicatorElement, actionItemElement } = props; return ( -
+
{!hideChevron && ( diff --git a/web/core/components/issues/issue-detail-widgets/attachments/quick-action-button.tsx b/web/core/components/issues/issue-detail-widgets/attachments/quick-action-button.tsx index fe2cfde308..2d7a5de86f 100644 --- a/web/core/components/issues/issue-detail-widgets/attachments/quick-action-button.tsx +++ b/web/core/components/issues/issue-detail-widgets/attachments/quick-action-button.tsx @@ -8,7 +8,7 @@ import { MAX_FILE_SIZE } from "@/constants/common"; // helper import { generateFileName } from "@/helpers/attachment.helper"; // hooks -import { useInstance } from "@/hooks/store"; +import { useInstance, useIssueDetail } from "@/hooks/store"; import { useAttachmentOperations } from "./helper"; @@ -22,11 +22,16 @@ type Props = { export const IssueAttachmentActionButton: FC = observer((props) => { const { workspaceSlug, projectId, issueId, customButton, disabled = false } = props; - // helper + // state const [isLoading, setIsLoading] = useState(false); + // store hooks const { config } = useInstance(); + const { setLastWidgetAction } = useIssueDetail(); + + // operations const handleAttachmentOperations = useAttachmentOperations(workspaceSlug, projectId, issueId); + // handlers const onDrop = useCallback( (acceptedFiles: File[]) => { const currentFile: File = acceptedFiles[0]; @@ -45,7 +50,10 @@ export const IssueAttachmentActionButton: FC = observer((props) => { }) ); setIsLoading(true); - handleAttachmentOperations.create(formData).finally(() => setIsLoading(false)); + handleAttachmentOperations.create(formData).finally(() => { + setLastWidgetAction("attachments"); + setIsLoading(false); + }); }, [handleAttachmentOperations, workspaceSlug] ); diff --git a/web/core/components/issues/issue-detail-widgets/attachments/root.tsx b/web/core/components/issues/issue-detail-widgets/attachments/root.tsx index 2c564f8149..3c7529cecc 100644 --- a/web/core/components/issues/issue-detail-widgets/attachments/root.tsx +++ b/web/core/components/issues/issue-detail-widgets/attachments/root.tsx @@ -1,11 +1,14 @@ "use client"; -import React, { FC, useState } from "react"; +import React, { FC } from "react"; +import { observer } from "mobx-react"; import { Collapsible } from "@plane/ui"; // components import { IssueAttachmentsCollapsibleContent, IssueAttachmentsCollapsibleTitle, } from "@/components/issues/issue-detail-widgets"; +// hooks +import { useIssueDetail } from "@/hooks/store"; type Props = { workspaceSlug: string; @@ -14,17 +17,21 @@ type Props = { disabled?: boolean; }; -export const AttachmentsCollapsible: FC = (props) => { +export const AttachmentsCollapsible: FC = observer((props) => { const { workspaceSlug, projectId, issueId, disabled = false } = props; - // state - const [isOpen, setIsOpen] = useState(false); + // store hooks + const { activeIssueDetailWidgets, toggleActiveIssueDetailWidget } = useIssueDetail(); + + // derived values + const isCollapsibleOpen = activeIssueDetailWidgets.includes("attachments"); + return ( setIsOpen((prev) => !prev)} + isOpen={isCollapsibleOpen} + onToggle={() => toggleActiveIssueDetailWidget("attachments")} title={ = (props) => { /> ); -}; +}); diff --git a/web/core/components/issues/issue-detail-widgets/links/quick-action-button.tsx b/web/core/components/issues/issue-detail-widgets/links/quick-action-button.tsx index 99c1ccf4d1..981005d78b 100644 --- a/web/core/components/issues/issue-detail-widgets/links/quick-action-button.tsx +++ b/web/core/components/issues/issue-detail-widgets/links/quick-action-button.tsx @@ -23,7 +23,7 @@ export const IssueLinksActionButton: FC = observer((props) => { const [isIssueLinkModal, setIsIssueLinkModal] = useState(false); // store hooks - const { toggleIssueLinkModal: toggleIssueLinkModalStore } = useIssueDetail(); + const { toggleIssueLinkModal: toggleIssueLinkModalStore, setLastWidgetAction } = useIssueDetail(); // helper const handleLinkOperations = useLinkOperations(workspaceSlug, projectId, issueId); @@ -43,11 +43,16 @@ export const IssueLinksActionButton: FC = observer((props) => { toggleIssueLinkModal(true); }; + const handleOnClose = () => { + toggleIssueLinkModal(false); + setLastWidgetAction("links"); + }; + return ( <>