slickgrid-bootstrap-rails 0.0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +34 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +158 -0
- data/Rakefile +1 -0
- data/lib/slickgrid-bootstrap-rails/version.rb +7 -0
- data/lib/slickgrid-bootstrap-rails.rb +11 -0
- data/slickgrid-bootstrap-rails.gemspec +21 -0
- data/vendor/assets/images/actions.gif +0 -0
- data/vendor/assets/images/ajax-loader-small.gif +0 -0
- data/vendor/assets/images/arrow_redo.png +0 -0
- data/vendor/assets/images/arrow_right_peppermint.png +0 -0
- data/vendor/assets/images/arrow_right_spearmint.png +0 -0
- data/vendor/assets/images/arrow_undo.png +0 -0
- data/vendor/assets/images/bullet_blue.png +0 -0
- data/vendor/assets/images/bullet_star.png +0 -0
- data/vendor/assets/images/bullet_toggle_minus.png +0 -0
- data/vendor/assets/images/bullet_toggle_plus.png +0 -0
- data/vendor/assets/images/calendar.gif +0 -0
- data/vendor/assets/images/collapse.gif +0 -0
- data/vendor/assets/images/comment_yellow.gif +0 -0
- data/vendor/assets/images/down.gif +0 -0
- data/vendor/assets/images/drag-handle.png +0 -0
- data/vendor/assets/images/editor-helper-bg.gif +0 -0
- data/vendor/assets/images/expand.gif +0 -0
- data/vendor/assets/images/header-bg.gif +0 -0
- data/vendor/assets/images/header-columns-bg.gif +0 -0
- data/vendor/assets/images/header-columns-over-bg.gif +0 -0
- data/vendor/assets/images/help.png +0 -0
- data/vendor/assets/images/info.gif +0 -0
- data/vendor/assets/images/listview.gif +0 -0
- data/vendor/assets/images/pencil.gif +0 -0
- data/vendor/assets/images/row-over-bg.gif +0 -0
- data/vendor/assets/images/sort-asc.gif +0 -0
- data/vendor/assets/images/sort-asc.png +0 -0
- data/vendor/assets/images/sort-desc.gif +0 -0
- data/vendor/assets/images/sort-desc.png +0 -0
- data/vendor/assets/images/stripes.png +0 -0
- data/vendor/assets/images/tag_red.png +0 -0
- data/vendor/assets/images/tick.png +0 -0
- data/vendor/assets/images/user_identity.gif +0 -0
- data/vendor/assets/images/user_identity_plus.gif +0 -0
- data/vendor/assets/javascripts/bootstrap/slick.bootstrap.js +86 -0
- data/vendor/assets/javascripts/plugins/slick.autotooltips.js +48 -0
- data/vendor/assets/javascripts/plugins/slick.cellcopymanager.js +86 -0
- data/vendor/assets/javascripts/plugins/slick.cellrangedecorator.js +64 -0
- data/vendor/assets/javascripts/plugins/slick.cellrangeselector.js +111 -0
- data/vendor/assets/javascripts/plugins/slick.cellselectionmodel.js +92 -0
- data/vendor/assets/javascripts/plugins/slick.checkboxselectcolumn.js +153 -0
- data/vendor/assets/javascripts/plugins/slick.headerbuttons.js +177 -0
- data/vendor/assets/javascripts/plugins/slick.headermenu.js +272 -0
- data/vendor/assets/javascripts/plugins/slick.rowmovemanager.js +138 -0
- data/vendor/assets/javascripts/plugins/slick.rowselectionmodel.js +187 -0
- data/vendor/assets/javascripts/slick.core.js +430 -0
- data/vendor/assets/javascripts/slick.dataview.js +917 -0
- data/vendor/assets/javascripts/slick.editors.js.erb +512 -0
- data/vendor/assets/javascripts/slick.formatters.js.erb +55 -0
- data/vendor/assets/javascripts/slick.grid.js +3294 -0
- data/vendor/assets/javascripts/slick.groupitemmetadataprovider.js +139 -0
- data/vendor/assets/javascripts/slick.remotemodel.js +164 -0
- data/vendor/assets/javascripts/slickgrid-bootstrap-rails.js +13 -0
- data/vendor/assets/stylesheets/plugins/slick.headerbuttons.css +38 -0
- data/vendor/assets/stylesheets/plugins/slick.headermenu.css +58 -0
- data/vendor/assets/stylesheets/slick.grid.css.erb +157 -0
- data/vendor/assets/stylesheets/slickgrid-bootstrap-rails.css +4 -0
- data/vendor/assets/stylesheets/slickgrid-bootstrap.less +159 -0
- metadata +143 -0
@@ -0,0 +1,272 @@
|
|
1
|
+
(function ($) {
|
2
|
+
// register namespace
|
3
|
+
$.extend(true, window, {
|
4
|
+
"Slick": {
|
5
|
+
"Plugins": {
|
6
|
+
"HeaderMenu": HeaderMenu
|
7
|
+
}
|
8
|
+
}
|
9
|
+
});
|
10
|
+
|
11
|
+
|
12
|
+
/***
|
13
|
+
* A plugin to add drop-down menus to column headers.
|
14
|
+
*
|
15
|
+
* USAGE:
|
16
|
+
*
|
17
|
+
* Add the plugin .js & .css files and register it with the grid.
|
18
|
+
*
|
19
|
+
* To specify a menu in a column header, extend the column definition like so:
|
20
|
+
*
|
21
|
+
* var columns = [
|
22
|
+
* {
|
23
|
+
* id: 'myColumn',
|
24
|
+
* name: 'My column',
|
25
|
+
*
|
26
|
+
* // This is the relevant part
|
27
|
+
* header: {
|
28
|
+
* menu: {
|
29
|
+
* items: [
|
30
|
+
* {
|
31
|
+
* // menu item options
|
32
|
+
* },
|
33
|
+
* {
|
34
|
+
* // menu item options
|
35
|
+
* }
|
36
|
+
* ]
|
37
|
+
* }
|
38
|
+
* }
|
39
|
+
* }
|
40
|
+
* ];
|
41
|
+
*
|
42
|
+
*
|
43
|
+
* Available menu options:
|
44
|
+
* tooltip: Menu button tooltip.
|
45
|
+
*
|
46
|
+
*
|
47
|
+
* Available menu item options:
|
48
|
+
* title: Menu item text.
|
49
|
+
* disabled: Whether the item is disabled.
|
50
|
+
* tooltip: Item tooltip.
|
51
|
+
* command: A command identifier to be passed to the onCommand event handlers.
|
52
|
+
* iconCssClass: A CSS class to be added to the menu item icon.
|
53
|
+
* iconImage: A url to the icon image.
|
54
|
+
*
|
55
|
+
*
|
56
|
+
* The plugin exposes the following events:
|
57
|
+
* onBeforeMenuShow: Fired before the menu is shown. You can customize the menu or dismiss it by returning false.
|
58
|
+
* Event args:
|
59
|
+
* grid: Reference to the grid.
|
60
|
+
* column: Column definition.
|
61
|
+
* menu: Menu options. Note that you can change the menu items here.
|
62
|
+
*
|
63
|
+
* onCommand: Fired on menu item click for buttons with 'command' specified.
|
64
|
+
* Event args:
|
65
|
+
* grid: Reference to the grid.
|
66
|
+
* column: Column definition.
|
67
|
+
* command: Button command identified.
|
68
|
+
* button: Button options. Note that you can change the button options in your
|
69
|
+
* event handler, and the column header will be automatically updated to
|
70
|
+
* reflect them. This is useful if you want to implement something like a
|
71
|
+
* toggle button.
|
72
|
+
*
|
73
|
+
*
|
74
|
+
* @param options {Object} Options:
|
75
|
+
* buttonCssClass: an extra CSS class to add to the menu button
|
76
|
+
* buttonImage: a url to the menu button image (default '../images/down.gif')
|
77
|
+
* @class Slick.Plugins.HeaderButtons
|
78
|
+
* @constructor
|
79
|
+
*/
|
80
|
+
function HeaderMenu(options) {
|
81
|
+
var _grid;
|
82
|
+
var _self = this;
|
83
|
+
var _handler = new Slick.EventHandler();
|
84
|
+
var _defaults = {
|
85
|
+
buttonCssClass: null,
|
86
|
+
buttonImage: "../images/down.gif"
|
87
|
+
};
|
88
|
+
var $menu;
|
89
|
+
var $activeHeaderColumn;
|
90
|
+
|
91
|
+
|
92
|
+
function init(grid) {
|
93
|
+
options = $.extend(true, {}, _defaults, options);
|
94
|
+
_grid = grid;
|
95
|
+
_handler
|
96
|
+
.subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
|
97
|
+
.subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
|
98
|
+
|
99
|
+
// Force the grid to re-render the header now that the events are hooked up.
|
100
|
+
_grid.setColumns(_grid.getColumns());
|
101
|
+
|
102
|
+
// Hide the menu on outside click.
|
103
|
+
$(document.body).bind("mousedown", handleBodyMouseDown);
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
function destroy() {
|
108
|
+
_handler.unsubscribeAll();
|
109
|
+
$(document.body).unbind("mousedown", handleBodyMouseDown);
|
110
|
+
}
|
111
|
+
|
112
|
+
|
113
|
+
function handleBodyMouseDown(e) {
|
114
|
+
if ($menu && $menu[0] != e.target && !$.contains($menu[0], e.target)) {
|
115
|
+
hideMenu();
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
function hideMenu() {
|
121
|
+
if ($menu) {
|
122
|
+
$menu.remove();
|
123
|
+
$menu = null;
|
124
|
+
$activeHeaderColumn
|
125
|
+
.removeClass("slick-header-column-active");
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
function handleHeaderCellRendered(e, args) {
|
130
|
+
var column = args.column;
|
131
|
+
var menu = column.header && column.header.menu;
|
132
|
+
|
133
|
+
if (menu) {
|
134
|
+
var $el = $("<div></div>")
|
135
|
+
.addClass("slick-header-menubutton")
|
136
|
+
.data("column", column)
|
137
|
+
.data("menu", menu);
|
138
|
+
|
139
|
+
if (options.buttonCssClass) {
|
140
|
+
$el.addClass(options.buttonCssClass);
|
141
|
+
}
|
142
|
+
|
143
|
+
if (options.buttonImage) {
|
144
|
+
$el.css("background-image", "url(" + options.buttonImage + ")");
|
145
|
+
}
|
146
|
+
|
147
|
+
if (menu.tooltip) {
|
148
|
+
$el.attr("title", menu.tooltip);
|
149
|
+
}
|
150
|
+
|
151
|
+
$el
|
152
|
+
.bind("click", showMenu)
|
153
|
+
.appendTo(args.node);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
|
157
|
+
|
158
|
+
function handleBeforeHeaderCellDestroy(e, args) {
|
159
|
+
var column = args.column;
|
160
|
+
|
161
|
+
if (column.header && column.header.menu) {
|
162
|
+
$(args.node).find(".slick-header-menubutton").remove();
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
|
167
|
+
function showMenu(e) {
|
168
|
+
var $menuButton = $(this);
|
169
|
+
var menu = $menuButton.data("menu");
|
170
|
+
var columnDef = $menuButton.data("column");
|
171
|
+
|
172
|
+
// Let the user modify the menu or cancel altogether,
|
173
|
+
// or provide alternative menu implementation.
|
174
|
+
if (_self.onBeforeMenuShow.notify({
|
175
|
+
"grid": _grid,
|
176
|
+
"column": columnDef,
|
177
|
+
"menu": menu
|
178
|
+
}, e, _self) == false) {
|
179
|
+
return;
|
180
|
+
}
|
181
|
+
|
182
|
+
|
183
|
+
if (!$menu) {
|
184
|
+
$menu = $("<div class='slick-header-menu'></div>")
|
185
|
+
.appendTo(document.body);
|
186
|
+
}
|
187
|
+
$menu.empty();
|
188
|
+
|
189
|
+
|
190
|
+
// Construct the menu items.
|
191
|
+
for (var i = 0; i < menu.items.length; i++) {
|
192
|
+
var item = menu.items[i];
|
193
|
+
|
194
|
+
var $li = $("<div class='slick-header-menuitem'></div>")
|
195
|
+
.data("command", item.command || '')
|
196
|
+
.data("column", columnDef)
|
197
|
+
.data("item", item)
|
198
|
+
.bind("click", handleMenuItemClick)
|
199
|
+
.appendTo($menu);
|
200
|
+
|
201
|
+
if (item.disabled) {
|
202
|
+
$li.addClass("slick-header-menuitem-disabled");
|
203
|
+
}
|
204
|
+
|
205
|
+
if (item.tooltip) {
|
206
|
+
$li.attr("title", item.tooltip);
|
207
|
+
}
|
208
|
+
|
209
|
+
var $icon = $("<div class='slick-header-menuicon'></div>")
|
210
|
+
.appendTo($li);
|
211
|
+
|
212
|
+
if (item.iconCssClass) {
|
213
|
+
$icon.addClass(item.iconCssClass);
|
214
|
+
}
|
215
|
+
|
216
|
+
if (item.iconImage) {
|
217
|
+
$icon.css("background-image", "url(" + item.iconImage + ")");
|
218
|
+
}
|
219
|
+
|
220
|
+
$("<span class='slick-header-menucontent'></span>")
|
221
|
+
.text(item.title)
|
222
|
+
.appendTo($li);
|
223
|
+
}
|
224
|
+
|
225
|
+
|
226
|
+
// Position the menu.
|
227
|
+
$menu
|
228
|
+
.css("top", $(this).offset().top + $(this).height())
|
229
|
+
.css("left", $(this).offset().left);
|
230
|
+
|
231
|
+
|
232
|
+
// Mark the header as active to keep the highlighting.
|
233
|
+
$activeHeaderColumn = $menuButton.closest(".slick-header-column");
|
234
|
+
$activeHeaderColumn
|
235
|
+
.addClass("slick-header-column-active");
|
236
|
+
}
|
237
|
+
|
238
|
+
|
239
|
+
function handleMenuItemClick(e) {
|
240
|
+
var command = $(this).data("command");
|
241
|
+
var columnDef = $(this).data("column");
|
242
|
+
var item = $(this).data("item");
|
243
|
+
|
244
|
+
if (item.disabled) {
|
245
|
+
return;
|
246
|
+
}
|
247
|
+
|
248
|
+
hideMenu();
|
249
|
+
|
250
|
+
if (command != null && command != '') {
|
251
|
+
_self.onCommand.notify({
|
252
|
+
"grid": _grid,
|
253
|
+
"column": columnDef,
|
254
|
+
"command": command,
|
255
|
+
"item": item
|
256
|
+
}, e, _self);
|
257
|
+
}
|
258
|
+
|
259
|
+
// Stop propagation so that it doesn't register as a header click event.
|
260
|
+
e.preventDefault();
|
261
|
+
e.stopPropagation();
|
262
|
+
}
|
263
|
+
|
264
|
+
$.extend(this, {
|
265
|
+
"init": init,
|
266
|
+
"destroy": destroy,
|
267
|
+
|
268
|
+
"onBeforeMenuShow": new Slick.Event(),
|
269
|
+
"onCommand": new Slick.Event()
|
270
|
+
});
|
271
|
+
}
|
272
|
+
})(jQuery);
|
@@ -0,0 +1,138 @@
|
|
1
|
+
(function ($) {
|
2
|
+
// register namespace
|
3
|
+
$.extend(true, window, {
|
4
|
+
"Slick": {
|
5
|
+
"RowMoveManager": RowMoveManager
|
6
|
+
}
|
7
|
+
});
|
8
|
+
|
9
|
+
function RowMoveManager(options) {
|
10
|
+
var _grid;
|
11
|
+
var _canvas;
|
12
|
+
var _dragging;
|
13
|
+
var _self = this;
|
14
|
+
var _handler = new Slick.EventHandler();
|
15
|
+
var _defaults = {
|
16
|
+
cancelEditOnDrag: false
|
17
|
+
};
|
18
|
+
|
19
|
+
function init(grid) {
|
20
|
+
options = $.extend(true, {}, _defaults, options);
|
21
|
+
_grid = grid;
|
22
|
+
_canvas = _grid.getCanvasNode();
|
23
|
+
_handler
|
24
|
+
.subscribe(_grid.onDragInit, handleDragInit)
|
25
|
+
.subscribe(_grid.onDragStart, handleDragStart)
|
26
|
+
.subscribe(_grid.onDrag, handleDrag)
|
27
|
+
.subscribe(_grid.onDragEnd, handleDragEnd);
|
28
|
+
}
|
29
|
+
|
30
|
+
function destroy() {
|
31
|
+
_handler.unsubscribeAll();
|
32
|
+
}
|
33
|
+
|
34
|
+
function handleDragInit(e, dd) {
|
35
|
+
// prevent the grid from cancelling drag'n'drop by default
|
36
|
+
e.stopImmediatePropagation();
|
37
|
+
}
|
38
|
+
|
39
|
+
function handleDragStart(e, dd) {
|
40
|
+
var cell = _grid.getCellFromEvent(e);
|
41
|
+
|
42
|
+
if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
|
43
|
+
_grid.getEditorLock().cancelCurrentEdit();
|
44
|
+
}
|
45
|
+
|
46
|
+
if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) {
|
47
|
+
return false;
|
48
|
+
}
|
49
|
+
|
50
|
+
_dragging = true;
|
51
|
+
e.stopImmediatePropagation();
|
52
|
+
|
53
|
+
var selectedRows = _grid.getSelectedRows();
|
54
|
+
|
55
|
+
if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) {
|
56
|
+
selectedRows = [cell.row];
|
57
|
+
_grid.setSelectedRows(selectedRows);
|
58
|
+
}
|
59
|
+
|
60
|
+
var rowHeight = _grid.getOptions().rowHeight;
|
61
|
+
|
62
|
+
dd.selectedRows = selectedRows;
|
63
|
+
|
64
|
+
dd.selectionProxy = $("<div class='slick-reorder-proxy'/>")
|
65
|
+
.css("position", "absolute")
|
66
|
+
.css("zIndex", "99999")
|
67
|
+
.css("width", $(_canvas).innerWidth())
|
68
|
+
.css("height", rowHeight * selectedRows.length)
|
69
|
+
.appendTo(_canvas);
|
70
|
+
|
71
|
+
dd.guide = $("<div class='slick-reorder-guide'/>")
|
72
|
+
.css("position", "absolute")
|
73
|
+
.css("zIndex", "99998")
|
74
|
+
.css("width", $(_canvas).innerWidth())
|
75
|
+
.css("top", -1000)
|
76
|
+
.appendTo(_canvas);
|
77
|
+
|
78
|
+
dd.insertBefore = -1;
|
79
|
+
}
|
80
|
+
|
81
|
+
function handleDrag(e, dd) {
|
82
|
+
if (!_dragging) {
|
83
|
+
return;
|
84
|
+
}
|
85
|
+
|
86
|
+
e.stopImmediatePropagation();
|
87
|
+
|
88
|
+
var top = e.pageY - $(_canvas).offset().top;
|
89
|
+
dd.selectionProxy.css("top", top - 5);
|
90
|
+
|
91
|
+
var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
|
92
|
+
if (insertBefore !== dd.insertBefore) {
|
93
|
+
var eventData = {
|
94
|
+
"rows": dd.selectedRows,
|
95
|
+
"insertBefore": insertBefore
|
96
|
+
};
|
97
|
+
|
98
|
+
if (_self.onBeforeMoveRows.notify(eventData) === false) {
|
99
|
+
dd.guide.css("top", -1000);
|
100
|
+
dd.canMove = false;
|
101
|
+
} else {
|
102
|
+
dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
|
103
|
+
dd.canMove = true;
|
104
|
+
}
|
105
|
+
|
106
|
+
dd.insertBefore = insertBefore;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
function handleDragEnd(e, dd) {
|
111
|
+
if (!_dragging) {
|
112
|
+
return;
|
113
|
+
}
|
114
|
+
_dragging = false;
|
115
|
+
e.stopImmediatePropagation();
|
116
|
+
|
117
|
+
dd.guide.remove();
|
118
|
+
dd.selectionProxy.remove();
|
119
|
+
|
120
|
+
if (dd.canMove) {
|
121
|
+
var eventData = {
|
122
|
+
"rows": dd.selectedRows,
|
123
|
+
"insertBefore": dd.insertBefore
|
124
|
+
};
|
125
|
+
// TODO: _grid.remapCellCssClasses ?
|
126
|
+
_self.onMoveRows.notify(eventData);
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
$.extend(this, {
|
131
|
+
"onBeforeMoveRows": new Slick.Event(),
|
132
|
+
"onMoveRows": new Slick.Event(),
|
133
|
+
|
134
|
+
"init": init,
|
135
|
+
"destroy": destroy
|
136
|
+
});
|
137
|
+
}
|
138
|
+
})(jQuery);
|
@@ -0,0 +1,187 @@
|
|
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
|
+
_ranges = ranges;
|
85
|
+
_self.onSelectedRangesChanged.notify(_ranges);
|
86
|
+
}
|
87
|
+
|
88
|
+
function getSelectedRanges() {
|
89
|
+
return _ranges;
|
90
|
+
}
|
91
|
+
|
92
|
+
function handleActiveCellChange(e, data) {
|
93
|
+
if (_options.selectActiveRow && data.row != null) {
|
94
|
+
setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
function handleKeyDown(e) {
|
99
|
+
var activeRow = _grid.getActiveCell();
|
100
|
+
if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
|
101
|
+
var selectedRows = getSelectedRows();
|
102
|
+
selectedRows.sort(function (x, y) {
|
103
|
+
return x - y
|
104
|
+
});
|
105
|
+
|
106
|
+
if (!selectedRows.length) {
|
107
|
+
selectedRows = [activeRow.row];
|
108
|
+
}
|
109
|
+
|
110
|
+
var top = selectedRows[0];
|
111
|
+
var bottom = selectedRows[selectedRows.length - 1];
|
112
|
+
var active;
|
113
|
+
|
114
|
+
if (e.which == 40) {
|
115
|
+
active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
|
116
|
+
} else {
|
117
|
+
active = activeRow.row < bottom ? --bottom : --top;
|
118
|
+
}
|
119
|
+
|
120
|
+
if (active >= 0 && active < _grid.getDataLength()) {
|
121
|
+
_grid.scrollRowIntoView(active);
|
122
|
+
_ranges = rowsToRanges(getRowsRange(top, bottom));
|
123
|
+
setSelectedRanges(_ranges);
|
124
|
+
}
|
125
|
+
|
126
|
+
e.preventDefault();
|
127
|
+
e.stopPropagation();
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
function handleClick(e) {
|
132
|
+
var cell = _grid.getCellFromEvent(e);
|
133
|
+
if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
|
134
|
+
return false;
|
135
|
+
}
|
136
|
+
|
137
|
+
var selection = rangesToRows(_ranges);
|
138
|
+
var idx = $.inArray(cell.row, selection);
|
139
|
+
|
140
|
+
if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
|
141
|
+
return false;
|
142
|
+
}
|
143
|
+
else if (_grid.getOptions().multiSelect) {
|
144
|
+
if (idx === -1 && (e.ctrlKey || e.metaKey)) {
|
145
|
+
selection.push(cell.row);
|
146
|
+
_grid.setActiveCell(cell.row, cell.cell);
|
147
|
+
} else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
|
148
|
+
selection = $.grep(selection, function (o, i) {
|
149
|
+
return (o !== cell.row);
|
150
|
+
});
|
151
|
+
_grid.setActiveCell(cell.row, cell.cell);
|
152
|
+
} else if (selection.length && e.shiftKey) {
|
153
|
+
var last = selection.pop();
|
154
|
+
var from = Math.min(cell.row, last);
|
155
|
+
var to = Math.max(cell.row, last);
|
156
|
+
selection = [];
|
157
|
+
for (var i = from; i <= to; i++) {
|
158
|
+
if (i !== last) {
|
159
|
+
selection.push(i);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
selection.push(last);
|
163
|
+
_grid.setActiveCell(cell.row, cell.cell);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
_ranges = rowsToRanges(selection);
|
168
|
+
setSelectedRanges(_ranges);
|
169
|
+
e.stopImmediatePropagation();
|
170
|
+
|
171
|
+
return true;
|
172
|
+
}
|
173
|
+
|
174
|
+
$.extend(this, {
|
175
|
+
"getSelectedRows": getSelectedRows,
|
176
|
+
"setSelectedRows": setSelectedRows,
|
177
|
+
|
178
|
+
"getSelectedRanges": getSelectedRanges,
|
179
|
+
"setSelectedRanges": setSelectedRanges,
|
180
|
+
|
181
|
+
"init": init,
|
182
|
+
"destroy": destroy,
|
183
|
+
|
184
|
+
"onSelectedRangesChanged": new Slick.Event()
|
185
|
+
});
|
186
|
+
}
|
187
|
+
})(jQuery);
|