Skip to content

Commit c5938b1

Browse files
committed
Updates for custom error handling
1 parent c2d3d95 commit c5938b1

9 files changed

+142
-56
lines changed

bower.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"David Jensen <[email protected]>",
77
"Cameron Edwards",
88
"Mike Marcacci",
9-
"Denis Dervisevic <[email protected]>"
9+
"Denis Dervisevic <[email protected]>",
10+
"Marcel J Bennett <[email protected]>"
1011
],
1112
"moduleType": [
1213
"globals"
@@ -17,7 +18,9 @@
1718
"form",
1819
"json",
1920
"json-schema",
20-
"schema"
21+
"schema",
22+
"json-schema-form",
23+
"angular-schema-form"
2124
],
2225
"license": "MIT",
2326
"ignore": [
@@ -36,7 +39,7 @@
3639
"karma.conf.js"
3740
],
3841
"dependencies": {
39-
"angular": ">= 1.2",
42+
"angular": ">= 1.3",
4043
"tv4": "~1.0.15",
4144
"angular-sanitize": ">= 1.2"
4245
},
@@ -49,7 +52,8 @@
4952
"tx-tinymce": ">= 0.0.5",
5053
"angular-ui-sortable": ">=0.12.11",
5154
"bootstrap-vertical-tabs": "~1.2.0",
52-
"angular-schema-form-bootstrap": "~0.1.1"
55+
"angular-schema-form-bootstrap": "~0.1.1",
56+
"angular-schema-form-tinymce": "^0.1.0"
5357
},
5458
"resolutions": {
5559
"jquery": "~2.1.1"

dist/angular-schema-form-bootstrap.js

+3-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*!
22
* angular-schema-form
33
* @version 1.0.0-alpha.1
4-
* @date Mon, 23 Jan 2017 13:42:17 GMT
4+
* @date Tue, 31 Jan 2017 11:57:55 GMT
55
* @link https://github.com/json-schema-form/angular-schema-form
66
* @license MIT
77
* Copyright (c) 2014-2017 JSON Schema Form
@@ -91,7 +91,7 @@ module.exports = __webpack_require__(2);
9191
/*!
9292
* angular-schema-form-bootstrap
9393
* @version 1.0.0-alpha.1
94-
* @date Sat, 14 Jan 2017 17:11:45 GMT
94+
* @date Sun, 29 Jan 2017 00:45:28 GMT
9595
* @link https://github.com/json-schema-form/angular-schema-form-bootstrap
9696
* @license MIT
9797
* Copyright (c) 2014-2017 JSON Schema Form
@@ -414,7 +414,7 @@ module.exports = __webpack_require__(2);
414414
// ngtemplate-loader embeds the html on build
415415

416416

417-
angular.module('schemaForm').config(bootstrapDecoratorConfig).filter('sfCamelKey', sfCamelKeyFilter);
417+
angular.module('schemaForm').config(bootstrapDecoratorConfig);
418418

419419
bootstrapDecoratorConfig.$inject = ['schemaFormProvider', 'schemaFormDecoratorsProvider', 'sfBuilderProvider', 'sfPathProvider', '$injector'];
420420

@@ -504,27 +504,6 @@ module.exports = __webpack_require__(2);
504504
}, []);
505505
};
506506

507-
/**
508-
* sfCamelKey Filter
509-
*/
510-
function sfCamelKeyFilter() {
511-
return function (formKey) {
512-
if (!formKey) {
513-
return '';
514-
};
515-
var part, i, key;
516-
key = formKey.slice();
517-
for (i = 0; i < key.length; i++) {
518-
part = key[i].toLowerCase().split('');
519-
if (i && part.length) {
520-
part[0] = part[0].toUpperCase();
521-
};
522-
key[i] = part.join('');
523-
};
524-
return key.join('');
525-
};
526-
};
527-
528507
/***/
529508
},,
530509
/* 18 */

dist/angular-schema-form-bootstrap.min.js

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

dist/angular-schema-form.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*!
22
* angular-schema-form
33
* @version 1.0.0-alpha.1
4-
* @date Mon, 23 Jan 2017 13:42:17 GMT
4+
* @date Tue, 31 Jan 2017 11:57:55 GMT
55
* @link https://github.com/json-schema-form/angular-schema-form
66
* @license MIT
77
* Copyright (c) 2014-2017 JSON Schema Form

dist/angular-schema-form.min.js

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

