mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 18:34:02 +00:00
- Google 3D: the OPEN button re-measures a ground whose tiles are still loading (a few times, a second apart) and on a map change, not only after the next camera move. - Mapillary: two mounts on one host during the first download share one build instead of leaking a second WebGL viewer. - Retired floating-panel keys (v8 panelPos, panelFloatHintShown) are dropped from localStorage; dead inline-position resets, the drag JSDoc and the dead qa-ui-disposal observer branch are gone. - Docs: z ladder, panel chrome, position storage and the fixture gate's actual coverage; changelog fragment for #974 (old .gev-cache/mapillary can be deleted). - ru/es: the layer is named as everywhere else in the UI. - Fixtures and test fakes: unused exports removed; a fake credit removal of an absent credit no longer drops another one; the tile test reset frees upstream slots. Co-Authored-By: Claude Opus 5.5 <[email protected]>
101 lines
3.6 KiB
JavaScript
101 lines
3.6 KiB
JavaScript
/** Own panel collapsed-state preferences and the one-time layout-reset notice. */
|
|
import { t } from '../i18n/index.js';
|
|
/** Versioned localStorage namespace prefix to invalidate stale panel layouts. */
|
|
const PANEL_LAYOUT_STORAGE_VERSION = 'v6';
|
|
/**
|
|
* Position keys are versioned separately from collapsed-state keys. The rails
|
|
* now lay panels out themselves and store no position; the version still names
|
|
* the layout-reset notice and the documented key.
|
|
*/
|
|
const PANEL_POSITION_STORAGE_VERSION = 'v8';
|
|
/** Floating panels' stored positions and hint flag: nothing reads them now. */
|
|
const RETIRED_PANEL_KEY_PREFIXES = [
|
|
`godsEyeView.${PANEL_POSITION_STORAGE_VERSION}.panelPos.`,
|
|
`godsEyeView.${PANEL_POSITION_STORAGE_VERSION}.panelFloatHintShown`,
|
|
];
|
|
export class PanelPositionControls {
|
|
constructor({ syncPanelCollapseButton, showToast }) {
|
|
this._syncPanelCollapseButton = syncPanelCollapseButton;
|
|
this._showToast = showToast;
|
|
}
|
|
|
|
_maybeNotifyLayoutReset() {
|
|
this._dropRetiredPanelKeys();
|
|
try {
|
|
const marker = `godsEyeView.${PANEL_POSITION_STORAGE_VERSION}.layoutResetNotified`;
|
|
if (localStorage.getItem(marker)) return;
|
|
localStorage.setItem(marker, '1');
|
|
const hadOldPositions = Object.keys(localStorage).some((key) =>
|
|
key.startsWith('godsEyeView.v6.panelPos.'),
|
|
);
|
|
if (hadOldPositions) {
|
|
this._showToast(
|
|
t('Panel layout updated — positions reset to new defaults'),
|
|
);
|
|
}
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
|
|
_dropRetiredPanelKeys() {
|
|
try {
|
|
for (const key of Object.keys(localStorage))
|
|
if (RETIRED_PANEL_KEY_PREFIXES.some((prefix) => key.startsWith(prefix)))
|
|
localStorage.removeItem(key);
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
|
|
_panelCollapseStorageKey(panelId) {
|
|
return `godsEyeView.${PANEL_LAYOUT_STORAGE_VERSION}.panelCollapsed.${panelId}`;
|
|
}
|
|
|
|
_restorePanelCollapsedState(panelId, { allowStored = true } = {}) {
|
|
const panelEl = document.getElementById(panelId);
|
|
if (!panelEl) return;
|
|
let collapsed = panelEl.classList.contains('collapsed');
|
|
let stored = null;
|
|
if (allowStored) {
|
|
try {
|
|
stored = localStorage.getItem(this._panelCollapseStorageKey(panelId));
|
|
if (stored === '1') collapsed = true;
|
|
if (stored === '0') collapsed = false;
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
// DISPLAY starts COLLAPSED for a first-time visitor, then respects the
|
|
// user's persisted choice like every other panel.
|
|
//
|
|
// It used to start expanded, to advertise the HUD / DETECT / 3D toggles.
|
|
// That reason expired when those became ON by default: the rail now opens
|
|
// to offer controls for things already happening, while competing with the
|
|
// first-run mission card for the one first impression there is. A stored
|
|
// choice still wins in both directions, so anyone who opens it keeps it.
|
|
if (panelId === 'pp-toggles' && stored === null) collapsed = true;
|
|
panelEl.classList.toggle('collapsed', collapsed);
|
|
// Bodies that expand themselves on first appearance must not override a
|
|
// choice the user (or a share link) already made.
|
|
if (panelEl.dataset)
|
|
panelEl.dataset.collapsedPreference = !allowStored
|
|
? 'share'
|
|
: stored === null
|
|
? 'default'
|
|
: 'stored';
|
|
this._syncPanelCollapseButton(panelEl);
|
|
}
|
|
|
|
_savePanelCollapsedState(panelId, collapsed) {
|
|
try {
|
|
localStorage.setItem(
|
|
this._panelCollapseStorageKey(panelId),
|
|
collapsed ? '1' : '0',
|
|
);
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
}
|