slickgrid-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/.rvmrc +1 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +75 -0
  4. data/LICENSE +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +2 -0
  7. data/fetch.sh +8 -0
  8. data/lib/slickgrid-rails.rb +1 -0
  9. data/lib/slickgrid/rails.rb +5 -0
  10. data/lib/slickgrid/rails/engine.rb +7 -0
  11. data/lib/slickgrid/rails/version.rb +6 -0
  12. data/lib/slickgrid/table.rb +72 -0
  13. data/slickgrid-rails.gemspec +22 -0
  14. data/vendor/assets/images/slick/actions.gif +0 -0
  15. data/vendor/assets/images/slick/ajax-loader-small.gif +0 -0
  16. data/vendor/assets/images/slick/arrow_redo.png +0 -0
  17. data/vendor/assets/images/slick/arrow_right_peppermint.png +0 -0
  18. data/vendor/assets/images/slick/arrow_right_spearmint.png +0 -0
  19. data/vendor/assets/images/slick/arrow_undo.png +0 -0
  20. data/vendor/assets/images/slick/bullet_blue.png +0 -0
  21. data/vendor/assets/images/slick/bullet_star.png +0 -0
  22. data/vendor/assets/images/slick/bullet_toggle_minus.png +0 -0
  23. data/vendor/assets/images/slick/bullet_toggle_plus.png +0 -0
  24. data/vendor/assets/images/slick/calendar.gif +0 -0
  25. data/vendor/assets/images/slick/collapse.gif +0 -0
  26. data/vendor/assets/images/slick/comment_yellow.gif +0 -0
  27. data/vendor/assets/images/slick/down.gif +0 -0
  28. data/vendor/assets/images/slick/drag-handle.png +0 -0
  29. data/vendor/assets/images/slick/editor-helper-bg.gif +0 -0
  30. data/vendor/assets/images/slick/expand.gif +0 -0
  31. data/vendor/assets/images/slick/header-bg.gif +0 -0
  32. data/vendor/assets/images/slick/header-columns-bg.gif +0 -0
  33. data/vendor/assets/images/slick/header-columns-over-bg.gif +0 -0
  34. data/vendor/assets/images/slick/help.png +0 -0
  35. data/vendor/assets/images/slick/info.gif +0 -0
  36. data/vendor/assets/images/slick/listview.gif +0 -0
  37. data/vendor/assets/images/slick/pencil.gif +0 -0
  38. data/vendor/assets/images/slick/row-over-bg.gif +0 -0
  39. data/vendor/assets/images/slick/sort-asc.gif +0 -0
  40. data/vendor/assets/images/slick/sort-asc.png +0 -0
  41. data/vendor/assets/images/slick/sort-desc.gif +0 -0
  42. data/vendor/assets/images/slick/sort-desc.png +0 -0
  43. data/vendor/assets/images/slick/stripes.png +0 -0
  44. data/vendor/assets/images/slick/tag_red.png +0 -0
  45. data/vendor/assets/images/slick/tick.png +0 -0
  46. data/vendor/assets/images/slick/user_identity.gif +0 -0
  47. data/vendor/assets/images/slick/user_identity_plus.gif +0 -0
  48. data/vendor/assets/javascripts/slick.js +4 -0
  49. data/vendor/assets/javascripts/slick/controls/columnpicker.js +106 -0
  50. data/vendor/assets/javascripts/slick/controls/pager.js +151 -0
  51. data/vendor/assets/javascripts/slick/core.js +424 -0
  52. data/vendor/assets/javascripts/slick/dataview.js +908 -0
  53. data/vendor/assets/javascripts/slick/editors.js +512 -0
  54. data/vendor/assets/javascripts/slick/formatters.js +55 -0
  55. data/vendor/assets/javascripts/slick/grid.js +2783 -0
  56. data/vendor/assets/javascripts/slick/groupitemmetadataprovider.js +139 -0
  57. data/vendor/assets/javascripts/slick/plugins/autotooltips.js +48 -0
  58. data/vendor/assets/javascripts/slick/plugins/cellcopymanager.js +86 -0
  59. data/vendor/assets/javascripts/slick/plugins/cellrangedecorator.js +64 -0
  60. data/vendor/assets/javascripts/slick/plugins/cellrangeselector.js +112 -0
  61. data/vendor/assets/javascripts/slick/plugins/cellselectionmodel.js +92 -0
  62. data/vendor/assets/javascripts/slick/plugins/checkboxselectcolumn.js +154 -0
  63. data/vendor/assets/javascripts/slick/plugins/rowmovemanager.js +132 -0
  64. data/vendor/assets/javascripts/slick/plugins/rowselectionmodel.js +187 -0
  65. data/vendor/assets/javascripts/slick/remotemodel.js +164 -0
  66. data/vendor/assets/stylesheets/slick/controls/columnpicker.css +30 -0
  67. data/vendor/assets/stylesheets/slick/controls/pager.css.scss +41 -0
  68. data/vendor/assets/stylesheets/slick/default-theme.css.scss +104 -0
  69. data/vendor/assets/stylesheets/slick/grid.css.scss +158 -0
  70. metadata +158 -0
