master @ 39 LINES
[ HISTORY ] [ UP ]
┌─ TS ───────────────────────────────────────────────────────────────────────┐
│ // Progress bar with an optional threshold marker and status word: │
│ // [▓▓▓▓▓░░│░░] 47% NOMINAL │
│ import { len } from "../../lib/ascii"; │
│ │
│ export interface Props { │
│ /** 0-100. */ │
│ value: number; │
│ /** 0-100; draws a │ marker and flips the status word above it. */ │
│ threshold?: number; │
│ /** Bar width in cells, excluding brackets and the readout. */ │
│ cells?: number; │
│ low?: string; │
│ high?: string; │
│ } │
│ │
│ const clamp = (v: number) => Math.max(0, Math.min(100, Math.round(v))); │
│ │
│ export function buildGauge( │
│ value: number, │
│ { cells = 20, threshold, low = "NOMINAL", high = "CRITICAL" }: Omit<Props, "valu │
│ e"> = {}, │
│ ): string { │
│ const v = clamp(value); │
│ const filled = Math.round((v / 100) * cells); │
│ const bar = [..."▓".repeat(filled) + "░".repeat(cells - filled)]; │
│ │
│ let status = ""; │
│ if (threshold != null) { │
│ const t = Math.min(cells - 1, Math.max(0, Math.round((clamp(threshold) / 100) │
│ * cells))); │
│ bar[t] = "│"; │
│ status = " " + (v >= threshold ? high : low); │
│ } │
│ │
│ return `[${bar.join("")}] ${String(v).padStart(3)}%${status}`; │
│ } │
│ │
│ // "[" + cells + "] 100%" + optional " STATUS" │
│ export const gaugeWidth = (cells = 20, status = "") => │
│ cells + 7 + (status ? 1 + len(status) : 0); │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ TS ─────────────────────────────────┐
│ // Progress bar with an optional threshold m │
│ arker and status word: │
│ // [▓▓▓▓▓░░│░░] 47% NOMINAL │
│ import { len } from "../../lib/ascii"; │
│ │
│ export interface Props { │
│ /** 0-100. */ │
│ value: number; │
│ /** 0-100; draws a │ marker and flips the │
│ status word above it. */ │
│ threshold?: number; │
│ /** Bar width in cells, excluding brackets │
│ and the readout. */ │
│ cells?: number; │
│ low?: string; │
│ high?: string; │
│ } │
│ │
│ const clamp = (v: number) => Math.max(0, Mat │
│ h.min(100, Math.round(v))); │
│ │
│ export function buildGauge( │
│ value: number, │
│ { cells = 20, threshold, low = "NOMINAL", │
│ high = "CRITICAL" }: Omit<Props, "value"> = │
│ {}, │
│ ): string { │
│ const v = clamp(value); │
│ const filled = Math.round((v / 100) * cell │
│ s); │
│ const bar = [..."▓".repeat(filled) + "░".r │
│ epeat(cells - filled)]; │
│ │
│ let status = ""; │
│ if (threshold != null) { │
│ const t = Math.min(cells - 1, Math.max(0 │
│ , Math.round((clamp(threshold) / 100) * cell │
│ s))); │
│ bar[t] = "│"; │
│ status = " " + (v >= threshold ? high : │
│ low); │
│ } │
│ │
│ return `[${bar.join("")}] ${String(v).padS │
│ tart(3)}%${status}`; │
│ } │
│ │
│ // "[" + cells + "] 100%" + optional " STATU │
│ S" │
│ export const gaugeWidth = (cells = 20, statu │
│ s = "") => │
│ cells + 7 + (status ? 1 + len(status) : 0) │
│ ; │
└──────────────────────────────────────────────┘
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET