diff --git a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.scss b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.scss
index 9529fd0..104f119 100644
--- a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.scss
+++ b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.scss
@@ -9,11 +9,18 @@
color: gold;
}
-#logs{
- font-size: 1em;
-}
-
-/* ===== Scrollbar CSS ===== */
+#logs{
+ font-size: 1em;
+}
+
+.waitingLogs {
+ color: #6b7280;
+ height: 100%;
+ min-height: 180px;
+ text-align: center;
+}
+
+/* ===== Scrollbar CSS ===== */
/* Firefox */
* {
scrollbar-width: auto;
diff --git a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.spec.ts b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.spec.ts
index d157604..414e6c3 100644
--- a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.spec.ts
+++ b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.spec.ts
@@ -15,6 +15,8 @@ describe('LogsPanelComponent', () => {
component.triggerKey = new TriggerKey('trigger-1', null);
expect(logsRxWebsocketService.watch).toHaveBeenCalledWith('/topic/logs/trigger-1');
+ expect(component.selectedTriggerName).toEqual('trigger-1');
+ expect(component.isWaitingForLogs()).toBeTruthy();
const logRecord = {
date: new Date(),
@@ -30,6 +32,7 @@ describe('LogsPanelComponent', () => {
msg: 'job completed',
threadName: 'worker-1'
});
+ expect(component.isWaitingForLogs()).toBeFalsy();
});
it('should unsubscribe from the previous topic when the trigger changes', () => {
@@ -52,6 +55,52 @@ describe('LogsPanelComponent', () => {
expect(logsRxWebsocketService.watch).toHaveBeenCalledWith('/topic/logs/trigger-2');
});
+ it('should clear logs when the trigger changes', () => {
+ const firstMessages = new Subject
();
+ const secondMessages = new Subject();
+ const logsRxWebsocketService = {
+ watch: jest.fn()
+ .mockReturnValueOnce(firstMessages.asObservable())
+ .mockReturnValueOnce(secondMessages.asObservable())
+ .mockReturnValueOnce(firstMessages.asObservable())
+ };
+ const component = new LogsPanelComponent(logsRxWebsocketService as any, null);
+
+ component.triggerKey = new TriggerKey('trigger-1', null);
+ firstMessages.next({body: JSON.stringify({date: new Date(), type: 'INFO', message: 'first log', threadName: 'worker-1'})});
+ expect(component.logs.length).toEqual(1);
+
+ component.triggerKey = new TriggerKey('trigger-2', null);
+ expect(component.logs).toEqual([]);
+ expect(component.selectedTriggerName).toEqual('trigger-2');
+ expect(component.isWaitingForLogs()).toBeTruthy();
+
+ secondMessages.next({body: JSON.stringify({date: new Date(), type: 'INFO', message: 'second log', threadName: 'worker-2'})});
+ expect(component.logs.length).toEqual(1);
+
+ component.triggerKey = new TriggerKey('trigger-1', null);
+ expect(component.logs).toEqual([]);
+ expect(component.selectedTriggerName).toEqual('trigger-1');
+ expect(component.isWaitingForLogs()).toBeTruthy();
+ });
+
+ it('should clear logs when no trigger is selected', () => {
+ const messages = new Subject();
+ const logsRxWebsocketService = {
+ watch: jest.fn(() => messages.asObservable())
+ };
+ const component = new LogsPanelComponent(logsRxWebsocketService as any, null);
+
+ component.triggerKey = new TriggerKey('trigger-1', null);
+ messages.next({body: JSON.stringify({date: new Date(), type: 'INFO', message: 'first log', threadName: 'worker-1'})});
+
+ component.triggerKey = null;
+
+ expect(component.logs).toEqual([]);
+ expect(component.selectedTriggerName).toBeNull();
+ expect(component.isWaitingForLogs()).toBeFalsy();
+ });
+
it('should ignore destroy when no topic was selected', () => {
const logsRxWebsocketService = {
watch: jest.fn()
diff --git a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts
index 4e2f292..6b4403d 100644
--- a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts
+++ b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts
@@ -15,7 +15,9 @@ export class LogsPanelComponent implements OnInit, OnDestroy {
MAX_LOGS = 30;
- logs = new Array();
+ logs = new Array();
+
+ selectedTriggerName: string;
topicSubscription;
@@ -32,12 +34,22 @@ export class LogsPanelComponent implements OnInit, OnDestroy {
if (!triggerKey || !triggerKey.name) {
this._unsubscribeFromTopic();
this.selectedTriggerKey = null;
+ this.selectedTriggerName = null;
+ this._resetLogs();
return;
}
+ if (this.selectedTriggerKey?.name === triggerKey.name) {
+ return;
+ }
+
+ this._resetLogs();
this.selectedTriggerKey = {...triggerKey} as TriggerKey;
+ this.selectedTriggerName = triggerKey.name;
this._subscribeToTheTopic(this.selectedTriggerKey);
}
+
+ isWaitingForLogs = (): boolean => !!this.selectedTriggerName && (!this.logs || this.logs.length === 0);
ngOnInit() {
}
@@ -63,6 +75,10 @@ export class LogsPanelComponent implements OnInit, OnDestroy {
this.topicSubscription = null;
}
}
+
+ private _resetLogs() {
+ this.logs = [];
+ }
_showNewLog = (logRecord) => {
if (this.logs.length > this.MAX_LOGS) {
diff --git a/quartz-manager-frontend/src/app/components/progress-panel/progress-panel.component.html b/quartz-manager-frontend/src/app/components/progress-panel/progress-panel.component.html
index 6816bcf..9e2c21e 100644
--- a/quartz-manager-frontend/src/app/components/progress-panel/progress-panel.component.html
+++ b/quartz-manager-frontend/src/app/components/progress-panel/progress-panel.component.html
@@ -6,12 +6,12 @@