diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 91cbac37e..937ff0c2a 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -276,8 +276,6 @@ CELERY_IMPORTS = ( "plane.bgtasks.api_logs_task", # management tasks "plane.bgtasks.dummy_data_task", - # backfill tasks - "plane.db.backfills.backfill_0070_page_versions", ) # Sentry Settings diff --git a/web/core/components/issues/issue-detail-widgets/action-buttons.tsx b/web/core/components/issues/issue-detail-widgets/action-buttons.tsx index 270872350..e69aecae3 100644 --- a/web/core/components/issues/issue-detail-widgets/action-buttons.tsx +++ b/web/core/components/issues/issue-detail-widgets/action-buttons.tsx @@ -22,8 +22,6 @@ export const IssueDetailWidgetActionButtons: FC = (props) => { return (
= (props) => { } /> = (props) => { } /> = observer((props) => { const { workspaceSlug, projectId, issueId, disabled = false } = props; // store hooks - const { activeIssueDetailWidgets, toggleActiveIssueDetailWidget } = useIssueDetail(); + const { openWidgets, toggleOpenWidget } = useIssueDetail(); // derived values - const isCollapsibleOpen = activeIssueDetailWidgets.includes("attachments"); + const isCollapsibleOpen = openWidgets.includes("attachments"); return ( toggleActiveIssueDetailWidget("attachments")} + onToggle={() => toggleOpenWidget("attachments")} title={ = observer((props) => { + const { workspaceSlug, projectId, issueId } = props; + // store hooks + const { + isIssueLinkModalOpen, + toggleIssueLinkModal: toggleIssueLinkModalStore, + isCreateIssueModalOpen, + toggleCreateIssueModal, + isSubIssuesModalOpen, + toggleSubIssuesModal, + relationKey, + isRelationModalOpen, + setRelationKey, + setLastWidgetAction, + toggleRelationModal, + createRelation, + issueCrudOperationState, + setIssueCrudOperationState, + } = useIssueDetail(); + + // helper hooks + const subIssueOperations = useSubIssueOperations(); + const handleLinkOperations = useLinkOperations(workspaceSlug, projectId, issueId); + + // handlers + const handleIssueCrudState = ( + key: "create" | "existing", + _parentIssueId: string | null, + issue: TIssue | null = null + ) => { + setIssueCrudOperationState({ + ...issueCrudOperationState, + [key]: { + toggle: !issueCrudOperationState[key].toggle, + parentIssueId: _parentIssueId, + issue: issue, + }, + }); + }; + + const handleExistingIssuesModalClose = () => { + handleIssueCrudState("existing", null, null); + setLastWidgetAction("sub-issues"); + toggleSubIssuesModal(null); + }; + + const handleExistingIssuesModalOnSubmit = async (_issue: ISearchIssueResponse[]) => + subIssueOperations.addSubIssue( + workspaceSlug, + projectId, + issueId, + _issue.map((issue) => issue.id) + ); + + const handleCreateUpdateModalClose = () => { + handleIssueCrudState("create", null, null); + toggleCreateIssueModal(false); + setLastWidgetAction("sub-issues"); + }; + + const handleCreateUpdateModalOnSubmit = async (_issue: TIssue) => { + if (_issue.parent_id) { + await subIssueOperations.addSubIssue(workspaceSlug, projectId, issueId, [_issue.id]); + } + }; + + const handleIssueLinkModalOnClose = () => { + toggleIssueLinkModalStore(false); + setLastWidgetAction("links"); + }; + + const handleRelationOnClose = () => { + setRelationKey(null); + toggleRelationModal(null, null); + setLastWidgetAction("relations"); + }; + + const handleExistingIssueModalOnSubmit = async (data: ISearchIssueResponse[]) => { + if (!relationKey) return; + if (data.length === 0) { + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: "Please select at least one issue.", + }); + return; + } + + await createRelation( + workspaceSlug, + projectId, + issueId, + relationKey, + data.map((i) => i.id) + ); + + toggleRelationModal(null, null); + }; + + // helpers + const createUpdateModalData = { parent_id: issueCrudOperationState?.create?.parentIssueId }; + + const existingIssuesModalSearchParams = { + sub_issue: true, + issue_id: issueCrudOperationState?.existing?.parentIssueId, + }; + + // render conditions + const shouldRenderExistingIssuesModal = + issueCrudOperationState?.existing?.toggle && + issueCrudOperationState?.existing?.parentIssueId && + isSubIssuesModalOpen; + + const shouldRenderCreateUpdateModal = + issueCrudOperationState?.create?.toggle && issueCrudOperationState?.create?.parentIssueId && isCreateIssueModalOpen; + + return ( + <> + + + {shouldRenderCreateUpdateModal && ( + + )} + + {shouldRenderExistingIssuesModal && ( + + )} + + + + ); +}); 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 981005d78..f9a59dd3a 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 @@ -1,63 +1,30 @@ "use client"; -import React, { FC, useCallback, useState } from "react"; +import React, { FC } from "react"; import { observer } from "mobx-react"; import { Plus } from "lucide-react"; // hooks import { useIssueDetail } from "@/hooks/store"; -// components -import { IssueLinkCreateUpdateModal } from "../../issue-detail/links/create-update-link-modal"; -// helper -import { useLinkOperations } from "./helper"; type Props = { - workspaceSlug: string; - projectId: string; - issueId: string; customButton?: React.ReactNode; disabled?: boolean; }; export const IssueLinksActionButton: FC = observer((props) => { - const { workspaceSlug, projectId, issueId, customButton, disabled = false } = props; - // state - const [isIssueLinkModal, setIsIssueLinkModal] = useState(false); - + const { customButton, disabled = false } = props; // store hooks - const { toggleIssueLinkModal: toggleIssueLinkModalStore, setLastWidgetAction } = useIssueDetail(); - - // helper - const handleLinkOperations = useLinkOperations(workspaceSlug, projectId, issueId); - - // handler - const toggleIssueLinkModal = useCallback( - (modalToggle: boolean) => { - toggleIssueLinkModalStore(modalToggle); - setIsIssueLinkModal(modalToggle); - }, - [toggleIssueLinkModalStore] - ); + const { toggleIssueLinkModal } = useIssueDetail(); + // handlers const handleOnClick = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); toggleIssueLinkModal(true); }; - const handleOnClose = () => { - toggleIssueLinkModal(false); - setLastWidgetAction("links"); - }; - return ( - <> - - - + ); }); diff --git a/web/core/components/issues/issue-detail-widgets/links/root.tsx b/web/core/components/issues/issue-detail-widgets/links/root.tsx index e608cf6be..0f1eee4bb 100644 --- a/web/core/components/issues/issue-detail-widgets/links/root.tsx +++ b/web/core/components/issues/issue-detail-widgets/links/root.tsx @@ -17,24 +17,16 @@ type Props = { export const LinksCollapsible: FC = observer((props) => { const { workspaceSlug, projectId, issueId, disabled = false } = props; // store hooks - const { activeIssueDetailWidgets, toggleActiveIssueDetailWidget } = useIssueDetail(); + const { openWidgets, toggleOpenWidget } = useIssueDetail(); // derived values - const isCollapsibleOpen = activeIssueDetailWidgets.includes("links"); + const isCollapsibleOpen = openWidgets.includes("links"); return ( toggleActiveIssueDetailWidget("links")} - title={ - - } + onToggle={() => toggleOpenWidget("links")} + title={} > = observer((props) => { - const { isOpen, workspaceSlug, projectId, issueId, disabled } = props; + const { isOpen, issueId, disabled } = props; // store hooks const { issue: { getIssueById }, @@ -42,14 +40,7 @@ export const IssueLinksCollapsibleTitle: FC = observer((props) => { isOpen={isOpen} title="Links" indicatorElement={indicatorElement} - actionItemElement={ - - } + actionItemElement={} /> ); }); diff --git a/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx b/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx index 2d5886383..67161ecbd 100644 --- a/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx +++ b/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx @@ -1,30 +1,24 @@ "use client"; -import React, { FC, useState } from "react"; +import React, { FC } from "react"; import { observer } from "mobx-react"; import { Plus } from "lucide-react"; -import { ISearchIssueResponse, TIssueRelationTypes } from "@plane/types"; -import { CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; -// components -import { ExistingIssuesListModal } from "@/components/core"; +import { TIssueRelationTypes } from "@plane/types"; +import { CustomMenu } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store"; // helper import { ISSUE_RELATION_OPTIONS } from "./helper"; type Props = { - workspaceSlug: string; - projectId: string; issueId: string; customButton?: React.ReactNode; disabled?: boolean; }; export const RelationActionButton: FC = observer((props) => { - const { workspaceSlug, projectId, customButton, issueId, disabled = false } = props; - // state - const [relationKey, setRelationKey] = useState(null); + const { customButton, issueId, disabled = false } = props; // store hooks - const { createRelation, isRelationModalOpen, toggleRelationModal, setLastWidgetAction } = useIssueDetail(); + const { toggleRelationModal, setRelationKey } = useIssueDetail(); // handlers const handleOnClick = (relationKey: TIssueRelationTypes) => { @@ -32,67 +26,26 @@ export const RelationActionButton: FC = observer((props) => { toggleRelationModal(issueId, relationKey); }; - // submit handler - const onSubmit = async (data: ISearchIssueResponse[]) => { - if (!relationKey) return; - if (data.length === 0) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "Please select at least one issue.", - }); - return; - } - - await createRelation( - workspaceSlug, - projectId, - issueId, - relationKey, - data.map((i) => i.id) - ); - - toggleRelationModal(null, null); - }; - - const handleOnClose = () => { - setRelationKey(null); - toggleRelationModal(null, null); - setLastWidgetAction("relations"); - }; - // button element const customButtonElement = customButton ? <>{customButton} : ; return ( - <> - - {ISSUE_RELATION_OPTIONS.map((item, index) => ( - { - e.preventDefault(); - e.stopPropagation(); - handleOnClick(item.key as TIssueRelationTypes); - }} - > -
- {item.icon(12)} - {item.label} -
-
- ))} -
- - - + + {ISSUE_RELATION_OPTIONS.map((item, index) => ( + { + e.preventDefault(); + e.stopPropagation(); + handleOnClick(item.key as TIssueRelationTypes); + }} + > +
+ {item.icon(12)} + {item.label} +
+
+ ))} +
); }); diff --git a/web/core/components/issues/issue-detail-widgets/relations/root.tsx b/web/core/components/issues/issue-detail-widgets/relations/root.tsx index 7e2469d87..4a1e4138e 100644 --- a/web/core/components/issues/issue-detail-widgets/relations/root.tsx +++ b/web/core/components/issues/issue-detail-widgets/relations/root.tsx @@ -17,24 +17,16 @@ type Props = { export const RelationsCollapsible: FC = observer((props) => { const { workspaceSlug, projectId, issueId, disabled = false } = props; // store hooks - const { activeIssueDetailWidgets, toggleActiveIssueDetailWidget } = useIssueDetail(); + const { openWidgets, toggleOpenWidget } = useIssueDetail(); // derived values - const isCollapsibleOpen = activeIssueDetailWidgets.includes("relations"); + const isCollapsibleOpen = openWidgets.includes("relations"); return ( toggleActiveIssueDetailWidget("relations")} - title={ - - } + onToggle={() => toggleOpenWidget("relations")} + title={} > = observer((props) => { - const { isOpen, workspaceSlug, projectId, issueId, disabled } = props; + const { isOpen, issueId, disabled } = props; // store hook const { relation: { getRelationsByIssueId }, @@ -41,14 +39,7 @@ export const RelationsCollapsibleTitle: FC = observer((props) => { isOpen={isOpen} title="Relations" indicatorElement={indicatorElement} - actionItemElement={ - - } + actionItemElement={} /> ); }); diff --git a/web/core/components/issues/issue-detail-widgets/root.tsx b/web/core/components/issues/issue-detail-widgets/root.tsx index 0ac8064d7..364dac960 100644 --- a/web/core/components/issues/issue-detail-widgets/root.tsx +++ b/web/core/components/issues/issue-detail-widgets/root.tsx @@ -4,6 +4,7 @@ import React, { FC } from "react"; import { IssueDetailWidgetActionButtons, IssueDetailWidgetCollapsibles, + IssueDetailWidgetModals, } from "@/components/issues/issue-detail-widgets"; type Props = { @@ -16,19 +17,22 @@ type Props = { export const IssueDetailWidgets: FC = (props) => { const { workspaceSlug, projectId, issueId, disabled } = props; return ( -
- - -
+ <> +
+ + +
+ + ); }; diff --git a/web/core/components/issues/issue-detail-widgets/sub-issues/quick-action-button.tsx b/web/core/components/issues/issue-detail-widgets/sub-issues/quick-action-button.tsx index adae820bb..bf1ece310 100644 --- a/web/core/components/issues/issue-detail-widgets/sub-issues/quick-action-button.tsx +++ b/web/core/components/issues/issue-detail-widgets/sub-issues/quick-action-button.tsx @@ -1,58 +1,34 @@ "use client"; -import React, { FC, useState } from "react"; +import React, { FC } from "react"; import { observer } from "mobx-react"; import { LayersIcon, Plus } from "lucide-react"; -import { ISearchIssueResponse, TIssue } from "@plane/types"; +import { TIssue } from "@plane/types"; import { CustomMenu } from "@plane/ui"; -// components -import { ExistingIssuesListModal } from "@/components/core"; -import { CreateUpdateIssueModal } from "@/components/issues/issue-modal"; // hooks import { useEventTracker, useIssueDetail } from "@/hooks/store"; -// helper -import { useSubIssueOperations } from "./helper"; type Props = { - workspaceSlug: string; - projectId: string; issueId: string; customButton?: React.ReactNode; disabled?: boolean; }; -type TIssueCrudState = { toggle: boolean; parentIssueId: string | undefined; issue: TIssue | undefined }; - export const SubIssuesActionButton: FC = observer((props) => { - const { workspaceSlug, projectId, issueId, customButton, disabled = false } = props; - // state - const [issueCrudState, setIssueCrudState] = useState<{ - create: TIssueCrudState; - existing: TIssueCrudState; - }>({ - create: { - toggle: false, - parentIssueId: undefined, - issue: undefined, - }, - existing: { - toggle: false, - parentIssueId: undefined, - issue: undefined, - }, - }); + const { issueId, customButton, disabled = false } = props; // store hooks const { issue: { getIssueById }, - isCreateIssueModalOpen, toggleCreateIssueModal, - isSubIssuesModalOpen, toggleSubIssuesModal, - setLastWidgetAction, + setIssueCrudOperationState, + issueCrudOperationState, } = useIssueDetail(); const { setTrackElement } = useEventTracker(); - // helper - const subIssueOperations = useSubIssueOperations(); + // derived values + const issue = getIssueById(issueId); + + if (!issue) return <>; // handlers const handleIssueCrudState = ( @@ -60,21 +36,16 @@ export const SubIssuesActionButton: FC = observer((props) => { _parentIssueId: string | null, issue: TIssue | null = null ) => { - setIssueCrudState({ - ...issueCrudState, + setIssueCrudOperationState({ + ...issueCrudOperationState, [key]: { - toggle: !issueCrudState[key].toggle, + toggle: !issueCrudOperationState[key].toggle, parentIssueId: _parentIssueId, issue: issue, }, }); }; - // derived values - const issue = getIssueById(issueId); - - if (!issue) return <>; - const handleCreateNew = () => { setTrackElement("Issue detail nested sub-issue"); handleIssueCrudState("create", issueId, null); @@ -87,32 +58,6 @@ export const SubIssuesActionButton: FC = observer((props) => { toggleSubIssuesModal(issue.id); }; - const handleExistingIssuesModalClose = () => { - handleIssueCrudState("existing", null, null); - setLastWidgetAction("sub-issues"); - toggleSubIssuesModal(null); - }; - - const handleExistingIssuesModalOnSubmit = async (_issue: ISearchIssueResponse[]) => - subIssueOperations.addSubIssue( - workspaceSlug, - projectId, - issueId, - _issue.map((issue) => issue.id) - ); - - const handleCreateUpdateModalClose = () => { - handleIssueCrudState("create", null, null); - toggleCreateIssueModal(false); - setLastWidgetAction("sub-issues"); - }; - - const handleCreateUpdateModalOnSubmit = async (_issue: TIssue) => { - if (_issue.parent_id) { - await subIssueOperations.addSubIssue(workspaceSlug, projectId, issueId, [_issue.id]); - } - }; - // options const optionItems = [ { @@ -127,59 +72,26 @@ export const SubIssuesActionButton: FC = observer((props) => { }, ]; - // create update modal - const shouldRenderCreateUpdateModal = - issueCrudState?.create?.toggle && issueCrudState?.create?.parentIssueId && isCreateIssueModalOpen; - - const createUpdateModalData = { parent_id: issueCrudState?.create?.parentIssueId }; - - // existing issues modal - const shouldRenderExistingIssuesModal = - issueCrudState?.existing?.toggle && issueCrudState?.existing?.parentIssueId && isSubIssuesModalOpen; - - const existingIssuesModalSearchParams = { sub_issue: true, issue_id: issueCrudState?.existing?.parentIssueId }; - + // button element const customButtonElement = customButton ? <>{customButton} : ; + return ( - <> - - {optionItems.map((item, index) => ( - { - e.preventDefault(); - e.stopPropagation(); - item.onClick(); - }} - > -
- {item.icon} - {item.label} -
-
- ))} -
- - {shouldRenderCreateUpdateModal && ( - - )} - - {shouldRenderExistingIssuesModal && ( - - )} - + + {optionItems.map((item, index) => ( + { + e.preventDefault(); + e.stopPropagation(); + item.onClick(); + }} + > +
+ {item.icon} + {item.label} +
+
+ ))} +
); }); diff --git a/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx b/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx index 50f216bbf..5ce79bb64 100644 --- a/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx +++ b/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx @@ -18,24 +18,16 @@ export const SubIssuesCollapsible: FC = observer((props) => { const { workspaceSlug, projectId, issueId, disabled = false } = props; // store hooks - const { activeIssueDetailWidgets, toggleActiveIssueDetailWidget } = useIssueDetail(); + const { openWidgets, toggleOpenWidget } = useIssueDetail(); // derived state - const isCollapsibleOpen = activeIssueDetailWidgets.includes("sub-issues"); + const isCollapsibleOpen = openWidgets.includes("sub-issues"); return ( toggleActiveIssueDetailWidget("sub-issues")} - title={ - - } + onToggle={() => toggleOpenWidget("sub-issues")} + title={} > = observer((props) => { - const { isOpen, workspaceSlug, projectId, parentIssueId, disabled } = props; + const { isOpen, parentIssueId, disabled } = props; // store hooks const { subIssues: { subIssuesByIssueId, stateDistributionByIssueId }, @@ -52,14 +50,7 @@ export const SubIssuesCollapsibleTitle: FC = observer((props) => { isOpen={isOpen} title="Sub-issues" indicatorElement={indicatorElement} - actionItemElement={ - - } + actionItemElement={} /> ); }); diff --git a/web/core/store/issue/issue-details/root.store.ts b/web/core/store/issue/issue-details/root.store.ts index f6dcdd931..e16a41a4a 100644 --- a/web/core/store/issue/issue-details/root.store.ts +++ b/web/core/store/issue/issue-details/root.store.ts @@ -38,6 +38,13 @@ export type TIssueRelationModal = { relationType: TIssueRelationTypes | null; }; +export type TIssueCrudState = { toggle: boolean; parentIssueId: string | undefined; issue: TIssue | undefined }; + +export type TIssueCrudOperationState = { + create: TIssueCrudState; + existing: TIssueCrudState; +}; + export interface IIssueDetail extends IIssueStoreActions, IIssueReactionStoreActions, @@ -51,7 +58,9 @@ export interface IIssueDetail IIssueCommentReactionStoreActions { // observables peekIssue: TPeekIssue | undefined; - activeIssueDetailWidgets: TIssueDetailWidget[]; + relationKey: TIssueRelationTypes | null; + issueCrudOperationState: TIssueCrudOperationState; + openWidgets: TIssueDetailWidget[]; lastWidgetAction: TIssueDetailWidget | null; isCreateIssueModalOpen: boolean; isIssueLinkModalOpen: boolean; @@ -75,9 +84,11 @@ export interface IIssueDetail toggleRelationModal: (issueId: string | null, relationType: TIssueRelationTypes | null) => void; toggleSubIssuesModal: (value: string | null) => void; toggleDeleteAttachmentModal: (attachmentId: string | null) => void; - setActiveIssueDetailWidgets: (state: TIssueDetailWidget[]) => void; + setOpenWidgets: (state: TIssueDetailWidget[]) => void; setLastWidgetAction: (action: TIssueDetailWidget) => void; - toggleActiveIssueDetailWidget: (state: TIssueDetailWidget) => void; + toggleOpenWidget: (state: TIssueDetailWidget) => void; + setRelationKey: (relationKey: TIssueRelationTypes | null) => void; + setIssueCrudOperationState: (state: TIssueCrudOperationState) => void; // store rootIssueStore: IIssueRootStore; issue: IIssueStore; @@ -95,7 +106,20 @@ export interface IIssueDetail export class IssueDetail implements IIssueDetail { // observables peekIssue: TPeekIssue | undefined = undefined; - activeIssueDetailWidgets: TIssueDetailWidget[] = ["sub-issues"]; + relationKey: TIssueRelationTypes | null = null; + issueCrudOperationState: TIssueCrudOperationState = { + create: { + toggle: false, + parentIssueId: undefined, + issue: undefined, + }, + existing: { + toggle: false, + parentIssueId: undefined, + issue: undefined, + }, + }; + openWidgets: TIssueDetailWidget[] = ["sub-issues", "links", "attachments"]; lastWidgetAction: TIssueDetailWidget | null = null; isCreateIssueModalOpen: boolean = false; isIssueLinkModalOpen: boolean = false; @@ -122,6 +146,8 @@ export class IssueDetail implements IIssueDetail { makeObservable(this, { // observables peekIssue: observable, + relationKey: observable, + issueCrudOperationState: observable, isCreateIssueModalOpen: observable, isIssueLinkModalOpen: observable.ref, isParentIssueModalOpen: observable.ref, @@ -130,7 +156,7 @@ export class IssueDetail implements IIssueDetail { isRelationModalOpen: observable.ref, isSubIssuesModalOpen: observable.ref, attachmentDeleteModalId: observable.ref, - activeIssueDetailWidgets: observable.ref, + openWidgets: observable.ref, lastWidgetAction: observable.ref, // computed isAnyModalOpen: computed, @@ -144,9 +170,11 @@ export class IssueDetail implements IIssueDetail { toggleRelationModal: action, toggleSubIssuesModal: action, toggleDeleteAttachmentModal: action, - setActiveIssueDetailWidgets: action, + setOpenWidgets: action, setLastWidgetAction: action, - toggleActiveIssueDetailWidget: action, + toggleOpenWidget: action, + setRelationKey: action, + setIssueCrudOperationState: action, }); // store @@ -181,6 +209,8 @@ export class IssueDetail implements IIssueDetail { getIsIssuePeeked = (issueId: string) => this.peekIssue?.issueId === issueId; // actions + setRelationKey = (relationKey: TIssueRelationTypes | null) => (this.relationKey = relationKey); + setIssueCrudOperationState = (state: TIssueCrudOperationState) => (this.issueCrudOperationState = state); setPeekIssue = (peekIssue: TPeekIssue | undefined) => (this.peekIssue = peekIssue); toggleCreateIssueModal = (value: boolean) => (this.isCreateIssueModalOpen = value); toggleIssueLinkModal = (value: boolean) => (this.isIssueLinkModalOpen = value); @@ -191,17 +221,17 @@ export class IssueDetail implements IIssueDetail { (this.isRelationModalOpen = { issueId, relationType }); toggleSubIssuesModal = (issueId: string | null) => (this.isSubIssuesModalOpen = issueId); toggleDeleteAttachmentModal = (attachmentId: string | null) => (this.attachmentDeleteModalId = attachmentId); - setActiveIssueDetailWidgets = (state: TIssueDetailWidget[]) => { - this.activeIssueDetailWidgets = state; + setOpenWidgets = (state: TIssueDetailWidget[]) => { + this.openWidgets = state; if (this.lastWidgetAction) this.lastWidgetAction = null; }; setLastWidgetAction = (action: TIssueDetailWidget) => { - this.activeIssueDetailWidgets = [action]; + this.openWidgets = [action]; }; - toggleActiveIssueDetailWidget = (state: TIssueDetailWidget) => { - if (this.activeIssueDetailWidgets && this.activeIssueDetailWidgets.includes(state)) - this.activeIssueDetailWidgets = this.activeIssueDetailWidgets.filter((s) => s !== state); - else this.activeIssueDetailWidgets = [state, ...this.activeIssueDetailWidgets]; + toggleOpenWidget = (state: TIssueDetailWidget) => { + if (this.openWidgets && this.openWidgets.includes(state)) + this.openWidgets = this.openWidgets.filter((s) => s !== state); + else this.openWidgets = [state, ...this.openWidgets]; }; // issue