196 lines
3.5 KiB
JavaScript
Raw Normal View History

import {isPresent} from 'angular2/src/facade/lang';
import {StringMap, StringMapWrapper} from 'angular2/src/facade/collection';
import {nullValidator, controlGroupValidator} from './validators';
export const VALID = "VALID";
export const INVALID = "INVALID";
2015-02-24 11:59:10 -08:00
//interface IControl {
// get value():any;
// validator:Function;
// get status():string;
2015-02-25 12:54:27 -08:00
// get valid():boolean;
2015-02-24 11:59:10 -08:00
// get errors():Map;
// get active():boolean {}
// updateValue(value:any){}
// setParent(parent){}
//}
export class Control {
2015-02-24 11:59:10 -08:00
_value:any;
_status:string;
_errors;
2015-02-25 12:54:27 -08:00
_dirty:boolean;
_parent:ControlGroup;
2015-02-24 11:59:10 -08:00
validator:Function;
constructor(value:any, validator:Function = nullValidator) {
2015-02-24 11:59:10 -08:00
this._value = value;
this.validator = validator;
2015-02-25 12:54:27 -08:00
this._dirty = true;
}
updateValue(value:any) {
2015-02-24 11:59:10 -08:00
this._value = value;
2015-02-25 12:54:27 -08:00
this._dirty = true;
this._updateParent();
}
2015-02-24 11:59:10 -08:00
get active():boolean {
return true;
}
get value() {
return this._value;
}
get status() {
this._updateIfNeeded();
return this._status;
}
get valid() {
2015-02-24 11:59:10 -08:00
this._updateIfNeeded();
return this._status === VALID;
}
get errors() {
this._updateIfNeeded();
return this._errors;
}
setParent(parent){
this._parent = parent;
}
2015-02-24 11:59:10 -08:00
_updateIfNeeded() {
2015-02-25 12:54:27 -08:00
if (this._dirty) {
this._dirty = false;
2015-02-24 11:59:10 -08:00
this._errors = this.validator(this);
this._status = isPresent(this._errors) ? INVALID : VALID;
}
}
_updateParent() {
if (isPresent(this._parent)){
this._parent._controlChanged();
}
}
}
export class ControlGroup {
2015-02-24 11:59:10 -08:00
_value:any;
_status:string;
_errors;
2015-02-25 12:54:27 -08:00
_dirty:boolean;
validator:Function;
2015-02-24 11:59:10 -08:00
controls;
constructor(controls, validator:Function = controlGroupValidator) {
this.controls = controls;
this.validator = validator;
2015-02-25 12:54:27 -08:00
this._dirty = true;
this._setParentForControls();
}
get value() {
2015-02-24 11:59:10 -08:00
this._updateIfNeeded();
return this._value;
}
get status() {
this._updateIfNeeded();
return this._status;
}
get valid() {
2015-02-24 11:59:10 -08:00
this._updateIfNeeded();
return this._status === VALID;
}
get errors() {
this._updateIfNeeded();
return this._errors;
}
_setParentForControls() {
StringMapWrapper.forEach(this.controls, (control, name) => {
2015-02-24 11:59:10 -08:00
control.setParent(this);
});
}
2015-02-24 11:59:10 -08:00
_updateIfNeeded() {
2015-02-25 12:54:27 -08:00
if (this._dirty) {
this._dirty = false;
2015-02-24 11:59:10 -08:00
this._value = this._reduceValue();
this._errors = this.validator(this);
this._status = isPresent(this._errors) ? INVALID : VALID;
}
}
_reduceValue() {
var newValue = {};
StringMapWrapper.forEach(this.controls, (control, name) => {
if (control.active) {
newValue[name] = control.value;
}
});
return newValue;
}
_controlChanged() {
2015-02-25 12:54:27 -08:00
this._dirty = true;
}
}
2015-02-24 11:59:10 -08:00
export class OptionalControl {
_control:Control;
_cond:boolean;
constructor(control:Control, cond:boolean) {
super();
this._control = control;
this._cond = cond;
}
get active():boolean {
return this._cond;
}
get value() {
return this._control.value;
}
get status() {
return this._control.status;
}
get errors() {
return this._control.errors;
}
set validator(v) {
this._control.validator = v;
}
get validator() {
return this._control.validator;
}
set cond(value:boolean){
this._cond = value;
this._control._updateParent();
}
get cond():boolean{
return this._cond;
}
updateValue(value:any){
this._control.updateValue(value);
}
setParent(parent){
this._control.setParent(parent);
}
}