-
francois.grand authoredfrancois.grand authored
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 } {
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;
}
}