From 38100baee567d91bfb2a075dd569c5193c6ab0aa Mon Sep 17 00:00:00 2001 From: "francois.grand" <francois.grand@irstea.fr> Date: Mon, 12 Mar 2018 17:25:02 +0100 Subject: [PATCH] =?UTF-8?q?=20#27=20:=20remplacement=20des=20=C3=A9v=C3=A9?= =?UTF-8?q?nements=20Angular=20=C3=A9mis=20par=20les=20select=20par=20des?= =?UTF-8?q?=20notifications=20observ=C3=A9=20->=20observateur=20-=20Formul?= =?UTF-8?q?aireNode=20impl=C3=A9mente=20IObservable=20(m=C3=A9nage=20dans?= =?UTF-8?q?=20les=20classes=20d=C3=A9riv=C3=A9es)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../field-set/field-set.component.html | 2 +- .../field-set/field-set.component.ts | 13 ---- .../fieldset-container.component.html | 3 +- .../fieldset-container.component.ts | 13 ---- .../calculator.component.html | 5 +- .../calculator.component.ts | 8 --- .../ngparam-input/ngparam-input.component.ts | 1 - .../select-field-line.component.html | 2 +- .../concrete/form-parallel-structures.ts | 67 +++++++++++++++++++ src/app/formulaire/definition/form-compute.ts | 11 +-- .../definition/form-def-fixedvar.ts | 3 +- .../formulaire/definition/form-def-section.ts | 6 +- .../formulaire/definition/form-definition.ts | 48 +++++-------- src/app/formulaire/fieldset-container.ts | 6 ++ src/app/formulaire/formulaire-node.ts | 32 ++++++++- src/app/formulaire/ngparam.ts | 32 +-------- src/app/formulaire/select-field.ts | 33 ++------- 17 files changed, 141 insertions(+), 144 deletions(-) diff --git a/src/app/components/field-set/field-set.component.html b/src/app/components/field-set/field-set.component.html index 361f044f6..cd33a4983 100644 --- a/src/app/components/field-set/field-set.component.html +++ b/src/app/components/field-set/field-set.component.html @@ -18,7 +18,7 @@ <param-field-line *ngIf="isInputField(p)" [param]=p (onRadio)=onRadioClick($event) (onValid)=onParamLineValid()> </param-field-line> - <select-field-line *ngIf="isSelectField(p)" [param]=p (selectChange)=onSelectChanged($event)> + <select-field-line *ngIf="isSelectField(p)" [param]=p> </select-field-line> <check-field-line *ngIf="isCheckField(p)" [param]=p></check-field-line> diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts index 0594d7767..462644627 100644 --- a/src/app/components/field-set/field-set.component.ts +++ b/src/app/components/field-set/field-set.component.ts @@ -136,13 +136,6 @@ export class FieldSetComponent implements DoCheck { @Output() private onRadio = new EventEmitter<any>(); - /** - * réception d'un événement d'un select - */ - private onSelectChanged(val: SelectEntry) { - this.selectChange.emit(val); // on transmet au parent - } - public get isValid() { return this._isValid; } @@ -184,10 +177,4 @@ export class FieldSetComponent implements DoCheck { private onParamLineValid(event: boolean) { this.updateValidity(); } - - /** - * événément de changement d'état d'un select - */ - @Output() - private selectChange = new EventEmitter<SelectEntry>(); } diff --git a/src/app/components/fieldset-container/fieldset-container.component.html b/src/app/components/fieldset-container/fieldset-container.component.html index ad3546595..154696041 100644 --- a/src/app/components/fieldset-container/fieldset-container.component.html +++ b/src/app/components/fieldset-container/fieldset-container.component.html @@ -6,7 +6,6 @@ <!-- bouton d'ajout d'un ouvrage --> <button type="button" class="btn btn-grey waves-light" mdbRippleRadius (click)="addStructure()">Ajouter un ouvrage</button> </div> - <field-set *ngFor="let fs of fieldsets" [fieldSet]=fs (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event) - (onValid)=onFieldsetValid()> + <field-set *ngFor="let fs of fieldsets" [fieldSet]=fs (onRadio)=onRadioClick($event) (onValid)=onFieldsetValid()> </field-set> </div> \ No newline at end of file diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts index e2da23746..26ac2f5f1 100644 --- a/src/app/components/fieldset-container/fieldset-container.component.ts +++ b/src/app/components/fieldset-container/fieldset-container.component.ts @@ -13,12 +13,6 @@ export class FieldsetContainerComponent implements DoCheck { @Input("container") private _container: FieldsetContainer; - /** - * événément de changement d'état d'un select - */ - @Output() - private selectChange = new EventEmitter<SelectEntry>(); - /** * liste des composants FieldSet enfants */ @@ -44,13 +38,6 @@ export class FieldsetContainerComponent implements DoCheck { this._container.addFromTemplate(this._container.templates[0].id); } - /** - * réception d'un événement d'un select - */ - private onSelectChanged(val: SelectEntry) { - this.selectChange.emit(val); // on transmet au parent - } - /* * gestion des événements clic sur les radios : * réception d'un message du composant enfant (field-set) diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html index 5d8e83658..47e2a2e53 100644 --- a/src/app/components/generic-calculator/calculator.component.html +++ b/src/app/components/generic-calculator/calculator.component.html @@ -24,10 +24,9 @@ <!-- chapitres --> <ng-template ngFor let-fe [ngForOf]="formElements"> <field-set *ngIf="isFieldset(fe)" [style.display]="getFieldsetStyleDisplay(fe.id)" [fieldSet]=fe (onRadio)=onRadioClick($event) - (selectChange)=onSelectChanged($event) (validChange)=OnFieldsetValid()></field-set> + (validChange)=OnFieldsetValid()></field-set> - <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event) - (validChange)=onFieldsetContainerValid()></fieldset-container> + <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (onRadio)=onRadioClick($event) (validChange)=onFieldsetContainerValid()></fieldset-container> </ng-template> </div> diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts index f69d1cb95..752e911dd 100644 --- a/src/app/components/generic-calculator/calculator.component.ts +++ b/src/app/components/generic-calculator/calculator.component.ts @@ -256,14 +256,6 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit, } } - /** - * réception d'un événement d'un select - */ - private onSelectChanged(val: SelectEntry) { - this._formulaire.resetResults(); - this._formulaire.applyDependencies(); - } - /** * appelé après le 1er affichage du composant */ diff --git a/src/app/components/ngparam-input/ngparam-input.component.ts b/src/app/components/ngparam-input/ngparam-input.component.ts index 803076aeb..b7c3bcbf0 100644 --- a/src/app/components/ngparam-input/ngparam-input.component.ts +++ b/src/app/components/ngparam-input/ngparam-input.component.ts @@ -8,7 +8,6 @@ import { NumericalString, Message } from "jalhyd"; import { InternationalisationService } from "../../services/internationalisation/internationalisation.service"; import { NgParameter } from "../../formulaire/ngparam"; import { GenericInputComponent } from "../generic-input/generic-input.component"; -import { Observer, IObservable } from "../../services/observer"; @Component({ selector: "ngparam-input", diff --git a/src/app/components/select-field-line/select-field-line.component.html b/src/app/components/select-field-line/select-field-line.component.html index f1facb0c0..f3e7ae806 100644 --- a/src/app/components/select-field-line/select-field-line.component.html +++ b/src/app/components/select-field-line/select-field-line.component.html @@ -13,4 +13,4 @@ <a class="dropdown-item" *ngFor="let e of entries" [value]=e>{{entryLabel(e)}}</a> </div> </div> -</div> +</div> \ No newline at end of file diff --git a/src/app/formulaire/definition/concrete/form-parallel-structures.ts b/src/app/formulaire/definition/concrete/form-parallel-structures.ts index ae1d2e96b..c195885cd 100644 --- a/src/app/formulaire/definition/concrete/form-parallel-structures.ts +++ b/src/app/formulaire/definition/concrete/form-parallel-structures.ts @@ -7,6 +7,9 @@ import { FormDefParamToCalculate } from "../form-def-paramcalc"; import { FormDefFixedVar } from "../form-def-fixedvar"; import { FormComputeParallelStructures } from "../form-compute-parallel-structures"; import { FormResultFixedVar } from "../form-result-fixedvar"; +import { FieldsetContainer } from "../../fieldset-container"; +import { FieldSet } from "../../fieldset"; +import { SelectField } from "../../select-field"; export class FormulaireParallelStructure extends FormulaireDefinition { private _formFixedVar: FormDefFixedVar; @@ -34,6 +37,37 @@ export class FormulaireParallelStructure extends FormulaireDefinition { } protected completeParse() { + // récupération des valeurs par défaut pour les affecter au template + + // for (const n of this.allFormElements) + // if (n instanceof FieldsetContainer) { + // var fsc: FieldsetContainer = n; + // break; + // } + + // if (fsc == undefined) + // console.log("warning : pas de valeurs par défaut trouvées pour les ouvrages en parallèle") + // else { + // const st = CreateStructure(StructureType.Cem88d); + // for (const i in st.prms.map) { + // const param = st.prms.map[i]; + + // let found = false; + // for (const tmpl of fsc.templates) { + // for (const n of tmpl.allFormElements) + // if (n.id === param.symbol) { + // // if (n.id === param.symbol) { + // const ng = n as NgParameter; + // ng.setValue(param.v); + // found = true; + // break; + // } + // if (found) break; + // } + // } + // } + + this.subscribeFieldsetContainer(); } /** @@ -58,4 +92,37 @@ export class FormulaireParallelStructure extends FormulaireDefinition { public get results(): CalculatorResults[] { return this._formResult.results; } + + /** + * abonnement en tant qu'observateur du FieldsetContainer + */ + private subscribeFieldsetContainer() { + const n = this.getFormulaireNodeById("struct_container"); + if (n == undefined || !(n instanceof FieldsetContainer)) + throw new Error("l'élément 'struct_container' n'est pas du type FieldsetContainer"); + const fsc: FieldsetContainer = n as FieldsetContainer; + fsc.addObserver(this); + } + + /** + * abonnement en tant qu'observateur du SelectField des FieldSet contenus dans le FieldsetContainer + */ + private subscribeStructureSelectFields(fs: FieldSet) { + for (const n of fs.allFormElements) + if (n instanceof SelectField) + n.addObserver(this); + } + + public update(sender: any, data: any) { + if (sender instanceof FieldsetContainer) + switch (data["action"]) { + case "newFieldset": + this.reset(); + this.subscribeStructureSelectFields(data["fieldset"]); + } + else if (sender instanceof SelectField) { + // la valeur d'un des select (type d'ouvrage, loi de débit) a changé + this.reset(); + } + } } diff --git a/src/app/formulaire/definition/form-compute.ts b/src/app/formulaire/definition/form-compute.ts index 33b9eb2db..ae5ca83e5 100644 --- a/src/app/formulaire/definition/form-compute.ts +++ b/src/app/formulaire/definition/form-compute.ts @@ -1,16 +1,9 @@ -import { IObservable, Observable, Observer } from "../../services/observer"; import { FormResult } from "./form-result"; import { ParamsEquation, ComputeNode } from "jalhyd"; import { FormulaireDefinition } from "./form-definition"; export abstract class FormCompute { - /** - * implémentation par délégation de IObservable - */ - private _observable: Observable; - constructor(protected _formBase: FormulaireDefinition, protected _formResult: FormResult) { - this._observable = new Observable; } protected abstract getNubAndParameters(): [ComputeNode, ParamsEquation]; @@ -28,6 +21,6 @@ export abstract class FormCompute { this._formBase.notifyObservers({ "action": "resultsUpdated", - }); + }, this._formBase); } -} \ No newline at end of file +} diff --git a/src/app/formulaire/definition/form-def-fixedvar.ts b/src/app/formulaire/definition/form-def-fixedvar.ts index 0db6220e3..75e0c71aa 100644 --- a/src/app/formulaire/definition/form-def-fixedvar.ts +++ b/src/app/formulaire/definition/form-def-fixedvar.ts @@ -81,8 +81,7 @@ export class FormDefFixedVar { newCal.radioState = ParamRadioConfig.CAL; } - this._formBase.resetResults(); - this._formBase.applyDependencies(); + this._formBase.reset(); } /** diff --git a/src/app/formulaire/definition/form-def-section.ts b/src/app/formulaire/definition/form-def-section.ts index 558d4f458..556e58edd 100644 --- a/src/app/formulaire/definition/form-def-section.ts +++ b/src/app/formulaire/definition/form-def-section.ts @@ -33,7 +33,11 @@ export class FormDefSection implements Observer { } private updateSectionNodeType() { - this._sectionNodeType = this.getNodeTypeFromSelectField(); + const nt = this.getNodeTypeFromSelectField(); + if (this._sectionNodeType !== nt) { + this._sectionNodeType = nt; + this._formBase.reset(); + } } public getSectionVariatedParameter(): NgParameter { diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts index 70e107df1..e838c009d 100644 --- a/src/app/formulaire/definition/form-definition.ts +++ b/src/app/formulaire/definition/form-definition.ts @@ -2,7 +2,6 @@ import { CalculatorType, ComputeNodeType } from "jalhyd"; import { FormulaireElement } from "../formulaire-element"; import { NgParameter, ParamRadioConfig } from "../ngparam"; import { Field } from "../field"; -import { IObservable, Observer, Observable } from "../../services/observer"; import { StringMap } from "../../stringmap"; import { FormulaireNode } from "../formulaire-node"; import { ApplicationSetupService } from "../../services/app-setup/app-setup.service"; @@ -18,12 +17,7 @@ import { CalculatorResults } from "../../results/calculator-results"; /** * classe de base pour tous les formulaires */ -export abstract class FormulaireDefinition extends FormulaireNode { //implements IFormulaireDefinition { - /** - * implémentation par délégation de IObservable - */ - private _observable: Observable; - +export abstract class FormulaireDefinition extends FormulaireNode { /** * type de calculette */ @@ -40,7 +34,6 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements ) { super(); this._calcType = calcType; - this._observable = new Observable(); } public get calculatorType(): CalculatorType { @@ -211,6 +204,15 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements throw new Error(`Formulaire.getNodeParameterValue() : pas de paramètre ${symbol} trouvé`); } + /** + * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... : + * effacement des résultats, application des dépendances, ... + */ + public reset() { + this.resetResults(); + this.applyDependencies(); + } + /** * retourne la valeur actuellement sélectionnée d'un SelectField * @param selectFieldId id du SelectField @@ -241,7 +243,7 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements fe.applyDependencies(this); } - public abstract resetResults(); + protected abstract resetResults(); public abstract doCompute(); public abstract get hasResults(): boolean; public abstract get results(): CalculatorResults[]; @@ -306,26 +308,12 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements throw new Error("FormulaireDefinition.clone() non implémenté"); } - // interface IObservable - - /** - * ajoute un observateur à la liste - */ - public addObserver(o: Observer) { - this._observable.addObserver(o); - } - - /** - * supprime un observateur de la liste - */ - public removeObserver(o: Observer) { - this._observable.removeObserver(o); - } + // interface Observer - /** - * notifie un événement aux observateurs - */ - public notifyObservers(data: any) { - this._observable.notifyObservers(data, this); - } + // update(sender: IObservable, data: any) { + // switch (data["action"]) { + // case "resetForm": // événement demandant une réinitialisation du formulaire (changement d'un SelectField, ...) + // this.onReset(); + // } + // } } diff --git a/src/app/formulaire/fieldset-container.ts b/src/app/formulaire/fieldset-container.ts index d33157cc8..5999f7c65 100644 --- a/src/app/formulaire/fieldset-container.ts +++ b/src/app/formulaire/fieldset-container.ts @@ -68,6 +68,12 @@ export class FieldsetContainer extends FormulaireElement { this.fieldsets.push(inst); inst.applyDependencies(this.parentForm); this.updateLocalisation() + + // notification de création d'un FieldSet + this.notifyObservers({ + "action": "newFieldset", + "fieldset": inst + }, this); } public get fieldsets(): FieldSet[] { diff --git a/src/app/formulaire/formulaire-node.ts b/src/app/formulaire/formulaire-node.ts index e569c7e30..285e8917d 100644 --- a/src/app/formulaire/formulaire-node.ts +++ b/src/app/formulaire/formulaire-node.ts @@ -2,11 +2,12 @@ import { JalhydObject } from "jalhyd" import { FormulaireDefinition } from "./definition/form-definition"; import { DeepFormulaireNodeIterator } from "./form-iterator/deep-node-iterator"; +import { IObservable, Observer, Observable } from "../services/observer"; /** * représentation sous forme d'arbre du formulaire et de ses éléments */ -export abstract class FormulaireNode { +export abstract class FormulaireNode implements IObservable { /** * identifiant dans le fichier de conf */ @@ -32,10 +33,16 @@ export abstract class FormulaireNode { */ private _fromTemplate: FormulaireNode; + /** + * implémentation par délégation de IObservable + */ + private _observable: Observable; + constructor(isTmpl: boolean = false) { this._kids = []; this._uid = JalhydObject.nextUID; this._isTemplate = isTmpl; + this._observable = new Observable() } get id(): string { @@ -177,4 +184,27 @@ export abstract class FormulaireNode { public abstract parseConfig(json: {}, data?: {}); public abstract parseDependencies(json: {}, parentForm: FormulaireDefinition); + + // interface IObservable + + /** + * ajoute un observateur à la liste + */ + public addObserver(o: Observer) { + this._observable.addObserver(o); + } + + /** + * supprime un observateur de la liste + */ + public removeObserver(o: Observer) { + this._observable.removeObserver(o); + } + + /** + * notifie un événement aux observateurs + */ + notifyObservers(data: any, sender?: any) { + this._observable.notifyObservers(data, sender); + } } diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts index f054d4ffa..6cd0bd3a1 100644 --- a/src/app/formulaire/ngparam.ts +++ b/src/app/formulaire/ngparam.ts @@ -4,7 +4,6 @@ import { InputField } from "./input-field"; import { Dependency } from "./dependency/dependency"; import { DependencyConditionType } from "./dependency/dependency-condition"; import { ValueDependencyCondition } from "./dependency/value-dependency-condition"; -import { Observable, IObservable, Observer } from "../services/observer"; import { FormulaireDefinition } from "./definition/form-definition"; import { ApplicationSetupService } from "../services/app-setup/app-setup.service"; @@ -44,7 +43,7 @@ export enum ParamValueMode { /** * classe englobante de ParamDefinition (champs supplémentaires pour l'affichage, radio boutons, ...) */ -export class NgParameter extends InputField { // implements IObservable { +export class NgParameter extends InputField { public unit: string; public radioConfig: ParamRadioConfig; public radioState: ParamRadioConfig; @@ -75,14 +74,8 @@ export class NgParameter extends InputField { // implements IObservable { */ private _valueList: number[]; - /** - * implémentation par délégation de IObservable - */ - private _observable: Observable; - constructor(private _paramDef: ParamDefinition, isTmpl = false) { super(isTmpl); - this._observable = new Observable(); } get symbol(): string { @@ -326,27 +319,4 @@ export class NgParameter extends InputField { // implements IObservable { protected clone(): NgParameter { return new NgParameter(this._paramDef.clone()); } - - // // interface IObservable - - // /** - // * ajoute un observateur à la liste - // */ - // public addObserver(o: Observer) { - // this._observable.addObserver(o); - // } - - // /** - // * supprime un observateur de la liste - // */ - // public removeObserver(o: Observer) { - // this._observable.removeObserver(o); - // } - - // /** - // * notifie un événement aux observateurs - // */ - // public notifyObservers(data: any) { - // this._observable.notifyObservers(data, this); - // } } diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts index ab25d5ef9..65bfbfc94 100644 --- a/src/app/formulaire/select-field.ts +++ b/src/app/formulaire/select-field.ts @@ -6,17 +6,14 @@ import { ValueDependencyCondition } from "./dependency/value-dependency-conditio import { StringMap } from "../stringmap"; import { IObservable, Observable, Observer } from "../services/observer"; -export class SelectField extends Field implements IObservable { +export class SelectField extends Field { private _entries: SelectEntry[]; private _selectedEntry: SelectEntry; - private _observable: Observable; - constructor(isTmpl = false) { super(isTmpl); this._entries = []; - this._observable = new Observable(); } public get entries() { @@ -36,7 +33,10 @@ export class SelectField extends Field implements IObservable { public setValue(v: SelectEntry) { if (this._selectedEntry !== v) { this._selectedEntry = v; - this.notifyObservers({ "action": "select", "value": v }); + this.notifyObservers({ + "action": "select", + "value": v + }, this); } } @@ -93,27 +93,4 @@ export class SelectField extends Field implements IObservable { this.addEntry(e); } } - - // interface IObservable - - /** - * ajoute un observateur à la liste - */ - public addObserver(o: Observer) { - this._observable.addObserver(o); - } - - /** - * supprime un observateur de la liste - */ - public removeObserver(o: Observer) { - this._observable.removeObserver(o); - } - - /** - * notifie un événement aux observateurs - */ - public notifyObservers(data: any) { - this._observable.notifyObservers(data, this); - } } -- GitLab