slickgrid-requirejs-rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,468 @@
1
+ /***
2
+ * Contains core SlickGrid classes.
3
+ * @module Core
4
+ * @namespace Slick
5
+ */
6
+
7
+ // Universal module definition
8
+ (function (root, factory) {
9
+ if (typeof define === 'function' && define.amd) {
10
+ // AMD. Register as an anonymous module.
11
+ define(factory);
12
+ } else {
13
+ // Browser globals
14
+ root.Slick = factory();
15
+ }
16
+ }(this, function () {
17
+
18
+ // register namespace
19
+ var Slick = {
20
+ "Event": Event,
21
+ "EventData": EventData,
22
+ "EventHandler": EventHandler,
23
+ "Range": Range,
24
+ "NonDataRow": NonDataItem,
25
+ "Group": Group,
26
+ "GroupTotals": GroupTotals,
27
+ "EditorLock": EditorLock,
28
+
29
+ /***
30
+ * A global singleton editor lock.
31
+ * @class GlobalEditorLock
32
+ * @static
33
+ * @constructor
34
+ */
35
+ "GlobalEditorLock": new EditorLock()
36
+ };
37
+
38
+ /***
39
+ * An event object for passing data to event handlers and letting them control propagation.
40
+ * <p>This is pretty much identical to how W3C and jQuery implement events.</p>
41
+ * @class EventData
42
+ * @constructor
43
+ */
44
+ function EventData() {
45
+ var isPropagationStopped = false;
46
+ var isImmediatePropagationStopped = false;
47
+
48
+ /***
49
+ * Stops event from propagating up the DOM tree.
50
+ * @method stopPropagation
51
+ */
52
+ this.stopPropagation = function () {
53
+ isPropagationStopped = true;
54
+ };
55
+
56
+ /***
57
+ * Returns whether stopPropagation was called on this event object.
58
+ * @method isPropagationStopped
59
+ * @return {Boolean}
60
+ */
61
+ this.isPropagationStopped = function () {
62
+ return isPropagationStopped;
63
+ };
64
+
65
+ /***
66
+ * Prevents the rest of the handlers from being executed.
67
+ * @method stopImmediatePropagation
68
+ */
69
+ this.stopImmediatePropagation = function () {
70
+ isImmediatePropagationStopped = true;
71
+ };
72
+
73
+ /***
74
+ * Returns whether stopImmediatePropagation was called on this event object.\
75
+ * @method isImmediatePropagationStopped
76
+ * @return {Boolean}
77
+ */
78
+ this.isImmediatePropagationStopped = function () {
79
+ return isImmediatePropagationStopped;
80
+ }
81
+ }
82
+
83
+ /***
84
+ * A simple publisher-subscriber implementation.
85
+ * @class Event
86
+ * @constructor
87
+ */
88
+ function Event() {
89
+ var handlers = [];
90
+
91
+ /***
92
+ * Adds an event handler to be called when the event is fired.
93
+ * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>
94
+ * object the event was fired with.<p>
95
+ * @method subscribe
96
+ * @param fn {Function} Event handler.
97
+ */
98
+ this.subscribe = function (fn) {
99
+ handlers.push(fn);
100
+ };
101
+
102
+ /***
103
+ * Removes an event handler added with <code>subscribe(fn)</code>.
104
+ * @method unsubscribe
105
+ * @param fn {Function} Event handler to be removed.
106
+ */
107
+ this.unsubscribe = function (fn) {
108
+ for (var i = handlers.length - 1; i >= 0; i--) {
109
+ if (handlers[i] === fn) {
110
+ handlers.splice(i, 1);
111
+ }
112
+ }
113
+ };
114
+
115
+ /***
116
+ * Fires an event notifying all subscribers.
117
+ * @method notify
118
+ * @param args {Object} Additional data object to be passed to all handlers.
119
+ * @param e {EventData}
120
+ * Optional.
121
+ * An <code>EventData</code> object to be passed to all handlers.
122
+ * For DOM events, an existing W3C/jQuery event object can be passed in.
123
+ * @param scope {Object}
124
+ * Optional.
125
+ * The scope ("this") within which the handler will be executed.
126
+ * If not specified, the scope will be set to the <code>Event</code> instance.
127
+ */
128
+ this.notify = function (args, e, scope) {
129
+ e = e || new EventData();
130
+ scope = scope || this;
131
+
132
+ var returnValue;
133
+ for (var i = 0; i < handlers.length && !(e.isPropagationStopped() || e.isImmediatePropagationStopped()); i++) {
134
+ returnValue = handlers[i].call(scope, e, args);
135
+ }
136
+
137
+ return returnValue;
138
+ };
139
+ }
140
+
141
+ function EventHandler() {
142
+ var handlers = [];
143
+
144
+ this.subscribe = function (event, handler) {
145
+ handlers.push({
146
+ event: event,
147
+ handler: handler
148
+ });
149
+ event.subscribe(handler);
150
+
151
+ return this; // allow chaining
152
+ };
153
+
154
+ this.unsubscribe = function (event, handler) {
155
+ var i = handlers.length;
156
+ while (i--) {
157
+ if (handlers[i].event === event &&
158
+ handlers[i].handler === handler) {
159
+ handlers.splice(i, 1);
160
+ event.unsubscribe(handler);
161
+ return;
162
+ }
163
+ }
164
+
165
+ return this; // allow chaining
166
+ };
167
+
168
+ this.unsubscribeAll = function () {
169
+ var i = handlers.length;
170
+ while (i--) {
171
+ handlers[i].event.unsubscribe(handlers[i].handler);
172
+ }
173
+ handlers = [];
174
+
175
+ return this; // allow chaining
176
+ }
177
+ }
178
+
179
+ /***
180
+ * A structure containing a range of cells.
181
+ * @class Range
182
+ * @constructor
183
+ * @param fromRow {Integer} Starting row.
184
+ * @param fromCell {Integer} Starting cell.
185
+ * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.
186
+ * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.
187
+ */
188
+ function Range(fromRow, fromCell, toRow, toCell) {
189
+ if (toRow === undefined && toCell === undefined) {
190
+ toRow = fromRow;
191
+ toCell = fromCell;
192
+ }
193
+
194
+ /***
195
+ * @property fromRow
196
+ * @type {Integer}
197
+ */
198
+ this.fromRow = Math.min(fromRow, toRow);
199
+
200
+ /***
201
+ * @property fromCell
202
+ * @type {Integer}
203
+ */
204
+ this.fromCell = Math.min(fromCell, toCell);
205
+
206
+ /***
207
+ * @property toRow
208
+ * @type {Integer}
209
+ */
210
+ this.toRow = Math.max(fromRow, toRow);
211
+
212
+ /***
213
+ * @property toCell
214
+ * @type {Integer}
215
+ */
216
+ this.toCell = Math.max(fromCell, toCell);
217
+
218
+ /***
219
+ * Returns whether a range represents a single row.
220
+ * @method isSingleRow
221
+ * @return {Boolean}
222
+ */
223
+ this.isSingleRow = function () {
224
+ return this.fromRow == this.toRow;
225
+ };
226
+
227
+ /***
228
+ * Returns whether a range represents a single cell.
229
+ * @method isSingleCell
230
+ * @return {Boolean}
231
+ */
232
+ this.isSingleCell = function () {
233
+ return this.fromRow == this.toRow && this.fromCell == this.toCell;
234
+ };
235
+
236
+ /***
237
+ * Returns whether a range contains a given cell.
238
+ * @method contains
239
+ * @param row {Integer}
240
+ * @param cell {Integer}
241
+ * @return {Boolean}
242
+ */
243
+ this.contains = function (row, cell) {
244
+ return row >= this.fromRow && row <= this.toRow &&
245
+ cell >= this.fromCell && cell <= this.toCell;
246
+ };
247
+
248
+ /***
249
+ * Returns a readable representation of a range.
250
+ * @method toString
251
+ * @return {String}
252
+ */
253
+ this.toString = function () {
254
+ if (this.isSingleCell()) {
255
+ return "(" + this.fromRow + ":" + this.fromCell + ")";
256
+ }
257
+ else {
258
+ return "(" + this.fromRow + ":" + this.fromCell + " - " + this.toRow + ":" + this.toCell + ")";
259
+ }
260
+ }
261
+ }
262
+
263
+
264
+ /***
265
+ * A base class that all special / non-data rows (like Group and GroupTotals) derive from.
266
+ * @class NonDataItem
267
+ * @constructor
268
+ */
269
+ function NonDataItem() {
270
+ this.__nonDataRow = true;
271
+ }
272
+
273
+
274
+ /***
275
+ * Information about a group of rows.
276
+ * @class Group
277
+ * @extends Slick.NonDataItem
278
+ * @constructor
279
+ */
280
+ function Group() {
281
+ this.__group = true;
282
+
283
+ /**
284
+ * Grouping level, starting with 0.
285
+ * @property level
286
+ * @type {Number}
287
+ */
288
+ this.level = 0;
289
+
290
+ /***
291
+ * Number of rows in the group.
292
+ * @property count
293
+ * @type {Integer}
294
+ */
295
+ this.count = 0;
296
+
297
+ /***
298
+ * Grouping value.
299
+ * @property value
300
+ * @type {Object}
301
+ */
302
+ this.value = null;
303
+
304
+ /***
305
+ * Formatted display value of the group.
306
+ * @property title
307
+ * @type {String}
308
+ */
309
+ this.title = null;
310
+
311
+ /***
312
+ * Whether a group is collapsed.
313
+ * @property collapsed
314
+ * @type {Boolean}
315
+ */
316
+ this.collapsed = false;
317
+
318
+ /***
319
+ * GroupTotals, if any.
320
+ * @property totals
321
+ * @type {GroupTotals}
322
+ */
323
+ this.totals = null;
324
+
325
+ /**
326
+ * Rows that are part of the group.
327
+ * @property rows
328
+ * @type {Array}
329
+ */
330
+ this.rows = [];
331
+
332
+ /**
333
+ * Sub-groups that are part of the group.
334
+ * @property groups
335
+ * @type {Array}
336
+ */
337
+ this.groups = null;
338
+
339
+ /**
340
+ * A unique key used to identify the group. This key can be used in calls to DataView
341
+ * collapseGroup() or expandGroup().
342
+ * @property groupingKey
343
+ * @type {Object}
344
+ */
345
+ this.groupingKey = null;
346
+ }
347
+
348
+ Group.prototype = new NonDataItem();
349
+
350
+ /***
351
+ * Compares two Group instances.
352
+ * @method equals
353
+ * @return {Boolean}
354
+ * @param group {Group} Group instance to compare to.
355
+ */
356
+ Group.prototype.equals = function (group) {
357
+ return this.value === group.value &&
358
+ this.count === group.count &&
359
+ this.collapsed === group.collapsed;
360
+ };
361
+
362
+ /***
363
+ * Information about group totals.
364
+ * An instance of GroupTotals will be created for each totals row and passed to the aggregators
365
+ * so that they can store arbitrary data in it. That data can later be accessed by group totals
366
+ * formatters during the display.
367
+ * @class GroupTotals
368
+ * @extends Slick.NonDataItem
369
+ * @constructor
370
+ */
371
+ function GroupTotals() {
372
+ this.__groupTotals = true;
373
+
374
+ /***
375
+ * Parent Group.
376
+ * @param group
377
+ * @type {Group}
378
+ */
379
+ this.group = null;
380
+ }
381
+
382
+ GroupTotals.prototype = new NonDataItem();
383
+
384
+ /***
385
+ * A locking helper to track the active edit controller and ensure that only a single controller
386
+ * can be active at a time. This prevents a whole class of state and validation synchronization
387
+ * issues. An edit controller (such as SlickGrid) can query if an active edit is in progress
388
+ * and attempt a commit or cancel before proceeding.
389
+ * @class EditorLock
390
+ * @constructor
391
+ */
392
+ function EditorLock() {
393
+ var activeEditController = null;
394
+
395
+ /***
396
+ * Returns true if a specified edit controller is active (has the edit lock).
397
+ * If the parameter is not specified, returns true if any edit controller is active.
398
+ * @method isActive
399
+ * @param editController {EditController}
400
+ * @return {Boolean}
401
+ */
402
+ this.isActive = function (editController) {
403
+ return (editController ? activeEditController === editController : activeEditController !== null);
404
+ };
405
+
406
+ /***
407
+ * Sets the specified edit controller as the active edit controller (acquire edit lock).
408
+ * If another edit controller is already active, and exception will be thrown.
409
+ * @method activate
410
+ * @param editController {EditController} edit controller acquiring the lock
411
+ */
412
+ this.activate = function (editController) {
413
+ if (editController === activeEditController) { // already activated?
414
+ return;
415
+ }
416
+ if (activeEditController !== null) {
417
+ throw "SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController";
418
+ }
419
+ if (!editController.commitCurrentEdit) {
420
+ throw "SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()";
421
+ }
422
+ if (!editController.cancelCurrentEdit) {
423
+ throw "SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()";
424
+ }
425
+ activeEditController = editController;
426
+ };
427
+
428
+ /***
429
+ * Unsets the specified edit controller as the active edit controller (release edit lock).
430
+ * If the specified edit controller is not the active one, an exception will be thrown.
431
+ * @method deactivate
432
+ * @param editController {EditController} edit controller releasing the lock
433
+ */
434
+ this.deactivate = function (editController) {
435
+ if (activeEditController !== editController) {
436
+ throw "SlickGrid.EditorLock.deactivate: specified editController is not the currently active one";
437
+ }
438
+ activeEditController = null;
439
+ };
440
+
441
+ /***
442
+ * Attempts to commit the current edit by calling "commitCurrentEdit" method on the active edit
443
+ * controller and returns whether the commit attempt was successful (commit may fail due to validation
444
+ * errors, etc.). Edit controller's "commitCurrentEdit" must return true if the commit has succeeded
445
+ * and false otherwise. If no edit controller is active, returns true.
446
+ * @method commitCurrentEdit
447
+ * @return {Boolean}
448
+ */
449
+ this.commitCurrentEdit = function () {
450
+ return (activeEditController ? activeEditController.commitCurrentEdit() : true);
451
+ };
452
+
453
+ /***
454
+ * Attempts to cancel the current edit by calling "cancelCurrentEdit" method on the active edit
455
+ * controller and returns whether the edit was successfully cancelled. If no edit controller is
456
+ * active, returns true.
457
+ * @method cancelCurrentEdit
458
+ * @return {Boolean}
459
+ */
460
+ this.cancelCurrentEdit = function cancelCurrentEdit() {
461
+ return (activeEditController ? activeEditController.cancelCurrentEdit() : true);
462
+ };
463
+ }
464
+ return Slick;
465
+
466
+ }));
467
+
468
+