Skip to content
Snippets Groups Projects
ngparam-input.component.ts 3.44 KiB
Newer Older
// cf. https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html

import { Component, Input, forwardRef, OnInit, DoCheck, ChangeDetectorRef } from "@angular/core";
import { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormControl } from "@angular/forms";

import { ComputeNodeType, ParamDefinition, NumericalString, Message, MessageCode } 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",
    templateUrl: "../generic-input/generic-input.component.html"
})
export class NgParamInputComponent extends GenericInputComponent implements Observer {
    private get _paramDef(): NgParameter {
        return this.model;
    }
    /**
     * valeur intermédiaire nécessitée par le fait que toutes les valeurs numériques ne sont pas légales
     * pour NgParameter (l'affecter peut provoquer une exception) et qui permet de faire fonctionner la validation du modèle
     */
    private _tmp: number;
    constructor(private intlService: InternationalisationService) {
        super();
    }

    /**
       * appelé avant le changement de modèle
       */
    protected beforeSetModel() {
        if (this._paramDef != undefined)
            this._paramDef.removeObserver(this);
    }

    /**
     * appelé après le changement de modèle
     */
    protected afterSetModel() {
        if (this._paramDef != undefined) {
            if (this._paramDef.isDefined)
                this._tmp = this._paramDef.getValue();
            this._paramDef.addObserver(this);
        }
    }

        return this._tmp;
        this._tmp = v;
        try {
            this._paramDef.setValue(v);
        }
        catch (e) {
            // géré par validateModelValue()
        }
    }

    protected validateModelValue(v: any): { isValid: boolean, message: string } {
        let msg = undefined;
        let valid = false;

francois.grand's avatar
francois.grand committed
        if (this._paramDef == undefined)
            msg = "internal error, model undefined";
        else
            try {
                this._paramDef.checkValue(v);
                valid = true;
            }
            catch (e) {
                if (e instanceof Message)
                    msg = this.intlService.localizeMessage(e);
                else
                    msg = "invalid value";
            }

        return { isValid: valid, message: msg };
    }

    protected modelToUI(v: any): string {
        return String(v);
    }

    protected validateUIValue(ui: string): { isValid: boolean, message: string } {
        let valid: boolean = false;
        let msg: string = undefined;

        let v: NumericalString = new NumericalString(ui);
        if (!v.isNumerical)
            msg = "Veuillez entrer une valeur numérique";
        else
            valid = true;

        return { isValid: valid, message: msg };
    }

    protected uiToModel(ui: string) {
        return +ui;
    }
    public update(sender: IObservable, data: any): void {
        if (data["action"] == "value") {
            this._tmp = data["value"];