Skip to content

Commit 1af2292

Browse files
committed
Add tests and potential fix for #828
1 parent d8bbc87 commit 1af2292

8 files changed

+125
-72
lines changed

dist/angular-schema-form-bootstrap.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 Sat, 14 Jan 2017 17:11:59 GMT
4+
* @date Mon, 23 Jan 2017 13:42:17 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-bootstrap.min.js

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

dist/angular-schema-form.js

+33-27
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 Sat, 14 Jan 2017 17:09:44 GMT
4+
* @date Mon, 23 Jan 2017 13:42:17 GMT
55
* @link https://github.com/json-schema-form/angular-schema-form
66
* @license MIT
77
* Copyright (c) 2014-2017 JSON Schema Form
@@ -85,7 +85,7 @@ module.exports = angular;
8585
/*!
8686
* json-schema-form-core
8787
* @version 1.0.0-alpha.1
88-
* @date Sat, 14 Jan 2017 17:07:51 GMT
88+
* @date Mon, 16 Jan 2017 13:06:10 GMT
8989
* @link https://github.com/json-schema-form/json-schema-form-core
9090
* @license MIT
9191
* Copyright (c) 2014-2017 JSON Schema Form
@@ -555,21 +555,21 @@ function defaultForm(schema, defaultSchemaTypes, ignore, globalOptions) {
555555
/***/ function(module, exports, __webpack_require__) {
556556

557557
"use strict";
558-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__schema_defaults__ = __webpack_require__(3);
559-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__sf_path__ = __webpack_require__(0);
560-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__canonical_title_map__ = __webpack_require__(1);
561-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__merge__ = __webpack_require__(5);
562-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__select__ = __webpack_require__(6);
563-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__traverse__ = __webpack_require__(7);
564-
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__validate__ = __webpack_require__(8);
558+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_schema_defaults__ = __webpack_require__(3);
559+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_sf_path__ = __webpack_require__(0);
560+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__lib_canonical_title_map__ = __webpack_require__(1);
561+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__lib_merge__ = __webpack_require__(5);
562+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__lib_select__ = __webpack_require__(6);
563+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__lib_traverse__ = __webpack_require__(7);
564+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__lib_validate__ = __webpack_require__(8);
565565
/* harmony export (binding) */ __webpack_require__.d(exports, "sfPath", function() { return sfPath; });
566566
/* harmony export (binding) */ __webpack_require__.d(exports, "schemaDefaults", function() { return schemaDefaults; });
567567
/* harmony export (binding) */ __webpack_require__.d(exports, "canonicalTitleMap", function() { return canonicalTitleMap; });
568-
/* harmony reexport (binding) */ __webpack_require__.d(exports, "merge", function() { return __WEBPACK_IMPORTED_MODULE_3__merge__["a"]; });
569-
/* harmony reexport (binding) */ __webpack_require__.d(exports, "select", function() { return __WEBPACK_IMPORTED_MODULE_4__select__["a"]; });
570-
/* harmony reexport (binding) */ __webpack_require__.d(exports, "traverseSchema", function() { return __WEBPACK_IMPORTED_MODULE_5__traverse__["a"]; });
571-
/* harmony reexport (binding) */ __webpack_require__.d(exports, "traverseForm", function() { return __WEBPACK_IMPORTED_MODULE_5__traverse__["b"]; });
572-
/* harmony reexport (binding) */ __webpack_require__.d(exports, "validate", function() { return __WEBPACK_IMPORTED_MODULE_6__validate__["a"]; });
568+
/* harmony reexport (binding) */ __webpack_require__.d(exports, "merge", function() { return __WEBPACK_IMPORTED_MODULE_3__lib_merge__["a"]; });
569+
/* harmony reexport (binding) */ __webpack_require__.d(exports, "select", function() { return __WEBPACK_IMPORTED_MODULE_4__lib_select__["a"]; });
570+
/* harmony reexport (binding) */ __webpack_require__.d(exports, "traverseSchema", function() { return __WEBPACK_IMPORTED_MODULE_5__lib_traverse__["a"]; });
571+
/* harmony reexport (binding) */ __webpack_require__.d(exports, "traverseForm", function() { return __WEBPACK_IMPORTED_MODULE_5__lib_traverse__["b"]; });
572+
/* harmony reexport (binding) */ __webpack_require__.d(exports, "validate", function() { return __WEBPACK_IMPORTED_MODULE_6__lib_validate__["a"]; });
573573

574574

575575

@@ -579,9 +579,9 @@ function defaultForm(schema, defaultSchemaTypes, ignore, globalOptions) {
579579

580580

581581

582-
var sfPath = __WEBPACK_IMPORTED_MODULE_1__sf_path__;
583-
var schemaDefaults = __WEBPACK_IMPORTED_MODULE_0__schema_defaults__;
584-
var canonicalTitleMap = __WEBPACK_IMPORTED_MODULE_2__canonical_title_map__["a" /* default */];
582+
var sfPath = __WEBPACK_IMPORTED_MODULE_1__lib_sf_path__;
583+
var schemaDefaults = __WEBPACK_IMPORTED_MODULE_0__lib_schema_defaults__;
584+
var canonicalTitleMap = __WEBPACK_IMPORTED_MODULE_2__lib_canonical_title_map__["a" /* default */];
585585

586586
/***/ },
587587
/* 5 */
@@ -729,6 +729,7 @@ function select(projection, obj, valueToSet) {
729729
if (typeof valueToSet !== 'undefined' && parts.length === 1) {
730730
// special case, just setting one variable
731731
obj[parts[0]] = valueToSet;
732+
732733
return obj;
733734
};
734735

@@ -738,12 +739,14 @@ function select(projection, obj, valueToSet) {
738739
};
739740

740741
var value = obj[parts[0]];
742+
741743
for (var i = 1; i < parts.length; i++) {
742744
// Special case: We allow JSON Form syntax for arrays using empty brackets
743745
// These will of course not work here so we exit if they are found.
744746
if (parts[i] === '') {
745747
return undefined;
746-
}
748+
};
749+
747750
if (typeof valueToSet !== 'undefined') {
748751
if (i === parts.length - 1) {
749752
// last step. Let's set the value
@@ -753,19 +756,22 @@ function select(projection, obj, valueToSet) {
753756
// Make sure to create new objects on the way if they are not there.
754757
// We need to look ahead to check if array is appropriate
755758
var tmp = value[parts[i]];
759+
756760
if (typeof tmp === 'undefined' || tmp === null) {
757761
tmp = numRe.test(parts[i + 1]) ? [] : {};
758762
value[parts[i]] = tmp;
759-
}
763+
};
764+
760765
value = tmp;
761-
}
766+
};
762767
} else if (value) {
763768
// Just get nex value.
764769
value = value[parts[i]];
765-
}
766-
}
770+
};
771+
};
772+
767773
return value;
768-
}
774+
};
769775

