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