Newer
Older
gn-synapse / frontend / src / ui.js
/** Общие мелочи для админ-разделов: бейджи статусов, формат времени, сокращение. */

/** Разрешённые варианты кита: primary, secondary, accent, success, warning, danger, error, info. */
export const statusVariant = {
  // delivery
  delivered: "success",
  pending: "info",
  failed: "danger",
  skipped: "warning",
  // event
  queued: "info",
  processing: "info",
  done: "success",
};

export function badgeFor(status) {
  return { label: status, variant: statusVariant[status] || "secondary" };
}

export function fmtTime(iso) {
  if (!iso) return "—";
  return new Date(iso).toLocaleString("ru-RU", {
    day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit",
  });
}

export function truncate(text, n = 80) {
  if (!text) return "";
  return text.length > n ? `${text.slice(0, n - 1)}…` : text;
}

/** JSON в одну строку для ячейки таблицы. */
export function shortJson(value, n = 60) {
  if (!value || (typeof value === "object" && !Object.keys(value).length)) return "—";
  const text = JSON.stringify(value);
  return truncate(text, n);
}

/** Разбор строки с запятыми/пробелами в массив непустых токенов. */
export function parseList(text) {
  return (text || "")
    .split(/[,\n]+/)
    .map((s) => s.trim())
    .filter(Boolean);
}