examples/data/custom-error.json

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"schema": {
3+
"type": "object",
4+
"title": "Person",
5+
"properties": {
6+
"email": {
7+
"type": "string",
8+
"maxLength": 255,
9+
"email": true
10+
}
11+
}
12+
},
13+
"form": [
14+
{
15+
"key": "email",
16+
"placeholder": "Enter contact email",
17+
"feedback": false
18+
},
19+
{
20+
"type": "submit",
21+
"style": "btn-info",
22+
"title": "OK"
23+
}
24+
],
25+
"model": { "email": "NULL" }
26+
}

examples/data/sink.json

+9
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,15 @@
173173
{
174174
"key": "shoesizeRight"
175175
},
176+
{
177+
"key": "invitation",
178+
"tinymceOptions": {
179+
"toolbar": [
180+
"undo redo| styleselect | bold italic | link image",
181+
"alignleft aligncenter alignright"
182+
]
183+
}
184+
},
176185
"things",
177186
"dislike"
178187
]

examples/example.html

+23-13
Original file line numberDiff line numberDiff line change
@@ -194,45 +194,54 @@ <h3>Schema</h3>
194194

195195
<script type="text/javascript" src="//code.jquery.com/jquery-2.1.1.min.js"></script>
196196
<script type="text/javascript" src="//cdn.jsdelivr.net/g/[email protected]"></script>
197+
197198
<script type="text/javascript" src="../bower_components/tv4/tv4.js"></script>
198199
<script type="text/javascript" src="../bower_components/ace-builds/src-min-noconflict/ace.js"></script>
199200
<script type="text/javascript" src="../bower_components/angular/angular.min.js"></script>
200201
<script type="text/javascript" src="../bower_components/angular-sanitize/angular-sanitize.min.js"></script>
202+
201203
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script>
202204
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/zeroclipboard/2.2.0/ZeroClipboard.min.js"></script>
203205
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/ng-clip/0.2.6/ng-clip.min.js"></script>
204206
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
205207
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.1/ui-bootstrap.min.js"></script>
206-
<!-- <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js"></script> -->
207-
<!-- <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular-sanitize.min.js"></script> -->
208-
209208

210209
<script type="text/javascript" src="../bower_components/angular-ui-sortable/sortable.js"></script>
211210
<script type="text/javascript" src="../bower_components/angular-ui-ace/ui-ace.js"></script>
212-
<!-- <script type="text/javascript" src="../bower_components/pickadate/lib/picker.js"></script>
213-
<script type="text/javascript" src="../bower_components/pickadate/lib/picker.date.js"></script>
214-
<script type="text/javascript" src="../bower_components/pickadate/lib/translations/nl_NL.js"></script> -->
215211

216-
<!-- <script type="text/javascript" src="//tinymce.cachefly.net/4.0/tinymce.min.js"></script>
217-
<script type="text/javascript" src="../bower_components/tx-tinymce/tx-tinymce.js"></script> -->
212+
<script type="text/javascript" src="//cdn.tinymce.com/4/tinymce.min.js"></script>
213+
<script type="text/javascript" src="../bower_components/tx-tinymce/tx-tinymce.js"></script>
218214

219-
<!-- <script type="text/javascript" src="../bower_components/spectrum/spectrum.js"></script>
215+
<script type="text/javascript" src="../bower_components/spectrum/spectrum.js"></script>
220216
<script type="text/javascript" src="../bower_components/spectrum/i18n/jquery.spectrum-sv.js"></script>
221-
<script type="text/javascript" src="../bower_components/angular-spectrum-colorpicker/dist/angular-spectrum-colorpicker.min.js"></script> -->
217+
<script type="text/javascript" src="../bower_components/angular-spectrum-colorpicker/dist/angular-spectrum-colorpicker.js"></script>
222218

223219
<script type="text/javascript" src="../dist/angular-schema-form.js"></script>
224220
<script type="text/javascript" src="../dist/angular-schema-form-bootstrap.js"></script>
225221
<script type="text/javascript" src="add-on/calculate.js"></script>
226-
<!-- <script type="text/javascript" src="../bower_components/angular-schema-form-datepicker/bootstrap-datepicker.min.js"></script> -->
227-
<!-- <script type="text/javascript" src="../bower_components/angular-schema-form-colorpicker/bootstrap-colorpicker.min.js"></script> -->
222+
<script type="text/javascript" src="../bower_components/angular-schema-form-datepicker/bootstrap-datepicker.min.js"></script>
223+
<script type="text/javascript" src="../bower_components/angular-schema-form-colorpicker/bootstrap-colorpicker.min.js"></script>
224+
<script type="text/javascript" src="../bower_components/angular-schema-form-tinymce/bootstrap-tinymce.js"></script>
228225

