Show:
  1. /**
  2. * The TreeViewPaginator Utility
  3. *
  4. * @module aui-tree
  5. * @submodule aui-tree-paginator
  6. */
  7. var Lang = A.Lang,
  8. isObject = Lang.isObject,
  9. isValue = Lang.isValue,
  10. getCN = A.getClassName,
  11. CSS_TREE_NODE_PAGINATOR = getCN('tree', 'node', 'paginator'),
  12. TPL_PAGINATOR = '<a class="' + CSS_TREE_NODE_PAGINATOR + '" hrsef="javascript:void(0);">{moreResultsLabel}</a>';
  13. /**
  14. * A base class for TreeViewPaginator.
  15. *
  16. * @class A.TreeViewPaginator
  17. * @param {Object} config Object literal specifying widget configuration
  18. * properties.
  19. * @constructor
  20. */
  21. function TreeViewPaginator() {
  22. var instance = this;
  23. A.after(instance._bindPaginatorUI, this, 'bindUI');
  24. A.after(instance._syncPaginatorUI, this, 'syncUI');
  25. }
  26. /**
  27. * Static property used to define the default attribute
  28. * configuration for the TreeView.
  29. *
  30. * @property ATTRS
  31. * @type Object
  32. * @static
  33. */
  34. TreeViewPaginator.ATTRS = {
  35. /**
  36. * Paginator.
  37. *
  38. * @attribute paginator
  39. * @type Object
  40. */
  41. paginator: {
  42. setter: function(value) {
  43. var paginatorNode = A.Node.create(
  44. Lang.sub(
  45. TPL_PAGINATOR, {
  46. moreResultsLabel: value.moreResultsLabel || 'Load more results'
  47. }
  48. )
  49. );
  50. return A.merge({
  51. alwaysVisible: false,
  52. autoFocus: true,
  53. element: paginatorNode,
  54. endParam: 'end',
  55. limitParam: 'limit',
  56. start: 0,
  57. startParam: 'start'
  58. },
  59. value
  60. );
  61. },
  62. validator: isObject
  63. }
  64. };
  65. TreeViewPaginator.prototype = {
  66. /**
  67. * Bind events to the paginator "show more" link.
  68. *
  69. * @method _bindPaginatorUI
  70. * @protected
  71. */
  72. _bindPaginatorUI: function() {
  73. var instance = this;
  74. var paginator = instance.get('paginator');
  75. if (paginator) {
  76. paginator.element.on('click', A.bind(instance._handlePaginatorClickEvent, instance));
  77. }
  78. instance._createEvents();
  79. },
  80. /**
  81. * Create custom events.
  82. *
  83. * @method _createEvents
  84. * @private
  85. */
  86. _createEvents: function() {
  87. var instance = this;
  88. instance.publish(
  89. 'paginatorClick', {
  90. defaultFn: instance._defPaginatorClickFn,
  91. prefix: 'tree-node-io'
  92. }
  93. );
  94. },
  95. /**
  96. * Default paginatorClick event handler. Increment the
  97. * `paginator.start` to the next `paginator.limit`.
  98. *
  99. * @method _defPaginatorClickFn
  100. * @param {EventFacade} event The Event object
  101. * @protected
  102. */
  103. _defPaginatorClickFn: function() {
  104. var instance = this;
  105. var paginator = instance.get('paginator');
  106. if (isValue(paginator.limit)) {
  107. paginator.start = instance.getChildrenLength();
  108. }
  109. if (instance.get('io')) {
  110. instance.initIO();
  111. }
  112. },
  113. /**
  114. * Fires the paginatorClick event.
  115. *
  116. * @method _handlePaginatorClickEvent
  117. * @param {EventFacade} event paginatorClick event facade
  118. * @protected
  119. */
  120. _handlePaginatorClickEvent: function(event) {
  121. var instance = this;
  122. var output = instance.getEventOutputMap(instance);
  123. instance.fire('paginatorClick', output);
  124. event.halt();
  125. },
  126. /**
  127. * Adds two extra IO data parameter to the request to handle the
  128. * paginator. By default these parameters are `limit` and `start`.
  129. *
  130. * @method _syncPaginatorIOData
  131. * @protected
  132. */
  133. _syncPaginatorIOData: function(io) {
  134. var instance = this;
  135. var paginator = instance.get('paginator');
  136. if (paginator && isValue(paginator.limit)) {
  137. var data = io.cfg.data || {};
  138. data[paginator.limitParam] = paginator.limit;
  139. data[paginator.startParam] = paginator.start;
  140. data[paginator.endParam] = (paginator.start + paginator.limit);
  141. io.cfg.data = data;
  142. }
  143. },
  144. /**
  145. * Sync the paginator link UI.
  146. *
  147. * @method _syncPaginatorUI
  148. * @protected
  149. */
  150. _syncPaginatorUI: function(newNodes) {
  151. var instance = this;
  152. var paginator = instance.get('paginator');
  153. if (paginator) {
  154. var hasMoreData = true;
  155. if (newNodes) {
  156. hasMoreData = (newNodes.length > 0);
  157. }
  158. var childrenLength = instance.getChildrenLength();
  159. var total = paginator.total || childrenLength;
  160. var showPaginator = childrenLength && hasMoreData && (total > childrenLength);
  161. if (paginator.alwaysVisible || showPaginator) {
  162. instance.get('container').append(
  163. paginator.element.show()
  164. );
  165. if (paginator.autoFocus) {
  166. try {
  167. paginator.element.focus();
  168. }
  169. catch (e) {}
  170. }
  171. }
  172. else {
  173. paginator.element.hide();
  174. }
  175. }
  176. }
  177. };
  178. A.TreeViewPaginator = TreeViewPaginator;