diff --git a/app/(main)/certificates/page.tsx b/app/(main)/certificates/page.tsx index 9584934c..4930cdce 100644 --- a/app/(main)/certificates/page.tsx +++ b/app/(main)/certificates/page.tsx @@ -4,7 +4,7 @@ import { Suspense, useMemo, useState } from "react" import { useSearchParams } from "next/navigation" import { readCertificatesUrl, patchCertificatesUrl, type CertificateStatusFilter } from "@/lib/certificates-url-state" import { PageHeader } from "@/components/page-header" -import { FormField, FormToggle, SectionTitle } from "@/components/form-kit" +import { FormField, FormToggle, SectionTitle, SegmentedControl } from "@/components/form-kit" import { routerCertificates, servers as mockServers } from "@/lib/data" import type { Server } from "@/lib/data" import type { CertificateDto } from "@mmapp/contracts/certificates" @@ -77,10 +77,10 @@ function mockToDto(cert: (typeof routerCertificates)[number]): CertificateDto { function CertPartAlertExpired({ expired }: { expired: CertificateView[] }) { return ( -
+
{expired.length} {expired.length === 1 ? "истёкший сертификат" : "истёкших сертификата"}
@@ -93,10 +93,10 @@ function CertPartAlertExpired({ expired }: { expired: CertificateView[] }) { function CertPartAlertExpiring({ expiring }: { expiring: CertificateView[] }) { return ( -
+
{expiring.length} {expiring.length === 1 ? "сертификат истекает" : "сертификата истекают"} в течение 30 дней
@@ -112,11 +112,13 @@ function CertPartKpi({
expiring,
expired,
complete,
+ totalKnown,
}: {
displayCerts: CertificateView[]
expiring: CertificateView[]
expired: CertificateView[]
complete: boolean
+ totalKnown: boolean
}) {
return (
Моковые данные
} {urlError &&Выбранный сервер недоступен в каталоге сертификатов. Выберите другой сервер.
} {isLive && backendStatus === false && ( -{catalog.hasServers ? "Последние серверы сохранены. " : "Каталог серверов пока неизвестен. "}{serverError}
} + {isLive && serverError &&{catalog.hasServers ? "Последние серверы сохранены. " : "Каталог серверов пока неизвестен. "}{serverError}
} {isLive && !canRead &&Нет права mm:certificates:read.
} {isLive && !canReadServers &&Нет права mm:servers:read. Выбор устройства для выпуска недоступен.
} {isLive && catalog.collectedAt &&Последнее чтение каталога: {new Date(catalog.collectedAt).toLocaleString("ru-RU")}
} {isLive && Object.values(snapshots).filter(snapshot => selectedServerId === ALL_SERVERS_ID || snapshot.latest.serverId === selectedServerId).map(snapshot =>{snapshot.latest.serverName}: {snapshot.latest.error}. {snapshot.confirmed ? "Последние сертификаты сохранены." : "Сертификаты пока неизвестны."}
} + {snapshot.latest.error &&{snapshot.latest.serverName}: {snapshot.latest.error}. {snapshot.confirmed ? "Последние сертификаты сохранены." : "Сертификаты пока неизвестны."}
}{snapshot.latest.serverName}: {snapshot.confirmed ? "Подтверждённые данные от " + new Date(snapshot.confirmed.collectedAt).toLocaleString("ru-RU") : "Успешного чтения нет"}
Сводка неполная: часть устройств, статусов или сроков неизвестна. Таблица показывает доступные снимки.
} -Исправьте контекст ссылки
: isLive && scopedCerts.length === 0 && !scopeKnown ?{loading ? "Загрузка сертификатов…" : "Список сертификатов пока неизвестен"}
:{issue.error || issue.storageError}
} {issue.checkpoint &&Закрытие формы не отменяет серверную задачу. Её можно проверить повторно.
} {issue.checkpoint &&Задача {issue.checkpoint.request.requestId}: {issue.checkpoint.job ? ({ queued: "В очереди", running: "Выполняется", done: "Завершена", failed: "Ошибка" }[issue.checkpoint.job.status]) + " · " + issue.checkpoint.job.step : issue.checkpoint.accepted ? "Принята; результат пока неизвестен" : "Принятие запроса пока не подтверждено"}. Сервер {issue.checkpoint.request.serverId}, сертификат {issue.checkpoint.request.certName}.
} diff --git a/components/data-grids/certificate-expanded-detail.tsx b/components/data-grids/certificate-expanded-detail.tsx index 2d59fc63..7ccc088d 100644 --- a/components/data-grids/certificate-expanded-detail.tsx +++ b/components/data-grids/certificate-expanded-detail.tsx @@ -4,13 +4,13 @@ import type { CertificateView } from "@/lib/certificate-view" function CertificateExpandedDetail({ cert }: { cert: CertificateView }) { return ( -Размер ключа
{cert.keySize === null ? "Неизвестен" : cert.keySize + " бит"}
Действителен с
+Начало срока
{cert.validFrom ?? "Дата неизвестна"}
Начало срока не удалось определить. Значение RouterOS: {cert.rawValidFrom}
} + {"rawValidUntil" in cert && !cert.validUntil && cert.rawValidUntil &&Окончание срока не удалось определить. Значение RouterOS: {cert.rawValidUntil}
}