Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: third_party/pkg/angular/lib/directive/ng_model_validators.dart

Issue 257423008: Update all Angular libs (run update_all.sh). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/pkg/angular/lib/directive/ng_model_validators.dart
diff --git a/third_party/pkg/angular/lib/directive/ng_model_validators.dart b/third_party/pkg/angular/lib/directive/ng_model_validators.dart
index 7fd5ba5db0e8d0aaaaee500785d16690c99f07f9..b0537399f0e24bb818a45f07549c4b2ac1ccd286 100644
--- a/third_party/pkg/angular/lib/directive/ng_model_validators.dart
+++ b/third_party/pkg/angular/lib/directive/ng_model_validators.dart
@@ -1,95 +1,111 @@
part of angular.directive;
-abstract class NgValidatable {
+/**
+ * NgValidator is the class interface for performing validations for an NgModel instance.
+ */
+abstract class NgValidator {
+ /**
+ * The name of the validator. This name will be used as the key value within the
+ * model.errorStates map and it will also be applied as a CSS class on the associated
+ * DOM element. Therefore, as a best practice, please do not include spaces for the validator
+ * name since it may cause issues with the CSS naming.
+ */
String get name;
- bool isValid(value);
+ bool isValid(modelValue);
}
/**
* Validates the model depending if required or ng-required is present on the element.
*/
-@NgDirective(
+@Decorator(
selector: '[ng-model][required]')
-@NgDirective(
+@Decorator(
selector: '[ng-model][ng-required]',
map: const {'ng-required': '=>required'})
-class NgModelRequiredValidator implements NgValidatable {
- bool _required = true;
+class NgModelRequiredValidator implements NgValidator {
- String get name => 'required';
+ final String name = 'ng-required';
+ bool _required = true;
+ final NgModel _ngModel;
- NgModelRequiredValidator(NgModel ngModel) {
- ngModel.addValidator(this);
+ NgModelRequiredValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
}
- bool isValid(value) {
+ bool isValid(modelValue) {
// Any element which isn't required is always valid.
if (!_required) return true;
// Null is not a value, therefore not valid.
- if (value == null) return false;
+ if (modelValue == null) return false;
// Empty lists and/or strings are not valid.
// NOTE: This is an excellent use case for structural typing.
// We really want anything object that has a 'isEmpty' property.
- return !((value is List || value is String) && value.isEmpty);
+ return !((modelValue is List || modelValue is String) && modelValue.isEmpty);
}
set required(value) {
_required = value == null ? false : value;
+ _ngModel.validateLater();
}
}
/**
* Validates the model to see if its contents match a valid URL pattern.
*/
-@NgDirective(selector: 'input[type=url][ng-model]')
-class NgModelUrlValidator implements NgValidatable {
+@Decorator(selector: 'input[type=url][ng-model]')
+class NgModelUrlValidator implements NgValidator {
static final URL_REGEXP = new RegExp(
r'^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?' +
r'(\/|\/([\w#!:.?+=&%@!\-\/]))?$');
- String get name => 'url';
+ final String name = 'ng-url';
NgModelUrlValidator(NgModel ngModel) {
ngModel.addValidator(this);
}
- bool isValid(value) =>
- value == null || value.isEmpty || URL_REGEXP.hasMatch(value);
+ bool isValid(modelValue) =>
+ modelValue == null || modelValue.isEmpty || URL_REGEXP.hasMatch(modelValue);
}
/**
* Validates the model to see if its contents match a valid email pattern.
*/
-@NgDirective(selector: 'input[type=email][ng-model]')
-class NgModelEmailValidator implements NgValidatable {
+@Decorator(selector: 'input[type=email][ng-model]')
+class NgModelEmailValidator implements NgValidator {
static final EMAIL_REGEXP = new RegExp(
r'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$');
- String get name => 'email';
+ final String name = 'ng-email';
NgModelEmailValidator(NgModel ngModel) {
ngModel.addValidator(this);
}
- bool isValid(value) =>
- value == null || value.isEmpty || EMAIL_REGEXP.hasMatch(value);
+ bool isValid(modelValue) =>
+ modelValue == null || modelValue.isEmpty || EMAIL_REGEXP.hasMatch(modelValue);
}
/**
* Validates the model to see if its contents match a valid number.
*/
-@NgDirective(selector: 'input[type=number][ng-model]')
-class NgModelNumberValidator implements NgValidatable {
- String get name => 'number';
+@Decorator(selector: 'input[type=number][ng-model]')
+@Decorator(selector: 'input[type=range][ng-model]')
+class NgModelNumberValidator implements NgValidator {
+
+ final String name = 'ng-number';
NgModelNumberValidator(NgModel ngModel) {
ngModel.addValidator(this);
}
- bool isValid(value) {
- if (value != null) {
+ bool isValid(modelValue) {
+ if (modelValue != null) {
try {
- num val = double.parse(value.toString());
+ num val = double.parse(modelValue.toString());
+ if (val.isNaN) {
+ return false;
+ }
} catch(exception, stackTrace) {
return false;
}
@@ -99,31 +115,136 @@ class NgModelNumberValidator implements NgValidatable {
}
/**
+ * Validates the model to see if the numeric value than or equal to the max value.
+ */
+@Decorator(selector: 'input[type=number][ng-model][max]')
+@Decorator(selector: 'input[type=range][ng-model][max]')
+@Decorator(
+ selector: 'input[type=number][ng-model][ng-max]',
+ map: const {'ng-max': '=>max'})
+@Decorator(
+ selector: 'input[type=range][ng-model][ng-max]',
+ map: const {'ng-max': '=>max'})
+class NgModelMaxNumberValidator implements NgValidator {
+
+ final String name = 'ng-max';
+ double _max;
+ final NgModel _ngModel;
+
+ NgModelMaxNumberValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
+ }
+
+ @NgAttr('max')
+ get max => _max;
+ set max(value) {
+ try {
+ num parsedValue = double.parse(value);
+ _max = parsedValue.isNaN ? _max : parsedValue;
+ } catch(e) {
+ _max = null;
+ } finally {
+ _ngModel.validateLater();
+ }
+ }
+
+ bool isValid(modelValue) {
+ if (modelValue == null || max == null) return true;
+
+ try {
+ num parsedValue = double.parse(modelValue.toString());
+ if (!parsedValue.isNaN) {
+ return parsedValue <= max;
+ }
+ } catch(exception, stackTrace) {}
+
+ //this validator doesn't care if the type conversation fails or the value
+ //is not a number (NaN) because NgModelNumberValidator will handle the
+ //number-based validation either way.
+ return true;
+ }
+}
+
+/**
+ * Validates the model to see if the numeric value is greater than or equal to the min value.
+ */
+@Decorator(selector: 'input[type=number][ng-model][min]')
+@Decorator(selector: 'input[type=range][ng-model][min]')
+@Decorator(
+ selector: 'input[type=number][ng-model][ng-min]',
+ map: const {'ng-min': '=>min'})
+@Decorator(
+ selector: 'input[type=range][ng-model][ng-min]',
+ map: const {'ng-min': '=>min'})
+class NgModelMinNumberValidator implements NgValidator {
+
+ final String name = 'ng-min';
+ double _min;
+ final NgModel _ngModel;
+
+ NgModelMinNumberValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
+ }
+
+ @NgAttr('min')
+ get min => _min;
+ set min(value) {
+ try {
+ num parsedValue = double.parse(value);
+ _min = parsedValue.isNaN ? _min : parsedValue;
+ } catch(e) {
+ _min = null;
+ } finally {
+ _ngModel.validateLater();
+ }
+ }
+
+ bool isValid(modelValue) {
+ if (modelValue == null || min == null) return true;
+
+ try {
+ num parsedValue = double.parse(modelValue.toString());
+ if (!parsedValue.isNaN) {
+ return parsedValue >= min;
+ }
+ } catch(exception, stackTrace) {}
+
+ //this validator doesn't care if the type conversation fails or the value
+ //is not a number (NaN) because NgModelNumberValidator will handle the
+ //number-based validation either way.
+ return true;
+ }
+}
+
+/**
* Validates the model to see if its contents match the given pattern present on either the
* HTML pattern or ng-pattern attributes present on the input element.
*/
-@NgDirective(selector: '[ng-model][pattern]')
-@NgDirective(
+@Decorator(selector: '[ng-model][pattern]')
+@Decorator(
selector: '[ng-model][ng-pattern]',
map: const {'ng-pattern': '=>pattern'})
-class NgModelPatternValidator implements NgValidatable {
- RegExp _pattern;
+class NgModelPatternValidator implements NgValidator {
- String get name => 'pattern';
+ final String name = 'ng-pattern';
+ RegExp _pattern;
+ final NgModel _ngModel;
- NgModelPatternValidator(NgModel ngModel) {
- ngModel.addValidator(this);
+ NgModelPatternValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
}
- bool isValid(value) {
+ bool isValid(modelValue) {
//remember, only required validates for the input being empty
- return _pattern == null || value == null || value.length == 0 ||
- _pattern.hasMatch(value);
+ return _pattern == null || modelValue == null || modelValue.length == 0 ||
+ _pattern.hasMatch(modelValue);
}
@NgAttr('pattern')
- set pattern(val) =>
- _pattern = val != null && val.length > 0 ? new RegExp(val) : null;
+ void set pattern(val) {
+ _pattern = val != null && val.length > 0 ? new RegExp(val) : null;
+ _ngModel.validateLater();
+ }
}
/**
@@ -131,28 +252,31 @@ class NgModelPatternValidator implements NgValidatable {
* equal to the minimum length set in place by the HTML minlength or
* ng-minlength attributes present on the input element.
*/
-@NgDirective(selector: '[ng-model][minlength]')
-@NgDirective(
+@Decorator(selector: '[ng-model][minlength]')
+@Decorator(
selector: '[ng-model][ng-minlength]',
map: const {'ng-minlength': '=>minlength'})
-class NgModelMinLengthValidator implements NgValidatable {
- int _minlength;
+class NgModelMinLengthValidator implements NgValidator {
- String get name => 'minlength';
+ final String name = 'ng-minlength';
+ int _minlength;
+ final NgModel _ngModel;
- NgModelMinLengthValidator(NgModel ngModel) {
- ngModel.addValidator(this);
+ NgModelMinLengthValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
}
- bool isValid(value) {
+ bool isValid(modelValue) {
//remember, only required validates for the input being empty
- return _minlength == 0 || value == null || value.length == 0 ||
- value.length >= _minlength;
+ return _minlength == 0 || modelValue == null || modelValue.length == 0 ||
+ modelValue.length >= _minlength;
}
@NgAttr('minlength')
- set minlength(value) =>
- _minlength = value == null ? 0 : int.parse(value.toString());
+ void set minlength(value) {
+ _minlength = value == null ? 0 : int.parse(value.toString());
+ _ngModel.validateLater();
+ }
}
/**
@@ -160,23 +284,26 @@ class NgModelMinLengthValidator implements NgValidatable {
* equal to the maximum length set in place by the HTML maxlength or
* ng-maxlength attributes present on the input element.
*/
-@NgDirective(selector: '[ng-model][maxlength]')
-@NgDirective(
+@Decorator(selector: '[ng-model][maxlength]')
+@Decorator(
selector: '[ng-model][ng-maxlength]',
map: const {'ng-maxlength': '=>maxlength'})
-class NgModelMaxLengthValidator implements NgValidatable {
- int _maxlength = 0;
+class NgModelMaxLengthValidator implements NgValidator {
- String get name => 'maxlength';
+ final String name = 'ng-maxlength';
+ int _maxlength = 0;
+ final NgModel _ngModel;
- NgModelMaxLengthValidator(NgModel ngModel) {
- ngModel.addValidator(this);
+ NgModelMaxLengthValidator(NgModel this._ngModel) {
+ _ngModel.addValidator(this);
}
- bool isValid(value) =>
- _maxlength == 0 || (value == null ? 0 : value.length) <= _maxlength;
+ bool isValid(modelValue) =>
+ _maxlength == 0 || (modelValue == null ? 0 : modelValue.length) <= _maxlength;
@NgAttr('maxlength')
- set maxlength(value) =>
- _maxlength = value == null ? 0 : int.parse(value.toString());
+ void set maxlength(value) {
+ _maxlength = value == null ? 0 : int.parse(value.toString());
+ _ngModel.validateLater();
+ }
}
« no previous file with comments | « third_party/pkg/angular/lib/directive/ng_model_select.dart ('k') | third_party/pkg/angular/lib/directive/ng_non_bindable.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698