From 8a89be7688c8c9c290a0adab0ced0f290ba5104b Mon Sep 17 00:00:00 2001 From: Dashrat Date: Mon, 12 Oct 2026 17:19:29 +0530 Subject: [PATCH] feat(ui-components): consolidate event and geometry browsers into dedicated browsers menu (#903) --- .../lib/components/phoenix-ui.module.ts | 2 + .../ui-menu/browsers/browsers.component.html | 67 +++++++++++++++ .../ui-menu/browsers/browsers.component.scss | 20 +++++ .../browsers/browsers.component.test.ts | 85 +++++++++++++++++++ .../ui-menu/browsers/browsers.component.ts | 38 +++++++++ .../lib/components/ui-menu/index.ts | 1 + .../more-info/more-info.component.html | 54 ------------ .../more-info/more-info.component.test.ts | 85 +++++++++++++++++++ .../ui-menu/more-info/more-info.component.ts | 30 +------ .../components/ui-menu/ui-menu.component.html | 11 +++ .../components/ui-menu/ui-menu.component.ts | 2 + 11 files changed, 314 insertions(+), 81 deletions(-) create mode 100644 packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.html create mode 100644 packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.scss create mode 100644 packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.test.ts create mode 100644 packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.ts create mode 100644 packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/more-info/more-info.component.test.ts diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/phoenix-ui.module.ts b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/phoenix-ui.module.ts index dd5568949..c335235b5 100644 --- a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/phoenix-ui.module.ts +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/phoenix-ui.module.ts @@ -74,6 +74,7 @@ import { EventBrowserOverlayComponent, EtaPhiPanelComponent, EtaPhiPanelOverlayComponent, + BrowsersComponent, MoreInfoComponent, KinematicsPanelComponent, KinematicsPanelOverlayComponent, @@ -102,6 +103,7 @@ const PHOENIX_COMPONENTS: Type[] = [ NavComponent, UiMenuWrapperComponent, UiMenuComponent, + BrowsersComponent, MoreInfoComponent, CollectionsInfoComponent, GeometryBrowserComponent, diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.html b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.html new file mode 100644 index 000000000..41bb39893 --- /dev/null +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.html @@ -0,0 +1,67 @@ +
+ + + +
+ + + + + + + + + diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.scss b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.scss new file mode 100644 index 000000000..f376b0495 --- /dev/null +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.scss @@ -0,0 +1,20 @@ +.hidden-panels { + display: none; +} + +.item-content { + display: inline-flex; + align-items: center; +} + +.item-icon { + inline-size: 1.2rem; + block-size: 1.2rem; + margin-inline-end: 0.5rem; + fill: currentColor; +} + +::ng-deep .cdk-overlay-pane:has(.mat-mdc-menu-panel), +::ng-deep .cdk-overlay-pane:has(.mat-menu-panel) { + z-index: 99999 !important; +} diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.test.ts b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.test.ts new file mode 100644 index 000000000..bce9cee14 --- /dev/null +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.test.ts @@ -0,0 +1,85 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { BrowsersComponent } from './browsers.component'; + +describe('BrowsersComponent', () => { + let component: BrowsersComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BrowsersComponent], + imports: [MatMenuModule], + schemas: [NO_ERRORS_SCHEMA], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BrowsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should toggle event browser overlay', () => { + const mockEventBrowser = { + toggleOverlay: jest.fn(), + } as any; + component.eventBrowser = mockEventBrowser; + + expect(component.showEventBrowser).toBe(false); + component.toggleEventBrowser(); + expect(component.showEventBrowser).toBe(true); + expect(mockEventBrowser.toggleOverlay).toHaveBeenCalledTimes(1); + + component.toggleEventBrowser(); + expect(component.showEventBrowser).toBe(false); + expect(mockEventBrowser.toggleOverlay).toHaveBeenCalledTimes(2); + }); + + it('should toggle collections info overlay', () => { + const mockCollectionsInfo = { + toggleOverlay: jest.fn(), + } as any; + component.collectionsInfo = mockCollectionsInfo; + + expect(component.showCollectionsInfo).toBe(false); + component.toggleCollectionsInfo(); + expect(component.showCollectionsInfo).toBe(true); + expect(mockCollectionsInfo.toggleOverlay).toHaveBeenCalledTimes(1); + + component.toggleCollectionsInfo(); + expect(component.showCollectionsInfo).toBe(false); + expect(mockCollectionsInfo.toggleOverlay).toHaveBeenCalledTimes(2); + }); + + it('should toggle geometry browser overlay', () => { + const mockGeometryBrowser = { + toggleOverlay: jest.fn(), + } as any; + component.geometryBrowser = mockGeometryBrowser; + + expect(component.showGeometryBrowser).toBe(false); + component.toggleGeometryBrowser(); + expect(component.showGeometryBrowser).toBe(true); + expect(mockGeometryBrowser.toggleOverlay).toHaveBeenCalledTimes(1); + + component.toggleGeometryBrowser(); + expect(component.showGeometryBrowser).toBe(false); + expect(mockGeometryBrowser.toggleOverlay).toHaveBeenCalledTimes(2); + }); + + it('should not throw if child view reference is undefined on toggle', () => { + component.eventBrowser = undefined; + component.collectionsInfo = undefined; + component.geometryBrowser = undefined; + + expect(() => component.toggleEventBrowser()).not.toThrow(); + expect(() => component.toggleCollectionsInfo()).not.toThrow(); + expect(() => component.toggleGeometryBrowser()).not.toThrow(); + }); +}); diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.ts b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.ts new file mode 100644 index 000000000..b0805ee5a --- /dev/null +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/browsers/browsers.component.ts @@ -0,0 +1,38 @@ +import { Component, Input, ViewChild } from '@angular/core'; +import { defaultUIMenuConfig, UIMenuConfig } from '../ui-menu.component'; +import { EventBrowserComponent } from '../event-browser/event-browser.component'; +import { CollectionsInfoComponent } from '../collections-info/collections-info.component'; +import { GeometryBrowserComponent } from '../geometry-browser/geometry-browser.component'; + +@Component({ + standalone: false, + selector: 'app-browsers', + templateUrl: './browsers.component.html', + styleUrls: ['./browsers.component.scss'], +}) +export class BrowsersComponent { + @Input() uiConfig: UIMenuConfig = defaultUIMenuConfig; + + @ViewChild('eventBrowser') eventBrowser?: EventBrowserComponent; + @ViewChild('collectionsInfo') collectionsInfo?: CollectionsInfoComponent; + @ViewChild('geometryBrowser') geometryBrowser?: GeometryBrowserComponent; + + showEventBrowser = false; + showCollectionsInfo = false; + showGeometryBrowser = false; + + toggleEventBrowser() { + this.showEventBrowser = !this.showEventBrowser; + this.eventBrowser?.toggleOverlay(); + } + + toggleCollectionsInfo() { + this.showCollectionsInfo = !this.showCollectionsInfo; + this.collectionsInfo?.toggleOverlay(); + } + + toggleGeometryBrowser() { + this.showGeometryBrowser = !this.showGeometryBrowser; + this.geometryBrowser?.toggleOverlay(); + } +} diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/index.ts b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/index.ts index 0fd3e3dd6..db02d95eb 100644 --- a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/index.ts +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/index.ts @@ -42,6 +42,7 @@ export * from './event-browser/event-browser.component'; export * from './event-browser/event-browser-overlay/event-browser-overlay.component'; export * from './eta-phi-panel/eta-phi-panel.component'; export * from './eta-phi-panel/eta-phi-panel-overlay/eta-phi-panel-overlay.component'; +export * from './browsers/browsers.component'; export * from './more-info/more-info.component'; export * from './ui-menu-wrapper/ui-menu-wrapper.component'; export * from './histogram-panel/histogram-panel.component'; diff --git a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/more-info/more-info.component.html b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/more-info/more-info.component.html index 42e2f9bc1..5e25c59e0 100644 --- a/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/more-info/more-info.component.html +++ b/packages/phoenix-ng/projects/phoenix-ui-components/lib/components/ui-menu/more-info/more-info.component.html @@ -1,21 +1,9 @@
- - - - - -