From e677212c63dd15ff3d7d2d891ec3134f26dd927d Mon Sep 17 00:00:00 2001
From: paflov <paf@titelfrei.de>
Date: Fri, 9 Apr 2021 12:45:29 +0200
Subject: [PATCH] makes the testController only connect to commands-stream if
 the testMode has the new capabillity `isMonitorable`

---
 docs/test-mode.md                          |  1 +
 src/app/config/mode-options.json           |  3 ++-
 src/app/config/test-mode.ts                |  2 ++
 src/app/config/test-modes.json             | 15 ++++++++++-----
 src/app/test-controller/command.service.ts | 15 ++++++++++-----
 5 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/docs/test-mode.md b/docs/test-mode.md
index 861f47e9..6e783997 100644
--- a/docs/test-mode.md
+++ b/docs/test-mode.md
@@ -29,3 +29,4 @@ test like a testtaker.
 |Sollte ein Testabschnitt mit einem Freigabewort geschützt sein, wird dieses bei der Eingabebox schon eingetragen.|X |X |  |X |X |
 |Sollte eine Maximalzeit für einen Testabschnitt festgelegt sein, wird die verbleibende Zeit angezeigt, auch wenn die Booklet-Konfiguration dies unterbindet.|X |X |  |X |  |
 |Die Seite mit der Aufgaben-Ãœbersicht wird erlaubt, auch wenn das Booklet dies unterbindet.|  |  |  |X |  |
+|Kann aus dem Gruppen-Monitor aus gesteuert werden|  |  |X |  |  |
diff --git a/src/app/config/mode-options.json b/src/app/config/mode-options.json
index 8c286e53..2d70276c 100644
--- a/src/app/config/mode-options.json
+++ b/src/app/config/mode-options.json
@@ -5,5 +5,6 @@
   "forceNaviRestrictions": "Alle Navigationsbeschränkungen des Booklets werden angewendet (z. B. erst weiter, wenn vollständig angezeigt).",
   "presetCode": "Sollte ein Testabschnitt mit einem Freigabewort geschützt sein, wird dieses bei der Eingabebox schon eingetragen.",
   "showTimeLeft": "Sollte eine Maximalzeit für einen Testabschnitt festgelegt sein, wird die verbleibende Zeit angezeigt, auch wenn die Booklet-Konfiguration dies unterbindet.",
-  "showUnitMenu": "Die Seite mit der Aufgaben-Ãœbersicht wird erlaubt, auch wenn das Booklet dies unterbindet."
+  "showUnitMenu": "Die Seite mit der Aufgaben-Ãœbersicht wird erlaubt, auch wenn das Booklet dies unterbindet.",
+  "isMonitorable": "Kann aus dem Gruppen-Monitor aus gesteuert werden"
 }
diff --git a/src/app/config/test-mode.ts b/src/app/config/test-mode.ts
index a821d65c..fb591585 100644
--- a/src/app/config/test-mode.ts
+++ b/src/app/config/test-mode.ts
@@ -12,6 +12,7 @@ export class TestMode {
 	presetCode: true;
 	showTimeLeft: true;
 	showUnitMenu: false;
+	isMonitorable: false;
 	modeLabel: "Nur Ansicht (Demo)";
 	modeId: string = "DEMO";
 
@@ -28,6 +29,7 @@ export class TestMode {
 				this.presetCode = modeConfig.config.presetCode;
 				this.showTimeLeft = modeConfig.config.showTimeLeft;
 				this.showUnitMenu = modeConfig.config.showUnitMenu;
+				this.isMonitorable = modeConfig.config.isMonitorable;
 				this.modeLabel = modeConfig.label;
 				this.modeId = mode;
 			} else {
diff --git a/src/app/config/test-modes.json b/src/app/config/test-modes.json
index fc64f7fe..f1c07009 100644
--- a/src/app/config/test-modes.json
+++ b/src/app/config/test-modes.json
@@ -8,7 +8,8 @@
       "forceNaviRestrictions": false,
       "presetCode": true,
       "showTimeLeft": true,
-      "showUnitMenu": false
+      "showUnitMenu": false,
+      "isMonitorable": false
     }
   },
   "MONITOR-GROUP": {
@@ -20,7 +21,8 @@
       "forceNaviRestrictions": false,
       "presetCode": true,
       "showTimeLeft": true,
-      "showUnitMenu": false
+      "showUnitMenu": false,
+      "isMonitorable": false
     }
   },
   "HOT": {
@@ -32,7 +34,8 @@
       "forceNaviRestrictions": true,
       "presetCode": false,
       "showTimeLeft": false,
-      "showUnitMenu": false
+      "showUnitMenu": false,
+      "isMonitorable": true
     }
   },
   "REVIEW": {
@@ -44,7 +47,8 @@
       "forceNaviRestrictions": false,
       "presetCode": true,
       "showTimeLeft": true,
-      "showUnitMenu": true
+      "showUnitMenu": true,
+      "isMonitorable": false
     }
   },
   "TRIAL": {
@@ -56,7 +60,8 @@
       "forceNaviRestrictions": true,
       "presetCode": true,
       "showTimeLeft": false,
-      "showUnitMenu": false
+      "showUnitMenu": false,
+      "isMonitorable": false
     }
   }
 }
diff --git a/src/app/test-controller/command.service.ts b/src/app/test-controller/command.service.ts
index b8788f60..0e4151e0 100644
--- a/src/app/test-controller/command.service.ts
+++ b/src/app/test-controller/command.service.ts
@@ -10,7 +10,8 @@ import {
   map,
   mergeMap,
   startWith,
-  switchMap, tap
+  switchMap,
+  tap
 } from 'rxjs/operators';
 import { HttpClient } from '@angular/common/http';
 import {
@@ -72,12 +73,16 @@ export class CommandService extends WebsocketBackendService<Command[]> implement
   // this unsubscriptions are only for the case, the project's architecture will be changed dramatically once
   // while not having a OnInit-hook services *do have* an OnDestroy-hook (see: https://v9.angular.io/api/core/OnDestroy)
   ngOnDestroy(): void {
-    this.commandSubscription.unsubscribe();
-    this.testStartedSubscription.unsubscribe();
+    if (this.commandSubscription) {
+      this.commandSubscription.unsubscribe();
+    }
+    if (this.testStartedSubscription) {
+      this.testStartedSubscription.unsubscribe();
+    }
   }
 
   private subscribeReceivedCommands() {
-    this.commandReceived$
+    this.commandSubscription = this.commandReceived$
       .pipe(
         filter((command: Command) => (this.executedCommandIds.indexOf(command.id) < 0)),
         // min delay between items
@@ -103,7 +108,7 @@ export class CommandService extends WebsocketBackendService<Command[]> implement
         distinctUntilChanged(),
         map(CommandService.testStartedOrStopped),
         filter(testStartedOrStopped => testStartedOrStopped !== ''),
-        map(testStartedOrStopped => ((testStartedOrStopped === 'started') ? `test/${this.tcs.testId}/commands` : '')),
+        map(testStartedOrStopped => (((testStartedOrStopped === 'started') && (this.tcs.testMode.isMonitorable)) ? `test/${this.tcs.testId}/commands` : '')),
         filter(newPollingEndpoint => newPollingEndpoint !== this.pollingEndpoint),
         switchMap((pollingEndpoint: string) => {
           this.pollingEndpoint = pollingEndpoint;
-- 
GitLab