mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	refactor: consolidated progression changes
This commit is contained in:
		
							parent
							
								
									cb9fa72de1
								
							
						
					
					
						commit
						dc5d7a89b3
					
				@ -1,5 +1,5 @@
 | 
				
			|||||||
import type { FC } from 'react';
 | 
					import type { FC } from 'react';
 | 
				
			||||||
import { Alert, styled } from '@mui/material';
 | 
					import { styled } from '@mui/material';
 | 
				
			||||||
import type {
 | 
					import type {
 | 
				
			||||||
    ChangeRequestState,
 | 
					    ChangeRequestState,
 | 
				
			||||||
    IChangeRequestCreateMilestoneProgression,
 | 
					    IChangeRequestCreateMilestoneProgression,
 | 
				
			||||||
@ -26,6 +26,82 @@ const StyledTabs = styled(Tabs)(({ theme }) => ({
 | 
				
			|||||||
    gap: theme.spacing(1),
 | 
					    gap: theme.spacing(1),
 | 
				
			||||||
}));
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ProgressionChange =
 | 
				
			||||||
 | 
					    | IChangeRequestCreateMilestoneProgression
 | 
				
			||||||
 | 
					    | IChangeRequestUpdateMilestoneProgression
 | 
				
			||||||
 | 
					    | IChangeRequestDeleteMilestoneProgression;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getFirstChangeWithSnapshot = (
 | 
				
			||||||
 | 
					    progressionChanges: ProgressionChange[],
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        progressionChanges.find(
 | 
				
			||||||
 | 
					            (change) =>
 | 
				
			||||||
 | 
					                change.payload?.snapshot &&
 | 
				
			||||||
 | 
					                (change.action === 'createMilestoneProgression' ||
 | 
				
			||||||
 | 
					                    change.action === 'updateMilestoneProgression'),
 | 
				
			||||||
 | 
					        ) || progressionChanges.find((change) => change.payload?.snapshot)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getMilestonesWithAutomation = (
 | 
				
			||||||
 | 
					    progressionChanges: ProgressionChange[],
 | 
				
			||||||
 | 
					): Set<string> => {
 | 
				
			||||||
 | 
					    return new Set(
 | 
				
			||||||
 | 
					        progressionChanges
 | 
				
			||||||
 | 
					            .filter(
 | 
				
			||||||
 | 
					                (change) =>
 | 
				
			||||||
 | 
					                    change.action === 'createMilestoneProgression' ||
 | 
				
			||||||
 | 
					                    change.action === 'updateMilestoneProgression',
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .map((change) =>
 | 
				
			||||||
 | 
					                change.action === 'createMilestoneProgression'
 | 
				
			||||||
 | 
					                    ? change.payload.sourceMilestone
 | 
				
			||||||
 | 
					                    : change.payload.sourceMilestoneId ||
 | 
				
			||||||
 | 
					                      change.payload.sourceMilestone,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .filter((id): id is string => Boolean(id)),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getMilestonesWithDeletedAutomation = (
 | 
				
			||||||
 | 
					    progressionChanges: ProgressionChange[],
 | 
				
			||||||
 | 
					): Set<string> => {
 | 
				
			||||||
 | 
					    return new Set(
 | 
				
			||||||
 | 
					        progressionChanges
 | 
				
			||||||
 | 
					            .filter((change) => change.action === 'deleteMilestoneProgression')
 | 
				
			||||||
 | 
					            .map(
 | 
				
			||||||
 | 
					                (change) =>
 | 
				
			||||||
 | 
					                    change.payload.sourceMilestoneId ||
 | 
				
			||||||
 | 
					                    change.payload.sourceMilestone,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .filter((id): id is string => Boolean(id)),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getChangeDescriptions = (
 | 
				
			||||||
 | 
					    progressionChanges: ProgressionChange[],
 | 
				
			||||||
 | 
					    basePlan: IReleasePlan,
 | 
				
			||||||
 | 
					): string[] => {
 | 
				
			||||||
 | 
					    return progressionChanges.map((change) => {
 | 
				
			||||||
 | 
					        const sourceId =
 | 
				
			||||||
 | 
					            change.action === 'createMilestoneProgression'
 | 
				
			||||||
 | 
					                ? change.payload.sourceMilestone
 | 
				
			||||||
 | 
					                : change.payload.sourceMilestoneId ||
 | 
				
			||||||
 | 
					                  change.payload.sourceMilestone;
 | 
				
			||||||
 | 
					        const sourceName =
 | 
				
			||||||
 | 
					            basePlan.milestones.find((milestone) => milestone.id === sourceId)
 | 
				
			||||||
 | 
					                ?.name || sourceId;
 | 
				
			||||||
 | 
					        const action =
 | 
				
			||||||
 | 
					            change.action === 'createMilestoneProgression'
 | 
				
			||||||
 | 
					                ? 'Adding'
 | 
				
			||||||
 | 
					                : change.action === 'deleteMilestoneProgression'
 | 
				
			||||||
 | 
					                  ? 'Deleting'
 | 
				
			||||||
 | 
					                  : 'Updating';
 | 
				
			||||||
 | 
					        return `${action} automation for ${sourceName}`;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const ConsolidatedProgressionChanges: FC<{
 | 
					export const ConsolidatedProgressionChanges: FC<{
 | 
				
			||||||
    feature: IChangeRequestFeature;
 | 
					    feature: IChangeRequestFeature;
 | 
				
			||||||
    currentReleasePlan?: IReleasePlan;
 | 
					    currentReleasePlan?: IReleasePlan;
 | 
				
			||||||
@ -57,84 +133,32 @@ export const ConsolidatedProgressionChanges: FC<{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (progressionChanges.length === 0) return null;
 | 
					    if (progressionChanges.length === 0) return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Use snapshot from first change if available, otherwise use current release plan
 | 
					 | 
				
			||||||
    const firstChangeWithSnapshot =
 | 
					    const firstChangeWithSnapshot =
 | 
				
			||||||
        progressionChanges.find(
 | 
					        getFirstChangeWithSnapshot(progressionChanges);
 | 
				
			||||||
            (change) =>
 | 
					 | 
				
			||||||
                change.payload?.snapshot &&
 | 
					 | 
				
			||||||
                (change.action === 'createMilestoneProgression' ||
 | 
					 | 
				
			||||||
                    change.action === 'updateMilestoneProgression'),
 | 
					 | 
				
			||||||
        ) || progressionChanges.find((change) => change.payload?.snapshot);
 | 
					 | 
				
			||||||
    const basePlan =
 | 
					    const basePlan =
 | 
				
			||||||
        firstChangeWithSnapshot?.payload?.snapshot || currentReleasePlan;
 | 
					        firstChangeWithSnapshot?.payload?.snapshot || currentReleasePlan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!basePlan) {
 | 
					    if (!basePlan) {
 | 
				
			||||||
        return (
 | 
					        return null;
 | 
				
			||||||
            <Alert severity='error'>
 | 
					 | 
				
			||||||
                Unable to load release plan data. Please refresh the page.
 | 
					 | 
				
			||||||
            </Alert>
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Apply all progression changes
 | 
					 | 
				
			||||||
    const modifiedPlan = applyProgressionChanges(basePlan, progressionChanges);
 | 
					    const modifiedPlan = applyProgressionChanges(basePlan, progressionChanges);
 | 
				
			||||||
 | 
					    const milestonesWithAutomation =
 | 
				
			||||||
    // Collect milestone IDs with automation (modified or original)
 | 
					        getMilestonesWithAutomation(progressionChanges);
 | 
				
			||||||
    const milestonesWithAutomation = new Set(
 | 
					    const milestonesWithDeletedAutomation =
 | 
				
			||||||
        progressionChanges
 | 
					        getMilestonesWithDeletedAutomation(progressionChanges);
 | 
				
			||||||
            .filter(
 | 
					    const changeDescriptions = getChangeDescriptions(
 | 
				
			||||||
                (change) =>
 | 
					        progressionChanges,
 | 
				
			||||||
                    change.action === 'createMilestoneProgression' ||
 | 
					        basePlan,
 | 
				
			||||||
                    change.action === 'updateMilestoneProgression',
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            .map((change) =>
 | 
					 | 
				
			||||||
                change.action === 'createMilestoneProgression'
 | 
					 | 
				
			||||||
                    ? change.payload.sourceMilestone
 | 
					 | 
				
			||||||
                    : change.payload.sourceMilestoneId ||
 | 
					 | 
				
			||||||
                      change.payload.sourceMilestone,
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            .filter((id): id is string => Boolean(id)),
 | 
					 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const milestonesWithDeletedAutomation = new Set(
 | 
					 | 
				
			||||||
        progressionChanges
 | 
					 | 
				
			||||||
            .filter((change) => change.action === 'deleteMilestoneProgression')
 | 
					 | 
				
			||||||
            .map(
 | 
					 | 
				
			||||||
                (change) =>
 | 
					 | 
				
			||||||
                    change.payload.sourceMilestoneId ||
 | 
					 | 
				
			||||||
                    change.payload.sourceMilestone,
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            .filter((id): id is string => Boolean(id)),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const changeDescriptions = progressionChanges.map((change) => {
 | 
					 | 
				
			||||||
        const sourceId =
 | 
					 | 
				
			||||||
            change.action === 'createMilestoneProgression'
 | 
					 | 
				
			||||||
                ? change.payload.sourceMilestone
 | 
					 | 
				
			||||||
                : change.payload.sourceMilestoneId ||
 | 
					 | 
				
			||||||
                  change.payload.sourceMilestone;
 | 
					 | 
				
			||||||
        const sourceName =
 | 
					 | 
				
			||||||
            basePlan.milestones.find((milestone) => milestone.id === sourceId)
 | 
					 | 
				
			||||||
                ?.name || sourceId;
 | 
					 | 
				
			||||||
        const action =
 | 
					 | 
				
			||||||
            change.action === 'createMilestoneProgression'
 | 
					 | 
				
			||||||
                ? 'Adding'
 | 
					 | 
				
			||||||
                : change.action === 'deleteMilestoneProgression'
 | 
					 | 
				
			||||||
                  ? 'Deleting'
 | 
					 | 
				
			||||||
                  : 'Updating';
 | 
					 | 
				
			||||||
        return `${action} automation for ${sourceName}`;
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // For diff view, we need to use basePlan with deleted automations shown
 | 
					 | 
				
			||||||
    const basePlanWithDeletedAutomations: IReleasePlan = {
 | 
					    const basePlanWithDeletedAutomations: IReleasePlan = {
 | 
				
			||||||
        ...basePlan,
 | 
					        ...basePlan,
 | 
				
			||||||
        milestones: basePlan.milestones.map((milestone) => {
 | 
					        milestones: basePlan.milestones.map((milestone) =>
 | 
				
			||||||
            // If this milestone is being deleted, ensure it has its transition condition
 | 
					            milestonesWithDeletedAutomation.has(milestone.id)
 | 
				
			||||||
            if (milestonesWithDeletedAutomation.has(milestone.id)) {
 | 
					                ? milestone
 | 
				
			||||||
                return milestone;
 | 
					                : milestone,
 | 
				
			||||||
            }
 | 
					        ),
 | 
				
			||||||
            return milestone;
 | 
					 | 
				
			||||||
        }),
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user