You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

slick.rowselectionmodel.js 4.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. (function ($) {
  2. // register namespace
  3. $.extend(true, window, {
  4. "Slick": {
  5. "RowSelectionModel": RowSelectionModel
  6. }
  7. });
  8. function RowSelectionModel(options) {
  9. var _grid;
  10. var _ranges = [];
  11. var _self = this;
  12. var _handler = new Slick.EventHandler();
  13. var _inHandler;
  14. var _options;
  15. var _defaults = {
  16. selectActiveRow: true
  17. };
  18. function init(grid) {
  19. _options = $.extend(true, {}, _defaults, options);
  20. _grid = grid;
  21. _handler.subscribe(_grid.onActiveCellChanged,
  22. wrapHandler(handleActiveCellChange));
  23. _handler.subscribe(_grid.onKeyDown,
  24. wrapHandler(handleKeyDown));
  25. _handler.subscribe(_grid.onClick,
  26. wrapHandler(handleClick));
  27. }
  28. function destroy() {
  29. _handler.unsubscribeAll();
  30. }
  31. function wrapHandler(handler) {
  32. return function () {
  33. if (!_inHandler) {
  34. _inHandler = true;
  35. handler.apply(this, arguments);
  36. _inHandler = false;
  37. }
  38. };
  39. }
  40. function rangesToRows(ranges) {
  41. var rows = [];
  42. for (var i = 0; i < ranges.length; i++) {
  43. for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
  44. rows.push(j);
  45. }
  46. }
  47. return rows;
  48. }
  49. function rowsToRanges(rows) {
  50. var ranges = [];
  51. var lastCell = _grid.getColumns().length - 1;
  52. for (var i = 0; i < rows.length; i++) {
  53. ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
  54. }
  55. return ranges;
  56. }
  57. function getRowsRange(from, to) {
  58. var i, rows = [];
  59. for (i = from; i <= to; i++) {
  60. rows.push(i);
  61. }
  62. for (i = to; i < from; i++) {
  63. rows.push(i);
  64. }
  65. return rows;
  66. }
  67. function getSelectedRows() {
  68. return rangesToRows(_ranges);
  69. }
  70. function setSelectedRows(rows) {
  71. setSelectedRanges(rowsToRanges(rows));
  72. }
  73. function setSelectedRanges(ranges) {
  74. _ranges = ranges;
  75. _self.onSelectedRangesChanged.notify(_ranges);
  76. }
  77. function getSelectedRanges() {
  78. return _ranges;
  79. }
  80. function handleActiveCellChange(e, data) {
  81. if (_options.selectActiveRow && data.row != null) {
  82. setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
  83. }
  84. }
  85. function handleKeyDown(e) {
  86. var activeRow = _grid.getActiveCell();
  87. if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
  88. var selectedRows = getSelectedRows();
  89. selectedRows.sort(function (x, y) {
  90. return x - y
  91. });
  92. if (!selectedRows.length) {
  93. selectedRows = [activeRow.row];
  94. }
  95. var top = selectedRows[0];
  96. var bottom = selectedRows[selectedRows.length - 1];
  97. var active;
  98. if (e.which == 40) {
  99. active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
  100. } else {
  101. active = activeRow.row < bottom ? --bottom : --top;
  102. }
  103. if (active >= 0 && active < _grid.getDataLength()) {
  104. _grid.scrollRowIntoView(active);
  105. _ranges = rowsToRanges(getRowsRange(top, bottom));
  106. setSelectedRanges(_ranges);
  107. }
  108. e.preventDefault();
  109. e.stopPropagation();
  110. }
  111. }
  112. function handleClick(e) {
  113. var cell = _grid.getCellFromEvent(e);
  114. if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
  115. return false;
  116. }
  117. var selection = rangesToRows(_ranges);
  118. var idx = $.inArray(cell.row, selection);
  119. if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
  120. return false;
  121. }
  122. else if (_grid.getOptions().multiSelect) {
  123. if (idx === -1 && (e.ctrlKey || e.metaKey)) {
  124. selection.push(cell.row);
  125. _grid.setActiveCell(cell.row, cell.cell);
  126. } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
  127. selection = $.grep(selection, function (o, i) {
  128. return (o !== cell.row);
  129. });
  130. _grid.setActiveCell(cell.row, cell.cell);
  131. } else if (selection.length && e.shiftKey) {
  132. var last = selection.pop();
  133. var from = Math.min(cell.row, last);
  134. var to = Math.max(cell.row, last);
  135. selection = [];
  136. for (var i = from; i <= to; i++) {
  137. if (i !== last) {
  138. selection.push(i);
  139. }
  140. }
  141. selection.push(last);
  142. _grid.setActiveCell(cell.row, cell.cell);
  143. }
  144. }
  145. _ranges = rowsToRanges(selection);
  146. setSelectedRanges(_ranges);
  147. e.stopImmediatePropagation();
  148. return true;
  149. }
  150. $.extend(this, {
  151. "getSelectedRows": getSelectedRows,
  152. "setSelectedRows": setSelectedRows,
  153. "getSelectedRanges": getSelectedRanges,
  154. "setSelectedRanges": setSelectedRanges,
  155. "init": init,
  156. "destroy": destroy,
  157. "onSelectedRangesChanged": new Slick.Event()
  158. });
  159. }
  160. })(jQuery);