diff --git a/changelog.json b/changelog.json index d6b5b4a..a614bf8 100644 --- a/changelog.json +++ b/changelog.json @@ -10,7 +10,8 @@ "Motorized antennas (Ultrabeam and SteppIR): tracking now offers the three modes the SteppIR controller software has — every frequency change, past a step of 25/50/100 kHz, or only when the band changes. Existing setups keep the step mode they already had.", "Motorized antennas: each covered band now has its own tune frequency, set in a box under the band in Settings, and that is where the band button in Station Control sends the antenna. Left empty a band keeps its default, and a frequency that is not in its band is refused rather than sent to the elements.", "Awards: a single award can now be exported on its own, next to the whole-catalogue export. Sharing one award meant handing over your entire catalogue.", - "Awards: each reference now has its own validity window, so a reference that ceased to exist counts for QSOs made while it existed and not for later ones. The dates were already stored and were never applied; left empty a reference follows the award's own window." + "Awards: each reference now has its own validity window, so a reference that ceased to exist counts for QSOs made while it existed and not for later ones. The dates were already stored and were never applied; left empty a reference follows the award's own window.", + "DX cluster: the \"No colour on worked\" and \"Colour unworked here\" options are withdrawn from the filter panel and are off for everyone." ], "fr": [ "Les QSO enregistrés depuis WSJT-X portent désormais la météo spatiale et la distance, comme ceux saisis à la main. Le chemin UDP posait le profil station, le DXCC et les défauts QSL mais ni SFI, ni A, ni K, ni distance — un opérateur en numérique avait donc ces champs vides sur tout son log. La météo spatiale n est posée que sur un contact de moins d un jour : sinon un logiciel qui rediffuse son historique se verrait attribuer les relevés de ce matin sur des contacts du mois dernier.", @@ -20,7 +21,8 @@ "Antennes motorisées (Ultrabeam et SteppIR) : le suivi propose désormais les trois modes du logiciel du contrôleur SteppIR — à chaque changement de fréquence, au-delà d un pas de 25/50/100 kHz, ou seulement au changement de bande. Les installations existantes conservent le mode par pas qu elles avaient déjà.", "Antennes motorisées : chaque bande couverte a désormais sa propre fréquence d accord, saisie dans une case sous la bande dans les Réglages, et c est là que le bouton de bande du Contrôle station envoie l antenne. Laissée vide, une bande garde son défaut, et une fréquence hors de sa bande est refusée plutôt qu envoyée aux éléments.", "Diplômes : un diplôme peut désormais être exporté seul, à côté de l export du catalogue complet. Partager un seul diplôme obligeait à livrer tout son catalogue.", - "Diplômes : chaque référence a désormais sa propre fenêtre de validité, si bien qu une référence qui a cessé d exister compte pour les QSO faits de son vivant et pas pour les suivants. Les dates étaient déjà stockées et n étaient jamais appliquées ; laissée vide, une référence suit la fenêtre du diplôme." + "Diplômes : chaque référence a désormais sa propre fenêtre de validité, si bien qu une référence qui a cessé d exister compte pour les QSO faits de son vivant et pas pour les suivants. Les dates étaient déjà stockées et n étaient jamais appliquées ; laissée vide, une référence suit la fenêtre du diplôme.", + "Cluster DX : les options « Pas de couleur sur les faits » et « Colorer les non faits ici » sont retirées du panneau de filtres et désactivées pour tout le monde." ] }, { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2b84ff0..dcc8819 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -90,7 +90,7 @@ import { ExportFieldsDialog } from '@/components/ExportFieldsDialog'; import { ShutdownProgress } from '@/components/ShutdownProgress'; import { ClusterGrid } from '@/components/ClusterGrid'; import { cleanSpotter, inferSpotMode, spotModeCategory, spotStatusKey } from '@/lib/spot'; -import { applySpotDisplay, readSpotDisplayOptions } from '@/lib/spotDisplay'; +import { applySpotDisplay, readSpotDisplayOptions, SPOT_DISPLAY_OPTIONS_EXPOSED } from '@/lib/spotDisplay'; import { WorkedBeforeGrid } from '@/components/WorkedBeforeGrid'; import { NetControlPanel } from '@/components/NetControlPanel'; import { ContestPanel, CONTEST_DEFAULT, type ContestSession } from '@/components/ContestPanel'; @@ -1497,8 +1497,11 @@ export default function App() { // beside Hide worked and not among the status chips. const [clusterLotwOnly, setClusterLotwOnly] = useState(() => localStorage.getItem('opslog.clusterLotwOnly') === '1'); const [clusterSpotterConts, setClusterSpotterConts] = useState>(() => lsSet('opslog.clusterSpotterCont')); - const [clusterMuteWorked, setClusterMuteWorked] = useState(() => localStorage.getItem('opslog.clusterMuteWorked') === '1'); - const [clusterSlotHighlight, setClusterSlotHighlight] = useState(() => localStorage.getItem('opslog.clusterSlotHighlight') === '1'); + // Read through lib/spotDisplay, not straight from localStorage: while the two + // options are withdrawn it answers false, so the cluster list cannot end up + // applying an option the operator can no longer see or switch off. + const [clusterMuteWorked, setClusterMuteWorked] = useState(() => readSpotDisplayOptions().muteWorked); + const [clusterSlotHighlight, setClusterSlotHighlight] = useState(() => readSpotDisplayOptions().slotHighlight); const [clusterStatusFilter, setClusterStatusFilter] = useState>(() => lsSet('opslog.clusterStatusFilter')); // Mode filter chips. Empty set = show every mode. Categories map the // inferred per-spot mode onto SSB (phone) / CW / DATA (digital). @@ -4843,8 +4846,11 @@ export default function App() {
{fSwitch(t('clu.hideWorked'), clusterHideWorked, setClusterHideWorked)} {fSwitch(t('clu.groupDup'), clusterGroup, setClusterGroup)} - {fSwitch(t('clu.muteWorkedShort'), clusterMuteWorked, (v) => { setClusterMuteWorked(v); writeUiPref('opslog.clusterMuteWorked', v ? '1' : '0'); })} - {fSwitch(t('clu.slotHighlightShort'), clusterSlotHighlight, (v) => { setClusterSlotHighlight(v); writeUiPref('opslog.clusterSlotHighlight', v ? '1' : '0'); })} + {/* The two display options are withdrawn for now — the flag is in + lib/spotDisplay, and it also forces them off for the band map, so + there is one place to flip when they come back. */} + {SPOT_DISPLAY_OPTIONS_EXPOSED && fSwitch(t('clu.muteWorkedShort'), clusterMuteWorked, (v) => { setClusterMuteWorked(v); writeUiPref('opslog.clusterMuteWorked', v ? '1' : '0'); })} + {SPOT_DISPLAY_OPTIONS_EXPOSED && fSwitch(t('clu.slotHighlightShort'), clusterSlotHighlight, (v) => { setClusterSlotHighlight(v); writeUiPref('opslog.clusterSlotHighlight', v ? '1' : '0'); })} {fSwitch(t('clu.lotwOnly'), clusterLotwOnly, (v) => { setClusterLotwOnly(v); writeUiPref('opslog.clusterLotwOnly', v ? '1' : '0'); })}
diff --git a/frontend/src/lib/spotDisplay.ts b/frontend/src/lib/spotDisplay.ts index 0ce6877..c44426d 100644 --- a/frontend/src/lib/spotDisplay.ts +++ b/frontend/src/lib/spotDisplay.ts @@ -13,7 +13,17 @@ export type SpotDisplayOptions = { muteWorked: boolean; slotHighlight: boolean }; +// Both options are withdrawn from the filter panel for now. The machinery below +// is deliberately kept whole — it is correct and hard-won — so putting the two +// switches back is this one flag and the block they came from in App.tsx. +// +// The saved preferences are left untouched in localStorage rather than cleared: +// an operator who had either turned on gets them back exactly as they were the +// day the options return, instead of silently starting from off. +export const SPOT_DISPLAY_OPTIONS_EXPOSED = false; + export function readSpotDisplayOptions(): SpotDisplayOptions { + if (!SPOT_DISPLAY_OPTIONS_EXPOSED) return { muteWorked: false, slotHighlight: false }; try { return { muteWorked: localStorage.getItem('opslog.clusterMuteWorked') === '1',