From 0bd00f869aa4e7c0089af2af851f6416b11a417f Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Tue, 9 Nov 2021 11:24:21 +0100
Subject: [PATCH] [player] Refactor presentationProgress

Improve detection of valid pages, sections and elements
---
 .../unit-state/unit-state.component.ts        | 46 ++++++++++++++-----
 1 file changed, 35 insertions(+), 11 deletions(-)

diff --git a/projects/player/src/app/components/unit-state/unit-state.component.ts b/projects/player/src/app/components/unit-state/unit-state.component.ts
index 09fa97f8f..7d98749e0 100644
--- a/projects/player/src/app/components/unit-state/unit-state.component.ts
+++ b/projects/player/src/app/components/unit-state/unit-state.component.ts
@@ -74,11 +74,32 @@ export class UnitStateComponent implements OnInit, OnDestroy {
   }
 
   private get responseProgress(): Progress {
+    // TODO: Check other relevant Elements
     if (this.form.valid) {
       return 'complete';
     }
-    const pages: FormArray = this.form.get('pages') as FormArray;
-    return (pages.controls.some((control: AbstractControl): boolean => control.value)) ? 'some' : 'none';
+    const pagesControls: AbstractControl[] = (this.form.get('pages') as FormArray).controls;
+    for (let i = 0; i < pagesControls.length; i++) {
+      const pageControl = pagesControls[i];
+      if (pageControl.valid) {
+        return 'some';
+      }
+      const sectionControls = (pageControl.get('sections') as FormArray).controls;
+      for (let ii = 0; ii < sectionControls.length; ii++) {
+        const sectionControl = sectionControls[ii];
+        if (sectionControl.valid) {
+          return 'some';
+        }
+        const elementControls = (sectionControl.get('elements') as FormArray).controls;
+        for (let iii = 0; iii < elementControls.length; iii++) {
+          const elementControl = elementControls[iii];
+          if (elementControl.valid) {
+            return 'some';
+          }
+        }
+      }
+    }
+    return 'none';
   }
 
   private get presentationProgress(): Progress {
@@ -128,15 +149,18 @@ export class UnitStateComponent implements OnInit, OnDestroy {
   }
 
   private sendVopStateChangedNotification(): void {
-    const unitState: UnitState = {
-      dataParts: {
-        elementCodes: JSON.stringify(this.unitStateService.unitStateElementCodes)
-      },
-      presentationProgress: this.presentationProgress,
-      responseProgress: this.responseProgress,
-      unitStateDataType: this.metaDataService.playerMetadata.supportedUnitStateDataTypes
-    };
-    this.veronaPostService.sendVopStateChangedNotification({ unitState });
+    // give the form time to change its valid status
+    Promise.resolve().then(() => {
+      const unitState: UnitState = {
+        dataParts: {
+          elementCodes: JSON.stringify(this.unitStateService.unitStateElementCodes)
+        },
+        presentationProgress: this.presentationProgress,
+        responseProgress: this.responseProgress,
+        unitStateDataType: this.metaDataService.playerMetadata.supportedUnitStateDataTypes
+      };
+      this.veronaPostService.sendVopStateChangedNotification({ unitState });
+    });
   }
 
   ngOnDestroy(): void {
-- 
GitLab