Newer
Older
francois.grand
committed
// 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";
francois.grand
committed
import { Observer, IObservable } from "../../services/observer";
francois.grand
committed
@Component({
selector: "ngparam-input",
templateUrl: "../generic-input/generic-input.component.html"
})
francois.grand
committed
export class NgParamInputComponent extends GenericInputComponent implements Observer {
francois.grand
committed
/**
francois.grand
committed
* paramètre géré
francois.grand
committed
*/
private get _paramDef(): NgParameter {
return this.model;
}
francois.grand
committed
francois.grand
committed
/**
* 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
*/
francois.grand
committed
francois.grand
committed
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);
}
}
francois.grand
committed
protected getModelValue(): any {
francois.grand
committed
}
protected setModelValue(v: any) {
francois.grand
committed
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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;
}
francois.grand
committed
francois.grand
committed
public update(sender: IObservable, data: any): void {
if (data["action"] == "value") {
francois.grand
committed
this.updateAndValidateUI();
}
francois.grand
committed
}