@@ -0,0 +1,139 @@
1
+ (function ($) {
2
+ $.extend(true, window, {
3
+ Slick: {
4
+ Data: {
5
+ GroupItemMetadataProvider: GroupItemMetadataProvider
6
+ }
7
+ }
8
+ });
9
+
10
+
11
+ /***
12
+ * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.
13
+ * This metadata overrides the default behavior and formatting of those rows so that they appear and function
14
+ * correctly when processed by the grid.
15
+ *
16
+ * This class also acts as a grid plugin providing event handlers to expand & collapse groups.
17
+ * If "grid.registerPlugin(...)" is not called, expand & collapse will not work.
18
+ *
19
+ * @class GroupItemMetadataProvider
20
+ * @module Data
21
+ * @namespace Slick.Data
22
+ * @constructor
23
+ * @param options
24
+ */
25
+ function GroupItemMetadataProvider(options) {
26
+ var _grid;
27
+ var _defaults = {
28
+ groupCssClass: "slick-group",
29
+ totalsCssClass: "slick-group-totals",
30
+ groupFocusable: true,
31
+ totalsFocusable: false,
32
+ toggleCssClass: "slick-group-toggle",
33
+ toggleExpandedCssClass: "expanded",
34
+ toggleCollapsedCssClass: "collapsed",
35
+ enableExpandCollapse: true
36
+ };
37
+
38
+ options = $.extend(true, {}, _defaults, options);
39
+
40
+
41
+ function defaultGroupCellFormatter(row, cell, value, columnDef, item) {
42
+ if (!options.enableExpandCollapse) {
43
+ return item.title;
44
+ }
45
+
46
+ return "<span class='" + options.toggleCssClass + " " +
47
+ (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) +
48
+ "'></span>" + item.title;
49
+ }
50
+
51
+ function defaultTotalsCellFormatter(row, cell, value, columnDef, item) {
52
+ return (columnDef.groupTotalsFormatter && columnDef.groupTotalsFormatter(item, columnDef)) || "";
53
+ }
54
+
55
+
56
+ function init(grid) {
57
+ _grid = grid;
58
+ _grid.onClick.subscribe(handleGridClick);
59
+ _grid.onKeyDown.subscribe(handleGridKeyDown);
60
+
61
+ }
62
+
63
+ function destroy() {
64
+ if (_grid) {
65
+ _grid.onClick.unsubscribe(handleGridClick);
66
+ _grid.onKeyDown.unsubscribe(handleGridKeyDown);
67
+ }
68
+ }
69
+
70
+ function handleGridClick(e, args) {
71
+ var item = this.getDataItem(args.row);
72
+ if (item && item instanceof Slick.Group && $(e.target).hasClass(options.toggleCssClass)) {
73
+ if (item.collapsed) {
74
+ this.getData().expandGroup(item.value);
75
+ }
76
+ else {
77
+ this.getData().collapseGroup(item.value);
78
+ }
79
+
80
+ e.stopImmediatePropagation();
81
+ e.preventDefault();
82
+ }
83
+ }
84
+
85
+ // TODO: add -/+ handling
86
+ function handleGridKeyDown(e, args) {
87
+ if (options.enableExpandCollapse && (e.which == $.ui.keyCode.SPACE)) {
88
+ var activeCell = this.getActiveCell();
89
+ if (activeCell) {
90
+ var item = this.getDataItem(activeCell.row);
91
+ if (item && item instanceof Slick.Group) {
92
+ if (item.collapsed) {
93
+ this.getData().expandGroup(item.value);
94
+ }
95
+ else {
96
+ this.getData().collapseGroup(item.value);
97
+ }
98
+
99
+ e.stopImmediatePropagation();
100
+ e.preventDefault();
101
+ }
102
+ }
103
+ }
104
+ }
105
+
106
+ function getGroupRowMetadata(item) {
107
+ return {
108
+ selectable: false,
109
+ focusable: options.groupFocusable,
110
+ cssClasses: options.groupCssClass,
111
+ columns: {
112
+ 0: {
113
+ colspan: "*",
114
+ formatter: defaultGroupCellFormatter,
115
+ editor: null
116
+ }
117
+ }
118
+ };
119
+ }
120
+
121
+ function getTotalsRowMetadata(item) {
122
+ return {
123
+ selectable: false,
124
+ focusable: options.totalsFocusable,
125
+ cssClasses: options.totalsCssClass,
126
+ formatter: defaultTotalsCellFormatter,
127
+ editor: null
128
+ };
129
+ }
130
+
131
+
132
+ return {
133
+ "init": init,
134
+ "destroy": destroy,
135
+ "getGroupRowMetadata": getGroupRowMetadata,
136
+ "getTotalsRowMetadata": getTotalsRowMetadata
137
+ };
138
+ }
139
+ })(jQuery);
@@ -0,0 +1,48 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "AutoTooltips": AutoTooltips
6
+ }
7
+ });
8
+
9
+
10
+ function AutoTooltips(options) {
11
+ var _grid;
12
+ var _self = this;
13
+ var _defaults = {
14
+ maxToolTipLength: null
15
+ };
16
+
17
+ function init(grid) {
18
+ options = $.extend(true, {}, _defaults, options);
19
+ _grid = grid;
20
+ _grid.onMouseEnter.subscribe(handleMouseEnter);
21
+ }
22
+
23
+ function destroy() {
24
+ _grid.onMouseEnter.unsubscribe(handleMouseEnter);
25
+ }
26
+
27
+ function handleMouseEnter(e, args) {
28
+ var cell = _grid.getCellFromEvent(e);
29
+ if (cell) {
30
+ var node = _grid.getCellNode(cell.row, cell.cell);
31
+ if ($(node).innerWidth() < node.scrollWidth) {
32
+ var text = $.trim($(node).text());
33
+ if (options.maxToolTipLength && text.length > options.maxToolTipLength) {
34
+ text = text.substr(0, options.maxToolTipLength - 3) + "...";
35
+ }
36
+ $(node).attr("title", text);
37
+ } else {
38
+ $(node).attr("title", "");
39
+ }
40
+ }
41
+ }
42
+
43
+ $.extend(this, {
44
+ "init": init,
45
+ "destroy": destroy
46
+ });
47
+ }
48
+ })(jQuery);
@@ -0,0 +1,86 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "CellCopyManager": CellCopyManager
6
+ }
7
+ });
8
+
9
+
10
+ function CellCopyManager() {
11
+ var _grid;
12
+ var _self = this;
13
+ var _copiedRanges;
14
+
15
+ function init(grid) {
16
+ _grid = grid;
17
+ _grid.onKeyDown.subscribe(handleKeyDown);
18
+ }
19
+
20
+ function destroy() {
21
+ _grid.onKeyDown.unsubscribe(handleKeyDown);
22
+ }
23
+
24
+ function handleKeyDown(e, args) {
25
+ var ranges;
26
+ if (!_grid.getEditorLock().isActive()) {
27
+ if (e.which == $.ui.keyCode.ESCAPE) {
28
+ if (_copiedRanges) {
29
+ e.preventDefault();
30
+ clearCopySelection();
31
+ _self.onCopyCancelled.notify({ranges: _copiedRanges});
32
+ _copiedRanges = null;
33
+ }
34
+ }
35
+
36
+ if (e.which == 67 && (e.ctrlKey || e.metaKey)) {
37
+ ranges = _grid.getSelectionModel().getSelectedRanges();
38
+ if (ranges.length != 0) {
39
+ e.preventDefault();
40
+ _copiedRanges = ranges;
41
+ markCopySelection(ranges);
42
+ _self.onCopyCells.notify({ranges: ranges});
43
+ }
44
+ }
45
+
46
+ if (e.which == 86 && (e.ctrlKey || e.metaKey)) {
47
+ if (_copiedRanges) {
48
+ e.preventDefault();
49
+ clearCopySelection();
50
+ ranges = _grid.getSelectionModel().getSelectedRanges();
51
+ _self.onPasteCells.notify({from: _copiedRanges, to: ranges});
52
+ _copiedRanges = null;
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ function markCopySelection(ranges) {
59
+ var columns = _grid.getColumns();
60
+ var hash = {};
61
+ for (var i = 0; i < ranges.length; i++) {
62
+ for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
63
+ hash[j] = {};
64
+ for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {
65
+ hash[j][columns[k].id] = "copied";
66
+ }
67
+ }
68
+ }
69
+ _grid.setCellCssStyles("copy-manager", hash);
70
+ }
71
+
72
+ function clearCopySelection() {
73
+ _grid.removeCellCssStyles("copy-manager");
74
+ }
75
+
76
+ $.extend(this, {
77
+ "init": init,
78
+ "destroy": destroy,
79
+ "clearCopySelection": clearCopySelection,
80
+
81
+ "onCopyCells": new Slick.Event(),
82
+ "onCopyCancelled": new Slick.Event(),
83
+ "onPasteCells": new Slick.Event()
84
+ });
85
+ }
86
+ })(jQuery);
@@ -0,0 +1,64 @@
1
+ (function ($) {
2
+ // register namespace
3
+ $.extend(true, window, {
4
+ "Slick": {
5
+ "CellRangeDecorator": CellRangeDecorator
6
+ }
7
+ });
8
+
9
+ /***
10
+ * Displays an overlay on top of a given cell range.
11
+ *
12
+ * TODO:
13
+ * Currently, it blocks mouse events to DOM nodes behind it.
14
+ * Use FF and WebKit-specific "pointer-events" CSS style, or some kind of event forwarding.
15
+ * Could also construct the borders separately using 4 individual DIVs.
16
+ *
17
+ * @param {Grid} grid
18
+ * @param {Object} options
19
+ */
20
+ function CellRangeDecorator(grid, options) {
21
+ var _elem;
22
+ var _defaults = {
23
+ selectionCss: {
24
+ "zIndex": "9999",
25
+ "border": "2px dashed red"
26
+ }
27
+ };
28
+
29
+ options = $.extend(true, {}, _defaults, options);
30
+
31
+
32
+ function show(range) {
33
+ if (!_elem) {
34
+ _elem = $("<div></div>", {css: options.selectionCss})
35
+ .css("position", "absolute")
36
+ .appendTo(grid.getCanvasNode());
37
+ }
38
+
39
+ var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
40
+ var to = grid.getCellNodeBox(range.toRow, range.toCell);
41
+
42
+ _elem.css({
43
+ top: from.top - 1,
44
+ left: from.left - 1,
45
+ height: to.bottom - from.top - 2,
46
+ width: to.right - from.left - 2
47
+ });
48
+
49
+ return _elem;
50
+ }
51
+
52
+ function hide() {
53
+ if (_elem) {
54
+ _elem.remove();
55
+ _elem = null;
56
+ }
57
+ }
58
+
59
+ $.extend(this, {
60
+ "show": show,
61
+ "hide": hide
62
+ });
63
+ }
64
+ })(jQuery);
@@ -0,0 +1,112 @@
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 _defaults = {
17
+ selectionCss: {
18
+ "border": "2px dashed blue"
19
+ }
20
+ };
21
+
22
+
23
+ function init(grid) {
24
+ options = $.extend(true, {}, _defaults, options);
25
+ _decorator = new Slick.CellRangeDecorator(grid, options);
26
+ _grid = grid;
27
+ _canvas = _grid.getCanvasNode();
28
+ _grid.onDragInit.subscribe(handleDragInit);
29
+ _grid.onDragStart.subscribe(handleDragStart);
30
+ _grid.onDrag.subscribe(handleDrag);
31
+ _grid.onDragEnd.subscribe(handleDragEnd);
32
+ }
33
+
34
+ function destroy() {
35
+ _grid.onDragInit.unsubscribe(handleDragInit);
36
+ _grid.onDragStart.unsubscribe(handleDragStart);
37
+ _grid.onDrag.unsubscribe(handleDrag);
38
+ _grid.onDragEnd.unsubscribe(handleDragEnd);
39
+ }
40
+
41
+ function handleDragInit(e, dd) {
42
+ // prevent the grid from cancelling drag'n'drop by default
43
+ e.stopImmediatePropagation();
44
+ }
45
+
46
+ function handleDragStart(e, dd) {
47
+ var cell = _grid.getCellFromEvent(e);
48
+ if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
49
+ if (_grid.canCellBeSelected(cell.row, cell.cell)) {
50
+ _dragging = true;
51
+ e.stopImmediatePropagation();
52
+ }
53
+ }
54
+ if (!_dragging) {
55
+ return;
56
+ }
57
+
58
+ var start = _grid.getCellFromPoint(
59
+ dd.startX - $(_canvas).offset().left,
60
+ dd.startY - $(_canvas).offset().top);
61
+
62
+ dd.range = {start: start, end: {}};
63
+
64
+ return _decorator.show(new Slick.Range(start.row, start.cell));
65
+ }
66
+
67
+ function handleDrag(e, dd) {
68
+ if (!_dragging) {
69
+ return;
70
+ }
71
+ e.stopImmediatePropagation();
72
+
73
+ var end = _grid.getCellFromPoint(
74
+ e.pageX - $(_canvas).offset().left,
75
+ e.pageY - $(_canvas).offset().top);
76
+
77
+ if (!_grid.canCellBeSelected(end.row, end.cell)) {
78
+ return;
79
+ }
80
+
81
+ dd.range.end = end;
82
+ _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
83
+ }
84
+
85
+ function handleDragEnd(e, dd) {
86
+ if (!_dragging) {
87
+ return;
88
+ }
89
+
90
+ _dragging = false;
91
+ e.stopImmediatePropagation();
92
+
93
+ _decorator.hide();
94
+ _self.onCellRangeSelected.notify({
95
+ range: new Slick.Range(
96
+ dd.range.start.row,
97
+ dd.range.start.cell,
98
+ dd.range.end.row,
99
+ dd.range.end.cell
100
+ )
101
+ });
102
+ }
103
+
104
+ $.extend(this, {
105
+ "init": init,
106
+ "destroy": destroy,
107
+
108
+ "onBeforeCellRangeSelected": new Slick.Event(),
109
+ "onCellRangeSelected": new Slick.Event()
110
+ });
111
+ }
112
+ })(jQuery);