[WEB-2388] dev: workspace draft issues (#5772)

* chore: workspace draft page added

* chore: workspace draft issues services added

* chore: workspace draft issue store added

* chore: workspace draft issue filter store added

* chore: issue rendering

* conflicts: resolved merge conflicts

* conflicts: handled draft issue store

* chore: draft issue modal

* chore: code optimisation

* chore: ui changes

* chore: workspace draft store and modal updated

* chore: workspace draft issue component added

* chore: updated store and workflow in draft issues

* chore: updated issue draft store

* chore: updated issue type cleanup in components

* chore: code refactor

* fix: build error

* fix: quick actions

* fix: update mutation

* fix: create update modal

* chore: commented project draft issue code

---------

Co-authored-by: gurusainath <gurusainath007@gmail.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
This commit is contained in:
Anmol Singh Bhatia 2024-10-10 19:12:34 +05:30 committed by GitHub
parent e9158f820f
commit 332d2d5c68
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
45 changed files with 1895 additions and 190 deletions

View file

@ -31,3 +31,4 @@ export * from "./use-webhook";
export * from "./use-workspace";
export * from "./user";
export * from "./use-transient";
export * from "./workspace-draft";

View file

@ -13,6 +13,7 @@ import { IProfileIssues, IProfileIssuesFilter } from "@/store/issue/profile";
import { IProjectIssues, IProjectIssuesFilter } from "@/store/issue/project";
import { IProjectViewIssues, IProjectViewIssuesFilter } from "@/store/issue/project-views";
import { IWorkspaceIssues, IWorkspaceIssuesFilter } from "@/store/issue/workspace";
import { IWorkspaceDraftIssues, IWorkspaceDraftIssuesFilter } from "@/store/issue/workspace-draft";
// constants
type defaultIssueStore = {
@ -24,6 +25,10 @@ export type TStoreIssues = {
issues: IWorkspaceIssues;
issuesFilter: IWorkspaceIssuesFilter;
};
[EIssuesStoreType.WORKSPACE_DRAFT]: defaultIssueStore & {
issues: IWorkspaceDraftIssues;
issuesFilter: IWorkspaceDraftIssuesFilter;
};
[EIssuesStoreType.PROFILE]: defaultIssueStore & {
issues: IProfileIssues;
issuesFilter: IProfileIssuesFilter;
@ -72,6 +77,16 @@ export const useIssues = <T extends EIssuesStoreType>(storeType?: T): TStoreIssu
issues: context.issue.workspaceIssues,
issuesFilter: context.issue.workspaceIssuesFilter,
}) as TStoreIssues[T];
case EIssuesStoreType.WORKSPACE_DRAFT:
return merge(defaultStore, {
issues: context.issue.workspaceDraftIssues,
issuesFilter: context.issue.workspaceDraftIssuesFilter,
}) as TStoreIssues[T];
case EIssuesStoreType.WORKSPACE_DRAFT:
return merge(defaultStore, {
issues: context.issue.workspaceDraftIssues,
issuesFilter: context.issue.workspaceDraftIssuesFilter,
}) as TStoreIssues[T];
case EIssuesStoreType.PROFILE:
return merge(defaultStore, {
issues: context.issue.profileIssues,

View file

@ -0,0 +1,2 @@
export * from "./use-workspace-draft-issue";
export * from "./use-workspace-draft-issue-filters";

View file

@ -0,0 +1,12 @@
import { useContext } from "react";
// mobx store
import { StoreContext } from "@/lib/store-context";
// types
import { IWorkspaceDraftIssues } from "@/store/issue/workspace-draft";
export const useWorkspaceDraftIssueFilters = (): IWorkspaceDraftIssues => {
const context = useContext(StoreContext);
if (context === undefined) throw new Error("useWorkspaceDraftIssueFilters must be used within StoreProvider");
return context.issue.workspaceDraftIssues;
};

View file

@ -0,0 +1,12 @@
import { useContext } from "react";
// mobx store
import { StoreContext } from "@/lib/store-context";
// types
import { IWorkspaceDraftIssues } from "@/store/issue/workspace-draft";
export const useWorkspaceDraftIssues = (): IWorkspaceDraftIssues => {
const context = useContext(StoreContext);
if (context === undefined) throw new Error("useWorkspaceDraftIssues must be used within StoreProvider");
return context.issue.workspaceDraftIssues;
};

View file

@ -45,6 +45,7 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => {
const profileIssueActions = useProfileIssueActions();
const draftIssueActions = useDraftIssueActions();
const archivedIssueActions = useArchivedIssueActions();
const workspaceDraftIssueActions = useWorkspaceDraftIssueActions();
switch (storeType) {
case EIssuesStoreType.PROJECT_VIEW:
@ -61,6 +62,8 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => {
return moduleIssueActions;
case EIssuesStoreType.GLOBAL:
return globalIssueActions;
case EIssuesStoreType.WORKSPACE_DRAFT:
return workspaceDraftIssueActions;
case EIssuesStoreType.PROJECT:
default:
return projectIssueActions;
@ -737,3 +740,80 @@ const useGlobalIssueActions = () => {
[createIssue, updateIssue, removeIssue, updateFilters]
);
};
const useWorkspaceDraftIssueActions = () => {
// router
const { workspaceSlug: routerWorkspaceSlug, globalViewId: routerGlobalViewId } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
const globalViewId = routerGlobalViewId?.toString();
// store hooks
const { issues, issuesFilter } = useIssues(EIssuesStoreType.WORKSPACE_DRAFT);
const fetchIssues = useCallback(
async (loadType: TLoader, options: IssuePaginationOptions) => {
if (!workspaceSlug) return;
return issues.fetchIssues(workspaceSlug.toString(), loadType, options);
},
[workspaceSlug, issues]
);
const fetchNextIssues = useCallback(async () => {
if (!workspaceSlug) return;
return issues.fetchNextIssues(workspaceSlug.toString());
}, [workspaceSlug, issues]);
const createIssue = useCallback(
async (projectId: string | undefined | null, data: Partial<TIssue>) => {
if (!workspaceSlug || !projectId) return;
return await issues.createWorkspaceDraftIssue(workspaceSlug, data);
},
[issues, workspaceSlug]
);
const updateIssue = useCallback(
async (projectId: string | undefined | null, issueId: string, data: Partial<TIssue>) => {
if (!workspaceSlug || !projectId) return;
return await issues.updateWorkspaceDraftIssue(workspaceSlug, issueId, data);
},
[issues, workspaceSlug]
);
const removeIssue = useCallback(
async (projectId: string | undefined | null, issueId: string) => {
if (!workspaceSlug || !projectId) return;
return await issues.deleteWorkspaceDraftIssue(workspaceSlug, issueId);
},
[issues, workspaceSlug]
);
const moveToIssue = useCallback(
async (workspaceSlug: string, issueId: string, data: Partial<TIssue>) => {
if (!workspaceSlug || !issueId || !data) return;
return await issues.moveToIssues(workspaceSlug, issueId, data);
},
[issues]
);
const updateFilters = useCallback(
async (
projectId: string,
filterType: EIssueFilterType,
filters: IIssueFilterOptions | IIssueDisplayFilterOptions | IIssueDisplayProperties | TIssueKanbanFilters
) => {
filters = filters as IIssueFilterOptions | IIssueDisplayFilterOptions | IIssueDisplayProperties;
if (!globalViewId || !workspaceSlug) return;
return await issuesFilter.updateFilters(workspaceSlug, filterType, filters);
},
[globalViewId, workspaceSlug, issuesFilter]
);
return useMemo(
() => ({
fetchIssues,
fetchNextIssues,
createIssue,
updateIssue,
removeIssue,
updateFilters,
moveToIssue,
}),
[fetchIssues, fetchNextIssues, createIssue, updateIssue, removeIssue, updateFilters, moveToIssue]
);
};