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,517 @@
1
+ /***
2
+ * Contains basic SlickGrid editors.
3
+ * @module Editors
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(['jquery'], factory);
12
+ } else {
13
+ // Browser globals
14
+ root.Slick.Editors = factory(root.jQuery);
15
+ }
16
+ }(this, function ($) {
17
+ function TextEditor(args) {
18
+ var $input;
19
+ var defaultValue;
20
+ var scope = this;
21
+
22
+ this.init = function () {
23
+ $input = $("<INPUT type=text class='editor-text' />")
24
+ .appendTo(args.container)
25
+ .bind("keydown.nav", function (e) {
26
+ if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
27
+ e.stopImmediatePropagation();
28
+ }
29
+ })
30
+ .focus()
31
+ .select();
32
+ };
33
+
34
+ this.destroy = function () {
35
+ $input.remove();
36
+ };
37
+
38
+ this.focus = function () {
39
+ $input.focus();
40
+ };
41
+
42
+ this.getValue = function () {
43
+ return $input.val();
44
+ };
45
+
46
+ this.setValue = function (val) {
47
+ $input.val(val);
48
+ };
49
+
50
+ this.loadValue = function (item) {
51
+ defaultValue = item[args.column.field] || "";
52
+ $input.val(defaultValue);
53
+ $input[0].defaultValue = defaultValue;
54
+ $input.select();
55
+ };
56
+
57
+ this.serializeValue = function () {
58
+ return $input.val();
59
+ };
60
+
61
+ this.applyValue = function (item, state) {
62
+ item[args.column.field] = state;
63
+ };
64
+
65
+ this.isValueChanged = function () {
66
+ return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
67
+ };
68
+
69
+ this.validate = function () {
70
+ if (args.column.validator) {
71
+ var validationResults = args.column.validator($input.val());
72
+ if (!validationResults.valid) {
73
+ return validationResults;
74
+ }
75
+ }
76
+
77
+ return {
78
+ valid: true,
79
+ msg: null
80
+ };
81
+ };
82
+
83
+ this.init();
84
+ }
85
+
86
+ function IntegerEditor(args) {
87
+ var $input;
88
+ var defaultValue;
89
+ var scope = this;
90
+
91
+ this.init = function () {
92
+ $input = $("<INPUT type=text class='editor-text' />");
93
+
94
+ $input.bind("keydown.nav", function (e) {
95
+ if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
96
+ e.stopImmediatePropagation();
97
+ }
98
+ });
99
+
100
+ $input.appendTo(args.container);
101
+ $input.focus().select();
102
+ };
103
+
104
+ this.destroy = function () {
105
+ $input.remove();
106
+ };
107
+
108
+ this.focus = function () {
109
+ $input.focus();
110
+ };
111
+
112
+ this.loadValue = function (item) {
113
+ defaultValue = item[args.column.field];
114
+ $input.val(defaultValue);
115
+ $input[0].defaultValue = defaultValue;
116
+ $input.select();
117
+ };
118
+
119
+ this.serializeValue = function () {
120
+ return parseInt($input.val(), 10) || 0;
121
+ };
122
+
123
+ this.applyValue = function (item, state) {
124
+ item[args.column.field] = state;
125
+ };
126
+
127
+ this.isValueChanged = function () {
128
+ return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
129
+ };
130
+
131
+ this.validate = function () {
132
+ if (isNaN($input.val())) {
133
+ return {
134
+ valid: false,
135
+ msg: "Please enter a valid integer"
136
+ };
137
+ }
138
+
139
+ return {
140
+ valid: true,
141
+ msg: null
142
+ };
143
+ };
144
+
145
+ this.init();
146
+ }
147
+
148
+ function DateEditor(args) {
149
+ var $input;
150
+ var defaultValue;
151
+ var scope = this;
152
+ var calendarOpen = false;
153
+
154
+ this.init = function () {
155
+ $input = $("<INPUT type=text class='editor-text' />");
156
+ $input.appendTo(args.container);
157
+ $input.focus().select();
158
+ $input.datepicker({
159
+ showOn: "button",
160
+ buttonImageOnly: true,
161
+ buttonImage: "../images/calendar.gif",
162
+ beforeShow: function () {
163
+ calendarOpen = true
164
+ },
165
+ onClose: function () {
166
+ calendarOpen = false
167
+ }
168
+ });
169
+ $input.width($input.width() - 18);
170
+ };
171
+
172
+ this.destroy = function () {
173
+ $.datepicker.dpDiv.stop(true, true);
174
+ $input.datepicker("hide");
175
+ $input.datepicker("destroy");
176
+ $input.remove();
177
+ };
178
+
179
+ this.show = function () {
180
+ if (calendarOpen) {
181
+ $.datepicker.dpDiv.stop(true, true).show();
182
+ }
183
+ };
184
+
185
+ this.hide = function () {
186
+ if (calendarOpen) {
187
+ $.datepicker.dpDiv.stop(true, true).hide();
188
+ }
189
+ };
190
+
191
+ this.position = function (position) {
192
+ if (!calendarOpen) {
193
+ return;
194
+ }
195
+ $.datepicker.dpDiv
196
+ .css("top", position.top + 30)
197
+ .css("left", position.left);
198
+ };
199
+
200
+ this.focus = function () {
201
+ $input.focus();
202
+ };
203
+
204
+ this.loadValue = function (item) {
205
+ defaultValue = item[args.column.field];
206
+ $input.val(defaultValue);
207
+ $input[0].defaultValue = defaultValue;
208
+ $input.select();
209
+ };
210
+
211
+ this.serializeValue = function () {
212
+ return $input.val();
213
+ };
214
+
215
+ this.applyValue = function (item, state) {
216
+ item[args.column.field] = state;
217
+ };
218
+
219
+ this.isValueChanged = function () {
220
+ return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
221
+ };
222
+
223
+ this.validate = function () {
224
+ return {
225
+ valid: true,
226
+ msg: null
227
+ };
228
+ };
229
+
230
+ this.init();
231
+ }
232
+
233
+ function YesNoSelectEditor(args) {
234
+ var $select;
235
+ var defaultValue;
236
+ var scope = this;
237
+
238
+ this.init = function () {
239
+ $select = $("<SELECT tabIndex='0' class='editor-yesno'><OPTION value='yes'>Yes</OPTION><OPTION value='no'>No</OPTION></SELECT>");
240
+ $select.appendTo(args.container);
241
+ $select.focus();
242
+ };
243
+
244
+ this.destroy = function () {
245
+ $select.remove();
246
+ };
247
+
248
+ this.focus = function () {
249
+ $select.focus();
250
+ };
251
+
252
+ this.loadValue = function (item) {
253
+ $select.val((defaultValue = item[args.column.field]) ? "yes" : "no");
254
+ $select.select();
255
+ };
256
+
257
+ this.serializeValue = function () {
258
+ return ($select.val() == "yes");
259
+ };
260
+
261
+ this.applyValue = function (item, state) {
262
+ item[args.column.field] = state;
263
+ };
264
+
265
+ this.isValueChanged = function () {
266
+ return ($select.val() != defaultValue);
267
+ };
268
+
269
+ this.validate = function () {
270
+ return {
271
+ valid: true,
272
+ msg: null
273
+ };
274
+ };
275
+
276
+ this.init();
277
+ }
278
+
279
+ function CheckboxEditor(args) {
280
+ var $select;
281
+ var defaultValue;
282
+ var scope = this;
283
+
284
+ this.init = function () {
285
+ $select = $("<INPUT type=checkbox value='true' class='editor-checkbox' hideFocus>");
286
+ $select.appendTo(args.container);
287
+ $select.focus();
288
+ };
289
+
290
+ this.destroy = function () {
291
+ $select.remove();
292
+ };
293
+
294
+ this.focus = function () {
295
+ $select.focus();
296
+ };
297
+
298
+ this.loadValue = function (item) {
299
+ defaultValue = !!item[args.column.field];
300
+ if (defaultValue) {
301
+ $select.attr("checked", "checked");
302
+ } else {
303
+ $select.removeAttr("checked");
304
+ }
305
+ };
306
+
307
+ this.serializeValue = function () {
308
+ return !!$select.attr("checked");
309
+ };
310
+
311
+ this.applyValue = function (item, state) {
312
+ item[args.column.field] = state;
313
+ };
314
+
315
+ this.isValueChanged = function () {
316
+ return (this.serializeValue() !== defaultValue);
317
+ };
318
+
319
+ this.validate = function () {
320
+ return {
321
+ valid: true,
322
+ msg: null
323
+ };
324
+ };
325
+
326
+ this.init();
327
+ }
328
+
329
+ function PercentCompleteEditor(args) {
330
+ var $input, $picker;
331
+ var defaultValue;
332
+ var scope = this;
333
+
334
+ this.init = function () {
335
+ $input = $("<INPUT type=text class='editor-percentcomplete' />");
336
+ $input.width($(args.container).innerWidth() - 25);
337
+ $input.appendTo(args.container);
338
+
339
+ $picker = $("<div class='editor-percentcomplete-picker' />").appendTo(args.container);
340
+ $picker.append("<div class='editor-percentcomplete-helper'><div class='editor-percentcomplete-wrapper'><div class='editor-percentcomplete-slider' /><div class='editor-percentcomplete-buttons' /></div></div>");
341
+
342
+ $picker.find(".editor-percentcomplete-buttons").append("<button val=0>Not started</button><br/><button val=50>In Progress</button><br/><button val=100>Complete</button>");
343
+
344
+ $input.focus().select();
345
+
346
+ $picker.find(".editor-percentcomplete-slider").slider({
347
+ orientation: "vertical",
348
+ range: "min",
349
+ value: defaultValue,
350
+ slide: function (event, ui) {
351
+ $input.val(ui.value)
352
+ }
353
+ });
354
+
355
+ $picker.find(".editor-percentcomplete-buttons button").bind("click", function (e) {
356
+ $input.val($(this).attr("val"));
357
+ $picker.find(".editor-percentcomplete-slider").slider("value", $(this).attr("val"));
358
+ })
359
+ };
360
+
361
+ this.destroy = function () {
362
+ $input.remove();
363
+ $picker.remove();
364
+ };
365
+
366
+ this.focus = function () {
367
+ $input.focus();
368
+ };
369
+
370
+ this.loadValue = function (item) {
371
+ $input.val(defaultValue = item[args.column.field]);
372
+ $input.select();
373
+ };
374
+
375
+ this.serializeValue = function () {
376
+ return parseInt($input.val(), 10) || 0;
377
+ };
378
+
379
+ this.applyValue = function (item, state) {
380
+ item[args.column.field] = state;
381
+ };
382
+
383
+ this.isValueChanged = function () {
384
+ return (!($input.val() == "" && defaultValue == null)) && ((parseInt($input.val(), 10) || 0) != defaultValue);
385
+ };
386
+
387
+ this.validate = function () {
388
+ if (isNaN(parseInt($input.val(), 10))) {
389
+ return {
390
+ valid: false,
391
+ msg: "Please enter a valid positive number"
392
+ };
393
+ }
394
+
395
+ return {
396
+ valid: true,
397
+ msg: null
398
+ };
399
+ };
400
+
401
+ this.init();
402
+ }
403
+
404
+ /*
405
+ * An example of a "detached" editor.
406
+ * The UI is added onto document BODY and .position(), .show() and .hide() are implemented.
407
+ * KeyDown events are also handled to provide handling for Tab, Shift-Tab, Esc and Ctrl-Enter.
408
+ */
409
+ function LongTextEditor(args) {
410
+ var $input, $wrapper;
411
+ var defaultValue;
412
+ var scope = this;
413
+
414
+ this.init = function () {
415
+ var $container = $("body");
416
+
417
+ $wrapper = $("<DIV style='z-index:10000;position:absolute;background:white;padding:5px;border:3px solid gray; -moz-border-radius:10px; border-radius:10px;'/>")
418
+ .appendTo($container);
419
+
420
+ $input = $("<TEXTAREA hidefocus rows=5 style='backround:white;width:250px;height:80px;border:0;outline:0'>")
421
+ .appendTo($wrapper);
422
+
423
+ $("<DIV style='text-align:right'><BUTTON>Save</BUTTON><BUTTON>Cancel</BUTTON></DIV>")
424
+ .appendTo($wrapper);
425
+
426
+ $wrapper.find("button:first").bind("click", this.save);
427
+ $wrapper.find("button:last").bind("click", this.cancel);
428
+ $input.bind("keydown", this.handleKeyDown);
429
+
430
+ scope.position(args.position);
431
+ $input.focus().select();
432
+ };
433
+
434
+ this.handleKeyDown = function (e) {
435
+ if (e.which == $.ui.keyCode.ENTER && e.ctrlKey) {
436
+ scope.save();
437
+ } else if (e.which == $.ui.keyCode.ESCAPE) {
438
+ e.preventDefault();
439
+ scope.cancel();
440
+ } else if (e.which == $.ui.keyCode.TAB && e.shiftKey) {
441
+ e.preventDefault();
442
+ args.grid.navigatePrev();
443
+ } else if (e.which == $.ui.keyCode.TAB) {
444
+ e.preventDefault();
445
+ args.grid.navigateNext();
446
+ }
447
+ };
448
+
449
+ this.save = function () {
450
+ args.commitChanges();
451
+ };
452
+
453
+ this.cancel = function () {
454
+ $input.val(defaultValue);
455
+ args.cancelChanges();
456
+ };
457
+
458
+ this.hide = function () {
459
+ $wrapper.hide();
460
+ };
461
+
462
+ this.show = function () {
463
+ $wrapper.show();
464
+ };
465
+
466
+ this.position = function (position) {
467
+ $wrapper
468
+ .css("top", position.top - 5)
469
+ .css("left", position.left - 5)
470
+ };
471
+
472
+ this.destroy = function () {
473
+ $wrapper.remove();
474
+ };
475
+
476
+ this.focus = function () {
477
+ $input.focus();
478
+ };
479
+
480
+ this.loadValue = function (item) {
481
+ $input.val(defaultValue = item[args.column.field]);
482
+ $input.select();
483
+ };
484
+
485
+ this.serializeValue = function () {
486
+ return $input.val();
487
+ };
488
+
489
+ this.applyValue = function (item, state) {
490
+ item[args.column.field] = state;
491
+ };
492
+
493
+ this.isValueChanged = function () {
494
+ return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
495
+ };
496
+
497
+ this.validate = function () {
498
+ return {
499
+ valid: true,
500
+ msg: null
501
+ };
502
+ };
503
+
504
+ this.init();
505
+ }
506
+
507
+ return {
508
+ "Text": TextEditor,
509
+ "Integer": IntegerEditor,
510
+ "Date": DateEditor,
511
+ "YesNoSelect": YesNoSelectEditor,
512
+ "Checkbox": CheckboxEditor,
513
+ "PercentComplete": PercentCompleteEditor,
514
+ "LongText": LongTextEditor
515
+ };
516
+
517
+ }));