diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/FeatureChange.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/FeatureChange.tsx
index d111f3218a..5657ddbe99 100644
--- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/FeatureChange.tsx
+++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/FeatureChange.tsx
@@ -163,6 +163,7 @@ export const FeatureChange: FC<{
featureName={feature.name}
environmentName={changeRequest.environment}
projectId={changeRequest.project}
+ changeRequestState={changeRequest.state}
/>
) : null}
{change.action === 'patchVariant' && (
diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChange.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChange.tsx
index c7b71a4c9e..0a327c019f 100644
--- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChange.tsx
+++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChange.tsx
@@ -8,6 +8,7 @@ import {
} from '../../StrategyTooltipLink/StrategyTooltipLink';
import { StrategyExecution } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution';
import {
+ ChangeRequestState,
IChangeRequestAddStrategy,
IChangeRequestDeleteStrategy,
IChangeRequestUpdateStrategy,
@@ -120,7 +121,15 @@ export const StrategyChange: VFC<{
environmentName: string;
featureName: string;
projectId: string;
-}> = ({ actions, change, featureName, environmentName, projectId }) => {
+ changeRequestState: ChangeRequestState;
+}> = ({
+ actions,
+ change,
+ featureName,
+ environmentName,
+ projectId,
+ changeRequestState,
+}) => {
const currentStrategy = useCurrentStrategy(
change,
projectId,
@@ -211,6 +220,7 @@ export const StrategyChange: VFC<{
{change.action === 'updateStrategy' && (
<>
diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.test.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.test.tsx
new file mode 100644
index 0000000000..82a490e27f
--- /dev/null
+++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.test.tsx
@@ -0,0 +1,85 @@
+import { render } from 'utils/testRenderer';
+import { screen } from '@testing-library/react';
+import { ChangesToOverwriteInternal } from './StrategyChangeOverwriteWarning';
+import { IFeatureStrategy } from 'interfaces/strategy';
+import {
+ ChangeRequestState,
+ IChangeRequestUpdateStrategy,
+} from 'component/changeRequest/changeRequest.types';
+
+const existingStrategy: IFeatureStrategy = {
+ name: 'flexibleRollout',
+ constraints: [],
+ variants: [],
+ parameters: {
+ groupId: 'aaa',
+ rollout: '71',
+ stickiness: 'default',
+ },
+ id: '31572930-2db7-461f-813b-3eedc200cb33',
+ title: '',
+ disabled: false,
+ segments: [],
+};
+
+const snapshot: IFeatureStrategy = {
+ id: '31572930-2db7-461f-813b-3eedc200cb33',
+ name: 'flexibleRollout',
+ title: '',
+ disabled: true,
+ segments: [],
+ variants: [],
+ parameters: {
+ groupId: 'aaa',
+ rollout: '72',
+ stickiness: 'default',
+ },
+ constraints: [],
+};
+
+const change: IChangeRequestUpdateStrategy = {
+ id: 39,
+ action: 'updateStrategy' as const,
+ payload: {
+ id: '31572930-2db7-461f-813b-3eedc200cb33',
+ name: 'flexibleRollout',
+ title: '',
+ disabled: false,
+ segments: [],
+ snapshot,
+ variants: [],
+ parameters: {
+ groupId: 'baa',
+ rollout: '38',
+ stickiness: 'default',
+ },
+ constraints: [],
+ },
+ createdAt: new Date('2024-01-18T07:58:36.314Z'),
+ createdBy: {
+ id: 1,
+ username: 'admin',
+ imageUrl: '',
+ },
+};
+
+test.each([
+ ['Draft', true],
+ ['Approved', true],
+ ['In review', true],
+ ['Applied', false],
+ ['Scheduled', true],
+ ['Cancelled', false],
+ ['Rejected', false],
+])('Shows warnings for CRs in the "%s" state: %s', (status, showWarning) => {
+ render(
+ ,
+ );
+
+ const hasRendered = screen.queryByText('Heads up!') !== null;
+ expect(hasRendered).toBe(showWarning);
+});
diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.tsx
index 8c6bf2ae42..0bcd53eeed 100644
--- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.tsx
+++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/StrategyChangeOverwriteWarning.tsx
@@ -1,5 +1,8 @@
import { Box, styled } from '@mui/material';
-import { IChangeRequestUpdateStrategy } from 'component/changeRequest/changeRequest.types';
+import {
+ ChangeRequestState,
+ IChangeRequestUpdateStrategy,
+} from 'component/changeRequest/changeRequest.types';
import { useChangeRequestPlausibleContext } from 'component/changeRequest/ChangeRequestContext';
import { useUiFlag } from 'hooks/useUiFlag';
import { IFeatureStrategy } from 'interfaces/strategy';
@@ -70,24 +73,29 @@ const OverwriteTable = styled('table')(({ theme }) => ({
},
}));
-export const ChangesToOverwrite: React.FC<{
+export const ChangesToOverwriteInternal: React.FC<{
currentStrategy?: IFeatureStrategy;
change: IChangeRequestUpdateStrategy;
-}> = ({ change, currentStrategy }) => {
- const checkForChanges = useUiFlag('changeRequestConflictHandling');
- const changesThatWouldBeOverwritten = checkForChanges
- ? getChangesThatWouldBeOverwritten(currentStrategy, change)
- : null;
+ changeRequestState: ChangeRequestState;
+}> = ({ change, currentStrategy, changeRequestState }) => {
+ const changesThatWouldBeOverwritten = getChangesThatWouldBeOverwritten(
+ currentStrategy,
+ change,
+ );
const { registerWillOverwriteStrategyChanges } =
useChangeRequestPlausibleContext();
+ const changeRequestIsClosed = ['Applied', 'Cancelled', 'Rejected'].includes(
+ changeRequestState,
+ );
+
useEffect(() => {
if (changesThatWouldBeOverwritten) {
registerWillOverwriteStrategyChanges();
}
}, [changesThatWouldBeOverwritten]);
- if (!changesThatWouldBeOverwritten) {
+ if (!changesThatWouldBeOverwritten || changeRequestIsClosed) {
return null;
}
@@ -162,3 +170,17 @@ export const ChangesToOverwrite: React.FC<{
);
};
+
+export const ChangesToOverwrite: React.FC<{
+ currentStrategy?: IFeatureStrategy;
+ change: IChangeRequestUpdateStrategy;
+ changeRequestState: ChangeRequestState;
+}> = ({ change, currentStrategy, changeRequestState }) => {
+ return useUiFlag('changeRequestConflictHandling') ? (
+
+ ) : null;
+};