From 9de5b1a009726b8a90f13af2a5bd1f9dfab254b8 Mon Sep 17 00:00:00 2001 From: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com> Date: Wed, 6 Aug 2025 22:44:33 +0530 Subject: [PATCH] [WEB-4634]chore: refactor for work items store (#7538) * chore: refactor for work items store * chore: updated conditions order --- .../issues/issue-layouts/empty-states/index.ts | 2 +- .../issue-layouts/empty-states/team-project.tsx | 3 +++ apps/web/ce/helpers/issue-action-helper.ts | 7 +++++++ .../ce/store/issue/team-project/filter.store.ts | 12 ++++++++++++ apps/web/ce/store/issue/team-project/index.ts | 2 ++ .../web/ce/store/issue/team-project/issue.store.ts | 13 +++++++++++++ .../issues/issue-layouts/empty-states/index.tsx | 3 +++ apps/web/core/hooks/store/use-issues.ts | 10 ++++++++++ apps/web/core/hooks/use-group-dragndrop.ts | 3 ++- apps/web/core/hooks/use-issue-layout-store.ts | 6 ++++-- apps/web/core/hooks/use-issues-actions.tsx | 9 ++++++++- apps/web/core/store/issue/root.store.ts | 14 ++++++++++++++ packages/constants/src/issue/common.ts | 3 ++- packages/types/src/issues/issue.ts | 1 + packages/utils/src/work-item/base.ts | 9 ++++++++- 15 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 apps/web/ce/components/issues/issue-layouts/empty-states/team-project.tsx create mode 100644 apps/web/ce/store/issue/team-project/filter.store.ts create mode 100644 apps/web/ce/store/issue/team-project/index.ts create mode 100644 apps/web/ce/store/issue/team-project/issue.store.ts diff --git a/apps/web/ce/components/issues/issue-layouts/empty-states/index.ts b/apps/web/ce/components/issues/issue-layouts/empty-states/index.ts index 319b4c684..9b19efab9 100644 --- a/apps/web/ce/components/issues/issue-layouts/empty-states/index.ts +++ b/apps/web/ce/components/issues/issue-layouts/empty-states/index.ts @@ -1,2 +1,2 @@ export * from "./team-issues"; -export * from "./team-view-issues"; +export * from "./team-view-issues"; \ No newline at end of file diff --git a/apps/web/ce/components/issues/issue-layouts/empty-states/team-project.tsx b/apps/web/ce/components/issues/issue-layouts/empty-states/team-project.tsx new file mode 100644 index 000000000..95adbf9a0 --- /dev/null +++ b/apps/web/ce/components/issues/issue-layouts/empty-states/team-project.tsx @@ -0,0 +1,3 @@ +import { observer } from "mobx-react"; + +export const TeamProjectWorkItemEmptyState: React.FC = observer(() => <>); diff --git a/apps/web/ce/helpers/issue-action-helper.ts b/apps/web/ce/helpers/issue-action-helper.ts index b1644e2aa..42aca8a9e 100644 --- a/apps/web/ce/helpers/issue-action-helper.ts +++ b/apps/web/ce/helpers/issue-action-helper.ts @@ -13,3 +13,10 @@ export const useTeamViewIssueActions: () => IssueActions = () => ({ removeIssue: () => Promise.resolve(undefined), updateFilters: () => Promise.resolve(undefined), }); + +export const useTeamProjectWorkItemsActions: () => IssueActions = () => ({ + fetchIssues: () => Promise.resolve(undefined), + fetchNextIssues: () => Promise.resolve(undefined), + removeIssue: () => Promise.resolve(undefined), + updateFilters: () => Promise.resolve(undefined), +}); \ No newline at end of file diff --git a/apps/web/ce/store/issue/team-project/filter.store.ts b/apps/web/ce/store/issue/team-project/filter.store.ts new file mode 100644 index 000000000..7905325bc --- /dev/null +++ b/apps/web/ce/store/issue/team-project/filter.store.ts @@ -0,0 +1,12 @@ +import { IProjectIssuesFilter, ProjectIssuesFilter } from "@/store/issue/project"; +import { IIssueRootStore } from "@/store/issue/root.store"; + +// @ts-nocheck - This class will never be used, extending similar class to avoid type errors +export type ITeamProjectWorkItemsFilter = IProjectIssuesFilter; + +// @ts-nocheck - This class will never be used, extending similar class to avoid type errors +export class TeamProjectWorkItemsFilter extends ProjectIssuesFilter implements ITeamProjectWorkItemsFilter { + constructor(_rootStore: IIssueRootStore) { + super(_rootStore); + } +} diff --git a/apps/web/ce/store/issue/team-project/index.ts b/apps/web/ce/store/issue/team-project/index.ts new file mode 100644 index 000000000..904aa8e1d --- /dev/null +++ b/apps/web/ce/store/issue/team-project/index.ts @@ -0,0 +1,2 @@ +export * from "./filter.store"; +export * from "./issue.store"; \ No newline at end of file diff --git a/apps/web/ce/store/issue/team-project/issue.store.ts b/apps/web/ce/store/issue/team-project/issue.store.ts new file mode 100644 index 000000000..2b2d408b6 --- /dev/null +++ b/apps/web/ce/store/issue/team-project/issue.store.ts @@ -0,0 +1,13 @@ +import { IProjectIssues, ProjectIssues } from "@/store/issue/project"; +import { IIssueRootStore } from "@/store/issue/root.store"; +import { ITeamProjectWorkItemsFilter } from "./filter.store"; + +// @ts-nocheck - This class will never be used, extending similar class to avoid type errors +export type ITeamProjectWorkItems = IProjectIssues; + +// @ts-nocheck - This class will never be used, extending similar class to avoid type errors +export class TeamProjectWorkItems extends ProjectIssues implements ITeamProjectWorkItems { + constructor(_rootStore: IIssueRootStore, teamProjectWorkItemsFilterStore: ITeamProjectWorkItemsFilter) { + super(_rootStore, teamProjectWorkItemsFilterStore); + } +} diff --git a/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx b/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx index e51fa932d..1db3a3d8d 100644 --- a/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx +++ b/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx @@ -1,6 +1,7 @@ // plane web components import { EIssuesStoreType } from "@plane/types"; import { TeamEmptyState, TeamViewEmptyState } from "@/plane-web/components/issues/issue-layouts/empty-states"; +import { TeamProjectWorkItemEmptyState } from "@/plane-web/components/issues/issue-layouts/empty-states/team-project"; // components import { ProjectArchivedEmptyState } from "./archived-issues"; import { CycleEmptyState } from "./cycle"; @@ -40,6 +41,8 @@ export const IssueLayoutEmptyState = (props: Props) => { return ; case EIssuesStoreType.TEAM_VIEW: return ; + case EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS: + return ; default: return null; } diff --git a/apps/web/core/hooks/store/use-issues.ts b/apps/web/core/hooks/store/use-issues.ts index 4ea9e54bf..6c99a5f11 100644 --- a/apps/web/core/hooks/store/use-issues.ts +++ b/apps/web/core/hooks/store/use-issues.ts @@ -6,6 +6,7 @@ import { StoreContext } from "@/lib/store-context"; import { IProjectEpics, IProjectEpicsFilter } from "@/plane-web/store/issue/epic"; // types import { ITeamIssues, ITeamIssuesFilter } from "@/plane-web/store/issue/team"; +import { ITeamProjectWorkItemsFilter, ITeamProjectWorkItems } from "@/plane-web/store/issue/team-project"; import { ITeamViewIssues, ITeamViewIssuesFilter } from "@/plane-web/store/issue/team-views"; import { IWorkspaceIssues } from "@/plane-web/store/issue/workspace/issue.store"; import { IArchivedIssues, IArchivedIssuesFilter } from "@/store/issue/archived"; @@ -76,6 +77,10 @@ export type TStoreIssues = { issues: IProjectEpics; issuesFilter: IProjectEpicsFilter; }; + [EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS]: defaultIssueStore & { + issues: ITeamProjectWorkItems; + issuesFilter: ITeamProjectWorkItemsFilter; + }; }; export const useIssues = (storeType?: T): TStoreIssues[T] => { @@ -147,6 +152,11 @@ export const useIssues = (storeType?: T): TStoreIssu issues: context.issue.projectEpics, issuesFilter: context.issue.projectEpicsFilter, }) as TStoreIssues[T]; + case EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS: + return merge(defaultStore, { + issues: context.issue.teamProjectWorkItems, + issuesFilter: context.issue.teamProjectWorkItemsFilter, + }) as TStoreIssues[T]; default: return merge(defaultStore, { issues: context.issue.projectIssues, diff --git a/apps/web/core/hooks/use-group-dragndrop.ts b/apps/web/core/hooks/use-group-dragndrop.ts index e52d6ea9e..75aa54b84 100644 --- a/apps/web/core/hooks/use-group-dragndrop.ts +++ b/apps/web/core/hooks/use-group-dragndrop.ts @@ -19,7 +19,8 @@ type DNDStoreType = | EIssuesStoreType.WORKSPACE_DRAFT | EIssuesStoreType.TEAM | EIssuesStoreType.TEAM_VIEW - | EIssuesStoreType.EPIC; + | EIssuesStoreType.EPIC + | EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS; export const useGroupIssuesDragNDrop = ( storeType: DNDStoreType, diff --git a/apps/web/core/hooks/use-issue-layout-store.ts b/apps/web/core/hooks/use-issue-layout-store.ts index df419cec9..b2ecb5777 100644 --- a/apps/web/core/hooks/use-issue-layout-store.ts +++ b/apps/web/core/hooks/use-issue-layout-store.ts @@ -17,6 +17,10 @@ export const useIssueStoreType = () => { if (userId) return EIssuesStoreType.PROFILE; + if (teamspaceId && viewId) return EIssuesStoreType.TEAM_VIEW; + + if (teamspaceId && projectId) return EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS; + if (viewId) return EIssuesStoreType.PROJECT_VIEW; if (cycleId) return EIssuesStoreType.CYCLE; @@ -29,8 +33,6 @@ export const useIssueStoreType = () => { if (teamspaceId) return EIssuesStoreType.TEAM; - if (teamspaceId && viewId) return EIssuesStoreType.TEAM_VIEW; - return EIssuesStoreType.PROJECT; }; diff --git a/apps/web/core/hooks/use-issues-actions.tsx b/apps/web/core/hooks/use-issues-actions.tsx index 848accc34..2c02d149d 100644 --- a/apps/web/core/hooks/use-issues-actions.tsx +++ b/apps/web/core/hooks/use-issues-actions.tsx @@ -14,7 +14,11 @@ import { TLoader, TProfileViews, } from "@plane/types"; -import { useTeamIssueActions, useTeamViewIssueActions } from "@/plane-web/helpers/issue-action-helper"; +import { + useTeamIssueActions, + useTeamViewIssueActions, + useTeamProjectWorkItemsActions, +} from "@/plane-web/helpers/issue-action-helper"; import { useIssues } from "./store"; export interface IssueActions { @@ -51,6 +55,7 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => { const draftIssueActions = useDraftIssueActions(); const archivedIssueActions = useArchivedIssueActions(); const workspaceDraftIssueActions = useWorkspaceDraftIssueActions(); + const teamProjectWorkItemsActions = useTeamProjectWorkItemsActions(); switch (storeType) { case EIssuesStoreType.TEAM_VIEW: @@ -76,6 +81,8 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => { return workspaceDraftIssueActions; case EIssuesStoreType.EPIC: return projectEpicsActions; + case EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS: + return teamProjectWorkItemsActions; case EIssuesStoreType.PROJECT: default: return projectIssueActions; diff --git a/apps/web/core/store/issue/root.store.ts b/apps/web/core/store/issue/root.store.ts index 5178f2cd5..a43c71472 100644 --- a/apps/web/core/store/issue/root.store.ts +++ b/apps/web/core/store/issue/root.store.ts @@ -15,6 +15,11 @@ import { import { IProjectEpics, IProjectEpicsFilter, ProjectEpics, ProjectEpicsFilter } from "@/plane-web/store/issue/epic"; import { IIssueDetail, IssueDetail } from "@/plane-web/store/issue/issue-details/root.store"; import { ITeamIssuesFilter, ITeamIssues, TeamIssues, TeamIssuesFilter } from "@/plane-web/store/issue/team"; +import { + ITeamProjectWorkItemsFilter, + TeamProjectWorkItemsFilter, +} from "@/plane-web/store/issue/team-project/filter.store"; +import { ITeamProjectWorkItems, TeamProjectWorkItems } from "@/plane-web/store/issue/team-project/issue.store"; import { ITeamViewIssues, ITeamViewIssuesFilter, @@ -101,6 +106,9 @@ export interface IIssueRootStore { teamViewIssuesFilter: ITeamViewIssuesFilter; teamViewIssues: ITeamViewIssues; + teamProjectWorkItemsFilter: ITeamProjectWorkItemsFilter; + teamProjectWorkItems: ITeamProjectWorkItems; + projectViewIssuesFilter: IProjectViewIssuesFilter; projectViewIssues: IProjectViewIssues; @@ -172,6 +180,9 @@ export class IssueRootStore implements IIssueRootStore { projectViewIssuesFilter: IProjectViewIssuesFilter; projectViewIssues: IProjectViewIssues; + teamProjectWorkItemsFilter: ITeamProjectWorkItemsFilter; + teamProjectWorkItems: ITeamProjectWorkItems; + archivedIssuesFilter: IArchivedIssuesFilter; archivedIssues: IArchivedIssues; @@ -263,6 +274,9 @@ export class IssueRootStore implements IIssueRootStore { this.projectViewIssuesFilter = new ProjectViewIssuesFilter(this); this.projectViewIssues = new ProjectViewIssues(this, this.projectViewIssuesFilter); + this.teamProjectWorkItemsFilter = new TeamProjectWorkItemsFilter(this); + this.teamProjectWorkItems = new TeamProjectWorkItems(this, this.teamProjectWorkItemsFilter); + this.archivedIssuesFilter = new ArchivedIssuesFilter(this); this.archivedIssues = new ArchivedIssues(this, this.archivedIssuesFilter); diff --git a/packages/constants/src/issue/common.ts b/packages/constants/src/issue/common.ts index b6fa8368a..665fa930a 100644 --- a/packages/constants/src/issue/common.ts +++ b/packages/constants/src/issue/common.ts @@ -101,7 +101,8 @@ export type TCreateModalStoreTypes = | EIssuesStoreType.PROFILE | EIssuesStoreType.CYCLE | EIssuesStoreType.MODULE - | EIssuesStoreType.EPIC; + | EIssuesStoreType.EPIC + | EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS; export const ISSUE_GROUP_BY_OPTIONS: { key: TIssueGroupByOptions; diff --git a/packages/types/src/issues/issue.ts b/packages/types/src/issues/issue.ts index dbcb95218..33470b482 100644 --- a/packages/types/src/issues/issue.ts +++ b/packages/types/src/issues/issue.ts @@ -33,6 +33,7 @@ export enum EIssuesStoreType { DEFAULT = "DEFAULT", WORKSPACE_DRAFT = "WORKSPACE_DRAFT", EPIC = "EPIC", + TEAM_PROJECT_WORK_ITEMS = "TEAM_PROJECT_WORK_ITEMS", } export type TBaseIssue = { diff --git a/packages/utils/src/work-item/base.ts b/packages/utils/src/work-item/base.ts index 6cef74175..b16289c93 100644 --- a/packages/utils/src/work-item/base.ts +++ b/packages/utils/src/work-item/base.ts @@ -102,7 +102,14 @@ export const handleIssuesMutation: THandleIssuesMutation = ( export const handleIssueQueryParamsByLayout = ( layout: EIssueLayoutTypes | undefined, - viewType: "my_issues" | "issues" | "profile_issues" | "archived_issues" | "draft_issues" | "team_issues" + viewType: + | "my_issues" + | "issues" + | "profile_issues" + | "archived_issues" + | "draft_issues" + | "team_issues" + | "team_project_work_items" ): TIssueParams[] | null => { const queryParams: TIssueParams[] = [];