diff --git a/src/scripts/lib/items/color.js b/src/scripts/components/color.js similarity index 94% rename from src/scripts/lib/items/color.js rename to src/scripts/components/color.js index 8b285b5..abdd54a 100644 --- a/src/scripts/lib/items/color.js +++ b/src/scripts/components/color.js @@ -1,10 +1,11 @@ 'use strict'; -var HTML = require('../../vendor/minified/minified').HTML; +var HTML = require('../vendor/minified/minified').HTML; module.exports = { - template: require('../../../templates/items/color.tpl'), - manipulator: require('../manipulators').val, + name: 'color', + template: require('../../templates/items/color.tpl'), + manipulator: require('../lib/manipulators').val, defaults: { label: '' }, @@ -82,7 +83,7 @@ module.exports = { } }); - self.on('|change', function() { + self.on('change', function() { var value = self.get().replace(/^0x/, '').toLowerCase(); $valueDisplay.set('$background-color', '#' + value); $elem.select('.color-box').set('-selected'); diff --git a/src/scripts/components/footer.js b/src/scripts/components/footer.js new file mode 100644 index 0000000..9d8f2cc --- /dev/null +++ b/src/scripts/components/footer.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = { + name: 'footer', + template: require('../../templates/items/footer.tpl'), + manipulator: require('../lib/manipulators').html, + defaults: { + attributes: {} + } +}; diff --git a/src/scripts/components/heading.js b/src/scripts/components/heading.js new file mode 100644 index 0000000..148d439 --- /dev/null +++ b/src/scripts/components/heading.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = { + name: 'heading', + template: require('../../templates/items/heading.tpl'), + manipulator: require('../lib/manipulators').html, + defaults: { + attributes: {}, + size: 4 + } +}; diff --git a/src/scripts/components/input.js b/src/scripts/components/input.js new file mode 100644 index 0000000..be98a30 --- /dev/null +++ b/src/scripts/components/input.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = { + name: 'input', + template: require('../../templates/items/input.tpl'), + manipulator: require('../lib/manipulators').val, + defaults: { + label: '', + attributes: {} + } +}; diff --git a/src/scripts/components/radiogroup.js b/src/scripts/components/radiogroup.js new file mode 100644 index 0000000..e905fad --- /dev/null +++ b/src/scripts/components/radiogroup.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = { + name: 'radiogroup', + template: require('../../templates/items/radiogroup.tpl'), + manipulator: require('../lib/manipulators').radiogroup, + defaults: { + label: '', + options: [] + } +}; diff --git a/src/scripts/lib/items/select.js b/src/scripts/components/select.js similarity index 73% rename from src/scripts/lib/items/select.js rename to src/scripts/components/select.js index 70a277d..1cf6f7b 100644 --- a/src/scripts/lib/items/select.js +++ b/src/scripts/components/select.js @@ -1,8 +1,9 @@ 'use strict'; module.exports = { - template: require('../../../templates/items/select.tpl'), - manipulator: require('../manipulators').val, + name: 'select', + template: require('../../templates/items/select.tpl'), + manipulator: require('../lib/manipulators').val, defaults: { label: '', options: [] diff --git a/src/scripts/components/submit.js b/src/scripts/components/submit.js new file mode 100644 index 0000000..f25f60b --- /dev/null +++ b/src/scripts/components/submit.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = { + name: 'submit', + template: require('../../templates/items/submit.tpl'), + manipulator: require('../lib/manipulators').val, + defaults: { + attributes: {} + } +}; diff --git a/src/scripts/components/text.js b/src/scripts/components/text.js new file mode 100644 index 0000000..806435c --- /dev/null +++ b/src/scripts/components/text.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = { + name: 'text', + template: require('../../templates/items/text.tpl'), + manipulator: require('../lib/manipulators').html, + defaults: { + attributes: {} + } +}; diff --git a/src/scripts/components/toggle.js b/src/scripts/components/toggle.js new file mode 100644 index 0000000..c2c6d2b --- /dev/null +++ b/src/scripts/components/toggle.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = { + name: 'toggle', + template: require('../../templates/items/toggle.tpl'), + manipulator: require('../lib/manipulators').checked, + defaults: { + attributes: {} + } +}; diff --git a/src/scripts/config-page.js b/src/scripts/config-page.js index 8a94956..1ed9811 100755 --- a/src/scripts/config-page.js +++ b/src/scripts/config-page.js @@ -13,14 +13,24 @@ var $mainForm = $('#main-form'); var clayConfig = new ClayConfig(settings, config, $mainForm); clayConfig.on(clayConfig.EVENTS.BEFORE_BUILD, function() { - // attach components here + + // register components here + this.registerComponent(require('./components/heading')); + this.registerComponent(require('./components/text')); + this.registerComponent(require('./components/footer')); + this.registerComponent(require('./components/input')); + this.registerComponent(require('./components/color')); + this.registerComponent(require('./components/select')); + this.registerComponent(require('./components/toggle')); + this.registerComponent(require('./components/radiogroup')); + this.registerComponent(require('./components/submit')); }); clayConfig.on(clayConfig.EVENTS.AFTER_BUILD, function() { var self = this; // add listeners here - $mainForm.on('|submit', function(event) { + $mainForm.on('submit', function(event) { // Set the return URL depending on the runtime environment location.href = returnTo + encodeURIComponent(JSON.stringify(self.getSettings())); diff --git a/src/scripts/lib/clay-config.js b/src/scripts/lib/clay-config.js index baabdfa..036a1a0 100644 --- a/src/scripts/lib/clay-config.js +++ b/src/scripts/lib/clay-config.js @@ -18,6 +18,7 @@ var _ = require('../vendor/minified/minified')._; var ClayItem = require('./clay-item'); var utils = require('../lib/utils'); var ClayEvents = require('./clay-events'); +var componentStore = require('./component-registry'); /** * @extends ClayEvents @@ -89,8 +90,20 @@ function ClayConfig(settings, config, $rootContainer) { return _settings; }; - // attach event methods - ClayEvents.call(self, $rootContainer); + /** + * Register a component to Clay. This must be called prior to .build(); + * @param {{}} component - the clay component to register + * @param {string} component.name - the name of the component + * @param {string} component.template - HTML template to use for the component + * @param {{}} component.manipulator - methods to attach to the component + * @param {function} component.manipulator.set - set manipulator method + * @param {function} component.manipulator.get - get manipulator method + * @param {{}} component.defaults - template defaults + * @param {function} [component.initialize] - method to scaffold the component + */ + self.registerComponent = function(component) { + componentStore[component.name] = component; + }; self.build = function() { self.trigger(self.EVENTS.BEFORE_BUILD); @@ -99,6 +112,9 @@ function ClayConfig(settings, config, $rootContainer) { self.trigger(self.EVENTS.AFTER_BUILD); }; + // attach event methods + ClayEvents.call(self, $rootContainer); + /** * Add item(s) to the config * @param {Clay~ConfigItem|array} items diff --git a/src/scripts/lib/clay-events.js b/src/scripts/lib/clay-events.js index aee7712..fc5378f 100644 --- a/src/scripts/lib/clay-events.js +++ b/src/scripts/lib/clay-events.js @@ -23,11 +23,14 @@ function ClayEvents($eventTarget) { * @returns {object} */ self.on = function(events, handler) { + var _events = events.split(' ').map(function(event) { + return '|' + event.replace(/^\|/, ''); + }).join(' '); var self = this; _eventProxies[handler] = function() { handler.apply(self, arguments); }; - $eventTarget.on(events, _eventProxies[handler]); + $eventTarget.on(_events, _eventProxies[handler]); return self; }; @@ -41,12 +44,15 @@ function ClayEvents($eventTarget) { * @returns {object} */ self.one = function(events, handler) { + var _events = events.split(' ').map(function(event) { + return '|' + event.replace(/^\|/, ''); + }).join(' '); var self = this; _eventProxies[handler] = function(event) { handler.apply(self, arguments); $.off(_eventProxies[handler]); }; - $eventTarget.on(events, _eventProxies[handler]); + $eventTarget.on(_events, _eventProxies[handler]); return self; }; @@ -70,7 +76,7 @@ function ClayEvents($eventTarget) { * @returns {object} */ self.trigger = function(name, eventObj) { - $eventTarget.trigger(name); + $eventTarget.trigger(name, eventObj); return self; }; } diff --git a/src/scripts/lib/clay-item.js b/src/scripts/lib/clay-item.js index e2c75ab..93bfe15 100644 --- a/src/scripts/lib/clay-item.js +++ b/src/scripts/lib/clay-item.js @@ -1,6 +1,6 @@ 'use strict'; -var itemTypes = require('./items'); +var componentRegistry = require('./component-registry'); var _ = require('../vendor/minified/minified')._; var HTML = require('../vendor/minified/minified').HTML; var utils = require('../lib/utils'); @@ -14,7 +14,7 @@ var ClayEvents = require('./clay-events'); function ClayItem(config) { var self = this; - var _itemType = itemTypes[config.type]; + var _itemType = componentRegistry[config.type]; var _templateData = _.extend({}, _itemType.defaults, config); /** @type {string|null} */ diff --git a/src/scripts/lib/component-registry.js b/src/scripts/lib/component-registry.js new file mode 100755 index 0000000..4a50721 --- /dev/null +++ b/src/scripts/lib/component-registry.js @@ -0,0 +1,4 @@ +'use strict'; + +// module is blank because we dynamically add components +module.exports = {}; diff --git a/src/scripts/lib/items.js b/src/scripts/lib/items.js deleted file mode 100755 index 5d9cee8..0000000 --- a/src/scripts/lib/items.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -module.exports = { - heading: require('./items/heading'), - text: require('./items/text'), - footer: require('./items/footer'), - input: require('./items/input'), - color: require('./items/color'), - select: require('./items/select'), - toggle: require('./items/toggle'), - radiogroup: require('./items/radiogroup'), - submit: require('./items/submit') -}; diff --git a/src/scripts/lib/items/footer.js b/src/scripts/lib/items/footer.js deleted file mode 100644 index b817ff7..0000000 --- a/src/scripts/lib/items/footer.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/footer.tpl'), - manipulator: require('../manipulators').html, - defaults: { - attributes: {} - } -}; diff --git a/src/scripts/lib/items/heading.js b/src/scripts/lib/items/heading.js deleted file mode 100644 index 509fa08..0000000 --- a/src/scripts/lib/items/heading.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/heading.tpl'), - manipulator: require('../manipulators').html, - defaults: { - attributes: {}, - size: 4 - } -}; diff --git a/src/scripts/lib/items/input.js b/src/scripts/lib/items/input.js deleted file mode 100644 index 5371090..0000000 --- a/src/scripts/lib/items/input.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/input.tpl'), - manipulator: require('../manipulators').val, - defaults: { - label: '', - attributes: {} - } -}; diff --git a/src/scripts/lib/items/radiogroup.js b/src/scripts/lib/items/radiogroup.js deleted file mode 100644 index cd4eebe..0000000 --- a/src/scripts/lib/items/radiogroup.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/radiogroup.tpl'), - manipulator: require('../manipulators').radiogroup, - defaults: { - label: '', - options: [] - } -}; diff --git a/src/scripts/lib/items/submit.js b/src/scripts/lib/items/submit.js deleted file mode 100644 index 2fdfd6b..0000000 --- a/src/scripts/lib/items/submit.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/submit.tpl'), - manipulator: require('../manipulators').val, - defaults: { - attributes: {} - } -}; diff --git a/src/scripts/lib/items/text.js b/src/scripts/lib/items/text.js deleted file mode 100644 index 07c64f0..0000000 --- a/src/scripts/lib/items/text.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/text.tpl'), - manipulator: require('../manipulators').html, - defaults: { - attributes: {} - } -}; diff --git a/src/scripts/lib/items/toggle.js b/src/scripts/lib/items/toggle.js deleted file mode 100644 index 345bfaf..0000000 --- a/src/scripts/lib/items/toggle.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -module.exports = { - template: require('../../../templates/items/toggle.tpl'), - manipulator: require('../manipulators').checked, - defaults: { - attributes: {} - } -};