extjs-rails 4.1.0.alpha1

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 (517) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +36 -0
  4. data/README.md +29 -0
  5. data/Rakefile +2 -0
  6. data/app/assets/javascripts/extjs-rails/extjs-rails.js +1 -0
  7. data/app/assets/javascripts/extjs-rails/index.js.erb +9 -0
  8. data/app/assets/javascripts/extjs-rails/sdk.jsb3 +2017 -0
  9. data/app/assets/javascripts/extjs-rails/src/AbstractComponent.js +3290 -0
  10. data/app/assets/javascripts/extjs-rails/src/AbstractManager.js +144 -0
  11. data/app/assets/javascripts/extjs-rails/src/AbstractPlugin.js +72 -0
  12. data/app/assets/javascripts/extjs-rails/src/Action.js +276 -0
  13. data/app/assets/javascripts/extjs-rails/src/Ajax.js +99 -0
  14. data/app/assets/javascripts/extjs-rails/src/Component.js +1344 -0
  15. data/app/assets/javascripts/extjs-rails/src/ComponentLoader.js +202 -0
  16. data/app/assets/javascripts/extjs-rails/src/ComponentManager.js +47 -0
  17. data/app/assets/javascripts/extjs-rails/src/ComponentQuery.js +521 -0
  18. data/app/assets/javascripts/extjs-rails/src/Editor.js +494 -0
  19. data/app/assets/javascripts/extjs-rails/src/ElementLoader.js +404 -0
  20. data/app/assets/javascripts/extjs-rails/src/FocusManager.js +712 -0
  21. data/app/assets/javascripts/extjs-rails/src/Img.js +111 -0
  22. data/app/assets/javascripts/extjs-rails/src/Layer.js +543 -0
  23. data/app/assets/javascripts/extjs-rails/src/LoadMask.js +432 -0
  24. data/app/assets/javascripts/extjs-rails/src/ModelManager.js +186 -0
  25. data/app/assets/javascripts/extjs-rails/src/PluginManager.js +110 -0
  26. data/app/assets/javascripts/extjs-rails/src/ProgressBar.js +336 -0
  27. data/app/assets/javascripts/extjs-rails/src/Shadow.js +233 -0
  28. data/app/assets/javascripts/extjs-rails/src/ShadowPool.js +43 -0
  29. data/app/assets/javascripts/extjs-rails/src/Template.js +331 -0
  30. data/app/assets/javascripts/extjs-rails/src/XTemplate.js +365 -0
  31. data/app/assets/javascripts/extjs-rails/src/XTemplateCompiler.js +450 -0
  32. data/app/assets/javascripts/extjs-rails/src/XTemplateParser.js +249 -0
  33. data/app/assets/javascripts/extjs-rails/src/ZIndexManager.js +519 -0
  34. data/app/assets/javascripts/extjs-rails/src/app/Application.js +271 -0
  35. data/app/assets/javascripts/extjs-rails/src/app/Controller.js +458 -0
  36. data/app/assets/javascripts/extjs-rails/src/app/EventBus.js +112 -0
  37. data/app/assets/javascripts/extjs-rails/src/button/Button.js +1483 -0
  38. data/app/assets/javascripts/extjs-rails/src/button/Cycle.js +215 -0
  39. data/app/assets/javascripts/extjs-rails/src/button/Split.js +99 -0
  40. data/app/assets/javascripts/extjs-rails/src/chart/Callout.js +140 -0
  41. data/app/assets/javascripts/extjs-rails/src/chart/Chart.js +966 -0
  42. data/app/assets/javascripts/extjs-rails/src/chart/Highlight.js +172 -0
  43. data/app/assets/javascripts/extjs-rails/src/chart/Label.js +241 -0
  44. data/app/assets/javascripts/extjs-rails/src/chart/Legend.js +474 -0
  45. data/app/assets/javascripts/extjs-rails/src/chart/LegendItem.js +217 -0
  46. data/app/assets/javascripts/extjs-rails/src/chart/Mask.js +230 -0
  47. data/app/assets/javascripts/extjs-rails/src/chart/MaskLayer.js +48 -0
  48. data/app/assets/javascripts/extjs-rails/src/chart/Navigation.js +79 -0
  49. data/app/assets/javascripts/extjs-rails/src/chart/Shape.js +106 -0
  50. data/app/assets/javascripts/extjs-rails/src/chart/Tip.js +98 -0
  51. data/app/assets/javascripts/extjs-rails/src/chart/TipSurface.js +42 -0
  52. data/app/assets/javascripts/extjs-rails/src/chart/axis/Abstract.js +73 -0
  53. data/app/assets/javascripts/extjs-rails/src/chart/axis/Axis.js +961 -0
  54. data/app/assets/javascripts/extjs-rails/src/chart/axis/Category.js +130 -0
  55. data/app/assets/javascripts/extjs-rails/src/chart/axis/Gauge.js +203 -0
  56. data/app/assets/javascripts/extjs-rails/src/chart/axis/Numeric.js +235 -0
  57. data/app/assets/javascripts/extjs-rails/src/chart/axis/Radial.js +204 -0
  58. data/app/assets/javascripts/extjs-rails/src/chart/axis/Time.js +135 -0
  59. data/app/assets/javascripts/extjs-rails/src/chart/series/Area.js +803 -0
  60. data/app/assets/javascripts/extjs-rails/src/chart/series/Bar.js +853 -0
  61. data/app/assets/javascripts/extjs-rails/src/chart/series/Cartesian.js +328 -0
  62. data/app/assets/javascripts/extjs-rails/src/chart/series/Column.js +104 -0
  63. data/app/assets/javascripts/extjs-rails/src/chart/series/Gauge.js +490 -0
  64. data/app/assets/javascripts/extjs-rails/src/chart/series/Line.js +1104 -0
  65. data/app/assets/javascripts/extjs-rails/src/chart/series/Pie.js +1072 -0
  66. data/app/assets/javascripts/extjs-rails/src/chart/series/Radar.js +440 -0
  67. data/app/assets/javascripts/extjs-rails/src/chart/series/Scatter.js +668 -0
  68. data/app/assets/javascripts/extjs-rails/src/chart/series/Series.js +443 -0
  69. data/app/assets/javascripts/extjs-rails/src/chart/theme/Base.js +175 -0
  70. data/app/assets/javascripts/extjs-rails/src/chart/theme/Theme.js +253 -0
  71. data/app/assets/javascripts/extjs-rails/src/container/AbstractContainer.js +1062 -0
  72. data/app/assets/javascripts/extjs-rails/src/container/ButtonGroup.js +143 -0
  73. data/app/assets/javascripts/extjs-rails/src/container/Container.js +212 -0
  74. data/app/assets/javascripts/extjs-rails/src/container/DockingContainer.js +265 -0
  75. data/app/assets/javascripts/extjs-rails/src/container/Viewport.js +184 -0
  76. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.form.js +50 -0
  77. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.static-more.js +159 -0
  78. data/app/assets/javascripts/extjs-rails/src/core/examples/index.html +321 -0
  79. data/app/assets/javascripts/extjs-rails/src/core/examples/index.js +6 -0
  80. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CTO.js +25 -0
  81. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CoolGuy.js +20 -0
  82. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Developer.js +43 -0
  83. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Gun.js +3 -0
  84. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/HumanResource.js +23 -0
  85. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Musician.js +20 -0
  86. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Person.js +50 -0
  87. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanComposeSongs.js +9 -0
  88. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanPlayGuitar.js +9 -0
  89. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanSing.js +18 -0
  90. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/A.js +3 -0
  91. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/B.js +3 -0
  92. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/C.js +3 -0
  93. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/D.js +3 -0
  94. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/E.js +3 -0
  95. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/A.js +3 -0
  96. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/B.js +4 -0
  97. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/C.js +3 -0
  98. data/app/assets/javascripts/extjs-rails/src/core/src/EventManager.js +1167 -0
  99. data/app/assets/javascripts/extjs-rails/src/core/src/EventObject.js +883 -0
  100. data/app/assets/javascripts/extjs-rails/src/core/src/Ext-more.js +1283 -0
  101. data/app/assets/javascripts/extjs-rails/src/core/src/Ext.js +736 -0
  102. data/app/assets/javascripts/extjs-rails/src/core/src/Support.js +662 -0
  103. data/app/assets/javascripts/extjs-rails/src/core/src/class/Base.js +1085 -0
  104. data/app/assets/javascripts/extjs-rails/src/core/src/class/Class.js +676 -0
  105. data/app/assets/javascripts/extjs-rails/src/core/src/class/ClassManager.js +1591 -0
  106. data/app/assets/javascripts/extjs-rails/src/core/src/class/Loader.js +1423 -0
  107. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.alignment.js +173 -0
  108. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.insertion.js +193 -0
  109. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.js +681 -0
  110. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.position.js +356 -0
  111. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.static.js +474 -0
  112. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.style.js +851 -0
  113. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.traversal.js +180 -0
  114. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractHelper.js +291 -0
  115. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractQuery.js +72 -0
  116. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElement.js +75 -0
  117. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElementLite.js +436 -0
  118. data/app/assets/javascripts/extjs-rails/src/core/src/dom/DomQuery-aria.js +1049 -0
  119. data/app/assets/javascripts/extjs-rails/src/core/src/env/Browser.js +186 -0
  120. data/app/assets/javascripts/extjs-rails/src/core/src/env/FeatureDetector.js +274 -0
  121. data/app/assets/javascripts/extjs-rails/src/core/src/env/OS.js +141 -0
  122. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Array.js +1205 -0
  123. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Date.js +1463 -0
  124. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Error.js +326 -0
  125. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Function.js +485 -0
  126. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Number.js +175 -0
  127. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Object.js +606 -0
  128. data/app/assets/javascripts/extjs-rails/src/core/src/lang/String.js +333 -0
  129. data/app/assets/javascripts/extjs-rails/src/core/src/misc/JSON.js +236 -0
  130. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Accumulator.js +244 -0
  131. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Monitor.js +197 -0
  132. data/app/assets/javascripts/extjs-rails/src/core/src/util/DelayedTask.js +71 -0
  133. data/app/assets/javascripts/extjs-rails/src/core/src/util/Event.js +215 -0
  134. data/app/assets/javascripts/extjs-rails/src/core/src/util/Format.js +551 -0
  135. data/app/assets/javascripts/extjs-rails/src/core/src/util/TaskManager.js +417 -0
  136. data/app/assets/javascripts/extjs-rails/src/core/src/version/Version.js +364 -0
  137. data/app/assets/javascripts/extjs-rails/src/core/test/unit/README.MD +91 -0
  138. data/app/assets/javascripts/extjs-rails/src/core/test/unit/bootstrap.js +39 -0
  139. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build-data.js +34 -0
  140. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build.sh +2 -0
  141. data/app/assets/javascripts/extjs-rails/src/core/test/unit/data.js +27 -0
  142. data/app/assets/javascripts/extjs-rails/src/core/test/unit/index.html +15 -0
  143. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom.html +40 -0
  144. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/extjs-api.js +12 -0
  145. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/platform-api.js +134 -0
  146. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/sanity.js +4 -0
  147. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api-out.js +128 -0
  148. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api.js +89 -0
  149. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/env/Environment.js +357 -0
  150. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/APITest.js +37 -0
  151. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/jsb3.js +14 -0
  152. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/test-setup.js +137 -0
  153. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/EventManager.js +629 -0
  154. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-mess.backup +198 -0
  155. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-more.js +520 -0
  156. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext.js +1550 -0
  157. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Support.js +250 -0
  158. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Base.js +47 -0
  159. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Class.js +561 -0
  160. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/ClassManager.js +555 -0
  161. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/CompositeElementLite.js +409 -0
  162. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/DomHelper.js +444 -0
  163. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.insertion.js +342 -0
  164. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.js +731 -0
  165. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.static.js +201 -0
  166. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.style.js +118 -0
  167. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.traversal.js +336 -0
  168. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Array.js +1229 -0
  169. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Date.js +697 -0
  170. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Error.js +277 -0
  171. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Function.js +536 -0
  172. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Number.js +323 -0
  173. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Object.js +591 -0
  174. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/String.js +451 -0
  175. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/misc/JSON.js +252 -0
  176. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/util/Format.js +521 -0
  177. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/version/Version.js +148 -0
  178. data/app/assets/javascripts/extjs-rails/src/core/test/unit/specs.html +19 -0
  179. data/app/assets/javascripts/extjs-rails/src/data/AbstractStore.js +887 -0
  180. data/app/assets/javascripts/extjs-rails/src/data/ArrayStore.js +74 -0
  181. data/app/assets/javascripts/extjs-rails/src/data/Batch.js +236 -0
  182. data/app/assets/javascripts/extjs-rails/src/data/BufferStore.js +13 -0
  183. data/app/assets/javascripts/extjs-rails/src/data/Connection.js +969 -0
  184. data/app/assets/javascripts/extjs-rails/src/data/DirectStore.js +50 -0
  185. data/app/assets/javascripts/extjs-rails/src/data/Errors.js +52 -0
  186. data/app/assets/javascripts/extjs-rails/src/data/Field.js +341 -0
  187. data/app/assets/javascripts/extjs-rails/src/data/IdGenerator.js +198 -0
  188. data/app/assets/javascripts/extjs-rails/src/data/JsonP.js +253 -0
  189. data/app/assets/javascripts/extjs-rails/src/data/JsonPStore.js +51 -0
  190. data/app/assets/javascripts/extjs-rails/src/data/JsonStore.js +60 -0
  191. data/app/assets/javascripts/extjs-rails/src/data/Model.js +1673 -0
  192. data/app/assets/javascripts/extjs-rails/src/data/NodeInterface.js +1294 -0
  193. data/app/assets/javascripts/extjs-rails/src/data/NodeStore.js +254 -0
  194. data/app/assets/javascripts/extjs-rails/src/data/Operation.js +331 -0
  195. data/app/assets/javascripts/extjs-rails/src/data/Request.js +40 -0
  196. data/app/assets/javascripts/extjs-rails/src/data/ResultSet.js +56 -0
  197. data/app/assets/javascripts/extjs-rails/src/data/SequentialIdGenerator.js +61 -0
  198. data/app/assets/javascripts/extjs-rails/src/data/SortTypes.js +125 -0
  199. data/app/assets/javascripts/extjs-rails/src/data/Store.js +2609 -0
  200. data/app/assets/javascripts/extjs-rails/src/data/StoreManager.js +156 -0
  201. data/app/assets/javascripts/extjs-rails/src/data/Tree.js +290 -0
  202. data/app/assets/javascripts/extjs-rails/src/data/TreeStore.js +655 -0
  203. data/app/assets/javascripts/extjs-rails/src/data/Types.js +190 -0
  204. data/app/assets/javascripts/extjs-rails/src/data/UuidGenerator.js +215 -0
  205. data/app/assets/javascripts/extjs-rails/src/data/XmlStore.js +76 -0
  206. data/app/assets/javascripts/extjs-rails/src/data/association/Association.js +243 -0
  207. data/app/assets/javascripts/extjs-rails/src/data/association/BelongsTo.js +291 -0
  208. data/app/assets/javascripts/extjs-rails/src/data/association/HasMany.js +289 -0
  209. data/app/assets/javascripts/extjs-rails/src/data/association/HasOne.js +304 -0
  210. data/app/assets/javascripts/extjs-rails/src/data/proxy/Ajax.js +282 -0
  211. data/app/assets/javascripts/extjs-rails/src/data/proxy/Client.js +21 -0
  212. data/app/assets/javascripts/extjs-rails/src/data/proxy/Direct.js +181 -0
  213. data/app/assets/javascripts/extjs-rails/src/data/proxy/JsonP.js +313 -0
  214. data/app/assets/javascripts/extjs-rails/src/data/proxy/LocalStorage.js +69 -0
  215. data/app/assets/javascripts/extjs-rails/src/data/proxy/Memory.js +156 -0
  216. data/app/assets/javascripts/extjs-rails/src/data/proxy/Proxy.js +433 -0
  217. data/app/assets/javascripts/extjs-rails/src/data/proxy/Rest.js +173 -0
  218. data/app/assets/javascripts/extjs-rails/src/data/proxy/Server.js +460 -0
  219. data/app/assets/javascripts/extjs-rails/src/data/proxy/SessionStorage.js +39 -0
  220. data/app/assets/javascripts/extjs-rails/src/data/proxy/WebStorage.js +546 -0
  221. data/app/assets/javascripts/extjs-rails/src/data/reader/Array.js +68 -0
  222. data/app/assets/javascripts/extjs-rails/src/data/reader/Json.js +383 -0
  223. data/app/assets/javascripts/extjs-rails/src/data/reader/Reader.js +735 -0
  224. data/app/assets/javascripts/extjs-rails/src/data/reader/Xml.js +292 -0
  225. data/app/assets/javascripts/extjs-rails/src/data/validations.js +149 -0
  226. data/app/assets/javascripts/extjs-rails/src/data/writer/Json.js +81 -0
  227. data/app/assets/javascripts/extjs-rails/src/data/writer/Writer.js +147 -0
  228. data/app/assets/javascripts/extjs-rails/src/data/writer/Xml.js +88 -0
  229. data/app/assets/javascripts/extjs-rails/src/dd/DD.js +300 -0
  230. data/app/assets/javascripts/extjs-rails/src/dd/DDProxy.js +204 -0
  231. data/app/assets/javascripts/extjs-rails/src/dd/DDTarget.js +171 -0
  232. data/app/assets/javascripts/extjs-rails/src/dd/DragDrop.js +1101 -0
  233. data/app/assets/javascripts/extjs-rails/src/dd/DragDropManager.js +1264 -0
  234. data/app/assets/javascripts/extjs-rails/src/dd/DragSource.js +392 -0
  235. data/app/assets/javascripts/extjs-rails/src/dd/DragTracker.js +562 -0
  236. data/app/assets/javascripts/extjs-rails/src/dd/DragZone.js +137 -0
  237. data/app/assets/javascripts/extjs-rails/src/dd/DropTarget.js +118 -0
  238. data/app/assets/javascripts/extjs-rails/src/dd/DropZone.js +254 -0
  239. data/app/assets/javascripts/extjs-rails/src/dd/Registry.js +117 -0
  240. data/app/assets/javascripts/extjs-rails/src/dd/ScrollManager.js +218 -0
  241. data/app/assets/javascripts/extjs-rails/src/dd/StatusProxy.js +179 -0
  242. data/app/assets/javascripts/extjs-rails/src/diag/layout/Context.js +523 -0
  243. data/app/assets/javascripts/extjs-rails/src/diag/layout/ContextItem.js +179 -0
  244. data/app/assets/javascripts/extjs-rails/src/direct/Event.js +35 -0
  245. data/app/assets/javascripts/extjs-rails/src/direct/ExceptionEvent.js +16 -0
  246. data/app/assets/javascripts/extjs-rails/src/direct/JsonProvider.js +82 -0
  247. data/app/assets/javascripts/extjs-rails/src/direct/Manager.js +263 -0
  248. data/app/assets/javascripts/extjs-rails/src/direct/PollingProvider.js +156 -0
  249. data/app/assets/javascripts/extjs-rails/src/direct/Provider.js +96 -0
  250. data/app/assets/javascripts/extjs-rails/src/direct/RemotingEvent.js +24 -0
  251. data/app/assets/javascripts/extjs-rails/src/direct/RemotingMethod.js +100 -0
  252. data/app/assets/javascripts/extjs-rails/src/direct/RemotingProvider.js +510 -0
  253. data/app/assets/javascripts/extjs-rails/src/direct/Transaction.js +41 -0
  254. data/app/assets/javascripts/extjs-rails/src/dom/Element.alignment.js +378 -0
  255. data/app/assets/javascripts/extjs-rails/src/dom/Element.anim.js +962 -0
  256. data/app/assets/javascripts/extjs-rails/src/dom/Element.dd.js +40 -0
  257. data/app/assets/javascripts/extjs-rails/src/dom/Element.fx.js +194 -0
  258. data/app/assets/javascripts/extjs-rails/src/dom/Element.js +1407 -0
  259. data/app/assets/javascripts/extjs-rails/src/dom/Element.position.js +501 -0
  260. data/app/assets/javascripts/extjs-rails/src/dom/Element.scroll.js +214 -0
  261. data/app/assets/javascripts/extjs-rails/src/dom/Element.style.js +792 -0
  262. data/app/assets/javascripts/extjs-rails/src/dom/Element.traversal.js +8 -0
  263. data/app/assets/javascripts/extjs-rails/src/dom/Helper.js +466 -0
  264. data/app/assets/javascripts/extjs-rails/src/dom/Query.js +1067 -0
  265. data/app/assets/javascripts/extjs-rails/src/draw/Color.js +303 -0
  266. data/app/assets/javascripts/extjs-rails/src/draw/Component.js +245 -0
  267. data/app/assets/javascripts/extjs-rails/src/draw/CompositeSprite.js +299 -0
  268. data/app/assets/javascripts/extjs-rails/src/draw/Draw.js +1217 -0
  269. data/app/assets/javascripts/extjs-rails/src/draw/Matrix.js +183 -0
  270. data/app/assets/javascripts/extjs-rails/src/draw/Sprite.js +554 -0
  271. data/app/assets/javascripts/extjs-rails/src/draw/SpriteDD.js +87 -0
  272. data/app/assets/javascripts/extjs-rails/src/draw/Surface.js +1001 -0
  273. data/app/assets/javascripts/extjs-rails/src/draw/Text.js +175 -0
  274. data/app/assets/javascripts/extjs-rails/src/draw/engine/ImageExporter.js +106 -0
  275. data/app/assets/javascripts/extjs-rails/src/draw/engine/Svg.js +734 -0
  276. data/app/assets/javascripts/extjs-rails/src/draw/engine/SvgExporter.js +280 -0
  277. data/app/assets/javascripts/extjs-rails/src/draw/engine/Vml.js +916 -0
  278. data/app/assets/javascripts/extjs-rails/src/flash/Component.js +248 -0
  279. data/app/assets/javascripts/extjs-rails/src/form/Basic.js +1018 -0
  280. data/app/assets/javascripts/extjs-rails/src/form/CheckboxGroup.js +441 -0
  281. data/app/assets/javascripts/extjs-rails/src/form/CheckboxManager.js +26 -0
  282. data/app/assets/javascripts/extjs-rails/src/form/FieldAncestor.js +210 -0
  283. data/app/assets/javascripts/extjs-rails/src/form/FieldContainer.js +290 -0
  284. data/app/assets/javascripts/extjs-rails/src/form/FieldSet.js +506 -0
  285. data/app/assets/javascripts/extjs-rails/src/form/Label.js +110 -0
  286. data/app/assets/javascripts/extjs-rails/src/form/Labelable.js +764 -0
  287. data/app/assets/javascripts/extjs-rails/src/form/Panel.js +335 -0
  288. data/app/assets/javascripts/extjs-rails/src/form/RadioGroup.js +124 -0
  289. data/app/assets/javascripts/extjs-rails/src/form/RadioManager.js +26 -0
  290. data/app/assets/javascripts/extjs-rails/src/form/action/Action.js +307 -0
  291. data/app/assets/javascripts/extjs-rails/src/form/action/DirectLoad.js +107 -0
  292. data/app/assets/javascripts/extjs-rails/src/form/action/DirectSubmit.js +119 -0
  293. data/app/assets/javascripts/extjs-rails/src/form/action/Load.js +120 -0
  294. data/app/assets/javascripts/extjs-rails/src/form/action/StandardSubmit.js +34 -0
  295. data/app/assets/javascripts/extjs-rails/src/form/action/Submit.js +257 -0
  296. data/app/assets/javascripts/extjs-rails/src/form/field/Base.js +813 -0
  297. data/app/assets/javascripts/extjs-rails/src/form/field/Checkbox.js +505 -0
  298. data/app/assets/javascripts/extjs-rails/src/form/field/ComboBox.js +1427 -0
  299. data/app/assets/javascripts/extjs-rails/src/form/field/Date.js +578 -0
  300. data/app/assets/javascripts/extjs-rails/src/form/field/Display.js +155 -0
  301. data/app/assets/javascripts/extjs-rails/src/form/field/Field.js +430 -0
  302. data/app/assets/javascripts/extjs-rails/src/form/field/File.js +265 -0
  303. data/app/assets/javascripts/extjs-rails/src/form/field/Hidden.js +75 -0
  304. data/app/assets/javascripts/extjs-rails/src/form/field/HtmlEditor.js +1439 -0
  305. data/app/assets/javascripts/extjs-rails/src/form/field/Number.js +380 -0
  306. data/app/assets/javascripts/extjs-rails/src/form/field/Picker.js +321 -0
  307. data/app/assets/javascripts/extjs-rails/src/form/field/Radio.js +279 -0
  308. data/app/assets/javascripts/extjs-rails/src/form/field/Spinner.js +321 -0
  309. data/app/assets/javascripts/extjs-rails/src/form/field/Text.js +727 -0
  310. data/app/assets/javascripts/extjs-rails/src/form/field/TextArea.js +228 -0
  311. data/app/assets/javascripts/extjs-rails/src/form/field/Time.js +459 -0
  312. data/app/assets/javascripts/extjs-rails/src/form/field/Trigger.js +469 -0
  313. data/app/assets/javascripts/extjs-rails/src/form/field/VTypes.js +172 -0
  314. data/app/assets/javascripts/extjs-rails/src/fx/Anim.js +472 -0
  315. data/app/assets/javascripts/extjs-rails/src/fx/Animator.js +410 -0
  316. data/app/assets/javascripts/extjs-rails/src/fx/CubicBezier.js +77 -0
  317. data/app/assets/javascripts/extjs-rails/src/fx/Easing.js +136 -0
  318. data/app/assets/javascripts/extjs-rails/src/fx/Manager.js +353 -0
  319. data/app/assets/javascripts/extjs-rails/src/fx/PropertyHandler.js +381 -0
  320. data/app/assets/javascripts/extjs-rails/src/fx/Queue.js +123 -0
  321. data/app/assets/javascripts/extjs-rails/src/fx/target/Component.js +118 -0
  322. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElement.js +46 -0
  323. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElementCSS.js +22 -0
  324. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeSprite.js +34 -0
  325. data/app/assets/javascripts/extjs-rails/src/fx/target/Element.js +83 -0
  326. data/app/assets/javascripts/extjs-rails/src/fx/target/ElementCSS.js +77 -0
  327. data/app/assets/javascripts/extjs-rails/src/fx/target/Sprite.js +128 -0
  328. data/app/assets/javascripts/extjs-rails/src/fx/target/Target.js +36 -0
  329. data/app/assets/javascripts/extjs-rails/src/grid/CellEditor.js +172 -0
  330. data/app/assets/javascripts/extjs-rails/src/grid/ColumnComponentLayout.js +34 -0
  331. data/app/assets/javascripts/extjs-rails/src/grid/ColumnLayout.js +201 -0
  332. data/app/assets/javascripts/extjs-rails/src/grid/Lockable.js +863 -0
  333. data/app/assets/javascripts/extjs-rails/src/grid/LockingView.js +169 -0
  334. data/app/assets/javascripts/extjs-rails/src/grid/PagingScroller.js +539 -0
  335. data/app/assets/javascripts/extjs-rails/src/grid/Panel.js +393 -0
  336. data/app/assets/javascripts/extjs-rails/src/grid/RowEditor.js +731 -0
  337. data/app/assets/javascripts/extjs-rails/src/grid/RowNumberer.js +76 -0
  338. data/app/assets/javascripts/extjs-rails/src/grid/Scroller.js +5 -0
  339. data/app/assets/javascripts/extjs-rails/src/grid/View.js +44 -0
  340. data/app/assets/javascripts/extjs-rails/src/grid/ViewDropZone.js +41 -0
  341. data/app/assets/javascripts/extjs-rails/src/grid/column/Action.js +318 -0
  342. data/app/assets/javascripts/extjs-rails/src/grid/column/Boolean.js +82 -0
  343. data/app/assets/javascripts/extjs-rails/src/grid/column/Column.js +835 -0
  344. data/app/assets/javascripts/extjs-rails/src/grid/column/Date.js +63 -0
  345. data/app/assets/javascripts/extjs-rails/src/grid/column/Number.js +52 -0
  346. data/app/assets/javascripts/extjs-rails/src/grid/column/Template.js +58 -0
  347. data/app/assets/javascripts/extjs-rails/src/grid/feature/AbstractSummary.js +154 -0
  348. data/app/assets/javascripts/extjs-rails/src/grid/feature/Chunking.js +77 -0
  349. data/app/assets/javascripts/extjs-rails/src/grid/feature/Feature.js +158 -0
  350. data/app/assets/javascripts/extjs-rails/src/grid/feature/Grouping.js +822 -0
  351. data/app/assets/javascripts/extjs-rails/src/grid/feature/GroupingSummary.js +243 -0
  352. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowBody.js +116 -0
  353. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowWrap.js +120 -0
  354. data/app/assets/javascripts/extjs-rails/src/grid/feature/Summary.js +167 -0
  355. data/app/assets/javascripts/extjs-rails/src/grid/header/Container.js +965 -0
  356. data/app/assets/javascripts/extjs-rails/src/grid/header/DragZone.js +69 -0
  357. data/app/assets/javascripts/extjs-rails/src/grid/header/DropZone.js +265 -0
  358. data/app/assets/javascripts/extjs-rails/src/grid/plugin/CellEditing.js +453 -0
  359. data/app/assets/javascripts/extjs-rails/src/grid/plugin/DragDrop.js +254 -0
  360. data/app/assets/javascripts/extjs-rails/src/grid/plugin/Editing.js +561 -0
  361. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderReorderer.js +49 -0
  362. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderResizer.js +292 -0
  363. data/app/assets/javascripts/extjs-rails/src/grid/plugin/RowEditing.js +339 -0
  364. data/app/assets/javascripts/extjs-rails/src/grid/property/Grid.js +351 -0
  365. data/app/assets/javascripts/extjs-rails/src/grid/property/HeaderContainer.js +109 -0
  366. data/app/assets/javascripts/extjs-rails/src/grid/property/Property.js +36 -0
  367. data/app/assets/javascripts/extjs-rails/src/grid/property/Store.js +141 -0
  368. data/app/assets/javascripts/extjs-rails/src/layout/ClassList.js +90 -0
  369. data/app/assets/javascripts/extjs-rails/src/layout/Context.js +1232 -0
  370. data/app/assets/javascripts/extjs-rails/src/layout/ContextItem.js +1470 -0
  371. data/app/assets/javascripts/extjs-rails/src/layout/Layout.js +761 -0
  372. data/app/assets/javascripts/extjs-rails/src/layout/component/Auto.js +220 -0
  373. data/app/assets/javascripts/extjs-rails/src/layout/component/Body.js +80 -0
  374. data/app/assets/javascripts/extjs-rails/src/layout/component/BoundList.js +95 -0
  375. data/app/assets/javascripts/extjs-rails/src/layout/component/Button.js +261 -0
  376. data/app/assets/javascripts/extjs-rails/src/layout/component/Component.js +427 -0
  377. data/app/assets/javascripts/extjs-rails/src/layout/component/Dock.js +1132 -0
  378. data/app/assets/javascripts/extjs-rails/src/layout/component/Draw.js +79 -0
  379. data/app/assets/javascripts/extjs-rails/src/layout/component/FieldSet.js +62 -0
  380. data/app/assets/javascripts/extjs-rails/src/layout/component/ProgressBar.js +54 -0
  381. data/app/assets/javascripts/extjs-rails/src/layout/component/Tab.js +23 -0
  382. data/app/assets/javascripts/extjs-rails/src/layout/component/field/ComboBox.js +52 -0
  383. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Field.js +372 -0
  384. data/app/assets/javascripts/extjs-rails/src/layout/component/field/FieldContainer.js +48 -0
  385. data/app/assets/javascripts/extjs-rails/src/layout/component/field/HtmlEditor.js +54 -0
  386. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Slider.js +58 -0
  387. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Text.js +75 -0
  388. data/app/assets/javascripts/extjs-rails/src/layout/component/field/TextArea.js +51 -0
  389. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Trigger.js +132 -0
  390. data/app/assets/javascripts/extjs-rails/src/layout/container/Absolute.js +121 -0
  391. data/app/assets/javascripts/extjs-rails/src/layout/container/Accordion.js +308 -0
  392. data/app/assets/javascripts/extjs-rails/src/layout/container/Anchor.js +403 -0
  393. data/app/assets/javascripts/extjs-rails/src/layout/container/Auto.js +70 -0
  394. data/app/assets/javascripts/extjs-rails/src/layout/container/Border-old-js +1079 -0
  395. data/app/assets/javascripts/extjs-rails/src/layout/container/Border.js +816 -0
  396. data/app/assets/javascripts/extjs-rails/src/layout/container/Box.js +929 -0
  397. data/app/assets/javascripts/extjs-rails/src/layout/container/Card.js +361 -0
  398. data/app/assets/javascripts/extjs-rails/src/layout/container/CheckboxGroup.js +376 -0
  399. data/app/assets/javascripts/extjs-rails/src/layout/container/Column.js +234 -0
  400. data/app/assets/javascripts/extjs-rails/src/layout/container/Container.js +961 -0
  401. data/app/assets/javascripts/extjs-rails/src/layout/container/Editor.js +74 -0
  402. data/app/assets/javascripts/extjs-rails/src/layout/container/Fit.js +287 -0
  403. data/app/assets/javascripts/extjs-rails/src/layout/container/Form.js +157 -0
  404. data/app/assets/javascripts/extjs-rails/src/layout/container/HBox.js +134 -0
  405. data/app/assets/javascripts/extjs-rails/src/layout/container/Table.js +412 -0
  406. data/app/assets/javascripts/extjs-rails/src/layout/container/VBox.js +139 -0
  407. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Menu.js +365 -0
  408. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/None.js +83 -0
  409. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Scroller.js +475 -0
  410. data/app/assets/javascripts/extjs-rails/src/menu/CheckItem.js +169 -0
  411. data/app/assets/javascripts/extjs-rails/src/menu/ColorPicker.js +110 -0
  412. data/app/assets/javascripts/extjs-rails/src/menu/DatePicker.js +100 -0
  413. data/app/assets/javascripts/extjs-rails/src/menu/Item.js +553 -0
  414. data/app/assets/javascripts/extjs-rails/src/menu/KeyNav.js +134 -0
  415. data/app/assets/javascripts/extjs-rails/src/menu/Manager.js +219 -0
  416. data/app/assets/javascripts/extjs-rails/src/menu/Menu.js +579 -0
  417. data/app/assets/javascripts/extjs-rails/src/menu/Separator.js +126 -0
  418. data/app/assets/javascripts/extjs-rails/src/panel/AbstractPanel.js +323 -0
  419. data/app/assets/javascripts/extjs-rails/src/panel/DD.js +99 -0
  420. data/app/assets/javascripts/extjs-rails/src/panel/Header.js +518 -0
  421. data/app/assets/javascripts/extjs-rails/src/panel/Panel.js +2150 -0
  422. data/app/assets/javascripts/extjs-rails/src/panel/Proxy.js +131 -0
  423. data/app/assets/javascripts/extjs-rails/src/panel/Table.js +1018 -0
  424. data/app/assets/javascripts/extjs-rails/src/panel/Tool.js +304 -0
  425. data/app/assets/javascripts/extjs-rails/src/picker/Color.js +219 -0
  426. data/app/assets/javascripts/extjs-rails/src/picker/Date.js +1140 -0
  427. data/app/assets/javascripts/extjs-rails/src/picker/Month.js +490 -0
  428. data/app/assets/javascripts/extjs-rails/src/picker/Time.js +165 -0
  429. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitter.js +22 -0
  430. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitterTracker.js +210 -0
  431. data/app/assets/javascripts/extjs-rails/src/resizer/Handle.js +29 -0
  432. data/app/assets/javascripts/extjs-rails/src/resizer/ResizeTracker.js +346 -0
  433. data/app/assets/javascripts/extjs-rails/src/resizer/Resizer.js +477 -0
  434. data/app/assets/javascripts/extjs-rails/src/resizer/Splitter.js +242 -0
  435. data/app/assets/javascripts/extjs-rails/src/resizer/SplitterTracker.js +230 -0
  436. data/app/assets/javascripts/extjs-rails/src/selection/CellModel.js +395 -0
  437. data/app/assets/javascripts/extjs-rails/src/selection/CheckboxModel.js +234 -0
  438. data/app/assets/javascripts/extjs-rails/src/selection/DataViewModel.js +160 -0
  439. data/app/assets/javascripts/extjs-rails/src/selection/Model.js +646 -0
  440. data/app/assets/javascripts/extjs-rails/src/selection/RowModel.js +499 -0
  441. data/app/assets/javascripts/extjs-rails/src/selection/TreeModel.js +78 -0
  442. data/app/assets/javascripts/extjs-rails/src/slider/Multi.js +835 -0
  443. data/app/assets/javascripts/extjs-rails/src/slider/Single.js +56 -0
  444. data/app/assets/javascripts/extjs-rails/src/slider/Thumb.js +259 -0
  445. data/app/assets/javascripts/extjs-rails/src/slider/Tip.js +130 -0
  446. data/app/assets/javascripts/extjs-rails/src/state/CookieProvider.js +120 -0
  447. data/app/assets/javascripts/extjs-rails/src/state/LocalStorageProvider.js +72 -0
  448. data/app/assets/javascripts/extjs-rails/src/state/Manager.js +70 -0
  449. data/app/assets/javascripts/extjs-rails/src/state/Provider.js +182 -0
  450. data/app/assets/javascripts/extjs-rails/src/state/Stateful.js +364 -0
  451. data/app/assets/javascripts/extjs-rails/src/tab/Bar.js +258 -0
  452. data/app/assets/javascripts/extjs-rails/src/tab/Panel.js +654 -0
  453. data/app/assets/javascripts/extjs-rails/src/tab/Tab.js +358 -0
  454. data/app/assets/javascripts/extjs-rails/src/tail.js +10 -0
  455. data/app/assets/javascripts/extjs-rails/src/tip/QuickTip.js +335 -0
  456. data/app/assets/javascripts/extjs-rails/src/tip/QuickTipManager.js +239 -0
  457. data/app/assets/javascripts/extjs-rails/src/tip/Tip.js +160 -0
  458. data/app/assets/javascripts/extjs-rails/src/tip/ToolTip.js +691 -0
  459. data/app/assets/javascripts/extjs-rails/src/toolbar/Fill.js +28 -0
  460. data/app/assets/javascripts/extjs-rails/src/toolbar/Item.js +16 -0
  461. data/app/assets/javascripts/extjs-rails/src/toolbar/Paging.js +600 -0
  462. data/app/assets/javascripts/extjs-rails/src/toolbar/Separator.js +23 -0
  463. data/app/assets/javascripts/extjs-rails/src/toolbar/Spacer.js +33 -0
  464. data/app/assets/javascripts/extjs-rails/src/toolbar/TextItem.js +57 -0
  465. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar-legacy.js +123 -0
  466. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar.js +447 -0
  467. data/app/assets/javascripts/extjs-rails/src/tree/Column.js +90 -0
  468. data/app/assets/javascripts/extjs-rails/src/tree/Panel.js +505 -0
  469. data/app/assets/javascripts/extjs-rails/src/tree/View.js +658 -0
  470. data/app/assets/javascripts/extjs-rails/src/tree/ViewDragZone.js +49 -0
  471. data/app/assets/javascripts/extjs-rails/src/tree/ViewDropZone.js +287 -0
  472. data/app/assets/javascripts/extjs-rails/src/tree/plugin/TreeViewDragDrop.js +244 -0
  473. data/app/assets/javascripts/extjs-rails/src/util/AbstractMixedCollection.js +772 -0
  474. data/app/assets/javascripts/extjs-rails/src/util/Animate.js +426 -0
  475. data/app/assets/javascripts/extjs-rails/src/util/Bindable.js +102 -0
  476. data/app/assets/javascripts/extjs-rails/src/util/CSS.js +185 -0
  477. data/app/assets/javascripts/extjs-rails/src/util/ClickRepeater.js +238 -0
  478. data/app/assets/javascripts/extjs-rails/src/util/ComponentDragger.js +126 -0
  479. data/app/assets/javascripts/extjs-rails/src/util/Cookies.js +91 -0
  480. data/app/assets/javascripts/extjs-rails/src/util/ElementContainer.js +293 -0
  481. data/app/assets/javascripts/extjs-rails/src/util/Filter.js +159 -0
  482. data/app/assets/javascripts/extjs-rails/src/util/Floating.js +321 -0
  483. data/app/assets/javascripts/extjs-rails/src/util/Grouper.js +26 -0
  484. data/app/assets/javascripts/extjs-rails/src/util/HashMap.js +356 -0
  485. data/app/assets/javascripts/extjs-rails/src/util/History.js +285 -0
  486. data/app/assets/javascripts/extjs-rails/src/util/Inflector.js +297 -0
  487. data/app/assets/javascripts/extjs-rails/src/util/KeyMap.js +427 -0
  488. data/app/assets/javascripts/extjs-rails/src/util/KeyNav.js +239 -0
  489. data/app/assets/javascripts/extjs-rails/src/util/LruCache.js +257 -0
  490. data/app/assets/javascripts/extjs-rails/src/util/Memento.js +131 -0
  491. data/app/assets/javascripts/extjs-rails/src/util/MixedCollection.js +239 -0
  492. data/app/assets/javascripts/extjs-rails/src/util/Observable.js +1003 -0
  493. data/app/assets/javascripts/extjs-rails/src/util/Offset.js +60 -0
  494. data/app/assets/javascripts/extjs-rails/src/util/Point.js +93 -0
  495. data/app/assets/javascripts/extjs-rails/src/util/ProtoElement.js +205 -0
  496. data/app/assets/javascripts/extjs-rails/src/util/Queue.js +76 -0
  497. data/app/assets/javascripts/extjs-rails/src/util/Region.js +388 -0
  498. data/app/assets/javascripts/extjs-rails/src/util/Renderable.js +1079 -0
  499. data/app/assets/javascripts/extjs-rails/src/util/Sortable.js +248 -0
  500. data/app/assets/javascripts/extjs-rails/src/util/Sorter.js +179 -0
  501. data/app/assets/javascripts/extjs-rails/src/util/TextMetrics.js +148 -0
  502. data/app/assets/javascripts/extjs-rails/src/view/AbstractView.js +1103 -0
  503. data/app/assets/javascripts/extjs-rails/src/view/BoundList.js +207 -0
  504. data/app/assets/javascripts/extjs-rails/src/view/BoundListKeyNav.js +92 -0
  505. data/app/assets/javascripts/extjs-rails/src/view/DragZone.js +106 -0
  506. data/app/assets/javascripts/extjs-rails/src/view/DropZone.js +240 -0
  507. data/app/assets/javascripts/extjs-rails/src/view/Table.js +1229 -0
  508. data/app/assets/javascripts/extjs-rails/src/view/TableChunker.js +139 -0
  509. data/app/assets/javascripts/extjs-rails/src/view/View.js +636 -0
  510. data/app/assets/javascripts/extjs-rails/src/window/MessageBox.js +880 -0
  511. data/app/assets/javascripts/extjs-rails/src/window/Window-legacy.js +56 -0
  512. data/app/assets/javascripts/extjs-rails/src/window/Window.js +793 -0
  513. data/extjs-rails.gemspec +24 -0
  514. data/lib/extjs-rails.rb +7 -0
  515. data/lib/extjs-rails/engine.rb +7 -0
  516. data/lib/extjs-rails/version.rb +5 -0
  517. metadata +660 -0
