ws-ui-parts.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. "use strict";
  2. (function($) {
  3. $(document).ready(function() {
  4. console.log('ws: init UI parts');
  5. /**
  6. * Initialize an empty object to be populated as follows:
  7. * - key is an UI element's id
  8. * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
  9. */
  10. _ws.ui = {};
  11. /**
  12. * Generic template-based rendering function
  13. */
  14. function viewDefaultRender(data) {
  15. if(! data) {
  16. console.log('WARNING! You should provide data for #' + elemId + "'s render()");
  17. }
  18. this.$elem.html( Mustache.render( this.tmpl, data ) );
  19. this.$elem.show();
  20. this.bindEvents();
  21. }
  22. /**
  23. * Wrapper around provided render function (show elem after render)
  24. */
  25. function viewRenderWrapper(data) {
  26. this._render(data);
  27. this.$elem.show();
  28. }
  29. /**
  30. * Bind events
  31. */
  32. function viewBindEvents() {
  33. var events = this.props.events;
  34. for(var descriptor in events) {
  35. var handler = events[descriptor];
  36. var bits = descriptor.split(' ');
  37. var evtName = bits.shift();
  38. var selector = bits.join(' ');
  39. console.log('#### bind', descriptor, 'e:' + evtName, 's:' + selector);
  40. this.$elem.find(selector).on(evtName, handler);
  41. }
  42. }
  43. /**
  44. * Bind events: nop
  45. */
  46. function viewBindEventsNop() {
  47. console.log(this.partName, 'bindEvents:nop');
  48. }
  49. /**
  50. * Show view element
  51. */
  52. function viewElemShow() {
  53. this.$elem.show();
  54. }
  55. /**
  56. * Hide view element
  57. */
  58. function hideElemShow() {
  59. this.$elem.hide();
  60. }
  61. /**
  62. * Build a view
  63. */
  64. _ws.makeView = function(elemId, props) {
  65. console.log('** makeView', elemId);
  66. var v = {};
  67. v.props = props || {};
  68. v.$elem = $('#' + elemId);
  69. v.partName = _.camelCase(elemId);
  70. console.log('adding', elemId, v.partName);
  71. _ws.ui[v.partName] = v;
  72. // Bind the provided render function
  73. if(v.props.render) {
  74. v._render = props.render.bind(v);
  75. v.render = viewRenderWrapper.bind(v);
  76. }
  77. // Otherwise assign the default render function
  78. else {
  79. var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
  80. v.tmpl = $tmplEl.html();
  81. v.render = viewDefaultRender.bind(v);
  82. }
  83. // Set event handlers
  84. if(v.props.events) {
  85. v.bindEvents = viewBindEvents.bind(v);
  86. v.bindEvents();
  87. }
  88. else {
  89. v.bindEvents = viewBindEventsNop.bind(v);
  90. }
  91. v.show = viewElemShow.bind(v);
  92. v.hide = hideElemShow.bind(v);
  93. };
  94. });
  95. })(jQuery);