1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-26 13:48:33 +02:00

chore: switch to using milestoneId instead of index (#8845)

This commit is contained in:
David Leek 2024-11-25 10:38:12 +01:00 committed by GitHub
parent 9a269e3597
commit 79224ef9e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 44 additions and 20 deletions

View File

@ -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>

View File

@ -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,
}, },

View File

@ -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}

View File

@ -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);

View File

@ -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[];