770776
/***/ },
771777
/* 7 */
@@ -1122,7 +1128,6 @@ __WEBPACK_IMPORTED_MODULE_1_angular___default.a.module('schemaForm', deps)
11221128
// Validate against the schema.
11231129

11241130
var validate = function validate(viewValue) {
1125-
//console.log('validate called', viewValue)
11261131
//Still might be undefined
11271132
if (!form) {
11281133
return viewValue;
@@ -1203,9 +1208,10 @@ __WEBPACK_IMPORTED_MODULE_1_angular___default.a.module('schemaForm', deps)
12031208

12041209
// A bit ugly but useful.
12051210
scope.validateField = function (formName) {
1211+
var noField = formName === undefined;
12061212
// If we have specified a form name, and this model is not within
12071213
// that form, then leave things be.
1208-
if (formName != undefined && ngModel.$$parentForm.$name !== formName) {
1214+
if (!noField && ngModel.$$parentForm.$name !== formName) {
12091215
return;
12101216
}
12111217

@@ -1214,9 +1220,9 @@ __WEBPACK_IMPORTED_MODULE_1_angular___default.a.module('schemaForm', deps)
12141220
// Just setting the viewValue isn't enough to trigger validation
12151221
// since it's the same value. This will be better when we drop
12161222
// 1.2 support.
1217-
if (schema && schema.type.indexOf('array') !== -1) {
1223+
if (noField || schema && schema.type.indexOf('array') !== -1) {
12181224
validate(ngModel.$modelValue);
1219-
}
1225+
};
12201226

12211227
// We set the viewValue to trigger parsers,
12221228
// since modelValue might be empty and validating just that

dist/angular-schema-form.min.js

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

package.json

+2-12
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
"Marcel J Bennett <[email protected]> (https://github.com/Anthropic)",
2121
"Denis Dervisevic <[email protected]> (https://github.com/Dervisevic)",
2222
"Cameron Edwards (https://github.com/cameronprattedwards)",
23-
"Mike Marcacci (https://github.com/mike-marcacci)",
24-
"Marcel Bennett (https://github.com/Anthropic)"
23+
"Mike Marcacci (https://github.com/mike-marcacci)"
2524
],
2625
"license": "MIT",
2726
"dependencies": {
@@ -69,14 +68,5 @@
6968
"type": "MIT",
7069
"url": "https://raw.githubusercontent.com/json-schema-form/angular-schema-form/master/LICENSE"
7170
}
72-
],
73-
"ignore-for-now-autoupdate": {
74-
"source": "git",
75-
"target": "git://github.com/json-schema-form/angular-schema-form.git",
76-
"basePath": "/dist/",
77-
"files": [
78-
"schema-form.min.js",
79-
"schema-form.js"
80-
]
81-
}
71+
]
8272
}

