diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ProgressionChange.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ProgressionChange.tsx index 20dc2b3897..c23aea943d 100644 --- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ProgressionChange.tsx +++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ProgressionChange.tsx @@ -54,7 +54,7 @@ export const ProgressionChange: FC = ({ const sourceId = isCreate ? change.payload.sourceMilestone - : change.payload.sourceMilestoneId; + : change.payload.sourceMilestoneId || change.payload.sourceMilestone; if (!sourceId) return null; diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ReleasePlanChange.tsx b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ReleasePlanChange.tsx index c165d89e28..d29d8c23d7 100644 --- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ReleasePlanChange.tsx +++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ReleasePlanChange.tsx @@ -239,6 +239,7 @@ const AddReleasePlan: FC<{ ); }; + const ConsolidatedProgressionChanges: FC<{ feature: IChangeRequestFeature; currentReleasePlan?: IReleasePlan; @@ -311,7 +312,8 @@ const ConsolidatedProgressionChanges: FC<{ .map((change) => change.action === 'createMilestoneProgression' ? change.payload.sourceMilestone - : change.payload.sourceMilestoneId, + : change.payload.sourceMilestoneId || + change.payload.sourceMilestone, ) .filter((id): id is string => Boolean(id)), ); @@ -319,7 +321,11 @@ const ConsolidatedProgressionChanges: FC<{ const milestonesWithDeletedAutomation = new Set( progressionChanges .filter((change) => change.action === 'deleteMilestoneProgression') - .map((change) => change.payload.sourceMilestoneId) + .map( + (change) => + change.payload.sourceMilestoneId || + change.payload.sourceMilestone, + ) .filter((id): id is string => Boolean(id)), ); @@ -327,7 +333,8 @@ const ConsolidatedProgressionChanges: FC<{ const sourceId = change.action === 'createMilestoneProgression' ? change.payload.sourceMilestone - : change.payload.sourceMilestoneId; + : change.payload.sourceMilestoneId || + change.payload.sourceMilestone; const sourceName = basePlan.milestones.find((milestone) => milestone.id === sourceId) ?.name || sourceId; diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/applyProgressionChanges.ts b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/applyProgressionChanges.ts new file mode 100644 index 0000000000..107ae33285 --- /dev/null +++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/applyProgressionChanges.ts @@ -0,0 +1,53 @@ +import type { IReleasePlan } from 'interfaces/releasePlans'; +import type { + IChangeRequestCreateMilestoneProgression, + IChangeRequestUpdateMilestoneProgression, + IChangeRequestDeleteMilestoneProgression, +} from 'component/changeRequest/changeRequest.types'; + +type ProgressionChange = + | IChangeRequestCreateMilestoneProgression + | IChangeRequestUpdateMilestoneProgression + | IChangeRequestDeleteMilestoneProgression; + +export const applyProgressionChanges = ( + basePlan: IReleasePlan, + progressionChanges: ProgressionChange[], +): IReleasePlan => { + return { + ...basePlan, + milestones: basePlan.milestones.map((milestone) => { + const createChange = progressionChanges.find( + (change): change is IChangeRequestCreateMilestoneProgression => + change.action === 'createMilestoneProgression' && + change.payload.sourceMilestone === milestone.id, + ); + const updateChange = progressionChanges.find( + (change): change is IChangeRequestUpdateMilestoneProgression => + change.action === 'updateMilestoneProgression' && + change.payload.sourceMilestoneId === milestone.id, + ); + const deleteChange = progressionChanges.find( + (change): change is IChangeRequestDeleteMilestoneProgression => + change.action === 'deleteMilestoneProgression' && + change.payload.sourceMilestoneId === milestone.id, + ); + + if (deleteChange) { + return { + ...milestone, + transitionCondition: null, + }; + } + + const change = updateChange || createChange; + if (change) { + return { + ...milestone, + transitionCondition: change.payload.transitionCondition, + }; + } + return milestone; + }), + }; +}; diff --git a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/useModifiedReleasePlan.ts b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/useModifiedReleasePlan.ts index 311a23b3ed..db301e5db5 100644 --- a/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/useModifiedReleasePlan.ts +++ b/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/useModifiedReleasePlan.ts @@ -25,12 +25,14 @@ export const useModifiedReleasePlan = ( const updateChange = progressionChanges.find( (change): change is IChangeRequestUpdateMilestoneProgression => change.action === 'updateMilestoneProgression' && - change.payload.sourceMilestoneId === milestone.id, + (change.payload.sourceMilestoneId === milestone.id || + change.payload.sourceMilestone === milestone.id), ); const deleteChange = progressionChanges.find( (change): change is IChangeRequestDeleteMilestoneProgression => change.action === 'deleteMilestoneProgression' && - change.payload.sourceMilestoneId === milestone.id, + (change.payload.sourceMilestoneId === milestone.id || + change.payload.sourceMilestone === milestone.id), ); if (deleteChange) { diff --git a/frontend/src/component/changeRequest/changeRequest.types.ts b/frontend/src/component/changeRequest/changeRequest.types.ts index 909ff664e5..a5f96c3f91 100644 --- a/frontend/src/component/changeRequest/changeRequest.types.ts +++ b/frontend/src/component/changeRequest/changeRequest.types.ts @@ -304,11 +304,13 @@ type ChangeRequestCreateMilestoneProgression = type ChangeRequestUpdateMilestoneProgression = UpdateMilestoneProgressionSchema & { sourceMilestoneId?: string; + sourceMilestone?: string; // Backward compatibility for existing change requests snapshot?: IReleasePlan; }; type ChangeRequestDeleteMilestoneProgression = { sourceMilestoneId?: string; + sourceMilestone?: string; // Backward compatibility for existing change requests snapshot?: IReleasePlan; }; diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/ReleasePlan.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/ReleasePlan.tsx index ad5df12c0e..5a6d73feec 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/ReleasePlan.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/ReleasePlan.tsx @@ -146,10 +146,15 @@ export const ReleasePlan = ({ const progressionChange = featureInChangeRequest.changes.find( (change: any) => (change.action === 'updateMilestoneProgression' && - change.payload.sourceMilestoneId === - sourceMilestoneId) || + (change.payload.sourceMilestoneId === + sourceMilestoneId || + change.payload.sourceMilestone === + sourceMilestoneId)) || (change.action === 'deleteMilestoneProgression' && - change.payload.sourceMilestoneId === sourceMilestoneId), + (change.payload.sourceMilestoneId === + sourceMilestoneId || + change.payload.sourceMilestone === + sourceMilestoneId)), ); if (progressionChange) {