After Stop (or at the cap, or from Settings → Diagnosztika's past sessions) one dialog drafts the issue: title, description, the steps drafted from the session's markers and page changes (a marker without a label is named by its time), the environment (version, browser, system, window, language). Beside it, what goes with it: the browser and server logs — each reviewable line by line, an unticked line is not sent — and the screenshots, removable, with paste / drop / pick to add more. - it saves as it goes (debug_sessions.draft, migration 0090): the rendered markdown in the user's language, the excluded rows, and its own fields to reopen as it was; a sent session is read-only - the zip export (issue.md, client.log, server.log, screenshots) is built from the saved draft by app/issues/bundle.py — the one definition the Gitea delivery (S4) will share; .log, not .jsonl, which Gitea refuses - the log line's level tags and clock move to components/logLineParts so the review list draws a level the way both log viewers do
22 lines
1.0 KiB
TypeScript
22 lines
1.0 KiB
TypeScript
import type { Level } from "../lib/log";
|
|
|
|
// What a log line is drawn with — the level tags and the clock — shared by LogLine (both log
|
|
// viewers) and the issue composer's review list, so a level reads the same everywhere. Apart from
|
|
// LogLine.tsx because a component file exports only components (react-refresh).
|
|
|
|
export const LEVEL_TAG: Record<Level, { text: string; className: string }> = {
|
|
TRACE: { text: "TRACE", className: "text-muted opacity-80" },
|
|
DEBUG: { text: "DEBUG", className: "text-muted" },
|
|
INFO: { text: "INFO", className: "text-info" },
|
|
WARNING: { text: "WARN", className: "text-warn" },
|
|
ERROR: { text: "ERROR", className: "text-danger" },
|
|
CRITICAL: { text: "FATAL", className: "text-danger" },
|
|
};
|
|
|
|
/** `HH:MM:SS.mmm` in local time — a log is read to the millisecond. */
|
|
export function logClock(ts: string): string {
|
|
const d = new Date(ts);
|
|
const pad = (n: number, w = 2) => String(n).padStart(w, "0");
|
|
return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}`;
|
|
}
|