Grid.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. let defaultName = '_def_';
  2. export default class Grid {
  3. constructor(Dcat) {
  4. Dcat.grid = this;
  5. this.selectors = {};
  6. }
  7. // 添加行选择器对象
  8. addSelector(selector, name) {
  9. this.selectors[name || defaultName] = selector
  10. }
  11. // 获取行选择器选中的ID字符串
  12. selected(name) {
  13. return this.selectors[name || defaultName].getSelectedKeys()
  14. }
  15. // 获取行选择器选中的行
  16. selectedRows(name) {
  17. return this.selectors[name || defaultName].getSelectedRows()
  18. }
  19. async(options) {
  20. return new AsyncGrid(options);
  21. }
  22. }
  23. class AsyncGrid {
  24. constructor(options) {
  25. let nullFun = function () {};
  26. options = $.extend({
  27. selector: null,
  28. bodySelector: '.async-body',
  29. tableSelector: '.async-table',
  30. queryName: null,
  31. url: null,
  32. loadingStyle: 'height:240px;',
  33. before: nullFun,
  34. after: nullFun,
  35. }, options);
  36. var self = this,
  37. $box = $(options.selector),
  38. $body = $box.find(options.bodySelector);
  39. self.options = options;
  40. self.$box = $box;
  41. self.$body = $body;
  42. self.loading = false;
  43. }
  44. render(url, callback) {
  45. let self = this, options = self.options;
  46. url = url || options.url;
  47. if (self.loading || url.indexOf('javascript:') !== -1) {
  48. return;
  49. }
  50. self.loading = true;
  51. let $box = self.$box,
  52. $body = self.$body,
  53. reqName = options.queryName,
  54. tableSelector = options.tableSelector,
  55. $table = $body.find(tableSelector),
  56. events = {0: 'grid:rendering', 1: 'grid:render', 2: 'grid:rendered'},
  57. before = options.before,
  58. after = options.after;
  59. // 开始渲染前事件
  60. before($box, url);
  61. $box.trigger(events[0], [url]);
  62. $body.trigger(events[0], [url]);
  63. // loading效果
  64. let loadingOptions = {background: 'transparent'}
  65. if ($body.find(`${tableSelector} tbody tr`).length <= 2) {
  66. loadingOptions['style'] = options.loadingStyle;
  67. }
  68. $table.loading(loadingOptions);
  69. Dcat.NP.start();
  70. if (url.indexOf('?') === -1) {
  71. url += '?';
  72. }
  73. if (url.indexOf(reqName) === -1) {
  74. url += '&'+reqName+'=1';
  75. }
  76. history.pushState({}, '', url.replace(reqName+'=1', ''));
  77. $box.data('current', url);
  78. Dcat.helpers.asyncRender(url, function (html) {
  79. self.loading = false;
  80. Dcat.NP.done();
  81. $body.html(html);
  82. let refresh = function () {
  83. self.render($box.data('current'));
  84. };
  85. // 表格渲染事件
  86. $box.off(events[1]).on(events[1], refresh);
  87. $body.off(events[1]).on(events[1], refresh);
  88. $table.on(events[1], refresh);
  89. // 刷新按钮
  90. $box.find('.grid-refresh').off('click').on('click', function () {
  91. refresh();
  92. return false;
  93. });
  94. // 分页
  95. $box.find('.pagination .page-link').on('click', loadLink);
  96. // 页选择器
  97. $box.find('.per-pages-selector .dropdown-item a').on('click', loadLink);
  98. // 表头url
  99. $box.find('.grid-column-header a').on('click', loadLink);
  100. // 快捷搜索、表头搜索以及过滤器筛选
  101. $box.find('form').off('submit').on('submit', function () {
  102. var action = $(this).attr('action');
  103. if ($(this).attr('method') === 'post') {
  104. return;
  105. }
  106. if (action.indexOf('?') === -1) {
  107. action += '?';
  108. }
  109. self.render(action+'&'+$(this).serialize());
  110. return false;
  111. });
  112. $box.find('.filter-box .reset').on('click', loadLink);
  113. // 规格选择器
  114. $box.find('.grid-selector a').on('click', loadLink);
  115. // 渲染完成后事件
  116. $box.trigger(events[2], [url, html]);
  117. $body.trigger(events[2], [url, html]);
  118. $table.trigger(events[2], [url, html]);
  119. after($box, url, html);
  120. callback && callback($box, url, html);
  121. });
  122. function loadLink() {
  123. self.render($(this).attr('href'));
  124. return false;
  125. }
  126. }
  127. }