From 492bf58663dc11042088fc1d89d1fafc044db1af Mon Sep 17 00:00:00 2001 From: Jeffrey <54014102+TheJeffreyKuo@users.noreply.github.com> Date: Tue, 28 Apr 2026 17:49:52 -0400 Subject: [PATCH 1/4] Graph page topic selection preset --- .../select-dropdown.component.ts | 7 +- .../graph-sidebar-desktop.component.css | 13 ++ .../graph-sidebar-desktop.component.html | 13 ++ .../graph-sidebar-desktop.component.ts | 66 +++++- .../graph-sidebar-mobile.component.css | 11 + .../graph-sidebar-mobile.component.html | 13 ++ .../graph-sidebar-mobile.component.ts | 75 ++++++- .../preset-dialog/preset-dialog.component.css | 112 ++++++++++ .../preset-dialog.component.html | 98 +++++++++ .../preset-dialog/preset-dialog.component.ts | 207 +++++++++++++++++ .../src/services/graph-preset.service.spec.ts | 208 ++++++++++++++++++ .../src/services/graph-preset.service.ts | 150 +++++++++++++ angular-client/src/utils/dataTypes.utils.ts | 15 ++ 13 files changed, 976 insertions(+), 12 deletions(-) create mode 100644 angular-client/src/pages/graph-page/preset-dialog/preset-dialog.component.css create mode 100644 angular-client/src/pages/graph-page/preset-dialog/preset-dialog.component.html create mode 100644 angular-client/src/pages/graph-page/preset-dialog/preset-dialog.component.ts create mode 100644 angular-client/src/services/graph-preset.service.spec.ts create mode 100644 angular-client/src/services/graph-preset.service.ts diff --git a/angular-client/src/components/select-dropdown/select-dropdown.component.ts b/angular-client/src/components/select-dropdown/select-dropdown.component.ts index b9c48577..3c310516 100644 --- a/angular-client/src/components/select-dropdown/select-dropdown.component.ts +++ b/angular-client/src/components/select-dropdown/select-dropdown.component.ts @@ -39,12 +39,7 @@ export class SelectDropdownComponent { constructor() { effect(() => { const val = this.defaultValue(); - if (val) { - const match = this.options().find((option) => option.name === val); - if (match) { - this.selectedOption = match; - } - } + this.selectedOption = val ? this.options().find((option) => option.name === val) : undefined; }); } diff --git a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.css b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.css index 5c9f47ea..2bb58350 100644 --- a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.css +++ b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.css @@ -5,6 +5,19 @@ margin-top: 10px; } +.presets-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 8px; +} + +.preset-select { + flex: 1 1 auto; + min-width: 0; +} + .header-row { display: flex; align-items: center; diff --git a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.html b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.html index 39f4bb55..ba40bd1a 100644 --- a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.html +++ b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-desktop/graph-sidebar-desktop.component.html @@ -1,4 +1,17 @@
+
+ + +
(() => ({ + placeholder: 'Apply Preset…', + options: this.presets().map( + (p): DropdownOption => ({ + name: p.name, + function: () => this.applyPreset(p) + }) + ) + })); + activePresetName = toSignal(this.presetService.getActivePresetName(), { initialValue: undefined }); + ngOnInit(): void { const nodes = dataTypesToNodes(this.dataTypes()); this.treeNodes = mapNodesToTreeNodes(nodes, this.storage, this.injector); @@ -68,6 +92,24 @@ export default class GraphSidebarDesktopComponent implements OnInit { this.selectedNodes = undefined; }; + openPresetsDialog = () => { + const ref = this.dialogService.open(PresetDialogComponent, { + header: 'Topic Presets', + width: '640px', + draggable: true, + closable: true, + closeAriaLabel: 'Close', + data: { + dataTypes: this.dataTypes() + } + }); + ref.onClose.pipe(take(1)).subscribe((matched: DataType[] | null) => { + if (matched) { + this.applyMatched(matched); + } + }); + }; + nodeSelect(event: TreeNodeSelectEvent) { const dt = event.node.data?.dataType; if (dt) { @@ -89,4 +131,22 @@ export default class GraphSidebarDesktopComponent implements OnInit { this.topicSelectionService.removeDataType(dt); } } + + private applyPreset(preset: Preset) { + const { matched, unknown } = partitionDataTypesByName(this.dataTypes(), preset.topicNames); + if (unknown.length > 0) { + this.messageService.add({ + severity: 'warn', + summary: 'Unknown Topics Skipped', + detail: unknown.join(', '), + life: 8000 + }); + } + this.applyMatched(matched); + } + + private applyMatched(matched: DataType[]) { + this.topicSelectionService.setSelectedDataTypes(matched); + this.selectedNodes = findSelectedTreeNodes(this.activeNodes(), this.topicSelectionService); + } } diff --git a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.css b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.css index 3a2b26b1..ed54d698 100644 --- a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.css +++ b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.css @@ -27,6 +27,17 @@ height: 100%; } +.presets-row { + display: flex; + align-items: center; + gap: 8px; +} + +.preset-select { + flex: 1 1 auto; + min-width: 0; +} + .toggle-group { display: inline-flex; align-items: center; diff --git a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.html b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.html index fe998c27..4f9cdff3 100644 --- a/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.html +++ b/angular-client/src/pages/graph-page/graph-sidebar/graph-sidebar-mobile/graph-sidebar-mobile.component.html @@ -6,6 +6,19 @@