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);
}