From c3cc04777a69227a456afe43d397cb899fdb9ec1 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:10:29 +0530 Subject: [PATCH] refactor: migrate web progress indicators to @makeplane/propel (#9698) * refactor: migrate web progress indicators to @makeplane/propel * style: fix comboButton indentation in dropdowns * fix: scale cycle and module progress rings to 30px --- .../cycles/active-cycle/progress.tsx | 22 +++++++----- .../cycles/list/cycles-list-item.tsx | 26 +++++++++----- .../attachment-list-upload-item.tsx | 4 +-- .../attachment/attachment-upload-details.tsx | 4 +-- .../issue-detail-widgets/sub-issues/title.tsx | 10 ++++-- .../components/modules/module-card-item.tsx | 27 ++++++--------- .../components/modules/module-list-item.tsx | 34 ++++++++++++------- 7 files changed, 77 insertions(+), 50 deletions(-) diff --git a/apps/web/core/components/cycles/active-cycle/progress.tsx b/apps/web/core/components/cycles/active-cycle/progress.tsx index 4688e9dc5b..d5d402c4ac 100644 --- a/apps/web/core/components/cycles/active-cycle/progress.tsx +++ b/apps/web/core/components/cycles/active-cycle/progress.tsx @@ -10,8 +10,9 @@ import { useTheme } from "next-themes"; import { PROGRESS_STATE_GROUPS_DETAILS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import type { TWorkItemFilterCondition } from "@plane/shared-state"; +import { LinearProgress } from "@makeplane/propel/components/linear-progress"; import type { ICycle } from "@plane/types"; -import { LinearProgressIndicator, Loader } from "@plane/ui"; +import { Loader } from "@plane/ui"; // assets import darkProgressAsset from "@/app/assets/empty-state/active-cycle/progress-dark.webp?url"; import lightProgressAsset from "@/app/assets/empty-state/active-cycle/progress-light.webp?url"; @@ -32,12 +33,9 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: // plane hooks const { t } = useTranslation(); // derived values - const progressIndicatorData = PROGRESS_STATE_GROUPS_DETAILS.map((group, index) => ({ - id: index, - name: group.title, - value: cycle && cycle.total_issues > 0 ? (cycle[group.key as keyof ICycle] as number) : 0, - color: group.color, - })); + const closedIssues = cycle ? cycle.completed_issues + cycle.cancelled_issues : 0; + const closableIssues = cycle ? cycle.total_issues - cycle.cancelled_issues : 0; + const progressValue = closableIssues > 0 ? (closedIssues / closableIssues) * 100 : 0; const groupedIssues: any = cycle ? { completed: cycle?.completed_issues, @@ -61,7 +59,15 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: )} - {cycle.total_issues > 0 && } + {cycle.total_issues > 0 && ( + + )} {cycle.total_issues > 0 ? ( diff --git a/apps/web/core/components/cycles/list/cycles-list-item.tsx b/apps/web/core/components/cycles/list/cycles-list-item.tsx index c0b25f3647..1b28d95e1d 100644 --- a/apps/web/core/components/cycles/list/cycles-list-item.tsx +++ b/apps/web/core/components/cycles/list/cycles-list-item.tsx @@ -8,10 +8,10 @@ import type { MouseEvent } from "react"; import { useRef } from "react"; import { observer } from "mobx-react"; import { usePathname, useSearchParams } from "next/navigation"; +import { CircularProgress } from "@makeplane/propel/components/circular-progress"; import { CheckIcon } from "@plane/propel/icons"; // plane imports import type { TCycleGroups } from "@plane/types"; -import { CircularProgressIndicator } from "@plane/ui"; // components import { generateQueryParams, calculateCycleProgress } from "@plane/utils"; import { ListItem } from "@/components/core/list"; @@ -86,13 +86,23 @@ export const CyclesListItem = observer(function CyclesListItem(props: TCyclesLis onItemClick={handleItemClick} className={className} prependTitleElement={ - - {progress === 100 ? ( - - ) : ( - {`${progress}%`} - )} - +
+
+ +
+
+ {progress === 100 ? ( + + ) : ( + {`${progress}%`} + )} +
+
} actionableItems={
- +
{uploadStatus.progress}% done
diff --git a/apps/web/core/components/issues/attachment/attachment-upload-details.tsx b/apps/web/core/components/issues/attachment/attachment-upload-details.tsx index d86bfe4cea..348a5327a6 100644 --- a/apps/web/core/components/issues/attachment/attachment-upload-details.tsx +++ b/apps/web/core/components/issues/attachment/attachment-upload-details.tsx @@ -5,8 +5,8 @@ */ import { observer } from "mobx-react"; +import { CircularProgress } from "@makeplane/propel/components/circular-progress"; import { Tooltip } from "@plane/propel/tooltip"; -import { CircularProgressIndicator } from "@plane/ui"; import { getFileExtension, truncateText } from "@plane/utils"; // ui // icons @@ -49,7 +49,7 @@ export const IssueAttachmentsUploadDetails = observer(function IssueAttachmentsU
- +
{uploadStatus.progress}% done
diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/title.tsx b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/title.tsx index 10beb87889..8fd205b5f9 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/title.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/title.tsx @@ -6,10 +6,11 @@ import { observer } from "mobx-react"; // plane imports +import { CircularProgress } from "@makeplane/propel/components/circular-progress"; import { useTranslation } from "@plane/i18n"; import type { TIssueServiceType } from "@plane/types"; import { EIssueServiceType } from "@plane/types"; -import { CircularProgressIndicator, CollapsibleButton } from "@plane/ui"; +import { CollapsibleButton } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { SubWorkItemTitleActions } from "./title-actions"; @@ -48,7 +49,12 @@ export const SubIssuesCollapsibleTitle = observer(function SubIssuesCollapsibleT title={`${issueServiceType === EIssueServiceType.EPICS ? t("issue.label", { count: 1 }) : t("common.sub_work_items")}`} indicatorElement={
- + {completedCount}/{totalCount} {t("common.done")} diff --git a/apps/web/core/components/modules/module-card-item.tsx b/apps/web/core/components/modules/module-card-item.tsx index 177bbcf585..b4526f6746 100644 --- a/apps/web/core/components/modules/module-card-item.tsx +++ b/apps/web/core/components/modules/module-card-item.tsx @@ -11,19 +11,14 @@ import Link from "next/link"; import { useParams, usePathname, useSearchParams } from "next/navigation"; import { Info, SquareUser } from "lucide-react"; // plane package imports -import { - MODULE_STATUS, - PROGRESS_STATE_GROUPS_DETAILS, - EUserPermissions, - EUserPermissionsLevel, - IS_FAVORITE_MENU_OPEN, -} from "@plane/constants"; +import { MODULE_STATUS, EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; +import { LinearProgress } from "@makeplane/propel/components/linear-progress"; import { WorkItemsIcon } from "@plane/propel/icons"; import { TOAST_TYPE, setPromiseToast, setToast } from "@plane/propel/toast"; import { Tooltip } from "@plane/propel/tooltip"; import type { IModule } from "@plane/types"; -import { Card, FavoriteStar, LinearProgressIndicator } from "@plane/ui"; +import { Card, FavoriteStar } from "@plane/ui"; import { getDate, renderFormattedPayloadDate, generateQueryParams } from "@plane/utils"; // components import { DateRangeDropdown } from "@/components/dropdowns/date-range"; @@ -175,13 +170,7 @@ export const ModuleCardItem = observer(function ModuleCardItem(props: Props) { : `0 work items`; const moduleLeadDetails = moduleDetails.lead_id ? getUserDetails(moduleDetails.lead_id) : undefined; - - const progressIndicatorData = PROGRESS_STATE_GROUPS_DETAILS.map((group, index) => ({ - id: index, - name: group.title, - value: moduleTotalIssues > 0 ? (moduleDetails[group.key as keyof IModule] as number) : 0, - color: group.color, - })); + const progressValue = moduleTotalIssues > 0 ? (moduleCompletedIssues / moduleTotalIssues) * 100 : 0; return (
@@ -222,7 +211,13 @@ export const ModuleCardItem = observer(function ModuleCardItem(props: Props) { )}
- +
- {completedModuleCheck ? ( - progress === 100 ? ( +
+
+ +
+
+ {completedModuleCheck ? ( + progress === 100 ? ( + + ) : ( + {`!`} + ) + ) : progress === 100 ? ( ) : ( - {`!`} - ) - ) : progress === 100 ? ( - - ) : ( - {`${progress}%`} - )} - + {`${progress}%`} + )} +
+
} appendTitleElement={