feat(logs): добавить раздел логов с историей и живым потоком
Docker images / prepare-release (push) Successful in 9s
Docker images / backend-test (push) Successful in 4m35s
Docker images / frontend-image (push) Successful in 3m29s
Docker images / updater-image (push) Successful in 41s
Docker images / netflow-agent-image (push) Successful in 34s
Docker images / backend-image (push) Successful in 1m44s
Docker images / publish-release (push) Successful in 10s
Docker images / notify-webhook (push) Successful in 2s
Docker images / prepare-release (push) Successful in 9s
Docker images / backend-test (push) Successful in 4m35s
Docker images / frontend-image (push) Successful in 3m29s
Docker images / updater-image (push) Successful in 41s
Docker images / netflow-agent-image (push) Successful in 34s
Docker images / backend-image (push) Successful in 1m44s
Docker images / publish-release (push) Successful in 10s
Docker images / notify-webhook (push) Successful in 2s
This commit is contained in:
1 parent
e461dc21bd
commit
5efd0339fb
37 files changed
+1399
-7
No files matched your search
@@ -0,0 +1,23 @@
|
||||
"use client"
|
||||
import { Fragment } from "react"
|
||||
import { AlertTriangleIcon, CircleAlertIcon, CircleHelpIcon, InfoIcon, BugIcon } from "lucide-react"
|
||||
import { Badge } from "@/components/reui/badge"
|
||||
import type { LogLevel } from "@mmapp/contracts"
|
||||
|
||||
export const LEVEL_LABELS: Record<LogLevel, string> = { critical: "Критическая", error: "Ошибка", warning: "Предупреждение", info: "Информация", debug: "Отладка", unknown: "Не определён" }
|
||||
export const LEVEL_COLORS: Record<LogLevel, string> = { critical: "var(--destructive)", error: "var(--destructive)", warning: "var(--warning)", info: "var(--info)", debug: "var(--muted-foreground)", unknown: "var(--border)" }
|
||||
export function LevelBadge({ level }: { level: LogLevel }) {
|
||||
const Icon = level === "critical" || level === "error" ? CircleAlertIcon : level === "warning" ? AlertTriangleIcon : level === "debug" ? BugIcon : level === "unknown" ? CircleHelpIcon : InfoIcon
|
||||
return <Badge variant={level === "critical" || level === "error" ? "destructive-light" : level === "warning" ? "warning-light" : level === "info" ? "info-light" : "secondary"} size="sm"><Icon aria-hidden="true" className="size-3" />{LEVEL_LABELS[level]}</Badge>
|
||||
}
|
||||
export function HighlightMessage({ text, search }: { text: string; search: string }) {
|
||||
if (!search) return <>{text}</>
|
||||
const lower = text.toLocaleLowerCase(), needle = search.toLocaleLowerCase(), parts = []
|
||||
let start = 0, found = lower.indexOf(needle)
|
||||
while (found >= 0) {
|
||||
parts.push(<Fragment key={start}>{text.slice(start, found)}<mark className="bg-primary/15 text-foreground">{text.slice(found, found + search.length)}</mark></Fragment>)
|
||||
start = found + search.length; found = lower.indexOf(needle, start)
|
||||
}
|
||||
return <>{parts}{text.slice(start)}</>
|
||||
}
|
||||
export function formatLogTime(at: string | null) { return at ? new Date(at).toLocaleString("ru-RU", { day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" }) : "—" }
|
||||
Reference in new issue
Block a user