// 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 } { 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; } }