diff --git a/app/(main)/data-collection/page.tsx b/app/(main)/data-collection/page.tsx index d03085e..75f14de 100644 --- a/app/(main)/data-collection/page.tsx +++ b/app/(main)/data-collection/page.tsx @@ -4,7 +4,7 @@ import Link from "next/link" import { useCallback, useEffect, useMemo, useState } from "react" import { PageHeader } from "@/components/page-header" import { FormToggle } from "@/components/form-kit" -import { Badge } from "@/components/ui/badge" +import { Badge } from "@/components/reui/badge" import { Button, buttonVariants } from "@/components/ui/button" import { Frame, FramePanel } from "@/components/reui/frame" import { IconTile } from "@/components/reui/icon-tile" @@ -104,7 +104,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "traffic") { const t = snap as TrafficRunSnapshot return ( -
Прогон пропущен: предыдущий сбор трафика ещё выполнялся.
) : null} @@ -126,7 +126,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "uptime_resources") { const u = snap as ResourcesRunSnapshot return ( -Прогон пропущен: сбор ресурсов уже выполняется.
) : null} @@ -148,7 +148,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "servers_rest_ping") { const s = snap as ServersRestPingRunSnapshot return ( -Прогон пропущен: предыдущая проверка API ещё выполнялась.
) : null} @@ -171,7 +171,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "uptime_ping") { const p = snap as PingRunSnapshot return ( -Прогон пропущен: сбор ping уже выполняется.
) : null} @@ -196,7 +196,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "uptime_speed") { const s = snap as SpeedScheduledRunSnapshot return ( -Прогоны speed на {new Date(s.sampledAt).toLocaleString("ru-RU")} — по очереди для каждой включённой пробы
@@ -209,7 +209,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "gre_bgp") { const g = snap as GreBgpSnapshotRunSnapshot return ( -Прогон пропущен: предыдущий сбор GRE/BGP ещё выполнялся.
) : null} @@ -235,7 +235,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) {{e} @@ -249,7 +249,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "internet_path") { const p = snap as InternetPathRunSnapshot return ( -
Снимок internet-path на{" "} {new Date(p.sampledAt).toLocaleString("ru-RU")} @@ -276,7 +276,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "certificates_renew") { const c = snap as CertificatesRenewRunSnapshot return ( -
Прогон пропущен: предыдущая проверка ещё выполнялась или задача отключена.
) : null} @@ -299,7 +299,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) {{e}
))} @@ -311,7 +311,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "backups") { const b = snap as BackupsRunSnapshot return ( -{e}
))} @@ -343,7 +343,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) { if (snap.job === "alert_engine") { const a = snap as AlertEngineRunSnapshot return ( -
Снимок на{" "}
{new Date(a.sampledAt).toLocaleString("ru-RU")}
@@ -370,7 +370,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) {
{a.errors?.length ? (
{e}
@@ -380,7 +380,7 @@ function SnapshotTables({ snap }: { snap: SchedulerRunSnapshot }) {
По правилам (почему не ушло в Telegram)
{jobDesc}
Текст ошибки
-Результаты измерений
{snapshot ? (Хранение сэмплов трафика (дней)
@@ -1142,7 +1142,7 @@ export default function DataCollectionPage() { {schedulerSaveBusy ?
Трафик — последний сбор:{" "}
{trafficCollector?.lastCollectedAt
diff --git a/app/(main)/filters/page.tsx b/app/(main)/filters/page.tsx
index ddf5da2..b7c9805 100644
--- a/app/(main)/filters/page.tsx
+++ b/app/(main)/filters/page.tsx
@@ -35,6 +35,7 @@ import {
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
import { toast } from "sonner"
+import { CodeExportSheet } from "@/components/reui-kit/code-export-sheet"
// ── helpers ────────────────────────────────────────────────────────────────────
@@ -754,13 +755,11 @@ function PreviewModal({ open, serverId, rulesets, onClose, serversList, tunnelsL
tunnelsList: GreTunnel[]
recRoutesByServer: Record 1. Скопируйте скрипт в буфер обмена 3. Вставьте в терминал и нажмите Enter 2. Подключитесь к любому MikroTik (SSH / Winbox) 4. Скрипт сам определит свои правила по identity Восстановить базу приложения? {filename}
- Текущие данные SQLite на бекенде будут полностью заменены содержимым файла. Рекомендуется сначала скачать
- актуальный бэкап.
- Удалить пользователя? {user.name} · @{user.login}
- Это действие нельзя отменить. Пользователь потеряет доступ немедленно.
-
- {config.split("\n").map((line, i) => {
- const trimmed = line.trimStart()
- const cls =
- // section dividers
- trimmed.startsWith("# ═") || trimmed.startsWith("# ─")
- ? "text-[#444c56]" :
- // inline comments inside rule body
- trimmed.startsWith("# ")
- ? "text-[#8b949e]" :
- // RouterOS scripting keywords
- trimmed.startsWith(":local") || trimmed.startsWith(":log") || trimmed.startsWith(":foreach")
- ? "text-[#d2a8ff]" :
- // :if identity branch / closing brace
- trimmed.startsWith(":if") || (trimmed === "}" && line.length < 3)
- ? "text-[#ff7b72] font-semibold" :
- // filter rule add command
- trimmed.startsWith("/routing filter rule")
- ? "text-[#79c0ff]" :
- // rule body: if/else if branches
- trimmed.startsWith("if (") || trimmed.startsWith("} else if")
- ? "text-[#ff7b72]" :
- // rule body: blackhole action
- trimmed.startsWith("set type blackhole")
- ? "text-[#ff7b72] font-semibold" :
- // rule body: set actions
- trimmed.startsWith("set gw") || trimmed.startsWith("set gateway") || trimmed.startsWith("set out-interface")
- ? "text-[#a5d6ff]" :
- // rule body: accept / rule close
- trimmed.startsWith("accept") || trimmed === `}"` || trimmed.startsWith(`rule="`)
- ? "text-[#79c0ff]" :
- // named params
- trimmed.match(/^(chain|comment|bgp-communities)=/)
- ? "text-[#a5d6ff]" :
- "text-[#c9d1d9]"
- return {line || " "}
- })}
-
-