An error occurred while loading the file. Please try again.
-
Mathias Chouet authoredc9000b0f
import { Component, Input, Output, EventEmitter, QueryList, ViewChildren, DoCheck, AfterViewInit } from "@angular/core";
import { FieldsetContainer } from "../../formulaire/fieldset-container";
import { FieldSetComponent } from "../field-set/field-set.component";
import { FieldSet } from "../../formulaire/fieldset";
import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
@Component({
selector: "fieldset-container",
templateUrl: "./fieldset-container.component.html",
styleUrls: [
"./fieldset-container.component.scss"
]
})
export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
public get title(): string {
if (this._container) {
return this._container.label;
}
}
public get fieldsets() {
return this._container.fieldsets;
}
public get isValid() {
return this._isValid;
}
@Input()
private _container: FieldsetContainer;
/**
* liste des composants FieldSet enfants
*/
@ViewChildren(FieldSetComponent)
private _fieldsetComponents: QueryList<FieldSetComponent>;
/**
* flag de validité des FieldSet enfants
*/
private _isValid = false;
/**
* événément de changement d'état d'un radio
*/
// tslint:disable-next-line:no-output-on-prefix
@Output()
private radio = new EventEmitter<any>();
/**
* événément de changement de validité
*/
@Output()
private validChange = new EventEmitter();
/**
* événément de changement de valeur d'un input
*/
@Output()
private inputChange = new EventEmitter();
/** événement signalant un appui sur TAB ou SHIFT+TAB */
@Output()
protected tabPressed = new EventEmitter<any>();
private addStructure(after?: FieldSet) {
if (after) {
this._container.addFromTemplate(0, after.indexAsKid());
} else {
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
this._container.addFromTemplate(0);
}
}
private onFieldsetListChange() {
// affichage des boutons ajouter, supprimer, monter, descendre
this._fieldsetComponents.forEach(fs => fs.showButtons = true);
// désactivation du bouton supprimer s'il n'en reste qu'un
if (this._fieldsetComponents.length === 1) {
const fs = this._fieldsetComponents.last as FieldSetComponent;
fs.enableRemoveButton = false;
} else {
this._fieldsetComponents.forEach(fs => fs.enableRemoveButton = true);
}
// désactivation du bouton monter pour le 1er
this._fieldsetComponents.forEach(fs => {
fs.enableUpButton = true;
fs.enableDownButton = true;
});
this._fieldsetComponents.first.enableUpButton = false;
// désactivation du bouton monter pour le dernier
this._fieldsetComponents.last.enableDownButton = false;
// renumérotation
let n = 1;
this._fieldsetComponents.forEach(fsc => {
fsc.fieldsetNumber = n;
n++;
}
);
}
public ngAfterViewInit() {
this.onFieldsetListChange();
this._fieldsetComponents.changes.subscribe(_ => this.onFieldsetListChange());
}
/*
* gestion des événements clic sur les radios :
* réception d'un message du composant enfant (field-set)
* cf. https://angular.io/guide/component-interaction#parent-listens-for-child-event
*/
private onRadioClick(info: any) {
// on renvoie l'info au parent
this.radio.emit(info);
}
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)
fieldset,
// currentIndex (indice courant dans le tableau)
currIndex,
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
// array (tableau parcouru)
array
) => {
return acc && fieldset.isValid;
}
// valeur initiale
, this._fieldsetComponents.length > 0);
}
this.validChange.emit();
}
/**
* réception d'un événement de validité de FieldSet
*/
private onFieldsetValid() {
this.updateValidity();
}
/**
* réception d'un événement de changement de valeur d'un input
*/
private onInputChange(event: boolean) {
this.inputChange.emit();
}
/**
* relit les valeurs dans l'interface et met à jour les NgParameter
*/
public updateParametersFromUI() {
this._fieldsetComponents.forEach(fsc => fsc.updateParametersFromUI());
}
/**
* met à jour les paramètres liés
*/
public updateLinkedParameters() {
this._fieldsetComponents.forEach(fsc => fsc.updateLinkedParameters());
}
/**
* réception d'un événement de demande d'ajout d'un FieldSet
*/
private onAddFieldset(fs: FieldSet) {
this.addStructure(fs);
}
/**
* réception d'un événement de demande de suppression d'un FieldSet
*/
private onRemoveFieldset(fs: FieldSet) {
const form = this._container.parent as FormulaireDefinition;
form.removeFieldset(fs);
}
/**
* réception d'un événement de demande de remontée d'un FieldSet
*/
private onMoveFieldsetUp(fs: FieldSet) {
const form = this._container.parent as FormulaireDefinition;
form.moveFieldsetUp(fs);
}
/**
* réception d'un événement de demande de descente d'un FieldSet
*/
private onMoveFieldsetDown(fs: FieldSet) {
const form = this._container.parent as FormulaireDefinition;
form.moveFieldsetDown(fs);
}
211212213214215216217218219
/**
* Renvoie l'événement au composant du dessus
*/
public onTabPressed(event) {
this.tabPressed.emit(event);
}
}