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,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
+