chore: add prettier with config and format all files
This commit is contained in:
@@ -5,18 +5,18 @@ import type { ColorMap } from '@/lib/colors';
|
||||
import { getItemColor } from '@/lib/colors';
|
||||
|
||||
const SEMANTIC_GREEN = '#4ade80';
|
||||
const SEMANTIC_RED = '#f87171';
|
||||
const SEMANTIC_RED = '#f87171';
|
||||
|
||||
export interface SeriesStyle {
|
||||
color: string;
|
||||
dash: number[] | undefined;
|
||||
dash: number[] | undefined;
|
||||
}
|
||||
|
||||
export function getSeriesStyle(
|
||||
key: string,
|
||||
uCombs: number,
|
||||
uItems: number,
|
||||
uSigs: number,
|
||||
key: string,
|
||||
uCombs: number,
|
||||
uItems: number,
|
||||
uSigs: number,
|
||||
colorMap: ColorMap = new Map(),
|
||||
): SeriesStyle {
|
||||
const [combinator, item_key, sig] = key.split('::');
|
||||
@@ -25,9 +25,15 @@ export function getSeriesStyle(
|
||||
return { color: sig === 'green' ? SEMANTIC_GREEN : SEMANTIC_RED, dash: undefined };
|
||||
}
|
||||
if (uItems > 1) {
|
||||
return { color: getItemColor(item_key, colorMap), dash: uSigs > 1 && sig === 'red' ? [4, 2] : undefined };
|
||||
return {
|
||||
color: getItemColor(item_key, colorMap),
|
||||
dash: uSigs > 1 && sig === 'red' ? [4, 2] : undefined,
|
||||
};
|
||||
}
|
||||
return { color: getItemColor(combinator, colorMap), dash: uSigs > 1 && sig === 'red' ? [4, 2] : undefined };
|
||||
return {
|
||||
color: getItemColor(combinator, colorMap),
|
||||
dash: uSigs > 1 && sig === 'red' ? [4, 2] : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,10 +41,10 @@ export function getSeriesStyle(
|
||||
* @param displayName Pre-resolved localized name for the item.
|
||||
*/
|
||||
export function getSeriesLabel(
|
||||
key: string,
|
||||
uCombs: number,
|
||||
uItems: number,
|
||||
uSigs: number,
|
||||
key: string,
|
||||
uCombs: number,
|
||||
uItems: number,
|
||||
uSigs: number,
|
||||
displayName: string,
|
||||
): string {
|
||||
const [combinator, , sig] = key.split('::');
|
||||
@@ -46,7 +52,7 @@ export function getSeriesLabel(
|
||||
const parts: string[] = [];
|
||||
if (uItems > 1) parts.push(displayName);
|
||||
if (uCombs > 1) parts.push(`(${combinator})`);
|
||||
if (uSigs > 1) parts.push(`[${sig}]`);
|
||||
if (uSigs > 1) parts.push(`[${sig}]`);
|
||||
return parts.join(' ');
|
||||
}
|
||||
|
||||
@@ -54,8 +60,8 @@ export function getSeriesLabel(
|
||||
|
||||
export const AXIS_BASE: uPlot.Axis = {
|
||||
stroke: '#9ca3af',
|
||||
ticks: { stroke: '#374151' },
|
||||
grid: { stroke: '#1f2937' },
|
||||
ticks: { stroke: '#374151' },
|
||||
grid: { stroke: '#1f2937' },
|
||||
};
|
||||
|
||||
export const CURSOR_NO_DRAG: uPlot.Cursor = {
|
||||
@@ -67,17 +73,19 @@ export const CURSOR_NO_DRAG: uPlot.Cursor = {
|
||||
* 'log' uses arcsinh distribution (distr:4) — handles negatives, zero, positives.
|
||||
*/
|
||||
export function makeYScale(
|
||||
yMin: number | null,
|
||||
yMax: number | null,
|
||||
yMin: number | null,
|
||||
yMax: number | null,
|
||||
yScale: ChartConfig['y_scale'] = 'linear',
|
||||
): uPlot.Scale {
|
||||
if (yScale === 'log') {
|
||||
return {
|
||||
distr: 4,
|
||||
asinh: 1,
|
||||
...(yMin !== null || yMax !== null ? {
|
||||
range: (_u, dataMin, dataMax) => [yMin ?? dataMin, yMax ?? dataMax],
|
||||
} : {}),
|
||||
...(yMin !== null || yMax !== null
|
||||
? {
|
||||
range: (_u, dataMin, dataMax) => [yMin ?? dataMin, yMax ?? dataMax],
|
||||
}
|
||||
: {}),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,53 +93,61 @@ export function makeYScale(
|
||||
return {
|
||||
dir: 1,
|
||||
range: (_u, dataMin, dataMax) => {
|
||||
const lo = yMin ?? (dataMin ?? 0);
|
||||
const hi = yMax ?? (dataMax ?? 1);
|
||||
const lo = yMin ?? dataMin ?? 0;
|
||||
const hi = yMax ?? dataMax ?? 1;
|
||||
if (lo === hi) return [lo - 1, hi + 1];
|
||||
const pad = (yMin == null || yMax == null) ? Math.abs(hi - lo) * 0.05 : 0;
|
||||
const pad = yMin == null || yMax == null ? Math.abs(hi - lo) * 0.05 : 0;
|
||||
return [lo - pad, hi + pad];
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function makeAnnotationHooks(
|
||||
sessionXs: number[],
|
||||
sessionXs: number[],
|
||||
alertThresholds: number[],
|
||||
): uPlot.Options['hooks'] {
|
||||
return {
|
||||
draw: [(u) => {
|
||||
const { ctx, bbox } = u;
|
||||
ctx.save();
|
||||
draw: [
|
||||
(u) => {
|
||||
const { ctx, bbox } = u;
|
||||
ctx.save();
|
||||
|
||||
ctx.strokeStyle = 'rgba(251,191,36,0.6)';
|
||||
ctx.lineWidth = 1;
|
||||
ctx.setLineDash([4, 4]);
|
||||
for (const sx of sessionXs) {
|
||||
const cx = Math.round(u.valToPos(sx, 'x', true));
|
||||
ctx.beginPath(); ctx.moveTo(cx, bbox.top); ctx.lineTo(cx, bbox.top + bbox.height); ctx.stroke();
|
||||
}
|
||||
ctx.strokeStyle = 'rgba(251,191,36,0.6)';
|
||||
ctx.lineWidth = 1;
|
||||
ctx.setLineDash([4, 4]);
|
||||
for (const sx of sessionXs) {
|
||||
const cx = Math.round(u.valToPos(sx, 'x', true));
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(cx, bbox.top);
|
||||
ctx.lineTo(cx, bbox.top + bbox.height);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
ctx.strokeStyle = 'rgba(248,113,113,0.7)';
|
||||
ctx.setLineDash([6, 3]);
|
||||
for (const t of alertThresholds) {
|
||||
const cy = Math.round(u.valToPos(t, 'y', true));
|
||||
ctx.beginPath(); ctx.moveTo(bbox.left, cy); ctx.lineTo(bbox.left + bbox.width, cy); ctx.stroke();
|
||||
}
|
||||
ctx.strokeStyle = 'rgba(248,113,113,0.7)';
|
||||
ctx.setLineDash([6, 3]);
|
||||
for (const t of alertThresholds) {
|
||||
const cy = Math.round(u.valToPos(t, 'y', true));
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(bbox.left, cy);
|
||||
ctx.lineTo(bbox.left + bbox.width, cy);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
ctx.restore();
|
||||
}],
|
||||
ctx.restore();
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
export function makeSignalsSeries(
|
||||
keys: string[],
|
||||
timeMode: 'real' | 'tick',
|
||||
keys: string[],
|
||||
timeMode: 'real' | 'tick',
|
||||
resolveName: (key: string) => string,
|
||||
colorMap: ColorMap = new Map(),
|
||||
colorMap: ColorMap = new Map(),
|
||||
): uPlot.Series[] {
|
||||
const uCombs = new Set(keys.map(k => k.split('::')[0])).size;
|
||||
const uItems = new Set(keys.map(k => k.split('::')[1])).size;
|
||||
const uSigs = new Set(keys.map(k => k.split('::')[2])).size;
|
||||
const uCombs = new Set(keys.map((k) => k.split('::')[0])).size;
|
||||
const uItems = new Set(keys.map((k) => k.split('::')[1])).size;
|
||||
const uSigs = new Set(keys.map((k) => k.split('::')[2])).size;
|
||||
|
||||
const xSeries: uPlot.Series = {
|
||||
label: timeMode === 'tick' ? 'Tick' : 'Time',
|
||||
@@ -143,13 +159,13 @@ export function makeSignalsSeries(
|
||||
|
||||
return [
|
||||
xSeries,
|
||||
...keys.map(k => {
|
||||
...keys.map((k) => {
|
||||
const [, item_key] = k.split('::');
|
||||
const { color, dash } = getSeriesStyle(k, uCombs, uItems, uSigs, colorMap);
|
||||
return {
|
||||
label: getSeriesLabel(k, uCombs, uItems, uSigs, resolveName(item_key)),
|
||||
label: getSeriesLabel(k, uCombs, uItems, uSigs, resolveName(item_key)),
|
||||
stroke: color,
|
||||
width: 1.5,
|
||||
width: 1.5,
|
||||
dash,
|
||||
};
|
||||
}),
|
||||
@@ -160,16 +176,17 @@ export function makeSignalsAxes(timeMode: 'real' | 'tick', locale?: string): uPl
|
||||
return [
|
||||
{
|
||||
...AXIS_BASE,
|
||||
values: timeMode === 'real'
|
||||
? (_u: uPlot, vals: (number | null)[]) =>
|
||||
vals.map(v => v == null ? '' : new Date(v * 1000).toLocaleTimeString())
|
||||
: (_u: uPlot, vals: (number | null)[]) =>
|
||||
vals.map(v => v == null ? '' : formatSI(v, locale)),
|
||||
values:
|
||||
timeMode === 'real'
|
||||
? (_u: uPlot, vals: (number | null)[]) =>
|
||||
vals.map((v) => (v == null ? '' : new Date(v * 1000).toLocaleTimeString()))
|
||||
: (_u: uPlot, vals: (number | null)[]) =>
|
||||
vals.map((v) => (v == null ? '' : formatSI(v, locale))),
|
||||
},
|
||||
{
|
||||
...AXIS_BASE,
|
||||
values: (_u: uPlot, vals: (number | null)[]) =>
|
||||
vals.map(v => v == null ? '' : formatSI(v, locale)),
|
||||
vals.map((v) => (v == null ? '' : formatSI(v, locale))),
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user