diff --git a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx index fe2b2eee1c..a2d58064b1 100644 --- a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -199,21 +199,24 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas }); }; - const handleKanbanFilters = (toggle: "group_by" | "sub_group_by", value: string) => { - if (workspaceSlug) { - let kanbanFilters = issuesFilter?.issueFilters?.kanbanFilters?.[toggle] || []; - if (kanbanFilters.includes(value)) { - kanbanFilters = kanbanFilters.filter((_value) => _value != value); - } else { - kanbanFilters.push(value); + const handleCollapsedGroups = useCallback( + (toggle: "group_by" | "sub_group_by", value: string) => { + if (workspaceSlug) { + let collapsedGroups = issuesFilter?.issueFilters?.kanbanFilters?.[toggle] || []; + if (collapsedGroups.includes(value)) { + collapsedGroups = collapsedGroups.filter((_value) => _value != value); + } else { + collapsedGroups.push(value); + } + updateFilters(projectId?.toString() ?? "", EIssueFilterType.KANBAN_FILTERS, { + [toggle]: collapsedGroups, + }); } - updateFilters(projectId?.toString() ?? "", EIssueFilterType.KANBAN_FILTERS, { - [toggle]: kanbanFilters, - }); - } - }; + }, + [workspaceSlug, issuesFilter, projectId, updateFilters] + ); - const kanbanFilters = issuesFilter?.issueFilters?.kanbanFilters || { group_by: [], sub_group_by: [] }; + const collapsedGroups = issuesFilter?.issueFilters?.kanbanFilters || { group_by: [], sub_group_by: [] }; return ( @@ -258,8 +261,8 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas orderBy={orderBy} updateIssue={updateIssue} quickActions={renderQuickActions} - handleKanbanFilters={handleKanbanFilters} - kanbanFilters={kanbanFilters} + handleCollapsedGroups={handleCollapsedGroups} + collapsedGroups={collapsedGroups} enableQuickIssueCreate={enableQuickAdd} showEmptyGroup={userDisplayFilters?.show_empty_groups ?? true} quickAddCallback={quickAddIssue} diff --git a/web/core/components/issues/issue-layouts/kanban/default.tsx b/web/core/components/issues/issue-layouts/kanban/default.tsx index 37897d602c..d1144995c8 100644 --- a/web/core/components/issues/issue-layouts/kanban/default.tsx +++ b/web/core/components/issues/issue-layouts/kanban/default.tsx @@ -46,8 +46,8 @@ export interface IKanBan { sub_group_index?: number; updateIssue: ((projectId: string | null, issueId: string, data: Partial) => Promise) | undefined; quickActions: TRenderQuickActions; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: any; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; loadMoreIssues: (groupId?: string, subGroupId?: string) => void; enableQuickIssueCreate?: boolean; quickAddCallback?: (projectId: string | null | undefined, data: TIssue) => Promise; @@ -71,8 +71,8 @@ export const KanBan: React.FC = observer((props) => { sub_group_id = "null", updateIssue, quickActions, - kanbanFilters, - handleKanbanFilters, + collapsedGroups, + handleCollapsedGroups, enableQuickIssueCreate, quickAddCallback, loadMoreIssues, @@ -133,7 +133,7 @@ export const KanBan: React.FC = observer((props) => { if ((getGroupIssueCount(_list.id, undefined, false) ?? 0) > 0) groupVisibility.showGroup = true; else groupVisibility.showGroup = false; } - if (kanbanFilters?.group_by.includes(_list.id)) groupVisibility.showIssues = false; + if (collapsedGroups?.group_by.includes(_list.id)) groupVisibility.showIssues = false; return groupVisibility; } }; @@ -176,8 +176,8 @@ export const KanBan: React.FC = observer((props) => { issuePayload={subList.payload} disableIssueCreation={disableIssueCreation || isGroupByCreatedBy} addIssuesToView={addIssuesToView} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} /> )} diff --git a/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx b/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx index 209c4c2715..b09b881e4e 100644 --- a/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx +++ b/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx @@ -24,8 +24,8 @@ interface IHeaderGroupByCard { icon?: React.ReactNode; title: string; count: number; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: any; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; issuePayload: Partial; disableIssueCreation?: boolean; addIssuesToView?: (issueIds: string[]) => Promise; @@ -38,13 +38,13 @@ export const HeaderGroupByCard: FC = observer((props) => { icon, title, count, - kanbanFilters, - handleKanbanFilters, + collapsedGroups, + handleCollapsedGroups, issuePayload, disableIssueCreation, addIssuesToView, } = props; - const verticalAlignPosition = sub_group_by ? false : kanbanFilters?.group_by.includes(column_id); + const verticalAlignPosition = sub_group_by ? false : collapsedGroups?.group_by.includes(column_id); // states const [isOpen, setIsOpen] = React.useState(false); const [openExistingIssueListModal, setOpenExistingIssueListModal] = React.useState(false); @@ -133,7 +133,7 @@ export const HeaderGroupByCard: FC = observer((props) => { {sub_group_by === null && (
handleKanbanFilters("group_by", column_id)} + onClick={() => handleCollapsedGroups("group_by", column_id)} > {verticalAlignPosition ? ( diff --git a/web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx b/web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx index d3f7405cb0..2c558ba5e5 100644 --- a/web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx +++ b/web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx @@ -9,19 +9,19 @@ interface IHeaderSubGroupByCard { title: string; count: number; column_id: string; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; } export const HeaderSubGroupByCard: FC = observer((props) => { - const { icon, title, count, column_id, kanbanFilters, handleKanbanFilters } = props; + const { icon, title, count, column_id, collapsedGroups, handleCollapsedGroups } = props; return (
handleKanbanFilters("sub_group_by", column_id)} + onClick={() => handleCollapsedGroups("sub_group_by", column_id)} >
- {kanbanFilters?.sub_group_by.includes(column_id) ? ( + {collapsedGroups?.sub_group_by.includes(column_id) ? ( ) : ( diff --git a/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx b/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx index 28ffa271c1..555d3ff92d 100644 --- a/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx +++ b/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx @@ -35,8 +35,8 @@ interface ISubGroupSwimlaneHeader { sub_group_by: TIssueGroupByOptions | undefined; group_by: TIssueGroupByOptions | undefined; list: IGroupByColumn[]; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; showEmptyGroup: boolean; } @@ -53,7 +53,7 @@ const visibilitySubGroupByGroupCount = (subGroupIssueCount: number, showEmptyGro }; const SubGroupSwimlaneHeader: React.FC = observer( - ({ getGroupIssueCount, sub_group_by, group_by, list, kanbanFilters, handleKanbanFilters, showEmptyGroup }) => ( + ({ getGroupIssueCount, sub_group_by, group_by, list, collapsedGroups, handleCollapsedGroups, showEmptyGroup }) => (
{list && list.length > 0 && @@ -73,8 +73,8 @@ const SubGroupSwimlaneHeader: React.FC = observer( icon={_list.icon} title={_list.name} count={groupCount} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} issuePayload={_list.payload} />
@@ -96,8 +96,8 @@ interface ISubGroupSwimlane extends ISubGroupSwimlaneHeader { displayProperties: IIssueDisplayProperties | undefined; updateIssue: ((projectId: string | null, issueId: string, data: Partial) => Promise) | undefined; quickActions: TRenderQuickActions; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; handleOnDrop: (source: GroupDropLocation, destination: GroupDropLocation) => Promise; disableIssueCreation?: boolean; enableQuickIssueCreate: boolean; @@ -120,8 +120,8 @@ const SubGroupSwimlane: React.FC = observer((props) => { updateIssue, quickActions, displayProperties, - kanbanFilters, - handleKanbanFilters, + collapsedGroups, + handleCollapsedGroups, loadMoreIssues, showEmptyGroup, enableQuickIssueCreate, @@ -147,7 +147,7 @@ const SubGroupSwimlane: React.FC = observer((props) => { if (subGroupCount > 0) subGroupVisibility.showGroup = true; else subGroupVisibility.showGroup = false; } - if (kanbanFilters?.sub_group_by.includes(_list.id)) subGroupVisibility.showIssues = false; + if (collapsedGroups?.sub_group_by.includes(_list.id)) subGroupVisibility.showIssues = false; return subGroupVisibility; }; @@ -168,8 +168,8 @@ const SubGroupSwimlane: React.FC = observer((props) => { icon={_list.icon} title={_list.name || ""} count={issueCount} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} />
@@ -187,8 +187,8 @@ const SubGroupSwimlane: React.FC = observer((props) => { subGroupIndex={subGroupIndex} updateIssue={updateIssue} quickActions={quickActions} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} showEmptyGroup={showEmptyGroup} enableQuickIssueCreate={enableQuickIssueCreate} disableIssueCreation={disableIssueCreation} @@ -224,8 +224,8 @@ export interface IKanBanSwimLanes { group_by: TIssueGroupByOptions | undefined; updateIssue: ((projectId: string | null, issueId: string, data: Partial) => Promise) | undefined; quickActions: TRenderQuickActions; - kanbanFilters: TIssueKanbanFilters; - handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; + collapsedGroups: TIssueKanbanFilters; + handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void; loadMoreIssues: (groupId?: string, subGroupId?: string) => void; showEmptyGroup: boolean; handleOnDrop: (source: GroupDropLocation, destination: GroupDropLocation) => Promise; @@ -249,8 +249,8 @@ export const KanBanSwimLanes: React.FC = observer((props) => { orderBy, updateIssue, quickActions, - kanbanFilters, - handleKanbanFilters, + collapsedGroups, + handleCollapsedGroups, loadMoreIssues, showEmptyGroup, handleOnDrop, @@ -303,8 +303,8 @@ export const KanBanSwimLanes: React.FC = observer((props) => { getGroupIssueCount={getGroupIssueCount} group_by={group_by} sub_group_by={sub_group_by} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} list={groupByList} showEmptyGroup={showEmptyGroup} /> @@ -322,8 +322,8 @@ export const KanBanSwimLanes: React.FC = observer((props) => { orderBy={orderBy} updateIssue={updateIssue} quickActions={quickActions} - kanbanFilters={kanbanFilters} - handleKanbanFilters={handleKanbanFilters} + collapsedGroups={collapsedGroups} + handleCollapsedGroups={handleCollapsedGroups} loadMoreIssues={loadMoreIssues} showEmptyGroup={showEmptyGroup} handleOnDrop={handleOnDrop} diff --git a/web/core/components/issues/issue-layouts/list/base-list-root.tsx b/web/core/components/issues/issue-layouts/list/base-list-root.tsx index 1d1098ac56..a97ad0a8e0 100644 --- a/web/core/components/issues/issue-layouts/list/base-list-root.tsx +++ b/web/core/components/issues/issue-layouts/list/base-list-root.tsx @@ -1,9 +1,10 @@ import { FC, useCallback, useEffect } from "react"; import { observer } from "mobx-react"; // types -import { GroupByColumnTypes, TGroupedIssues } from "@plane/types"; +import { useParams } from "next/navigation"; +import { GroupByColumnTypes, TGroupedIssues, TIssueKanbanFilters } from "@plane/types"; // constants -import { EIssueLayoutTypes, EIssuesStoreType } from "@/constants/issue"; +import { EIssueFilterType, EIssueLayoutTypes, EIssuesStoreType } from "@/constants/issue"; // hooks import { useIssues, useUserPermissions } from "@/hooks/store"; // hooks @@ -59,6 +60,10 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { const group_by = (displayFilters?.group_by || null) as GroupByColumnTypes | null; const showEmptyGroup = displayFilters?.show_empty_groups ?? false; + const { workspaceSlug, projectId } = useParams(); + const {updateFilters} = useIssuesActions(storeType); + const collapsedGroups = issuesFilter?.issueFilters?.kanbanFilters || { group_by: [], sub_group_by: [] } as TIssueKanbanFilters; + useEffect(() => { fetchIssues("init-loader", { canGroup: true, perPageCount: group_by ? 50 : 100 }, viewId); }, [fetchIssues, storeType, group_by, viewId]); @@ -107,6 +112,25 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { [fetchNextIssues] ); + // kanbanFilters and EIssueFilterType.KANBAN_FILTERS are used becuase the state is shared between kanban view and list view + const handleCollapsedGroups = useCallback( + (value: string) => { + if (workspaceSlug) { + let collapsedGroups = issuesFilter?.issueFilters?.kanbanFilters?.group_by || []; + if (collapsedGroups.includes(value)) { + collapsedGroups = collapsedGroups.filter((_value) => _value != value); + } else { + collapsedGroups.push(value); + } + updateFilters(projectId?.toString() ?? "", EIssueFilterType.KANBAN_FILTERS, + { group_by: collapsedGroups } as TIssueKanbanFilters + ); + } + }, + [workspaceSlug, issuesFilter, projectId, updateFilters] + ); + + return (
@@ -127,6 +151,8 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { addIssuesToView={addIssuesToView} isCompletedCycle={isCompletedCycle} handleOnDrop={handleOnDrop} + handleCollapsedGroups={handleCollapsedGroups} + collapsedGroups={collapsedGroups} />
diff --git a/web/core/components/issues/issue-layouts/list/default.tsx b/web/core/components/issues/issue-layouts/list/default.tsx index a8fd66a862..befa1f8fdb 100644 --- a/web/core/components/issues/issue-layouts/list/default.tsx +++ b/web/core/components/issues/issue-layouts/list/default.tsx @@ -14,6 +14,7 @@ import { TIssueGroupByOptions, TIssueOrderByOptions, IGroupByColumn, + TIssueKanbanFilters, } from "@plane/types"; // components import { MultipleSelectGroup } from "@/components/core"; @@ -47,6 +48,8 @@ export interface IList { addIssuesToView?: (issueIds: string[]) => Promise; isCompletedCycle?: boolean; loadMoreIssues: (groupId?: string) => void; + handleCollapsedGroups: (value: string) => void; + collapsedGroups : TIssueKanbanFilters; } export const List: React.FC = observer((props) => { @@ -67,6 +70,8 @@ export const List: React.FC = observer((props) => { addIssuesToView, isCompletedCycle = false, loadMoreIssues, + handleCollapsedGroups, + collapsedGroups } = props; const storeType = useIssueStoreType(); @@ -162,6 +167,8 @@ export const List: React.FC = observer((props) => { loadMoreIssues={loadMoreIssues} containerRef={containerRef} selectionHelpers={helpers} + handleCollapsedGroups={handleCollapsedGroups} + collapsedGroups={collapsedGroups} /> ))}
diff --git a/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx b/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx index 03a768e413..83e428fbed 100644 --- a/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx +++ b/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx @@ -26,10 +26,10 @@ interface IHeaderGroupByCard { count: number; issuePayload: Partial; canEditProperties: (projectId: string | undefined) => boolean; - toggleListGroup: () => void; disableIssueCreation?: boolean; addIssuesToView?: (issueIds: string[]) => Promise; selectionHelpers: TSelectionHelper; + handleCollapsedGroups: (value: string) => void; } export const HeaderGroupByCard = observer((props: IHeaderGroupByCard) => { @@ -43,7 +43,7 @@ export const HeaderGroupByCard = observer((props: IHeaderGroupByCard) => { disableIssueCreation, addIssuesToView, selectionHelpers, - toggleListGroup, + handleCollapsedGroups } = props; // states const [isOpen, setIsOpen] = useState(false); @@ -108,7 +108,7 @@ export const HeaderGroupByCard = observer((props: IHeaderGroupByCard) => {
handleCollapsedGroups(groupID)} >
{title}
{count || 0}
diff --git a/web/core/components/issues/issue-layouts/list/list-group.tsx b/web/core/components/issues/issue-layouts/list/list-group.tsx index b39cfa35b0..7bf0dc553c 100644 --- a/web/core/components/issues/issue-layouts/list/list-group.tsx +++ b/web/core/components/issues/issue-layouts/list/list-group.tsx @@ -14,6 +14,7 @@ import { TIssueOrderByOptions, TIssue, IIssueDisplayProperties, + TIssueKanbanFilters, } from "@plane/types"; import { Row, setToast, TOAST_TYPE } from "@plane/ui"; // components @@ -60,6 +61,8 @@ interface Props { showEmptyGroup?: boolean; loadMoreIssues: (groupId?: string) => void; selectionHelpers: TSelectionHelper; + handleCollapsedGroups: (value: string) => void; + collapsedGroups: TIssueKanbanFilters; } export const ListGroup = observer((props: Props) => { @@ -84,11 +87,13 @@ export const ListGroup = observer((props: Props) => { showEmptyGroup, loadMoreIssues, selectionHelpers, + handleCollapsedGroups, + collapsedGroups, } = props; const [isDraggingOverColumn, setIsDraggingOverColumn] = useState(false); const [dragColumnOrientation, setDragColumnOrientation] = useState<"justify-start" | "justify-end">("justify-start"); - const [isExpanded, setIsExpanded] = useState(true); + const isExpanded = !(collapsedGroups?.group_by.includes(group.id)) const groupRef = useRef(null); const { projectId } = useParams(); @@ -129,10 +134,6 @@ export const ListGroup = observer((props: Props) => { return true; }; - const toggleListGroup = () => { - setIsExpanded((prevState) => !prevState); - }; - const prePopulateQuickAddData = (groupByKey: string | null, value: any) => { const defaultState = projectState.projectStates?.find((state) => state.default); let preloadedData: object = { state_id: defaultState?.id }; @@ -213,6 +214,10 @@ export const ListGroup = observer((props: Props) => { handleOnDrop(source, destination); highlightIssueOnDrop(getIssueBlockId(source.id, destination?.groupId), orderBy !== "sort_order"); + + if(!isExpanded){ + handleCollapsedGroups(group.id) + } }, }) ); @@ -248,7 +253,7 @@ export const ListGroup = observer((props: Props) => { disableIssueCreation={disableIssueCreation || isGroupByCreatedBy || isCompletedCycle} addIssuesToView={addIssuesToView} selectionHelpers={selectionHelpers} - toggleListGroup={toggleListGroup} + handleCollapsedGroups={handleCollapsedGroups} /> {shouldExpand && ( diff --git a/web/core/store/issue/archived/filter.store.ts b/web/core/store/issue/archived/filter.store.ts index fb6c19247b..31f5f4496a 100644 --- a/web/core/store/issue/archived/filter.store.ts +++ b/web/core/store/issue/archived/filter.store.ts @@ -254,7 +254,7 @@ export class ArchivedIssuesFilter extends IssueFilterHelperStore implements IArc const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, projectId, undefined, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.ARCHIVED, type, workspaceSlug, projectId, undefined, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/cycle/filter.store.ts b/web/core/store/issue/cycle/filter.store.ts index d8073bd52c..3565a05c06 100644 --- a/web/core/store/issue/cycle/filter.store.ts +++ b/web/core/store/issue/cycle/filter.store.ts @@ -278,7 +278,7 @@ export class CycleIssuesFilter extends IssueFilterHelperStore implements ICycleI const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, cycleId, currentUserId, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.CYCLE, type, workspaceSlug, cycleId, currentUserId, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/draft/filter.store.ts b/web/core/store/issue/draft/filter.store.ts index 9ab480b6cf..0c65754383 100644 --- a/web/core/store/issue/draft/filter.store.ts +++ b/web/core/store/issue/draft/filter.store.ts @@ -250,7 +250,7 @@ export class DraftIssuesFilter extends IssueFilterHelperStore implements IDraftI const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, projectId, undefined, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.DRAFT, type, workspaceSlug, projectId, undefined, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/helpers/issue-filter-helper.store.ts b/web/core/store/issue/helpers/issue-filter-helper.store.ts index 1f77863b6a..5d4b638a53 100644 --- a/web/core/store/issue/helpers/issue-filter-helper.store.ts +++ b/web/core/store/issue/helpers/issue-filter-helper.store.ts @@ -248,7 +248,7 @@ export class IssueFilterHelperStore implements IIssueFilterHelperStore { [filterType]: filters[filterType], }, }; - + // All group_by "filters" are stored in a single array, will cause inconsistency in case of duplicated values storage.set("issue_local_filters", JSON.stringify(storageFilters)); }, }; diff --git a/web/core/store/issue/module/filter.store.ts b/web/core/store/issue/module/filter.store.ts index 3b9ca78c47..1830619cd9 100644 --- a/web/core/store/issue/module/filter.store.ts +++ b/web/core/store/issue/module/filter.store.ts @@ -281,7 +281,7 @@ export class ModuleIssuesFilter extends IssueFilterHelperStore implements IModul const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, moduleId, currentUserId, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.MODULE, type, workspaceSlug, moduleId, currentUserId, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/profile/filter.store.ts b/web/core/store/issue/profile/filter.store.ts index 5bbbb88f69..edd5073d3f 100644 --- a/web/core/store/issue/profile/filter.store.ts +++ b/web/core/store/issue/profile/filter.store.ts @@ -252,7 +252,7 @@ export class ProfileIssuesFilter extends IssueFilterHelperStore implements IProf const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, userId, undefined, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.PROFILE, type, workspaceSlug, userId, undefined, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/project-views/filter.store.ts b/web/core/store/issue/project-views/filter.store.ts index 18f19fb2f2..4261b1bece 100644 --- a/web/core/store/issue/project-views/filter.store.ts +++ b/web/core/store/issue/project-views/filter.store.ts @@ -264,7 +264,7 @@ export class ProjectViewIssuesFilter extends IssueFilterHelperStore implements I const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, viewId, currentUserId, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT_VIEW, type, workspaceSlug, viewId, currentUserId, { kanban_filters: _filters.kanbanFilters, }); diff --git a/web/core/store/issue/workspace/filter.store.ts b/web/core/store/issue/workspace/filter.store.ts index 3fd5da1b6c..e062147c61 100644 --- a/web/core/store/issue/workspace/filter.store.ts +++ b/web/core/store/issue/workspace/filter.store.ts @@ -285,7 +285,7 @@ export class WorkspaceIssuesFilter extends IssueFilterHelperStore implements IWo const currentUserId = this.rootIssueStore.currentUserId; if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.PROJECT, type, workspaceSlug, undefined, viewId, { + this.handleIssuesLocalFilters.set(EIssuesStoreType.GLOBAL, type, workspaceSlug, undefined, viewId, { kanban_filters: _filters.kanbanFilters, });