mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 10:53:59 +00:00
fix(ui): enforce compact Radio ownership on right-rail restores
Close the overlay when adaptive layout restores an auto-collapsed Context directly. Regression covers the reachable rail reflow path; changelog credits the original report by raysung-2026 (#804).
This commit is contained in:
1 parent
b22e6d519a
commit
d9e2c8a7e7
3 files changed
+89
-1
No files matched your search
@@ -1,5 +1,10 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
- Prevent a compact Radio disclosure from covering Space Missions when the
|
||||||
|
adaptive right rail restores Context without calling the panel owner.
|
||||||
|
Repeated Context-open calls and rail-driven expansion both close the mini,
|
||||||
|
with a regression for auto-collapse restoration (raysung-2026, #804).
|
||||||
|
|
||||||
- CCTV cameras whose bearing is a guess now say so. Packs mark bearings derived
|
- CCTV cameras whose bearing is a guess now say so. Packs mark bearings derived
|
||||||
from a hash of the camera id as `headingConfidence: 'low'`, but nothing read the
|
from a hash of the camera id as `headingConfidence: 'low'`, but nothing read the
|
||||||
flag, so roughly 70% of a default catalog rendered like surveyed facings. The HUD
|
flag, so roughly 70% of a default catalog rendered like surveyed facings. The HUD
|
||||||
|
|||||||
+15
-1
@@ -68,7 +68,8 @@ export class PanelChrome {
|
|||||||
variant: this.hud.getVariant(),
|
variant: this.hud.getVariant(),
|
||||||
}),
|
}),
|
||||||
scheduleCockpitLayout: () => this.cockpitView?.scheduleContextLayout(),
|
scheduleCockpitLayout: () => this.cockpitView?.scheduleContextLayout(),
|
||||||
syncPanelCollapseButton: (panel) => this._syncPanelCollapseButton(panel),
|
syncPanelCollapseButton: (panel) =>
|
||||||
|
this._syncRailPanelCollapseButton(panel),
|
||||||
readDisplayScrollTop: () =>
|
readDisplayScrollTop: () =>
|
||||||
this._displayPortalScrollRestoreOwner === 'standard'
|
this._displayPortalScrollRestoreOwner === 'standard'
|
||||||
? this._standardDisplayScrollTop
|
? this._standardDisplayScrollTop
|
||||||
@@ -282,6 +283,19 @@ export class PanelChrome {
|
|||||||
return this._panelLayout._scheduleLeftPanelLayout(options0);
|
return this._panelLayout._scheduleLeftPanelLayout(options0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_syncRailPanelCollapseButton(panelEl) {
|
||||||
|
// Adaptive rail layout may directly restore an auto-collapsed Context
|
||||||
|
// without invoking setPanelCollapsed(). Enforce Radio ownership there too.
|
||||||
|
if (
|
||||||
|
panelEl?.id === 'global-context-panel' &&
|
||||||
|
!panelEl.classList.contains('collapsed') &&
|
||||||
|
this._contextRadioDock?.classList.contains('disclosure-open')
|
||||||
|
) {
|
||||||
|
this._setRadioDisclosure?.(false);
|
||||||
|
}
|
||||||
|
this._syncPanelCollapseButton(panelEl);
|
||||||
|
}
|
||||||
|
|
||||||
_syncPanelCollapseButton(panelEl) {
|
_syncPanelCollapseButton(panelEl) {
|
||||||
const isRightRail = [
|
const isRightRail = [
|
||||||
'pp-toggles',
|
'pp-toggles',
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import assert from 'node:assert/strict';
|
|||||||
import test from 'node:test';
|
import test from 'node:test';
|
||||||
|
|
||||||
import { PanelChrome } from './panelChrome.js';
|
import { PanelChrome } from './panelChrome.js';
|
||||||
|
import { PanelLayoutController } from './panelLayoutController.js';
|
||||||
|
|
||||||
function classList(initial = []) {
|
function classList(initial = []) {
|
||||||
const values = new Set(initial);
|
const values = new Set(initial);
|
||||||
@@ -65,3 +66,71 @@ test('opening an already-open Context still closes a stale compact Radio disclos
|
|||||||
assert.deepEqual(calls, [false]);
|
assert.deepEqual(calls, [false]);
|
||||||
assert.equal(radioDock.classList.contains('disclosure-open'), false);
|
assert.equal(radioDock.classList.contains('disclosure-open'), false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('adaptive rail restore hides compact Radio before revealing Context', (t) => {
|
||||||
|
const priorRaf = globalThis.requestAnimationFrame;
|
||||||
|
let nextFrame;
|
||||||
|
globalThis.requestAnimationFrame = (callback) => {
|
||||||
|
nextFrame = callback;
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
|
t.after(() => {
|
||||||
|
globalThis.requestAnimationFrame = priorRaf;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Valid starting state: the tactical rail automatically collapsed Context,
|
||||||
|
// and the user opened the compact Radio controls from its header.
|
||||||
|
const contextPanel = {
|
||||||
|
id: 'global-context-panel',
|
||||||
|
classList: classList(['collapsed', 'layout-auto-collapsed']),
|
||||||
|
};
|
||||||
|
const radioDock = { classList: classList(['disclosure-open']) };
|
||||||
|
const radioMini = { hidden: false };
|
||||||
|
const calls = [];
|
||||||
|
const chrome = {
|
||||||
|
_contextRadioDock: radioDock,
|
||||||
|
_setRadioDisclosure(open) {
|
||||||
|
calls.push(`disclosure:${open}`);
|
||||||
|
radioDock.classList.toggle('disclosure-open', open);
|
||||||
|
radioMini.hidden = !open;
|
||||||
|
},
|
||||||
|
_syncPanelCollapseButton(panel) {
|
||||||
|
calls.push(`button:${panel.id}`);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const layout = {
|
||||||
|
destroyed: false,
|
||||||
|
_rightStackLayoutFrame: null,
|
||||||
|
_rightStackReconsiderAutoCollapse: false,
|
||||||
|
_rightPanelStack: {
|
||||||
|
querySelectorAll: (selector) =>
|
||||||
|
selector === '.layout-auto-collapsed' ? [contextPanel] : [],
|
||||||
|
},
|
||||||
|
_syncPanelCollapseButton(panel) {
|
||||||
|
PanelChrome.prototype._syncRailPanelCollapseButton.call(chrome, panel);
|
||||||
|
},
|
||||||
|
_syncRightPanelAdaptiveLayout() {
|
||||||
|
calls.push('layout');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
PanelLayoutController.prototype._scheduleRightPanelLayout.call(layout, {
|
||||||
|
reconsiderAutoCollapse: true,
|
||||||
|
});
|
||||||
|
assert.equal(contextPanel.classList.contains('collapsed'), true);
|
||||||
|
assert.equal(radioMini.hidden, false);
|
||||||
|
nextFrame();
|
||||||
|
|
||||||
|
assert.equal(contextPanel.classList.contains('collapsed'), false);
|
||||||
|
assert.equal(
|
||||||
|
contextPanel.classList.contains('layout-auto-collapsed'),
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
assert.equal(radioDock.classList.contains('disclosure-open'), false);
|
||||||
|
assert.equal(radioMini.hidden, true);
|
||||||
|
assert.deepEqual(calls, [
|
||||||
|
'disclosure:false',
|
||||||
|
'button:global-context-panel',
|
||||||
|
'layout',
|
||||||
|
]);
|
||||||
|
});
|
||||||
Reference in new issue
Block a user