diff --git a/src/app/formulaire/definition/form-courbe-remous.ts b/src/app/formulaire/definition/form-courbe-remous.ts index 304fef0ba260451543d63aea3d0a314bbe2efc6d..3762c846cb3fd3c5a11a21d850746f0a024c9074 100644 --- a/src/app/formulaire/definition/form-courbe-remous.ts +++ b/src/app/formulaire/definition/form-courbe-remous.ts @@ -16,6 +16,7 @@ export class FormulaireCourbeRemous extends FormulaireSection { constructor() { super(); this._remousResults = new RemousResults(this); + this.updateCalcResults(); this._props["varCalc"] = ""; // important } @@ -27,43 +28,44 @@ export class FormulaireCourbeRemous extends FormulaireSection { const cr: CourbeRemous = this.currentNub as CourbeRemous; const prmCR: CourbeRemousParams = cr.prms as CourbeRemousParams; - this.remousResults.parameters = prmCR; + this._remousResults.parameters = prmCR; // variable supplémentaire à calculer - this.remousResults.extraParamSymbol = this.currentNub.properties.getPropValue("varCalc"); + this._remousResults.extraParamSymbol = this.currentNub.properties.getPropValue("varCalc"); // calcul - this.remousResults.result = cr.CalcSerie(); + this._remousResults.result = cr.CalcSerie(); const sect: acSection = cr.Sn; this.resultYn = sect.CalcSection("Yn"); // hauteur normale this.resultYc = sect.CalcSection("Yc"); // hauteur critique // données du graphique - this.remousResults.hauteurNormale = this.resultYn.resultElement; - this.remousResults.hauteurCritique = this.resultYc.resultElement; - if (this.remousResults.extraParamSymbol) { - this.remousResults.extraChart = ! ["Hs", "Hsc", "Ycor", "Ycon"].includes(this.remousResults.extraParamSymbol); + this._remousResults.hauteurNormale = this.resultYn.resultElement; + this._remousResults.hauteurCritique = this.resultYc.resultElement; + if (this._remousResults.extraParamSymbol) { + this._remousResults.extraChart = !["Hs", "Hsc", "Ycor", "Ycon"].includes(this._remousResults.extraParamSymbol); } else { - this.remousResults.extraChart = false; + this._remousResults.extraChart = false; } + this.updateCalcResults(); } - public get remousResults() { - return this._remousResults; + protected updateCalcResults() { + this._calcResults = []; + if (this._remousResults) { + // ensure help links are propagated + this._remousResults.helpLinks = this.helpLinks; + this._calcResults.push(this._remousResults); + } } public resetFormResults() { this._remousResults.reset(); + this.updateCalcResults(); } public get hasResults(): boolean { return this._remousResults.hasResults; } - - public get results(): CalculatorResults[] { - // ensure help links are propagated - this._remousResults.helpLinks = this.helpLinks; - return [ this._remousResults ]; - } } diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts index 3fd3ee3a274ab1fedb90e0ae8b2c166701210aea..bacf4f4d1ee97117db288b0ac8188008fc68b6ca 100644 --- a/src/app/formulaire/definition/form-definition.ts +++ b/src/app/formulaire/definition/form-definition.ts @@ -56,6 +56,15 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs /** copy of options.resultsHelp read by FormDefinition.parseOptions() */ public helpLinks: { [key: string]: string }; + /* + * Propriété destinée à éviter des MAJ intempestives par Angular : avant, le getter public get results() + * recréait à chaque appel un tableau CalculatorResults[], ce qui était détecté par Angular + * comme un changement même si les résultats stockés dans le tableau n'étaient pas modifiés. + * A présent, _calcResults n'est recréé que si les resultats sont modifiés + * (cf. updateCalcResults()). + */ + protected _calcResults: CalculatorResults[]; + constructor(parent?: FormulaireNode) { super(parent); } @@ -435,12 +444,23 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs public abstract get hasResults(): boolean; - public abstract get results(): CalculatorResults[]; + public get results(): CalculatorResults[] { + return this._calcResults; + } + + /** + * Recrée l'objet retourné par public get results() et + * évite des mises à jour par Angular dues à un une détection + * de changement causée par le fait que get results() recréait + * systématiquement un CalculatorResults[] + */ + protected abstract updateCalcResults(); /** * Copies current Nub result into result components for display on page. * Should be called every time the Nub result changes. * Must be idempotent. + * Must call updateCalcResults() at the end. */ protected abstract reaffectResultComponents(); diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts index 7b596ffbf07e355a534a3298fc67bdb6a641b07c..575f7cb100cff6c9f2a3061ce3c27f2812f9e747 100644 --- a/src/app/formulaire/definition/form-fixedvar.ts +++ b/src/app/formulaire/definition/form-fixedvar.ts @@ -25,16 +25,13 @@ export class FormulaireFixedVar extends FormulaireDefinition { super(parent); this._fixedResults = new FixedResults(); this._varResults = new VarResults(this); + this.updateCalcResults(); } public get fixedResults() { return this._fixedResults; } - public get varResults() { - return this._varResults; - } - public get selectids(): string[] { return this._selectIds; } @@ -42,9 +39,10 @@ export class FormulaireFixedVar extends FormulaireDefinition { public resetFormResults() { this._fixedResults.reset(); this._varResults.reset(); + this.updateCalcResults(); } - public addFixedParameters() { + protected addFixedParameters() { for (const p of this.getFixedParameters()) { this._fixedResults.addFixedParameter(p); } @@ -52,20 +50,26 @@ export class FormulaireFixedVar extends FormulaireDefinition { public set chartType(t: ChartType) { this._varResults.chartType = t; + this.updateCalcResults(); } public get hasResults(): boolean { return this._fixedResults.hasResults || this._varResults.hasResults; } - public get results(): CalculatorResults[] { - const res: CalculatorResults[] = []; + /** + * Recrée l'objet retourné par public get results() et + * évite des mises à jour par Angular dues à un une détection + * de changement causée par le fait que get results() recréait + * systématiquement un CalculatorResults[] + */ + protected updateCalcResults() { + this._calcResults = []; // ensure help links are propagated this._fixedResults.helpLinks = this.helpLinks; this._varResults.helpLinks = this.helpLinks; - res.push(this._fixedResults); - res.push(this._varResults); - return res; + this._calcResults.push(this._fixedResults); + this._calcResults.push(this._varResults); } public afterParseFieldset(fs: FieldSet) { @@ -120,20 +124,21 @@ export class FormulaireFixedVar extends FormulaireDefinition { if (varParams.length === 0) { // pas de paramètre à varier - this.fixedResults.result = nub.result; + this._fixedResults.result = nub.result; if (computedParam !== undefined) { - this.fixedResults.calculatedParameter = computedParam; + this._fixedResults.calculatedParameter = computedParam; } } else { // il y a un paramètre à varier - this.varResults.variatedParameters = varParams; + this._varResults.variatedParameters = varParams; if (computedParam !== undefined) { - this.varResults.calculatedParameter = computedParam; + this._varResults.calculatedParameter = computedParam; } - this.varResults.result = nub.result; - this.varResults.update(); + this._varResults.result = nub.result; + this._varResults.update(); } + this.updateCalcResults(); } /** diff --git a/src/app/formulaire/definition/form-macrorugo-compound.ts b/src/app/formulaire/definition/form-macrorugo-compound.ts index a8cbc7ac605ee477cc3a4bbdfa10e6744b7bdf18..b28b59b7d21e335b8605e9d7b84ce1851eb4836d 100644 --- a/src/app/formulaire/definition/form-macrorugo-compound.ts +++ b/src/app/formulaire/definition/form-macrorugo-compound.ts @@ -18,6 +18,7 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset { constructor() { super(); this._mrcResults = new MacrorugoCompoundResults(); + this.updateCalcResults(); // default properties this._props["inclinedApron"] = MRCInclination.NOT_INCLINED; } @@ -119,18 +120,18 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset { const varParams: VariatedDetails[] = this.getVariatedParameters(); // résultat de calcul de la passe à macrorugo complexe - const mrcr = this.mrcResults; - mrcr.calculatedParameter = computedParam; - mrcr.result = mrc.result; + this._mrcResults.calculatedParameter = computedParam; + this._mrcResults.result = mrc.result; if (varParams) { - mrcr.variatedParameters = varParams; + this._mrcResults.variatedParameters = varParams; } // résultat de chaque enfant const cr: Result[] = []; for (const c of mrc.children) { cr.push(c.result); } - mrcr.childrenResults = cr; + this._mrcResults.childrenResults = cr; + this.updateCalcResults(); } public get mrcResults() { @@ -139,12 +140,16 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset { public resetFormResults() { this._mrcResults.reset(); + this.updateCalcResults(); } - public get results(): CalculatorResults[] { - // ensure help links are propagated - this._mrcResults.helpLinks = this.helpLinks; - return [ this._mrcResults ]; + protected updateCalcResults() { + this._calcResults = []; + if (this._mrcResults) { + // ensure help links are propagated + this._mrcResults.helpLinks = this.helpLinks; + this._calcResults.push(this._mrcResults); + } } public get hasResults(): boolean { diff --git a/src/app/formulaire/definition/form-pab.ts b/src/app/formulaire/definition/form-pab.ts index af9b7f56d9ea67134a0d682678477961df20f646..b82eea4549cd409a9587cfaaad52f0acc9badc96 100644 --- a/src/app/formulaire/definition/form-pab.ts +++ b/src/app/formulaire/definition/form-pab.ts @@ -17,6 +17,7 @@ export class FormulairePab extends FormulaireDefinition { constructor() { super(); this._pabResults = new PabResults(); + this.updateCalcResults(); } public get pabNub(): Pab { @@ -38,21 +39,20 @@ export class FormulairePab extends FormulaireDefinition { const varParams: VariatedDetails[] = this.getVariatedParameters(); // résultat de calcul de la passe à bassins - const pabr = this.pabResults; - pabr.calculatedParameter = computedParam; - pabr.result = pab.result; + this._pabResults.calculatedParameter = computedParam; + this._pabResults.result = pab.result; // résultat de chaque cloison const cr: Result[] = []; for (const c of pab.children) { cr.push(c.result); } - pabr.cloisonsResults = cr; + this._pabResults.cloisonsResults = cr; // résultat de la cloison aval - pabr.cloisonAvalResults = pab.downWall.result; + this._pabResults.cloisonAvalResults = pab.downWall.result; // cote aval de la passe - pabr.Z2 = []; + this._pabResults.Z2 = []; if (varParams.length > 0) { // find longest list const lvp = longestVarParam(varParams); @@ -62,20 +62,22 @@ export class FormulairePab extends FormulaireDefinition { const iter = pab.prms.Z2.getExtendedValuesIterator(longest); while (iter.hasNext) { const nv = iter.next(); - pabr.Z2.push(nv.value); + this._pabResults.Z2.push(nv.value); } } else { for (let i = 0; i < longest; i++) { - pabr.Z2.push(pab.prms.Z2.v); + this._pabResults.Z2.push(pab.prms.Z2.v); } } } else { - pabr.Z2 = [ pab.prms.Z2.singleValue ]; + this._pabResults.Z2 = [pab.prms.Z2.singleValue]; } if (varParams) { - pabr.variatedParameters = varParams; + this._pabResults.variatedParameters = varParams; } + + this.updateCalcResults(); } public get pabResults() { @@ -84,12 +86,16 @@ export class FormulairePab extends FormulaireDefinition { public resetFormResults() { this._pabResults.reset(); + this.updateCalcResults(); } - public get results(): CalculatorResults[] { - // ensure help links are propagated - this._pabResults.helpLinks = this.helpLinks; - return [ this._pabResults ]; + protected updateCalcResults() { + this._calcResults = []; + if (this._pabResults) { + // ensure help links are propagated + this._pabResults.helpLinks = this.helpLinks; + this._calcResults.push(this._pabResults); + } } public get hasResults(): boolean { diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts index 993a72e8b5fe00c3daf93888ba338a5fa12c73e2..8f317caba59b6b5218a157daccf1b6cc6ffd2884 100644 --- a/src/app/formulaire/definition/form-prebarrage.ts +++ b/src/app/formulaire/definition/form-prebarrage.ts @@ -42,6 +42,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar { constructor() { super(); this._pbResults = new PrebarrageResults(); + this.updateCalcResults(); this._pbResults.addObserver(this); } @@ -53,10 +54,13 @@ export class FormulairePrebarrage extends FormulaireFixedVar { return this._pbResults; } - public get results(): CalculatorResults[] { - // ensure help links are propagated - this._pbResults.helpLinks = this.helpLinks; - return [this._pbResults]; + protected updateCalcResults() { + this._calcResults = []; + if (this._pbResults) { + // ensure help links are propagated + this._pbResults.helpLinks = this.helpLinks; + this._calcResults.push(this._pbResults); + } } public get hasResults(): boolean { @@ -219,8 +223,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar { this.runNubCalc(this.currentNub); this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization // reset variable index to avoid trying to access an index > 0 when nothing varies - const pbr = this.pbResults; - pbr.variableIndex = 0; + this._pbResults.variableIndex = 0; this.reaffectResultComponents(); this.refreshSchema(); @@ -231,39 +234,41 @@ export class FormulairePrebarrage extends FormulaireFixedVar { const computedParam: NgParameter = this.getComputedParameter(); // cacher les résultats - this.pbResults.reset(); + this._pbResults.reset(); this.addFixedParameters(); // pour le sélecteur d'itérations const varParams: VariatedDetails[] = this.getVariatedParameters(); if (varParams) { - this.pbResults.variatedParameters = varParams; + this._pbResults.variatedParameters = varParams; const lvp = longestVarParam(this._pbResults.variatedParameters); this._pbResults.size = lvp.size; this._pbResults.cloisonResults.size = lvp.size; } - this.pbResults.result = pb.result; + this._pbResults.result = pb.result; // résultats selon l'objet sélectionné sur le schéma if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) { // afficher les résultats de cloison - this.pbResults.cloisonResults.result = this._selectedItem.result; + this._pbResults.cloisonResults.result = this._selectedItem.result; if (computedParam !== undefined) { - this.pbResults.cloisonResults.calculatedParameter = computedParam; + this._pbResults.cloisonResults.calculatedParameter = computedParam; } // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent, // pour le sélecteur de conditions limites const pbs = this.kids[0] as PbSchema; - this.pbResults.wallsSuffixes = pbs.wallsSuffixes; + this._pbResults.wallsSuffixes = pbs.wallsSuffixes; } else { // afficher les résultats des bassins // résultat général du Nub (amont, aval, débit) - this.pbResults.calculatedParameter = computedParam; + this._pbResults.calculatedParameter = computedParam; // résultat de chaque bassin for (const b of pb.bassins) { - this.pbResults.bassinsResults.push(b.result); + this._pbResults.bassinsResults.push(b.result); } } + + this.updateCalcResults(); } /** @@ -282,7 +287,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar { } } - public addFixedParameters() { + protected addFixedParameters() { if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) { for (const s of this._selectedItem.structures) { for (const p of s.parameterIterator) { @@ -300,6 +305,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar { public resetFormResults() { this._pbResults.reset(); + this.updateCalcResults(); } public resetResults() { diff --git a/src/app/formulaire/definition/form-section-parametree.ts b/src/app/formulaire/definition/form-section-parametree.ts index 743880b5da19f5ae0542af1402223df2537a29db..7f91f2fca963c76ba3e5bae49cfa8adc511afa8b 100644 --- a/src/app/formulaire/definition/form-section-parametree.ts +++ b/src/app/formulaire/definition/form-section-parametree.ts @@ -15,6 +15,7 @@ export class FormulaireSectionParametree extends FormulaireSection { public constructor() { super(); this._sectionResults = new SectionResults(); + this.updateCalcResults(); } protected compute() { @@ -43,15 +44,16 @@ export class FormulaireSectionParametree extends FormulaireSection { this._sectionResults.result = sectNub.result; // résultats complémentaires des paramètres fixés this.addFixedParameters(); - this.fixedResults.result = sectNub.result; + this._fixedResults.result = sectNub.result; } - + this.updateCalcResults(); } public resetFormResults() { this._fixedResults.reset(); this._varResults.reset(); this._sectionResults.reset(); + this.updateCalcResults(); } public get hasResults(): boolean { @@ -60,15 +62,16 @@ export class FormulaireSectionParametree extends FormulaireSection { || (this._sectionResults?.hasResults); } - public get results(): CalculatorResults[] { - const res: CalculatorResults[] = []; + protected updateCalcResults() { + this._calcResults = []; // ensure help links are propagated this._fixedResults.helpLinks = this.helpLinks; this._varResults.helpLinks = this.helpLinks; - this._sectionResults.helpLinks = this.helpLinks; - res.push(this._fixedResults); - res.push(this._varResults); - res.push(this._sectionResults); - return res; + this._calcResults.push(this._fixedResults); + this._calcResults.push(this._varResults); + if(this._sectionResults){ + this._sectionResults.helpLinks = this.helpLinks; + this._calcResults.push(this._sectionResults); + } } } diff --git a/src/app/formulaire/definition/form-verificateur.ts b/src/app/formulaire/definition/form-verificateur.ts index b357c4a0de658da92bac30bb62669bdd13caeb67..3bcd463a65b77779aea4aa3ba7875ddae91adcac 100644 --- a/src/app/formulaire/definition/form-verificateur.ts +++ b/src/app/formulaire/definition/form-verificateur.ts @@ -16,6 +16,7 @@ export class FormulaireVerificateur extends FormulaireFixedVar { constructor() { super(); this._verificateurResults = new VerificateurResults(); + this.updateCalcResults(); } public get verificateurNub(): Verificateur { @@ -59,14 +60,17 @@ export class FormulaireVerificateur extends FormulaireFixedVar { er.push(sp.result); } vr.especeResults = er; - } + this.updateCalcResults(); + } + public resetFormResults() { this._verificateurResults.reset(); + this.updateCalcResults(); } - public get results(): CalculatorResults[] { - return [ this._verificateurResults ]; + protected updateCalcResults() { + this._calcResults = [this._verificateurResults]; } public get hasResults(): boolean {