From 476add1514d65823ee6a7df3c9c9dea87fb42f95 Mon Sep 17 00:00:00 2001 From: "francois.grand" <francois.grand@irstea.fr> Date: Mon, 12 Mar 2018 11:37:46 +0100 Subject: [PATCH] =?UTF-8?q?=20#27=20:=20ajout=20des=20=C3=A9v=C3=A9nements?= =?UTF-8?q?=20de=20validit=C3=A9=20=C3=A0=20la=20classe=20FieldsetContaine?= =?UTF-8?q?rComponent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../field-set/field-set.component.ts | 14 ++-- .../fieldset-container.component.html | 3 +- .../fieldset-container.component.ts | 65 ++++++++++++++++++- .../calculator.component.html | 7 +- .../calculator.component.ts | 34 ++++++++++ 5 files changed, 111 insertions(+), 12 deletions(-) diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts index 391966eba..0594d7767 100644 --- a/src/app/components/field-set/field-set.component.ts +++ b/src/app/components/field-set/field-set.component.ts @@ -1,11 +1,10 @@ -import { Component, Input, Output, EventEmitter, ViewChildren, QueryList } from "@angular/core"; +import { Component, Input, Output, EventEmitter, ViewChildren, QueryList, DoCheck } from "@angular/core"; import { ParamDefinition } from "jalhyd"; import { NgParameter, ParamRadioConfig } from "../../formulaire/ngparam"; import { FieldSet } from "../../formulaire/fieldset"; import { ParamFieldLineComponent } from "../param-field-line/param-field-line.component"; -import { BaseComponent } from "../base/base.component"; import { SelectEntry } from "../../formulaire/select-entry"; import { Field } from "../../formulaire/field"; import { InputField } from "../../formulaire/input-field"; @@ -26,7 +25,7 @@ import { CheckField } from "../../formulaire/check-field"; }` ] }) -export class FieldSetComponent extends BaseComponent { +export class FieldSetComponent implements DoCheck { /** * field set attribute */ @@ -44,7 +43,7 @@ export class FieldSetComponent extends BaseComponent { * événément de changement de validité */ @Output() - private onValid = new EventEmitter(); + private validChange = new EventEmitter(); /** * flag de validité de la saisie @@ -152,6 +151,8 @@ export class FieldSetComponent extends BaseComponent { * calcul de la validité de tous les ParamFieldLineComponent de la vue */ private updateValidity() { + this._isValid = false; + if (this._paramComponents != undefined) this._isValid = this._paramComponents.reduce( // callback @@ -169,9 +170,11 @@ export class FieldSetComponent extends BaseComponent { } // valeur initiale , true); + + this.validChange.emit(); } - protected afterFirstViewChecked() { + public ngDoCheck() { this.updateValidity(); } @@ -180,7 +183,6 @@ export class FieldSetComponent extends BaseComponent { */ private onParamLineValid(event: boolean) { this.updateValidity(); - this.onValid.emit(); } /** diff --git a/src/app/components/fieldset-container/fieldset-container.component.html b/src/app/components/fieldset-container/fieldset-container.component.html index 81bbc3f36..ad3546595 100644 --- a/src/app/components/fieldset-container/fieldset-container.component.html +++ b/src/app/components/fieldset-container/fieldset-container.component.html @@ -6,6 +6,7 @@ <!-- 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)> + <field-set *ngFor="let fs of fieldsets" [fieldSet]=fs (selectChange)=onSelectChanged($event) (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 240513653..e2da23746 100644 --- a/src/app/components/fieldset-container/fieldset-container.component.ts +++ b/src/app/components/fieldset-container/fieldset-container.component.ts @@ -1,13 +1,15 @@ -import { Component, Input, Output, EventEmitter } from "@angular/core"; +import { Component, Input, Output, EventEmitter, QueryList, ViewChildren, DoCheck } from "@angular/core"; import { FieldsetContainer } from "../../formulaire/fieldset-container"; import { SelectEntry } from "../../formulaire/select-entry"; +import { FieldSet } from "../../formulaire/fieldset"; +import { FieldSetComponent } from "../field-set/field-set.component"; @Component({ selector: "fieldset-container", templateUrl: "./fieldset-container.component.html" }) -export class FieldsetContainerComponent { +export class FieldsetContainerComponent implements DoCheck { @Input("container") private _container: FieldsetContainer; @@ -17,6 +19,17 @@ export class FieldsetContainerComponent { @Output() private selectChange = new EventEmitter<SelectEntry>(); + /** + * liste des composants FieldSet enfants + */ + @ViewChildren(FieldSetComponent) + private _fieldsetComponents: QueryList<FieldSetComponent>; + + /** + * flag de validité des FieldSet enfants + */ + private _isValid: boolean = false; + private get title(): string { if (this._container == undefined) return undefined; @@ -53,4 +66,52 @@ export class FieldsetContainerComponent { */ @Output() private onRadio = new EventEmitter<any>(); + + public ngDoCheck() { + this.updateValidity(); + } + + /** + * calcul de la validité de tous les FieldSet de la vue + */ + private updateValidity() { + this._isValid = false; + + if (this._fieldsetComponents != undefined) + this._isValid = this._fieldsetComponents.reduce( + // callback + ( + // accumulator (valeur précédente du résultat) + acc, + // currentValue (élément courant dans le tableau) + fielset, + // currentIndex (indice courant dans le tableau) + currIndex, + // array (tableau parcouru) + array + ) => { + return acc && fielset.isValid; + } + // valeur initiale + , this._fieldsetComponents.length > 0); + + this.validChange.emit(); + } + + public get isValid() { + return this._isValid; + } + + /** + * événément de changement de validité + */ + @Output() + private validChange = new EventEmitter(); + + /** + * réception d'un événement de validité de FieldSet + */ + private onFieldsetValid() { + this.updateValidity(); + } } \ No newline at end of file diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html index 1a3790464..5d8e83658 100644 --- a/src/app/components/generic-calculator/calculator.component.html +++ b/src/app/components/generic-calculator/calculator.component.html @@ -24,9 +24,10 @@ <!-- 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) (onValid)=OnFieldsetValid()></field-set> + (selectChange)=onSelectChanged($event) (validChange)=OnFieldsetValid()></field-set> - <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event)></fieldset-container> + <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event) + (validChange)=onFieldsetContainerValid()></fieldset-container> </ng-template> </div> @@ -67,4 +68,4 @@ </div> </div> </div> -</div> +</div> \ No newline at end of file diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts index fcb732cbc..f69d1cb95 100644 --- a/src/app/components/generic-calculator/calculator.component.ts +++ b/src/app/components/generic-calculator/calculator.component.ts @@ -14,6 +14,7 @@ import { CalculatorNameComponent } from "./calc-name.component"; import { SelectEntry } from "../../formulaire/select-entry"; import { FormulaireElement } from "../../formulaire/formulaire-element"; import { FieldsetContainer } from "../../formulaire/fieldset-container"; +import { FieldsetContainerComponent } from "../fieldset-container/fieldset-container.component"; @Component({ selector: 'hydrocalc', @@ -43,6 +44,12 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit, @ViewChildren(FieldSetComponent) private _fieldsetComponents: QueryList<FieldSetComponent>; + /** + * liste des FieldsetContainerComponent + */ + @ViewChildren(FieldsetContainerComponent) + private _fieldsetContainerComponents: QueryList<FieldsetContainerComponent>; + /** * composant d'affichage des résultats */ @@ -268,6 +275,8 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit, * calcul de la validité globale de la vue */ private updateUIValidity() { + this._isUIValid = false; + if (this._fieldsetComponents != undefined) this._isUIValid = this._fieldsetComponents.reduce( // callback @@ -284,6 +293,24 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit, return acc && fieldset.isValid; } // valeur initiale + , this._fieldsetComponents.length > 0); + + if (this._fieldsetContainerComponents != undefined) + this._isUIValid = this._isUIValid && this._fieldsetContainerComponents.reduce( + // callback + ( + // accumulator (valeur précédente du résultat) + acc, + // currentValue (élément courant dans le tableau) + fieldsetContainer, + // currentIndex (indice courant dans le tableau) + currIndex, + // array (tableau parcouru) + array + ) => { + return acc && fieldsetContainer.isValid; + } + // valeur initiale , true); } @@ -293,4 +320,11 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit, private OnFieldsetValid() { this.updateUIValidity(); } + + /** + * réception d'un événement de validité d'un FieldsetContainerComponent + */ + private onFieldsetContainerValid() { + this.updateUIValidity(); + } } -- GitLab