feat(ui): render the Contacts panel from the awareness layer's published view

The awareness layer presents its panel as a plain view and publishes it through subscribePanel() instead of writing markup into #military-awareness-panel. AwarenessPanel renders it from the gev-context store, calls the layer's navigation, and keeps focus on the same control by identity across live repaints, continuing at the note when that control leaves or is disabled.
This commit is contained in:
Sameh Khamis committed 2026-10-31 01:03:28 -07:00
1 parent 749bfd5cd4
commit 1e4df63efe
16 files changed
+582 -380

No files matched your search

+13 -1
View File
@@ -973,7 +973,8 @@ export class StyleManager extends ShellFacade {
}
_initGlobalContextPanel() {
const { radioLayer, militaryInstallationsLayer } = this.services;
const { radioLayer, militaryInstallationsLayer, militaryAwarenessLayer } =
this.services;
const contextStore = useContextStore(applicationPinia());
this._contextControls = new ContextControls({
elements: {
@@ -999,6 +1000,14 @@ export class StyleManager extends ShellFacade {
},
},
});
// The Contacts layer publishes its panel; the view calls its navigation.
contextStore.connectAwareness(militaryAwarenessLayer);
// A panel left by an earlier shell must not outlive its layer.
this._awarenessPanelUnsubscribe?.();
contextStore.publishAwareness(null);
this._awarenessPanelUnsubscribe = militaryAwarenessLayer?.subscribePanel?.(
(view) => contextStore.publishAwareness(view),
);
}
/** Wire the independent Radio companion controls. */
@@ -1757,6 +1766,9 @@ export class StyleManager extends ShellFacade {
this._streetLevelControls?.destroy();
this._radioControls?.destroy();
this._localSdrControls?.destroy();
this._awarenessPanelUnsubscribe?.();
this._awarenessPanelUnsubscribe = null;
useContextStore(applicationPinia()).connectAwareness(null);
this._cockpitCoordinator.stop();
this._visualSettings.stop();
this.shareLinkManager?.destroy();