From db510dcfcdd51ef9c9facc11226abc805ddb40ba Mon Sep 17 00:00:00 2001 From: rahulramesha <71900764+rahulramesha@users.noreply.github.com> Date: Tue, 28 Nov 2023 18:15:46 +0530 Subject: [PATCH] fix: all functionalities for profile, archived and draft issues (#2922) * fix profile issue filters and kanban * fix profile draft and archived issues --- .../roots/profile-issues-root.tsx | 3 +- web/components/profile/profile-issues.tsx | 19 ++++---- web/store/issues/global/filter.store.ts | 46 +++++++++++-------- web/store/issues/profile/filter.store.ts | 44 ++++++++++-------- web/store/issues/profile/issue.store.ts | 30 ++++++------ .../project-issues/archived/issue.store.ts | 26 +++++++++-- 6 files changed, 104 insertions(+), 64 deletions(-) diff --git a/web/components/issues/issue-layouts/filters/applied-filters/roots/profile-issues-root.tsx b/web/components/issues/issue-layouts/filters/applied-filters/roots/profile-issues-root.tsx index 80354b749..89870d98a 100644 --- a/web/components/issues/issue-layouts/filters/applied-filters/roots/profile-issues-root.tsx +++ b/web/components/issues/issue-layouts/filters/applied-filters/roots/profile-issues-root.tsx @@ -18,6 +18,7 @@ export const ProfileIssuesAppliedFiltersRoot: React.FC = observer(() => { const { workspace: { workspaceLabels }, workspaceProfileIssuesFilter: { issueFilters, updateFilters }, + projectMember: { projectMembers }, } = useMobxStore(); const userFilters = issueFilters?.filters; @@ -64,7 +65,7 @@ export const ProfileIssuesAppliedFiltersRoot: React.FC = observer(() => { handleClearAllFilters={handleClearAllFilters} handleRemoveFilter={handleRemoveFilter} labels={workspaceLabels ?? []} - members={[]} + members={projectMembers?.map((m) => m.member)} states={[]} /> diff --git a/web/components/profile/profile-issues.tsx b/web/components/profile/profile-issues.tsx index e63f5714d..11974caaa 100644 --- a/web/components/profile/profile-issues.tsx +++ b/web/components/profile/profile-issues.tsx @@ -1,12 +1,8 @@ -import React, { ReactElement } from "react"; +import React from "react"; import { useRouter } from "next/router"; import useSWR from "swr"; import { observer } from "mobx-react-lite"; -// layouts -import { AppLayout } from "layouts/app-layout"; -import { ProfileAuthWrapper } from "layouts/user-profile-layout"; // components -import { UserProfileHeader } from "components/headers"; import { ProfileIssuesListLayout } from "components/issues/issue-layouts/list/roots/profile-issues-root"; import { ProfileIssuesKanBanLayout } from "components/issues/issue-layouts/kanban/roots/profile-issues-root"; import { ProfileIssuesAppliedFiltersRoot } from "components/issues"; @@ -31,12 +27,15 @@ export const ProfileIssuesPage = observer((props: IProfileIssuesPage) => { workspaceProfileIssuesFilter: { issueFilters, fetchFilters }, }: RootStore = useMobxStore(); - useSWR(workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}` : null, async () => { - if (workspaceSlug && userId) { - await fetchFilters(workspaceSlug); - await fetchIssues(workspaceSlug, userId, getIssues ? "mutation" : "init-loader", props.type); + useSWR( + workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}_${props.type}` : null, + async () => { + if (workspaceSlug && userId) { + await fetchFilters(workspaceSlug); + await fetchIssues(workspaceSlug, userId, getIssues ? "mutation" : "init-loader", props.type); + } } - }); + ); const activeLayout = issueFilters?.displayFilters?.layout || undefined; diff --git a/web/store/issues/global/filter.store.ts b/web/store/issues/global/filter.store.ts index a2304f36d..81d661972 100644 --- a/web/store/issues/global/filter.store.ts +++ b/web/store/issues/global/filter.store.ts @@ -5,6 +5,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption import { EFilterType } from "store/issues/types"; import { handleIssueQueryParamsByLayout } from "helpers/issue.helper"; import { IssueFilterBaseStore } from "../project-issues/base-issue-filter.store"; +import { isEmpty } from "lodash"; interface IProjectIssuesFiltersOptions { filters: IIssueFilterOptions; @@ -121,12 +122,18 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl let _projectIssueFilters = this.projectIssueFilters; if (!_projectIssueFilters) _projectIssueFilters = {}; - if (!_projectIssueFilters[workspaceSlug]) - _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} }; - _projectIssueFilters[workspaceSlug] = { - ..._projectIssueFilters[workspaceSlug], - ...issueFilters, - }; + if (!_projectIssueFilters[workspaceSlug]) { + _projectIssueFilters[workspaceSlug] = { displayProperties: {} } as IProjectIssuesDisplayOptions; + } + if ( + isEmpty(_projectIssueFilters[workspaceSlug].filters) || + isEmpty(_projectIssueFilters[workspaceSlug].displayFilters) + ) { + _projectIssueFilters[workspaceSlug] = { + ..._projectIssueFilters[workspaceSlug], + ...issueFilters, + }; + } runInAction(() => { this.projectIssueFilters = _projectIssueFilters; @@ -192,15 +199,15 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl fetchDisplayProperties = async (workspaceSlug: string) => { try { const displayProperties: IIssueDisplayProperties = { - assignee: false, - start_date: false, - due_date: false, + assignee: true, + start_date: true, + due_date: true, labels: false, key: false, - priority: false, + priority: true, state: false, - sub_issue_count: false, - link: false, + sub_issue_count: true, + link: true, attachment_count: false, estimate: false, created_on: false, @@ -209,12 +216,15 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl let _projectIssueFilters = { ...this.projectIssueFilters }; if (!_projectIssueFilters) _projectIssueFilters = {}; - if (!_projectIssueFilters[workspaceSlug]) - _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} }; - _projectIssueFilters[workspaceSlug] = { - ..._projectIssueFilters[workspaceSlug], - displayProperties: displayProperties, - }; + if (!_projectIssueFilters[workspaceSlug]) { + _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {} } as IProjectIssuesDisplayOptions; + } + if (isEmpty(_projectIssueFilters[workspaceSlug].displayProperties)) { + _projectIssueFilters[workspaceSlug] = { + ..._projectIssueFilters[workspaceSlug], + displayProperties: displayProperties, + }; + } runInAction(() => { this.projectIssueFilters = _projectIssueFilters; diff --git a/web/store/issues/profile/filter.store.ts b/web/store/issues/profile/filter.store.ts index 3fb82d9e5..771368a78 100644 --- a/web/store/issues/profile/filter.store.ts +++ b/web/store/issues/profile/filter.store.ts @@ -5,6 +5,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption import { EFilterType } from "store/issues/types"; import { handleIssueQueryParamsByLayout } from "helpers/issue.helper"; import { IssueFilterBaseStore } from "../project-issues/base-issue-filter.store"; +import isEmpty from "lodash/isEmpty"; interface IProjectIssuesFiltersOptions { filters: IIssueFilterOptions; @@ -121,12 +122,18 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP let _projectIssueFilters = this.projectIssueFilters; if (!_projectIssueFilters) _projectIssueFilters = {}; - if (!_projectIssueFilters[workspaceSlug]) - _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} }; - _projectIssueFilters[workspaceSlug] = { - ..._projectIssueFilters[workspaceSlug], - ...issueFilters, - }; + if (!_projectIssueFilters[workspaceSlug]) { + _projectIssueFilters[workspaceSlug] = { displayProperties: {} } as IProjectIssuesDisplayOptions; + } + if ( + isEmpty(_projectIssueFilters[workspaceSlug].filters) || + isEmpty(_projectIssueFilters[workspaceSlug].displayFilters) + ) { + _projectIssueFilters[workspaceSlug] = { + ..._projectIssueFilters[workspaceSlug], + ...issueFilters, + }; + } runInAction(() => { this.projectIssueFilters = _projectIssueFilters; @@ -184,7 +191,6 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP return _filters; } catch (error) { - this.fetchDisplayFilters(workspaceSlug); throw error; } }; @@ -192,12 +198,12 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP fetchDisplayProperties = async (workspaceSlug: string) => { try { const displayProperties: IIssueDisplayProperties = { - assignee: false, + assignee: true, start_date: false, due_date: false, - labels: false, - key: false, - priority: false, + labels: true, + key: true, + priority: true, state: false, sub_issue_count: false, link: false, @@ -209,12 +215,15 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP let _projectIssueFilters = { ...this.projectIssueFilters }; if (!_projectIssueFilters) _projectIssueFilters = {}; - if (!_projectIssueFilters[workspaceSlug]) - _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} }; - _projectIssueFilters[workspaceSlug] = { - ..._projectIssueFilters[workspaceSlug], - displayProperties: displayProperties, - }; + if (!_projectIssueFilters[workspaceSlug]) { + _projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {} } as IProjectIssuesDisplayOptions; + } + if (isEmpty(_projectIssueFilters[workspaceSlug].displayProperties)) { + _projectIssueFilters[workspaceSlug] = { + ..._projectIssueFilters[workspaceSlug], + displayProperties: displayProperties, + }; + } runInAction(() => { this.projectIssueFilters = _projectIssueFilters; @@ -242,7 +251,6 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP return properties; } catch (error) { - this.fetchDisplayProperties(workspaceSlug); throw error; } }; diff --git a/web/store/issues/profile/issue.store.ts b/web/store/issues/profile/issue.store.ts index 72f2e79aa..727f7f623 100644 --- a/web/store/issues/profile/issue.store.ts +++ b/web/store/issues/profile/issue.store.ts @@ -19,7 +19,7 @@ export interface IProfileIssuesStore { loader: TLoader; issues: { [user_id: string]: IProfileIssueTabTypes } | undefined; currentUserId: string | null; - currentUserIssueTab: "assigned" | "created" | "subscribed" | null; + currentUserIssueTab: "assigned" | "created" | "subscribed" | undefined; // computed getIssues: IIssueResponse | undefined; getIssuesIds: IGroupedIssues | ISubGroupedIssues | TUnGroupedIssues | undefined; @@ -52,7 +52,7 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues loader: TLoader = "init-loader"; issues: { [user_id: string]: IProfileIssueTabTypes } | undefined = undefined; currentUserId: string | null = null; - currentUserIssueTab: "assigned" | "created" | "subscribed" | null = null; + currentUserIssueTab: "assigned" | "created" | "subscribed" | undefined = undefined; // root store rootStore; // service @@ -87,7 +87,9 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues if (!workspaceSlug || !this.currentUserId || !this.currentUserIssueTab) return; const userFilters = this.rootStore?.workspaceProfileIssuesFilter?.issueFilters?.filters; - if (userFilters) this.fetchIssues(workspaceSlug, this.currentUserId, "mutation", this.currentUserIssueTab); + if (userFilters) { + this.fetchIssues(workspaceSlug, this.currentUserId, "mutation", this.currentUserIssueTab); + } }); } @@ -103,6 +105,7 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues const displayFilters = this.rootStore?.workspaceProfileIssuesFilter?.issueFilters?.displayFilters; if (!displayFilters) return undefined; + const subGroupBy = displayFilters?.sub_group_by; const groupBy = displayFilters?.group_by; const orderBy = displayFilters?.order_by; const layout = displayFilters?.layout; @@ -114,6 +117,15 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues if (layout === "list" && orderBy) { if (groupBy) issues = this.groupedIssues(groupBy, orderBy, this.issues[currentUserId][this.currentUserIssueTab]); else issues = this.unGroupedIssues(orderBy, this.issues[currentUserId][this.currentUserIssueTab]); + } else if (layout === "kanban" && groupBy && orderBy) { + if (subGroupBy) + issues = this.subGroupedIssues( + subGroupBy, + groupBy, + orderBy, + this.issues[currentUserId][this.currentUserIssueTab] + ); + else issues = this.groupedIssues(groupBy, orderBy, this.issues[currentUserId][this.currentUserIssueTab]); } return issues; @@ -188,20 +200,12 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues createIssue = async (workspaceSlug: string, userId: string, data: Partial) => { try { const projectId = data.project; - const moduleId = data.module_id; - const cycleId = data.cycle_id; if (!projectId) return; let response = {} as IIssue; response = await this.rootStore.projectIssues.createIssue(workspaceSlug, projectId, data); - // if (moduleId) - // response = await this.rootStore.moduleIssues.addIssueToModule(workspaceSlug, projectId, moduleId, response); - - // if (cycleId) - // response = await this.rootStore.cycleIssues.addIssueToCycle(workspaceSlug, projectId, cycleId, response); - let _issues = this.issues; if (!_issues) _issues = {}; if (!_issues[userId]) _issues[userId] = { assigned: {}, created: {}, subscribed: {} }; @@ -229,8 +233,8 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues let _issues = { ...this.issues }; if (!_issues) _issues = {}; if (!_issues[userId]) _issues[userId] = { assigned: {}, created: {}, subscribed: {} }; - _issues[projectId][this.currentUserIssueTab][userId] = { - ..._issues[projectId][this.currentUserIssueTab][userId], + _issues[userId][this.currentUserIssueTab][userId] = { + ..._issues[userId][this.currentUserIssueTab][userId], ...data, }; diff --git a/web/store/issues/project-issues/archived/issue.store.ts b/web/store/issues/project-issues/archived/issue.store.ts index a2fa7bd37..6e1abab8e 100644 --- a/web/store/issues/project-issues/archived/issue.store.ts +++ b/web/store/issues/project-issues/archived/issue.store.ts @@ -119,8 +119,17 @@ export class ProjectArchivedIssuesStore extends IssueBaseStore implements IProje removeIssue = async (workspaceSlug: string, projectId: string, issueId: string) => { try { - await this.archivedIssueService.unarchiveIssue(workspaceSlug, projectId, issueId); - return; + let _issues = { ...this.issues }; + if (!_issues) _issues = {}; + if (!_issues[projectId]) _issues[projectId] = {}; + delete _issues?.[projectId]?.[issueId]; + + runInAction(() => { + this.issues = _issues; + }); + + const response = await this.archivedIssueService.deleteArchivedIssue(workspaceSlug, projectId, issueId); + return response; } catch (error) { throw error; } @@ -128,8 +137,17 @@ export class ProjectArchivedIssuesStore extends IssueBaseStore implements IProje removeIssueFromArchived = async (workspaceSlug: string, projectId: string, issueId: string) => { try { - await this.archivedIssueService.deleteArchivedIssue(workspaceSlug, projectId, issueId); - return; + let _issues = { ...this.issues }; + if (!_issues) _issues = {}; + if (!_issues[projectId]) _issues[projectId] = {}; + delete _issues?.[projectId]?.[issueId]; + + runInAction(() => { + this.issues = _issues; + }); + + const response = await this.archivedIssueService.unarchiveIssue(workspaceSlug, projectId, issueId); + return response; } catch (error) { throw error; }