diff --git a/src/pages/MilestoneDetailPage.tsx b/src/pages/MilestoneDetailPage.tsx index 96eebea..f5e27c5 100644 --- a/src/pages/MilestoneDetailPage.tsx +++ b/src/pages/MilestoneDetailPage.tsx @@ -45,6 +45,7 @@ export default function MilestoneDetailPage() { const [actionError, setActionError] = useState(null) const [showCloseConfirm, setShowCloseConfirm] = useState(false) const [closeReason, setCloseReason] = useState('') + const [preflight, setPreflight] = useState<{ freeze?: { allowed: boolean; reason: string | null }; start?: { allowed: boolean; reason: string | null } } | null>(null) const fetchMilestone = () => { api.get(`/milestones/${id}`).then(({ data }) => { @@ -55,11 +56,18 @@ export default function MilestoneDetailPage() { setProjectCode(proj.project_code || '') }) api.get(`/projects/${data.project_id}/members`).then(({ data }) => setMembers(data)).catch(() => {}) + fetchPreflight(data.project_id) } }) api.get(`/milestones/${id}/progress`).then(({ data }) => setProgress(data)).catch(() => {}) } + const fetchPreflight = (projectId: number) => { + api.get(`/projects/${projectId}/milestones/${id}/actions/preflight`) + .then(({ data }) => setPreflight(data)) + .catch(() => setPreflight(null)) + } + useEffect(() => { fetchMilestone() }, [id]) @@ -113,6 +121,7 @@ export default function MilestoneDetailPage() { await api.post(`/projects/${project.id}/milestones/${milestone.id}/actions/${action}`, body ?? {}) fetchMilestone() refreshMilestoneItems() + fetchPreflight(project.id) } catch (err: any) { const detail = err?.response?.data?.detail setActionError(typeof detail === 'string' ? detail : `${action} failed`) @@ -164,22 +173,38 @@ export default function MilestoneDetailPage() { {!isTerminal && (
{msStatus === 'open' && ( - + + + {preflight?.freeze?.allowed === false && ( + + ⚠ {preflight.freeze.reason} + + )} + )} {msStatus === 'freeze' && ( - + + + {preflight?.start?.allowed === false && ( + + ⚠ {preflight.start.reason} + + )} + )} {(msStatus === 'open' || msStatus === 'freeze' || msStatus === 'undergoing') && ( <>