mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
dev: optimised the issue fetching in issue base store
This commit is contained in:
parent
ab04e7943d
commit
1ae39f1016
@ -5,7 +5,7 @@ import useSWR from "swr";
|
|||||||
// mobx store
|
// mobx store
|
||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
// TODO: update this
|
// TODO: update this
|
||||||
// import useStoreIssues from "hooks/use-store-issues";
|
import useStoreIssues from "hooks/use-store-issues";
|
||||||
// components
|
// components
|
||||||
import {
|
import {
|
||||||
ListLayout,
|
ListLayout,
|
||||||
@ -38,7 +38,12 @@ export const ProjectLayoutRoot: React.FC = observer(() => {
|
|||||||
|
|
||||||
// TODO: update this
|
// TODO: update this
|
||||||
// const {
|
// const {
|
||||||
// issues: { loader: issueLoader, getIssuesIds: issueGetIssuesIds, fetchIssues: issueFetchIssues },
|
// issues: {
|
||||||
|
// loader: issueLoader,
|
||||||
|
// getIssues: issueGetIssues,
|
||||||
|
// getIssuesIds: issueGetIssuesIds,
|
||||||
|
// fetchIssues: issueFetchIssues,
|
||||||
|
// },
|
||||||
// issuesFilter: { issueFilters: issueIssueFilters, fetchFilters: issueFetchFilters },
|
// issuesFilter: { issueFilters: issueIssueFilters, fetchFilters: issueFetchFilters },
|
||||||
// } = useStoreIssues("project");
|
// } = useStoreIssues("project");
|
||||||
|
|
||||||
@ -49,6 +54,11 @@ export const ProjectLayoutRoot: React.FC = observer(() => {
|
|||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
// console.log("---");
|
||||||
|
// console.log("issueGetIssuesIds", issueGetIssuesIds);
|
||||||
|
// console.log("issueGetIssues", issueGetIssues);
|
||||||
|
// console.log("---");
|
||||||
|
|
||||||
const activeLayout = issueFilters?.displayFilters?.layout;
|
const activeLayout = issueFilters?.displayFilters?.layout;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// issue store provider
|
// issue store provider
|
||||||
import { useMobxIssueStore } from "lib/mobx/store-issues-provider";
|
import { useMobxIssueStore } from "lib/mobx/store-issues-provider";
|
||||||
// types
|
// types
|
||||||
import { IIssueStore } from "store/issue/issue.store";
|
|
||||||
import { IWorkspaceIssues, IWorkspaceIssuesFilter } from "store/issue/workspace";
|
import { IWorkspaceIssues, IWorkspaceIssuesFilter } from "store/issue/workspace";
|
||||||
import { IProfileIssues, IProfileIssuesFilter } from "store/issue/profile";
|
import { IProfileIssues, IProfileIssuesFilter } from "store/issue/profile";
|
||||||
import { IProjectIssues, IProjectIssuesFilter } from "store/issue/project";
|
import { IProjectIssues, IProjectIssuesFilter } from "store/issue/project";
|
||||||
@ -21,7 +20,6 @@ interface IStoreIssues {
|
|||||||
// issuesFilter: IProfileIssuesFilter;
|
// issuesFilter: IProfileIssuesFilter;
|
||||||
// };
|
// };
|
||||||
project: {
|
project: {
|
||||||
allIssues: IIssueStore;
|
|
||||||
issues: IProjectIssues;
|
issues: IProjectIssues;
|
||||||
issuesFilter: IProjectIssuesFilter;
|
issuesFilter: IProjectIssuesFilter;
|
||||||
};
|
};
|
||||||
@ -86,7 +84,6 @@ const useStoreIssues = (issueSpace: keyof IStoreIssues) => {
|
|||||||
// issuesFilter: profileIssuesFilter,
|
// issuesFilter: profileIssuesFilter,
|
||||||
// },
|
// },
|
||||||
project: {
|
project: {
|
||||||
allIssues: issues,
|
|
||||||
issues: projectIssues,
|
issues: projectIssues,
|
||||||
issuesFilter: projectIssuesFilter,
|
issuesFilter: projectIssuesFilter,
|
||||||
},
|
},
|
||||||
@ -113,7 +110,6 @@ const useStoreIssues = (issueSpace: keyof IStoreIssues) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
allIssues: storeIssues[issueSpace].allIssues,
|
|
||||||
issues: storeIssues[issueSpace].issues,
|
issues: storeIssues[issueSpace].issues,
|
||||||
issuesFilter: storeIssues[issueSpace].issuesFilter,
|
issuesFilter: storeIssues[issueSpace].issuesFilter,
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import get from "lodash/get";
|
||||||
// store
|
// store
|
||||||
import { action, makeObservable, observable, runInAction } from "mobx";
|
import { action, makeObservable, observable, runInAction } from "mobx";
|
||||||
import { IIssueRootStore } from "./root.store";
|
import { IIssueRootStore } from "./root.store";
|
||||||
@ -5,21 +6,18 @@ import { IIssueRootStore } from "./root.store";
|
|||||||
import { IIssue } from "types";
|
import { IIssue } from "types";
|
||||||
|
|
||||||
export interface IIssueStore {
|
export interface IIssueStore {
|
||||||
issues: { [key: string]: IIssue };
|
allIssues: { [key: string]: IIssue };
|
||||||
// actions
|
// actions
|
||||||
addIssue(issues: IIssue[]): void;
|
addIssue(issues: IIssue[]): void;
|
||||||
updateIssue(issueId: string, issue: Partial<IIssue>): void;
|
updateIssue(issueId: string, issue: Partial<IIssue>): void;
|
||||||
removeIssue(issueId: string): void;
|
removeIssue(issueId: string): void;
|
||||||
// helper Methods
|
// helper Methods
|
||||||
getIssueById(id: string): undefined | IIssue;
|
getIssueById(id: string): undefined | IIssue;
|
||||||
getIssuesByWorkspace(workspaceSlug: string): undefined | { [key: string]: IIssue };
|
getIssuesByKey(issueKey: string, value: string): undefined | { [key: string]: IIssue };
|
||||||
getIssuesByProject(projectId: string): undefined | { [key: string]: IIssue };
|
|
||||||
getIssuesByCycle(cycleId: string): undefined | { [key: string]: IIssue };
|
|
||||||
getIssuesByModule(moduleId: string): undefined | { [key: string]: IIssue };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class IssueStore implements IIssueStore {
|
export class IssueStore implements IIssueStore {
|
||||||
issues: { [key: string]: IIssue } = {};
|
allIssues: { [key: string]: IIssue } = {};
|
||||||
// root store
|
// root store
|
||||||
rootStore: IIssueRootStore;
|
rootStore: IIssueRootStore;
|
||||||
|
|
||||||
@ -28,7 +26,7 @@ export class IssueStore implements IIssueStore {
|
|||||||
|
|
||||||
makeObservable(this, {
|
makeObservable(this, {
|
||||||
// observable
|
// observable
|
||||||
issues: observable,
|
allIssues: observable.ref,
|
||||||
// actions
|
// actions
|
||||||
addIssue: action,
|
addIssue: action,
|
||||||
updateIssue: action,
|
updateIssue: action,
|
||||||
@ -39,68 +37,43 @@ export class IssueStore implements IIssueStore {
|
|||||||
addIssue = (issues: IIssue[]) => {
|
addIssue = (issues: IIssue[]) => {
|
||||||
if (issues && issues.length <= 0) return;
|
if (issues && issues.length <= 0) return;
|
||||||
|
|
||||||
const _issues = { ...this.issues };
|
const _issues = { ...this.allIssues };
|
||||||
issues.forEach((issue) => {
|
issues.forEach((issue) => {
|
||||||
_issues[issue.id] = issue;
|
_issues[issue.id] = issue;
|
||||||
});
|
});
|
||||||
|
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
this.issues = _issues;
|
this.allIssues = _issues;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
updateIssue = (issueId: string, issue: Partial<IIssue>) => {
|
updateIssue = (issueId: string, issue: Partial<IIssue>) => {
|
||||||
if (!issue || !issueId || !this.issues[issueId]) return;
|
if (!issue || !issueId || !this.allIssues[issueId]) return;
|
||||||
this.issues[issueId] = { ...this.issues[issueId], ...issue };
|
this.allIssues[issueId] = { ...this.allIssues[issueId], ...issue };
|
||||||
};
|
};
|
||||||
|
|
||||||
removeIssue = (issueId: string) => {
|
removeIssue = (issueId: string) => {
|
||||||
if (issueId) return;
|
if (issueId) return;
|
||||||
delete this.issues[issueId];
|
delete this.allIssues[issueId];
|
||||||
};
|
};
|
||||||
|
|
||||||
// helper methods
|
// helper methods
|
||||||
getIssueById = (id: string) => {
|
getIssueById = (id: string) => {
|
||||||
if (!id) return undefined;
|
if (!id) return undefined;
|
||||||
return this.issues[id];
|
return this.allIssues[id];
|
||||||
};
|
};
|
||||||
|
|
||||||
getIssuesByWorkspace = (workspaceSlug: string) => {
|
getIssuesByKey = (issueKey: keyof IIssue, value: string) => {
|
||||||
if (!workspaceSlug || !this.issues) return undefined;
|
if (!issueKey || !value || !this.allIssues) return undefined;
|
||||||
const projectIssues = Object.values(this.issues).filter((issue) => issue?.workspace === workspaceSlug);
|
|
||||||
const filteredIssues: { [key: string]: IIssue } = {};
|
const filteredIssues: { [key: string]: IIssue } = {};
|
||||||
projectIssues.map((issue) => {
|
|
||||||
filteredIssues[issue.id] = issue;
|
|
||||||
});
|
|
||||||
return filteredIssues;
|
|
||||||
};
|
|
||||||
|
|
||||||
getIssuesByProject = (projectId: string) => {
|
Object.values(this.allIssues).forEach((issue) => {
|
||||||
if (!projectId || !this.issues) return undefined;
|
const issueKeyValue = get(issue, issueKey);
|
||||||
const projectIssues = Object.values(this.issues).filter((issue) => issue?.project === projectId);
|
if (issueKeyValue == value) {
|
||||||
const filteredIssues: { [key: string]: IIssue } = {};
|
|
||||||
projectIssues.map((issue) => {
|
|
||||||
filteredIssues[issue.id] = issue;
|
filteredIssues[issue.id] = issue;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return filteredIssues;
|
|
||||||
};
|
|
||||||
|
|
||||||
getIssuesByCycle = (projectId: string) => {
|
|
||||||
if (!projectId || !this.issues) return undefined;
|
|
||||||
const projectIssues = Object.values(this.issues).filter((issue) => issue?.project === projectId);
|
|
||||||
const filteredIssues: { [key: string]: IIssue } = {};
|
|
||||||
projectIssues.map((issue) => {
|
|
||||||
filteredIssues[issue.id] = issue;
|
|
||||||
});
|
|
||||||
return filteredIssues;
|
|
||||||
};
|
|
||||||
|
|
||||||
getIssuesByModule = (projectId: string) => {
|
|
||||||
if (!projectId || !this.issues) return undefined;
|
|
||||||
const projectIssues = Object.values(this.issues).filter((issue) => issue?.project === projectId);
|
|
||||||
const filteredIssues: { [key: string]: IIssue } = {};
|
|
||||||
projectIssues.map((issue) => {
|
|
||||||
filteredIssues[issue.id] = issue;
|
|
||||||
});
|
|
||||||
return filteredIssues;
|
return filteredIssues;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ export interface IProjectIssues {
|
|||||||
loader: TLoader;
|
loader: TLoader;
|
||||||
issues: { [project_id: string]: string[] };
|
issues: { [project_id: string]: string[] };
|
||||||
// computed
|
// computed
|
||||||
|
getIssues: { [issue_id: string]: IIssue } | undefined;
|
||||||
getIssuesIds: IGroupedIssues | ISubGroupedIssues | TUnGroupedIssues | undefined;
|
getIssuesIds: IGroupedIssues | ISubGroupedIssues | TUnGroupedIssues | undefined;
|
||||||
// action
|
// action
|
||||||
fetchIssues: (workspaceSlug: string, projectId: string, loadType: TLoader) => Promise<IIssueResponse>;
|
fetchIssues: (workspaceSlug: string, projectId: string, loadType: TLoader) => Promise<IIssueResponse>;
|
||||||
@ -46,6 +47,7 @@ export class ProjectIssues extends IssueHelperStore implements IProjectIssues {
|
|||||||
loader: observable.ref,
|
loader: observable.ref,
|
||||||
issues: observable,
|
issues: observable,
|
||||||
// computed
|
// computed
|
||||||
|
getIssues: computed,
|
||||||
getIssuesIds: computed,
|
getIssuesIds: computed,
|
||||||
// action
|
// action
|
||||||
fetchIssues: action,
|
fetchIssues: action,
|
||||||
@ -65,7 +67,7 @@ export class ProjectIssues extends IssueHelperStore implements IProjectIssues {
|
|||||||
const projectId = this.rootStore?.projectId;
|
const projectId = this.rootStore?.projectId;
|
||||||
if (!projectId) return undefined;
|
if (!projectId) return undefined;
|
||||||
|
|
||||||
const _issues = this.rootStore.issues.getIssuesByProject(projectId);
|
const _issues = this.rootStore.issues.getIssuesByKey("project", projectId);
|
||||||
if (!_issues) return undefined;
|
if (!_issues) return undefined;
|
||||||
|
|
||||||
return _issues;
|
return _issues;
|
||||||
|
Loading…
Reference in New Issue
Block a user