mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	chore: switch to using milestoneId instead of index (#8845)
This commit is contained in:
		
							parent
							
								
									9a269e3597
								
							
						
					
					
						commit
						79224ef9e5
					
				@ -54,11 +54,10 @@ const StyledMilestoneCardTitle = styled('span')(({ theme }) => ({
 | 
				
			|||||||
}));
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IMilestoneCardProps {
 | 
					interface IMilestoneCardProps {
 | 
				
			||||||
    index: number;
 | 
					 | 
				
			||||||
    milestone: IReleasePlanMilestonePayload;
 | 
					    milestone: IReleasePlanMilestonePayload;
 | 
				
			||||||
    milestoneNameChanged: (index: number, name: string) => void;
 | 
					    milestoneNameChanged: (milestoneId: string, name: string) => void;
 | 
				
			||||||
    showAddStrategyDialog: (
 | 
					    showAddStrategyDialog: (
 | 
				
			||||||
        index: number,
 | 
					        milestoneId: string,
 | 
				
			||||||
        strategy: IReleasePlanMilestoneStrategy,
 | 
					        strategy: IReleasePlanMilestoneStrategy,
 | 
				
			||||||
    ) => void;
 | 
					    ) => void;
 | 
				
			||||||
    errors: { [key: string]: string };
 | 
					    errors: { [key: string]: string };
 | 
				
			||||||
@ -66,7 +65,6 @@ interface IMilestoneCardProps {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const MilestoneCard = ({
 | 
					export const MilestoneCard = ({
 | 
				
			||||||
    index,
 | 
					 | 
				
			||||||
    milestone,
 | 
					    milestone,
 | 
				
			||||||
    milestoneNameChanged,
 | 
					    milestoneNameChanged,
 | 
				
			||||||
    showAddStrategyDialog,
 | 
					    showAddStrategyDialog,
 | 
				
			||||||
@ -88,7 +86,7 @@ export const MilestoneCard = ({
 | 
				
			|||||||
        milestoneId: string,
 | 
					        milestoneId: string,
 | 
				
			||||||
        strategy: IReleasePlanMilestoneStrategy,
 | 
					        strategy: IReleasePlanMilestoneStrategy,
 | 
				
			||||||
    ) => {
 | 
					    ) => {
 | 
				
			||||||
        showAddStrategyDialog(index, strategy);
 | 
					        showAddStrategyDialog(milestone.id, strategy);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
@ -101,7 +99,10 @@ export const MilestoneCard = ({
 | 
				
			|||||||
                                label=''
 | 
					                                label=''
 | 
				
			||||||
                                value={milestone.name}
 | 
					                                value={milestone.name}
 | 
				
			||||||
                                onChange={(e) =>
 | 
					                                onChange={(e) =>
 | 
				
			||||||
                                    milestoneNameChanged(index, e.target.value)
 | 
					                                    milestoneNameChanged(
 | 
				
			||||||
 | 
					                                        milestone.id,
 | 
				
			||||||
 | 
					                                        e.target.value,
 | 
				
			||||||
 | 
					                                    )
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                error={Boolean(errors?.name)}
 | 
					                                error={Boolean(errors?.name)}
 | 
				
			||||||
                                errorText={errors?.name}
 | 
					                                errorText={errors?.name}
 | 
				
			||||||
@ -151,7 +152,7 @@ export const MilestoneCard = ({
 | 
				
			|||||||
                            }}
 | 
					                            }}
 | 
				
			||||||
                        >
 | 
					                        >
 | 
				
			||||||
                            <MilestoneStrategyMenuCards
 | 
					                            <MilestoneStrategyMenuCards
 | 
				
			||||||
                                milestoneId={milestone.id ?? index.toString()}
 | 
					                                milestoneId={milestone.id}
 | 
				
			||||||
                                openAddStrategy={onSelectStrategy}
 | 
					                                openAddStrategy={onSelectStrategy}
 | 
				
			||||||
                            />
 | 
					                            />
 | 
				
			||||||
                        </Popover>
 | 
					                        </Popover>
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ import { MilestoneCard } from './MilestoneCard';
 | 
				
			|||||||
import { styled } from '@mui/material';
 | 
					import { styled } from '@mui/material';
 | 
				
			||||||
import { Button } from '@mui/material';
 | 
					import { Button } from '@mui/material';
 | 
				
			||||||
import Add from '@mui/icons-material/Add';
 | 
					import Add from '@mui/icons-material/Add';
 | 
				
			||||||
 | 
					import { v4 as uuidv4 } from 'uuid';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IMilestoneListProps {
 | 
					interface IMilestoneListProps {
 | 
				
			||||||
    milestones: IReleasePlanMilestonePayload[];
 | 
					    milestones: IReleasePlanMilestonePayload[];
 | 
				
			||||||
@ -13,7 +14,7 @@ interface IMilestoneListProps {
 | 
				
			|||||||
        React.SetStateAction<IReleasePlanMilestonePayload[]>
 | 
					        React.SetStateAction<IReleasePlanMilestonePayload[]>
 | 
				
			||||||
    >;
 | 
					    >;
 | 
				
			||||||
    openAddStrategyForm: (
 | 
					    openAddStrategyForm: (
 | 
				
			||||||
        index: number,
 | 
					        milestoneId: string,
 | 
				
			||||||
        strategy: IReleasePlanMilestoneStrategy,
 | 
					        strategy: IReleasePlanMilestoneStrategy,
 | 
				
			||||||
    ) => void;
 | 
					    ) => void;
 | 
				
			||||||
    errors: { [key: string]: string };
 | 
					    errors: { [key: string]: string };
 | 
				
			||||||
@ -32,20 +33,21 @@ export const MilestoneList = ({
 | 
				
			|||||||
    errors,
 | 
					    errors,
 | 
				
			||||||
    clearErrors,
 | 
					    clearErrors,
 | 
				
			||||||
}: IMilestoneListProps) => {
 | 
					}: IMilestoneListProps) => {
 | 
				
			||||||
    const milestoneNameChanged = (index: number, name: string) => {
 | 
					    const milestoneNameChanged = (milestoneId: string, name: string) => {
 | 
				
			||||||
        setMilestones((prev) =>
 | 
					        setMilestones((prev) =>
 | 
				
			||||||
            prev.map((milestone, i) =>
 | 
					            prev.map((milestone) =>
 | 
				
			||||||
                i === index ? { ...milestone, name } : milestone,
 | 
					                milestone.id === milestoneId
 | 
				
			||||||
 | 
					                    ? { ...milestone, name }
 | 
				
			||||||
 | 
					                    : milestone,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        <>
 | 
					        <>
 | 
				
			||||||
            {milestones.map((milestone, index) => (
 | 
					            {milestones.map((milestone) => (
 | 
				
			||||||
                <MilestoneCard
 | 
					                <MilestoneCard
 | 
				
			||||||
                    key={`milestone_${index.toString()}`}
 | 
					                    key={milestone.id}
 | 
				
			||||||
                    index={index}
 | 
					 | 
				
			||||||
                    milestone={milestone}
 | 
					                    milestone={milestone}
 | 
				
			||||||
                    milestoneNameChanged={milestoneNameChanged}
 | 
					                    milestoneNameChanged={milestoneNameChanged}
 | 
				
			||||||
                    showAddStrategyDialog={openAddStrategyForm}
 | 
					                    showAddStrategyDialog={openAddStrategyForm}
 | 
				
			||||||
@ -61,6 +63,7 @@ export const MilestoneList = ({
 | 
				
			|||||||
                    setMilestones((prev) => [
 | 
					                    setMilestones((prev) => [
 | 
				
			||||||
                        ...prev,
 | 
					                        ...prev,
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
 | 
					                            id: uuidv4(),
 | 
				
			||||||
                            name: `Milestone ${prev.length + 1}`,
 | 
					                            name: `Milestone ${prev.length + 1}`,
 | 
				
			||||||
                            sortOrder: prev.length,
 | 
					                            sortOrder: prev.length,
 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
 | 
				
			|||||||
@ -59,8 +59,8 @@ export const TemplateForm: React.FC<ITemplateFormProps> = ({
 | 
				
			|||||||
    children,
 | 
					    children,
 | 
				
			||||||
}) => {
 | 
					}) => {
 | 
				
			||||||
    const [addStrategyOpen, setAddStrategyOpen] = useState(false);
 | 
					    const [addStrategyOpen, setAddStrategyOpen] = useState(false);
 | 
				
			||||||
    const [activeMilestoneIndex, setActiveMilestoneIndex] = useState<
 | 
					    const [activeMilestoneId, setActiveMilestoneId] = useState<
 | 
				
			||||||
        number | undefined
 | 
					        string | undefined
 | 
				
			||||||
    >();
 | 
					    >();
 | 
				
			||||||
    const [strategy, setStrategy] = useState<IReleasePlanMilestoneStrategy>({
 | 
					    const [strategy, setStrategy] = useState<IReleasePlanMilestoneStrategy>({
 | 
				
			||||||
        name: 'flexibleRollout',
 | 
					        name: 'flexibleRollout',
 | 
				
			||||||
@ -70,14 +70,33 @@ export const TemplateForm: React.FC<ITemplateFormProps> = ({
 | 
				
			|||||||
        id: '',
 | 
					        id: '',
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    const openAddStrategyForm = (
 | 
					    const openAddStrategyForm = (
 | 
				
			||||||
        index: number,
 | 
					        milestoneId: string,
 | 
				
			||||||
        strategy: IReleasePlanMilestoneStrategy,
 | 
					        strategy: IReleasePlanMilestoneStrategy,
 | 
				
			||||||
    ) => {
 | 
					    ) => {
 | 
				
			||||||
        setActiveMilestoneIndex(index);
 | 
					        setActiveMilestoneId(milestoneId);
 | 
				
			||||||
        setStrategy(strategy);
 | 
					        setStrategy(strategy);
 | 
				
			||||||
        setAddStrategyOpen(true);
 | 
					        setAddStrategyOpen(true);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const addStrategy = (
 | 
				
			||||||
 | 
					        milestoneId: string,
 | 
				
			||||||
 | 
					        strategy: IReleasePlanMilestoneStrategy,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					        setMilestones((prev) =>
 | 
				
			||||||
 | 
					            prev.map((milestone, i) =>
 | 
				
			||||||
 | 
					                milestone.id === milestoneId
 | 
				
			||||||
 | 
					                    ? {
 | 
				
			||||||
 | 
					                          ...milestone,
 | 
				
			||||||
 | 
					                          strategies: [
 | 
				
			||||||
 | 
					                              ...(milestone.strategies || []),
 | 
				
			||||||
 | 
					                              strategy,
 | 
				
			||||||
 | 
					                          ],
 | 
				
			||||||
 | 
					                      }
 | 
				
			||||||
 | 
					                    : milestone,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        <FormTemplate
 | 
					        <FormTemplate
 | 
				
			||||||
            title={formTitle}
 | 
					            title={formTitle}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,12 @@
 | 
				
			|||||||
import type { IReleasePlanMilestonePayload } from 'interfaces/releasePlans';
 | 
					import type { IReleasePlanMilestonePayload } from 'interfaces/releasePlans';
 | 
				
			||||||
import { useEffect, useState } from 'react';
 | 
					import { useEffect, useState } from 'react';
 | 
				
			||||||
 | 
					import { v4 as uuidv4 } from 'uuid';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const useTemplateForm = (
 | 
					export const useTemplateForm = (
 | 
				
			||||||
    initialName = '',
 | 
					    initialName = '',
 | 
				
			||||||
    initialDescription = '',
 | 
					    initialDescription = '',
 | 
				
			||||||
    initialMilestones: IReleasePlanMilestonePayload[] = [
 | 
					    initialMilestones: IReleasePlanMilestonePayload[] = [
 | 
				
			||||||
        { name: 'Milestone 1', sortOrder: 0 },
 | 
					        { id: uuidv4(), name: 'Milestone 1', sortOrder: 0 },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
) => {
 | 
					) => {
 | 
				
			||||||
    const [name, setName] = useState(initialName);
 | 
					    const [name, setName] = useState(initialName);
 | 
				
			||||||
 | 
				
			|||||||
@ -41,7 +41,7 @@ export interface IReleasePlanTemplatePayload {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IReleasePlanMilestonePayload {
 | 
					export interface IReleasePlanMilestonePayload {
 | 
				
			||||||
    id?: string;
 | 
					    id: string;
 | 
				
			||||||
    name: string;
 | 
					    name: string;
 | 
				
			||||||
    sortOrder: number;
 | 
					    sortOrder: number;
 | 
				
			||||||
    strategies?: IReleasePlanStrategyPayload[];
 | 
					    strategies?: IReleasePlanStrategyPayload[];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user