slickgrid-bootstrap-rails 0.0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.gitignore +34 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +158 -0
  5. data/Rakefile +1 -0
  6. data/lib/slickgrid-bootstrap-rails/version.rb +7 -0
  7. data/lib/slickgrid-bootstrap-rails.rb +11 -0
  8. data/slickgrid-bootstrap-rails.gemspec +21 -0
  9. data/vendor/assets/images/actions.gif +0 -0
  10. data/vendor/assets/images/ajax-loader-small.gif +0 -0
  11. data/vendor/assets/images/arrow_redo.png +0 -0
  12. data/vendor/assets/images/arrow_right_peppermint.png +0 -0
  13. data/vendor/assets/images/arrow_right_spearmint.png +0 -0
  14. data/vendor/assets/images/arrow_undo.png +0 -0
  15. data/vendor/assets/images/bullet_blue.png +0 -0
  16. data/vendor/assets/images/bullet_star.png +0 -0
  17. data/vendor/assets/images/bullet_toggle_minus.png +0 -0
  18. data/vendor/assets/images/bullet_toggle_plus.png +0 -0
  19. data/vendor/assets/images/calendar.gif +0 -0
  20. data/vendor/assets/images/collapse.gif +0 -0
  21. data/vendor/assets/images/comment_yellow.gif +0 -0
  22. data/vendor/assets/images/down.gif +0 -0
  23. data/vendor/assets/images/drag-handle.png +0 -0
  24. data/vendor/assets/images/editor-helper-bg.gif +0 -0
  25. data/vendor/assets/images/expand.gif +0 -0
  26. data/vendor/assets/images/header-bg.gif +0 -0
  27. data/vendor/assets/images/header-columns-bg.gif +0 -0
  28. data/vendor/assets/images/header-columns-over-bg.gif +0 -0
  29. data/vendor/assets/images/help.png +0 -0
  30. data/vendor/assets/images/info.gif +0 -0
  31. data/vendor/assets/images/listview.gif +0 -0
  32. data/vendor/assets/images/pencil.gif +0 -0
  33. data/vendor/assets/images/row-over-bg.gif +0 -0
  34. data/vendor/assets/images/sort-asc.gif +0 -0
  35. data/vendor/assets/images/sort-asc.png +0 -0
  36. data/vendor/assets/images/sort-desc.gif +0 -0
  37. data/vendor/assets/images/sort-desc.png +0 -0
  38. data/vendor/assets/images/stripes.png +0 -0
  39. data/vendor/assets/images/tag_red.png +0 -0
  40. data/vendor/assets/images/tick.png +0 -0
  41. data/vendor/assets/images/user_identity.gif +0 -0
  42. data/vendor/assets/images/user_identity_plus.gif +0 -0
  43. data/vendor/assets/javascripts/bootstrap/slick.bootstrap.js +86 -0
  44. data/vendor/assets/javascripts/plugins/slick.autotooltips.js +48 -0
  45. data/vendor/assets/javascripts/plugins/slick.cellcopymanager.js +86 -0
  46. data/vendor/assets/javascripts/plugins/slick.cellrangedecorator.js +64 -0
  47. data/vendor/assets/javascripts/plugins/slick.cellrangeselector.js +111 -0
  48. data/vendor/assets/javascripts/plugins/slick.cellselectionmodel.js +92 -0
  49. data/vendor/assets/javascripts/plugins/slick.checkboxselectcolumn.js +153 -0
  50. data/vendor/assets/javascripts/plugins/slick.headerbuttons.js +177 -0
  51. data/vendor/assets/javascripts/plugins/slick.headermenu.js +272 -0
  52. data/vendor/assets/javascripts/plugins/slick.rowmovemanager.js +138 -0
  53. data/vendor/assets/javascripts/plugins/slick.rowselectionmodel.js +187 -0
  54. data/vendor/assets/javascripts/slick.core.js +430 -0
  55. data/vendor/assets/javascripts/slick.dataview.js +917 -0
  56. data/vendor/assets/javascripts/slick.editors.js.erb +512 -0
  57. data/vendor/assets/javascripts/slick.formatters.js.erb +55 -0
  58. data/vendor/assets/javascripts/slick.grid.js +3294 -0
  59. data/vendor/assets/javascripts/slick.groupitemmetadataprovider.js +139 -0
  60. data/vendor/assets/javascripts/slick.remotemodel.js +164 -0
  61. data/vendor/assets/javascripts/slickgrid-bootstrap-rails.js +13 -0
  62. data/vendor/assets/stylesheets/plugins/slick.headerbuttons.css +38 -0
  63. data/vendor/assets/stylesheets/plugins/slick.headermenu.css +58 -0
  64. data/vendor/assets/stylesheets/slick.grid.css.erb +157 -0
  65. data/vendor/assets/stylesheets/slickgrid-bootstrap-rails.css +4 -0
  66. data/vendor/assets/stylesheets/slickgrid-bootstrap.less +159 -0
  67. metadata +143 -0
