feat(cluster): hold the list still while it is being read, and stop truncating filters

Two things reported together, both about a list that fights back.

The GRID froze nothing: every spot landed at the top and pushed the rest
down, so a few rows in, the callsign under the pointer had moved by the
time the click arrived. It now stops redrawing as soon as it is scrolled
away from the top and says how many spots are waiting; reaching the top
again, or clicking the notice, releases it. The arrivals are counted by
finding the frozen top row in the live list rather than by comparing
lengths — the list is a ring buffer, so once it is full a length
comparison would report nothing new for the rest of the evening.

The COMMAND BUTTONS were capped at 120 characters. A DXSpider filter
naming the prefixes an operator wants runs well past that, and the field
just stopped accepting keystrokes: the command was saved truncated with
nothing to say why. 500 now, with the full text in the tooltip since the
box cannot show it.
This commit is contained in:
2026-08-24 22:19:54 +02:00
parent f9113b6ad3
commit b2b93e2839
4 changed files with 64 additions and 6 deletions
+8 -1
View File
@@ -4918,11 +4918,18 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
maxLength={24}
onChange={(e) => setMacro(i, { label: e.target.value })}
/>
{/* 500, not 120. A DXSpider filter is a list of prefixes and
an operator's own list of wanted countries runs past a
hundred characters easily the field simply stopped
accepting keystrokes, with nothing to say why, and the
command was saved truncated. The title shows the whole
thing, since the box cannot. */}
<Input
className="h-8 flex-1 min-w-0 font-mono text-xs"
placeholder={t('clu.macroCmd')}
value={m.cmd}
maxLength={120}
title={m.cmd}
maxLength={500}
onChange={(e) => setMacro(i, { cmd: e.target.value })}
/>
</div>