fix(ui): исключить подмену выбранного среза в сводке трафика

This commit is contained in:
Denozordec committed 2026-09-28 11:31:24 +07:00
1 parent c6d146d38f
commit 5734340db2
5 files changed
+40 -19

No files matched your search

+12 -13
View File
@@ -13,7 +13,7 @@ import { Sparkline } from "@/components/sparkline"
import { StatusDot } from "@/components/status-dot"
import { Flag } from "@/components/flag"
import {
RefreshCwIcon, DownloadIcon, TrendingUpIcon, TrendingDownIcon,
RefreshCwIcon, TrendingUpIcon, TrendingDownIcon,
ArrowUpIcon, ArrowDownIcon, ActivityIcon, UsersIcon, CableIcon, ServerIcon, SearchIcon, GitBranchIcon, PlusIcon,
} from "lucide-react"
import { cn } from "@/lib/utils"
@@ -590,7 +590,7 @@ function ServerDetail({
items={[
{
id: "rx-now",
label: "RX сейчас",
label: "RX",
value: fmtRate(rxNow),
hint: liveHint,
icon: <ArrowDownIcon className="size-4" />,
@@ -598,7 +598,7 @@ function ServerDetail({
},
{
id: "tx-now",
label: "TX сейчас",
label: "TX",
value: fmtRate(txNow),
hint: liveHint,
icon: <ArrowUpIcon className="size-4" />,
@@ -655,8 +655,8 @@ function UserDetail({ sel, range, setRange }: { sel: UserTraffic; range: Range;
<>
<TrafficRxTxChart rx={sel.rxSeries} tx={sel.txSeries} range={range} />
<div className="grid grid-cols-2 sm:grid-cols-4 gap-4 mt-4 pt-4 border-t">
<StatChip icon={<ArrowDownIcon className="size-3.5 text-emerald-500" />} label="RX сейчас" value={fmtRate(sel.rxNow)} />
<StatChip icon={<ArrowUpIcon className="size-3.5 text-blue-500" />} label="TX сейчас" value={fmtRate(sel.txNow)} />
<StatChip icon={<ArrowDownIcon className="size-3.5 text-emerald-500" />} label="RX" value={fmtRate(sel.rxNow)} />
<StatChip icon={<ArrowUpIcon className="size-3.5 text-blue-500" />} label="TX" value={fmtRate(sel.txNow)} />
<StatChip icon={<TrendingUpIcon className="size-3.5 text-amber-500" />} label="Пик RX" value={fmtRate(sel.rxPeak)} />
<StatChip icon={<CableIcon className="size-3.5 text-purple-500" />} label="Интерфейсы" value={`${sel.interfaces.length}`} />
</div>
@@ -691,8 +691,8 @@ function IfaceDetail({ sel, range, setRange }: { sel: BoundIfaceTraffic; range:
</DetailHeader>
{sel.status === "offline" ? <OfflinePlaceholder /> : <TrafficRxTxChart rx={sel.rxSeries} tx={sel.txSeries} range={range} />}
<div className="grid grid-cols-2 sm:grid-cols-4 gap-4 mt-4 pt-4 border-t">
<StatChip icon={<ArrowDownIcon className="size-3.5 text-emerald-500" />} label="RX сейчас" value={fmtRate(sel.rxNow)} />
<StatChip icon={<ArrowUpIcon className="size-3.5 text-blue-500" />} label="TX сейчас" value={fmtRate(sel.txNow)} />
<StatChip icon={<ArrowDownIcon className="size-3.5 text-emerald-500" />} label="RX" value={fmtRate(sel.rxNow)} />
<StatChip icon={<ArrowUpIcon className="size-3.5 text-blue-500" />} label="TX" value={fmtRate(sel.txNow)} />
<StatChip icon={<TrendingUpIcon className="size-3.5 text-amber-500" />} label="Пик RX" value={fmtRate(sel.rxPeak)} />
<StatChip icon={<TrendingUpIcon className="size-3.5 text-amber-500" />} label="Пик TX" value={fmtRate(sel.txPeak)} />
</div>
@@ -1084,7 +1084,7 @@ export default function TrafficPage() {
{
id: "bps",
label: "Скорость",
value: displayedFlow ? fmtRate(displayedFlow.bpsNow / 1_000_000) : (flowStats ? fmtRate((flowStats.bytesPerMin * 8) / 1_000_000) : "—"),
value: displayedFlow ? fmtRate(displayedFlow.bpsNow / 1_000_000) : "—",
hint: flowLiveHint,
icon: <ActivityIcon className="size-4" />,
iconClassName: "text-success",
@@ -1092,14 +1092,14 @@ export default function TrafficPage() {
{
id: "src",
label: "Уник. src",
value: String(displayedFlow?.uniqueSrc ?? flowStats?.uniqueSrc ?? 0),
value: displayedFlow ? String(displayedFlow.uniqueSrc) : "—",
icon: <ArrowUpIcon className="size-4" />,
iconClassName: "text-muted-foreground",
},
{
id: "proto",
label: "Топ протокол",
value: displayedFlow?.topProto ?? flowStats?.topProto ?? "—",
value: displayedFlow?.topProto ?? "—",
icon: <GitBranchIcon className="size-4" />,
iconClassName: "text-warning",
},
@@ -1108,14 +1108,14 @@ export default function TrafficPage() {
const counterKpiItems = [
{
id: "rx",
label: "RX сейчас",
label: "RX",
value: fmtRate(totalRx),
icon: <ArrowDownIcon className="size-4" />,
iconClassName: "text-success",
},
{
id: "tx",
label: "TX сейчас",
label: "TX",
value: fmtRate(totalTx),
icon: <ArrowUpIcon className="size-4" />,
iconClassName: "text-info",
@@ -1153,7 +1153,6 @@ export default function TrafficPage() {
>
<RefreshCwIcon className={cn("size-4", isLive && (effectiveMode === "flows" ? liveBusy : trafficLoading) && "animate-spin")} />Обновить
</Button>
<Button variant="outline" size="sm"><DownloadIcon className="size-4" />Экспорт</Button>
</>
}
/>