@@ -0,0 +1,111 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "CellRangeSelector": CellRangeSelector
6
+ }
7
+ });
8
+
9
+
10
+ function CellRangeSelector(options) {
11
+ var _grid;
12
+ var _canvas;
13
+ var _dragging;
14
+ var _decorator;
15
+ var _self = this;
16
+ var _handler = new Slick.EventHandler();
17
+ var _defaults = {
18
+ selectionCss: {
19
+ "border": "2px dashed blue"
20
+ }
21
+ };
22
+
23
+
24
+ function init(grid) {
25
+ options = $.extend(true, {}, _defaults, options);
26
+ _decorator = new Slick.CellRangeDecorator(grid, options);
27
+ _grid = grid;
28
+ _canvas = _grid.getCanvasNode();
29
+ _handler
30
+ .subscribe(_grid.onDragInit, handleDragInit)
31
+ .subscribe(_grid.onDragStart, handleDragStart)
32
+ .subscribe(_grid.onDrag, handleDrag)
33
+ .subscribe(_grid.onDragEnd, handleDragEnd);
34
+ }
35
+
36
+ function destroy() {
37
+ _handler.unsubscribeAll();
38
+ }
39
+
40
+ function handleDragInit(e, dd) {
41
+ // prevent the grid from cancelling drag'n'drop by default
42
+ e.stopImmediatePropagation();
43
+ }
44
+
45
+ function handleDragStart(e, dd) {
46
+ var cell = _grid.getCellFromEvent(e);
47
+ if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
48
+ if (_grid.canCellBeSelected(cell.row, cell.cell)) {
49
+ _dragging = true;
50
+ e.stopImmediatePropagation();
51
+ }
52
+ }
53
+ if (!_dragging) {
54
+ return;
55
+ }
56
+
57
+ var start = _grid.getCellFromPoint(
58
+ dd.startX - $(_canvas).offset().left,
59
+ dd.startY - $(_canvas).offset().top);
60
+
61
+ dd.range = {start: start, end: {}};
62
+
63
+ return _decorator.show(new Slick.Range(start.row, start.cell));
64
+ }
65
+
66
+ function handleDrag(e, dd) {
67
+ if (!_dragging) {
68
+ return;
69
+ }
70
+ e.stopImmediatePropagation();
71
+
72
+ var end = _grid.getCellFromPoint(
73
+ e.pageX - $(_canvas).offset().left,
74
+ e.pageY - $(_canvas).offset().top);
75
+
76
+ if (!_grid.canCellBeSelected(end.row, end.cell)) {
77
+ return;
78
+ }
79
+
80
+ dd.range.end = end;
81
+ _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
82
+ }
83
+
84
+ function handleDragEnd(e, dd) {
85
+ if (!_dragging) {
86
+ return;
87
+ }
88
+
89
+ _dragging = false;
90
+ e.stopImmediatePropagation();
91
+
92
+ _decorator.hide();
93
+ _self.onCellRangeSelected.notify({
94
+ range: new Slick.Range(
95
+ dd.range.start.row,
96
+ dd.range.start.cell,
97
+ dd.range.end.row,
98
+ dd.range.end.cell
99
+ )
100
+ });
101
+ }
102
+
103
+ $.extend(this, {
104
+ "init": init,
105
+ "destroy": destroy,
106
+
107
+ "onBeforeCellRangeSelected": new Slick.Event(),
108
+ "onCellRangeSelected": new Slick.Event()
109
+ });
110
+ }
111
+ })(jQuery);
@@ -0,0 +1,92 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "CellSelectionModel": CellSelectionModel
6
+ }
7
+ });
8
+
9
+
10
+ function CellSelectionModel(options) {
11
+ var _grid;
12
+ var _canvas;
13
+ var _ranges = [];
14
+ var _self = this;
15
+ var _selector = new Slick.CellRangeSelector({
16
+ "selectionCss": {
17
+ "border": "2px solid black"
18
+ }
19
+ });
20
+ var _options;
21
+ var _defaults = {
22
+ selectActiveCell: true
23
+ };
24
+
25
+
26
+ function init(grid) {
27
+ _options = $.extend(true, {}, _defaults, options);
28
+ _grid = grid;
29
+ _canvas = _grid.getCanvasNode();
30
+ _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
31
+ grid.registerPlugin(_selector);
32
+ _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
33
+ _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
34
+ }
35
+
36
+ function destroy() {
37
+ _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
38
+ _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
39
+ _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
40
+ _grid.unregisterPlugin(_selector);
41
+ }
42
+
43
+ function removeInvalidRanges(ranges) {
44
+ var result = [];
45
+
46
+ for (var i = 0; i < ranges.length; i++) {
47
+ var r = ranges[i];
48
+ if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
49
+ result.push(r);
50
+ }
51
+ }
52
+
53
+ return result;
54
+ }
55
+
56
+ function setSelectedRanges(ranges) {
57
+ _ranges = removeInvalidRanges(ranges);
58
+ _self.onSelectedRangesChanged.notify(_ranges);
59
+ }
60
+
61
+ function getSelectedRanges() {
62
+ return _ranges;
63
+ }
64
+
65
+ function handleBeforeCellRangeSelected(e, args) {
66
+ if (_grid.getEditorLock().isActive()) {
67
+ e.stopPropagation();
68
+ return false;
69
+ }
70
+ }
71
+
72
+ function handleCellRangeSelected(e, args) {
73
+ setSelectedRanges([args.range]);
74
+ }
75
+
76
+ function handleActiveCellChange(e, args) {
77
+ if (_options.selectActiveCell && args.row != null && args.cell != null) {
78
+ setSelectedRanges([new Slick.Range(args.row, args.cell)]);
79
+ }
80
+ }
81
+
82
+ $.extend(this, {
83
+ "getSelectedRanges": getSelectedRanges,
84
+ "setSelectedRanges": setSelectedRanges,
85
+
86
+ "init": init,
87
+ "destroy": destroy,
88
+
89
+ "onSelectedRangesChanged": new Slick.Event()
90
+ });
91
+ }
92
+ })(jQuery);
@@ -0,0 +1,153 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "CheckboxSelectColumn": CheckboxSelectColumn
6
+ }
7
+ });
8
+
9
+
10
+ function CheckboxSelectColumn(options) {
11
+ var _grid;
12
+ var _self = this;
13
+ var _handler = new Slick.EventHandler();
14
+ var _selectedRowsLookup = {};
15
+ var _defaults = {
16
+ columnId: "_checkbox_selector",
17
+ cssClass: null,
18
+ toolTip: "Select/Deselect All",
19
+ width: 30
20
+ };
21
+
22
+ var _options = $.extend(true, {}, _defaults, options);
23
+
24
+ function init(grid) {
25
+ _grid = grid;
26
+ _handler
27
+ .subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
28
+ .subscribe(_grid.onClick, handleClick)
29
+ .subscribe(_grid.onHeaderClick, handleHeaderClick)
30
+ .subscribe(_grid.onKeyDown, handleKeyDown);
31
+ }
32
+
33
+ function destroy() {
34
+ _handler.unsubscribeAll();
35
+ }
36
+
37
+ function handleSelectedRowsChanged(e, args) {
38
+ var selectedRows = _grid.getSelectedRows();
39
+ var lookup = {}, row, i;
40
+ for (i = 0; i < selectedRows.length; i++) {
41
+ row = selectedRows[i];
42
+ lookup[row] = true;
43
+ if (lookup[row] !== _selectedRowsLookup[row]) {
44
+ _grid.invalidateRow(row);
45
+ delete _selectedRowsLookup[row];
46
+ }
47
+ }
48
+ for (i in _selectedRowsLookup) {
49
+ _grid.invalidateRow(i);
50
+ }
51
+ _selectedRowsLookup = lookup;
52
+ _grid.render();
53
+
54
+ if (selectedRows.length && selectedRows.length == _grid.getDataLength()) {
55
+ _grid.updateColumnHeader(_options.columnId, "<input type='checkbox' checked='checked'>", _options.toolTip);
56
+ } else {
57
+ _grid.updateColumnHeader(_options.columnId, "<input type='checkbox'>", _options.toolTip);
58
+ }
59
+ }
60
+
61
+ function handleKeyDown(e, args) {
62
+ if (e.which == 32) {
63
+ if (_grid.getColumns()[args.cell].id === _options.columnId) {
64
+ // if editing, try to commit
65
+ if (!_grid.getEditorLock().isActive() || _grid.getEditorLock().commitCurrentEdit()) {
66
+ toggleRowSelection(args.row);
67
+ }
68
+ e.preventDefault();
69
+ e.stopImmediatePropagation();
70
+ }
71
+ }
72
+ }
73
+
74
+ function handleClick(e, args) {
75
+ // clicking on a row select checkbox
76
+ if (_grid.getColumns()[args.cell].id === _options.columnId && $(e.target).is(":checkbox")) {
77
+ // if editing, try to commit
78
+ if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
79
+ e.preventDefault();
80
+ e.stopImmediatePropagation();
81
+ return;
82
+ }
83
+
84
+ toggleRowSelection(args.row);
85
+ e.stopPropagation();
86
+ e.stopImmediatePropagation();
87
+ }
88
+ }
89
+
90
+ function toggleRowSelection(row) {
91
+ if (_selectedRowsLookup[row]) {
92
+ _grid.setSelectedRows($.grep(_grid.getSelectedRows(), function (n) {
93
+ return n != row
94
+ }));
95
+ } else {
96
+ _grid.setSelectedRows(_grid.getSelectedRows().concat(row));
97
+ }
98
+ }
99
+
100
+ function handleHeaderClick(e, args) {
101
+ if (args.column.id == _options.columnId && $(e.target).is(":checkbox")) {
102
+ // if editing, try to commit
103
+ if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
104
+ e.preventDefault();
105
+ e.stopImmediatePropagation();
106
+ return;
107
+ }
108
+
109
+ if ($(e.target).is(":checked")) {
110
+ var rows = [];
111
+ for (var i = 0; i < _grid.getDataLength(); i++) {
112
+ rows.push(i);
113
+ }
114
+ _grid.setSelectedRows(rows);
115
+ } else {
116
+ _grid.setSelectedRows([]);
117
+ }
118
+ e.stopPropagation();
119
+ e.stopImmediatePropagation();
120
+ }
121
+ }
122
+
123
+ function getColumnDefinition() {
124
+ return {
125
+ id: _options.columnId,
126
+ name: "<input type='checkbox'>",
127
+ toolTip: _options.toolTip,
128
+ field: "sel",
129
+ width: _options.width,
130
+ resizable: false,
131
+ sortable: false,
132
+ cssClass: _options.cssClass,
133
+ formatter: checkboxSelectionFormatter
134
+ };
135
+ }
136
+
137
+ function checkboxSelectionFormatter(row, cell, value, columnDef, dataContext) {
138
+ if (dataContext) {
139
+ return _selectedRowsLookup[row]
140
+ ? "<input type='checkbox' checked='checked'>"
141
+ : "<input type='checkbox'>";
142
+ }
143
+ return null;
144
+ }
145
+
146
+ $.extend(this, {
147
+ "init": init,
148
+ "destroy": destroy,
149
+
150
+ "getColumnDefinition": getColumnDefinition
151
+ });
152
+ }
153
+ })(jQuery);
@@ -0,0 +1,177 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "Plugins": {
6
+ "HeaderButtons": HeaderButtons
7
+ }
8
+ }
9
+ });
10
+
11
+
12
+ /***
13
+ * A plugin to add custom buttons 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 custom button 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
+ * buttons: [
29
+ * {
30
+ * // button options
31
+ * },
32
+ * {
33
+ * // button options
34
+ * }
35
+ * ]
36
+ * }
37
+ * }
38
+ * ];
39
+ *
40
+ * Available button options:
41
+ * cssClass: CSS class to add to the button.
42
+ * image: Relative button image path.
43
+ * tooltip: Button tooltip.
44
+ * showOnHover: Only show the button on hover.
45
+ * handler: Button click handler.
46
+ * command: A command identifier to be passed to the onCommand event handlers.
47
+ *
48
+ * The plugin exposes the following events:
49
+ * onCommand: Fired on button click for buttons with 'command' specified.
50
+ * Event args:
51
+ * grid: Reference to the grid.
52
+ * column: Column definition.
53
+ * command: Button command identified.
54
+ * button: Button options. Note that you can change the button options in your
55
+ * event handler, and the column header will be automatically updated to
56
+ * reflect them. This is useful if you want to implement something like a
57
+ * toggle button.
58
+ *
59
+ *
60
+ * @param options {Object} Options:
61
+ * buttonCssClass: a CSS class to use for buttons (default 'slick-header-button')
62
+ * @class Slick.Plugins.HeaderButtons
63
+ * @constructor
64
+ */
65
+ function HeaderButtons(options) {
66
+ var _grid;
67
+ var _self = this;
68
+ var _handler = new Slick.EventHandler();
69
+ var _defaults = {
70
+ buttonCssClass: "slick-header-button"
71
+ };
72
+
73
+
74
+ function init(grid) {
75
+ options = $.extend(true, {}, _defaults, options);
76
+ _grid = grid;
77
+ _handler
78
+ .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
79
+ .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
80
+
81
+ // Force the grid to re-render the header now that the events are hooked up.
82
+ _grid.setColumns(_grid.getColumns());
83
+ }
84
+
85
+
86
+ function destroy() {
87
+ _handler.unsubscribeAll();
88
+ }
89
+
90
+
91
+ function handleHeaderCellRendered(e, args) {
92
+ var column = args.column;
93
+
94
+ if (column.header && column.header.buttons) {
95
+ // Append buttons in reverse order since they are floated to the right.
96
+ var i = column.header.buttons.length;
97
+ while (i--) {
98
+ var button = column.header.buttons[i];
99
+ var btn = $("<div></div>")
100
+ .addClass(options.buttonCssClass)
101
+ .data("column", column)
102
+ .data("button", button);
103
+
104
+ if (button.showOnHover) {
105
+ btn.addClass("slick-header-button-hidden");
106
+ }
107
+
108
+ if (button.image) {
109
+ btn.css("backgroundImage", "url(" + button.image + ")");
110
+ }
111
+
112
+ if (button.cssClass) {
113
+ btn.addClass(button.cssClass);
114
+ }
115
+
116
+ if (button.tooltip) {
117
+ btn.attr("title", button.tooltip);
118
+ }
119
+
120
+ if (button.command) {
121
+ btn.data("command", button.command);
122
+ }
123
+
124
+ if (button.handler) {
125
+ btn.bind("click", button.handler);
126
+ }
127
+
128
+ btn
129
+ .bind("click", handleButtonClick)
130
+ .appendTo(args.node);
131
+ }
132
+ }
133
+ }
134
+
135
+
136
+ function handleBeforeHeaderCellDestroy(e, args) {
137
+ var column = args.column;
138
+
139
+ if (column.header && column.header.buttons) {
140
+ // Removing buttons via jQuery will also clean up any event handlers and data.
141
+ // NOTE: If you attach event handlers directly or using a different framework,
142
+ // you must also clean them up here to avoid memory leaks.
143
+ $(args.node).find("." + options.buttonCssClass).remove();
144
+ }
145
+ }
146
+
147
+
148
+ function handleButtonClick(e) {
149
+ var command = $(this).data("command");
150
+ var columnDef = $(this).data("column");
151
+ var button = $(this).data("button");
152
+
153
+ if (command != null) {
154
+ _self.onCommand.notify({
155
+ "grid": _grid,
156
+ "column": columnDef,
157
+ "command": command,
158
+ "button": button
159
+ }, e, _self);
160
+
161
+ // Update the header in case the user updated the button definition in the handler.
162
+ _grid.updateColumnHeader(columnDef.id);
163
+ }
164
+
165
+ // Stop propagation so that it doesn't register as a header click event.
166
+ e.preventDefault();
167
+ e.stopPropagation();
168
+ }
169
+
170
+ $.extend(this, {
171
+ "init": init,
172
+ "destroy": destroy,
173
+
174
+ "onCommand": new Slick.Event()
175
+ });
176
+ }
177
+ })(jQuery);