diff --git a/code/frontend/src/app/features/logs-component/logs.component.html b/code/frontend/src/app/features/logs-component/logs.component.html index c2dccd93..b809ca47 100644 --- a/code/frontend/src/app/features/logs-component/logs.component.html +++ b/code/frontend/src/app/features/logs-component/logs.component.html @@ -17,6 +17,11 @@ [options]="categoryOptions()" [(value)]="selectedCategory" /> + (''); readonly selectedCategory = signal(''); + readonly selectedJobName = signal(''); readonly searchQuery = signal(''); readonly expandedIndex = signal(null); readonly showExportMenu = signal(false); @@ -65,6 +66,7 @@ export class LogsComponent implements OnInit { let logs = this.hub.logs(); const level = this.selectedLevel() as string; const category = this.selectedCategory() as string; + const jobName = this.selectedJobName() as string; const query = this.searchQuery().toLowerCase(); const runId = this.selectedJobRunId(); @@ -77,6 +79,9 @@ export class LogsComponent implements OnInit { if (category) { logs = logs.filter((l) => l.category === category); } + if (jobName) { + logs = logs.filter((l) => l.jobName === jobName); + } if (query) { logs = logs.filter( (l) => @@ -102,6 +107,14 @@ export class LogsComponent implements OnInit { ]; }); + readonly jobNameOptions = computed(() => { + const names = new Set(this.hub.logs().map((l) => l.jobName).filter(Boolean)); + return [ + { label: 'All Jobs', value: '' }, + ...Array.from(names).sort().map((n) => ({ label: this.jobDisplayName(n!), value: n! })), + ]; + }); + isExpandable(log: LogEntry): boolean { return !!(log.exception || log.jobName || log.instanceName || log.downloadClientType || log.jobRunId); }