@@ -0,0 +1,393 @@
1
+ /**
2
+ * @author Aaron Conran
3
+ * @docauthor Ed Spencer
4
+ *
5
+ * Grids are an excellent way of showing large amounts of tabular data on the client side. Essentially a supercharged
6
+ * `<table>`, GridPanel makes it easy to fetch, sort and filter large amounts of data.
7
+ *
8
+ * Grids are composed of two main pieces - a {@link Ext.data.Store Store} full of data and a set of columns to render.
9
+ *
10
+ * ## Basic GridPanel
11
+ *
12
+ * @example
13
+ * Ext.create('Ext.data.Store', {
14
+ * storeId:'simpsonsStore',
15
+ * fields:['name', 'email', 'phone'],
16
+ * data:{'items':[
17
+ * { 'name': 'Lisa', "email":"lisa@simpsons.com", "phone":"555-111-1224" },
18
+ * { 'name': 'Bart', "email":"bart@simpsons.com", "phone":"555-222-1234" },
19
+ * { 'name': 'Homer', "email":"home@simpsons.com", "phone":"555-222-1244" },
20
+ * { 'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254" }
21
+ * ]},
22
+ * proxy: {
23
+ * type: 'memory',
24
+ * reader: {
25
+ * type: 'json',
26
+ * root: 'items'
27
+ * }
28
+ * }
29
+ * });
30
+ *
31
+ * Ext.create('Ext.grid.Panel', {
32
+ * title: 'Simpsons',
33
+ * store: Ext.data.StoreManager.lookup('simpsonsStore'),
34
+ * columns: [
35
+ * { header: 'Name', dataIndex: 'name' },
36
+ * { header: 'Email', dataIndex: 'email', flex: 1 },
37
+ * { header: 'Phone', dataIndex: 'phone' }
38
+ * ],
39
+ * height: 200,
40
+ * width: 400,
41
+ * renderTo: Ext.getBody()
42
+ * });
43
+ *
44
+ * The code above produces a simple grid with three columns. We specified a Store which will load JSON data inline.
45
+ * In most apps we would be placing the grid inside another container and wouldn't need to use the
46
+ * {@link #height}, {@link #width} and {@link #renderTo} configurations but they are included here to make it easy to get
47
+ * up and running.
48
+ *
49
+ * The grid we created above will contain a header bar with a title ('Simpsons'), a row of column headers directly underneath
50
+ * and finally the grid rows under the headers.
51
+ *
52
+ * ## Configuring columns
53
+ *
54
+ * By default, each column is sortable and will toggle between ASC and DESC sorting when you click on its header. Each
55
+ * column header is also reorderable by default, and each gains a drop-down menu with options to hide and show columns.
56
+ * It's easy to configure each column - here we use the same example as above and just modify the columns config:
57
+ *
58
+ * columns: [
59
+ * {
60
+ * header: 'Name',
61
+ * dataIndex: 'name',
62
+ * sortable: false,
63
+ * hideable: false,
64
+ * flex: 1
65
+ * },
66
+ * {
67
+ * header: 'Email',
68
+ * dataIndex: 'email',
69
+ * hidden: true
70
+ * },
71
+ * {
72
+ * header: 'Phone',
73
+ * dataIndex: 'phone',
74
+ * width: 100
75
+ * }
76
+ * ]
77
+ *
78
+ * We turned off sorting and hiding on the 'Name' column so clicking its header now has no effect. We also made the Email
79
+ * column hidden by default (it can be shown again by using the menu on any other column). We also set the Phone column to
80
+ * a fixed with of 100px and flexed the Name column, which means it takes up all remaining width after the other columns
81
+ * have been accounted for. See the {@link Ext.grid.column.Column column docs} for more details.
82
+ *
83
+ * ## Renderers
84
+ *
85
+ * As well as customizing columns, it's easy to alter the rendering of individual cells using renderers. A renderer is
86
+ * tied to a particular column and is passed the value that would be rendered into each cell in that column. For example,
87
+ * we could define a renderer function for the email column to turn each email address into a mailto link:
88
+ *
89
+ * columns: [
90
+ * {
91
+ * header: 'Email',
92
+ * dataIndex: 'email',
93
+ * renderer: function(value) {
94
+ * return Ext.String.format('<a href="mailto:{0}">{1}</a>', value, value);
95
+ * }
96
+ * }
97
+ * ]
98
+ *
99
+ * See the {@link Ext.grid.column.Column column docs} for more information on renderers.
100
+ *
101
+ * ## Selection Models
102
+ *
103
+ * Sometimes all you want is to render data onto the screen for viewing, but usually it's necessary to interact with or
104
+ * update that data. Grids use a concept called a Selection Model, which is simply a mechanism for selecting some part of
105
+ * the data in the grid. The two main types of Selection Model are RowSelectionModel, where entire rows are selected, and
106
+ * CellSelectionModel, where individual cells are selected.
107
+ *
108
+ * Grids use a Row Selection Model by default, but this is easy to customise like so:
109
+ *
110
+ * Ext.create('Ext.grid.Panel', {
111
+ * selType: 'cellmodel',
112
+ * store: ...
113
+ * });
114
+ *
115
+ * Specifying the `cellmodel` changes a couple of things. Firstly, clicking on a cell now
116
+ * selects just that cell (using a {@link Ext.selection.RowModel rowmodel} will select the entire row), and secondly the
117
+ * keyboard navigation will walk from cell to cell instead of row to row. Cell-based selection models are usually used in
118
+ * conjunction with editing.
119
+ *
120
+ * ## Editing
121
+ *
122
+ * Grid has built-in support for in-line editing. There are two chief editing modes - cell editing and row editing. Cell
123
+ * editing is easy to add to your existing column setup - here we'll just modify the example above to include an editor
124
+ * on both the name and the email columns:
125
+ *
126
+ * Ext.create('Ext.grid.Panel', {
127
+ * title: 'Simpsons',
128
+ * store: Ext.data.StoreManager.lookup('simpsonsStore'),
129
+ * columns: [
130
+ * { header: 'Name', dataIndex: 'name', field: 'textfield' },
131
+ * { header: 'Email', dataIndex: 'email', flex: 1,
132
+ * field: {
133
+ * xtype: 'textfield',
134
+ * allowBlank: false
135
+ * }
136
+ * },
137
+ * { header: 'Phone', dataIndex: 'phone' }
138
+ * ],
139
+ * selType: 'cellmodel',
140
+ * plugins: [
141
+ * Ext.create('Ext.grid.plugin.CellEditing', {
142
+ * clicksToEdit: 1
143
+ * })
144
+ * ],
145
+ * height: 200,
146
+ * width: 400,
147
+ * renderTo: Ext.getBody()
148
+ * });
149
+ *
150
+ * This requires a little explanation. We're passing in {@link #store store} and {@link #columns columns} as normal, but
151
+ * this time we've also specified a {@link Ext.grid.column.Column#field field} on two of our columns. For the Name column
152
+ * we just want a default textfield to edit the value, so we specify 'textfield'. For the Email column we customized the
153
+ * editor slightly by passing allowBlank: false, which will provide inline validation.
154
+ *
155
+ * To support cell editing, we also specified that the grid should use the 'cellmodel' {@link #selType}, and created an
156
+ * instance of the {@link Ext.grid.plugin.CellEditing CellEditing plugin}, which we configured to activate each editor after a
157
+ * single click.
158
+ *
159
+ * ## Row Editing
160
+ *
161
+ * The other type of editing is row-based editing, using the RowEditor component. This enables you to edit an entire row
162
+ * at a time, rather than editing cell by cell. Row Editing works in exactly the same way as cell editing, all we need to
163
+ * do is change the plugin type to {@link Ext.grid.plugin.RowEditing}, and set the selType to 'rowmodel':
164
+ *
165
+ * Ext.create('Ext.grid.Panel', {
166
+ * title: 'Simpsons',
167
+ * store: Ext.data.StoreManager.lookup('simpsonsStore'),
168
+ * columns: [
169
+ * { header: 'Name', dataIndex: 'name', field: 'textfield' },
170
+ * { header: 'Email', dataIndex: 'email', flex:1,
171
+ * field: {
172
+ * xtype: 'textfield',
173
+ * allowBlank: false
174
+ * }
175
+ * },
176
+ * { header: 'Phone', dataIndex: 'phone' }
177
+ * ],
178
+ * selType: 'rowmodel',
179
+ * plugins: [
180
+ * Ext.create('Ext.grid.plugin.RowEditing', {
181
+ * clicksToEdit: 1
182
+ * })
183
+ * ],
184
+ * height: 200,
185
+ * width: 400,
186
+ * renderTo: Ext.getBody()
187
+ * });
188
+ *
189
+ * Again we passed some configuration to our {@link Ext.grid.plugin.RowEditing} plugin, and now when we click each row a row
190
+ * editor will appear and enable us to edit each of the columns we have specified an editor for.
191
+ *
192
+ * ## Sorting & Filtering
193
+ *
194
+ * Every grid is attached to a {@link Ext.data.Store Store}, which provides multi-sort and filtering capabilities. It's
195
+ * easy to set up a grid to be sorted from the start:
196
+ *
197
+ * var myGrid = Ext.create('Ext.grid.Panel', {
198
+ * store: {
199
+ * fields: ['name', 'email', 'phone'],
200
+ * sorters: ['name', 'phone']
201
+ * },
202
+ * columns: [
203
+ * { text: 'Name', dataIndex: 'name' },
204
+ * { text: 'Email', dataIndex: 'email' }
205
+ * ]
206
+ * });
207
+ *
208
+ * Sorting at run time is easily accomplished by simply clicking each column header. If you need to perform sorting on
209
+ * more than one field at run time it's easy to do so by adding new sorters to the store:
210
+ *
211
+ * myGrid.store.sort([
212
+ * { property: 'name', direction: 'ASC' },
213
+ * { property: 'email', direction: 'DESC' }
214
+ * ]);
215
+ *
216
+ * See {@link Ext.data.Store} for examples of filtering.
217
+ *
218
+ * ## Grouping
219
+ *
220
+ * Grid supports the grouping of rows by any field. For example if we had a set of employee records, we might want to
221
+ * group by the department that each employee works in. Here's how we might set that up:
222
+ *
223
+ * @example
224
+ * var store = Ext.create('Ext.data.Store', {
225
+ * storeId:'employeeStore',
226
+ * fields:['name', 'seniority', 'department'],
227
+ * groupField: 'department',
228
+ * data: {'employees':[
229
+ * { "name": "Michael Scott", "seniority": 7, "department": "Management" },
230
+ * { "name": "Dwight Schrute", "seniority": 2, "department": "Sales" },
231
+ * { "name": "Jim Halpert", "seniority": 3, "department": "Sales" },
232
+ * { "name": "Kevin Malone", "seniority": 4, "department": "Accounting" },
233
+ * { "name": "Angela Martin", "seniority": 5, "department": "Accounting" }
234
+ * ]},
235
+ * proxy: {
236
+ * type: 'memory',
237
+ * reader: {
238
+ * type: 'json',
239
+ * root: 'employees'
240
+ * }
241
+ * }
242
+ * });
243
+ *
244
+ * Ext.create('Ext.grid.Panel', {
245
+ * title: 'Employees',
246
+ * store: Ext.data.StoreManager.lookup('employeeStore'),
247
+ * columns: [
248
+ * { header: 'Name', dataIndex: 'name' },
249
+ * { header: 'Seniority', dataIndex: 'seniority' }
250
+ * ],
251
+ * features: [{ftype:'grouping'}],
252
+ * width: 200,
253
+ * height: 275,
254
+ * renderTo: Ext.getBody()
255
+ * });
256
+ *
257
+ * ## Infinite Scrolling
258
+ *
259
+ * Grid supports infinite scrolling as an alternative to using a paging toolbar. Your users can scroll through thousands
260
+ * of records without the performance penalties of renderering all the records on screen at once. The grid should be bound
261
+ * to a *buffered* store with a pageSize specified.
262
+ *
263
+ * The number of rows rendered outside the visible area, and the buffering of pages of data from the remote server for
264
+ * immediate rendering upon scroll can be controlled by configuring the {@link Ext.grid.PagingScroller #verticalScroller}.
265
+ *
266
+ * You can tell it to create a larger table to provide more scrolling before a refresh is needed, and also to keep more pages
267
+ * of records in memory for faster refreshing when scrolling.
268
+ *
269
+ * var myStore = Ext.create('Ext.data.Store', {
270
+ * // ...
271
+ * buffered: true,
272
+ * pageSize: 100,
273
+ * // ...
274
+ * });
275
+ *
276
+ * var grid = Ext.create('Ext.grid.Panel', {
277
+ * // ...
278
+ * autoLoad: true,
279
+ * verticalScroller: {
280
+ * trailingBufferZone: 200, // Keep 200 records buffered in memory behind scroll
281
+ * leadingBufferZone: 5000 // Keep 5000 records buffered in memory ahead of scroll
282
+ * },
283
+ * // ...
284
+ * });
285
+ *
286
+ * ## Paging
287
+ *
288
+ * Grid supports paging through large sets of data via a PagingToolbar or PagingGridScroller (see the Infinite Scrolling section above).
289
+ * To leverage paging via a toolbar or scroller, you need to set a pageSize configuration on the Store.
290
+ *
291
+ * @example
292
+ * var itemsPerPage = 2; // set the number of items you want per page
293
+ *
294
+ * var store = Ext.create('Ext.data.Store', {
295
+ * id:'simpsonsStore',
296
+ * autoLoad: false,
297
+ * fields:['name', 'email', 'phone'],
298
+ * pageSize: itemsPerPage, // items per page
299
+ * proxy: {
300
+ * type: 'ajax',
301
+ * url: 'pagingstore.js', // url that will load data with respect to start and limit params
302
+ * reader: {
303
+ * type: 'json',
304
+ * root: 'items',
305
+ * totalProperty: 'total'
306
+ * }
307
+ * }
308
+ * });
309
+ *
310
+ * // specify the page you want to load
311
+ * store.loadPage(1);
312
+ *
313
+ * Ext.create('Ext.grid.Panel', {
314
+ * title: 'Simpsons',
315
+ * store: store,
316
+ * columns: [
317
+ * {header: 'Name', dataIndex: 'name'},
318
+ * {header: 'Email', dataIndex: 'email', flex:1},
319
+ * {header: 'Phone', dataIndex: 'phone'}
320
+ * ],
321
+ * width: 400,
322
+ * height: 125,
323
+ * dockedItems: [{
324
+ * xtype: 'pagingtoolbar',
325
+ * store: store, // same store GridPanel is using
326
+ * dock: 'bottom',
327
+ * displayInfo: true
328
+ * }],
329
+ * renderTo: Ext.getBody()
330
+ * });
331
+ *
332
+ * ## State saving
333
+ *
334
+ * When configured {@link #stateful}, grids save their column state (order and width) encapsulated within the default
335
+ * Panel state of changed width and height and collapsed/expanded state.
336
+ *
337
+ * Each {@link @columns column} of the grid may be configured with a {@link Ext.grid.column.Column#stateId stateId} which
338
+ * identifies that column locally within the grid.
339
+ */
340
+ Ext.define('Ext.grid.Panel', {
341
+ extend: 'Ext.panel.Table',
342
+ requires: ['Ext.grid.View'],
343
+ alias: ['widget.gridpanel', 'widget.grid'],
344
+ alternateClassName: ['Ext.list.ListView', 'Ext.ListView', 'Ext.grid.GridPanel'],
345
+ viewType: 'gridview',
346
+
347
+ lockable: false,
348
+
349
+ // Required for the Lockable Mixin. These are the configurations which will be copied to the
350
+ // normal and locked sub tablepanels
351
+ bothCfgCopy: [
352
+ 'invalidateScrollerOnRefresh',
353
+ 'hideHeaders',
354
+ 'enableColumnHide',
355
+ 'enableColumnMove',
356
+ 'enableColumnResize',
357
+ 'sortableColumns'
358
+ ],
359
+ normalCfgCopy: [
360
+ 'verticalScroller',
361
+ 'verticalScrollDock',
362
+ 'verticalScrollerType',
363
+ 'scroll'
364
+ ],
365
+ lockedCfgCopy: [],
366
+
367
+ /**
368
+ * @cfg {Boolean} rowLines False to remove row line styling
369
+ */
370
+ rowLines: true
371
+
372
+ // Columns config is required in Grid
373
+ /**
374
+ * @cfg {Ext.grid.column.Column[]/Object} columns (required)
375
+ * @inheritdoc
376
+ */
377
+
378
+ /**
379
+ * @event reconfigure
380
+ * Fires after a reconfigure.
381
+ * @param {Ext.grid.Panel} this
382
+ * @param {Ext.data.Store} store The store that was passed to the {@link #method-reconfigure} method
383
+ * @param {Object[]} columns The column configs that were passed to the {@link #method-reconfigure} method
384
+ */
385
+
386
+ /**
387
+ * @method reconfigure
388
+ * Reconfigures the grid with a new store/columns. Either the store or the columns can be omitted if you don't wish
389
+ * to change them.
390
+ * @param {Ext.data.Store} store (Optional) The new store.
391
+ * @param {Object[]} columns (Optional) An array of column configs
392
+ */
393
+ });
@@ -0,0 +1,731 @@
1
+ // Currently has the following issues:
2
+ // - Does not handle postEditValue
3
+ // - Fields without editors need to sync with their values in Store
4
+ // - starting to edit another record while already editing and dirty should probably prevent it
5
+ // - aggregating validation messages
6
+ // - tabIndex is not managed bc we leave elements in dom, and simply move via positioning
7
+ // - layout issues when changing sizes/width while hidden (layout bug)
8
+
9
+ /**
10
+ * Internal utility class used to provide row editing functionality. For developers, they should use
11
+ * the RowEditing plugin to use this functionality with a grid.
12
+ *
13
+ * @private
14
+ */
15
+ Ext.define('Ext.grid.RowEditor', {
16
+ extend: 'Ext.form.Panel',
17
+ requires: [
18
+ 'Ext.tip.ToolTip',
19
+ 'Ext.util.HashMap',
20
+ 'Ext.util.KeyNav'
21
+ ],
22
+
23
+ //<locale>
24
+ saveBtnText : 'Update',
25
+ //</locale>
26
+ //<locale>
27
+ cancelBtnText: 'Cancel',
28
+ //</locale>
29
+ //<locale>
30
+ errorsText: 'Errors',
31
+ //</locale>
32
+ //<locale>
33
+ dirtyText: 'You need to commit or cancel your changes',
34
+ //</locale>
35
+
36
+ lastScrollLeft: 0,
37
+ lastScrollTop: 0,
38
+
39
+ border: false,
40
+
41
+ // Change the hideMode to offsets so that we get accurate measurements when
42
+ // the roweditor is hidden for laying out things like a TriggerField.
43
+ hideMode: 'offsets',
44
+
45
+ initComponent: function() {
46
+ var me = this,
47
+ form;
48
+
49
+ me.cls = Ext.baseCSSPrefix + 'grid-row-editor';
50
+
51
+ me.layout = {
52
+ type: 'hbox',
53
+ align: 'middle'
54
+ };
55
+
56
+ // Maintain field-to-column mapping
57
+ // It's easy to get a field from a column, but not vice versa
58
+ me.columns = new Ext.util.HashMap();
59
+ me.columns.getKey = function(columnHeader) {
60
+ var f;
61
+ if (columnHeader.getEditor) {
62
+ f = columnHeader.getEditor();
63
+ if (f) {
64
+ return f.id;
65
+ }
66
+ }
67
+ return columnHeader.id;
68
+ };
69
+ me.mon(me.columns, {
70
+ add: me.onFieldAdd,
71
+ remove: me.onFieldRemove,
72
+ replace: me.onFieldReplace,
73
+ scope: me
74
+ });
75
+
76
+ me.callParent(arguments);
77
+
78
+ if (me.fields) {
79
+ me.setField(me.fields);
80
+ delete me.fields;
81
+ }
82
+
83
+ form = me.getForm();
84
+ form.trackResetOnLoad = true;
85
+ },
86
+
87
+ onFieldChange: function() {
88
+ var me = this,
89
+ form = me.getForm(),
90
+ valid = form.isValid();
91
+ if (me.errorSummary && me.isVisible()) {
92
+ me[valid ? 'hideToolTip' : 'showToolTip']();
93
+ }
94
+ if (me.floatingButtons) {
95
+ me.floatingButtons.child('#update').setDisabled(!valid);
96
+ }
97
+ me.isValid = valid;
98
+ },
99
+
100
+ afterRender: function() {
101
+ var me = this,
102
+ plugin = me.editingPlugin;
103
+
104
+ me.callParent(arguments);
105
+ me.mon(me.renderTo, 'scroll', me.onCtScroll, me, { buffer: 100 });
106
+
107
+ // Prevent from bubbling click events to the grid view
108
+ me.mon(me.el, {
109
+ click: Ext.emptyFn,
110
+ stopPropagation: true
111
+ });
112
+
113
+ me.el.swallowEvent([
114
+ 'keypress',
115
+ 'keydown'
116
+ ]);
117
+
118
+ me.keyNav = new Ext.util.KeyNav(me.el, {
119
+ enter: plugin.completeEdit,
120
+ esc: plugin.onEscKey,
121
+ scope: plugin
122
+ });
123
+
124
+ me.mon(plugin.view, {
125
+ beforerefresh: me.onBeforeViewRefresh,
126
+ refresh: me.onViewRefresh,
127
+ scope: me
128
+ });
129
+ },
130
+
131
+ onBeforeViewRefresh: function(view) {
132
+ var me = this,
133
+ viewDom = view.el.dom;
134
+
135
+ if (me.el.dom.parentNode === viewDom) {
136
+ viewDom.removeChild(me.el.dom);
137
+ }
138
+ },
139
+
140
+ onViewRefresh: function(view) {
141
+ var me = this,
142
+ viewDom = view.el.dom,
143
+ context = me.context,
144
+ idx;
145
+
146
+ viewDom.appendChild(me.el.dom);
147
+
148
+ // Recover our row node after a view refresh
149
+ if (context && (idx = context.store.indexOf(context.record)) >= 0) {
150
+ context.row = view.getNode(idx);
151
+ me.reposition();
152
+ if (me.tooltip && me.tooltip.isVisible()) {
153
+ me.tooltip.setTarget(context.row);
154
+ }
155
+ } else {
156
+ me.editingPlugin.cancelEdit();
157
+ }
158
+ },
159
+
160
+ onCtScroll: function(e, target) {
161
+ var me = this,
162
+ scrollTop = target.scrollTop,
163
+ scrollLeft = target.scrollLeft;
164
+
165
+ if (scrollTop !== me.lastScrollTop) {
166
+ me.lastScrollTop = scrollTop;
167
+ if ((me.tooltip && me.tooltip.isVisible()) || me.hiddenTip) {
168
+ me.repositionTip();
169
+ }
170
+ }
171
+ if (scrollLeft !== me.lastScrollLeft) {
172
+ me.lastScrollLeft = scrollLeft;
173
+ me.reposition();
174
+ }
175
+ },
176
+
177
+ onColumnAdd: function(column) {
178
+ if (!column.isGroupHeader) {
179
+ this.setField(column);
180
+ }
181
+ },
182
+
183
+ onColumnRemove: function(column) {
184
+ this.columns.remove(column);
185
+ },
186
+
187
+ onColumnResize: function(column, width) {
188
+ if (!column.isGroupHeader) {
189
+ column.getEditor().setWidth(width - 2);
190
+ if (this.isVisible()) {
191
+ this.reposition();
192
+ }
193
+ }
194
+ },
195
+
196
+ onColumnHide: function(column) {
197
+ if (!column.isGroupHeader) {
198
+ column.getEditor().hide();
199
+ if (this.isVisible()) {
200
+ this.reposition();
201
+ }
202
+ }
203
+ },
204
+
205
+ onColumnShow: function(column) {
206
+ var field = column.getEditor();
207
+ field.setWidth(column.getWidth() - 2).show();
208
+ if (this.isVisible()) {
209
+ this.reposition();
210
+ }
211
+ },
212
+
213
+ onColumnMove: function(column, fromIdx, toIdx) {
214
+ if (!column.isGroupHeader) {
215
+ var field = column.getEditor();
216
+ if (this.items.indexOf(field) != toIdx) {
217
+ this.move(fromIdx, toIdx);
218
+ }
219
+ }
220
+ },
221
+
222
+ onFieldAdd: function(map, fieldId, column) {
223
+ var me = this,
224
+ colIdx,
225
+ field;
226
+
227
+ if (!column.isGroupHeader) {
228
+ colIdx = me.editingPlugin.grid.headerCt.getHeaderIndex(column);
229
+ field = column.getEditor({ xtype: 'displayfield' });
230
+ me.insert(colIdx, field);
231
+ }
232
+ },
233
+
234
+ onFieldRemove: function(map, fieldId, column) {
235
+ var me = this,
236
+ field,
237
+ fieldEl;
238
+
239
+ if (!column.isGroupHeader) {
240
+ field = column.getEditor();
241
+ fieldEl = field.el;
242
+ me.remove(field, false);
243
+ if (fieldEl) {
244
+ fieldEl.remove();
245
+ }
246
+ }
247
+ },
248
+
249
+ onFieldReplace: function(map, fieldId, column, oldColumn) {
250
+ this.onFieldRemove(map, fieldId, oldColumn);
251
+ },
252
+
253
+ clearFields: function() {
254
+ var map = this.columns,
255
+ key;
256
+
257
+ for (key in map) {
258
+ if (map.hasOwnProperty(key)) {
259
+ map.removeAtKey(key);
260
+ }
261
+ }
262
+ },
263
+
264
+ getFloatingButtons: function() {
265
+ var me = this,
266
+ cssPrefix = Ext.baseCSSPrefix,
267
+ btnsCss = cssPrefix + 'grid-row-editor-buttons',
268
+ plugin = me.editingPlugin,
269
+ btns;
270
+
271
+ if (!me.floatingButtons) {
272
+ btns = me.floatingButtons = new Ext.Container({
273
+ renderTpl: [
274
+ '<div class="{baseCls}-ml"></div>',
275
+ '<div class="{baseCls}-mr"></div>',
276
+ '<div class="{baseCls}-bl"></div>',
277
+ '<div class="{baseCls}-br"></div>',
278
+ '<div class="{baseCls}-bc"></div>',
279
+ '{%this.renderContainer(out,values)%}'
280
+ ],
281
+ width: 200,
282
+ renderTo: me.el,
283
+ baseCls: btnsCss,
284
+ layout: {
285
+ type: 'hbox',
286
+ align: 'middle'
287
+ },
288
+ defaults: {
289
+ flex: 1,
290
+ margins: '0 1 0 1'
291
+ },
292
+ items: [{
293
+ itemId: 'update',
294
+ xtype: 'button',
295
+ handler: plugin.completeEdit,
296
+ scope: plugin,
297
+ text: me.saveBtnText,
298
+ disabled: !me.isValid,
299
+ minWidth: Ext.panel.Panel.prototype.minButtonWidth
300
+ }, {
301
+ xtype: 'button',
302
+ handler: plugin.cancelEdit,
303
+ scope: plugin,
304
+ text: me.cancelBtnText,
305
+ minWidth: Ext.panel.Panel.prototype.minButtonWidth
306
+ }]
307
+ });
308
+
309
+ // Prevent from bubbling click events to the grid view
310
+ me.mon(btns.el, {
311
+ // BrowserBug: Opera 11.01
312
+ // causes the view to scroll when a button is focused from mousedown
313
+ mousedown: Ext.emptyFn,
314
+ click: Ext.emptyFn,
315
+ stopEvent: true
316
+ });
317
+ }
318
+ return me.floatingButtons;
319
+ },
320
+
321
+ reposition: function(animateConfig) {
322
+ var me = this,
323
+ context = me.context,
324
+ row = context && Ext.get(context.row),
325
+ btns = me.getFloatingButtons(),
326
+ btnEl = btns.el,
327
+ grid = me.editingPlugin.grid,
328
+ viewEl = grid.view.el,
329
+
330
+ // always get data from ColumnModel as its what drives
331
+ // the GridView's sizing
332
+ mainBodyWidth = grid.headerCt.getFullWidth(),
333
+ scrollerWidth = grid.getWidth(),
334
+
335
+ // use the minimum as the columns may not fill up the entire grid
336
+ // width
337
+ width = Math.min(mainBodyWidth, scrollerWidth),
338
+ scrollLeft = grid.view.el.dom.scrollLeft,
339
+ btnWidth = btns.getWidth(),
340
+ left = (width - btnWidth) / 2 + scrollLeft,
341
+ y, rowH, newHeight,
342
+
343
+ invalidateScroller = function() {
344
+ btnEl.scrollIntoView(viewEl, false);
345
+ if (animateConfig && animateConfig.callback) {
346
+ animateConfig.callback.call(animateConfig.scope || me);
347
+ }
348
+ },
349
+
350
+ animObj;
351
+
352
+ // need to set both top/left
353
+ if (row && Ext.isElement(row.dom)) {
354
+ // Bring our row into view if necessary, so a row editor that's already
355
+ // visible and animated to the row will appear smooth
356
+ row.scrollIntoView(viewEl, false);
357
+
358
+ // Get the y position of the row relative to its top-most static parent.
359
+ // offsetTop will be relative to the table, and is incorrect
360
+ // when mixed with certain grid features (e.g., grouping).
361
+ y = row.getXY()[1] - 5;
362
+ rowH = row.getHeight();
363
+ newHeight = rowH + (me.editingPlugin.grid.rowLines ? 9 : 10);
364
+
365
+ // Set editor height to match the row height
366
+ if (me.getHeight() != newHeight) {
367
+ me.setHeight(newHeight);
368
+ me.el.setLeft(0);
369
+ }
370
+
371
+ if (animateConfig) {
372
+ animObj = {
373
+ to: {
374
+ y: y
375
+ },
376
+ duration: animateConfig.duration || 125,
377
+ listeners: {
378
+ afteranimate: function() {
379
+ invalidateScroller();
380
+ y = row.getXY()[1] - 5;
381
+ }
382
+ }
383
+ };
384
+ me.el.animate(animObj);
385
+ } else {
386
+ me.el.setY(y);
387
+ invalidateScroller();
388
+ }
389
+ }
390
+ if (me.getWidth() != mainBodyWidth) {
391
+ me.setWidth(mainBodyWidth);
392
+ }
393
+ btnEl.setLeft(left);
394
+ },
395
+
396
+ getEditor: function(fieldInfo) {
397
+ var me = this;
398
+
399
+ if (Ext.isNumber(fieldInfo)) {
400
+ // Query only form fields. This just future-proofs us in case we add
401
+ // other components to RowEditor later on. Don't want to mess with
402
+ // indices.
403
+ return me.query('>[isFormField]')[fieldInfo];
404
+ } else if (fieldInfo.isHeader && !fieldInfo.isGroupHeader) {
405
+ return fieldInfo.getEditor();
406
+ }
407
+ },
408
+
409
+ removeField: function(field) {
410
+ var me = this;
411
+
412
+ // Incase we pass a column instead, which is fine
413
+ field = me.getEditor(field);
414
+ me.mun(field, 'validitychange', me.onValidityChange, me);
415
+
416
+ // Remove field/column from our mapping, which will fire the event to
417
+ // remove the field from our container
418
+ me.columns.removeAtKey(field.id);
419
+ Ext.destroy(field);
420
+ },
421
+
422
+ setField: function(column) {
423
+ var me = this,
424
+ i,
425
+ length, field;
426
+
427
+ if (Ext.isArray(column)) {
428
+ length = column.length;
429
+
430
+ for (i = 0; i < length; i++) {
431
+ me.setField(column[i]);
432
+ }
433
+
434
+ return;
435
+ }
436
+
437
+ // Get a default display field if necessary
438
+ field = column.getEditor(null, {
439
+ xtype: 'displayfield',
440
+ // Override Field's implementation so that the default display fields will not return values. This is done because
441
+ // the display field will pick up column renderers from the grid.
442
+ getModelData: function() {
443
+ return null;
444
+ }
445
+ });
446
+ field.margins = '0 0 0 2';
447
+ me.mon(field, 'change', me.onFieldChange, me);
448
+
449
+ if (me.isVisible() && me.context) {
450
+ if (field.is('displayfield')) {
451
+ me.renderColumnData(field, me.context.record, column);
452
+ } else {
453
+ field.suspendEvents();
454
+ field.setValue(me.context.record.get(column.dataIndex));
455
+ field.resumeEvents();
456
+ }
457
+ }
458
+
459
+ // Maintain mapping of fields-to-columns
460
+ // This will fire events that maintain our container items
461
+
462
+ me.columns.add(field.id, column);
463
+ if (column.hidden) {
464
+ me.onColumnHide(column);
465
+ } else if (column.rendered) {
466
+ // Setting after initial render
467
+ me.onColumnShow(column);
468
+ }
469
+ },
470
+
471
+ loadRecord: function(record) {
472
+ var me = this,
473
+ form = me.getForm(),
474
+ fields = form.getFields(),
475
+ items = fields.items,
476
+ length = items.length,
477
+ i, displayFields;
478
+
479
+ // temporarily suspend events on form fields before loading record to prevent the fields' change events from firing
480
+ for (i = 0; i < length; i++) {
481
+ items[i].suspendEvents();
482
+ }
483
+
484
+ form.loadRecord(record);
485
+
486
+ for (i = 0; i < length; i++) {
487
+ items[i].resumeEvents();
488
+ }
489
+
490
+ if (me.errorSummary) {
491
+ if (form.isValid()) {
492
+ me.hideToolTip();
493
+ } else {
494
+ me.showToolTip();
495
+ }
496
+ }
497
+
498
+ // render display fields so they honor the column renderer/template
499
+ displayFields = me.query('>displayfield');
500
+ length = displayFields.length;
501
+
502
+ for (i = 0; i < length; i++) {
503
+ me.renderColumnData(displayFields[i], record);
504
+ }
505
+ },
506
+
507
+ renderColumnData: function(field, record, activeColumn) {
508
+ var me = this,
509
+ grid = me.editingPlugin.grid,
510
+ headerCt = grid.headerCt,
511
+ view = grid.view,
512
+ store = view.store,
513
+ column = activeColumn || me.columns.get(field.id),
514
+ value = record.get(column.dataIndex),
515
+ renderer = column.editRenderer || column.renderer,
516
+ metaData,
517
+ rowIdx,
518
+ colIdx;
519
+
520
+ // honor our column's renderer (TemplateHeader sets renderer for us!)
521
+ if (renderer) {
522
+ metaData = { tdCls: '', style: '' };
523
+ rowIdx = store.indexOf(record);
524
+ colIdx = headerCt.getHeaderIndex(column);
525
+
526
+ value = renderer.call(
527
+ column.scope || headerCt.ownerCt,
528
+ value,
529
+ metaData,
530
+ record,
531
+ rowIdx,
532
+ colIdx,
533
+ store,
534
+ view
535
+ );
536
+ }
537
+
538
+ field.setRawValue(value);
539
+ field.resetOriginalValue();
540
+ },
541
+
542
+ beforeEdit: function() {
543
+ var me = this;
544
+
545
+ if (me.isVisible() && me.errorSummary && !me.autoCancel && me.isDirty()) {
546
+ me.showToolTip();
547
+ return false;
548
+ }
549
+ },
550
+
551
+ /**
552
+ * Start editing the specified grid at the specified position.
553
+ * @param {Ext.data.Model} record The Store data record which backs the row to be edited.
554
+ * @param {Ext.data.Model} columnHeader The Column object defining the column to be edited.
555
+ */
556
+ startEdit: function(record, columnHeader) {
557
+ var me = this,
558
+ grid = me.editingPlugin.grid,
559
+ store = grid.store,
560
+ context = me.context = Ext.apply(me.editingPlugin.context, {
561
+ view: grid.getView(),
562
+ store: store
563
+ });
564
+
565
+ // make sure our row is selected before editing
566
+ context.grid.getSelectionModel().select(record);
567
+
568
+ // Reload the record data
569
+ me.loadRecord(record);
570
+
571
+ if (!me.isVisible()) {
572
+ me.show();
573
+ me.focusContextCell();
574
+ } else {
575
+ me.reposition({
576
+ callback: this.focusContextCell
577
+ });
578
+ }
579
+ },
580
+
581
+ // Focus the cell on start edit based upon the current context
582
+ focusContextCell: function() {
583
+ var field = this.getEditor(this.context.colIdx);
584
+ if (field && field.focus) {
585
+ field.focus();
586
+ }
587
+ },
588
+
589
+ cancelEdit: function() {
590
+ var me = this,
591
+ form = me.getForm(),
592
+ fields = form.getFields(),
593
+ items = fields.items,
594
+ length = items.length,
595
+ i;
596
+
597
+ me.hide();
598
+ form.clearInvalid();
599
+
600
+ // temporarily suspend events on form fields before reseting the form to prevent the fields' change events from firing
601
+ for (i = 0; i < length; i++) {
602
+ items[i].suspendEvents();
603
+ }
604
+
605
+ form.reset();
606
+
607
+ for (i = 0; i < length; i++) {
608
+ items[i].resumeEvents();
609
+ }
610
+ },
611
+
612
+ completeEdit: function() {
613
+ var me = this,
614
+ form = me.getForm();
615
+
616
+ if (!form.isValid()) {
617
+ return;
618
+ }
619
+
620
+ form.updateRecord(me.context.record);
621
+ me.hide();
622
+ return true;
623
+ },
624
+
625
+ onShow: function() {
626
+ this.callParent(arguments);
627
+ this.reposition();
628
+ },
629
+
630
+ onHide: function() {
631
+ var me = this;
632
+ me.callParent(arguments);
633
+ if (me.tooltip) {
634
+ me.hideToolTip();
635
+ }
636
+ if (me.context) {
637
+ me.context.view.focus();
638
+ me.context = null;
639
+ }
640
+ },
641
+
642
+ isDirty: function() {
643
+ var me = this,
644
+ form = me.getForm();
645
+ return form.isDirty();
646
+ },
647
+
648
+ getToolTip: function() {
649
+ return this.tooltip || (this.tooltip = new Ext.tip.ToolTip({
650
+ cls: Ext.baseCSSPrefix + 'grid-row-editor-errors',
651
+ title: this.errorsText,
652
+ autoHide: false,
653
+ closable: true,
654
+ closeAction: 'disable',
655
+ anchor: 'left'
656
+ }));
657
+ },
658
+
659
+ hideToolTip: function() {
660
+ var me = this,
661
+ tip = me.getToolTip();
662
+ if (tip.rendered) {
663
+ tip.disable();
664
+ }
665
+ me.hiddenTip = false;
666
+ },
667
+
668
+ showToolTip: function() {
669
+ var me = this,
670
+ tip = me.getToolTip(),
671
+ context = me.context,
672
+ row = Ext.get(context.row),
673
+ viewEl = context.grid.view.el;
674
+
675
+ tip.setTarget(row);
676
+ tip.showAt([-10000, -10000]);
677
+ tip.update(me.getErrors());
678
+ tip.mouseOffset = [viewEl.getWidth() - row.getWidth() + me.lastScrollLeft + 15, 0];
679
+ me.repositionTip();
680
+ tip.doLayout();
681
+ tip.enable();
682
+ },
683
+
684
+ repositionTip: function() {
685
+ var me = this,
686
+ tip = me.getToolTip(),
687
+ context = me.context,
688
+ row = Ext.get(context.row),
689
+ viewEl = context.grid.view.el,
690
+ viewHeight = viewEl.getHeight(),
691
+ viewTop = me.lastScrollTop,
692
+ viewBottom = viewTop + viewHeight,
693
+ rowHeight = row.getHeight(),
694
+ rowTop = row.dom.offsetTop,
695
+ rowBottom = rowTop + rowHeight;
696
+
697
+ if (rowBottom > viewTop && rowTop < viewBottom) {
698
+ tip.show();
699
+ me.hiddenTip = false;
700
+ } else {
701
+ tip.hide();
702
+ me.hiddenTip = true;
703
+ }
704
+ },
705
+
706
+ getErrors: function() {
707
+ var me = this,
708
+ dirtyText = !me.autoCancel && me.isDirty() ? me.dirtyText + '<br />' : '',
709
+ errors = [],
710
+ fields = me.query('>[isFormField]'),
711
+ length = fields.length,
712
+ i;
713
+
714
+ function createListItem(e) {
715
+ return '<li>' + e + '</li>';
716
+ }
717
+
718
+ for (i = 0; i < length; i++) {
719
+ errors = errors.concat(
720
+ Ext.Array.map(fields[i].getErrors(), createListItem)
721
+ );
722
+ }
723
+
724
+ return dirtyText + '<ul>' + errors.join('') + '</ul>';
725
+ },
726
+
727
+ beforeDestroy: function(){
728
+ Ext.destroy(this.floatingButtons, this.tooltip);
729
+ this.callParent();
730
+ }
731
+ });