Skip to content

Commit

Permalink
override getType function for custom classes/custom widgets: surveyjs…
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Telnov (DevExpress) authored and Andrew Telnov (DevExpress) committed Oct 13, 2017
1 parent 9a159b8 commit 43c03a3
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
13 changes: 8 additions & 5 deletions src/jsonobject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,14 +289,17 @@ export class JsonMetadata {
metaDataClass = this.findClass(parentName);
if (!metaDataClass) return null;
parentName = metaDataClass.parentName;
if(metaDataClass.creator) {
var res = metaDataClass.creator();
res.customType = name;
return res;
}
if(metaDataClass.creator) return this.createCustomType(name, metaDataClass.creator);
}
return null;
}
private createCustomType(name: string, creator: any): any {
var res = creator();
res.customTypeName = name;
res.getType = function() { return res.customTypeName; };
CustomPropertiesCollection.createProperties(res);
return res;
}
public getChildrenClasses(name: string, canBeCreated: boolean = false): Array<JsonMetadataClass> {
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
Expand Down
12 changes: 7 additions & 5 deletions tests/jsonobjecttests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ JsonObject.metaData.overrideClassCreatore("shouldnotcreate", function () { retur
JsonObject.metaData.addClass("loadingtest", ["name", { name: "items", className: "loadingtestitem"}], function () { return new LoadingFromJsonObj(); });
JsonObject.metaData.addClass("loadingtestitem", ["name"], function () { return new LoadingFromJsonObjItem(); });

JsonObject.metaData.addClass("customtruck", [], null, "truck");
JsonObject.metaData.addClass("customtruck", ["description"], null, "truck");
JsonObject.metaData.addProperty("customtruck", {name: "isCustom:boolean", default: true});

class CheckGetPropertyValue {
public directProp: string;
Expand Down Expand Up @@ -573,10 +574,11 @@ QUnit.test("Set default value to the custom property", function (assert) {
QUnit.test("Create object with virtual type by using parent constructor", function (assert) {
var dealer = new Dealer();
var jsonObj = new JsonObject();
jsonObj.toObject({ "cars": [{ "type": "customtruck", "maxWeight": 10000 }] }, dealer);
jsonObj.toObject({ "cars": [{ "type": "customtruck", "maxWeight": 10000, "description": "some text" }] }, dealer);
assert.equal(dealer.cars.length, 1, "can only one object deserialized");
var truck = <Truck>dealer.cars[0];
assert.equal(truck.maxWeight, 10000, "maxWait is desiarilized");
assert.equal(truck.getType(), "truck", "type is truck");
assert.equal(truck["customType"], "customtruck", "customType is added");
assert.equal(truck.maxWeight, 10000, "maxWeight is deserialized");
assert.equal(truck["description"], "some text", "added property is deserialized");
assert.equal(truck["isCustom"], true, "added property created if it is default");
assert.equal(truck.getType(), "customtruck", "type is truck");
});

0 comments on commit 43c03a3

Please sign in to comment.