From a2a8c060031225a8e0619a6f62c0e8e967dc834c Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Wed, 16 Apr 2025 15:47:35 +0200 Subject: [PATCH] feat: archive reminder (#9779) --- .../CleanupReminder/CleanupReminder.test.tsx | 18 ++++-- .../CleanupReminder/CleanupReminder.tsx | 59 ++++++++++++++++--- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.test.tsx b/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.test.tsx index d5a94edec8..9fd43374e5 100644 --- a/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.test.tsx +++ b/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.test.tsx @@ -3,7 +3,10 @@ import { CleanupReminder } from './CleanupReminder'; import { render } from 'utils/testRenderer'; import type { IFeatureToggle } from 'interfaces/featureToggle'; import { screen } from '@testing-library/react'; -import { UPDATE_FEATURE } from '../../../providers/AccessProvider/permissions'; +import { + DELETE_FEATURE, + UPDATE_FEATURE, +} from '../../../providers/AccessProvider/permissions'; const currentTime = '2024-04-25T08:05:00.000Z'; const monthAgo = '2024-03-25T06:05:00.000Z'; @@ -26,7 +29,8 @@ test('render complete feature reminder', async () => { await screen.findByText('31 days'); button.click(); - await screen.findByText('Cancel'); + const cancel = await screen.findByText('Cancel'); + cancel.click(); }); test('render remove flag from code reminder', async () => { @@ -61,11 +65,17 @@ test('render archive flag reminder', async () => { type: 'release', lifecycle: { stage: 'completed', enteredStageAt: monthAgo }, environments: [{ name: 'prod', type: 'production', enabled: true }], + children: ['child1'], } as IFeatureToggle; render( {}} />, { - permissions: [{ permission: UPDATE_FEATURE }], + permissions: [{ permission: DELETE_FEATURE }], }); - await screen.findByText('Time to clean up technical debt?'); + const button = await screen.findByText('Archive flag'); + button.click(); + + await screen.findByText('child1'); + const okButton = await screen.findByText('OK'); + okButton.click(); }); diff --git a/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.tsx b/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.tsx index 67af14440b..7b358d3e07 100644 --- a/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.tsx +++ b/frontend/src/component/feature/FeatureView/CleanupReminder/CleanupReminder.tsx @@ -5,11 +5,17 @@ import { parseISO } from 'date-fns'; import differenceInDays from 'date-fns/differenceInDays'; import PermissionButton from 'component/common/PermissionButton/PermissionButton'; -import { UPDATE_FEATURE } from '../../../providers/AccessProvider/permissions'; +import { + DELETE_FEATURE, + UPDATE_FEATURE, +} from '../../../providers/AccessProvider/permissions'; import { MarkCompletedDialogue } from '../FeatureOverview/FeatureLifecycle/MarkCompletedDialogue'; import { populateCurrentStage } from '../FeatureOverview/FeatureLifecycle/populateCurrentStage'; import { isSafeToArchive } from '../FeatureOverview/FeatureLifecycle/isSafeToArchive'; import type { IFeatureToggle } from 'interfaces/featureToggle'; +import { FeatureArchiveNotAllowedDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveNotAllowedDialog'; +import { FeatureArchiveDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveDialog'; +import { useNavigate } from 'react-router-dom'; const StyledBox = styled(Box)(({ theme }) => ({ marginRight: theme.spacing(2), @@ -22,8 +28,11 @@ export const CleanupReminder: FC<{ feature: IFeatureToggle; onChange: () => void; }> = ({ feature, onChange }) => { + const navigate = useNavigate(); + const [markCompleteDialogueOpen, setMarkCompleteDialogueOpen] = useState(false); + const [archiveDialogueOpen, setArchiveDialogueOpen] = useState(false); const currentStage = populateCurrentStage(feature); const isRelevantType = @@ -94,13 +103,47 @@ export const CleanupReminder: FC<{ )} {reminder === 'archive' && ( - - Time to clean up technical debt? -

- We haven't observed any metrics for this flag lately. - Can it be archived? -

-
+ <> + setArchiveDialogueOpen(true)} + projectId={feature.project} + > + Archive flag + + } + > + Time to clean up technical debt? +

+ We haven't observed any metrics for this flag + lately. Can it be archived? +

+
+ {feature.children.length > 0 ? ( + setArchiveDialogueOpen(false)} + /> + ) : ( + { + navigate(`/projects/${feature.project}`); + }} + onClose={() => setArchiveDialogueOpen(false)} + projectId={feature.project} + featureIds={[feature.name]} + /> + )} + )} {reminder === 'removeCode' && (