Remove KPI trend subtitles on server dashboard.
Drop per-card trend footer text and related previous-value calculation from the server overview KPI block. Made-with: Cursor
This commit is contained in:
@@ -25,16 +25,6 @@
|
|||||||
let summary = $state<StatsSummaryData | null>(null);
|
let summary = $state<StatsSummaryData | null>(null);
|
||||||
let sys = $state<SystemInfoData | null>(null);
|
let sys = $state<SystemInfoData | null>(null);
|
||||||
|
|
||||||
type NodeKpiPrev = {
|
|
||||||
uptime: number;
|
|
||||||
conn: number;
|
|
||||||
bad: number;
|
|
||||||
users: number;
|
|
||||||
handshake: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
let kpiPrev = $state<NodeKpiPrev | null>(null);
|
|
||||||
|
|
||||||
function num(v: unknown): number {
|
function num(v: unknown): number {
|
||||||
if (typeof v === 'number' && Number.isFinite(v)) return v;
|
if (typeof v === 'number' && Number.isFinite(v)) return v;
|
||||||
if (typeof v === 'string' && v.trim() !== '') {
|
if (typeof v === 'string' && v.trim() !== '') {
|
||||||
@@ -44,38 +34,15 @@
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function trendFooter(current: number | null, prev: number | null, invert = false): string {
|
|
||||||
if (current == null || prev == null || !Number.isFinite(current) || !Number.isFinite(prev)) {
|
|
||||||
return 'первое обновление';
|
|
||||||
}
|
|
||||||
const delta = current - prev;
|
|
||||||
if (delta === 0) return 'к прошлому обновлению: без изменений';
|
|
||||||
const sign = delta > 0 ? '+' : '-';
|
|
||||||
const absDelta = Math.abs(delta);
|
|
||||||
const mood = invert ? (delta < 0 ? 'лучше' : 'хуже') : delta > 0 ? 'рост' : 'снижение';
|
|
||||||
return `к прошлому обновлению: ${sign}${absDelta} (${mood})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function loadFor(a: string) {
|
async function loadFor(a: string) {
|
||||||
loading = true;
|
loading = true;
|
||||||
err = null;
|
err = null;
|
||||||
try {
|
try {
|
||||||
const prev =
|
|
||||||
summary && sys
|
|
||||||
? {
|
|
||||||
uptime: num(sys.uptime_seconds),
|
|
||||||
conn: num(summary.connections_total),
|
|
||||||
bad: num(summary.connections_bad_total),
|
|
||||||
users: num(summary.configured_users),
|
|
||||||
handshake: num(summary.handshake_timeouts_total)
|
|
||||||
}
|
|
||||||
: null;
|
|
||||||
const [h, s, i] = await Promise.all([
|
const [h, s, i] = await Promise.all([
|
||||||
fetchTelemt<HealthData>(a, 'health'),
|
fetchTelemt<HealthData>(a, 'health'),
|
||||||
fetchStatsSummary(a),
|
fetchStatsSummary(a),
|
||||||
fetchTelemt<SystemInfoData>(a, 'system/info')
|
fetchTelemt<SystemInfoData>(a, 'system/info')
|
||||||
]);
|
]);
|
||||||
kpiPrev = prev;
|
|
||||||
health = h.data;
|
health = h.data;
|
||||||
summary = s.data;
|
summary = s.data;
|
||||||
sys = i.data;
|
sys = i.data;
|
||||||
@@ -150,7 +117,6 @@
|
|||||||
<KpiStatCard
|
<KpiStatCard
|
||||||
accent="violet"
|
accent="violet"
|
||||||
label="Аптайм"
|
label="Аптайм"
|
||||||
footer={trendFooter(sys ? uptimeSec : null, kpiPrev?.uptime ?? null)}
|
|
||||||
valueClass="text-xl"
|
valueClass="text-xl"
|
||||||
>
|
>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
@@ -161,7 +127,6 @@
|
|||||||
<KpiStatCard
|
<KpiStatCard
|
||||||
accent="info"
|
accent="info"
|
||||||
label="Соединения (всего)"
|
label="Соединения (всего)"
|
||||||
footer={trendFooter(summary ? connTotal : null, kpiPrev?.conn ?? null)}
|
|
||||||
valueClass="text-xl"
|
valueClass="text-xl"
|
||||||
>
|
>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
@@ -172,7 +137,6 @@
|
|||||||
<KpiStatCard
|
<KpiStatCard
|
||||||
accent="danger"
|
accent="danger"
|
||||||
label="Bad connections"
|
label="Bad connections"
|
||||||
footer={trendFooter(summary ? badTotal : null, kpiPrev?.bad ?? null, true)}
|
|
||||||
valueClass="text-xl"
|
valueClass="text-xl"
|
||||||
>
|
>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
@@ -183,7 +147,6 @@
|
|||||||
<KpiStatCard
|
<KpiStatCard
|
||||||
accent="warning"
|
accent="warning"
|
||||||
label="Handshake timeouts"
|
label="Handshake timeouts"
|
||||||
footer={trendFooter(summary ? handshakeT : null, kpiPrev?.handshake ?? null, true)}
|
|
||||||
valueClass="text-xl"
|
valueClass="text-xl"
|
||||||
>
|
>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
@@ -194,7 +157,6 @@
|
|||||||
<KpiStatCard
|
<KpiStatCard
|
||||||
accent="neutral"
|
accent="neutral"
|
||||||
label="Пользователей в конфиге"
|
label="Пользователей в конфиге"
|
||||||
footer={trendFooter(summary ? cfgUsers : null, kpiPrev?.users ?? null)}
|
|
||||||
valueClass="text-xl"
|
valueClass="text-xl"
|
||||||
>
|
>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
|
|||||||
Reference in New Issue
Block a user