From 42240fc4f7f4dda38c78a45b0fee615da9e16398 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Fri, 10 Jan 2025 17:09:55 +0530 Subject: [PATCH 1/6] chore: added pending issues count --- apiserver/plane/app/views/cycle/base.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index f30f498265f..806fb61ca4d 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -132,6 +132,18 @@ def get_queryset(self): ), ) ) + .annotate( + pending_issues=Count( + "issue_cycle__issue__id", + distinct=True, + filter=Q( + issue_cycle__issue__state__group__in=["backlog", "unstarted", "started"], + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + issue_cycle__deleted_at__isnull=True, + ), + ) + ) .annotate( status=Case( When( @@ -214,6 +226,7 @@ def list(self, request, slug, project_id): "is_favorite", "total_issues", "completed_issues", + "pending_issues", "assignee_ids", "status", "version", From 1f51b24d2e3e759303a059b2dca360700efe43b9 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Fri, 10 Jan 2025 17:11:16 +0530 Subject: [PATCH 2/6] chore: added pending issues count --- apiserver/plane/app/views/cycle/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index 806fb61ca4d..3b2985f18c5 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -258,6 +258,7 @@ def list(self, request, slug, project_id): # meta fields "is_favorite", "total_issues", + "pending_issues", "completed_issues", "assignee_ids", "status", From 78f964346b16c12a8d24a35f5fa519272cd33680 Mon Sep 17 00:00:00 2001 From: Vamsi krishna Date: Fri, 10 Jan 2025 18:04:35 +0530 Subject: [PATCH 3/6] fix: transfer issues count fixed --- packages/types/src/cycle/cycle.d.ts | 5 ++--- web/ce/components/cycles/end-cycle/modal.tsx | 2 +- web/core/components/cycles/list/cycle-list-item-action.tsx | 5 ++--- web/core/components/cycles/quick-actions.tsx | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/types/src/cycle/cycle.d.ts b/packages/types/src/cycle/cycle.d.ts index 1c2fa273aa9..ee3de40a304 100644 --- a/packages/types/src/cycle/cycle.d.ts +++ b/packages/types/src/cycle/cycle.d.ts @@ -58,6 +58,7 @@ export type TCycleProgress = { export type TProgressSnapshot = { total_issues: number; + pending_issues: number; completed_issues: number; backlog_issues: number; started_issues: number; @@ -120,9 +121,7 @@ export interface CycleIssueResponse { sub_issues_count: number; } -export type SelectCycleType = - | (ICycle & { actionType: "edit" | "delete" | "create-issue" }) - | undefined; +export type SelectCycleType = (ICycle & { actionType: "edit" | "delete" | "create-issue" }) | undefined; export type CycleDateCheckData = { start_date: string; diff --git a/web/ce/components/cycles/end-cycle/modal.tsx b/web/ce/components/cycles/end-cycle/modal.tsx index de66c1a9cbd..62ba16ac733 100644 --- a/web/ce/components/cycles/end-cycle/modal.tsx +++ b/web/ce/components/cycles/end-cycle/modal.tsx @@ -6,7 +6,7 @@ interface Props { cycleId: string; projectId: string; workspaceSlug: string; - transferrableIssuesCount: number; + pendingIssues: number; } export const EndCycleModal: React.FC = () => <>; diff --git a/web/core/components/cycles/list/cycle-list-item-action.tsx b/web/core/components/cycles/list/cycle-list-item-action.tsx index 2fa3d4fd346..ca9fefd4682 100644 --- a/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -81,8 +81,7 @@ export const CycleListItemAction: FC = observer((props) => { // derived values const cycleStatus = cycleDetails.status ? (cycleDetails.status.toLocaleLowerCase() as TCycleGroups) : "draft"; const showIssueCount = useMemo(() => cycleStatus === "draft" || cycleStatus === "upcoming", [cycleStatus]); - const transferableIssuesCount = cycleDetails ? cycleDetails.total_issues - cycleDetails.completed_issues : 0; - const showTransferIssues = transferableIssuesCount > 0 && cycleStatus === "completed"; + const showTransferIssues = cycleDetails.pending_issues > 0 && cycleStatus === "completed"; const isEditingAllowed = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], EUserPermissionsLevel.PROJECT, @@ -254,7 +253,7 @@ export const CycleListItemAction: FC = observer((props) => { }} > - Transfer {transferableIssuesCount} issues + Transfer {cycleDetails.pending_issues} issues )} diff --git a/web/core/components/cycles/quick-actions.tsx b/web/core/components/cycles/quick-actions.tsx index b72d7b7bd61..8f96c217831 100644 --- a/web/core/components/cycles/quick-actions.tsx +++ b/web/core/components/cycles/quick-actions.tsx @@ -176,7 +176,7 @@ export const CycleQuickActions: React.FC = observer((props) => { cycleId={cycleId} projectId={projectId} workspaceSlug={workspaceSlug} - transferrableIssuesCount={transferableIssuesCount} + pendingIssues={cycleDetails.pending_issues} /> )} From ff0a22a7cabda02303fdc60c6d79f52f32d1973d Mon Sep 17 00:00:00 2001 From: Vamsi krishna Date: Fri, 10 Jan 2025 18:28:19 +0530 Subject: [PATCH 4/6] chore: removed dead code --- web/core/components/cycles/quick-actions.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/web/core/components/cycles/quick-actions.tsx b/web/core/components/cycles/quick-actions.tsx index 8f96c217831..405f22676c3 100644 --- a/web/core/components/cycles/quick-actions.tsx +++ b/web/core/components/cycles/quick-actions.tsx @@ -42,7 +42,6 @@ export const CycleQuickActions: React.FC = observer((props) => { const isArchived = !!cycleDetails?.archived_at; const isCompleted = cycleDetails?.status?.toLowerCase() === "completed"; const isCurrentCycle = cycleDetails?.status?.toLowerCase() === "current"; - const transferableIssuesCount = cycleDetails ? cycleDetails.total_issues - cycleDetails.completed_issues : 0; // auth const isEditingAllowed = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], From 2d77b39c17876a437e9d252ce5cf4fbecfe9c33f Mon Sep 17 00:00:00 2001 From: Vamsi krishna Date: Mon, 13 Jan 2025 10:14:14 +0530 Subject: [PATCH 5/6] fix: pending issues store update --- web/core/store/issue/cycle/issue.store.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/core/store/issue/cycle/issue.store.ts b/web/core/store/issue/cycle/issue.store.ts index 87f5a92127e..1f2f02f1306 100644 --- a/web/core/store/issue/cycle/issue.store.ts +++ b/web/core/store/issue/cycle/issue.store.ts @@ -308,6 +308,14 @@ export class CycleIssues extends BaseIssuesStore implements ICycleIssues { cycleId as string, payload ); + // update pending count + runInAction(() => { + if (this.rootIssueStore.cycleMap) + set(this.rootIssueStore.cycleMap[cycleId], "pending_issues", { + ...this.rootIssueStore.cycleMap[cycleId], + pending_issues: 0, + }); + }); // call fetch issues if (this.paginationOptions) { await persistence.syncIssues(projectId.toString()); From 78fcadb14652c0ca851b778c8c40b69cd546236a Mon Sep 17 00:00:00 2001 From: Vamsi krishna Date: Mon, 13 Jan 2025 10:29:53 +0530 Subject: [PATCH 6/6] chore: store update refactor --- web/core/store/issue/cycle/issue.store.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/web/core/store/issue/cycle/issue.store.ts b/web/core/store/issue/cycle/issue.store.ts index 1f2f02f1306..6fa9dc70846 100644 --- a/web/core/store/issue/cycle/issue.store.ts +++ b/web/core/store/issue/cycle/issue.store.ts @@ -309,13 +309,13 @@ export class CycleIssues extends BaseIssuesStore implements ICycleIssues { payload ); // update pending count - runInAction(() => { - if (this.rootIssueStore.cycleMap) - set(this.rootIssueStore.cycleMap[cycleId], "pending_issues", { - ...this.rootIssueStore.cycleMap[cycleId], - pending_issues: 0, - }); - }); + try { + const cycleMap = this.rootIssueStore.cycleMap; + if (!cycleMap?.[cycleId]) return; + set(cycleMap, [cycleId, "pending_issues"], 0); + } catch (error) { + console.error("Failed to update pending issues count:", error); + } // call fetch issues if (this.paginationOptions) { await persistence.syncIssues(projectId.toString());