slickgrid-requirejs-rails 1.0.0

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.
Files changed (189) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +5 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/stylesheets/slickgrid-requirejs-rails/application.css +13 -0
  5. data/app/controllers/slickgrid-requirejs-rails/application_controller.rb +4 -0
  6. data/app/helpers/slickgrid-requirejs-rails/application_helper.rb +4 -0
  7. data/app/views/layouts/slickgrid-requirejs-rails/application.html.erb +14 -0
  8. data/config/routes.rb +2 -0
  9. data/lib/slickgrid-requirejs-rails.rb +4 -0
  10. data/lib/slickgrid-requirejs-rails/engine.rb +5 -0
  11. data/lib/slickgrid-requirejs-rails/version.rb +3 -0
  12. data/lib/tasks/slickgrid-requirejs-rails_tasks.rake +35 -0
  13. data/test/dummy/README.rdoc +261 -0
  14. data/test/dummy/Rakefile +7 -0
  15. data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js +4 -0
  16. data/test/dummy/app/assets/javascripts/application.js.coffee +33 -0
  17. data/test/dummy/app/assets/javascripts/jquery.spreadsheet.js.coffee +105 -0
  18. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  19. data/test/dummy/app/assets/stylesheets/examples.css +4 -0
  20. data/test/dummy/app/controllers/application_controller.rb +3 -0
  21. data/test/dummy/app/controllers/examples_controller.rb +4 -0
  22. data/test/dummy/app/helpers/application_helper.rb +2 -0
  23. data/test/dummy/app/helpers/examples_helper.rb +2 -0
  24. data/test/dummy/app/views/examples/simple.html.erb +7 -0
  25. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  26. data/test/dummy/config.ru +4 -0
  27. data/test/dummy/config/application.rb +60 -0
  28. data/test/dummy/config/boot.rb +10 -0
  29. data/test/dummy/config/database.yml +25 -0
  30. data/test/dummy/config/environment.rb +5 -0
  31. data/test/dummy/config/environments/development.rb +37 -0
  32. data/test/dummy/config/environments/production.rb +67 -0
  33. data/test/dummy/config/environments/test.rb +37 -0
  34. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/test/dummy/config/initializers/better_errors.rb +1 -0
  36. data/test/dummy/config/initializers/inflections.rb +15 -0
  37. data/test/dummy/config/initializers/mime_types.rb +5 -0
  38. data/test/dummy/config/initializers/secret_token.rb +7 -0
  39. data/test/dummy/config/initializers/session_store.rb +8 -0
  40. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  41. data/test/dummy/config/locales/en.yml +5 -0
  42. data/test/dummy/config/requirejs.yml +13 -0
  43. data/test/dummy/config/routes.rb +8 -0
  44. data/test/dummy/db/development.sqlite3 +0 -0
  45. data/test/dummy/log/development.log +2689 -0
  46. data/test/dummy/public/404.html +26 -0
  47. data/test/dummy/public/422.html +26 -0
  48. data/test/dummy/public/500.html +25 -0
  49. data/test/dummy/public/favicon.ico +0 -0
  50. data/test/dummy/script/rails +6 -0
  51. data/test/dummy/test/functional/examples_controller_test.rb +9 -0
  52. data/test/dummy/test/unit/helpers/examples_helper_test.rb +4 -0
  53. data/test/dummy/tmp/cache/assets/C27/240/sprockets%2Fc8d5e87e720ed4622105328524983048 +0 -0
  54. data/test/dummy/tmp/cache/assets/C42/A50/sprockets%2Fd83155902707b71eb877b3e0208205a0 +0 -0
  55. data/test/dummy/tmp/cache/assets/C80/150/sprockets%2F0d3881005b0646df783d5c24683d34f5 +0 -0
  56. data/test/dummy/tmp/cache/assets/C86/850/sprockets%2F75355848fa7b7065acb91b2634b29085 +0 -0
  57. data/test/dummy/tmp/cache/assets/C94/2C0/sprockets%2Fb5279968d5df8680a33776e0b74a8216 +0 -0
  58. data/test/dummy/tmp/cache/assets/CA9/390/sprockets%2F1891532332d1ff2d2ec0c4884168be24 +0 -0
  59. data/test/dummy/tmp/cache/assets/CB0/3D0/sprockets%2F378c2bc8804c6452508a5905c47b38ca +0 -0
  60. data/test/dummy/tmp/cache/assets/CB4/7D0/sprockets%2F1dc73f77b8d81bbc4a23579054295723 +0 -0
  61. data/test/dummy/tmp/cache/assets/CB7/EB0/sprockets%2F4de19cf2920983cc7502b38a537849a3 +0 -0
  62. data/test/dummy/tmp/cache/assets/CBA/210/sprockets%2F9cb316b6777b84fc332524911d7e645e +0 -0
  63. data/test/dummy/tmp/cache/assets/CBD/8E0/sprockets%2F5b5f989386cc9495a08127dbc42b3615 +0 -0
  64. data/test/dummy/tmp/cache/assets/CCA/480/sprockets%2F6d10d00d7c82276924f3e22e6210fa0b +0 -0
  65. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  66. data/test/dummy/tmp/cache/assets/CDC/260/sprockets%2F6b925351de71c9bd9c021310669dfc70 +0 -0
  67. data/test/dummy/tmp/cache/assets/CDE/090/sprockets%2F15056f2ede4e042d8737f4801fa6b157 +0 -0
  68. data/test/dummy/tmp/cache/assets/CE4/AC0/sprockets%2Fe1db88f51455f23258896cb316e52bc1 +0 -0
  69. data/test/dummy/tmp/cache/assets/CF0/B10/sprockets%2Fb50252ad18b893dc145ef2896e38d689 +0 -0
  70. data/test/dummy/tmp/cache/assets/CF1/750/sprockets%2F8c683caf79c53642dd4e12a89c657355 +0 -0
  71. data/test/dummy/tmp/cache/assets/CF4/130/sprockets%2F2e2ec908b79eb4084c57c7c9632899a2 +0 -0
  72. data/test/dummy/tmp/cache/assets/D01/E90/sprockets%2Ffd358252a8aa0b738f61a75ea81b0134 +0 -0
  73. data/test/dummy/tmp/cache/assets/D09/F30/sprockets%2F330e6425d10d2cb797c3f45ca374b84e +0 -0
  74. data/test/dummy/tmp/cache/assets/D0B/C60/sprockets%2F24182be4c99c8f971c1596aa452a2c0a +0 -0
  75. data/test/dummy/tmp/cache/assets/D1F/5D0/sprockets%2F9dba5447e453628c0bfa9137f85df278 +0 -0
  76. data/test/dummy/tmp/cache/assets/D29/260/sprockets%2F5a18f14fa7a839360315acb05b1e3bf0 +0 -0
  77. data/test/dummy/tmp/cache/assets/D32/230/sprockets%2Fb34e03561a646fac533ce7d4b560c2b8 +0 -0
  78. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  79. data/test/dummy/tmp/cache/assets/D3F/200/sprockets%2F8acb8521e88321b224d6bbf338d398cc +0 -0
  80. data/test/dummy/tmp/cache/assets/D3F/980/sprockets%2F1e2991c760ec4319a1fe5b94bc2ef633 +0 -0
  81. data/test/dummy/tmp/cache/assets/D48/090/sprockets%2F6d95fa4274b968de1d414e21cf46ca85 +0 -0
  82. data/test/dummy/tmp/cache/assets/D4B/4D0/sprockets%2F6205d4779aae40ce1a9a086c46978fef +0 -0
  83. data/test/dummy/tmp/cache/assets/D4E/D00/sprockets%2F1a6846f0a837ae2524e2f9ec89e6ef43 +0 -0
  84. data/test/dummy/tmp/cache/assets/D54/730/sprockets%2F1202c3cd8b0271cc02327e88b0bfad5e +0 -0
  85. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  86. data/test/dummy/tmp/cache/assets/D5D/FF0/sprockets%2F9e1b9c655d94b7725c984f7ce6b8d6b3 +0 -0
  87. data/test/dummy/tmp/cache/assets/D64/0D0/sprockets%2Fbf47d6bc8fc84f8d8764c1f5955f1786 +0 -0
  88. data/test/dummy/tmp/cache/assets/D68/6C0/sprockets%2Fab07dab58b519282aeaf3ea945f46513 +0 -0
  89. data/test/dummy/tmp/cache/assets/D6A/EF0/sprockets%2F2eb65cc490ad96cc38604918b0caeb90 +0 -0
  90. data/test/dummy/tmp/cache/assets/D71/9A0/sprockets%2F8fe2ebb722d62d1fdd63068c57a6408d +0 -0
  91. data/test/dummy/tmp/cache/assets/D77/210/sprockets%2F6586fb2ab2cc992e642e53e4cc3e2e85 +0 -0
  92. data/test/dummy/tmp/cache/assets/D84/460/sprockets%2Fed41cc36973e3e16cce4f876be7297b8 +0 -0
  93. data/test/dummy/tmp/cache/assets/D86/600/sprockets%2Ff9be8df0f5835948b646a94b47cd23cf +0 -0
  94. data/test/dummy/tmp/cache/assets/D95/530/sprockets%2F0cbcab75dec40d0e637629a484beb653 +0 -0
  95. data/test/dummy/tmp/cache/assets/D98/070/sprockets%2F4c95e212d3de047f6ac4f2fe09c40de2 +0 -0
  96. data/test/dummy/tmp/cache/assets/D98/270/sprockets%2F0e7c025e3de60b80a6c5e5fcc7db6832 +0 -0
  97. data/test/dummy/tmp/cache/assets/D9C/520/sprockets%2Ffc5383ee26303f5906ad273a3fe5dcea +0 -0
  98. data/test/dummy/tmp/cache/assets/D9F/9B0/sprockets%2Ff4b8b3465acc5f71633cf0af5858c4ac +0 -0
  99. data/test/dummy/tmp/cache/assets/DA1/EB0/sprockets%2F2d2f2f5ed3c476dea3c3a3d9e2980a85 +0 -0
  100. data/test/dummy/tmp/cache/assets/DA2/890/sprockets%2F1fd7028cdd4ff7c24e4a630c1f38af88 +0 -0
  101. data/test/dummy/tmp/cache/assets/DA3/080/sprockets%2Ffb77a66783db0b5812e3fdbabe4608f6 +0 -0
  102. data/test/dummy/tmp/cache/assets/DB2/E50/sprockets%2Ff337be9ae1863f27a87c882feae9ee21 +0 -0
  103. data/test/dummy/tmp/cache/assets/DC1/E70/sprockets%2F827c6100c3adc3c91ddfe84da51fbd15 +0 -0
  104. data/test/dummy/tmp/cache/assets/DCA/380/sprockets%2Fc0ccdcba1aa3b504045ebb1b2400b9d0 +0 -0
  105. data/test/dummy/tmp/cache/assets/DCA/EA0/sprockets%2F139ab8cdba6b44b58ae3647dbeea8145 +0 -0
  106. data/test/dummy/tmp/cache/assets/DEF/8E0/sprockets%2F3b4c400d4a5c7db0cd8d02b7e3cb79df +0 -0
  107. data/test/dummy/tmp/cache/assets/E0C/530/sprockets%2F0ce78cd1a399cdb66ca6cd2f93e93f8b +0 -0
  108. data/test/dummy/tmp/cache/assets/E11/4E0/sprockets%2F86e145a39f85cceeaffdff91ebb61449 +0 -0
  109. data/test/dummy/tmp/cache/assets/E15/B80/sprockets%2F68eff298c6dad0b39ddf0d61ccd9896d +0 -0
  110. data/test/dummy/tmp/cache/assets/E22/130/sprockets%2Fbeaa50ffc31b2c6a5625ce1a85efc38e +0 -0
  111. data/test/dummy/tmp/cache/assets/E2D/B60/sprockets%2F5aa2b493bf9c5b69eafecd96aa0af066 +0 -0
  112. data/test/dummy/tmp/cache/assets/E38/8F0/sprockets%2F1cb65daaffa8b6d886108e4eaf6d9bb9 +0 -0
  113. data/test/dummy/tmp/cache/assets/E66/810/sprockets%2F5de7ae60bfff07ae5fd98d19d9b1a4da +0 -0
  114. data/test/dummy/tmp/cache/sass/a27500b667404a158ab7c09449b801b001e64ed8/all.css.scssc +0 -0
  115. data/test/dummy/tmp/cache/sass/a27500b667404a158ab7c09449b801b001e64ed8/default-theme.css.scssc +0 -0
  116. data/test/dummy/tmp/cache/sass/a27500b667404a158ab7c09449b801b001e64ed8/editors.css.scssc +0 -0
  117. data/test/dummy/tmp/cache/sass/a27500b667404a158ab7c09449b801b001e64ed8/grid.css.scssc +0 -0
  118. data/test/integration/navigation_test.rb +10 -0
  119. data/test/slickgrid-requirejs-rails_test.rb +7 -0
  120. data/test/test_helper.rb +15 -0
  121. data/vendor/assets/images/slick/actions.gif +0 -0
  122. data/vendor/assets/images/slick/ajax-loader-small.gif +0 -0
  123. data/vendor/assets/images/slick/arrow_redo.png +0 -0
  124. data/vendor/assets/images/slick/arrow_right_peppermint.png +0 -0
  125. data/vendor/assets/images/slick/arrow_right_spearmint.png +0 -0
  126. data/vendor/assets/images/slick/arrow_undo.png +0 -0
  127. data/vendor/assets/images/slick/bullet_blue.png +0 -0
  128. data/vendor/assets/images/slick/bullet_star.png +0 -0
  129. data/vendor/assets/images/slick/bullet_toggle_minus.png +0 -0
  130. data/vendor/assets/images/slick/bullet_toggle_plus.png +0 -0
  131. data/vendor/assets/images/slick/calendar.gif +0 -0
  132. data/vendor/assets/images/slick/collapse.gif +0 -0
  133. data/vendor/assets/images/slick/comment_yellow.gif +0 -0
  134. data/vendor/assets/images/slick/down.gif +0 -0
  135. data/vendor/assets/images/slick/drag-handle.png +0 -0
  136. data/vendor/assets/images/slick/editor-helper-bg.gif +0 -0
  137. data/vendor/assets/images/slick/expand.gif +0 -0
  138. data/vendor/assets/images/slick/header-bg.gif +0 -0
  139. data/vendor/assets/images/slick/header-columns-bg.gif +0 -0
  140. data/vendor/assets/images/slick/header-columns-over-bg.gif +0 -0
  141. data/vendor/assets/images/slick/help.png +0 -0
  142. data/vendor/assets/images/slick/info.gif +0 -0
  143. data/vendor/assets/images/slick/listview.gif +0 -0
  144. data/vendor/assets/images/slick/pencil.gif +0 -0
  145. data/vendor/assets/images/slick/row-over-bg.gif +0 -0
  146. data/vendor/assets/images/slick/sort-asc.gif +0 -0
  147. data/vendor/assets/images/slick/sort-asc.png +0 -0
  148. data/vendor/assets/images/slick/sort-desc.gif +0 -0
  149. data/vendor/assets/images/slick/sort-desc.png +0 -0
  150. data/vendor/assets/images/slick/stripes.png +0 -0
  151. data/vendor/assets/images/slick/tag_red.png +0 -0
  152. data/vendor/assets/images/slick/tick.png +0 -0
  153. data/vendor/assets/images/slick/user_identity.gif +0 -0
  154. data/vendor/assets/images/slick/user_identity_plus.gif +0 -0
  155. data/vendor/assets/javascripts/jquery.event/drag.js +407 -0
  156. data/vendor/assets/javascripts/jquery.event/drop.js +303 -0
  157. data/vendor/assets/javascripts/slick/controls/slick.columnpicker.js +157 -0
  158. data/vendor/assets/javascripts/slick/controls/slick.pager.js +158 -0
  159. data/vendor/assets/javascripts/slick/plugins/slick.autotooltips.js +88 -0
  160. data/vendor/assets/javascripts/slick/plugins/slick.cellcopymanager.js +93 -0
  161. data/vendor/assets/javascripts/slick/plugins/slick.cellrangedecorator.js +69 -0
  162. data/vendor/assets/javascripts/slick/plugins/slick.cellrangeselector.js +118 -0
  163. data/vendor/assets/javascripts/slick/plugins/slick.cellselectionmodel.js +160 -0
  164. data/vendor/assets/javascripts/slick/plugins/slick.checkboxselectcolumn.js +158 -0
  165. data/vendor/assets/javascripts/slick/plugins/slick.headerbuttons.js +181 -0
  166. data/vendor/assets/javascripts/slick/plugins/slick.headermenu.js +278 -0
  167. data/vendor/assets/javascripts/slick/plugins/slick.rowmovemanager.js +144 -0
  168. data/vendor/assets/javascripts/slick/plugins/slick.rowselectionmodel.js +193 -0
  169. data/vendor/assets/javascripts/slick/slick.core.js +468 -0
  170. data/vendor/assets/javascripts/slick/slick.dataview.aggregators.js +121 -0
  171. data/vendor/assets/javascripts/slick/slick.dataview.js +1061 -0
  172. data/vendor/assets/javascripts/slick/slick.editors.js +517 -0
  173. data/vendor/assets/javascripts/slick/slick.formatters.js +65 -0
  174. data/vendor/assets/javascripts/slick/slick.grid.js +3317 -0
  175. data/vendor/assets/javascripts/slick/slick.groupitemmetadataprovider.js +149 -0
  176. data/vendor/assets/javascripts/slick/slick.remotemodel.js +185 -0
  177. data/vendor/assets/stylesheets/slick/all.css.scss +3 -0
  178. data/vendor/assets/stylesheets/slick/controls/columnpicker.css.scss +30 -0
  179. data/vendor/assets/stylesheets/slick/controls/pager.css.scss +41 -0
  180. data/vendor/assets/stylesheets/slick/controls/slick.columnpicker.css +31 -0
  181. data/vendor/assets/stylesheets/slick/controls/slick.pager.css +41 -0
  182. data/vendor/assets/stylesheets/slick/default-theme.css.scss +104 -0
  183. data/vendor/assets/stylesheets/slick/editors.css.scss +100 -0
  184. data/vendor/assets/stylesheets/slick/grid.css.scss +174 -0
  185. data/vendor/assets/stylesheets/slick/plugins/slick.headerbuttons.css +39 -0
  186. data/vendor/assets/stylesheets/slick/plugins/slick.headermenu.css +59 -0
  187. data/vendor/assets/stylesheets/slick/remotemodel.css.scss +20 -0
  188. data/vendor/assets/stylesheets/slick/slick.grid.css +157 -0
  189. metadata +524 -0
