From c2327fa5387a0334f30f6db86913caac67ea27c4 Mon Sep 17 00:00:00 2001 From: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:09:38 +0530 Subject: [PATCH] feat: show sub-issue on list-view (#1665) --- .../core/filters/issues-view-filter.tsx | 9 ++++ apps/app/constants/fetch-keys.ts | 3 +- apps/app/contexts/issue-view.context.tsx | 52 ++++++++++++++++++- apps/app/hooks/use-issues-view.tsx | 5 ++ 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/apps/app/components/core/filters/issues-view-filter.tsx b/apps/app/components/core/filters/issues-view-filter.tsx index d1a6281b1..f8df21792 100644 --- a/apps/app/components/core/filters/issues-view-filter.tsx +++ b/apps/app/components/core/filters/issues-view-filter.tsx @@ -65,6 +65,8 @@ export const IssuesFilterView: React.FC = () => { orderBy, setOrderBy, showEmptyGroups, + showSubIssues, + setShowSubIssues, setShowEmptyGroups, filters, setFilters, @@ -246,6 +248,13 @@ export const IssuesFilterView: React.FC = () => { {issueView !== "calendar" && issueView !== "spreadsheet" && ( <> +
+

Show sub-issues

+ setShowSubIssues(!showSubIssues)} + /> +

Show empty states

{ const type = params.type ? params.type.toUpperCase() : "NULL"; const groupBy = params.group_by ? params.group_by.toUpperCase() : "NULL"; const orderBy = params.order_by ? params.order_by.toUpperCase() : "NULL"; - const subIssue = sub_issue ? sub_issue.toUpperCase() : "NULL"; // sorting each keys in ascending order stateKey = stateKey.sort().join("_"); @@ -21,7 +20,7 @@ const paramsToKey = (params: any) => { createdByKey = createdByKey.sort().join("_"); labelsKey = labelsKey.sort().join("_"); - return `${stateKey}_${priorityKey}_${assigneesKey}_${createdByKey}_${type}_${groupBy}_${orderBy}_${labelsKey}_${targetDateKey}_${subIssue}`; + return `${stateKey}_${priorityKey}_${assigneesKey}_${createdByKey}_${type}_${groupBy}_${orderBy}_${labelsKey}_${targetDateKey}_${sub_issue}`; }; const inboxParamsToKey = (params: any) => { diff --git a/apps/app/contexts/issue-view.context.tsx b/apps/app/contexts/issue-view.context.tsx index 454023d54..8399b8558 100644 --- a/apps/app/contexts/issue-view.context.tsx +++ b/apps/app/contexts/issue-view.context.tsx @@ -36,6 +36,7 @@ type IssueViewProps = { groupByProperty: TIssueGroupByOptions; orderBy: TIssueOrderByOptions; showEmptyGroups: boolean; + showSubIssues: boolean; calendarDateRange: string; filters: IIssueFilterOptions; }; @@ -49,7 +50,8 @@ type ReducerActionType = { | "SET_CALENDAR_DATE_RANGE" | "SET_FILTERS" | "SET_GROUP_BY_PROPERTY" - | "RESET_TO_DEFAULT"; + | "RESET_TO_DEFAULT" + | "SET_SHOW_SUB_ISSUES"; payload?: Partial; }; @@ -57,6 +59,7 @@ type ContextType = IssueViewProps & { setGroupByProperty: (property: TIssueGroupByOptions) => void; setOrderBy: (property: TIssueOrderByOptions) => void; setShowEmptyGroups: (property: boolean) => void; + setShowSubIssues: (value: boolean) => void; setCalendarDateRange: (property: string) => void; setFilters: (filters: Partial, saveToServer?: boolean) => void; resetFilterToDefault: () => void; @@ -69,6 +72,7 @@ type StateType = { groupByProperty: TIssueGroupByOptions; orderBy: TIssueOrderByOptions; showEmptyGroups: boolean; + showSubIssues: boolean; calendarDateRange: string; filters: IIssueFilterOptions; }; @@ -79,6 +83,7 @@ export const initialState: StateType = { groupByProperty: null, orderBy: "-created_at", showEmptyGroups: true, + showSubIssues: false, calendarDateRange: "", filters: { type: null, @@ -152,6 +157,18 @@ export const reducer: ReducerFunctionType = (state, action) => { }; } + case "SET_SHOW_SUB_ISSUES": { + const newState = { + ...state, + showSubIssues: payload?.showSubIssues || false, + }; + + return { + ...state, + ...newState, + }; + } + case "SET_CALENDAR_DATE_RANGE": { const newState = { ...state, @@ -466,6 +483,37 @@ export const IssueViewContextProvider: React.FC<{ children: React.ReactNode }> = [projectId, workspaceSlug, state, mutateMyViewProps] ); + const setShowSubIssues = useCallback( + (property: boolean) => { + dispatch({ + type: "SET_SHOW_SUB_ISSUES", + payload: { + showSubIssues: property, + }, + }); + + if (!workspaceSlug || !projectId) return; + + mutateMyViewProps((prevData) => { + if (!prevData) return prevData; + + return { + ...prevData, + view_props: { + ...state, + showSubIssues: property, + }, + }; + }, false); + + saveDataToServer(workspaceSlug as string, projectId as string, { + ...state, + showSubIssues: property, + }); + }, + [projectId, workspaceSlug, state, mutateMyViewProps] + ); + const setCalendarDateRange = useCallback( (value: string) => { dispatch({ @@ -683,10 +731,12 @@ export const IssueViewContextProvider: React.FC<{ children: React.ReactNode }> = setGroupByProperty, orderBy: state.orderBy, showEmptyGroups: state.showEmptyGroups, + showSubIssues: state.showSubIssues, calendarDateRange: state.calendarDateRange, setCalendarDateRange, setOrderBy, setShowEmptyGroups, + setShowSubIssues, filters: state.filters, setFilters, resetFilterToDefault: resetToDefault, diff --git a/apps/app/hooks/use-issues-view.tsx b/apps/app/hooks/use-issues-view.tsx index 667499a01..1e5a2e555 100644 --- a/apps/app/hooks/use-issues-view.tsx +++ b/apps/app/hooks/use-issues-view.tsx @@ -33,7 +33,9 @@ const useIssuesView = () => { orderBy, setOrderBy, showEmptyGroups, + showSubIssues, setShowEmptyGroups, + setShowSubIssues, calendarDateRange, setCalendarDateRange, filters, @@ -63,6 +65,7 @@ const useIssuesView = () => { : undefined, created_by: filters?.created_by ? filters?.created_by.join(",") : undefined, target_date: filters?.target_date ? filters?.target_date.join(",") : undefined, + sub_issue: showSubIssues, }; const { data: projectIssues } = useSWR( @@ -195,7 +198,9 @@ const useIssuesView = () => { orderBy, setOrderBy, showEmptyGroups: isArchivedIssues ? false : showEmptyGroups, + showSubIssues, setShowEmptyGroups, + setShowSubIssues, calendarDateRange, setCalendarDateRange, filters,