From 5c3d09fd7fd6daadf80e14ed3956f8fa9b9100af Mon Sep 17 00:00:00 2001 From: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:20:46 +0530 Subject: [PATCH] [WEB-4554]fix: initiative epics stats (#3730) --- .../api/plane/ee/views/app/initiative/base.py | 26 +++++++++++++++++++ .../details/main/progress-section-root.tsx | 8 +++--- .../details/main/scope-breakdown.tsx | 11 +++++--- apps/web/ee/types/initiative/initiative.d.ts | 10 ++++++- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/apps/api/plane/ee/views/app/initiative/base.py b/apps/api/plane/ee/views/app/initiative/base.py index eff00d5780..3c0b65abdd 100644 --- a/apps/api/plane/ee/views/app/initiative/base.py +++ b/apps/api/plane/ee/views/app/initiative/base.py @@ -401,6 +401,25 @@ class InitiativeAnalyticsEndpoint(BaseAPIView): "cancelled", ] }, + # Total issue count + **{ + f"total_{state}_issues": Count( + "id", + filter=Q( + Q(project_id__in=project_ids) + | Q(id__in=initiative_epics) + | Q(id__in=related_issues_ids), + ) + & Q(state__group=state), + ) + for state in [ + "backlog", + "unstarted", + "started", + "completed", + "cancelled", + ] + }, ) return issues_counts @@ -506,6 +525,13 @@ class InitiativeAnalyticsEndpoint(BaseAPIView): "completed_issues": issues_counts.get("completed_issues", 0), "cancelled_issues": issues_counts.get("cancelled_issues", 0), }, + "total_count": { + "backlog_issues": issues_counts.get("total_backlog_issues", 0), + "unstarted_issues": issues_counts.get("total_unstarted_issues", 0), + "started_issues": issues_counts.get("total_started_issues", 0), + "completed_issues": issues_counts.get("total_completed_issues", 0), + "cancelled_issues": issues_counts.get("total_cancelled_issues", 0), + }, } return Response( diff --git a/apps/web/ee/components/initiatives/details/main/progress-section-root.tsx b/apps/web/ee/components/initiatives/details/main/progress-section-root.tsx index 058af1525e..2612bc8ef4 100644 --- a/apps/web/ee/components/initiatives/details/main/progress-section-root.tsx +++ b/apps/web/ee/components/initiatives/details/main/progress-section-root.tsx @@ -22,13 +22,11 @@ export const InitiativeProgressSection: FC = observer((props) => { // derived values const initiative = getInitiativeById(initiativeId); - const initiativeProjectAnalytics = getInitiativeAnalyticsById(initiativeId)?.project; + const cumulatedAnalytics = getInitiativeAnalyticsById(initiativeId)?.total_count; const projectsIds = initiative?.project_ids ?? []; const initiativeEpics = initiative?.epic_ids ?? []; - const totalIssues = initiativeProjectAnalytics - ? Object.values(omit(initiativeProjectAnalytics, "overdue_issues")).reduce((acc, val) => acc + val, 0) - : 0; + const totalIssues = Object.values(cumulatedAnalytics ?? {}).reduce((acc, val) => acc + val, 0); const shouldRenderProgressSection = (projectsIds.length ?? 0) > 0 || initiativeEpics.length > 0 || totalIssues > 0; @@ -36,7 +34,7 @@ export const InitiativeProgressSection: FC = observer((props) => { return ( { const { workspaceSlug, initiativeId, toggleProjectModal, toggleEpicModal, disabled } = props; const { - initiative: { getInitiativeAnalyticsById, getInitiativeById }, + initiative: { + getInitiativeAnalyticsById, + getInitiativeById, + epics: { getInitiativeEpicsById }, + }, } = useInitiatives(); // derived values const initiativeAnalytics = getInitiativeAnalyticsById(initiativeId); const initiative = getInitiativeById(initiativeId); + const initiativeEpics = getInitiativeEpicsById(initiativeId); - const epicsCount = initiative?.epic_ids?.length ?? 0; + const epicsCount = initiativeEpics?.length ?? 0; const projectsCount = initiative?.project_ids?.length ?? 0; return ( @@ -119,7 +124,7 @@ export const ScopeBreakdown = observer((props: Props) => { {/* content */} - {!projectsCount && !epicsCount ? ( + {projectsCount === 0 && epicsCount === 0 ? (