1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-05 17:53:12 +02:00

fix: don't show strategy change updates if the CR is closed

This PR hides the strategy changes that would be overwritten if the CR
is closed (applied, rejected, or canceled)

This should, however, be merged into the recent changes that add
support for showing this for segments too.
This commit is contained in:
Thomas Heartman 2024-02-09 10:40:56 +09:00
parent 1deae078fc
commit 7b2f86b7a6
No known key found for this signature in database
GPG Key ID: BD1F880DAED1EE78
4 changed files with 127 additions and 9 deletions

View File

@ -163,6 +163,7 @@ export const FeatureChange: FC<{
featureName={feature.name} featureName={feature.name}
environmentName={changeRequest.environment} environmentName={changeRequest.environment}
projectId={changeRequest.project} projectId={changeRequest.project}
changeRequestState={changeRequest.state}
/> />
) : null} ) : null}
{change.action === 'patchVariant' && ( {change.action === 'patchVariant' && (

View File

@ -8,6 +8,7 @@ import {
} from '../../StrategyTooltipLink/StrategyTooltipLink'; } from '../../StrategyTooltipLink/StrategyTooltipLink';
import { StrategyExecution } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution'; import { StrategyExecution } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution';
import { import {
ChangeRequestState,
IChangeRequestAddStrategy, IChangeRequestAddStrategy,
IChangeRequestDeleteStrategy, IChangeRequestDeleteStrategy,
IChangeRequestUpdateStrategy, IChangeRequestUpdateStrategy,
@ -120,7 +121,15 @@ export const StrategyChange: VFC<{
environmentName: string; environmentName: string;
featureName: string; featureName: string;
projectId: string; projectId: string;
}> = ({ actions, change, featureName, environmentName, projectId }) => { changeRequestState: ChangeRequestState;
}> = ({
actions,
change,
featureName,
environmentName,
projectId,
changeRequestState,
}) => {
const currentStrategy = useCurrentStrategy( const currentStrategy = useCurrentStrategy(
change, change,
projectId, projectId,
@ -211,6 +220,7 @@ export const StrategyChange: VFC<{
{change.action === 'updateStrategy' && ( {change.action === 'updateStrategy' && (
<> <>
<ChangesToOverwrite <ChangesToOverwrite
changeRequestState={changeRequestState}
currentStrategy={currentStrategy} currentStrategy={currentStrategy}
change={change} change={change}
/> />

View File

@ -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(
<ChangesToOverwriteInternal
change={change}
currentStrategy={existingStrategy}
changeRequestState={status as ChangeRequestState}
/>,
);
const hasRendered = screen.queryByText('Heads up!') !== null;
expect(hasRendered).toBe(showWarning);
});

View File

@ -1,5 +1,8 @@
import { Box, styled } from '@mui/material'; 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 { useChangeRequestPlausibleContext } from 'component/changeRequest/ChangeRequestContext';
import { useUiFlag } from 'hooks/useUiFlag'; import { useUiFlag } from 'hooks/useUiFlag';
import { IFeatureStrategy } from 'interfaces/strategy'; 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; currentStrategy?: IFeatureStrategy;
change: IChangeRequestUpdateStrategy; change: IChangeRequestUpdateStrategy;
}> = ({ change, currentStrategy }) => { changeRequestState: ChangeRequestState;
const checkForChanges = useUiFlag('changeRequestConflictHandling'); }> = ({ change, currentStrategy, changeRequestState }) => {
const changesThatWouldBeOverwritten = checkForChanges const changesThatWouldBeOverwritten = getChangesThatWouldBeOverwritten(
? getChangesThatWouldBeOverwritten(currentStrategy, change) currentStrategy,
: null; change,
);
const { registerWillOverwriteStrategyChanges } = const { registerWillOverwriteStrategyChanges } =
useChangeRequestPlausibleContext(); useChangeRequestPlausibleContext();
const changeRequestIsClosed = ['Applied', 'Cancelled', 'Rejected'].includes(
changeRequestState,
);
useEffect(() => { useEffect(() => {
if (changesThatWouldBeOverwritten) { if (changesThatWouldBeOverwritten) {
registerWillOverwriteStrategyChanges(); registerWillOverwriteStrategyChanges();
} }
}, [changesThatWouldBeOverwritten]); }, [changesThatWouldBeOverwritten]);
if (!changesThatWouldBeOverwritten) { if (!changesThatWouldBeOverwritten || changeRequestIsClosed) {
return null; return null;
} }
@ -162,3 +170,17 @@ export const ChangesToOverwrite: React.FC<{
</ChangesToOverwriteWarning> </ChangesToOverwriteWarning>
); );
}; };
export const ChangesToOverwrite: React.FC<{
currentStrategy?: IFeatureStrategy;
change: IChangeRequestUpdateStrategy;
changeRequestState: ChangeRequestState;
}> = ({ change, currentStrategy, changeRequestState }) => {
return useUiFlag('changeRequestConflictHandling') ? (
<ChangesToOverwriteInternal
change={change}
changeRequestState={changeRequestState}
currentStrategy={currentStrategy}
/>
) : null;
};