Skip to content

Commit d594aa2

Browse files
committed
basic ErrorsChanged - implementation
1 parent a05be83 commit d594aa2

File tree

5 files changed

+499
-17
lines changed

5 files changed

+499
-17
lines changed

.idea/libraries/Generated_files.xml

+8-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"Q": "latest",
2525
"axios": "^0.3.1",
2626
"hashmap": "^1.1.0",
27+
"jasmine": "^2.0.1",
2728
"moment": "^2.7.0",
2829
"observe-js": "^0.1.0",
2930
"underscore": "latest",

src/validation/Validation.ts

+35-11
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ module Validation {
176176
*/
177177
Optional?: IOptional;
178178

179+
/**
180+
* Occurs when the validation errors have changed for a property or for the entire entity.
181+
*/
182+
ErrorsChanged:Utils.ISignal<any>;
183+
179184
/**
180185
* It enables support for localization of error messages.
181186
*/
@@ -361,7 +366,7 @@ module Validation {
361366
/**
362367
* It represents property validation rule for type of <T>.
363368
*/
364-
export interface IPropertyValidationRule<T> {
369+
export interface IPropertyValidationRule<T> extends IValidationResult {
365370
/**
366371
*The validators that are grouped under this rule.
367372
*/
@@ -435,7 +440,7 @@ module Validation {
435440
*/
436441
export class Error implements IError{
437442

438-
public HasError: boolean = true;
443+
public HasError: boolean = false;
439444
public ErrorMessage: string = "";
440445

441446
constructor() {
@@ -493,6 +498,11 @@ module Validation {
493498
public Remove(index: number) {
494499
throw ("Cannot remove ValidationResult from leaf node.");
495500
}
501+
public ErrorsChanged:Utils.ISignal<any> = new Utils.Signal();
502+
503+
public DispatchErrorsChanged(){
504+
if (this.ErrorsChanged !== undefined) this.ErrorsChanged.dispatch(this);
505+
}
496506

497507
public Optional: IOptional;
498508
public TranslateArgs:Array<IErrorTranslateArgs>;
@@ -511,11 +521,8 @@ module Validation {
511521
public get ErrorMessage(): string {
512522
return "";
513523
}
514-
515-
516524
}
517525

518-
519526
/**
520527
*
521528
* @ngdoc object
@@ -535,6 +542,7 @@ module Validation {
535542

536543
public Optional: IOptional;
537544

545+
public ErrorsChanged:Utils.ISignal<any> = new Utils.Signal();
538546

539547
public AddFirst(error: IValidationResult) {
540548
this.Children.unshift(error);
@@ -784,6 +792,8 @@ module Validation {
784792
*/
785793
class AbstractValidationRule<T> implements IAbstractValidationRule<T>{
786794
public get ValidationResult():IValidationResult {return this.ValidationResultVisitor.ValidationResult;}
795+
public set ValidationResult(value:IValidationResult) { this.ValidationResultVisitor.ValidationResult = value; }
796+
787797
public Rules:{ [name: string]: IPropertyValidationRule<T> ; } = {};
788798
public Validators: { [name: string]: IValidator ; } = {};
789799
public Children:{ [name: string]: IAbstractValidationRule<any> ; } = {};
@@ -838,9 +848,9 @@ module Validation {
838848
public SetOptional(fce:IOptional){
839849

840850
this.ValidationResult.Optional = fce;
841-
// _.each(this.Rules, function(value:IValidationResult, key:string){value.Optional = fce;});
842-
// _.each(this.Validators, function(value:any, key:string){value.Optional = fce;});
843-
// _.each(this.Children, function(value:any, key:string){value.SetOptional(fce);});
851+
_.each(this.Rules, function(value:IValidationResult, key:string){value.Optional = fce;});
852+
_.each(this.Validators, function(value:any, key:string){value.Optional = fce;});
853+
_.each(this.Children, function(value:any, key:string){value.SetOptional(fce);});
844854
}
845855

846856
private createRuleFor(prop:string){
@@ -874,6 +884,7 @@ module Validation {
874884
},this)
875885
},this);
876886

887+
877888
return this.ValidationResult;
878889
}
879890

@@ -944,6 +955,7 @@ module Validation {
944955
}
945956

946957
public AddRule(rule:PropertyValidationRule<any>){
958+
//if (this.ValidationResult.ErrorsChanged !== undefined) rule.ErrorsChanged = this.ValidationResult.ErrorsChanged;
947959
this.ValidationResult.Add(rule);
948960
}
949961

@@ -1157,7 +1169,6 @@ module Validation {
11571169
*/
11581170
class PropertyValidationRule<T> extends ValidationResult implements IPropertyValidationRule<T> {
11591171

1160-
11611172
public Validators:{[name:string]: any} = {};
11621173
public ValidationFailures:{[name:string]: IValidationFailure} = {};
11631174
//public AsyncValidationFailures:{[name:string]: IAsyncValidationFailure} = {};
@@ -1233,6 +1244,8 @@ module Validation {
12331244
var lastPriority:number = 0;
12341245
var shortCircuited:boolean = false;
12351246

1247+
var original = this.HasErrors;
1248+
12361249
for (var index in this.ValidationFailures) {
12371250

12381251
var validation:IValidationFailure = this.ValidationFailures[index];
@@ -1253,6 +1266,7 @@ module Validation {
12531266

12541267
shortCircuited = hasError;
12551268
lastPriority = priority;
1269+
12561270
}
12571271

12581272
} catch (e) {
@@ -1262,6 +1276,7 @@ module Validation {
12621276
throw e;
12631277
}
12641278
}
1279+
if (original !== this.HasErrors) this.DispatchErrorsChanged();
12651280
return _.filter(this.ValidationFailures,function(item){return !item.IsAsync;});
12661281
}
12671282

@@ -1272,12 +1287,14 @@ module Validation {
12721287
ValidateAsync(context:IValidationContext<T>):Q.Promise<Array<IValidationFailure>> {
12731288
return this.ValidateAsyncEx(context.Value);
12741289
}
1275-
/**
1290+
1291+
/**
12761292
* Performs validation using a validation context and returns a collection of Validation Failures asynchronoulsy.
12771293
*/
12781294
ValidateAsyncEx(value:string):Q.Promise<Array<IValidationFailure>> {
12791295
var deferred = Q.defer<Array<IValidationFailure>>();
12801296
var promises = [];
1297+
var original = this.HasErrors;
12811298
var setResultFce = function (result) {
12821299
var hasError = !result;
12831300

@@ -1307,7 +1324,10 @@ module Validation {
13071324
}
13081325

13091326
var self = this;
1310-
Q.all(promises).then(function(result){deferred.resolve(_.filter(self.ValidationFailures,function(item){return item.IsAsync;}))});
1327+
Q.all(promises).then(function(result){
1328+
if (original !== self.HasErrors) self.DispatchErrorsChanged();
1329+
deferred.resolve(_.filter(self.ValidationFailures,function(item){return item.IsAsync;}))
1330+
});
13111331
return deferred.promise;
13121332

13131333
}
@@ -1337,7 +1357,9 @@ module Validation {
13371357
public Optional:IOptional;
13381358

13391359
public Validate(context:any):IValidationFailure {
1360+
var original = this.Error.HasError;
13401361
if (this.ValidateFce !== undefined) this.ValidateFce.bind(context)(this.Error);
1362+
if (original !== this.Error.HasError) this.DispatchErrorsChanged();
13411363
return this.ValidationFailures[this.Name];
13421364
}
13431365

@@ -1348,8 +1370,10 @@ module Validation {
13481370
deferred.resolve(this.ValidationFailures[this.Name]);
13491371
}
13501372
else {
1373+
var original = this.Error.HasError;
13511374
var self = this;
13521375
this.AsyncValidationFce.bind(context)(this.Error).then(function () {
1376+
if (original !== self.Error.HasError) self.DispatchErrorsChanged();
13531377
deferred.resolve(self.ValidationFailures[self.Name]);
13541378
});
13551379
}

0 commit comments

Comments
 (0)