HeaderFilter.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. var HeaderFilter = function (grid, options) {
  2. var me = this;
  3. me.grid = grid;
  4. me.options = options || {};
  5. me.init();
  6. }
  7. HeaderFilter.prototype = {
  8. init: function () {
  9. var me = this,
  10. grid = me.grid,
  11. columns = me.options.columns;
  12. me.filterColumns = [];
  13. for (var i = 0, l = columns.length; i < l; i++) {
  14. var o = columns[i];
  15. var column = grid.getColumn(o.name);
  16. if (!column) throw new Error('undefined column ' + o.name);
  17. o.column = column;
  18. column.header = column.header + '<div class="icon-filter headerfilter-trigger"></div>';
  19. me.filterColumns.push(column);
  20. }
  21. $(grid.el).on("click", ".headerfilter-trigger", function (e) {
  22. e.stopPropagation();
  23. var column = grid.getColumnByEvent(e);
  24. me.showFilterWindow(column);
  25. });
  26. grid.on("load", function (e) {
  27. //me.clearFilterAll();
  28. })
  29. grid.on("resize", function (e) {
  30. });
  31. grid.on("update", function (e) {
  32. me._updateFilterStatus();
  33. });
  34. $(document).on("mousedown", function (event) {
  35. if (!$(event.target).closest(".filterwindow")[0]) {
  36. $(".filterwindow").hide();
  37. }
  38. });
  39. ///////////////////////////////////////////////////////////////
  40. var within = grid.within;
  41. grid.within = function (e) {
  42. var result = within.call(this, e);
  43. if (!result && me.filterWindow) {
  44. result = mini.isAncestor(me.filterWindow[0], e.target);
  45. }
  46. return result;
  47. }
  48. },
  49. _createFilterListData: function (column) {
  50. var data = this.grid.getData(), //getDataView
  51. sb = [],
  52. map = {},
  53. result = [];
  54. var blank = {};
  55. blank[column.displayField || column.field] = '全部'; //暂不知道具体逻辑
  56. result.push(blank);
  57. for (var i = 0, l = data.length; i < l; i++) {
  58. var record = data[i];
  59. var text = record[column.field] || '';
  60. if (column.displayField) {
  61. text = record[column.displayField] || '';
  62. } else {
  63. }
  64. if (text.indexOf("合计") != -1 || text.indexOf("累计") != -1 || text.indexOf("汇总") != -1 || text == "说明" || text == "备注" || text == "") continue;
  65. if (!map[text]) {
  66. map[text] = text;
  67. result.push(record);
  68. }
  69. }
  70. return result;
  71. },
  72. _getFilterValues: function (column) {
  73. var win = this.filterWindow;
  74. var values = [];
  75. win.find("input:checked").not(".checkall").each(function () {
  76. values.push(this.value);
  77. });
  78. return values;
  79. },
  80. doFilter: function () {
  81. var me = this,
  82. grid = me.grid,
  83. columns = me.filterColumns;
  84. if (me.hasFiltered()) {
  85. grid.filter(function (record) {
  86. var pass = true;
  87. for (var i = 0, l = columns.length; i < l; i++) {
  88. var column = columns[i];
  89. if (column.filterData) {
  90. var text = column.displayField ? record[column.displayField] : record[column.field];
  91. if (text == null) text = "";
  92. text = String(text);
  93. if (!column._filterMap[text]) {
  94. pass = false;
  95. break;
  96. }
  97. }
  98. }
  99. return pass;
  100. });
  101. } else {
  102. grid.clearFilter();
  103. }
  104. me._updateFilterStatus();
  105. //alert("doFilter");
  106. },
  107. _createFilterWindow: function (column) {
  108. var me = this;
  109. var el = $('<div class="filterwindow mini-popup"><div class="filterwindow-content"></div><div class="filterwindow-footer"><button class="filterwindow-button filter mini-button" noparser>筛选</button><button class="filterwindow-button clearfilter mini-button" noparser>清除筛选</button></div></div>').appendTo('body');
  110. var data = this._createFilterListData(column),
  111. sb = [];
  112. for (var i = 0, l = data.length; i < l; i++) {
  113. var record = data[i];
  114. var text = record[column.field];
  115. if (column.displayField) text = record[column.displayField];
  116. if (text == null) text = '';
  117. var checked = false;
  118. if (column._filterMap) checked = !!column._filterMap[text];
  119. sb[sb.length] = '<div class="filterwindow-item"><label><input class="filterwindow-item-checkbox ' + (i == 0 ? "checkall" : "") + '" type="checkbox" ' + (checked ? 'checked' : '') + ' value="' + text + '"/>' + text + '</label></div>';
  120. }
  121. el.find('.filterwindow-content').html(sb.join(''));
  122. el.find(".filter").on("click", function () {
  123. var values = me._getFilterValues(column);
  124. if (values.length) {
  125. me.filter(column, values);
  126. } else {
  127. me.clearFilter(column);
  128. }
  129. });
  130. el.find(".clearfilter").on("click", function () {
  131. me.clearFilter(column);
  132. });
  133. el.find("input[type=checkbox]").on("click", function () {
  134. //me.clearFilter(column);
  135. var jq = $(this);
  136. var checked = jq.is(":checked");
  137. if (jq.hasClass("checkall")) {
  138. el.find("input[type=checkbox]").prop("checked", checked);
  139. } else {
  140. updateCheckAll();
  141. }
  142. });
  143. function updateCheckAll() {
  144. var len1 = el.find("input[type=checkbox]").not(".checkall").length
  145. var len2 = el.find("input[type=checkbox]:checked").not(".checkall").length
  146. //alert(len1 + ":" + len2);
  147. el.find(".checkall").prop("checked", len1 == len2);
  148. }
  149. updateCheckAll();
  150. return el;
  151. },
  152. _updateFilterStatus: function () {
  153. var me = this,
  154. grid = me.grid,
  155. columns = me.filterColumns;
  156. for (var i = 0, l = columns.length; i < l; i++) {
  157. var column = columns[i];
  158. var headerCellEl = $(me._getHeaderCellEl(column));
  159. if (me.isFiltered(column)) headerCellEl.addClass("headerfilter-filtered");
  160. else headerCellEl.removeClass("headerfilter-filtered");
  161. }
  162. },
  163. _getHeaderCellEl: function (column) {
  164. var me = this,
  165. grid = me.grid;
  166. var columns = grid.getBottomColumns();
  167. var end = grid.getFrozenEndColumn();
  168. var columnIndex = columns.indexOf(column);
  169. var index = 1;
  170. if (columnIndex > end) {
  171. index = 2;
  172. }
  173. return grid.getHeaderCellEl(column, index);
  174. },
  175. showFilterWindow: function (column) {
  176. var me = this,
  177. grid = me.grid;
  178. headerCellEl = this._getHeaderCellEl(column)
  179. me.hideFilterWindow();
  180. me.filterColumn = column;
  181. me.filterWindow = me._createFilterWindow(column);
  182. var box = mini.getBox(headerCellEl),
  183. triggerEl = $(headerCellEl).find(".headerfilter-trigger")[0],
  184. triggerBox = mini.getBox(triggerEl);
  185. me.filterWindow.show();
  186. mini.setXY(me.filterWindow, triggerBox.left, box.bottom);
  187. },
  188. hideFilterWindow: function () {
  189. this.filterColumn = null;
  190. if (this.filterWindow) {
  191. this.filterWindow.remove();
  192. this.filterWindow = null;
  193. }
  194. },
  195. isFiltered: function (name) {
  196. var column = this.grid.getColumn(name);
  197. if (column) return !!column.filterData;
  198. return false;
  199. },
  200. hasFiltered: function () {
  201. var me = this,
  202. columns = me.filterColumns;
  203. for (var i = 0, l = columns.length; i < l; i++) {
  204. var column = columns[i];
  205. if (me.isFiltered(column)) return true;
  206. }
  207. return false;
  208. },
  209. filter: function (column, values) {
  210. var me = this;
  211. column.filterData = values;
  212. column._filterMap = {};
  213. for (var i = 0, l = values.length; i < l; i++) {
  214. var value = values[i];
  215. column._filterMap[value] = true;
  216. }
  217. me.doFilter();
  218. me.hideFilterWindow();
  219. if (me.options.callback) me.options.callback(column, true);
  220. },
  221. clearFilter: function (column) {
  222. var me = this;
  223. column.filterData = null;
  224. column._filterMap = null;
  225. me.doFilter();
  226. me.hideFilterWindow();
  227. if (me.options.callback) me.options.callback(column, false);
  228. },
  229. clearAllFilterData: function () {
  230. var me = this;
  231. var columns = me.filterColumns;
  232. for (var i = 0, l = columns.length; i < l; i++) {
  233. var column = columns[i];
  234. column.filterData = null;
  235. column._filterMap = null;
  236. }
  237. },
  238. clearAllFilter: function () {
  239. var me = this;
  240. me._updateFilterStatus();
  241. me.clearAllFilterData();
  242. me.grid.clearFilter();
  243. me.hideFilterWindow();
  244. }
  245. };