Add missing SolvedVariablesBlock component for properties panel.
Some checks failed
CI / check (push) Has been cancelled
Some checks failed
CI / check (push) Has been cancelled
Fixes the UI compile break from referencing an undefined helper when showing z_dp and other solved actuators. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -977,6 +977,43 @@ function ModelicaResultsView({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function SolvedVariablesBlock({
|
||||||
|
items,
|
||||||
|
title,
|
||||||
|
}: {
|
||||||
|
items: SolvedVariable[];
|
||||||
|
title: string;
|
||||||
|
}) {
|
||||||
|
if (items.length === 0) return null;
|
||||||
|
return (
|
||||||
|
<div className="overflow-hidden rounded-md border border-[var(--line)]">
|
||||||
|
<div className="border-b border-[var(--line)] bg-[var(--chrome-2)] px-2 py-1 text-[9px] font-semibold uppercase tracking-wide text-[var(--ink-faint)]">
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
<table className="w-full text-[10px]">
|
||||||
|
<thead>
|
||||||
|
<tr className="text-left text-[9px] text-[var(--ink-faint)]">
|
||||||
|
<th className="px-1.5 py-1 font-medium">Var</th>
|
||||||
|
<th className="px-1 py-1 font-medium">Value</th>
|
||||||
|
<th className="px-1 py-1 font-medium">Min</th>
|
||||||
|
<th className="px-1 py-1 font-medium">Max</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{items.map((sv) => (
|
||||||
|
<tr key={sv.id} className="border-t border-[var(--line)]">
|
||||||
|
<td className="mono px-1.5 py-1 text-[var(--ink)]">{sv.variable}</td>
|
||||||
|
<td className="mono px-1 py-1 text-[var(--ink)]">{fmtOpt(sv.value, 4)}</td>
|
||||||
|
<td className="mono px-1 py-1 text-[var(--ink-dim)]">{fmtOpt(sv.min, 3)}</td>
|
||||||
|
<td className="mono px-1 py-1 text-[var(--ink-dim)]">{fmtOpt(sv.max, 3)}</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function MiniMetric({ label, value }: { label: string; value: string }) {
|
function MiniMetric({ label, value }: { label: string; value: string }) {
|
||||||
return (
|
return (
|
||||||
<div className="rounded border border-[var(--line)] bg-[var(--chrome-2)] px-1.5 py-1">
|
<div className="rounded border border-[var(--line)] bg-[var(--chrome-2)] px-1.5 py-1">
|
||||||
@@ -989,3 +1026,50 @@ function MiniMetric({ label, value }: { label: string; value: string }) {
|
|||||||
function fmtOpt(v: number | null | undefined, digits: number): string {
|
function fmtOpt(v: number | null | undefined, digits: number): string {
|
||||||
return typeof v === "number" && Number.isFinite(v) ? v.toFixed(digits) : "—";
|
return typeof v === "number" && Number.isFinite(v) ? v.toFixed(digits) : "—";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a solved-unknown value compactly: 4 significant digits with trailing
|
||||||
|
* zeros trimmed (e.g. 1.024, 0.62, 0.02, 2). Non-finite → "—".
|
||||||
|
*/
|
||||||
|
function fmtSolved(v: number): string {
|
||||||
|
if (!Number.isFinite(v)) return "—";
|
||||||
|
return Number(v.toPrecision(4)).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compact block listing solver-computed unknowns for the selected component.
|
||||||
|
* Renders one row per variable: `variable = value (min..max)`. Only shown when
|
||||||
|
* the component owns at least one solved variable.
|
||||||
|
*/
|
||||||
|
function SolvedVariablesBlock({
|
||||||
|
items,
|
||||||
|
title,
|
||||||
|
}: {
|
||||||
|
items: SolvedVariable[];
|
||||||
|
title: string;
|
||||||
|
}) {
|
||||||
|
if (items.length === 0) return null;
|
||||||
|
return (
|
||||||
|
<div className="rounded-md border border-[var(--line)] bg-[var(--chrome-2)] px-2 py-1.5">
|
||||||
|
<div className="mb-1 text-[9px] font-semibold uppercase tracking-wide text-[var(--ink-faint)]">
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
<div className="space-y-0.5">
|
||||||
|
{items.map((sv) => (
|
||||||
|
<div
|
||||||
|
key={sv.id}
|
||||||
|
className="mono flex items-baseline gap-1.5 text-[10px]"
|
||||||
|
title={`${sv.id} ∈ [${sv.min}, ${sv.max}]`}
|
||||||
|
>
|
||||||
|
<span className="text-[var(--ink)]">{sv.variable}</span>
|
||||||
|
<span className="text-[var(--ink-faint)]">=</span>
|
||||||
|
<span className="tabular-nums text-[var(--accent)]">{fmtSolved(sv.value)}</span>
|
||||||
|
<span className="tabular-nums text-[var(--ink-faint)]">
|
||||||
|
({fmtSolved(sv.min)}..{fmtSolved(sv.max)})
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user