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 319b4c68440..9b19efab997 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 00000000000..95adbf9a053 --- /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 b1644e2aa26..42aca8a9e38 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 00000000000..7905325bcb7 --- /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 00000000000..904aa8e1de9 --- /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 00000000000..2b2d408b68e --- /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 e51fa932d77..1db3a3d8d11 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 4ea9e54bf35..6c99a5f111d 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 e52d6ea9e83..75aa54b84f6 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 df419cec9d0..b2ecb57772f 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 848accc34c5..2c02d149d40 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 5178f2cd54f..a43c7147211 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 b6fa8368ac4..665fa930ad9 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 dbcb9521818..33470b48298 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 6cef74175ab..b16289c934b 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[] = [];