+
{
{/* RIGHT SIDEBAR */}
-
- {/* DX Cluster - primary panel, takes most space */}
-
- setShowDXFilters(true)}
- onHoverSpot={setHoveredSpot}
- hoveredSpot={hoveredSpot}
- showOnMap={mapLayers.showDXPaths}
- onToggleMap={toggleDXPaths}
- />
-
-
- {/* PSKReporter + WSJT-X - digital mode spots */}
-
-
setShowPSKFilters(true)}
- onShowOnMap={(report) => {
- if (report.lat && report.lon) {
- setDxLocation({ lat: report.lat, lon: report.lon, call: report.receiver || report.sender });
- }
- }}
- wsjtxDecodes={wsjtx.decodes}
- wsjtxClients={wsjtx.clients}
- wsjtxQsos={wsjtx.qsos}
- wsjtxStats={wsjtx.stats}
- wsjtxLoading={wsjtx.loading}
- wsjtxEnabled={wsjtx.enabled}
- wsjtxPort={wsjtx.port}
- wsjtxRelayEnabled={wsjtx.relayEnabled}
- wsjtxRelayConnected={wsjtx.relayConnected}
- wsjtxSessionId={wsjtx.sessionId}
- showWSJTXOnMap={mapLayers.showWSJTX}
- onToggleWSJTXMap={toggleWSJTX}
- />
-
-
- {/* DXpeditions */}
-
-
-
-
- {/* POTA */}
-
-
- {/* Contests - at bottom, compact */}
-
-
+ {rightSidebarVisible && (
+
+ {/* DX Cluster - primary panel, takes most space */}
+ {config.panels?.dxCluster?.visible !== false && (
+
+ setShowDXFilters(true)}
+ onHoverSpot={setHoveredSpot}
+ hoveredSpot={hoveredSpot}
+ showOnMap={mapLayers.showDXPaths}
+ onToggleMap={toggleDXPaths}
+ />
+
+ )}
+
+ {/* PSKReporter + WSJT-X - digital mode spots */}
+ {config.panels?.pskReporter?.visible !== false && (
+
+
setShowPSKFilters(true)}
+ onShowOnMap={(report) => {
+ if (report.lat && report.lon) {
+ setDxLocation({ lat: report.lat, lon: report.lon, call: report.receiver || report.sender });
+ }
+ }}
+ wsjtxDecodes={wsjtx.decodes}
+ wsjtxClients={wsjtx.clients}
+ wsjtxQsos={wsjtx.qsos}
+ wsjtxStats={wsjtx.stats}
+ wsjtxLoading={wsjtx.loading}
+ wsjtxEnabled={wsjtx.enabled}
+ wsjtxPort={wsjtx.port}
+ wsjtxRelayEnabled={wsjtx.relayEnabled}
+ wsjtxRelayConnected={wsjtx.relayConnected}
+ wsjtxSessionId={wsjtx.sessionId}
+ showWSJTXOnMap={mapLayers.showWSJTX}
+ onToggleWSJTXMap={toggleWSJTX}
+ />
+
+ )}
+
+ {/* DXpeditions */}
+ {config.panels?.dxpeditions?.visible !== false && (
+
+
+
+ )}
+
+ {/* POTA */}
+ {config.panels?.pota?.visible !== false && (
+
+ )}
+
+ {/* Contests - at bottom, compact */}
+ {config.panels?.contests?.visible !== false && (
+
+
+
+ )}
-
+ )}
)}
diff --git a/src/components/SettingsPanel.jsx b/src/components/SettingsPanel.jsx
index 54bb296..37b0d80 100644
--- a/src/components/SettingsPanel.jsx
+++ b/src/components/SettingsPanel.jsx
@@ -23,6 +23,19 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => {
const [layers, setLayers] = useState([]);
const [activeTab, setActiveTab] = useState('station');
+ // Panel settings
+ const [panels, setPanels] = useState(config?.panels || {
+ deLocation: { visible: true, size: 1.0 },
+ dxLocation: { visible: true, size: 1.0 },
+ solar: { visible: true, size: 1.0 },
+ propagation: { visible: true, size: 1.0 },
+ dxCluster: { visible: true, size: 2.0 },
+ pskReporter: { visible: true, size: 1.0 },
+ dxpeditions: { visible: true, size: 1.0 },
+ pota: { visible: true, size: 1.0 },
+ contests: { visible: true, size: 1.0 }
+ });
+
useEffect(() => {
if (config) {
setCallsign(config.callsign || '');
@@ -33,6 +46,17 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => {
setLayout(config.layout || 'modern');
setTimezone(config.timezone || '');
setDxClusterSource(config.dxClusterSource || 'dxspider-proxy');
+ setPanels(config.panels || {
+ deLocation: { visible: true, size: 1.0 },
+ dxLocation: { visible: true, size: 1.0 },
+ solar: { visible: true, size: 1.0 },
+ propagation: { visible: true, size: 1.0 },
+ dxCluster: { visible: true, size: 2.0 },
+ pskReporter: { visible: true, size: 1.0 },
+ dxpeditions: { visible: true, size: 1.0 },
+ pota: { visible: true, size: 1.0 },
+ contests: { visible: true, size: 1.0 }
+ });
if (config.location?.lat && config.location?.lon) {
setGridSquare(calculateGridSquare(config.location.lat, config.location.lon));
}
@@ -145,6 +169,26 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => {
}
};
+ const handleTogglePanel = (panelId) => {
+ setPanels(prev => ({
+ ...prev,
+ [panelId]: {
+ ...prev[panelId],
+ visible: !prev[panelId].visible
+ }
+ }));
+ };
+
+ const handlePanelSizeChange = (panelId, size) => {
+ setPanels(prev => ({
+ ...prev,
+ [panelId]: {
+ ...prev[panelId],
+ size: parseFloat(size)
+ }
+ }));
+ };
+
const handleSave = () => {
onSave({
...config,
@@ -154,7 +198,8 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => {
theme,
layout,
timezone,
- dxClusterSource
+ dxClusterSource,
+ panels
});
onClose();
};
@@ -237,6 +282,23 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => {
>
⌇ Station
+