base-param-input.component.ts 2.89 KiB
// 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 { BaseParam, NumericalString, Message, ParamDomain, ParamDomainValue } from "jalhyd";
import { InternationalisationService, LanguageCode } from "../../services/internationalisation/internationalisation.service";
import { Observable } from "../../services/observer";
import { GenericInputComponent } from "../generic-input/generic-input.component";
export class NgBaseParam extends Observable {
    private _param: BaseParam;
    constructor(symb: string, d: ParamDomain | ParamDomainValue, val: number) {
        super();
        this._param = new BaseParam(symb, d, val);
    public get symbol() {
        return this._param.symbol;
    public get isDefined() {
        return this._param.isDefined;
    public getValue() {
        return this._param.getValue();
    public checkValue(val: number) {
        return this._param.checkValue(val);
    public setValue(val: number) {
        this._param.setValue(val);
        this.notifyObservers(val);
@Component({
    selector: "base-param-input",
    templateUrl: "../generic-input/generic-input.component.html",
export class BaseParamInputComponent extends GenericInputComponent {
    /**
     * managed parameter
    @Input('param')
    private _paramDef: NgBaseParam;
    constructor(private intlService: InternationalisationService) {
        super();
    protected getModelValue(): any {
        return this._paramDef.getValue();
    protected setModelValue(v: any) {
        try {
            this._paramDef.setValue(v);
        catch (e) {
            // géré par validateModelValue()
    protected validateModelValue(v: any): { isValid: boolean, message: string } {
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
let msg = undefined; let valid = false; 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; } }