field-set.component.ts 6.83 KiB
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList, DoCheck } from "@angular/core";
import { ParamRadioConfig } from "../../formulaire/ngparam";
import { FieldSet } from "../../formulaire/fieldset";
import { ParamFieldLineComponent } from "../param-field-line/param-field-line.component";
import { Field } from "../../formulaire/field";
import { InputField } from "../../formulaire/input-field";
import { SelectField } from "../../formulaire/select-field";
@Component({
    selector: "field-set",
    templateUrl: "./field-set.component.html",
    styleUrls: ["./field-set.component.scss"]
export class FieldSetComponent implements DoCheck {
    @Input()
    private set fieldSet(fs: FieldSet) {
        this._fieldSet = fs;
    public get fields() {
        return this._fieldSet.kids;
    public set fieldsetNumber(n: number) {
        this._fieldSet.labelNumber = n;
    public get title(): string {
        if (! this._fieldSet) {
            return "fs undefined";
        if (! this._fieldSet.label) {
            return "label undefined";
        return this._fieldSet.label;
    public get isValid() {
        return this._isValid;
    /**
    * field set attribute
    private _fieldSet: FieldSet;
    @ViewChildren(ParamFieldLineComponent)
    private _paramComponents: QueryList<ParamFieldLineComponent>;
    /**
     * événement de changement de validité
    @Output()
    private validChange = new EventEmitter();
    /**
     * événement de changement de valeur d'un input
    @Output()
    private inputChange = new EventEmitter();
    /**
     * événement de demande d'ajout d'un fieldset (FieldSet dans un FieldsetContainer)
    @Output()
    private addFieldset = new EventEmitter();
    /**
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
* événement de demande de remontée d'un fieldset dans la liste (FieldSet dans un FieldsetContainer) */ @Output() private moveFieldsetUp = new EventEmitter(); /** * événement de demande de descente d'un fieldset dans la liste (FieldSet dans un FieldsetContainer) */ @Output() private moveFieldsetDown = new EventEmitter(); /** * événement de demande de suppression d'un fieldset (FieldSet dans un FieldsetContainer) */ @Output() private removeFieldset = new EventEmitter(); /** * flag de validité de la saisie */ private _isValid = false; /** * flag d'affichage des boutons ajouter, supprimer, monter, descendre */ public showButtons = false; /** * flag d'activation du bouton monter */ public enableUpButton = true; /** * flag d'activation du bouton descendre */ public enableDownButton = true; /** * flag d'activation du bouton supprimer */ public enableRemoveButton = true; /** * événement de changement d'état d'un radio */ // tslint:disable-next-line:no-output-on-prefix @Output() private radio = new EventEmitter<any>(); private hasRadioFix(): boolean { if (this._fieldSet.hasInputs) { switch (this._fieldSet.getInput(0).radioConfig) { case ParamRadioConfig.FIX: return false; default: return true; } } return false; } private hasRadioVar(): boolean { if (this._fieldSet.hasInputs) { switch (this._fieldSet.getInput(0).radioConfig) { case ParamRadioConfig.VAR: case ParamRadioConfig.CAL: return true; default:
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
return false; } } return false; } private 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 */ private isInputField(f: Field): boolean { return f instanceof InputField && f.isDisplayed; } /** * détermine si un Field est du type SelectField */ private isSelectField(f: Field): boolean { return f instanceof SelectField && f.isDisplayed; } /* * gestion des événements clic sur les radios : * réception d'un message du composant enfant (param-field) * 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); } /** * calcul de la validité de tous les ParamFieldLineComponent de la vue */ private updateValidity() { this._isValid = false; if (this._paramComponents) { this._isValid = this._paramComponents.reduce( // callback ( // accumulator (valeur précédente du résultat) acc, // currentValue (élément courant dans le tableau) param, // currentIndex (indice courant dans le tableau) currIndex, // array (tableau parcouru) array ) => { return acc && param.isValid; } // valeur initiale , true); } this.validChange.emit(); }
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
public ngDoCheck() { this.updateValidity(); } /** * réception d'un événement de validité de ParamFieldLineComponent */ private onParamLineValid(event: boolean) { 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._paramComponents.forEach(fsc => fsc.updateParameterFromUI()); } /** * met à jour les paramètres liés */ public updateLinkedParameters() { this._paramComponents.forEach(fsc => fsc.updateLinkedParameter()); } /** * clic sur le bouton ajouter */ private onAddClick() { this.addFieldset.emit(this._fieldSet); } /** * clic sur le bouton supprimer */ private onRemoveClick() { this.removeFieldset.emit(this._fieldSet); } /** * clic sur le bouton monter */ private onMoveUpClick() { this.moveFieldsetUp.emit(this._fieldSet); } /** * clic sur le bouton descendre */ private onMoveDownClick() { this.moveFieldsetDown.emit(this._fieldSet); } }