|
@@ -1,132 +1,117 @@
|
|
|
"use strict";
|
|
"use strict";
|
|
|
(function($) {
|
|
(function($) {
|
|
|
$(document).ready(function() {
|
|
$(document).ready(function() {
|
|
|
|
|
+ console.log('ws: init UI parts');
|
|
|
|
|
|
|
|
|
|
|
|
|
- var eventBinders = {
|
|
|
|
|
-
|
|
|
|
|
- menuExample: function() {
|
|
|
|
|
- console.log('eventBinder for menuExample', this);
|
|
|
|
|
- this.$elem.find('a').click(function(e) {
|
|
|
|
|
- e.preventDefault();
|
|
|
|
|
- var $link = $(this);
|
|
|
|
|
- console.log('menu item clicked', $link.prop('href'));
|
|
|
|
|
- var originalColor = $link.css('backgroundColor');
|
|
|
|
|
- // self.toggleMenu();
|
|
|
|
|
- $link.animate({
|
|
|
|
|
- backgroundColor: '#aaa',
|
|
|
|
|
- }, 70);
|
|
|
|
|
- $link.animate({
|
|
|
|
|
- backgroundColor: originalColor,
|
|
|
|
|
- }, 70);
|
|
|
|
|
- _ws.navigator.navigateTo($link.prop('href'));
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Initialize an empty object to be populated as follows:
|
|
|
|
|
+ * - key is an UI element's id
|
|
|
|
|
+ * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
|
|
|
|
|
+ */
|
|
|
|
|
+ _ws.ui = {};
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Generic template-based rendering function
|
|
|
|
|
+ */
|
|
|
|
|
+ function viewDefaultRender(data) {
|
|
|
|
|
+ if(! data) {
|
|
|
|
|
+ console.log('WARNING! You should provide data for #' + elemId + "'s render()");
|
|
|
|
|
+ }
|
|
|
|
|
+ this.$elem.html( Mustache.render( this.tmpl, data ) );
|
|
|
|
|
+ this.$elem.show();
|
|
|
|
|
+ this.bindEvents();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Wrapper around provided render function (show elem after render)
|
|
|
|
|
+ */
|
|
|
|
|
+ function viewRenderWrapper(data) {
|
|
|
|
|
+ this._render(data);
|
|
|
|
|
+ this.$elem.show();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Bind events
|
|
|
|
|
+ */
|
|
|
|
|
+ function viewBindEvents() {
|
|
|
|
|
+ var events = this.props.events;
|
|
|
|
|
+ for(var descriptor in events) {
|
|
|
|
|
+ var handler = events[descriptor];
|
|
|
|
|
+ var bits = descriptor.split(' ');
|
|
|
|
|
+ var evtName = bits.shift();
|
|
|
|
|
+ var selector = bits.join(' ');
|
|
|
|
|
+ console.log('#### bind', descriptor, 'e:' + evtName, 's:' + selector);
|
|
|
|
|
+ this.$elem.find(selector).on(evtName, handler);
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Bind events: nop
|
|
|
|
|
+ */
|
|
|
|
|
+ function viewBindEventsNop() {
|
|
|
|
|
+ console.log(this.partName, 'bindEvents:nop');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Show view element
|
|
|
|
|
+ */
|
|
|
|
|
+ function viewElemShow() {
|
|
|
|
|
+ this.$elem.show();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
- * Render an UI part
|
|
|
|
|
|
|
+ * Hide view element
|
|
|
*/
|
|
*/
|
|
|
- function renderPart(partName, data) {
|
|
|
|
|
- var part = _ws.ui[partName];
|
|
|
|
|
- part.$elem.html( Mustache.render( part.tmpl, data ) );
|
|
|
|
|
|
|
+ function hideElemShow() {
|
|
|
|
|
+ this.$elem.hide();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Build a view
|
|
|
|
|
+ */
|
|
|
_ws.makeView = function(elemId, props) {
|
|
_ws.makeView = function(elemId, props) {
|
|
|
|
|
+ console.log('** makeView', elemId);
|
|
|
var v = {};
|
|
var v = {};
|
|
|
v.props = props || {};
|
|
v.props = props || {};
|
|
|
|
|
|
|
|
v.$elem = $('#' + elemId);
|
|
v.$elem = $('#' + elemId);
|
|
|
v.partName = _.camelCase(elemId);
|
|
v.partName = _.camelCase(elemId);
|
|
|
|
|
+ console.log('adding', elemId, v.partName);
|
|
|
_ws.ui[v.partName] = v;
|
|
_ws.ui[v.partName] = v;
|
|
|
|
|
|
|
|
- // Assign a default render function if none given
|
|
|
|
|
- if(! v.props.render) {
|
|
|
|
|
- var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
|
|
|
|
|
- v.tmpl = $tmplEl.html();
|
|
|
|
|
- v.render = (function(data) {
|
|
|
|
|
- if(! data) {
|
|
|
|
|
- console.log('WARNING! You should provide data for #' + elemId + "'s render()");
|
|
|
|
|
- }
|
|
|
|
|
- // var eventBinder = eventBinders[v.partName];
|
|
|
|
|
- this.$elem.html( Mustache.render( this.tmpl, data ) );
|
|
|
|
|
- // if(eventBinder) {
|
|
|
|
|
- // eventBinder = eventBinder.bind(this);
|
|
|
|
|
- // console.log('bind events for', v.partName);
|
|
|
|
|
- // eventBinder();
|
|
|
|
|
- // }
|
|
|
|
|
- console.log('rebind events after render', this);
|
|
|
|
|
- this.bindEvents();
|
|
|
|
|
- }).bind(v);
|
|
|
|
|
|
|
+ // Bind the provided render function
|
|
|
|
|
+ if(v.props.render) {
|
|
|
|
|
+ v._render = props.render.bind(v);
|
|
|
|
|
+ v.render = viewRenderWrapper.bind(v);
|
|
|
}
|
|
}
|
|
|
- // Otherwise bind the provided one
|
|
|
|
|
|
|
+ // Otherwise assign the default render function
|
|
|
else {
|
|
else {
|
|
|
- v.render = props.render.bind(v);
|
|
|
|
|
|
|
+ var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
|
|
|
|
|
+ v.tmpl = $tmplEl.html();
|
|
|
|
|
+ v.render = viewDefaultRender.bind(v);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Set event handlers
|
|
// Set event handlers
|
|
|
if(v.props.events) {
|
|
if(v.props.events) {
|
|
|
- v.bindEvents = (function() {
|
|
|
|
|
- var events = this.props.events;
|
|
|
|
|
- for(var descriptor in events) {
|
|
|
|
|
- var handler = events[descriptor];
|
|
|
|
|
- var bits = descriptor.split(' ');
|
|
|
|
|
- var evtName = bits.shift();
|
|
|
|
|
- var selector = bits.join(' ');
|
|
|
|
|
- console.log('#### bind', descriptor, 'e:' + evtName, 's:' + selector, handler.toString())
|
|
|
|
|
- v.$elem.find(selector).on(evtName, handler);
|
|
|
|
|
- }
|
|
|
|
|
- }).bind(v);
|
|
|
|
|
|
|
+ v.bindEvents = viewBindEvents.bind(v);
|
|
|
v.bindEvents();
|
|
v.bindEvents();
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- v.bindEvents = function() {};
|
|
|
|
|
|
|
+ v.bindEvents = viewBindEventsNop.bind(v);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * Initialize an empty object to be populated as follows:
|
|
|
|
|
- * - key is an UI element's id
|
|
|
|
|
- * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
|
|
|
|
|
- */
|
|
|
|
|
- _ws.ui = {};
|
|
|
|
|
-
|
|
|
|
|
- // Iterate over the template script elements
|
|
|
|
|
- var $templateElems = $('script[data-tmpl-for]');
|
|
|
|
|
- $templateElems.each(function(idx, el) {
|
|
|
|
|
- return;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- // Get the script element content and target element id
|
|
|
|
|
- var $script = $(el);
|
|
|
|
|
- var tmpl = $script.html();
|
|
|
|
|
- var elemId = $script.data('tmpl-for');
|
|
|
|
|
- var $elem = $('#' + elemId);
|
|
|
|
|
- var partName = _.camelCase(elemId);
|
|
|
|
|
-
|
|
|
|
|
- // Populate the uiParts object
|
|
|
|
|
- _ws.ui[partName] = {
|
|
|
|
|
- tmpl: tmpl,
|
|
|
|
|
- $elem: $elem,
|
|
|
|
|
- render: (function(_name) {
|
|
|
|
|
- return function(data) {
|
|
|
|
|
- var eventBinder = eventBinders[_name];
|
|
|
|
|
- renderPart(_name, data);
|
|
|
|
|
- if(eventBinder) {
|
|
|
|
|
- eventBinder = eventBinder.bind(this);
|
|
|
|
|
- console.log('bind events for', _name);
|
|
|
|
|
- eventBinder();
|
|
|
|
|
- }
|
|
|
|
|
- };
|
|
|
|
|
- })(partName)
|
|
|
|
|
- };
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- // console.log(_.map(_ws.uiParts, p => (p.render.toString())));
|
|
|
|
|
|
|
|
|
|
|
|
+ v.show = viewElemShow.bind(v);
|
|
|
|
|
+ v.hide = hideElemShow.bind(v);
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
});
|