src/directives/schema-validate.directive.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export default function(sfValidator, $parse, sfSelect) {
2929
// Validate against the schema.
3030

3131
var validate = function(viewValue) {
32-
//console.log('validate called', viewValue)
3332
//Still might be undefined
3433
if (!form) {
3534
return viewValue;
@@ -106,9 +105,10 @@ export default function(sfValidator, $parse, sfSelect) {
106105

107106
// A bit ugly but useful.
108107
scope.validateField = function(formName) {
108+
let noField = (formName === undefined);
109109
// If we have specified a form name, and this model is not within
110110
// that form, then leave things be.
111-
if (formName != undefined && ngModel.$$parentForm.$name !== formName) {
111+
if (!noField && ngModel.$$parentForm.$name !== formName) {
112112
return;
113113
}
114114

@@ -117,9 +117,9 @@ export default function(sfValidator, $parse, sfSelect) {
117117
// Just setting the viewValue isn't enough to trigger validation
118118
// since it's the same value. This will be better when we drop
119119
// 1.2 support.
120-
if (schema && schema.type.indexOf('array') !== -1) {
120+
if (noField || schema && schema.type.indexOf('array') !== -1) {
121121
validate(ngModel.$modelValue);
122-
}
122+
};
123123

124124
// We set the viewValue to trigger parsers,
125125
// since modelValue might be empty and validating just that
@@ -143,7 +143,8 @@ export default function(sfValidator, $parse, sfSelect) {
143143
ngModel.$setValidity('tv4-302', false);
144144
}
145145

146-
} else {
146+
}
147+
else {
147148
// Angular 1.2
148149
// In angular 1.2 setting a viewValue of undefined will trigger the parser.
149150
// hence required works.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
chai.should();
2+
3+
describe('directive', function() {
4+
beforeEach(module('schemaForm'));
5+
beforeEach(
6+
module(function($sceProvider) {
7+
$sceProvider.enabled(false);
8+
})
9+
);
10+
11+
var exampleSchema = {
12+
"type": "object",
13+
"title": "Person",
14+
"properties": {
15+
"name": {
16+
"title": "Name",
17+
"type": "string",
18+
"minLength": 10
19+
}
20+
}
21+
};
22+
23+
it('should handle buttons', function() {
24+
inject(function($compile,$rootScope) {
25+
var scope = $rootScope.$new();
26+
scope.obj = { "name": "Json" };
27+
28+
scope.schema = exampleSchema;
29+
30+
scope.form = ["*"];
31+
32+
scope.validate_all = function() {
33+
scope.$broadcast('schemaFormValidate');
34+
};
35+
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+
43+
$compile(tmpl)(scope);
44+
$rootScope.$apply();
45+
46+
var form = tmpl.find('form').eq(0).controller('form');
47+
48+
form.$valid.should.be.true;
49+
scope.validate_all.should.not.have.beenCalled;
50+
tmpl.find('input.validate').click();
51+
scope.validate_all.should.have.beenCalledOnce;
52+
form.$valid.should.be.false;
53+
54+
});
55+
});
56+
});

src/services/schema-form-decorators.provider.spec.js

+23-23
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,29 @@ chai.should();
33
describe('schemaFormDecorators', function() {
44
beforeEach(module('schemaForm'));
55

6-
describe('#legacy #createDecorator', function() {
7-
it('should enable you to create new decorator directives', function() {
8-
module(function(schemaFormDecoratorsProvider) {
9-
schemaFormDecoratorsProvider.createDecorator('foobar', { 'foo': '/bar.html' }, [ angular.noop ]);
10-
});
11-
12-
inject(function($rootScope, $compile, $templateCache) {
13-
$templateCache.put('/bar.html', '<div class="yes">YES</div>');
14-
15-
//Since our directive does a replace we need a wrapper to actually check the content.
16-
var templateWithWrap = angular.element('<div id="wrap"><foobar form="{ type: \'foo\'}"></foobar></div>');
17-
var template = templateWithWrap.children().eq(0);
18-
19-
$compile(template)($rootScope);
20-
$rootScope.$apply();
21-
templateWithWrap.children().length.should.equal(1);
22-
templateWithWrap.children().is('foobar').should.be.true;
23-
templateWithWrap.children().eq(0).children().length.should.equal(1);
24-
templateWithWrap.children().eq(0).children().is('div').should.be.true;
25-
templateWithWrap.children().eq(0).children().hasClass('yes').should.be.true;
26-
});
27-
});
28-
});
6+
// describe('#legacy #createDecorator', function() {
7+
// it('should enable you to create new decorator directives', function() {
8+
// module(function(schemaFormDecoratorsProvider) {
9+
// schemaFormDecoratorsProvider.createDecorator('foobar', { 'foo': '/bar.html' }, [ angular.noop ]);
10+
// });
11+
//
12+
// inject(function($rootScope, $compile, $templateCache) {
13+
// $templateCache.put('/bar.html', '<div class="yes">YES</div>');
14+
//
15+
// //Since our directive does a replace we need a wrapper to actually check the content.
16+
// var templateWithWrap = angular.element('<div id="wrap"><foobar form="{ type: \'foo\'}"></foobar></div>');
17+
// var template = templateWithWrap.children().eq(0);
18+
//
19+
// $compile(template)($rootScope);
20+
// $rootScope.$apply();
21+
// templateWithWrap.children().length.should.equal(1);
22+
// templateWithWrap.children().is('foobar').should.be.true;
23+
// templateWithWrap.children().eq(0).children().length.should.equal(1);
24+
// templateWithWrap.children().eq(0).children().is('div').should.be.true;
25+
// templateWithWrap.children().eq(0).children().hasClass('yes').should.be.true;
26+
// });
27+
// });
28+
// });
2929

3030
describe('#legacy #defineDecorator', function() {
3131
it('should enable you to create new decorator directives', function() {

0 commit comments

Comments
 (0)