diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts index 757a2fa707aec856605435c2f14dd7cd7dda971a..da84adc10448a18c56db41bd2c3e63646ea1a4c1 100644 --- a/e2e/calculator.po.ts +++ b/e2e/calculator.po.ts @@ -123,6 +123,28 @@ export class CalculatorPage { return await button.isPresent(); } + /** + * @returns true if "fixed mode" button linked to an input is selected + */ + async inputIsInFixedMode(input: ElementFinder): Promise<boolean> { + // get parent (div.container) + const container = await this.findParentContainer(input); + // find fixed radio button + const button: ElementFinder = container.element(by.css("mat-button-toggle.radio_fix")); + return await button.getAttribute("ng-reflect-checked") === "true"; + } + + /** + * @returns true if "calculated mode" button linked to an input is selected + */ + async inputIsInCalculatedMode(input: ElementFinder): Promise<boolean> { + // get parent (div.container) + const container = await this.findParentContainer(input); + // find calc radio button + const button: ElementFinder = container.element(by.css("mat-button-toggle.radio_cal")); + return await button.getAttribute("ng-reflect-checked") === "true"; + } + async hasResults() { return ( await this.presentAndVisible("fixedvar-results fixed-results > .fixed-results-container") diff --git a/e2e/parallel-structures.e2e-spec.ts b/e2e/parallel-structures.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..44312c6bf5344e7d8eed582884fa8220d95121e8 --- /dev/null +++ b/e2e/parallel-structures.e2e-spec.ts @@ -0,0 +1,55 @@ +import { ListPage } from "./list.po"; +import { Navbar } from "./navbar.po"; +import { browser, by, element } from "protractor"; +import { CalculatorPage } from "./calculator.po"; +import { PreferencesPage } from "./preferences.po"; + +describe("Check calculated parameter remains the same when copying a structure", () => { + let listPage: ListPage; + let navBar: Navbar; + let calcPage: CalculatorPage; + let prefPage: PreferencesPage; + + beforeAll(async () => { + listPage = new ListPage(); + navBar = new Navbar(); + calcPage = new CalculatorPage(); + prefPage = new PreferencesPage(); + }); + + beforeEach(async () => { + // disable evil option "empty fields on module creation" + await prefPage.navigateTo(); + await prefPage.disableEvilEmptyFields(); + await browser.sleep(200); + }); + + it("", async () => { + // open "fish ladder: cross walls" calculator + await navBar.clickNewCalculatorButton(); + await listPage.clickMenuEntryForCalcType(10); + await browser.sleep(200); + + // check L in first structure calc toggle is not checked + const L1 = calcPage.getInputById("0_L"); + + // const h11 = calcPage.getInputById("0_h1"); + + // set L to calculated in first structure + await calcPage.setParamMode(L1, "cal"); + + // check L calc toggle is checked + expect(await calcPage.inputIsInCalculatedMode(L1)).toBe(true); + + // copy 1st structure + const copyStruct = calcPage.getCopyStructureButton(); + await copyStruct.click(); + + // check L in first structure is still in "calc" state + expect(await calcPage.inputIsInCalculatedMode(L1)).toBe(true); + + // // check L in second structure is still in "fix" state + const L2 = calcPage.getInputById("1_L"); + expect(await calcPage.inputIsInFixedMode(L2)).toBe(true); + }); +}); diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts index 1bde22b4165daa0a0064181ee0804a36359a9e5d..fa61d21cef01af81516a33cc19f3863aa7fc938a 100644 --- a/src/app/components/field-set/field-set.component.ts +++ b/src/app/components/field-set/field-set.component.ts @@ -159,46 +159,6 @@ export class FieldSetComponent implements DoCheck { this._isValid = new DefinedBoolean(); } - public hasRadioFix(): boolean { - if (this._fieldSet.hasInputs) { - switch (this._fieldSet.getInput(0).radioConfig) { - case ParamRadioConfig.FIX: - return false; - - default: - return true; - } - } - return false; - } - - public hasRadioVar(): boolean { - if (this._fieldSet.hasInputs) { - switch (this._fieldSet.getInput(0).radioConfig) { - case ParamRadioConfig.VAR: - case ParamRadioConfig.CAL: - return true; - - default: - return false; - } - } - return false; - } - - public hasRadioCal(): boolean { - if (this._fieldSet.hasInputs) { - switch (this._fieldSet.getInput(0).radioConfig) { - case ParamRadioConfig.CAL: - return true; - - default: - return false; - } - } - return false; - } - /** * détermine si un Field est du type InputField */ diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts index add37e2be4a947f9bff00320b0e2ff0c16c1c94f..9d5664cf7bf0817ad0a61a60a960a24a2d383fae 100644 --- a/src/app/components/fieldset-container/fieldset-container.component.ts +++ b/src/app/components/fieldset-container/fieldset-container.component.ts @@ -7,6 +7,7 @@ import { FormulaireDefinition } from "../../formulaire/definition/form-definitio import { I18nService } from "../../services/internationalisation.service"; import { ApplicationSetupService } from "../../services/app-setup.service"; import { DefinedBoolean } from "app/definedvalue/definedboolean"; +import { ParamValueMode } from "jalhyd"; @Component({ selector: "fieldset-container", @@ -90,6 +91,17 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit { // @WTF why only those two ? newFs.setPropValue("structureType", after.properties.getPropValue("structureType")); newFs.setPropValue("loiDebit", after.properties.getPropValue("loiDebit")); + + // au cas où un des paramètres du fieldset source est en mode calcul, + // on met le paramètre copié en mode fixé (nghyd#567) + for (const o of prms) { + if (o.prmDef !== undefined) { + if (o.valueMode === ParamValueMode.CALCUL) { + o.valueMode = ParamValueMode.SINGLE; + } + } + } + newFs.restoreParameters(prms); } } diff --git a/src/app/formulaire/elements/fieldset.ts b/src/app/formulaire/elements/fieldset.ts index 4081f824133ac596b38848c2e926a0793580713e..b73ff379a513b8a1c8b1f0ae0055ff97ffbb5d51 100644 --- a/src/app/formulaire/elements/fieldset.ts +++ b/src/app/formulaire/elements/fieldset.ts @@ -79,7 +79,7 @@ export class FieldSet extends FormulaireElement implements Observer { if (p instanceof NgParameter) { for (const bp of backup) { if (p.symbol === bp.prmDef.symbol) { - p.loadObjectRepresentation(bp); + p.loadObjectRepresentation(bp, false); break; } } diff --git a/src/app/formulaire/elements/ngparam.ts b/src/app/formulaire/elements/ngparam.ts index 869e54e20f8131656548962e8d30bb56df4da946..188f87fd4b451d41b3ff11b9ffe5eb52a98f5579 100644 --- a/src/app/formulaire/elements/ngparam.ts +++ b/src/app/formulaire/elements/ngparam.ts @@ -35,13 +35,17 @@ export class NgParameter extends InputField implements Observer { /** user defined title (if undefined : parameter label + unit */ private _title: string; - public radioConfig: ParamRadioConfig; + /** + * fix,var,calc,link radio buttons configuration, ie. what buttons are available, + * NOT the one selected + */ + private _radioConfig: ParamRadioConfig; public disabled: boolean; constructor(private _paramDef: ParamDefinition, parent: FormulaireNode) { super(parent); - this.radioConfig = this.radioState; + this._radioConfig = this.radioState; this.disabled = false; } @@ -183,7 +187,7 @@ export class NgParameter extends InputField implements Observer { /** * compute radio state from value mode */ - public get radioState() { + public get radioState(): ParamRadioConfig { switch (this._paramDef.valueMode) { case ParamValueMode.SINGLE: return ParamRadioConfig.FIX; @@ -200,6 +204,20 @@ export class NgParameter extends InputField implements Observer { } } + public get radioConfig(): ParamRadioConfig { + if (this._radioConfig === undefined) { + throw new Error("radio config not defined!"); + } + return this._radioConfig; + } + + public set radioConfig(rc: ParamRadioConfig) { + if (this._radioConfig === undefined) { + throw new Error("cannot set radio config to undefined!"); + } + this._radioConfig = rc; + } + get isDefined(): boolean { return this._paramDef.isDefined; } @@ -298,9 +316,9 @@ export class NgParameter extends InputField implements Observer { } /** - * Reads radio config from parameter calculability + * compute radio config from parameter calculability */ - private getRadioConfig() { + private getRadioConfigFromCalculability(): ParamRadioConfig { switch (this.paramDefinition.calculability) { case ParamCalculability.FIXED: return ParamRadioConfig.FIX; @@ -309,6 +327,8 @@ export class NgParameter extends InputField implements Observer { case ParamCalculability.DICHO: case ParamCalculability.EQUATION: return ParamRadioConfig.CAL; + default: + throw new Error("parameter calculability not set!"); } } @@ -504,16 +524,18 @@ export class NgParameter extends InputField implements Observer { prmDef: this.paramDefinition.objectRepresentation(), allowEmpty: this._allowEmpty, unit: this.unit, - radioConfig: this.radioConfig, + radioConfig: this._radioConfig, + valueMode: this.paramDefinition.valueMode } } - public loadObjectRepresentation(rep: any) { + public loadObjectRepresentation(rep: any, propagateToCalculatedParam: boolean = true) { if (this._paramDef.symbol === rep.prmDef.symbol) { - this._paramDef.loadObjectRepresentation(rep.prmDef); + this._paramDef.loadObjectRepresentation(rep.prmDef, false); this._allowEmpty = rep.allowEmpty; this._paramDef.setUnit(rep.unit); - this.radioConfig = rep.radioConfig; + this._radioConfig = rep.radioConfig; + this.paramDefinition.setValueMode(rep.valueMode, propagateToCalculatedParam); } } @@ -597,9 +619,9 @@ export class NgParameter extends InputField implements Observer { if (json["allowEmpty"] !== undefined && typeof json["allowEmpty"] === "boolean") { this._allowEmpty = json["allowEmpty"]; } - this.radioConfig = this.getRadioConfig(); + this._radioConfig = this.getRadioConfigFromCalculability(); if (json["calculable"] !== undefined && json["calculable"] === false) { - this.radioConfig = Math.min(ParamCalculability.FREE, this.getRadioConfig()); + this._radioConfig = Math.min(ParamCalculability.FREE, this._radioConfig); } }