[feat](trx-frontend-http): add map filter panel toggle
Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -3748,6 +3748,7 @@ let selectedLocatorPulseRaf = null;
|
|||||||
let mapFullscreenListenerBound = false;
|
let mapFullscreenListenerBound = false;
|
||||||
let mapP2pRadioPathsEnabled = loadSetting("mapP2pRadioPathsEnabled", true) !== false;
|
let mapP2pRadioPathsEnabled = loadSetting("mapP2pRadioPathsEnabled", true) !== false;
|
||||||
let mapDecodeContactPathsEnabled = loadSetting("mapDecodeContactPathsEnabled", true) !== false;
|
let mapDecodeContactPathsEnabled = loadSetting("mapDecodeContactPathsEnabled", true) !== false;
|
||||||
|
let mapOverlayPanelVisible = loadSetting("mapOverlayPanelVisible", true) !== false;
|
||||||
const stationMarkers = new Map();
|
const stationMarkers = new Map();
|
||||||
const locatorMarkers = new Map();
|
const locatorMarkers = new Map();
|
||||||
const decodeContactPaths = new Map();
|
const decodeContactPaths = new Map();
|
||||||
@@ -4630,6 +4631,18 @@ function updateMapFullscreenButton() {
|
|||||||
btn.textContent = mapIsFullscreen() ? "Exit Fullscreen" : "Fullscreen";
|
btn.textContent = mapIsFullscreen() ? "Exit Fullscreen" : "Fullscreen";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyMapOverlayPanelVisibility() {
|
||||||
|
const panel = document.querySelector("#map-stage .map-overlay-panel");
|
||||||
|
if (!panel) return;
|
||||||
|
panel.classList.toggle("is-hidden", !mapOverlayPanelVisible);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateMapOverlayToggleButton() {
|
||||||
|
const btn = document.getElementById("map-overlay-toggle-btn");
|
||||||
|
if (!btn) return;
|
||||||
|
btn.textContent = mapOverlayPanelVisible ? "Hide Filters" : "Show Filters";
|
||||||
|
}
|
||||||
|
|
||||||
async function toggleMapFullscreen() {
|
async function toggleMapFullscreen() {
|
||||||
const stage = mapStageEl();
|
const stage = mapStageEl();
|
||||||
if (!stage) return;
|
if (!stage) return;
|
||||||
@@ -4804,6 +4817,7 @@ function initAprsMap() {
|
|||||||
const mapP2pPathsToggleEl = document.getElementById("map-p2p-paths-toggle");
|
const mapP2pPathsToggleEl = document.getElementById("map-p2p-paths-toggle");
|
||||||
const mapContactPathsToggleEl = document.getElementById("map-contact-paths-toggle");
|
const mapContactPathsToggleEl = document.getElementById("map-contact-paths-toggle");
|
||||||
const fullscreenBtn = document.getElementById("map-fullscreen-btn");
|
const fullscreenBtn = document.getElementById("map-fullscreen-btn");
|
||||||
|
const overlayToggleBtn = document.getElementById("map-overlay-toggle-btn");
|
||||||
if (locatorPhaseEl) {
|
if (locatorPhaseEl) {
|
||||||
locatorPhaseEl.addEventListener("click", (e) => {
|
locatorPhaseEl.addEventListener("click", (e) => {
|
||||||
const btn = e.target.closest(".map-locator-phase-btn[data-phase]");
|
const btn = e.target.closest(".map-locator-phase-btn[data-phase]");
|
||||||
@@ -4881,6 +4895,16 @@ function initAprsMap() {
|
|||||||
});
|
});
|
||||||
updateMapFullscreenButton();
|
updateMapFullscreenButton();
|
||||||
}
|
}
|
||||||
|
applyMapOverlayPanelVisibility();
|
||||||
|
updateMapOverlayToggleButton();
|
||||||
|
if (overlayToggleBtn) {
|
||||||
|
overlayToggleBtn.addEventListener("click", () => {
|
||||||
|
mapOverlayPanelVisible = !mapOverlayPanelVisible;
|
||||||
|
saveSetting("mapOverlayPanelVisible", mapOverlayPanelVisible);
|
||||||
|
applyMapOverlayPanelVisibility();
|
||||||
|
updateMapOverlayToggleButton();
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!mapFullscreenListenerBound) {
|
if (!mapFullscreenListenerBound) {
|
||||||
const onFullscreenChange = () => {
|
const onFullscreenChange = () => {
|
||||||
updateMapFullscreenButton();
|
updateMapFullscreenButton();
|
||||||
|
|||||||
@@ -695,6 +695,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" id="map-fullscreen-btn" class="map-fullscreen-btn">Fullscreen</button>
|
<button type="button" id="map-fullscreen-btn" class="map-fullscreen-btn">Fullscreen</button>
|
||||||
|
<button type="button" id="map-overlay-toggle-btn" class="map-overlay-toggle-btn">Hide Filters</button>
|
||||||
<div id="aprs-map"></div>
|
<div id="aprs-map"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1254,6 +1254,13 @@ small { color: var(--text-muted); }
|
|||||||
backdrop-filter: blur(14px);
|
backdrop-filter: blur(14px);
|
||||||
-webkit-backdrop-filter: blur(14px);
|
-webkit-backdrop-filter: blur(14px);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
transition: opacity 140ms ease, transform 140ms ease, visibility 140ms ease;
|
||||||
|
}
|
||||||
|
.map-overlay-panel.is-hidden {
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
transform: translateY(-0.25rem);
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
.map-fullscreen-btn {
|
.map-fullscreen-btn {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -1280,6 +1287,31 @@ small { color: var(--text-muted); }
|
|||||||
border-color: color-mix(in srgb, var(--accent-green) 34%, var(--border-light));
|
border-color: color-mix(in srgb, var(--accent-green) 34%, var(--border-light));
|
||||||
color: var(--text-heading);
|
color: var(--text-heading);
|
||||||
}
|
}
|
||||||
|
.map-overlay-toggle-btn {
|
||||||
|
position: absolute;
|
||||||
|
top: 3rem;
|
||||||
|
right: 0.7rem;
|
||||||
|
z-index: 410;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 1.9rem;
|
||||||
|
padding: 0.18rem 0.65rem;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 1px solid color-mix(in srgb, var(--border-light) 74%, transparent);
|
||||||
|
background: color-mix(in srgb, var(--card-bg) 82%, transparent);
|
||||||
|
color: var(--text);
|
||||||
|
font-size: 0.76rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
cursor: pointer;
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
-webkit-backdrop-filter: blur(8px);
|
||||||
|
}
|
||||||
|
.map-overlay-toggle-btn:hover {
|
||||||
|
border-color: color-mix(in srgb, var(--accent-green) 34%, var(--border-light));
|
||||||
|
color: var(--text-heading);
|
||||||
|
}
|
||||||
#map-stage:fullscreen,
|
#map-stage:fullscreen,
|
||||||
#map-stage:-webkit-full-screen,
|
#map-stage:-webkit-full-screen,
|
||||||
#map-stage.map-fake-fullscreen {
|
#map-stage.map-fake-fullscreen {
|
||||||
@@ -2283,6 +2315,10 @@ button:focus-visible, input:focus-visible, select:focus-visible {
|
|||||||
padding: 0.6rem 0.65rem;
|
padding: 0.6rem 0.65rem;
|
||||||
border-radius: 0.7rem;
|
border-radius: 0.7rem;
|
||||||
}
|
}
|
||||||
|
.map-overlay-toggle-btn {
|
||||||
|
top: 3rem;
|
||||||
|
right: 0.55rem;
|
||||||
|
}
|
||||||
.map-locator-filter-group {
|
.map-locator-filter-group {
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user