UNPKG

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