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