Skip to content

Commit

Permalink
Merge pull request #184 from edgarmueller/master
Browse files Browse the repository at this point in the history
Fixes related to #181 and #180
  • Loading branch information
sdirix committed Feb 29, 2016
2 parents 5900cc0 + d280dfd commit 845d564
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 22 deletions.
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "jsonforms",
"description": "JSONForms is an AngularJS-based framework to simplify the creation of forms for data entry and edit in web applications. It allows to declaratively define data and layout of a form and to embed the form into your HTML with one simple <jsonforms> tag.",
"version": "0.0.15",
"version": "0.0.16",
"homepage": "https://github.com/eclipsesource/jsonforms",
"license": "MIT",
"main": [
Expand Down
24 changes: 7 additions & 17 deletions components/form/form-directive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class FormController {
var resolvedSchemaDeferred = this.$q.defer();
var resolvedUISchemaDeferred = this.$q.defer();

this.$q.all([this.fetchSchema().promise, this.fetchUiSchema().promise]).then((values) => {
this.$q.all([this.fetchSchema(), this.fetchUiSchema()]).then((values) => {
var schema = values[0];
var uiSchemaMaybe = values[1];

Expand Down Expand Up @@ -90,15 +90,11 @@ class FormController {

private fetchSchema() {
if (typeof this.scope.schema === "object") {
var p: ng.IDeferred<any> = this.$q.defer<any>();
p.resolve(this.scope.schema);
return p;
return this.$q.when(this.scope.schema);
} else if (this.scope.schema !== undefined) {
return this.scope.schema();
} else {
var p: ng.IDeferred<any> = this.$q.defer<any>();
p.resolve(this.SchemaGenerator.generateDefaultSchema(this.scope.data));
return p;
return this.$q.when(this.SchemaGenerator.generateDefaultSchema(this.scope.data));
}
}

Expand All @@ -107,27 +103,21 @@ class FormController {
if (FormController.isUiSchemaProvider(this.scope.uiSchema)) {
return this.scope.uiSchema.getUiSchema();
} else if (typeof this.scope.uiSchema === "object") {
let p = this.$q.defer();
p.resolve(this.scope.uiSchema);
return p;
return this.$q.when(this.scope.uiSchema);
}

// if we return undefined the caller will generate a default UI schema
let p: ng.IDeferred<any> = this.$q.defer<any>();
p.resolve(undefined);
return p;
return this.$q.when(undefined);
}

private fetchData() {
if (FormController.isDataProvider(this.scope.data)) {
return this.scope.data.fetchData();
} else if (typeof this.scope.data === "object") {
var p = this.$q.defer();
p.resolve(this.scope.data);
return p.promise;
return this.$q.when(this.scope.data);
}

throw new Error("Either the 'data' or the 'async-data-provider' attribute must be specified.")
throw new Error("The 'data' attribute must be specified.")
}

private static isDataProvider(testMe: any): testMe is JSONForms.IDataProvider {
Expand Down
2 changes: 1 addition & 1 deletion components/form/form.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('jsonforms directive', () => {
expect(function() {
$compile('<jsonforms schema="schema" ui-schema="uiSchema"/>')(scope);
scope.$digest();
}).toThrow(Error("Either the 'data' or the 'async-data-provider' attribute must be specified."))
}).toThrow(Error("The 'data' attribute must be specified."))
}));

it("should created nested objects", inject(($rootScope, $compile) => {
Expand Down
27 changes: 27 additions & 0 deletions components/renderers/controls/array/array-renderer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,31 @@ describe('Array renderer', () => {
scope.$digest();
expect(angular.element(el[0].getElementsByClassName('jsf-group').length)[0]).toBe(3);
}));

it("should render an empty array", inject(($rootScope, $compile) => {
let scope = $rootScope.$new();
scope.schema = {
"properties": {
"comments": {
"type": "array",
"items": {
"properties": {
"msg": {"type": "string"}
}
}
}
}
};
scope.uiSchema = {
"type": "Control",
"scope": { "$ref": "#/properties/comments" },
"options": {
"submit": true
}
};
scope.data = {};
let el = $compile('<jsonforms schema="schema" ui-schema="uiSchema" data="data"/>')(scope);
scope.$digest();
expect(angular.element(el[0].getElementsByClassName('jsf-group').length)[0]).toBe(1);
}));
});
8 changes: 6 additions & 2 deletions components/renderers/controls/array/array-renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class ArrayRenderer implements JSONForms.IRenderer {
} else {
let submitElement = {};
let supportsSubmit = element.options != undefined && element.options['submit'];
let generatedGroups = this.createControlGroupPerItem(schemaPath, items, data.length);
let generatedGroups = this.createControlGroupPerItem(schemaPath, items, data == undefined ? 0 : data.length);
let buttonText = JSONForms.PathUtil.beautifiedLastFragment(schemaPath);

let template = `
Expand All @@ -120,10 +120,14 @@ class ArrayRenderer implements JSONForms.IRenderer {
if (supportsSubmit) {
containerDescription['submitElement'] = submitElement;
containerDescription['submitControls'] = this.createControlsForSubmit(items, schemaPath, submitElement, services);
if (data == undefined) {
containerDescription["instance"][containerDescription['path']] = [];
data = [];
}
containerDescription['submitCallback'] = () => data.push(_.clone(submitElement));
}
containerDescription['generateControlDescriptions'] = (data) =>
this.generateControlDescriptions(items, schemaPath, containerDescription['elements'], data.length, services);
this.generateControlDescriptions(items, schemaPath, containerDescription['elements'], data.length, services);
return containerDescription;
}
}
Expand Down
25 changes: 25 additions & 0 deletions components/services/pathresolver/pathresolver.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/// <reference path="../../references.ts"/>

describe("PathResolver", () => {

it("", () => {
let schema = {
"properties": {
"comments": {
"type": "array",
"items": {
"properties": {
"msg": {"type": "string"}
}
}
}
}
};
let schemaPath = "#/properties/comments";
let data = {};
let pathResolver = new JSONForms.PathResolver();
let resolvedData = pathResolver.resolveInstance(data, schemaPath);
expect(resolvedData).toBeUndefined();
});

});
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "jsonforms",
"private": true,
"version": "0.0.15",
"version": "0.0.16",
"description": "Generating forms for JSON schema",
"repository": "https://github.com/eclipsesource/jsonforms",
"license": "MIT",
Expand Down

0 comments on commit 845d564

Please sign in to comment.