Skip to content

Commit ae87482

Browse files
committed
POST now working for validation only. Fixed failing tests
1 parent 877aac0 commit ae87482

File tree

5 files changed

+142
-102
lines changed

5 files changed

+142
-102
lines changed

client/src/js/ng-django-angular-messages.js

Lines changed: 85 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
(function(angular, undefined) {
22
'use strict';
33

4+
5+
if(angular.version.minor < 3 ) {
6+
throw new Error('The ng.django.angular.messages module requires AngularJS 1.3+');
7+
}
8+
9+
410
angular
511
.module('ng.django.angular.messages',[
612
'ngMessages'
713
])
814

915
.directive('form', formDirectiveFactory())
1016
.directive('ngForm', formDirectiveFactory(true))
11-
.directive('djngMsgsError', djngMsgsError)
12-
.directive('djngValidateRejected', validateRejected)
17+
.directive('djngError', djngError)
18+
.directive('djngRejected', djngRejected)
1319
.factory('djngAngularMessagesForm', djngAngularMessagesForm);
1420

1521

@@ -20,7 +26,7 @@ angular
2026
*
2127
* Adds the following methods and functionality:
2228
*
23-
* - setValidFieldsPristine()
29+
* - djngSetValidFieldsPristine()
2430
*/
2531

2632
function formDirectiveFactory(isNgForm) {
@@ -60,7 +66,7 @@ function formDirectiveFactory(isNgForm) {
6066
}
6167
}
6268

63-
formCtrl.setValidFieldsPristine = function() {
69+
formCtrl.djngSetValidFieldsPristine = function() {
6470

6571
var i = 0,
6672
len = controls.length,
@@ -81,7 +87,7 @@ function formDirectiveFactory(isNgForm) {
8187
}
8288

8389

84-
function djngMsgsError($timeout) {
90+
function djngError($timeout) {
8591

8692
return {
8793
restrict: 'A',
@@ -90,77 +96,84 @@ function djngMsgsError($timeout) {
9096
'?ngModel'
9197
],
9298
link: function(scope, element, attrs, ctrls) {
93-
var boundField,
94-
formCtrl = ctrls[0],
99+
100+
var formCtrl = ctrls[0],
95101
ngModel = ctrls[1];
96102

97-
element.removeAttr('djng-msgs-error');
98-
99-
if(!formCtrl || !ngModel)
103+
if (attrs.djngError !== 'bound-msgs-field' || !formCtrl || !ngModel)
100104
return;
101105

106+
element.removeAttr('djng-error');
107+
element.removeAttr('djng-error-msg');
108+
102109
$timeout(function(){
103110

111+
// TODO: use ngModel.djngAddRejected to set message
112+
113+
ngModel.$message = attrs.djngErrorMsg;
114+
ngModel.$validate();
104115
formCtrl.$setSubmitted();
105-
106-
if(ngModel.$name.indexOf(formCtrl.$name) === 0) {
107-
108-
formCtrl.$message = {rejected: attrs.djngMsgsError};
109-
formCtrl.$setValidity('rejected', false);
110-
console.log(formCtrl);
111-
112-
}else{
113-
114-
ngModel.$message = {rejected: attrs.djngMsgsError};
115-
ngModel.$validate();
116-
}
117116
});
118117
}
119118
}
120119
}
121120

122121

123-
function validateRejected() {
122+
function djngRejected() {
124123

125124
return {
126125
restrict: 'A',
127126
require: '?ngModel',
128127
link: function(scope, element, attrs, ngModel) {
129128

130-
if(!ngModel) return;
129+
if(!ngModel || attrs.djngRejected !== 'validator')
130+
return;
131131

132132
var _hasMessage = false,
133133
_value = null;
134-
134+
135135
ngModel.$validators.rejected = function(value) {
136136

137137
if(_hasMessage && (_value !== value)) {
138138

139139
_hasMessage = false;
140140
_value = null;
141141

142-
if(ngModel.$message) {
143-
ngModel.$message.rejected = undefined;
144-
}
142+
ngModel.$message = undefined;
145143

146144
}else{
147145

148-
_hasMessage = !!(ngModel.$message && ngModel.$message.rejected !== undefined);
146+
_hasMessage = !!ngModel.$message;
149147

150-
if(_hasMessage) {
148+
if(_hasMessage)
151149
_value = value;
152-
}
153150
}
154151

155152
return !_hasMessage;
156153
}
154+
155+
/*
156+
ctrl.djngClearRejected = function() {
157+
if(!!ctrl.$message) {
158+
ctrl.$message = undefined;
159+
ctrl.$validate();
160+
}
161+
};
162+
163+
ctrl.djngAddRejected = function(msg) {
164+
ctrl.$message = msg;
165+
ctrl.$validate();
166+
};
167+
*/
157168
}
158169
}
159170
}
160171

161172

162173
function djngAngularMessagesForm() {
163174

175+
var NON_FIELD_ERRORS = '__all__';
176+
164177
return {
165178
setErrors: setErrors
166179
}
@@ -181,55 +194,54 @@ function djngAngularMessagesForm() {
181194

182195
form.$setSubmitted();
183196

184-
angular.forEach(errors,
185-
function(error, key) {
186-
var field,
187-
message = error[0];
197+
angular.forEach(errors, function(error, key) {
198+
199+
var field,
200+
message = error[0];
201+
202+
if(key == NON_FIELD_ERRORS) {
203+
204+
form.$message = message;
205+
/*
206+
* Only set current valid fields to pristine
207+
*
208+
* Any field that's been submitted with an error should
209+
* still display its error
210+
*
211+
* Any field that was valid when the form was submitted,
212+
* may have caused the NON_FIELD_ERRORS, so should be set
213+
* to pristine to prevent it's valid state being displayed
214+
*/
215+
form.djngSetValidFieldsPristine();
216+
217+
}else if(form.hasOwnProperty(key)) {
218+
219+
field = form[key];
220+
field.$message = message;
221+
222+
if (isField(field)) {
188223

189-
if(form.hasOwnProperty(key)) {
224+
field.$validate();
190225

191-
field = form[key];
226+
} else {
192227

193-
if(!angular.isObject(field.$message)) {
194-
field.$message = {};
195-
}
228+
// this field is a composite of input elements
229+
field.$setSubmitted();
196230

197-
field.$message.rejected = message;
198-
199-
if (angular.isFunction(field.$validate)) {
200-
201-
field.$validate();
202-
203-
} else {
204-
// this field is a composite of input elements
205-
field.$setSubmitted();
231+
angular.forEach(field, function(subField, subKey) {
206232

207-
angular.forEach(field, function(subField, subKey) {
208-
if(angular.isDefined(subField) &&
209-
angular.isFunction(subField.$validate)) {
210-
211-
subField.$validate();
212-
}
213-
});
214-
}
215-
216-
}else{
217-
218-
form.$message = message;
219-
/*
220-
* Only set current valid fields to pristine
221-
*
222-
* Any field that's been submitted with an error should
223-
* still display its error
224-
*
225-
* Any field that was valid when the form was submitted,
226-
* may have caused the NON_FIELD_ERRORS, so should be set
227-
* to pristine to prevent it's valid state being displayed
228-
*/
229-
form.setValidFieldsPristine();
233+
if(isField(subField)) {
234+
subField.$validate();
235+
}
236+
});
230237
}
238+
231239
}
232-
);
240+
});
241+
}
242+
243+
function isField(field) {
244+
return !!field && angular.isArray(field.$viewChangeListeners);
233245
}
234246

235247
function _isNotEmpty(obj) {

client/tests/djangoNgMessagesSpec.js

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,26 @@
22

33
describe('unit tests for module ng.django.angular.messages', function() {
44

5-
function compileForm($compile, scope, replace_value) {
5+
function compileForm($compile, scope, replace_value, replace_rejected_type) {
66
var template =
77
'<form name="valid_form" action=".">' +
8-
'<input name="email_field" ng-model="model.email" type="email" djng-validate-rejected {value} />' +
8+
'<input name="email_field" ng-model="model.email" type="email" djng-rejected="{rejected_type}" {value} />' +
99
'</form>';
10-
var form = angular.element(template.replace('{value}', replace_value));
10+
template = template.replace('{value}', replace_value)
11+
template = template.replace('{rejected_type}', replace_rejected_type || 'validator')
12+
var form = angular.element(template);
1113
$compile(form)(scope);
1214
scope.$digest();
1315
}
1416

15-
function compileFormWithBoundError($compile, scope, replace_value) {
17+
function compileFormWithBoundError($compile, scope, replace_value, replace_djng_error_type) {
1618
var template =
1719
'<form name="valid_form" action=".">' +
18-
'<input name="email_field" ng-model="model.email" type="email" djng-msgs-error="valid email required" djng-validate-rejected {value} />' +
20+
'<input name="email_field" ng-model="model.email" type="email" djng-error="{error_type}" djng-error-msg="valid email required" djng-rejected="validator" {value} />' +
1921
'</form>';
20-
var form = angular.element(template.replace('{value}', replace_value));
22+
template = template.replace('{value}', replace_value)
23+
template = template.replace('{error_type}', replace_djng_error_type || 'bound-msgs-field')
24+
var form = angular.element(template);
2125
$compile(form)(scope);
2226
scope.$digest();
2327
}
@@ -42,7 +46,7 @@ describe('unit tests for module ng.django.angular.messages', function() {
4246
field.$setViewValue('[email protected]');
4347
expect(field.$valid).toBe(true);
4448
expect(field.$pristine).toBe(false);
45-
form.setValidFieldsPristine();
49+
form.djngSetValidFieldsPristine();
4650
expect(field.$valid).toBe(true);
4751
expect(field.$pristine).toBe(true);
4852
});
@@ -51,7 +55,7 @@ describe('unit tests for module ng.django.angular.messages', function() {
5155
field.$setViewValue('example');
5256
expect(field.$valid).toBe(false);
5357
expect(field.$pristine).toBe(false);
54-
form.setValidFieldsPristine();
58+
form.djngSetValidFieldsPristine();
5559
expect(field.$valid).toBe(false);
5660
expect(field.$pristine).toBe(false);
5761
});
@@ -71,17 +75,27 @@ describe('unit tests for module ng.django.angular.messages', function() {
7175
$timeout = _$timeout_;
7276
}));
7377

74-
it('should invalidate field when djng-msgs-error exists', function() {
78+
it('should invalidate field when djng-error exists', function() {
7579
$timeout.flush();
7680
expect(field.$valid).toBe(false);
7781
expect(field.$error.rejected).toBe(true);
78-
expect(field.$message.rejected).toBe('valid email required');
82+
expect(field.$message).toBe('valid email required');
7983
});
8084

8185
it('should set form to $submitted', function() {
8286
$timeout.flush();
8387
expect(form.$submitted).toBe(true);
8488
});
89+
90+
it('should ignore incorrect djng-error type', inject(function($rootScope, $compile) {
91+
scope = $rootScope.$new();
92+
compileFormWithBoundError($compile, scope, 'value="barry"', 'bound-field');
93+
form = scope.valid_form;
94+
field = scope.valid_form.email_field;
95+
expect(field.$valid).toBe(true);
96+
expect(field.$error.rejected).toBe(undefined);
97+
expect(field.$message).toBe(undefined);
98+
}));
8599
});
86100

87101

@@ -98,15 +112,15 @@ describe('unit tests for module ng.django.angular.messages', function() {
98112

99113
it('should invalidate field when rejected message exists', function() {
100114
field.$setViewValue('[email protected]');
101-
field.$message = {rejected: 'email already in use'};
115+
field.$message = 'email already in use';
102116
field.$validate();
103117
expect(field.$valid).toBe(false);
104118
expect(field.$error.rejected).toBe(true);
105119
});
106120

107121
it('should clear message and return true when new value is set on field and rejected message exists from previous failed rejected validation', function() {
108122
field.$setViewValue('[email protected]');
109-
field.$message = {rejected: 'email already in use'};
123+
field.$message = 'email already in use';
110124
field.$validate();
111125
expect(field.$valid).toBe(false);
112126
expect(field.$error.rejected).toBe(true);
@@ -117,7 +131,7 @@ describe('unit tests for module ng.django.angular.messages', function() {
117131

118132
it('should not remove message if field value is the same as previous failed rejected validation', function() {
119133
field.$setViewValue('[email protected]');
120-
field.$message = {rejected: 'email already in use'};
134+
field.$message = 'email already in use';
121135
field.$validate();
122136
expect(field.$valid).toBe(false);
123137
expect(field.$error.rejected).toBe(true);
@@ -126,6 +140,18 @@ describe('unit tests for module ng.django.angular.messages', function() {
126140
expect(field.$valid).toBe(false);
127141
expect(field.$error.rejected).toBe(true);
128142
});
143+
144+
it('should ignore incorrect djng-rejected type', inject(function($rootScope, $compile) {
145+
scope = $rootScope.$new();
146+
compileForm($compile, scope, '', 'none');
147+
form = scope.valid_form;
148+
field = scope.valid_form.email_field;
149+
field.$setViewValue('[email protected]');
150+
field.$message = 'email already in use';
151+
field.$validate();
152+
expect(field.$valid).toBe(true);
153+
expect(field.$error.rejected).toBe(undefined);
154+
}));
129155
});
130156

131157

@@ -163,9 +189,9 @@ describe('unit tests for module ng.django.angular.messages', function() {
163189
expect(field.$pristine).toBe(true);
164190
});
165191

166-
it('should add rejected error message to field.$message.rejected and validate', function() {
192+
it('should add rejected error message to field.$message and validate', function() {
167193
djngAngularMessagesForm.setErrors(form, fieldError.errors);
168-
expect(field.$message.rejected).toBe('This field is required.');
194+
expect(field.$message).toBe('This field is required.');
169195
expect(field.$valid).toBe(false);
170196
});
171197
});

0 commit comments

Comments
 (0)