This commit is contained in:
2026-07-16 22:13:21 +02:00
parent 09848adddc
commit 69229964f4
+26 -14
View File
@@ -99,8 +99,14 @@ type AntStatus = { enabled: boolean; type: string; connected: boolean; direction
// only — per-element length adjustment. Heading/state is polled by the panel. // only — per-element length adjustment. Heading/state is polled by the panel.
function MotorAntennaWidget({ ant, refetch, t }: { ant: AntStatus; refetch: () => void; t: (k: string, v?: any) => string }) { function MotorAntennaWidget({ ant, refetch, t }: { ant: AntStatus; refetch: () => void; t: (k: string, v?: any) => string }) {
const [err, setErr] = useState(''); const [err, setErr] = useState('');
const [elDraft, setElDraft] = useState<Record<number, string>>({}); const [elNum, setElNum] = useState('1'); // element to adjust (1..6)
const [elLen, setElLen] = useState(''); // target length (mm)
const run = (p: Promise<any>) => p.then(refetch).catch((e) => setErr(String(e?.message ?? e))); const run = (p: Promise<any>) => p.then(refetch).catch((e) => setErr(String(e?.message ?? e)));
const setElement = () => {
const n = parseInt(elNum, 10), mm = parseInt(elLen, 10);
if (!Number.isFinite(n) || !Number.isFinite(mm)) return;
run(MotorSetElement(n - 1, mm)); // protocol elements are 0-based (0..5)
};
const isUB = ant.type !== 'steppir'; const isUB = ant.type !== 'steppir';
const dirs: [number, string][] = [[0, 'N'], [1, '180°'], [2, t('station.bi')]]; const dirs: [number, string][] = [[0, 'N'], [1, '180°'], [2, t('station.bi')]];
return ( return (
@@ -135,21 +141,27 @@ function MotorAntennaWidget({ ant, refetch, t }: { ant: AntStatus; refetch: () =
<ArrowDownToLine className="size-3.5" /> {t('station.retract')} <ArrowDownToLine className="size-3.5" /> {t('station.retract')}
</button> </button>
{isUB && ant.elements.length > 0 && ( {isUB && (
<div> <div>
<div className="text-[10px] font-semibold uppercase tracking-wider text-muted-foreground mb-1">{t('station.elements')}</div> <div className="text-[10px] font-semibold uppercase tracking-wider text-muted-foreground mb-1">{t('station.elements')}</div>
<div className="space-y-1.5"> {ant.elements.length > 0 && (
{ant.elements.map((mm, i) => ( <div className="flex flex-wrap gap-1 mb-1.5">
<div key={i} className="flex items-center gap-2"> {ant.elements.map((mm, i) => (
<span className="text-xs w-14 shrink-0 text-muted-foreground">{t('station.element')} {i + 1}</span> <span key={i} className="text-[10px] font-mono rounded bg-muted px-1.5 py-0.5">{t('station.element')} {i + 1}: {mm}mm</span>
<span className="text-xs font-mono w-14 tabular-nums">{mm} mm</span> ))}
<Input value={elDraft[i] ?? ''} placeholder={String(mm)} className="h-7 w-20 font-mono text-xs" </div>
onChange={(e) => setElDraft((d) => ({ ...d, [i]: e.target.value.replace(/[^0-9]/g, '') }))} )}
onKeyDown={(e) => { if (e.key === 'Enter' && elDraft[i]) run(MotorSetElement(i, parseInt(elDraft[i], 10))); }} /> <div className="flex items-center gap-1.5">
<Button size="sm" variant="outline" className="h-7 px-2 text-[11px]" disabled={!elDraft[i]} <Select value={elNum} onValueChange={setElNum}>
onClick={() => run(MotorSetElement(i, parseInt(elDraft[i] || '0', 10)))}>{t('station.set')}</Button> <SelectTrigger className="h-8 w-28"><SelectValue /></SelectTrigger>
</div> <SelectContent>
))} {[1, 2, 3, 4, 5, 6].map((n) => <SelectItem key={n} value={String(n)}>{t('station.element')} {n}</SelectItem>)}
</SelectContent>
</Select>
<Input value={elLen} placeholder="mm" className="h-8 w-20 font-mono text-sm" disabled={!ant.connected}
onChange={(e) => setElLen(e.target.value.replace(/[^0-9]/g, ''))}
onKeyDown={(e) => { if (e.key === 'Enter') setElement(); }} />
<Button size="sm" className="h-8" disabled={!ant.connected || !elLen} onClick={setElement}>{t('station.set')}</Button>
</div> </div>
<p className="text-[10px] text-muted-foreground mt-1">{t('station.elementsHint')}</p> <p className="text-[10px] text-muted-foreground mt-1">{t('station.elementsHint')}</p>
</div> </div>