diff --git a/frontend/src/component/project/Project/ProjectStatus/LifecycleMessages.ts b/frontend/src/component/project/Project/ProjectStatus/LifecycleMessages.ts new file mode 100644 index 000000000000..3641cca2ffdb --- /dev/null +++ b/frontend/src/component/project/Project/ProjectStatus/LifecycleMessages.ts @@ -0,0 +1,16 @@ +import type { ProjectStatusSchemaLifecycleSummary } from 'openapi'; + +export const lifecycleMessages: Record< + keyof ProjectStatusSchemaLifecycleSummary, + string +> = { + initial: + 'Feature flags in the initial phase indicate you have created flags that is not detected in any environments which mean either integration issues or unused flags', + preLive: + 'In the pre-live phase the feature is being developed and tested in controlled environments. Once the feature is ready the flag can be enabled in production.', + live: 'The feature is being rolled out in production according to the decided strategy targeting user segments and/or using percentage rollout. ', + completed: + 'Flags that are in cleanup are potentially stale flags. View the flags to evaluate whether you should archive them in Unleash and clean up your codebase to reduce technical debt', + archived: + 'Flags that have been archived and are no longer in use, but kept for future reference.', +}; diff --git a/frontend/src/component/project/Project/ProjectStatus/ProjectLifecycleSummary.tsx b/frontend/src/component/project/Project/ProjectStatus/ProjectLifecycleSummary.tsx index 89a122a0530d..a872ace6b448 100644 --- a/frontend/src/component/project/Project/ProjectStatus/ProjectLifecycleSummary.tsx +++ b/frontend/src/component/project/Project/ProjectStatus/ProjectLifecycleSummary.tsx @@ -1,9 +1,9 @@ -import { styled } from '@mui/material'; +import { CardActionArea, styled } from '@mui/material'; import { FeatureLifecycleStageIcon } from 'component/feature/FeatureView/FeatureOverview/FeatureLifecycle/FeatureLifecycleStageIcon'; import { useProjectStatus } from 'hooks/api/getters/useProjectStatus/useProjectStatus'; import useLoading from 'hooks/useLoading'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; -import type { FC } from 'react'; +import { useState, type FC } from 'react'; import { PrettifyLargeNumber } from 'component/common/PrettifyLargeNumber/PrettifyLargeNumber'; import type { ProjectStatusSchemaLifecycleSummary } from 'openapi'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; @@ -24,16 +24,45 @@ const HeaderRow = styled('div')(({ theme }) => ({ }, })); -const LifecycleBox = styled('li')(({ theme }) => ({ +const LifecycleBoxContent = styled('div')(({ theme }) => ({ padding: theme.spacing(2), - borderRadius: theme.shape.borderRadiusExtraLarge, - border: `2px solid ${theme.palette.divider}`, gap: theme.spacing(4), display: 'flex', flexFlow: 'column', justifyContent: 'space-between', + transition: 'border-color 200ms', + borderRadius: theme.shape.borderRadiusExtraLarge, + border: `2px solid ${theme.palette.divider}`, })); +const StyledCardActionArea = styled(CardActionArea)(({ theme }) => ({ + borderRadius: theme.shape.borderRadiusExtraLarge, + '&[aria-pressed="true"] > *': { + borderColor: theme.palette.primary.main, + }, +})); + +const LifecycleBox = ({ + children, + isActive, + onClick, +}: { + children: React.ReactNode; + isActive?: boolean; + onClick?: () => void; +}) => { + return ( +
  • + + {children} + +
  • + ); +}; + const LifecycleList = styled('ul')(({ theme }) => ({ display: 'grid', listStyle: 'none', @@ -144,6 +173,9 @@ export const ProjectLifecycleSummary = () => { const { data, loading } = useProjectStatus(projectId); const { isEnterprise } = useUiConfig(); + const [activeLifecycleStage, setActiveLifecycleStage] = useState< + keyof ProjectStatusSchemaLifecycleSummary | null + >(null); const loadingRef = useLoading( loading, '[data-loading-project-lifecycle-summary=true]', @@ -162,7 +194,10 @@ export const ProjectLifecycleSummary = () => { - + setActiveLifecycleStage('initial')} + isActive={activeLifecycleStage === 'initial'} + >

    { averageDays={data?.lifecycleSummary.initial.averageDays} /> - + setActiveLifecycleStage('preLive')} + isActive={activeLifecycleStage === 'preLive'} + >

    { averageDays={data?.lifecycleSummary.preLive.averageDays} /> - + setActiveLifecycleStage('live')} + isActive={activeLifecycleStage === 'live'} + >

    { averageDays={data?.lifecycleSummary.live.averageDays} /> - + setActiveLifecycleStage('completed')} + isActive={activeLifecycleStage === 'completed'} + >

    { } /> - + setActiveLifecycleStage('archived')} + isActive={activeLifecycleStage === 'archived'} + >