@@ -0,0 +1,160 @@
1
+ // Universal module definition
2
+ (function (root, factory) {
3
+ if (typeof define === 'function' && define.amd) {
4
+ // AMD. Register as an anonymous module.
5
+ define(['jquery', '../slick.core', './slick.cellrangeselector'], factory);
6
+ } else {
7
+ // Browser globals
8
+ root.Slick.CellSelectionModel = factory(root.jQuery, root.Slick, root.Slick.CellRangeSelector);
9
+ }
10
+ }(this, function ($, Slick, CellRangeSelector) {
11
+
12
+
13
+ function CellSelectionModel(options) {
14
+ var _grid;
15
+ var _canvas;
16
+ var _ranges = [];
17
+ var _self = this;
18
+ var _selector = new CellRangeSelector({
19
+ "selectionCss": {
20
+ "border": "2px solid black"
21
+ }
22
+ });
23
+ var _options;
24
+ var _defaults = {
25
+ selectActiveCell: true
26
+ };
27
+
28
+
29
+ function init(grid) {
30
+ _options = $.extend(true, {}, _defaults, options);
31
+ _grid = grid;
32
+ _canvas = _grid.getCanvasNode();
33
+ _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
34
+ _grid.onKeyDown.subscribe(handleKeyDown);
35
+ grid.registerPlugin(_selector);
36
+ _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
37
+ _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
38
+ }
39
+
40
+ function destroy() {
41
+ _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
42
+ _grid.onKeyDown.unsubscribe(handleKeyDown);
43
+ _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
44
+ _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
45
+ _grid.unregisterPlugin(_selector);
46
+ }
47
+
48
+ function removeInvalidRanges(ranges) {
49
+ var result = [];
50
+
51
+ for (var i = 0; i < ranges.length; i++) {
52
+ var r = ranges[i];
53
+ if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
54
+ result.push(r);
55
+ }
56
+ }
57
+
58
+ return result;
59
+ }
60
+
61
+ function setSelectedRanges(ranges) {
62
+ _ranges = removeInvalidRanges(ranges);
63
+ _self.onSelectedRangesChanged.notify(_ranges);
64
+ }
65
+
66
+ function getSelectedRanges() {
67
+ return _ranges;
68
+ }
69
+
70
+ function handleBeforeCellRangeSelected(e, args) {
71
+ if (_grid.getEditorLock().isActive()) {
72
+ e.stopPropagation();
73
+ return false;
74
+ }
75
+ }
76
+
77
+ function handleCellRangeSelected(e, args) {
78
+ setSelectedRanges([args.range]);
79
+ }
80
+
81
+ function handleActiveCellChange(e, args) {
82
+ if (_options.selectActiveCell && args.row != null && args.cell != null) {
83
+ setSelectedRanges([new Slick.Range(args.row, args.cell)]);
84
+ }
85
+ }
86
+
87
+ function handleKeyDown(e) {
88
+ /***
89
+ * Кey codes
90
+ * 37 left
91
+ * 38 up
92
+ * 39 right
93
+ * 40 down
94
+ */
95
+ var ranges, last;
96
+ var active = _grid.getActiveCell();
97
+
98
+ if ( active && e.shiftKey && !e.ctrlKey && !e.altKey &&
99
+ (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
100
+
101
+ ranges = getSelectedRanges();
102
+ if (!ranges.length)
103
+ ranges.push(new Slick.Range(active.row, active.cell));
104
+
105
+ // keyboard can work with last range only
106
+ last = ranges.pop();
107
+
108
+ // can't handle selection out of active cell
109
+ if (!last.contains(active.row, active.cell))
110
+ last = new Slick.Range(active.row, active.cell);
111
+
112
+ var dRow = last.toRow - last.fromRow,
113
+ dCell = last.toCell - last.fromCell,
114
+ // walking direction
115
+ dirRow = active.row == last.fromRow ? 1 : -1,
116
+ dirCell = active.cell == last.fromCell ? 1 : -1;
117
+
118
+ if (e.which == 37) {
119
+ dCell -= dirCell;
120
+ } else if (e.which == 39) {
121
+ dCell += dirCell ;
122
+ } else if (e.which == 38) {
123
+ dRow -= dirRow;
124
+ } else if (e.which == 40) {
125
+ dRow += dirRow;
126
+ }
127
+
128
+ // define new selection range
129
+ var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
130
+ if (removeInvalidRanges([new_last]).length) {
131
+ ranges.push(new_last);
132
+ var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;
133
+ var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;
134
+ _grid.scrollRowIntoView(viewRow);
135
+ _grid.scrollCellIntoView(viewRow, viewCell);
136
+ }
137
+ else
138
+ ranges.push(last);
139
+
140
+ setSelectedRanges(ranges);
141
+
142
+ e.preventDefault();
143
+ e.stopPropagation();
144
+ }
145
+ }
146
+
147
+ $.extend(this, {
148
+ "getSelectedRanges": getSelectedRanges,
149
+ "setSelectedRanges": setSelectedRanges,
150
+
151
+ "init": init,
152
+ "destroy": destroy,
153
+
154
+ "onSelectedRangesChanged": new Slick.Event()
155
+ });
156
+ }
157
+
158
+ return CellSelectionModel;
159
+
160
+ }));
@@ -0,0 +1,158 @@
1
+ // Universal module definition
2
+ (function (root, factory) {
3
+ if (typeof define === 'function' && define.amd) {
4
+ // AMD. Register as an anonymous module.
5
+ define(['jquery', '../slick.core'], factory);
6
+ } else {
7
+ // Browser globals
8
+ root.Slick.CheckboxSelectColumn = factory(root.jQuery, root.Slick);
9
+ }
10
+ }(this, function ($, Slick) {
11
+
12
+ function CheckboxSelectColumn(options) {
13
+ var _grid;
14
+ var _self = this;
15
+ var _handler = new Slick.EventHandler();
16
+ var _selectedRowsLookup = {};
17
+ var _defaults = {
18
+ columnId: "_checkbox_selector",
19
+ cssClass: null,
20
+ toolTip: "Select/Deselect All",
21
+ width: 30
22
+ };
23
+
24
+ var _options = $.extend(true, {}, _defaults, options);
25
+
26
+ function init(grid) {
27
+ _grid = grid;
28
+ _handler
29
+ .subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
30
+ .subscribe(_grid.onClick, handleClick)
31
+ .subscribe(_grid.onHeaderClick, handleHeaderClick)
32
+ .subscribe(_grid.onKeyDown, handleKeyDown);
33
+ }
34
+
35
+ function destroy() {
36
+ _handler.unsubscribeAll();
37
+ }
38
+
39
+ function handleSelectedRowsChanged(e, args) {
40
+ var selectedRows = _grid.getSelectedRows();
41
+ var lookup = {}, row, i;
42
+ for (i = 0; i < selectedRows.length; i++) {
43
+ row = selectedRows[i];
44
+ lookup[row] = true;
45
+ if (lookup[row] !== _selectedRowsLookup[row]) {
46
+ _grid.invalidateRow(row);
47
+ delete _selectedRowsLookup[row];
48
+ }
49
+ }
50
+ for (i in _selectedRowsLookup) {
51
+ _grid.invalidateRow(i);
52
+ }
53
+ _selectedRowsLookup = lookup;
54
+ _grid.render();
55
+
56
+ if (selectedRows.length && selectedRows.length == _grid.getDataLength()) {
57
+ _grid.updateColumnHeader(_options.columnId, "<input type='checkbox' checked='checked'>", _options.toolTip);
58
+ } else {
59
+ _grid.updateColumnHeader(_options.columnId, "<input type='checkbox'>", _options.toolTip);
60
+ }
61
+ }
62
+
63
+ function handleKeyDown(e, args) {
64
+ if (e.which == 32) {
65
+ if (_grid.getColumns()[args.cell].id === _options.columnId) {
66
+ // if editing, try to commit
67
+ if (!_grid.getEditorLock().isActive() || _grid.getEditorLock().commitCurrentEdit()) {
68
+ toggleRowSelection(args.row);
69
+ }
70
+ e.preventDefault();
71
+ e.stopImmediatePropagation();
72
+ }
73
+ }
74
+ }
75
+
76
+ function handleClick(e, args) {
77
+ // clicking on a row select checkbox
78
+ if (_grid.getColumns()[args.cell].id === _options.columnId && $(e.target).is(":checkbox")) {
79
+ // if editing, try to commit
80
+ if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
81
+ e.preventDefault();
82
+ e.stopImmediatePropagation();
83
+ return;
84
+ }
85
+
86
+ toggleRowSelection(args.row);
87
+ e.stopPropagation();
88
+ e.stopImmediatePropagation();
89
+ }
90
+ }
91
+
92
+ function toggleRowSelection(row) {
93
+ if (_selectedRowsLookup[row]) {
94
+ _grid.setSelectedRows($.grep(_grid.getSelectedRows(), function (n) {
95
+ return n != row
96
+ }));
97
+ } else {
98
+ _grid.setSelectedRows(_grid.getSelectedRows().concat(row));
99
+ }
100
+ }
101
+
102
+ function handleHeaderClick(e, args) {
103
+ if (args.column.id == _options.columnId && $(e.target).is(":checkbox")) {
104
+ // if editing, try to commit
105
+ if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
106
+ e.preventDefault();
107
+ e.stopImmediatePropagation();
108
+ return;
109
+ }
110
+
111
+ if ($(e.target).is(":checked")) {
112
+ var rows = [];
113
+ for (var i = 0; i < _grid.getDataLength(); i++) {
114
+ rows.push(i);
115
+ }
116
+ _grid.setSelectedRows(rows);
117
+ } else {
118
+ _grid.setSelectedRows([]);
119
+ }
120
+ e.stopPropagation();
121
+ e.stopImmediatePropagation();
122
+ }
123
+ }
124
+
125
+ function getColumnDefinition() {
126
+ return {
127
+ id: _options.columnId,
128
+ name: "<input type='checkbox'>",
129
+ toolTip: _options.toolTip,
130
+ field: "sel",
131
+ width: _options.width,
132
+ resizable: false,
133
+ sortable: false,
134
+ cssClass: _options.cssClass,
135
+ formatter: checkboxSelectionFormatter
136
+ };
137
+ }
138
+
139
+ function checkboxSelectionFormatter(row, cell, value, columnDef, dataContext) {
140
+ if (dataContext) {
141
+ return _selectedRowsLookup[row]
142
+ ? "<input type='checkbox' checked='checked'>"
143
+ : "<input type='checkbox'>";
144
+ }
145
+ return null;
146
+ }
147
+
148
+ $.extend(this, {
149
+ "init": init,
150
+ "destroy": destroy,
151
+
152
+ "getColumnDefinition": getColumnDefinition
153
+ });
154
+ }
155
+
156
+ return CheckboxSelectColumn;
157
+
158
+ }));
@@ -0,0 +1,181 @@
1
+ // Universal module definition
2
+ (function (root, factory) {
3
+ if (typeof define === 'function' && define.amd) {
4
+ // AMD. Register as an anonymous module.
5
+ define(['jquery', '../slick.core'], factory);
6
+ } else {
7
+ // Browser globals
8
+ root.Slick.Plugins = root.Slick.Plugins || {};
9
+ root.Slick.Plugins.HeaderButtons = factory(root.jQuery, root.Slick);
10
+ }
11
+ }(this, function ($, Slick) {
12
+
13
+ /***
14
+ * A plugin to add custom buttons to column headers.
15
+ *
16
+ * USAGE:
17
+ *
18
+ * Add the plugin .js & .css files and register it with the grid.
19
+ *
20
+ * To specify a custom button in a column header, extend the column definition like so:
21
+ *
22
+ * var columns = [
23
+ * {
24
+ * id: 'myColumn',
25
+ * name: 'My column',
26
+ *
27
+ * // This is the relevant part
28
+ * header: {
29
+ * buttons: [
30
+ * {
31
+ * // button options
32
+ * },
33
+ * {
34
+ * // button options
35
+ * }
36
+ * ]
37
+ * }
38
+ * }
39
+ * ];
40
+ *
41
+ * Available button options:
42
+ * cssClass: CSS class to add to the button.
43
+ * image: Relative button image path.
44
+ * tooltip: Button tooltip.
45
+ * showOnHover: Only show the button on hover.
46
+ * handler: Button click handler.
47
+ * command: A command identifier to be passed to the onCommand event handlers.
48
+ *
49
+ * The plugin exposes the following events:
50
+ * onCommand: Fired on button click for buttons with 'command' specified.
51
+ * Event args:
52
+ * grid: Reference to the grid.
53
+ * column: Column definition.
54
+ * command: Button command identified.
55
+ * button: Button options. Note that you can change the button options in your
56
+ * event handler, and the column header will be automatically updated to
57
+ * reflect them. This is useful if you want to implement something like a
58
+ * toggle button.
59
+ *
60
+ *
61
+ * @param options {Object} Options:
62
+ * buttonCssClass: a CSS class to use for buttons (default 'slick-header-button')
63
+ * @class Slick.Plugins.HeaderButtons
64
+ * @constructor
65
+ */
66
+ function HeaderButtons(options) {
67
+ var _grid;
68
+ var _self = this;
69
+ var _handler = new Slick.EventHandler();
70
+ var _defaults = {
71
+ buttonCssClass: "slick-header-button"
72
+ };
73
+
74
+
75
+ function init(grid) {
76
+ options = $.extend(true, {}, _defaults, options);
77
+ _grid = grid;
78
+ _handler
79
+ .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
80
+ .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
81
+
82
+ // Force the grid to re-render the header now that the events are hooked up.
83
+ _grid.setColumns(_grid.getColumns());
84
+ }
85
+
86
+
87
+ function destroy() {
88
+ _handler.unsubscribeAll();
89
+ }
90
+
91
+
92
+ function handleHeaderCellRendered(e, args) {
93
+ var column = args.column;
94
+
95
+ if (column.header && column.header.buttons) {
96
+ // Append buttons in reverse order since they are floated to the right.
97
+ var i = column.header.buttons.length;
98
+ while (i--) {
99
+ var button = column.header.buttons[i];
100
+ var btn = $("<div></div>")
101
+ .addClass(options.buttonCssClass)
102
+ .data("column", column)
103
+ .data("button", button);
104
+
105
+ if (button.showOnHover) {
106
+ btn.addClass("slick-header-button-hidden");
107
+ }
108
+
109
+ if (button.image) {
110
+ btn.css("backgroundImage", "url(" + button.image + ")");
111
+ }
112
+
113
+ if (button.cssClass) {
114
+ btn.addClass(button.cssClass);
115
+ }
116
+
117
+ if (button.tooltip) {
118
+ btn.attr("title", button.tooltip);
119
+ }
120
+
121
+ if (button.command) {
122
+ btn.data("command", button.command);
123
+ }
124
+
125
+ if (button.handler) {
126
+ btn.bind("click", button.handler);
127
+ }
128
+
129
+ btn
130
+ .bind("click", handleButtonClick)
131
+ .appendTo(args.node);
132
+ }
133
+ }
134
+ }
135
+
136
+
137
+ function handleBeforeHeaderCellDestroy(e, args) {
138
+ var column = args.column;
139
+
140
+ if (column.header && column.header.buttons) {
141
+ // Removing buttons via jQuery will also clean up any event handlers and data.
142
+ // NOTE: If you attach event handlers directly or using a different framework,
143
+ // you must also clean them up here to avoid memory leaks.
144
+ $(args.node).find("." + options.buttonCssClass).remove();
145
+ }
146
+ }
147
+
148
+
149
+ function handleButtonClick(e) {
150
+ var command = $(this).data("command");
151
+ var columnDef = $(this).data("column");
152
+ var button = $(this).data("button");
153
+
154
+ if (command != null) {
155
+ _self.onCommand.notify({
156
+ "grid": _grid,
157
+ "column": columnDef,
158
+ "command": command,
159
+ "button": button
160
+ }, e, _self);
161
+
162
+ // Update the header in case the user updated the button definition in the handler.
163
+ _grid.updateColumnHeader(columnDef.id);
164
+ }
165
+
166
+ // Stop propagation so that it doesn't register as a header click event.
167
+ e.preventDefault();
168
+ e.stopPropagation();
169
+ }
170
+
171
+ $.extend(this, {
172
+ "init": init,
173
+ "destroy": destroy,
174
+
175
+ "onCommand": new Slick.Event()
176
+ });
177
+ }
178
+
179
+ return HeaderButtons;
180
+
181
+ }));