229226
<script type="text/javascript">
230227
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
231228
//
232229
// To test the tinymce addon, uncomment the files above and inject 'tx-tinymce' below.
233230
/*global alert*/
234-
var app = angular.module('test', ['schemaForm', 'ui.ace', 'ngClipboard', 'ui.bootstrap.tooltip']);
231+
var app = angular.module('test', ['schemaForm', 'ui.ace', 'ngClipboard', 'ui.bootstrap.tooltip', 'schemaForm-tinymce']);
235232
app.controller('TestCtrl', function($scope, $http, $location) {
233+
tv4.defineError('EMAIL', 10001, 'Invalid email address');
234+
tv4.defineKeyword('email', function(data, value, schema) {
235+
if (schema.email) {
236+
if (/^\S+@\S+$/.test(data)) {
237+
return null;
238+
}
239+
return {
240+
code: 10001
241+
};
242+
}
243+
return null;
244+
});
236245

237246
$scope.tests = [
238247
{ name: "Simple", data: 'data/simple.json' },
@@ -246,6 +255,7 @@ <h3>Schema</h3>
246255
{ name: "TitleMap Examples", data: 'data/titlemaps.json' },
247256
{ name: "Kitchen Sink", data: 'data/sink.json' },
248257
{ name: "Calculate", data: 'data/calculate.json' },
258+
{ name: "Custom Error", data: 'data/custom-error.json' },
249259
{ name: "Hack: Conditional required", data: 'data/conditional-required.json' }
250260
];
251261

src/directives/schema-validate.directive.spec.js

+67-9
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,33 @@ describe('directive', function() {
88
})
99
);
1010

11-
var exampleSchema = {
11+
exampleSchema = {
1212
"type": "object",
1313
"title": "Person",
1414
"properties": {
1515
"name": {
1616
"title": "Name",
1717
"type": "string",
1818
"minLength": 10
19+
},
20+
"email": {
21+
"type": "string",
22+
"maxLength": 255,
23+
"format": "email",
24+
"email": true
1925
}
2026
}
2127
};
2228

23-
it('should handle buttons', function() {
29+
it('should validate the form on event [ノಠ益ಠ]ノ彡┻━┻', function() {
30+
31+
tmpl = angular.element(
32+
'<div>' +
33+
'<form name="testform" sf-schema="schema" sf-form="form" sf-model="obj"></form>' +
34+
'<input class="validate" type="button" ng-click="validate_all()" />' +
35+
'</div>'
36+
);
37+
2438
inject(function($compile,$rootScope) {
2539
var scope = $rootScope.$new();
2640
scope.obj = { "name": "Json" };
@@ -33,13 +47,6 @@ describe('directive', function() {
3347
scope.$broadcast('schemaFormValidate');
3448
};
3549

36-
var tmpl = angular.element(
37-
'<div>' +
38-
'<form name="testform" sf-schema="schema" sf-form="form" sf-model="obj"></form>' +
39-
'<input class="validate" type="button" ng-click="validate_all()" />' +
40-
'</div>'
41-
);
42-
4350
$compile(tmpl)(scope);
4451
$rootScope.$apply();
4552

@@ -53,4 +60,55 @@ describe('directive', function() {
5360

5461
});
5562
});
63+
64+
it('should process custom tv4 errors', function() {
65+
66+
tmpl = angular.element(
67+
'<div>' +
68+
'<form name="testform" sf-schema="schema" sf-form="form" sf-model="obj"></form>' +
69+
'<input class="validate" type="button" ng-click="validate_all()" />{{obj}}' +
70+
'</div>'
71+
);
72+
73+
inject(function($compile,$rootScope) {
74+
tv4.defineError('EMAIL', 10001, 'Invalid email address');
75+
tv4.defineKeyword('email', function(data, value, schema) {
76+
if (schema.email) {
77+
if (/^\S+@\S+$/.test(data)) {
78+
return null;
79+
}
80+
return {
81+
code: 10001
82+
};
83+
}
84+
return null;
85+
});
86+
87+
var scope = $rootScope.$new();
88+
scope.obj = { "email": "NULL" };
89+
90+
scope.schema = exampleSchema;
91+
92+
scope.form = [{
93+
"key": "email",
94+
"placeholder": "Enter contact email",
95+
"feedback": false
96+
}];
97+
98+
scope.validate_all = function() {
99+
scope.$broadcast('schemaFormValidate');
100+
};
101+
102+
$compile(tmpl)(scope);
103+
$rootScope.$apply();
104+
105+
var form = tmpl.find('form').eq(0).controller('form');
106+
107+
form.$valid.should.be.true;
108+
scope.validate_all.should.not.have.beenCalled;
109+
tmpl.find('input.validate').click();
110+
scope.validate_all.should.have.beenCalledOnce;
111+
form.$valid.should.be.false;
112+
});
113+
});
56114
});

0 commit comments

Comments
 (0)