From 04f5c7b20fc1c09d0c45b3352c71111a15af1688 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 22 Apr 2015 17:07:03 +0300 Subject: [PATCH] properties will be copied to the custom component with XML + tests --- .../xml-declaration/xml-declaration-tests.ts | 27 ++++++++++++++++++- ui/builder/builder.ts | 9 +++++++ ui/builder/component-builder.d.ts | 1 + ui/builder/component-builder.ts | 2 +- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/apps/tests/xml-declaration/xml-declaration-tests.ts b/apps/tests/xml-declaration/xml-declaration-tests.ts index 79bc65873..26d636473 100644 --- a/apps/tests/xml-declaration/xml-declaration-tests.ts +++ b/apps/tests/xml-declaration/xml-declaration-tests.ts @@ -10,6 +10,9 @@ import types = require("utils/types"); import fs = require("file-system"); import fileSystemAccess = require("file-system/file-system-access"); import observable = require("data/observable"); +import stackLayoutModule = require("ui/layouts/stack-layout"); +import labelModule = require("ui/label"); +import myCustomControlWithoutXml = require("./mymodule/MyControl"); export var test_load_IsDefined = function () { TKUnit.assert(types.isFunction(builder.load), "ui/builder should have load method!"); @@ -153,4 +156,26 @@ export var test_parse_ShouldParseSubProperties = function () { var sw = p.content; TKUnit.assert(sw.visibility === "collapsed", "Expected result: collapsed; Actual result: " + sw.visibility + "; type: " + typeof (sw.visibility)); -}; \ No newline at end of file +}; + +export var test_parse_ShouldParseCustomComponentWithoutXml = function () { + var p = builder.parse(''); + var ctrl = p.content; + + TKUnit.assert(ctrl instanceof myCustomControlWithoutXml.MyControl, "Expected result: custom control is defined!; Actual result: " + ctrl); +}; + +export var test_parse_ShouldParseCustomComponentWitXml = function () { + var p = builder.parse(''); + var panel = p.content; + var lbl = panel.getChildAt(0); + + TKUnit.assert(lbl.text === "mymodulewithxml", "Expected result: 'mymodulewithxml'; Actual result: " + lbl); +}; + +export var test_parse_ShouldParseCustomComponentWitXmlWithAttributes = function () { + var p = builder.parse(''); + var panel = p.content; + + TKUnit.assert(panel.visibility === "collapsed", "Expected result: 'collapsed'; Actual result: " + panel.visibility); +}; diff --git a/ui/builder/builder.ts b/ui/builder/builder.ts index 24e5e4e41..b35b284dd 100644 --- a/ui/builder/builder.ts +++ b/ui/builder/builder.ts @@ -83,8 +83,17 @@ function parseInternal(value: string, exports: any): componentBuilder.ComponentM // Custom components with XML and code subExports = require(jsPath.replace(".js", "")) } + componentModule = loadInternal(xmlPath, subExports); + // Attributes will be transfered to the custom component + if (types.isDefined(componentModule) && types.isDefined(componentModule.component)) { + var attr: string; + for (attr in args.attributes) { + componentBuilder.setPropertyValue(componentModule.component, subExports, exports, attr, args.attributes[attr]); + } + } + } else { // Custom components without XML componentModule = componentBuilder.getComponentModule(args.elementName, args.namespace, args.attributes, exports); diff --git a/ui/builder/component-builder.d.ts b/ui/builder/component-builder.d.ts index 45f52be0e..69379f79a 100644 --- a/ui/builder/component-builder.d.ts +++ b/ui/builder/component-builder.d.ts @@ -3,6 +3,7 @@ declare module "ui/builder/component-builder" { import view = require("ui/core/view"); export function getComponentModule(elementName: string, namespace: string, attributes: Object, exports: Object): ComponentModule; + export function setPropertyValue(instance: view.View, instanceModuleExports: Object, pageExports: Object, propertyName: string, propertyValue: string) : void; export interface ComponentModule { component: view.View; diff --git a/ui/builder/component-builder.ts b/ui/builder/component-builder.ts index acf625795..90abe69b2 100644 --- a/ui/builder/component-builder.ts +++ b/ui/builder/component-builder.ts @@ -102,7 +102,7 @@ export function getComponentModule(elementName: string, namespace: string, attri return componentModule; } -function setPropertyValue(instance: view.View, instanceModule: Object, exports: Object, propertyName: string, propertyValue: string) { +export function setPropertyValue(instance: view.View, instanceModule: Object, exports: Object, propertyName: string, propertyValue: string) { if (isBinding(propertyValue) && instance.bind) { if (isKnownEvent(propertyName, instanceModule)) { attachEventBinding(instance, propertyName, propertyValue);