From 9c269c59b2675317752664e514c1ea7d49be26c1 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 1 Aug 2019 17:57:04 +0200
Subject: [PATCH] Adaptation of fixedResults and verResults to new children
 results organisation

---
 protractor.conf.js                            |   2 +-
 .../regime-uniforme.config.json               |   2 +-
 .../fixed-results.component.ts                |  35 +++--
 .../fixedvar-results/var-results.component.ts |  48 +++---
 src/app/results/param-calc-results.ts         |   2 +-
 src/app/results/remous-results.ts             |   2 +-
 src/app/results/var-results.ts                | 145 ++++++++++--------
 .../internationalisation.service.ts           |   3 +
 src/locale/messages.en.json                   |   8 +-
 src/locale/messages.fr.json                   |   8 +-
 10 files changed, 133 insertions(+), 122 deletions(-)

diff --git a/protractor.conf.js b/protractor.conf.js
index 6c546c716..4c1db58bb 100644
--- a/protractor.conf.js
+++ b/protractor.conf.js
@@ -16,7 +16,7 @@ exports.config = {
   capabilities: {
     browserName: 'chrome',
     chromeOptions: {
-      args: [ "--headless", "--window-size=1024x768" ],
+      // args: [ "--headless", "--window-size=1024x768" ],
       prefs: {
         download: {
             prompt_for_download: false, 
diff --git a/src/app/calculators/regime-uniforme/regime-uniforme.config.json b/src/app/calculators/regime-uniforme/regime-uniforme.config.json
index 3633e1aa7..2e0257370 100644
--- a/src/app/calculators/regime-uniforme/regime-uniforme.config.json
+++ b/src/app/calculators/regime-uniforme/regime-uniforme.config.json
@@ -37,6 +37,6 @@
         "defaultNodeType": "SectionRectangle",
         "idCal": "Q",
         "sectionSourceId": "fs_section",
-        "help": "regime_uniforme"
+        "help": "hsl/regime_uniforme"
     }
 ]
\ No newline at end of file
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 0126d9bb0..2f1240942 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -95,34 +95,37 @@ export class FixedResultsComponent {
             && res.resultElement
             && res.extraResults
         ) {
-            // 2.1. main result (sometimes empty, for ex. in "Section paramétrée")
-            if (res.symbol && res.resultElement.vCalc !== undefined) {
-                let rLabel = this._fixedResults.calculatedParameterHeader;
-                // add structure position before label
-                if (res.sourceNub instanceof Structure) {
-                    const pos = res.sourceNub.findPositionInParent();
-                    rLabel = this.intlService.localizeText("INFO_OUVRAGE") + " n°" + (pos + 1) + ": " + rLabel;
+            const sn = this._fixedResults.result.sourceNub;
+
+            // 2.1 all results
+            for (const k of res.resultElement.keys) {
+                const er: number = res.resultElement.getValue(k);
+                // console.log(">> extraresult", k, er);
+                // calculator type for translation
+                let ct = sn.calcType;
+                if (sn.parent) {
+                    ct = sn.parent.calcType;
                 }
                 data.push({
-                    label: rLabel,
-                    value: this.intlService.formatResult(res.symbol, res.resultElement.vCalc),
+                    label: this.formService.expandVariableNameAndUnit(ct, k),
+                    value: this.intlService.formatResult(k, er),
                     isCalcResult: true // for CSS
                 });
             }
 
-            // 2.2. extra results
-            const extraResults = res.resultElement.realExtraResults;
-            for (const k in extraResults) {
-                if (extraResults.hasOwnProperty(k)) {
-                    const er: number = extraResults[k];
+            // 2.2. children results
+            for (const c of sn.getChildren()) {
+                for (const k of c.result.resultElement.keys) {
+                    const er: number = c.result.resultElement.getValue(k);
                     // calculator type for translation
-                    const sn = this._fixedResults.result.sourceNub;
                     let ct = sn.calcType;
                     if (sn.parent) {
                         ct = sn.parent.calcType;
                     }
                     data.push({
-                        label: this.formService.expandVariableNameAndUnit(ct, k),
+                        label: this.intlService.localizeText("INFO_OUVRAGE_N")
+                                + (c.findPositionInParent() + 1) + " : "
+                                + this.formService.expandVariableNameAndUnit(ct, k),
                         value: this.intlService.formatResult(k, er),
                         isCalcResult: true // for CSS
                     });
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index 620f4c90f..6b03eec40 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -56,6 +56,7 @@ export class VarResultsComponent extends ResultsComponent {
         const nDigits = this.appSetupService.displayDigits;
 
         if (this._varResults) {
+            const sn = this._varResults.result.sourceNub;
             // A. gather messages
             for (const re of this._varResults.resultElements) {
                 this._messages = this._messages.concat(re.log.messages); // es6 concat;
@@ -68,10 +69,7 @@ export class VarResultsComponent extends ResultsComponent {
             for (let i = 0; i < this._varResults.variatedParameters.length; i++) {
                 this._headers.push(this._varResults.variableParamHeaders[i]);
             }
-            if (this._varResults.calculatedParameterHeader) {
-                this._headers.push(this._varResults.calculatedParameterHeader);
-            }
-            this._headers = this._headers.concat(this._varResults.extraResultHeaders);
+            this._headers = this._headers.concat(this._varResults.resultHeaders);
 
             // C. pre-extract variable parameters values
             const varValues = [];
@@ -103,17 +101,17 @@ export class VarResultsComponent extends ResultsComponent {
 
                     // log messages for this computation step
                     if (this._messages.length > 0 && re.log.messages.length > 0) {
-                            // find highest log level to display
-                            let highest = 100;
-                            for (const lm of re.log.messages) {
-                                highest = Math.min(highest, lm.getSeverity());
-                            }
-                            list.push({
-                                messages: re.log.messages,
-                                isInfo: (highest === MessageSeverity.INFO),
-                                isWarning: (highest === MessageSeverity.WARNING),
-                                isError: (highest === MessageSeverity.ERROR)
-                            });
+                        // find highest log level to display
+                        let highest = 100;
+                        for (const lm of re.log.messages) {
+                            highest = Math.min(highest, lm.getSeverity());
+                        }
+                        list.push({
+                            messages: re.log.messages,
+                            isInfo: (highest === MessageSeverity.INFO),
+                            isWarning: (highest === MessageSeverity.WARNING),
+                            isError: (highest === MessageSeverity.ERROR)
+                        });
                     } else {
                         list.push({ messages: [] }); // empty log element to preserve row length
                     }
@@ -123,21 +121,19 @@ export class VarResultsComponent extends ResultsComponent {
                         list.push(vv[i]);
                     }
 
-                    // 2. result
-                    if (re.vCalc) { // sometimes does no exist (ex: Section Parametree)
-                        list.push(re.vCalc.toFixed(nDigits));
+                    // 2 all results
+                    for (const k of this._varResults.resultKeys) {
+                        list.push(this.intlService.formatResult(k, re.getValue(k)));
                     }
 
-                    // 3. extra results
-                    for (const erk of this._varResults.extraResultKeys) {
-                        const er = re.getExtraResult(erk);
-                        if (er !== undefined) {
-                            list.push(this.intlService.formatResult(erk, er));
-                        } else {
-                            list.push(er); // keep list ordered
+                    // 3 children results
+                    for (const c of sn.getChildren()) {
+                        for (const k of c.result.resultElements[i].keys) {
+                            const er: number = c.result.resultElements[i].getValue(k);
+                            list.push(this.intlService.formatResult(k, er));
                         }
-
                     }
+
                     this._results.push(list);
                 }
             }
diff --git a/src/app/results/param-calc-results.ts b/src/app/results/param-calc-results.ts
index 4867c0e0a..8cdf9e85e 100644
--- a/src/app/results/param-calc-results.ts
+++ b/src/app/results/param-calc-results.ts
@@ -41,7 +41,7 @@ export abstract class CalculatedParamResults extends CalculatorResults {
         if (this.result === undefined) {
             return false;
         }
-        return this.result.ok;
+        return ! this.result.hasOnlyErrors;
     }
 
     public get hasLog(): boolean {
diff --git a/src/app/results/remous-results.ts b/src/app/results/remous-results.ts
index 5610468f5..e0f5b3f3a 100644
--- a/src/app/results/remous-results.ts
+++ b/src/app/results/remous-results.ts
@@ -151,7 +151,7 @@ export class RemousResults extends CalculatorResults {
         if (this._hasExtra) {
             keys.push(this.extraParamSymbol);
         }
-        this._varResults.extraResultKeys = keys;
+        this._varResults.resultKeys = keys;
         this._varResults.update();
     }
 
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index dee726647..bf059017f 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -18,14 +18,14 @@ export class VarResults extends CalculatedParamResults implements PlottableData
     private _variableParamHeaders: string[];
 
     /**
-     * clés des résultats complémentaires
+     * clés des résultats
      */
-    public extraResultKeys: string[];
+    public resultKeys: string[];
 
     /**
-     * entête des colonnes des résultats supplémentaires
+     * entête des colonnes des résultats
      */
-    private _extraResultHeaders: string[];
+    private _resultHeaders: string[];
 
     /**
      * type de graphe
@@ -60,8 +60,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
     public reset() {
         super.reset();
         this._variableParamHeaders = [];
-        this._extraResultHeaders = [];
-        this.extraResultKeys = [];
+        this._resultHeaders = [];
+        this.resultKeys = [];
         this._yValues = [];
         this.longest = 0;
     }
@@ -89,8 +89,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         return this.result.resultElements;
     }
 
-    public get extraResultHeaders() {
-        return this._extraResultHeaders;
+    public get resultHeaders() {
+        return this._resultHeaders;
     }
 
     public get graphType(): GraphType {
@@ -113,9 +113,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
                 return this.variableParamHeaders[i];
             }
         }
-        // 3. Result element
+        // 3. Result element / child result
         return this.expandLabelFromSymbol(symbol);
-
     }
 
     /**
@@ -123,30 +122,32 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      * its unit, but without the symbol itself
      */
     public expandLabelFromSymbol(symbol: string): string {
+        let ret = "";
         // calculator type for translation
         const sn = this.result.sourceNub;
         let ct = sn.calcType;
         if (sn.parent) {
             ct = sn.parent.calcType;
         }
-        return ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, symbol);
+        // detect children results
+        const match = /^([0-9]+)_(.+)$/.exec(symbol);
+        if (match !== null) {
+            const pos = +match[1];
+            ct = sn.getChildren()[pos].calcType;
+            symbol = match[2];
+            ret += ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N") + (pos + 1) + " : ";
+        }
+        ret += ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, symbol);
+        return ret;
     }
 
     /**
      * Returns the series of values for the required variated parameter / result element
-     * @param symbol parameter / result symbol (ex: "Q")
+     * @param symbol parameter / result symbol (ex: "Q", "0_Q"...)
      */
     public getValuesSeries(symbol: string) {
         const series = [];
-        // 1. calculated param ?
-        if (this._calculatedParam && this._calculatedParam.symbol === symbol) {
-            if (this.result) {
-                for (const r of this.result.resultElements) {
-                    series.push(r.vCalc);
-                }
-            }
-        }
-        // 2. variated param ?
+        // 1. variated param ?
         for (let i = 0; i < this.variatedParameters.length; i++) {
             if (this._variatedParams[i].symbol === symbol) {
                 const iter = this.variatedParameters[i].getExtendedValuesIterator(this.size);
@@ -155,14 +156,26 @@ export class VarResults extends CalculatedParamResults implements PlottableData
                 }
             }
         }
-        // 3. Result element ?
+        // 2. Result element ?
         for (const r of this.result.resultElements) { // re:ResultElement
-            for (const k in r.realExtraResults) {
+            for (const k in r.values) {
                 if (k === symbol) {
-                    series.push(r.extraResults[k]);
+                    series.push(r.getValue(k));
                 }
             }
         }
+        // 3. Child result element ?
+        // detect children results
+        const match = /^([0-9]+)_(.+)$/.exec(symbol);
+        if (match !== null) {
+            const sn = this.result.sourceNub;
+            const pos = +match[1];
+            symbol = match[2];
+            const child = sn.getChildren()[pos];
+            for (const r of child.result.resultElements) {
+                series.push(r.getValue(symbol));
+            }
+        }
 
         return series;
     }
@@ -173,14 +186,23 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     public getAvailableXAxis(): string[] {
         const res: string[] = [];
-        if (this.calculatedParameter) {
-            res.push(this.calculatedParameter.symbol);
-        }
         for (const v of this._variatedParams) {
             res.push(v.symbol);
         }
-        for (const erk of this.extraResultKeys) {
-            res.push(erk);
+        for (const erk of this.resultKeys) {
+            if (erk.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
+                res.push(erk);
+            }
+        }
+        // children results
+        const sn = this.result.sourceNub;
+        for (const c of sn.getChildren()) {
+            // using latest ResultElement; results count / types are supposed to be the same on every iteration
+            for (const k of c.result.resultElement.keys) {
+                if (k.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
+                    res.push(c.findPositionInParent() + "_" + k);
+                }
+            }
         }
         return res;
     }
@@ -210,40 +232,21 @@ export class VarResults extends CalculatedParamResults implements PlottableData
      */
     private extractFamilies(): { [key: string]: string[] } {
         const families: { [key: string]: string[] } = {};
-        if (this.calculatedParameter) {
-            const f = ParamFamily[this.calculatedParameter.paramDefinition.family];
-            console.log(`1 - calcParam: ${this.calculatedParameter.symbol} > ${f}`);
-            if (f !== undefined) {
-                if (! (f in families)) {
-                    console.log("-- init to []");
-                    families[f] = [];
-                }
-                console.log("--- push", this.calculatedParameter.symbol);
-                families[f].push(this.calculatedParameter.symbol);
-            }
-        }
         for (const v of this._variatedParams) {
             const f = ParamFamily[v.paramDefinition.family];
-            console.log(`2 - variatedParam: ${v.symbol} > ${f}`);
             if (f !== undefined) {
                 if (! (f in families)) {
-                    console.log("-- init to []");
                     families[f] = [];
                 }
-                console.log("--- push", v.symbol);
                 families[f].push(v.symbol);
             }
         }
-        for (const erk in this.extraResultKeys) {
-
-            const f = ParamFamily[this.result.sourceNub.extraResultsFamilies[erk]];
-            console.log(`3 - extraResult: ${erk} > ${f}`);
+        for (const erk of this.resultKeys) {
+            const f = ParamFamily[this.result.sourceNub.getFamily(erk)];
             if (f !== undefined) {
                 if (! (f in families)) {
-                    console.log("-- init to []");
                     families[f] = [];
                 }
-                console.log("--- push", erk);
                 families[f].push(erk);
             }
         }
@@ -279,17 +282,13 @@ export class VarResults extends CalculatedParamResults implements PlottableData
             i++;
         }
 
-        // valeurs du paramètre à calculer
-        for (const r of this.result.resultElements) {
-            this._yValues.push(r.vCalc);
-        }
-
-        // clés des résultats supplémentaires
-        if (this.extraResultKeys.length === 0) {
+        // result keys (extra or not) - some lines might miss some results, in case of an error;
+        // use those keys to ensure all columns are filled
+        if (this.resultKeys.length === 0) {
             for (const re of this.result.resultElements) { // re:ResultElement
-                for (const erk in re.realExtraResults) {
-                    if (!this.extraResultKeys.includes(erk)) {
-                        this.extraResultKeys.push(erk);
+                for (const erk in re.values) {
+                    if (!this.resultKeys.includes(erk)) {
+                        this.resultKeys.push(erk);
                     }
                 }
             }
@@ -297,10 +296,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
 
         // set axis selectors values the first time
         let defaultY = this.chartY;
-        if (this.calculatedParameter) {
-            defaultY = this.calculatedParameter.symbol;
-        } else if (this.extraResultKeys.length > 0) {
-            defaultY = this.extraResultKeys[0];
+        if (this.resultKeys.length > 0) {
+            defaultY = this.resultKeys[0];
         }
         this.chartX = this.chartX || this.variatedParameters[this.longest].symbol;
         this.chartY = defaultY;
@@ -311,13 +308,25 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         if (sn.parent) {
             ct = sn.parent.calcType;
         }
-        // entêtes des résultats supplémentaires
-        this._extraResultHeaders = [];
-        for (const k of this.extraResultKeys) {
-            this._extraResultHeaders.push(
+        // entêtes des résultats
+        this._resultHeaders = [];
+        for (const k of this.resultKeys) {
+            this._resultHeaders.push(
                 ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, k)
             );
         }
+        // entêtes des résultats des enfants
+        for (const c of sn.getChildren()) {
+            // using latest ResultElement; results count / types are supposed to be the same on every iteration
+            for (const k of c.result.resultElement.keys) {
+                this._resultHeaders.push(
+                    ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N")
+                        + (c.findPositionInParent() + 1) + " : "
+                        + ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(c.calcType, k)
+                );
+            }
+        }
+
         this.resetDefaultAxisIfNeeded();
     }
 
diff --git a/src/app/services/internationalisation/internationalisation.service.ts b/src/app/services/internationalisation/internationalisation.service.ts
index f95bcc9ba..ef1629c4f 100644
--- a/src/app/services/internationalisation/internationalisation.service.ts
+++ b/src/app/services/internationalisation/internationalisation.service.ts
@@ -190,6 +190,9 @@ export class I18nService extends Observable implements Observer {
      * Les extraResult avec le terme "ENUM_" sont traduit avec le message INFO_EXTRARES_ENUM_[Nom de la variable après ENUM_]
      */
     public formatResult(label: string, value: number): string {
+        if (value === undefined) {
+            return "";
+        }
         const match = label.indexOf("ENUM_");
         if (match > -1) {
                 return this.localizeText(`INFO_EXTRARES_${label.substring(match).toUpperCase()}_${value}`);
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 033387261..85f684af9 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -170,7 +170,6 @@
     "INFO_LIB_DISTANCE_AMONT": "Distance from upstream (m)",
     "INFO_LIB_EC": "EC: Kinetic energy",
     "INFO_LIB_ENUM_MACRORUGOFLOWTYPE": "Flow type",
-    "INFO_LIB_ENUM_STRUCTUREJETTYPE": "Jet type",
     "INFO_LIB_FLU": "Subcritical water line",
     "INFO_LIB_FR": "Froude number",
     "INFO_LIB_FS_OUVRAGE": "Device",
@@ -187,9 +186,9 @@
     "INFO_LIB_Y": "Water line",
     "INFO_LIB_MINZDV": "Minimal crest elevation",
     "INFO_LIB_MAXZDV": "Maximal crest elevation",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREFLOWMODE": "Mode",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREFLOWREGIME": "Regime",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREJETTYPE": "Jet type",
+    "INFO_LIB_ENUM_STRUCTUREFLOWMODE": "Mode",
+    "INFO_LIB_ENUM_STRUCTUREFLOWREGIME": "Regime",
+    "INFO_LIB_ENUM_STRUCTUREJETTYPE": "Jet type",
     "INFO_LIB_OUVRAGE_Q": "Discharge",
     "INFO_LIB_OUVRAGE_ZDV": "Sill elevation",
     "INFO_LIB_P": "Wetted perimeter",
@@ -280,6 +279,7 @@
     "INFO_OPTION_VALIDATE": "Validate",
     "INFO_OPTION_YES": "Yes",
     "INFO_OUVRAGE": "Structure",
+    "INFO_OUVRAGE_N": "Device #",
     "INFO_PAB_BASSIN": "Basin",
     "INFO_PAB_BASSINS": "Basins",
     "INFO_PAB_OUVRAGES": "Devices",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 932338269..2d69da54f 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -169,7 +169,6 @@
     "INFO_LIB_DISTANCE_AMONT": "Distance depuis l'amont (m)",
     "INFO_LIB_EC": "EC: Énergie cinétique",
     "INFO_LIB_ENUM_MACRORUGOFLOWTYPE": "Type d'écoulement",
-    "INFO_LIB_ENUM_STRUCTUREJETTYPE": "Type de jet",
     "INFO_LIB_FLU": "Ligne d'eau fluviale",
     "INFO_LIB_FR": "Froude",
     "INFO_LIB_FS_OUVRAGE": "Ouvrage",
@@ -186,9 +185,9 @@
     "INFO_LIB_Y": "Ligne d'eau",
     "INFO_LIB_MINZDV": "Cote minimale de la crête",
     "INFO_LIB_MAXZDV": "Cote maximale de la crête",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREFLOWMODE": "Type d'écoulement",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREFLOWREGIME": "Régime",
-    "INFO_LIB_OUVRAGE_Q_ENUM_STRUCTUREJETTYPE": "Type de jet",
+    "INFO_LIB_ENUM_STRUCTUREFLOWMODE": "Type d'écoulement",
+    "INFO_LIB_ENUM_STRUCTUREFLOWREGIME": "Régime",
+    "INFO_LIB_ENUM_STRUCTUREJETTYPE": "Type de jet",
     "INFO_LIB_OUVRAGE_Q": "Débit",
     "INFO_LIB_OUVRAGE_ZDV": "Cote du seuil",
     "INFO_LIB_P": "Périmètre mouillé",
@@ -279,6 +278,7 @@
     "INFO_OPTION_VALIDATE": "Valider",
     "INFO_OPTION_YES": "Oui",
     "INFO_OUVRAGE": "Ouvrage",
+    "INFO_OUVRAGE_N": "Ouvrage n°",
     "INFO_PAB_BASSIN": "Bassin",
     "INFO_PAB_BASSINS": "Bassins",
     "INFO_PAB_OUVRAGES": "Ouvrages",
-- 
GitLab