param-values.component.ts 9.67 KiB
import { Component, Input, Output, EventEmitter, ViewChild, AfterViewChecked, OnChanges } from "@angular/core";
import { ParamValueMode } from "jalhyd";
import { InternationalisationService } from "../../services/internationalisation/internationalisation.service";
import { NgParameter } from "../../formulaire/ngparam";
import { NgParamMinComponent } from "./ngparam-min.component";
import { NgParamMaxComponent } from "./ngparam-max.component";
import { NgParamStepComponent } from "./ngparam-step.component";
import { BaseComponent } from "../base/base.component";
import { ValueListComponent } from "./value-list.component";
@Component({
    selector: "param-values",
    templateUrl: "./param-values.component.html",
    styles: [
        `.btn-on {
            color:#505050;
            border: 3px solid #505050;
            background-color:white;
            text-transform: uppercase;
            font-size: 0.8em;
        }`,
        `.btn-off {
            color:white;
            border: 3px solid #505050;
            background-color:#505050;
            text-transform: uppercase;
            font-size: 0.8em;
export class ParamValuesComponent extends BaseComponent implements AfterViewChecked, OnChanges {
    @Input()
    private param: NgParameter;
    private _valueModes = [];
    /**
     * true quand les champs du composant et de ses enfants sont initialisés
    private _initCompleted = false;
    /**
     * true si la valeur min est valide
    private _validMin = false;
    /**
     * true si la valeur max est valide
    private _validMax = false;
    /**
     * true si la valeur du pas est valide
    private _validStep = false;
    /**
     * true si la liste de valeurs est valide
    private _validList = false;
    /**
     * flag signalant qu'il faut initialiser le composant ValueListComponent (par ex quand on a sélectionné le mode "liste")
    private _doInitList = false;
    /**
     * flag signalant qu'il faut initialiser les composants min/max/pas
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
*/ private _doInitMinmax = false; /** * composant de saisie du minimum */ @ViewChild(NgParamMinComponent) private _minComponent: NgParamMinComponent; /** * composant de saisie du maximum */ @ViewChild(NgParamMaxComponent) private _maxComponent: NgParamMaxComponent; /** * composant de saisie du pas de variation */ @ViewChild(NgParamStepComponent) private _stepComponent: NgParamStepComponent; /** * composant de saisie d'une liste de valeurs */ @ViewChild(ValueListComponent) private _listComponent: ValueListComponent; @Output() private valid: EventEmitter<boolean>; constructor(private intlService: InternationalisationService) { super(); this._valueModes.push({ "value": ParamValueMode.MINMAX, "label": "Min/max" }); this._valueModes.push({ "value": ParamValueMode.LISTE, "label": "Liste" }); this.valid = new EventEmitter(); } /** * init des champs min/max/pas */ private initMinMaxStep() { if (this.isMinMax && this._doInitMinmax) { this._doInitMinmax = false; // valeur pour min : celle déjà définie ou celle déduite de la valeur saisie let min: number = this.param.minValue; if (min === undefined) { min = this.param.getValue() / 2; } // valeur pour max : celle déjà définie ou celle déduite de la valeur saisie let max: number = this.param.maxValue; if (max === undefined) { max = this.param.getValue() * 2; } this.param.minValue = min; this._minComponent.model = this.param; this.param.maxValue = max; this._maxComponent.model = this.param; // valeur du pas let step = this.param.stepValue; if (step === undefined) { step = (max - min) / 20; } this.param.stepValue = step; this._stepComponent.model = this.param;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
this.validateAll(); this._validMin = this._minComponent.isValid; this._validMax = this._maxComponent.isValid; this._validStep = this._stepComponent.isValid; this.emitValidity(); this._initCompleted = true; } } /** * initialisation de la liste de valeurs avec celle du paramètre géré */ private initList() { if (this._doInitList && this._listComponent !== undefined) { this._doInitList = false; let l = this.param.valueList; if (l === undefined) { if (this.param.isDefined) { l = [this.param.getValue()]; } else { l = []; } } this.param.valueList = l; this._listComponent.model = this.param; } } /** * revalidation de tous les composants enfants */ private validateAll() { if (this._minComponent !== undefined) { this._minComponent.validate(); } if (this._maxComponent !== undefined) { this._maxComponent.validate(); } if (this._stepComponent !== undefined) { this._stepComponent.validate(); } if (this._listComponent !== undefined) { this._listComponent.validate(); } } /** * envoi d'un événement de validité */ private emitValidity() { switch (this.param.valueMode) { case ParamValueMode.LISTE: this.valid.emit(this._validList); break; case ParamValueMode.MINMAX: this.valid.emit(this._validMin && this._validMax && this._validStep); break; } } /** * réception d'un événement de NgParamMinComponent */ private onMinChanged(event: any) { if (this._initCompleted) { switch (event.action) {
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
case "model": this.validateAll(); break; case "valid": this._validMin = event.value; this.emitValidity(); break; } } } /** * réception d'un événement de NgParamMaxComponent */ private onMaxChanged(event: any) { if (this._initCompleted) { switch (event.action) { case "model": this.validateAll(); break; case "valid": this._validMax = event.value; this.emitValidity(); break; } } } /** * réception d'un événement de NgParamStepComponent */ private onStepChanged(event: any) { if (this._initCompleted) { switch (event.action) { case "model": this.validateAll(); break; case "valid": this._validStep = event.value; this.emitValidity(); break; } } } /** * réception d'un événement de ValueListComponent */ private onListChanged(event: any) { if (this._initCompleted) { switch (event.action) { case "model": this.validateAll(); break; case "valid": this._validList = event.value; this.emitValidity(); break; } } } private get uitextValeurMini() { return this.intlService.localizeText("INFO_PARAMFIELD_VALEURMINI"); }
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
private get uitextValeurMaxi() { return this.intlService.localizeText("INFO_PARAMFIELD_VALEURMAXI"); } private get uitextPasVariation() { return this.intlService.localizeText("INFO_PARAMFIELD_PASVARIATION"); } /** * true si mode "liste de valeurs" */ public get isList(): boolean { return this.param.valueMode === ParamValueMode.LISTE; } /** * true si mode "lié" */ public get isLink(): boolean { return this.param.valueMode === ParamValueMode.LINK; } /** * true si mode "min/max/pas" */ public get isMinMax(): boolean { return this.param.valueMode === ParamValueMode.MINMAX; } /** * valeur courante affichée dans le select min-max/list */ public get currentModeSelectLabel(): string { return ParamValueMode[this.param.valueMode]; } /** * réception d'un événement du menu "min/max/liste" */ public onSelectValueMode(event: any) { const next = event.target.value; switch (next) { // on a sélectionné "min/max" ? case ParamValueMode.MINMAX: this._doInitMinmax = true; break; // on a sélectionné "liste" ? case ParamValueMode.LISTE: this._doInitList = true; break; default: throw new Error("valeur " + next + " de ParamValueMode non prise en charge"); } this.param.valueMode = next; } public get valueModes() { return this._valueModes; } /** * appelé quand les @Input changent */ ngOnChanges() { if (this.isMinMax) { this._doInitMinmax = true;
351352353354355356357358359360361362
} else { this._doInitList = true; } } ngAfterViewChecked() { super.ngAfterViewChecked(); this.initMinMaxStep(); this.initList(); } }