import { Badge } from "@/components/reui/badge" const object = (value: unknown): Record => value && typeof value === "object" && !Array.isArray(value) ? value as Record : {} const list = (value: unknown): unknown[] => Array.isArray(value) ? value : [] const json = (value: unknown) => JSON.stringify(value, null, 2) export function PlanReview({ plan }: { plan: Record }) { const changes = object(plan.changes), target = object(changes.target) const objects = list(changes.objects), steps = list(changes.steps), recovery = object(changes.recovery) return
{String(plan.operationId ?? "Операция")}{String(plan.state ?? "Неизвестно")}Шагов: {steps.length}
Область
{target.scope === "servers" ? "Серверы: " + list(target.serverIds).join(", ") : target.scope === "global" ? "Всё приложение" : "Подключение"}
Срок плана
{plan.expiresAt ? new Date(String(plan.expiresAt)).toLocaleString("ru-RU") : "Не указан"}
{!!list(changes.warnings).length &&

Условия и последствия

    {list(changes.warnings).map((warning, index) =>
  • {String(warning)}
  • )}
} {!!objects.length &&

Объекты и защищённые зависимости

{objects.map((value, index) => { const item = object(value); return {item.serverId ? `Сервер ${item.serverId} · ` : ""}{String(item.kind)} · {String(item.id)} })}
}

Исходное состояние

{json(changes.before ?? changes.snapshots ?? null)}

Запланированные шаги

    {steps.map((value, index) => { const step = object(value); return
  1. {index + 1}. {step.kind === "ros" ? String(object(step.step).action) + " · " + String(object(step.step).resource) : String(step.service)}

    {json(step.kind === "ros" ? step.step : step.input)}
  2. })}
{!!Object.keys(recovery).length &&

Зарезервировано восстановление до {new Date(String(recovery.validUntil)).toLocaleString("ru-RU")}. Оно выполняется только при подтверждённой исходной записи, неуспешной проверке и действующем допуске; неопределённую запись исполнитель не повторяет.

}
Полные данные плана
{json(plan)}
}