mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
9075f9441c
* style: added cta at the bottom of sidebar, added missing icons as well, showing dynamic workspace member count on workspace dropdown * refractor: running parallel request, made create/edit label function to async function * fix: sidebar dropdown content going below kanban items outside click detection in need help dropdown * refractor: making parallel api calls fix: create state input comes at bottom, create state input gets on focus automatically, form is getting submitted on enter click * refactoring file structure and signin page * style: changed text and added spinner for signing in loading * refractor: removed unused type * fix: my issue cta in profile page sending to 404 page * fix: added new s3 bucket url in next.config.js file increased image modal height * packaging UI components * eslint config * eslint fixes * refactoring changes * build fixes * minor fixes * adding todo comments for reference * refactor: cleared unused imports and re ordered imports * refactor: removed unused imports * fix: added workspace argument to useissues hook * refactor: removed api-routes file, unnecessary constants * refactor: created helpers folder, removed unnecessary constants * refactor: new context for issue view * refactoring issues page * build fixes * refactoring * refactor: create issue modal * refactor: module ui * fix: sub-issues mutation * fix: create more option in create issue modal * description form debounce issue * refactor: global component for assignees list * fix: link module interface * fix: priority icons and sub-issues count added * fix: cycle mutation in issue details page * fix: remove issue from cycle mutation * fix: create issue modal in home page * fix: removed unnecessary props * fix: updated create issue form status * fix: settings auth breaking * refactor: issue details page Co-authored-by: Dakshesh Jain <dakshesh.jain14@gmail.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: venkatesh-soulpage <venkatesh.marreboyina@soulpageit.com> Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia1001@gmail.com>
126 lines
3.3 KiB
TypeScript
126 lines
3.3 KiB
TypeScript
import { useContext } from "react";
|
|
|
|
import { useRouter } from "next/router";
|
|
|
|
import useSWR from "swr";
|
|
|
|
// services
|
|
import stateService from "services/state.service";
|
|
// contexts
|
|
import { issueViewContext } from "contexts/issue-view.context";
|
|
// helpers
|
|
import { groupBy, orderArrayBy } from "helpers/array.helper";
|
|
// types
|
|
import { IIssue } from "types";
|
|
// fetch-keys
|
|
import { STATE_LIST } from "constants/fetch-keys";
|
|
// constants
|
|
import { PRIORITIES } from "constants/";
|
|
|
|
const useIssueView = (projectIssues: IIssue[]) => {
|
|
const {
|
|
issueView,
|
|
groupByProperty,
|
|
setGroupByProperty,
|
|
orderBy,
|
|
setOrderBy,
|
|
filterIssue,
|
|
setFilterIssue,
|
|
resetFilterToDefault,
|
|
setNewFilterDefaultView,
|
|
setIssueViewToKanban,
|
|
setIssueViewToList,
|
|
} = useContext(issueViewContext);
|
|
|
|
const router = useRouter();
|
|
const { workspaceSlug, projectId } = router.query;
|
|
|
|
const { data: states } = useSWR(
|
|
workspaceSlug && projectId ? STATE_LIST(projectId as string) : null,
|
|
workspaceSlug && projectId
|
|
? () => stateService.getStates(workspaceSlug as string, projectId as string)
|
|
: null
|
|
);
|
|
|
|
let groupedByIssues: {
|
|
[key: string]: IIssue[];
|
|
} = {
|
|
...(groupByProperty === "state_detail.name"
|
|
? Object.fromEntries(
|
|
states
|
|
?.sort((a, b) => a.sequence - b.sequence)
|
|
?.map((state) => [
|
|
state.name,
|
|
projectIssues.filter((issue) => issue.state === state.name) ?? [],
|
|
]) ?? []
|
|
)
|
|
: groupByProperty === "priority"
|
|
? Object.fromEntries(
|
|
PRIORITIES.map((priority) => [
|
|
priority,
|
|
projectIssues.filter((issue) => issue.priority === priority) ?? [],
|
|
])
|
|
)
|
|
: {}),
|
|
...groupBy(projectIssues ?? [], groupByProperty ?? ""),
|
|
};
|
|
|
|
if (orderBy) {
|
|
groupedByIssues = Object.fromEntries(
|
|
Object.entries(groupedByIssues).map(([key, value]) => [
|
|
key,
|
|
orderArrayBy(value, orderBy, "descending"),
|
|
])
|
|
);
|
|
}
|
|
|
|
if (filterIssue !== null) {
|
|
if (filterIssue === "activeIssue") {
|
|
const filteredStates = states?.filter(
|
|
(state) => state.group === "started" || state.group === "unstarted"
|
|
);
|
|
groupedByIssues = Object.fromEntries(
|
|
filteredStates
|
|
?.sort((a, b) => a.sequence - b.sequence)
|
|
?.map((state) => [
|
|
state.name,
|
|
projectIssues.filter((issue) => issue.state === state.id) ?? [],
|
|
]) ?? []
|
|
);
|
|
} else if (filterIssue === "backlogIssue") {
|
|
const filteredStates = states?.filter(
|
|
(state) => state.group === "backlog" || state.group === "cancelled"
|
|
);
|
|
groupedByIssues = Object.fromEntries(
|
|
filteredStates
|
|
?.sort((a, b) => a.sequence - b.sequence)
|
|
?.map((state) => [
|
|
state.name,
|
|
projectIssues.filter((issue) => issue.state === state.id) ?? [],
|
|
]) ?? []
|
|
);
|
|
}
|
|
}
|
|
|
|
if (groupByProperty === "priority" && orderBy === "priority") {
|
|
setOrderBy(null);
|
|
}
|
|
|
|
return {
|
|
groupedByIssues,
|
|
issueView,
|
|
groupByProperty,
|
|
setGroupByProperty,
|
|
orderBy,
|
|
setOrderBy,
|
|
filterIssue,
|
|
setFilterIssue,
|
|
resetFilterToDefault,
|
|
setNewFilterDefaultView,
|
|
setIssueViewToKanban,
|
|
setIssueViewToList,
|
|
} as const;
|
|
};
|
|
|
|
export default useIssueView;
|