diff --git a/compiler/ast/CustomTag.js b/compiler/ast/CustomTag.js index 2d1983e2a..6de24d8d1 100644 --- a/compiler/ast/CustomTag.js +++ b/compiler/ast/CustomTag.js @@ -403,6 +403,10 @@ class CustomTag extends HtmlElement { Object.assign(this._additionalProps, additionalProps); } + hasProp(name) { + return this._additionalProps && this._additionalProps.hasOwnProperty(name); + } + addProp(name, value) { if (!this._additionalProps) { this._additionalProps = {}; diff --git a/package.json b/package.json index 72bc110a4..8ef60378e 100644 --- a/package.json +++ b/package.json @@ -137,6 +137,7 @@ }, "minprops": { "exclude": [ + "b", "c", "ca", "e", diff --git a/taglibs/core/body-slot-tag.js b/taglibs/core/body-slot-tag.js new file mode 100644 index 000000000..ad9a485c9 --- /dev/null +++ b/taglibs/core/body-slot-tag.js @@ -0,0 +1,11 @@ +module.exports = function codeGenerator(elNode, generator) { + var context = generator.context; + var builder = generator.builder; + var includeNode = context.createNodeForEl('include'); + includeNode.addProp( + '_target', + builder.memberExpression( + builder.identifier('data'), + builder.identifier('renderBody'))); + return includeNode; +}; \ No newline at end of file diff --git a/taglibs/core/core-transformer.js b/taglibs/core/core-transformer.js index f963a1329..bc7b3c5b6 100644 --- a/taglibs/core/core-transformer.js +++ b/taglibs/core/core-transformer.js @@ -163,8 +163,30 @@ var coreAttrHandlers = [ 'include', function(attr, node, el) { var context = this.context; - var includeNode = context.createNodeForEl('include', null, attr.argument); - node.appendChild(includeNode); + if (attr.argument) { + var includeNode = context.createNodeForEl('include', null, attr.argument); + node.appendChild(includeNode); + } else { + context.addError(el, 'The include attribute must have an argument. For example: include("./target.marko") or include(data.renderBody)'); + } + } + ], + [ + 'body-slot', function(attr, node, el) { + var context = this.context; + + if (attr.argument) { + context.addError(el, 'The body-slot attribute should not have an argument.'); + return; + } + + if (attr.value) { + context.addError(el, 'The body-slot attribute should not have a value.'); + return; + } + + var bodySlot = context.createNodeForEl('body-slot'); + node.appendChild(bodySlot); } ] ]; diff --git a/taglibs/core/include-tag-transformer.js b/taglibs/core/include-tag-transformer.js index d98fb3433..f6eb46bb4 100644 --- a/taglibs/core/include-tag-transformer.js +++ b/taglibs/core/include-tag-transformer.js @@ -1,34 +1,29 @@ 'use strict'; -module.exports = function codeGenerator(el, context) { +module.exports = function(el, context) { let builder = context.builder; - let target; - let arg; - if (el.argument) { let args = el.argument && builder.parseJavaScriptArgs(el.argument); el.argument = null; - target = args[0]; - arg = args[1]; - } else { - return; + let target = args[0]; + let arg = args[1]; + + if (target.type === 'Literal') { + target = context.importTemplate(target.value); + } + + var includeProps = { + _target: target + }; + + if (arg) { + includeProps._arg = arg; + } + + el.addProps(includeProps); + } else if (!el.hasProp('_target')) { + context.addError(el, 'The tag must have an argument: or '); } - - if (target.type === 'Literal') { - target = context.importTemplate(target.value); - } - - var includeProps = { - _target: target - }; - - if (arg) { - includeProps._arg = arg; - } - - el.data.includeTarget = target; - - el.addProps(includeProps); }; \ No newline at end of file diff --git a/taglibs/core/marko.json b/taglibs/core/marko.json index eae7ffae1..0fb8f213a 100644 --- a/taglibs/core/marko.json +++ b/taglibs/core/marko.json @@ -9,6 +9,17 @@ } ] }, + "": { + "code-generator": "./body-slot-tag", + "attributes": {}, + "autocomplete": [ + { + "displayText": "body-slot", + "snippet": "body-slot", + "openTagOnly": true + } + ] + }, "": { "node-factory": "./else-tag", "attributes": {}, @@ -299,8 +310,8 @@ "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes" }, { - "displayText": "include()", - "snippet": "include()", + "displayText": "include(data.renderBody)", + "snippet": "include(data.renderBody)", "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes" }, { diff --git a/test/autotests/render/body-slot-attr-error-argument/expected.html b/test/autotests/render/body-slot-attr-error-argument/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-argument/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr-error-argument/template.marko b/test/autotests/render/body-slot-attr-error-argument/template.marko new file mode 100644 index 000000000..ffa496587 --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-argument/template.marko @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr-error-argument/test.js b/test/autotests/render/body-slot-attr-error-argument/test.js new file mode 100644 index 000000000..048d9cda1 --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-argument/test.js @@ -0,0 +1,8 @@ +var expect = require('chai').expect; + +exports.templateData = {}; + +exports.checkError = function(e) { + var message = e.toString(); + expect(message).to.contain('The body-slot attribute should not have an argument'); +}; diff --git a/test/autotests/render/body-slot-attr-error-value/expected.html b/test/autotests/render/body-slot-attr-error-value/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-value/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr-error-value/template.marko b/test/autotests/render/body-slot-attr-error-value/template.marko new file mode 100644 index 000000000..3c77651d1 --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-value/template.marko @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr-error-value/test.js b/test/autotests/render/body-slot-attr-error-value/test.js new file mode 100644 index 000000000..d769c5c2d --- /dev/null +++ b/test/autotests/render/body-slot-attr-error-value/test.js @@ -0,0 +1,8 @@ +var expect = require('chai').expect; + +exports.templateData = {}; + +exports.checkError = function(e) { + var message = e.toString(); + expect(message).to.contain('The body-slot attribute should not have a value'); +}; diff --git a/test/autotests/render/body-slot-attr/expected.html b/test/autotests/render/body-slot-attr/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/body-slot-attr/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr/include-target.marko b/test/autotests/render/body-slot-attr/include-target.marko new file mode 100644 index 000000000..9ca910a68 --- /dev/null +++ b/test/autotests/render/body-slot-attr/include-target.marko @@ -0,0 +1,4 @@ +
+

Test

+ +
\ No newline at end of file diff --git a/test/autotests/render/body-slot-attr/template.marko b/test/autotests/render/body-slot-attr/template.marko new file mode 100644 index 000000000..a3bb55914 --- /dev/null +++ b/test/autotests/render/body-slot-attr/template.marko @@ -0,0 +1,3 @@ + + This is the body + \ No newline at end of file diff --git a/test/autotests/render/body-slot-attr/test.js b/test/autotests/render/body-slot-attr/test.js new file mode 100644 index 000000000..c4013b344 --- /dev/null +++ b/test/autotests/render/body-slot-attr/test.js @@ -0,0 +1 @@ +exports.templateData = {}; diff --git a/test/autotests/render/body-slot/expected.html b/test/autotests/render/body-slot/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/body-slot/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/body-slot/include-target.marko b/test/autotests/render/body-slot/include-target.marko new file mode 100644 index 000000000..7dbfaa8da --- /dev/null +++ b/test/autotests/render/body-slot/include-target.marko @@ -0,0 +1,6 @@ +
+

Test

+ + +
+ \ No newline at end of file diff --git a/test/autotests/render/body-slot/template.marko b/test/autotests/render/body-slot/template.marko new file mode 100644 index 000000000..a3bb55914 --- /dev/null +++ b/test/autotests/render/body-slot/template.marko @@ -0,0 +1,3 @@ + + This is the body + \ No newline at end of file diff --git a/test/autotests/render/body-slot/test.js b/test/autotests/render/body-slot/test.js new file mode 100644 index 000000000..c4013b344 --- /dev/null +++ b/test/autotests/render/body-slot/test.js @@ -0,0 +1 @@ +exports.templateData = {}; diff --git a/test/autotests/render/include-attr-error-missing-argument/expected.html b/test/autotests/render/include-attr-error-missing-argument/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/include-attr-error-missing-argument/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/include-attr-error-missing-argument/template.marko b/test/autotests/render/include-attr-error-missing-argument/template.marko new file mode 100644 index 000000000..18835c0bf --- /dev/null +++ b/test/autotests/render/include-attr-error-missing-argument/template.marko @@ -0,0 +1,2 @@ +
+
\ No newline at end of file diff --git a/test/autotests/render/include-attr-error-missing-argument/test.js b/test/autotests/render/include-attr-error-missing-argument/test.js new file mode 100644 index 000000000..65889a4ae --- /dev/null +++ b/test/autotests/render/include-attr-error-missing-argument/test.js @@ -0,0 +1,9 @@ +var expect = require('chai').expect; + +exports.templateData = {}; + +exports.checkError = function(e) { + var message = e.toString(); + expect(message).to.contain('template.marko:1:0'); + expect(message).to.contain('The include attribute must have an argument'); +}; diff --git a/test/autotests/render/include-tag-error-missing-argument/expected.html b/test/autotests/render/include-tag-error-missing-argument/expected.html new file mode 100644 index 000000000..f756435b4 --- /dev/null +++ b/test/autotests/render/include-tag-error-missing-argument/expected.html @@ -0,0 +1 @@ +

Test

This is the body
\ No newline at end of file diff --git a/test/autotests/render/include-tag-error-missing-argument/template.marko b/test/autotests/render/include-tag-error-missing-argument/template.marko new file mode 100644 index 000000000..2ce2026e3 --- /dev/null +++ b/test/autotests/render/include-tag-error-missing-argument/template.marko @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/test/autotests/render/include-tag-error-missing-argument/test.js b/test/autotests/render/include-tag-error-missing-argument/test.js new file mode 100644 index 000000000..0ac6533d2 --- /dev/null +++ b/test/autotests/render/include-tag-error-missing-argument/test.js @@ -0,0 +1,8 @@ +var expect = require('chai').expect; + +exports.templateData = {}; + +exports.checkError = function(e) { + var message = e.toString(); + expect(message).to.contain('The tag must have an argument'); +}; diff --git a/test/autotests/taglib-lookup/forEachAttribute/expected.json b/test/autotests/taglib-lookup/forEachAttribute/expected.json index 7c55df239..067f5ff82 100644 --- a/test/autotests/taglib-lookup/forEachAttribute/expected.json +++ b/test/autotests/taglib-lookup/forEachAttribute/expected.json @@ -18,6 +18,7 @@ "ref", "w-for", "w-id", + "body-slot", "w-body", "w-preserve", "w-preserve-body", diff --git a/test/autotests/taglib-lookup/forEachTag/expected.json b/test/autotests/taglib-lookup/forEachTag/expected.json index 11d32d71d..9474c40d8 100644 --- a/test/autotests/taglib-lookup/forEachTag/expected.json +++ b/test/autotests/taglib-lookup/forEachTag/expected.json @@ -11,6 +11,7 @@ "lasso-resource", "browser-refresh", "assign", + "body-slot", "else", "else-if", "for", diff --git a/test/autotests/taglib-lookup/getTagsSorted/expected.json b/test/autotests/taglib-lookup/getTagsSorted/expected.json index 5e3197f4d..6d7f90a45 100644 --- a/test/autotests/taglib-lookup/getTagsSorted/expected.json +++ b/test/autotests/taglib-lookup/getTagsSorted/expected.json @@ -16,6 +16,7 @@ "await-timeout", "bar", "body", + "body-slot", "browser-refresh", "cached-fragment", "else", diff --git a/test/autotests/widgets-browser/extend-component/components/app-button/index.marko b/test/autotests/widgets-browser/extend-component/components/app-button/index.marko index b0b9cf8d2..83e4a453b 100644 --- a/test/autotests/widgets-browser/extend-component/components/app-button/index.marko +++ b/test/autotests/widgets-browser/extend-component/components/app-button/index.marko @@ -4,5 +4,5 @@ 'app-button-' + state.variant, 'app-button-' + state.size ] onClick("handleClick")> - + \ No newline at end of file diff --git a/test/autotests/widgets-browser/extend-component/components/app-checkbox/index.marko b/test/autotests/widgets-browser/extend-component/components/app-checkbox/index.marko index 2d7795ff2..8f973ba14 100644 --- a/test/autotests/widgets-browser/extend-component/components/app-checkbox/index.marko +++ b/test/autotests/widgets-browser/extend-component/components/app-checkbox/index.marko @@ -1,4 +1,6 @@ - + + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/include-preserve-old/components/app-foo/index.marko b/test/autotests/widgets-browser/include-preserve-old/components/app-foo/index.marko index beec5c595..216cf4eec 100644 --- a/test/autotests/widgets-browser/include-preserve-old/components/app-foo/index.marko +++ b/test/autotests/widgets-browser/include-preserve-old/components/app-foo/index.marko @@ -10,5 +10,5 @@ Hello ${state.name}! - + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-attr/components/app-button/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-attr/components/app-button/index.marko new file mode 100644 index 000000000..584d23f92 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-attr/components/app-button/index.marko @@ -0,0 +1,31 @@ + + +var variantClassName=(state.variant !== 'primary' && 'app-button-' + state.variant) +var sizeClassName=(state.size !== 'normal' && 'app-button-' + state.size) + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-attr/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-attr/index.marko new file mode 100644 index 000000000..50bba4ff6 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-attr/index.marko @@ -0,0 +1,11 @@ + + +
+ + ${data.name} + +
\ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-attr/test.js b/test/autotests/widgets-browser/transclusion-body-slot-attr/test.js new file mode 100644 index 000000000..fc22adee8 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-attr/test.js @@ -0,0 +1,23 @@ +var expect = require('chai').expect; + +module.exports = function(helpers) { + var widget = helpers.mount(require('./index'), { + name: 'Frank' + }); + + var buttonWidget = widget.getWidget('button'); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-small'); + + // Button widget will not rerender since it's state did not change and that means that the + // button content will remain as 'John' instead of 'Frank' + widget.setProps({ name: 'John '}); + widget.update(); + + expect(buttonWidget.el.innerHTML).to.contain('John'); + + buttonWidget.setSize('large'); + buttonWidget.update(); + expect(buttonWidget.el.innerHTML).to.contain('John'); + expect(buttonWidget.el.className).to.equal('app-button app-button-large'); +}; \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/components/app-button/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/components/app-button/index.marko new file mode 100644 index 000000000..b78c3bab8 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/components/app-button/index.marko @@ -0,0 +1,32 @@ + + +var variantClassName=(state.variant !== 'primary' && 'app-button-' + state.variant) +var sizeClassName=(state.size !== 'normal' && 'app-button-' + state.size) + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/index.marko new file mode 100644 index 000000000..50bba4ff6 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/index.marko @@ -0,0 +1,11 @@ + + +
+ + ${data.name} + +
\ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/test.js b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/test.js new file mode 100644 index 000000000..c0506a167 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-default-to-renderBody/test.js @@ -0,0 +1,21 @@ +var expect = require('chai').expect; + +module.exports = function(helpers) { + var widget = helpers.mount(require('./index'), { + name: 'Frank' + }); + + var buttonWidget = widget.getWidget('button'); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-small'); + + widget.setProps({ name: 'John '}); + widget.update(); + + expect(buttonWidget.el.innerHTML).to.contain('John'); + + buttonWidget.setSize('large'); + buttonWidget.update(); + expect(buttonWidget.el.innerHTML).to.contain('John'); + expect(buttonWidget.el.className).to.equal('app-button app-button-large'); +}; \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-tag/components/app-button/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-tag/components/app-button/index.marko new file mode 100644 index 000000000..e3d84cc8b --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-tag/components/app-button/index.marko @@ -0,0 +1,33 @@ + + +var variantClassName=(state.variant !== 'primary' && 'app-button-' + state.variant) +var sizeClassName=(state.size !== 'normal' && 'app-button-' + state.size) + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-tag/index.marko b/test/autotests/widgets-browser/transclusion-body-slot-tag/index.marko new file mode 100644 index 000000000..50bba4ff6 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-tag/index.marko @@ -0,0 +1,11 @@ + + +
+ + ${data.name} + +
\ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-body-slot-tag/test.js b/test/autotests/widgets-browser/transclusion-body-slot-tag/test.js new file mode 100644 index 000000000..c0506a167 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-body-slot-tag/test.js @@ -0,0 +1,21 @@ +var expect = require('chai').expect; + +module.exports = function(helpers) { + var widget = helpers.mount(require('./index'), { + name: 'Frank' + }); + + var buttonWidget = widget.getWidget('button'); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-small'); + + widget.setProps({ name: 'John '}); + widget.update(); + + expect(buttonWidget.el.innerHTML).to.contain('John'); + + buttonWidget.setSize('large'); + buttonWidget.update(); + expect(buttonWidget.el.innerHTML).to.contain('John'); + expect(buttonWidget.el.className).to.equal('app-button app-button-large'); +}; \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-from-state/components/app-button/index.marko b/test/autotests/widgets-browser/transclusion-include-from-state/components/app-button/index.marko new file mode 100644 index 000000000..baa1f2dcb --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-from-state/components/app-button/index.marko @@ -0,0 +1,31 @@ + + +var variantClassName=(state.variant !== 'primary' && 'app-button-' + state.variant) +var sizeClassName=(state.size !== 'normal' && 'app-button-' + state.size) + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-from-state/index.marko b/test/autotests/widgets-browser/transclusion-include-from-state/index.marko new file mode 100644 index 000000000..50bba4ff6 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-from-state/index.marko @@ -0,0 +1,11 @@ + + +
+ + ${data.name} + +
\ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-from-state/test.js b/test/autotests/widgets-browser/transclusion-include-from-state/test.js new file mode 100644 index 000000000..e0bb7850d --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-from-state/test.js @@ -0,0 +1,29 @@ +var expect = require('chai').expect; + +module.exports = function(helpers) { + var widget = helpers.mount(require('./index'), { + name: 'Frank' + }); + + var buttonWidget = widget.getWidget('button'); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-small'); + + widget.rerender({ name: 'John '}); + + expect(buttonWidget.el.innerHTML).to.contain('John'); + + buttonWidget.setSize('large'); + buttonWidget.update(); + expect(buttonWidget.el.innerHTML).to.contain('John'); + expect(buttonWidget.el.className).to.equal('app-button app-button-large'); + + buttonWidget.rerender({ + size: 'small', + variant: 'secondary' + // NOTE: We aren't including renderBody() but we expect that content to be preserved + }); + + expect(buttonWidget.el.innerHTML).to.contain('John'); + expect(buttonWidget.el.className).to.equal('app-button app-button-secondary app-button-small'); +}; \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-not-in-state/components/app-button/index.marko b/test/autotests/widgets-browser/transclusion-include-not-in-state/components/app-button/index.marko new file mode 100644 index 000000000..be451b9fe --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-not-in-state/components/app-button/index.marko @@ -0,0 +1,30 @@ + + +var variantClassName=(state.variant !== 'primary' && 'app-button-' + state.variant) +var sizeClassName=(state.size !== 'normal' && 'app-button-' + state.size) + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-not-in-state/index.marko b/test/autotests/widgets-browser/transclusion-include-not-in-state/index.marko new file mode 100644 index 000000000..50bba4ff6 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-not-in-state/index.marko @@ -0,0 +1,11 @@ + + +
+ + ${data.name} + +
\ No newline at end of file diff --git a/test/autotests/widgets-browser/transclusion-include-not-in-state/test.js b/test/autotests/widgets-browser/transclusion-include-not-in-state/test.js new file mode 100644 index 000000000..ed2d53b90 --- /dev/null +++ b/test/autotests/widgets-browser/transclusion-include-not-in-state/test.js @@ -0,0 +1,23 @@ +var expect = require('chai').expect; + +module.exports = function(helpers) { + var widget = helpers.mount(require('./index'), { + name: 'Frank' + }); + + var buttonWidget = widget.getWidget('button'); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-small'); + + // Button widget will not rerender since it's state did not change and that means that the + // button content will remain as 'John' instead of 'Frank' + widget.setProps({ name: 'John '}); + widget.update(); + + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + + buttonWidget.setSize('large'); + buttonWidget.update(); + expect(buttonWidget.el.innerHTML).to.contain('Frank'); + expect(buttonWidget.el.className).to.equal('app-button app-button-large'); +}; \ No newline at end of file diff --git a/test/autotests/widgets-browser/update-manager-batch-updates/component.js b/test/autotests/widgets-browser/update-manager-batch-updates/component.js index c723887c2..7e4896fbf 100644 --- a/test/autotests/widgets-browser/update-manager-batch-updates/component.js +++ b/test/autotests/widgets-browser/update-manager-batch-updates/component.js @@ -6,10 +6,7 @@ module.exports = { className: input['class'], attrs: input['*'] }; - }, - - getInitialBody: function(input) { - return input.label || input.renderBody; + this.body = input.label || input.renderBody; }, getTemplateData: function(state, input) { var rootAttrs = {}; diff --git a/test/autotests/widgets-browser/update-manager-batch-updates/index.marko b/test/autotests/widgets-browser/update-manager-batch-updates/index.marko index 8a02311be..0ace7b774 100644 --- a/test/autotests/widgets-browser/update-manager-batch-updates/index.marko +++ b/test/autotests/widgets-browser/update-manager-batch-updates/index.marko @@ -1,4 +1,4 @@ \ No newline at end of file + onClick("handleClick")> + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/update-manager-next-tick/index.marko b/test/autotests/widgets-browser/update-manager-next-tick/index.marko index 8a02311be..9e3d212ac 100644 --- a/test/autotests/widgets-browser/update-manager-next-tick/index.marko +++ b/test/autotests/widgets-browser/update-manager-next-tick/index.marko @@ -1,4 +1,3 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/index.marko b/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/index.marko index c10fdda3b..0ace7b774 100644 --- a/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/index.marko +++ b/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/index.marko @@ -1,3 +1,4 @@ \ No newline at end of file + onClick("handleClick")> + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-update/index.marko b/test/autotests/widgets-browser/widget-stateful-update/index.marko index 8a02311be..0ace7b774 100644 --- a/test/autotests/widgets-browser/widget-stateful-update/index.marko +++ b/test/autotests/widgets-browser/widget-stateful-update/index.marko @@ -1,4 +1,4 @@ \ No newline at end of file + onClick("handleClick")> + + \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-transclusion/components/app-transclusion-alert/index.marko b/test/autotests/widgets-browser/widget-transclusion/components/app-transclusion-alert/index.marko index 2ca66c567..a18a3abba 100644 --- a/test/autotests/widgets-browser/widget-transclusion/components/app-transclusion-alert/index.marko +++ b/test/autotests/widgets-browser/widget-transclusion/components/app-transclusion-alert/index.marko @@ -4,6 +4,8 @@ var className=('alert alert-'+type)