faadc63028
- Тест-кнопка «Подтвердить закладку» в деталях плана для AWAITING_LAYIN (под подписью «ТЕСТОВЫЙ ФУНКЦИОНАЛ», с подтверждением). Гасится, если по КА уже заложен план со стартом в пределах ±10 мин (дублирует бэкенд-гард). - Статус SUPERSEDED: стиль/подпись/легенда. - Поиск уже созданного черновика — по слоту (КА + окно исходного плана), т.к. basePlanId черновика теперь = предшественник, а не исходный план. - Таймлайн: при выборе плана непричастные планы гаснут, а текущий/прошлый/ следующий обводятся яркими рамками (current #2563EB, prev #94A3B8, next #F59E0B). Асимметрия: prev (явная база выбранного) показывается всегда, даже REJECTED/SUPERSEDED; next (обратная ссылка) не подсвечивает мёртвые статусы — иначе вытесненная коррекция ложно числилась бы «следующей» у заложенного плана.
68 lines
3.4 KiB
TypeScript
68 lines
3.4 KiB
TypeScript
import type { TguPlanStatus } from "../../model/tguTypes";
|
|
import type { TimelineStatusStyle } from "../../model/timelineTypes";
|
|
|
|
// Порядок — по жизненному циклу плана (см. docs/architect/PCP_TGU_PLAN_STATUS_LIFECYCLE.md).
|
|
// ACCEPTED из enum бэка здесь намеренно отсутствует: приёмка переводит план сразу в AWAITING_LAYIN.
|
|
// LAID_IN возникает по событию подтверждения закладки (AWAITING_LAYIN → LAID_IN) и делает план базой
|
|
// цепочки; конкуренты на то же окно при этом уходят в SUPERSEDED.
|
|
export const STATUS_STYLES: TimelineStatusStyle[] = [
|
|
{
|
|
status: "DRAFT", label: "ЧЕРНОВИК", color: "#a98bdb", className: "status-draft",
|
|
description: "Черновик: план в стадии правки, в выдачу пока не идёт."
|
|
},
|
|
{
|
|
status: "PLANNED", label: "PLANNED", color: "#8d99a6", className: "status-planned",
|
|
description: "Возможный будущий план (проекция цепочки)."
|
|
},
|
|
{
|
|
status: "ISSUING", label: "ISSUING", color: "#2f80ed", className: "status-issuing",
|
|
description: "Идёт выдача плана."
|
|
},
|
|
{
|
|
status: "WAITING_DECISION", label: "WAITING_DECISION", color: "#f0ad2e", className: "status-waiting",
|
|
description: "План выдан, ожидается решение (принять / отклонить)."
|
|
},
|
|
{
|
|
status: "AWAITING_LAYIN", label: "AWAITING_LAYIN", color: "#2f9e44", className: "status-awaiting-layin",
|
|
description: "План принят, ожидается подтверждение закладки."
|
|
},
|
|
{
|
|
status: "LAID_IN", label: "LAID_IN", color: "#1b6b34", className: "status-laid-in",
|
|
description: "Получено подтверждение закладки плана."
|
|
},
|
|
{
|
|
status: "START_AMBIGUOUS", label: "START_AMBIGUOUS", color: "#b42318", className: "status-ambiguous",
|
|
description: "Ошибка после старта процесса выдачи плана. Требуется оператор."
|
|
},
|
|
{
|
|
status: "REJECTED", label: "REJECTED", color: "#d64545", className: "status-rejected",
|
|
description: "План отклонён, цепочка поставлена на паузу."
|
|
},
|
|
{
|
|
status: "NOT_ACCEPTED", label: "NOT_ACCEPTED", color: "#e8590c", className: "status-not-accepted",
|
|
description: "План не принят, идёт срочная перевыдача на ближайшую ЗРВ."
|
|
},
|
|
{
|
|
status: "LAYIN_FAILED", label: "LAYIN_FAILED", color: "#a61e4d", className: "status-layin-failed",
|
|
description: "План не заложен, идёт срочная перевыдача на ближайшую ЗРВ."
|
|
},
|
|
{
|
|
status: "SUPERSEDED", label: "SUPERSEDED", color: "#6b7280", className: "status-superseded",
|
|
description: "Вытеснён: по тому же окну заложен другой план (коррекция). Терминальный."
|
|
}
|
|
];
|
|
|
|
const STATUS_BY_NAME = new Map(STATUS_STYLES.map((style) => [style.status, style]));
|
|
|
|
export function statusStyle(status: TguPlanStatus): TimelineStatusStyle {
|
|
return (
|
|
STATUS_BY_NAME.get(status) ?? {
|
|
status,
|
|
label: status || "UNKNOWN",
|
|
color: "#79828d",
|
|
className: "status-unknown",
|
|
description: "Неизвестный статус."
|
|
}
|
|
);
|
|
}
|