luca 0.9.76 → 0.9.89

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 (457) hide show
  1. data/CHANGELOG +65 -2
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +18 -2
  4. data/Guardfile +3 -25
  5. data/README.md +50 -58
  6. data/ROADMAP +15 -32
  7. data/Rakefile +18 -77
  8. data/app.rb +12 -46
  9. data/{assets → app/assets}/images/glyphicons-halflings-white.png +0 -0
  10. data/{assets → app/assets}/images/glyphicons-halflings.png +0 -0
  11. data/app/assets/javascripts/luca-ui.js +1 -0
  12. data/app/assets/javascripts/luca/basic.coffee +8 -0
  13. data/{src → app/assets/javascripts/luca}/components/application.coffee +233 -65
  14. data/{src → app/assets/javascripts/luca}/components/collection_loader_view.coffee +0 -0
  15. data/app/assets/javascripts/luca/components/collection_view.coffee +207 -0
  16. data/{src → app/assets/javascripts/luca}/components/controller.coffee +27 -13
  17. data/{src/core/field.coffee → app/assets/javascripts/luca/components/fields/base.coffee} +18 -10
  18. data/{src → app/assets/javascripts/luca}/components/fields/button_field.coffee +8 -9
  19. data/{src → app/assets/javascripts/luca}/components/fields/checkbox_array.coffee +0 -0
  20. data/{src → app/assets/javascripts/luca}/components/fields/checkbox_field.coffee +0 -0
  21. data/{src → app/assets/javascripts/luca}/components/fields/file_upload_field.coffee +0 -0
  22. data/{src → app/assets/javascripts/luca}/components/fields/hidden_field.coffee +0 -0
  23. data/{src → app/assets/javascripts/luca}/components/fields/label_field.coffee +0 -0
  24. data/app/assets/javascripts/luca/components/fields/select_field.coffee +159 -0
  25. data/app/assets/javascripts/luca/components/fields/text_area_field.coffee +57 -0
  26. data/{src → app/assets/javascripts/luca}/components/fields/text_field.coffee +9 -3
  27. data/{src → app/assets/javascripts/luca}/components/fields/type_ahead_field.coffee +0 -0
  28. data/app/assets/javascripts/luca/components/form_view.coffee +421 -0
  29. data/app/assets/javascripts/luca/components/grid_layout_view.coffee +43 -0
  30. data/app/assets/javascripts/luca/components/index.coffee +7 -0
  31. data/app/assets/javascripts/luca/components/load_mask.coffee +8 -0
  32. data/{src → app/assets/javascripts/luca}/components/multi_collection_view.coffee +34 -34
  33. data/app/assets/javascripts/luca/components/nav_bar.coffee +80 -0
  34. data/app/assets/javascripts/luca/components/page.coffee +69 -0
  35. data/app/assets/javascripts/luca/components/page_controller.coffee +3 -0
  36. data/{src → app/assets/javascripts/luca}/components/pagination_control.coffee +13 -13
  37. data/{src → app/assets/javascripts/luca}/components/record_manager.coffee +0 -0
  38. data/{src → app/assets/javascripts/luca}/components/router.coffee +4 -1
  39. data/app/assets/javascripts/luca/components/simple_collection_view.coffee +10 -0
  40. data/app/assets/javascripts/luca/components/table_view.coffee +93 -0
  41. data/app/assets/javascripts/luca/components/table_view_scrollable.coffee +23 -0
  42. data/{src → app/assets/javascripts/luca}/concerns/application_event_bindings.coffee +1 -1
  43. data/app/assets/javascripts/luca/concerns/collection_event_bindings.coffee +47 -0
  44. data/{src → app/assets/javascripts/luca}/concerns/deferrable.coffee +1 -2
  45. data/app/assets/javascripts/luca/concerns/development_tool_helpers.coffee +30 -0
  46. data/{src → app/assets/javascripts/luca}/concerns/dom_helpers.coffee +10 -7
  47. data/{src → app/assets/javascripts/luca}/concerns/enhanced_properties.coffee +0 -0
  48. data/{src → app/assets/javascripts/luca}/concerns/filterable.coffee +39 -20
  49. data/app/assets/javascripts/luca/concerns/form_model_bindings.coffee +20 -0
  50. data/{src → app/assets/javascripts/luca}/concerns/grid_layout.coffee +0 -0
  51. data/{src → app/assets/javascripts/luca}/concerns/loadmaskable.coffee +17 -11
  52. data/{src → app/assets/javascripts/luca}/concerns/local_storage.coffee +0 -0
  53. data/app/assets/javascripts/luca/concerns/modal_view.coffee +63 -0
  54. data/{src → app/assets/javascripts/luca}/concerns/model_presenter.coffee +0 -0
  55. data/{src → app/assets/javascripts/luca}/concerns/paginatable.coffee +6 -20
  56. data/{src → app/assets/javascripts/luca}/concerns/query_collection_bindings.coffee +16 -8
  57. data/app/assets/javascripts/luca/concerns/sortable.coffee +69 -0
  58. data/app/assets/javascripts/luca/concerns/state_model.coffee +58 -0
  59. data/{src → app/assets/javascripts/luca}/concerns/templating.coffee +6 -1
  60. data/app/assets/javascripts/luca/config.coffee +54 -0
  61. data/{src → app/assets/javascripts/luca}/containers/card_view.coffee +23 -8
  62. data/{src/core → app/assets/javascripts/luca/containers}/container.coffee +228 -77
  63. data/app/assets/javascripts/luca/containers/index.coffee +2 -0
  64. data/{src → app/assets/javascripts/luca}/containers/modal_view.coffee +1 -1
  65. data/{src → app/assets/javascripts/luca}/containers/panel_toolbar.coffee +5 -6
  66. data/{src → app/assets/javascripts/luca}/containers/tab_view.coffee +19 -10
  67. data/{src → app/assets/javascripts/luca}/containers/viewport.coffee +11 -12
  68. data/{src → app/assets/javascripts/luca}/core/collection.coffee +37 -23
  69. data/{src/components → app/assets/javascripts/luca/core}/collection_view.coffee +21 -38
  70. data/{src/plugins → app/assets/javascripts/luca/core}/events.coffee +38 -6
  71. data/app/assets/javascripts/luca/core/index.coffee +12 -0
  72. data/{src → app/assets/javascripts/luca}/core/model.coffee +1 -1
  73. data/{src → app/assets/javascripts/luca}/core/observer.coffee +0 -0
  74. data/app/assets/javascripts/luca/core/panel.coffee +124 -0
  75. data/{src/define.coffee → app/assets/javascripts/luca/core/registry/component_definition.coffee} +59 -8
  76. data/{src → app/assets/javascripts/luca/core/registry}/concerns.coffee +0 -0
  77. data/app/assets/javascripts/luca/core/registry/index.coffee +4 -0
  78. data/{src/core → app/assets/javascripts/luca/core/registry}/meta_data.coffee +6 -0
  79. data/{src/core → app/assets/javascripts/luca/core/registry}/registry.coffee +20 -14
  80. data/app/assets/javascripts/luca/core/templates.coffee +51 -0
  81. data/app/assets/javascripts/luca/core/view.coffee +364 -0
  82. data/app/assets/javascripts/luca/dependencies.coffee +9 -0
  83. data/{src/tools → app/assets/javascripts/luca/development}/code_mirror_field.coffee +2 -1
  84. data/app/assets/javascripts/luca/development/code_sync_manager.coffee +126 -0
  85. data/app/assets/javascripts/luca/development/component.coffee +76 -0
  86. data/app/assets/javascripts/luca/development/components.coffee +57 -0
  87. data/{src/tools → app/assets/javascripts/luca/development}/console.coffee +6 -5
  88. data/app/assets/javascripts/luca/development/index.coffee +5 -0
  89. data/{src → app/assets/javascripts/luca}/framework.coffee +16 -99
  90. data/app/assets/javascripts/luca/index.coffee +8 -0
  91. data/{src → app/assets/javascripts/luca}/managers/collection_manager.coffee +12 -8
  92. data/app/assets/javascripts/luca/managers/index.coffee +2 -0
  93. data/app/assets/javascripts/luca/managers/socket_manager.coffee +89 -0
  94. data/{src → app/assets/javascripts/luca}/templates/components/bootstrap_form_controls.jst.ejs +0 -0
  95. data/{src → app/assets/javascripts/luca}/templates/components/collection_loader_view.jst.ejs +0 -0
  96. data/{src → app/assets/javascripts/luca}/templates/components/form_alert.jst.ejs +0 -0
  97. data/{src → app/assets/javascripts/luca}/templates/components/grid_view.jst.ejs +0 -0
  98. data/{src → app/assets/javascripts/luca}/templates/components/grid_view_empty_text.jst.ejs +0 -0
  99. data/{src → app/assets/javascripts/luca}/templates/components/load_mask.jst.ejs +0 -0
  100. data/app/assets/javascripts/luca/templates/components/nav_bar.jst.ejs +19 -0
  101. data/{src → app/assets/javascripts/luca}/templates/components/pagination.jst.ejs +0 -0
  102. data/{src/templates → app/assets/javascripts/luca/templates/components}/table_view.jst.ejs +0 -0
  103. data/{src → app/assets/javascripts/luca}/templates/containers/basic.jst.ejs +0 -0
  104. data/{src → app/assets/javascripts/luca}/templates/containers/tab_selector_container.jst.ejs +0 -0
  105. data/app/assets/javascripts/luca/templates/containers/tab_view.jst.ejs +2 -0
  106. data/{src → app/assets/javascripts/luca}/templates/containers/toolbar_wrapper.jst.ejs +0 -0
  107. data/{src → app/assets/javascripts/luca}/templates/fields/button_field.jst.ejs +0 -0
  108. data/{src → app/assets/javascripts/luca}/templates/fields/button_field_link.jst.ejs +0 -0
  109. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_array.jst.ejs +0 -0
  110. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_array_item.jst.ejs +0 -0
  111. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_field.jst.ejs +0 -0
  112. data/{src → app/assets/javascripts/luca}/templates/fields/file_upload_field.jst.ejs +0 -0
  113. data/{src → app/assets/javascripts/luca}/templates/fields/hidden_field.jst.ejs +0 -0
  114. data/{src → app/assets/javascripts/luca}/templates/fields/select_field.jst.ejs +0 -0
  115. data/{src → app/assets/javascripts/luca}/templates/fields/text_area_field.jst.ejs +0 -0
  116. data/{src → app/assets/javascripts/luca}/templates/fields/text_field.jst.ejs +0 -0
  117. data/app/assets/javascripts/luca/util/deprecations.coffee +18 -0
  118. data/app/assets/javascripts/luca/util/index.coffee +4 -0
  119. data/app/assets/javascripts/luca/util/keybindings.coffee +24 -0
  120. data/app/assets/javascripts/luca/util/logging.coffee +30 -0
  121. data/{src/util.coffee → app/assets/javascripts/luca/util/luca.coffee} +27 -4
  122. data/{src/core → app/assets/javascripts/luca/util}/script_loader.coffee +0 -0
  123. data/{src/stylesheets → app/assets/stylesheets/luca}/components/checkbox_array.scss +0 -0
  124. data/app/assets/stylesheets/luca/components/form_view.scss +7 -0
  125. data/{src/stylesheets → app/assets/stylesheets/luca}/components/grid_view.scss +0 -0
  126. data/{src/stylesheets → app/assets/stylesheets/luca}/components/load_mask.scss +0 -0
  127. data/{vendor/assets/luca-ui/components/grid_view.css → app/assets/stylesheets/luca/components/table_view.scss} +60 -51
  128. data/{src/stylesheets → app/assets/stylesheets/luca}/components/viewport.scss +0 -0
  129. data/app/assets/stylesheets/luca/containers/container.scss +19 -0
  130. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/modal_view.scss +0 -0
  131. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/panels.scss +0 -0
  132. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/tab_view.scss +0 -0
  133. data/{src/stylesheets/tools → app/assets/stylesheets/luca/development}/console.scss +0 -0
  134. data/app/assets/stylesheets/luca/development/index.css +3 -0
  135. data/app/assets/stylesheets/luca/index.css +4 -0
  136. data/{src/stylesheets → app/assets/stylesheets/luca}/normalize.scss +0 -0
  137. data/config.ru +1 -2
  138. data/docs/framework.json +1 -0
  139. data/docs/{application.md → old/application.md} +0 -0
  140. data/docs/{collection.md → old/collection.md} +0 -0
  141. data/docs/{collection_manager.md → old/collection_manager.md} +0 -0
  142. data/docs/{container_philosophy.md → old/container_philosophy.md} +0 -0
  143. data/docs/{event_binding_helpers.md → old/event_binding_helpers.md} +0 -0
  144. data/docs/{method_caching_and_computed_properties.md → old/method_caching_and_computed_properties.md} +0 -0
  145. data/docs/{view.md → old/view.md} +0 -0
  146. data/lib/generators/luca/application/application_generator.rb +12 -8
  147. data/lib/generators/luca/application/templates/controller.rb +0 -2
  148. data/lib/generators/luca/application/templates/index.html.erb +12 -0
  149. data/lib/generators/luca/application/templates/index.html.haml +1 -0
  150. data/lib/generators/luca/application/templates/javascripts/application.coffee +18 -0
  151. data/lib/generators/luca/application/templates/javascripts/collection_manager.coffee +2 -0
  152. data/lib/generators/luca/application/templates/javascripts/config.coffee +3 -0
  153. data/lib/generators/luca/application/templates/javascripts/dependencies.coffee +3 -0
  154. data/lib/generators/luca/application/templates/javascripts/home.jst.ejs +2 -0
  155. data/lib/generators/luca/application/templates/javascripts/index.coffee +15 -0
  156. data/lib/generators/luca/application/templates/javascripts/router.coffee +4 -0
  157. data/lib/guard/luca.rb +84 -0
  158. data/lib/luca.rb +18 -1
  159. data/lib/luca/asset_compiler.rb +117 -0
  160. data/lib/luca/collection.rb +64 -0
  161. data/lib/luca/collection/endpoint.rb +37 -0
  162. data/lib/luca/collection/file_backend.rb +121 -0
  163. data/lib/luca/collection/redis_backend.rb +153 -0
  164. data/lib/luca/compiled_asset.rb +61 -0
  165. data/lib/luca/component_definition.rb +338 -0
  166. data/lib/luca/luca_application.rb +247 -0
  167. data/lib/luca/project.rb +73 -0
  168. data/lib/luca/project_harness.rb +96 -0
  169. data/lib/luca/rails.rb +5 -3
  170. data/lib/luca/rails/engine.rb +12 -0
  171. data/lib/luca/rails/version.rb +1 -2
  172. data/lib/luca/stylesheet.rb +36 -0
  173. data/lib/luca/template.rb +2 -0
  174. data/lib/luca/template_asset.rb +64 -0
  175. data/lib/railties/luca/tasks.rake +38 -0
  176. data/spec/{components → javascripts/components}/application_spec.coffee +0 -0
  177. data/spec/{components → javascripts/components}/collection_loader_view_spec.coffee +0 -0
  178. data/spec/{components → javascripts/components}/collection_view_spec.coffee +0 -0
  179. data/spec/{components → javascripts/components}/controller_spec.coffee +4 -0
  180. data/spec/{components → javascripts/components}/fields/checkbox_array_spec.coffee +0 -0
  181. data/spec/javascripts/components/form_view_spec.coffee +162 -0
  182. data/spec/{components → javascripts/components}/grid_view_spec.coffee +0 -0
  183. data/spec/{components → javascripts/components}/multi_collection_view_spec.coffee +0 -0
  184. data/spec/{components → javascripts/components}/pagination_control_spec.coffee +0 -0
  185. data/spec/{components → javascripts/components}/record_manager_spec.coffee +0 -0
  186. data/spec/{components → javascripts/components}/table_view_spec.coffee +0 -0
  187. data/spec/{components → javascripts/components}/template_spec.coffee +0 -0
  188. data/spec/javascripts/concerns/collection_event_bindings_spec.coffee +15 -0
  189. data/spec/{concerns → javascripts/concerns}/dom_helpers_spec.coffee +2 -2
  190. data/spec/{concerns → javascripts/concerns}/filterable_spec.coffee +4 -4
  191. data/spec/{concerns → javascripts/concerns}/model_presenter_spec.coffee +0 -0
  192. data/spec/{concerns → javascripts/concerns}/paginatable_spec.coffee +0 -0
  193. data/spec/javascripts/concerns/state_model_spec.coffee +55 -0
  194. data/spec/{containers → javascripts/containers}/card_view_spec.coffee +5 -0
  195. data/spec/{containers → javascripts/containers}/modal_view_spec.coffee +0 -0
  196. data/spec/{containers → javascripts/containers}/panel_view_spec.coffee +0 -0
  197. data/spec/{containers → javascripts/containers}/tab_view_spec.coffee +0 -0
  198. data/spec/{containers → javascripts/containers}/viewport_spec.coffee +0 -0
  199. data/spec/{core → javascripts/core}/collection_spec.coffee +25 -0
  200. data/spec/{concerns_spec.coffee → javascripts/core/concerns_spec.coffee} +0 -0
  201. data/spec/{core → javascripts/core}/container_spec.coffee +8 -6
  202. data/spec/{define_spec.coffee → javascripts/core/define_spec.coffee} +0 -0
  203. data/spec/javascripts/core/events_spec.coffee +26 -0
  204. data/spec/{core → javascripts/core}/field_spec.coffee +0 -0
  205. data/spec/{framework_spec.coffee → javascripts/core/framework_spec.coffee} +1 -1
  206. data/spec/{core → javascripts/core}/model_spec.coffee +0 -0
  207. data/spec/{core → javascripts/core}/observer_spec.coffee +0 -0
  208. data/spec/{util_spec.coffee → javascripts/core/util_spec.coffee} +2 -2
  209. data/spec/{core → javascripts/core}/view_spec.coffee +114 -38
  210. data/spec/javascripts/dependencies/index.coffee +3 -0
  211. data/{assets → spec}/javascripts/dependencies/jasmine-html.js +0 -0
  212. data/{assets → spec}/javascripts/dependencies/jasmine.js +0 -0
  213. data/{assets → spec}/javascripts/dependencies/sinon.js +0 -0
  214. data/spec/{helper.coffee → javascripts/helper.coffee} +0 -0
  215. data/spec/{managers → javascripts/managers}/collection_manager_spec.coffee +0 -0
  216. data/spec/{managers → javascripts/managers}/socket_manager_spec.coffee +0 -0
  217. data/spec/lib/component_definition_spec.rb +63 -0
  218. data/spec/lib/input_compiler_spec.rb +9 -0
  219. data/spec/lib/luca_application_spec.rb +30 -0
  220. data/spec/support/fixtures/application.coffee +45 -0
  221. data/spec/support/fixtures/component.coffee +34 -0
  222. data/{assets/javascripts/sandbox/views/inspector/instance_list.coffee → tutorials/component-definitions.md} +0 -0
  223. data/{spec/concerns/state_model_spec.coffee → tutorials/component-definitions/01_intro.md} +0 -0
  224. data/tutorials/component-driven-design.md +140 -0
  225. data/tutorials/structure-of-a-project.md +63 -0
  226. data/vendor/assets/javascripts/backbone-ext.js +21 -0
  227. data/vendor/assets/javascripts/backbone-min.js +38 -0
  228. data/vendor/assets/javascripts/backbone-query.min.js +1 -0
  229. data/vendor/assets/javascripts/bootstrap.min.js +7 -0
  230. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-coffeescript.js +0 -0
  231. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-css.js +0 -0
  232. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-html.js +0 -0
  233. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-javascript.js +0 -0
  234. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-less.js +0 -0
  235. data/vendor/assets/javascripts/codemirror-ui.js +503 -0
  236. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-vim.js +0 -0
  237. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror.js +0 -0
  238. data/vendor/assets/javascripts/hogan.js +707 -0
  239. data/vendor/assets/javascripts/inflections.js +656 -0
  240. data/vendor/assets/javascripts/jasmine-html.js +190 -0
  241. data/vendor/assets/javascripts/jasmine.js +2476 -0
  242. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/jquery.js +0 -0
  243. data/vendor/assets/javascripts/keymaster.min.js +4 -0
  244. data/vendor/assets/javascripts/luca-dependencies.min.js +6 -0
  245. data/vendor/assets/javascripts/luca-development.min.js +1 -0
  246. data/vendor/assets/javascripts/luca-spec.js +11 -0
  247. data/vendor/assets/javascripts/luca-ui.js +3336 -2561
  248. data/vendor/assets/javascripts/luca-ui.min.js +5 -5
  249. data/vendor/assets/javascripts/luca.full.min.js +10 -0
  250. data/vendor/assets/javascripts/luca.min.js +5 -0
  251. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/modal.js +0 -0
  252. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/modernizr.min.js +0 -0
  253. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/prettify.js +0 -0
  254. data/vendor/assets/javascripts/sinon.js +3469 -0
  255. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/spin-min.js +0 -0
  256. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/underscore-min.js +0 -0
  257. data/vendor/assets/javascripts/underscore-string.min.js +1 -0
  258. data/vendor/assets/stylesheets/bootstrap-responsive.min.css +9 -0
  259. data/vendor/assets/stylesheets/bootstrap.min.css +9 -0
  260. data/{assets → vendor/assets}/stylesheets/codemirror-blackboard.css +0 -0
  261. data/{assets → vendor/assets}/stylesheets/codemirror-monokai.css +0 -0
  262. data/{assets → vendor/assets}/stylesheets/codemirror.css +0 -0
  263. data/{assets → vendor/assets}/stylesheets/jasmine.css +0 -0
  264. data/vendor/assets/stylesheets/luca-components.css +204 -0
  265. data/vendor/assets/stylesheets/luca-development.css +23 -0
  266. data/vendor/assets/stylesheets/luca-ui.css +58 -461
  267. data/views/jasmine.erb +2 -2
  268. metadata +280 -336
  269. data/assets/javascripts/dependencies.coffee +0 -5
  270. data/assets/javascripts/dependencies/backbone-min.js +0 -37
  271. data/assets/javascripts/dependencies/backbone-query.min.js +0 -1
  272. data/assets/javascripts/dependencies/bootstrap.min.js +0 -7
  273. data/assets/javascripts/dependencies/coffee-script.js +0 -12189
  274. data/assets/javascripts/dependencies/underscore-string.min.js +0 -14
  275. data/assets/javascripts/luca-templates.js +0 -1
  276. data/assets/javascripts/luca-ui-base.coffee +0 -1
  277. data/assets/javascripts/luca-ui-bootstrap.js +0 -1
  278. data/assets/javascripts/luca-ui-development-tools.coffee +0 -9
  279. data/assets/javascripts/luca-ui-full.js +0 -3
  280. data/assets/javascripts/luca-ui-spec.coffee +0 -2
  281. data/assets/javascripts/luca-ui.js +0 -3
  282. data/assets/javascripts/luca/index.coffee +0 -1
  283. data/assets/javascripts/sandbox.coffee +0 -7
  284. data/assets/javascripts/sandbox/application.coffee +0 -57
  285. data/assets/javascripts/sandbox/config.coffee +0 -7
  286. data/assets/javascripts/sandbox/router.coffee +0 -24
  287. data/assets/javascripts/sandbox/templates/builder.luca +0 -2
  288. data/assets/javascripts/sandbox/templates/builder/component_list.luca +0 -1
  289. data/assets/javascripts/sandbox/templates/main.luca +0 -53
  290. data/assets/javascripts/sandbox/templates/sandbox.luca +0 -1
  291. data/assets/javascripts/sandbox/templates/sandbox/docs_index.luca +0 -1
  292. data/assets/javascripts/sandbox/templates/sandbox/navigation.luca +0 -8
  293. data/assets/javascripts/sandbox/templates/sandbox/readme.luca +0 -30
  294. data/assets/javascripts/sandbox/views/builder.coffee +0 -133
  295. data/assets/javascripts/sandbox/views/builder/builder_canvas.coffee +0 -3
  296. data/assets/javascripts/sandbox/views/builder/builder_editor.coffee +0 -6
  297. data/assets/javascripts/sandbox/views/builder/component_list.coffee +0 -38
  298. data/assets/javascripts/sandbox/views/builder/project_browser.coffee +0 -14
  299. data/assets/javascripts/sandbox/views/docs_controller.coffee +0 -7
  300. data/assets/javascripts/sandbox/views/inspector.coffee +0 -11
  301. data/assets/javascripts/sandbox/views/inspector/instance_filter.coffee +0 -18
  302. data/assets/javascripts/sandbox/views/top_navigation.coffee +0 -4
  303. data/assets/javascripts/spec-dependencies.coffee +0 -4
  304. data/assets/stylesheets/bootstrap-responsive.min.css +0 -2
  305. data/assets/stylesheets/bootstrap.min.css +0 -727
  306. data/assets/stylesheets/luca-ui-bootstrap.css +0 -4
  307. data/assets/stylesheets/luca-ui-development-tools.css +0 -5
  308. data/assets/stylesheets/luca-ui-full.css +0 -3
  309. data/assets/stylesheets/luca-ui-spec.css +0 -3
  310. data/assets/stylesheets/luca-ui.css +0 -3
  311. data/assets/stylesheets/prettify.css +0 -40
  312. data/assets/stylesheets/sandbox.css +0 -3
  313. data/assets/stylesheets/sandbox/builder.scss +0 -79
  314. data/assets/stylesheets/sandbox/sandbox.scss +0 -18
  315. data/assets/stylesheets/themes/amelia-bootstrap.css +0 -826
  316. data/assets/stylesheets/themes/slate-bootstrap.css +0 -797
  317. data/assets/stylesheets/themes/superhero-bootstrap.css +0 -830
  318. data/lib/generators/luca/application/templates/javascripts/application.js +0 -28
  319. data/lib/generators/luca/application/templates/javascripts/application.js.coffee +0 -20
  320. data/lib/generators/luca/application/templates/javascripts/config.js +0 -15
  321. data/lib/generators/luca/application/templates/javascripts/config.js.coffee +0 -9
  322. data/lib/generators/luca/application/templates/javascripts/dependencies.js +0 -5
  323. data/lib/generators/luca/application/templates/javascripts/dependencies.js.coffee +0 -5
  324. data/lib/generators/luca/application/templates/javascripts/index.js +0 -9
  325. data/lib/generators/luca/application/templates/javascripts/index.js.coffee +0 -9
  326. data/lib/generators/luca/application/templates/javascripts/main.js +0 -8
  327. data/lib/generators/luca/application/templates/javascripts/main.js.coffee +0 -3
  328. data/lib/generators/luca/application/templates/javascripts/main.jst.ejs +0 -1
  329. data/lib/generators/luca/application/templates/javascripts/router.js +0 -12
  330. data/lib/generators/luca/application/templates/javascripts/router.js.coffee +0 -7
  331. data/lib/luca/code_browser.rb +0 -55
  332. data/lib/luca/command_line.rb +0 -69
  333. data/spec/components/form_view_spec.coffee +0 -84
  334. data/spec/containers/column_view_spec.coffee +0 -0
  335. data/spec/containers/split_view_spec.coffee +0 -0
  336. data/src/components/base_toolbar.coffee +0 -17
  337. data/src/components/fields/select_field.coffee +0 -96
  338. data/src/components/fields/text_area_field.coffee +0 -42
  339. data/src/components/form_button_toolbar.coffee +0 -28
  340. data/src/components/form_view.coffee +0 -282
  341. data/src/components/grid_view.coffee +0 -269
  342. data/src/components/index.coffee +0 -1
  343. data/src/components/load_mask.coffee +0 -3
  344. data/src/components/nav_bar.coffee +0 -22
  345. data/src/components/page_controller.coffee +0 -2
  346. data/src/components/table_view.coffee +0 -69
  347. data/src/components/template.coffee +0 -5
  348. data/src/components/toolbar_dialog.coffee +0 -25
  349. data/src/concerns/collection_event_bindings.coffee +0 -26
  350. data/src/concerns/modal_view.coffee +0 -38
  351. data/src/concerns/state_model.coffee +0 -16
  352. data/src/containers/column_view.coffee +0 -42
  353. data/src/containers/page_view.coffee +0 -2
  354. data/src/containers/panel_view.coffee +0 -23
  355. data/src/containers/split_view.coffee +0 -8
  356. data/src/core/core.coffee +0 -0
  357. data/src/core/panel.coffee +0 -118
  358. data/src/core/view.coffee +0 -172
  359. data/src/index.coffee +0 -25
  360. data/src/managers/socket_manager.coffee +0 -54
  361. data/src/plugins/development_tool_helpers.coffee +0 -21
  362. data/src/samples/definition.coffee +0 -49
  363. data/src/stylesheets/base.scss +0 -0
  364. data/src/stylesheets/components/form_view.scss +0 -59
  365. data/src/stylesheets/components/toolbar.scss +0 -0
  366. data/src/stylesheets/containers/container.scss +0 -11
  367. data/src/stylesheets/tools/class_browser.scss +0 -32
  368. data/src/stylesheets/tools/code_editor.scss +0 -24
  369. data/src/stylesheets/tools/component_tester.scss +0 -26
  370. data/src/templates/components/nav_bar.jst.ejs +0 -4
  371. data/src/templates/containers/tab_view.jst.ejs +0 -2
  372. data/src/tools/application_inspector.coffee +0 -2
  373. data/src/tools/code_editor.coffee +0 -258
  374. data/src/tools/coffee_script_editor.coffee +0 -82
  375. data/src/tools/collection_inspector.coffee +0 -4
  376. data/src/tools/collections/components.coffee +0 -59
  377. data/src/tools/collections/instances.coffee +0 -15
  378. data/src/tools/component_tester.coffee +0 -462
  379. data/src/tools/models/components.coffee +0 -25
  380. data/src/tools/models/instance.coffee +0 -2
  381. data/src/tools/templates/component_tester/help.luca +0 -14
  382. data/vendor/assets/javascripts/luca-ui-base.js +0 -5304
  383. data/vendor/assets/javascripts/luca-ui-bootstrap.js +0 -9
  384. data/vendor/assets/javascripts/luca-ui-development-tools.js +0 -18561
  385. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +0 -15
  386. data/vendor/assets/javascripts/luca-ui-full.js +0 -6696
  387. data/vendor/assets/javascripts/luca-ui-full.min.js +0 -9
  388. data/vendor/assets/javascripts/luca-ui-spec.js +0 -6815
  389. data/vendor/assets/javascripts/luca-ui-templates.js +0 -92
  390. data/vendor/assets/luca-ui/base.css +0 -85
  391. data/vendor/assets/luca-ui/components/application.js +0 -91
  392. data/vendor/assets/luca-ui/components/base_toolbar.js +0 -23
  393. data/vendor/assets/luca-ui/components/controller.js +0 -38
  394. data/vendor/assets/luca-ui/components/fields/button_field.js +0 -45
  395. data/vendor/assets/luca-ui/components/fields/checkbox_field.js +0 -43
  396. data/vendor/assets/luca-ui/components/fields/file_upload_field.js +0 -20
  397. data/vendor/assets/luca-ui/components/fields/hidden_field.js +0 -20
  398. data/vendor/assets/luca-ui/components/fields/select_field.js +0 -97
  399. data/vendor/assets/luca-ui/components/fields/text_area_field.js +0 -48
  400. data/vendor/assets/luca-ui/components/fields/text_field.js +0 -46
  401. data/vendor/assets/luca-ui/components/fields/type_ahead_field.js +0 -13
  402. data/vendor/assets/luca-ui/components/form_button_toolbar.js +0 -32
  403. data/vendor/assets/luca-ui/components/form_view.css +0 -32
  404. data/vendor/assets/luca-ui/components/form_view.js +0 -207
  405. data/vendor/assets/luca-ui/components/grid_view.js +0 -202
  406. data/vendor/assets/luca-ui/components/record_manager.js +0 -207
  407. data/vendor/assets/luca-ui/components/router.js +0 -36
  408. data/vendor/assets/luca-ui/components/template.js +0 -26
  409. data/vendor/assets/luca-ui/components/toolbar.css +0 -11
  410. data/vendor/assets/luca-ui/containers/card_view.js +0 -98
  411. data/vendor/assets/luca-ui/containers/column_view.js +0 -52
  412. data/vendor/assets/luca-ui/containers/container.css +0 -3
  413. data/vendor/assets/luca-ui/containers/modal_view.css +0 -0
  414. data/vendor/assets/luca-ui/containers/modal_view.js +0 -87
  415. data/vendor/assets/luca-ui/containers/panel_view.js +0 -34
  416. data/vendor/assets/luca-ui/containers/split_view.js +0 -13
  417. data/vendor/assets/luca-ui/containers/tab_view.css +0 -16
  418. data/vendor/assets/luca-ui/containers/tab_view.js +0 -80
  419. data/vendor/assets/luca-ui/containers/viewport.js +0 -18
  420. data/vendor/assets/luca-ui/core/collection.js +0 -221
  421. data/vendor/assets/luca-ui/core/container.js +0 -205
  422. data/vendor/assets/luca-ui/core/field.js +0 -59
  423. data/vendor/assets/luca-ui/core/observer.js +0 -42
  424. data/vendor/assets/luca-ui/core/view.js +0 -127
  425. data/vendor/assets/luca-ui/framework.js +0 -110
  426. data/vendor/assets/luca-ui/index.js +0 -5
  427. data/vendor/assets/luca-ui/managers/collection_manager.js +0 -98
  428. data/vendor/assets/luca-ui/managers/socket_manager.js +0 -52
  429. data/vendor/assets/luca-ui/modules/deferrable.js +0 -21
  430. data/vendor/assets/luca-ui/modules/local_storage.js +0 -81
  431. data/vendor/assets/luca-ui/normalize.css +0 -359
  432. data/vendor/assets/luca-ui/stylesheets/base.css +0 -85
  433. data/vendor/assets/luca-ui/stylesheets/components/form_view.css +0 -32
  434. data/vendor/assets/luca-ui/stylesheets/components/grid_view.css +0 -76
  435. data/vendor/assets/luca-ui/stylesheets/components/toolbar.css +0 -11
  436. data/vendor/assets/luca-ui/stylesheets/containers/container.css +0 -3
  437. data/vendor/assets/luca-ui/stylesheets/containers/modal_view.css +0 -0
  438. data/vendor/assets/luca-ui/stylesheets/containers/tab_view.css +0 -16
  439. data/vendor/assets/luca-ui/stylesheets/normalize.css +0 -359
  440. data/vendor/assets/luca-ui/templates/components/bootstrap_form_controls.js +0 -4
  441. data/vendor/assets/luca-ui/templates/components/form_view.js +0 -4
  442. data/vendor/assets/luca-ui/templates/components/grid_view.js +0 -4
  443. data/vendor/assets/luca-ui/templates/components/grid_view_empty_text.js +0 -4
  444. data/vendor/assets/luca-ui/templates/containers/basic.js +0 -4
  445. data/vendor/assets/luca-ui/templates/containers/tab_selector_container.js +0 -4
  446. data/vendor/assets/luca-ui/templates/containers/tab_view.js +0 -4
  447. data/vendor/assets/luca-ui/templates/containers/toolbar_wrapper.js +0 -4
  448. data/vendor/assets/luca-ui/templates/fields/button_field.js +0 -4
  449. data/vendor/assets/luca-ui/templates/fields/button_field_link.js +0 -4
  450. data/vendor/assets/luca-ui/templates/fields/checkbox_field.js +0 -4
  451. data/vendor/assets/luca-ui/templates/fields/file_upload_field.js +0 -4
  452. data/vendor/assets/luca-ui/templates/fields/hidden_field.js +0 -4
  453. data/vendor/assets/luca-ui/templates/fields/select_field.js +0 -4
  454. data/vendor/assets/luca-ui/templates/fields/text_area_field.js +0 -4
  455. data/vendor/assets/luca-ui/templates/fields/text_field.js +0 -4
  456. data/vendor/assets/luca-ui/templates/sample/contents.js +0 -4
  457. data/vendor/assets/luca-ui/templates/sample/welcome.js +0 -4
@@ -0,0 +1,207 @@
1
+ # The `Luca.CollectionView` renders models from a `Luca.Collection` into multiple
2
+ # elements, and provides methods for filtering, paginating, sorting the underlying
3
+ # collection and re-rendering the contents of its `@el` accordingly.
4
+ #
5
+ # #### Basic Example
6
+ # collectionView = Luca.register "App.views.Books"
7
+ # collectionView.extends "Luca.CollectionView"
8
+ #
9
+ # collectionView.defines
10
+ # itemProperty: "author"
11
+ # collection: new Luca.Collection([
12
+ # author: "George Orwell"
13
+ # title: "Animal Farm"
14
+ # ,
15
+ # author: "Noam Chomsky"
16
+ # title: "Manufacturing Consent"
17
+ # ])
18
+ #
19
+ # view = new App.views.Books()
20
+ # #### Extending it to make it Filterable and Paginatable
21
+ # filterable = Luca.register "App.views.FilterableBooks"
22
+ # filterable.extends "App.views.Books"
23
+ # filterable.defines
24
+ # collection: "books"
25
+ # paginatable: 12
26
+ # filterable:
27
+ # query:
28
+ # author: "George Orwell"
29
+ #
30
+ # view = new App.views.FilterableBooks()
31
+ # #### Filterable Collections
32
+ #
33
+ # The `Luca.CollectionView` will attempt to perform a local query against its
34
+ # collection which behaves like a `Backbone.QueryCollection`. It will do this
35
+ # by default without making a remote request to the API.
36
+ #
37
+ # If you do not want this behavior, you can configure the `Luca.CollectionView` to
38
+ # behave as if the filtering was happen remotely in your REST API.
39
+ #
40
+ # filterable:
41
+ # options:
42
+ # remote: true
43
+ collectionView = Luca.register "Luca.CollectionView"
44
+
45
+ collectionView.extends "Luca.Panel"
46
+
47
+ collectionView.replaces "Luca.components.CollectionView"
48
+
49
+ collectionView.mixesIn "QueryCollectionBindings",
50
+ "LoadMaskable",
51
+ "Filterable",
52
+ "Paginatable",
53
+ "Sortable"
54
+
55
+ collectionView.triggers "before:refresh",
56
+ "after:refresh",
57
+ "refresh",
58
+ "empty:results"
59
+
60
+ collectionView.publicConfiguration
61
+ # Specify which collection will be used to supply the models to be rendered.
62
+ # Accepts either a string alias for the Collection class, or an instance of
63
+ # any class which inherits from Backbone.Collection
64
+ collection: undefined
65
+
66
+ # By default the CollectionView will be rendered inside of an OL tag.
67
+ tagName: "ol"
68
+
69
+ # The CollectionView behaves as a Luca.Panel which means it has an area for
70
+ # top and bottom toolbars. The actual content that gets rendered from the
71
+ # collection will be rendered inside an element with the specified class.
72
+ bodyClassName: "collection-ui-panel"
73
+
74
+ # Each item from the collection will be rendered inside of an element specified by @itemTagName
75
+ itemTagName: 'li'
76
+
77
+ # Each item element will be assigned a CSS class specified by @itemClassName
78
+ itemClassName: 'collection-item'
79
+
80
+ # Specify which template should be used to render each item in the collection.
81
+ # Accepts a string which will be passed to Luca.template(@itemTemplate). Your template
82
+ # can expect to be passed an object with the `model` and `index` properties on it.
83
+ itemTemplate: undefined
84
+
85
+ # Accepts a reference to a function, which will be called with an object with the `model` and `index`
86
+ # properties on it. This function should return a String which will be injected into the item DOM element.
87
+ itemRenderer: undefined
88
+
89
+ # Plucks the specified property from the model and inserts it into the item DOM element.
90
+ itemProperty: undefined
91
+
92
+ # If @observeChanges is set to true, any change in an underlying model will automatically be re-rendered.
93
+ observeChanges: false
94
+
95
+ collectionView.publicMethods
96
+ initialize: (@options={})->
97
+ _.extend(@, @options)
98
+ _.bindAll @, "refresh"
99
+
100
+ unless @collection? or @options.collection
101
+ console.log "Error on initialize of collection view", @
102
+ throw "Collection Views must specify a collection"
103
+
104
+ unless @itemTemplate? || @itemRenderer? || @itemProperty?
105
+ throw "Collection Views must specify an item template or item renderer function"
106
+
107
+ if _.isString(@collection)
108
+ if Luca.CollectionManager.get()
109
+ @collection = Luca.CollectionManager.get().getOrCreate(@collection)
110
+ else
111
+ console.log "String Collection but no collection manager"
112
+
113
+ unless Luca.isBackboneCollection(@collection)
114
+ console.log "Missing Collection on #{ @name || @cid }", @, @collection
115
+ throw "Collection Views must have a valid backbone collection"
116
+
117
+ # INVESTIGATE THIS BEING DOUBLE WORK
118
+ @on "data:refresh", @refresh, @
119
+ @on "collection:reset", @refresh, @
120
+
121
+ @on "collection:remove", @refresh, @
122
+ @on "collection:add", @refresh, @
123
+ @on "collection:change", @refreshModel, @ if @observeChanges is true
124
+
125
+ Luca.Panel::initialize.apply(@, arguments)
126
+
127
+ view = @
128
+ if @getCollection()?.length > 0
129
+ @on "after:render", ()->
130
+ view.refresh()
131
+ view.unbind "after:render", @
132
+
133
+ # Given the id of a model, find the underlying DOM element which was rendered by this collection.
134
+ # Assumes that the data-model-id attribute is set, which it is by default by @attributesForItem.
135
+ locateItemElement: (id)->
136
+ @$(".#{ @itemClassName }[data-model-id='#{ id }']")
137
+
138
+ # Refresh is responsible for applying any filtering, pagination, or sorting options that may be set
139
+ # from the various Luca.concerns mixed in by `Luca.CollectionView` and making a query to the underlying
140
+ # collection. It will then take the set of models returned by `@getModels` and pass them through the
141
+ # item rendering pipeline.
142
+ refresh: ()->
143
+ query = @getLocalQuery()
144
+ options = @getQueryOptions()
145
+ models = @getModels(query, options)
146
+
147
+ @$bodyEl().empty()
148
+
149
+ @trigger("before:refresh", models, query, options)
150
+
151
+ if models.length is 0
152
+ @trigger("empty:results", query, options)
153
+
154
+ index = 0
155
+ for model in models
156
+ @$append @makeItem(model, index++)
157
+
158
+ @trigger("after:refresh", models, query, options)
159
+
160
+ @
161
+
162
+ collectionView.privateMethods
163
+ # Determines which attributes should be set on the item DOM element.
164
+ attributesForItem: (item, model)->
165
+ _.extend {}, class: @itemClassName, "data-index": item.index, "data-model-id": item.model.get('id')
166
+
167
+ # Determines the content for the item DOM element. Will use the appropriate options
168
+ # specified by `@itemTemplate`, `@itemRenderer`, or `@itemProperty`
169
+ contentForItem: (item={})->
170
+ if @itemTemplate? and templateFn = Luca.template(@itemTemplate)
171
+ return content = templateFn.call(@, item)
172
+
173
+ if @itemRenderer? and _.isFunction( @itemRenderer )
174
+ return content = @itemRenderer.call(@, item, item.model, item.index)
175
+
176
+ if @itemProperty and item.model?
177
+ return content = item.model.read( @itemProperty )
178
+
179
+ ""
180
+
181
+ # Uses the various options passed to the `CollectionView` to assemble a call to `Backbone.View::make`.
182
+ makeItem: (model, index)->
183
+ item = if @prepareItem? then @prepareItem.call(@, model, index) else (model:model, index: index)
184
+ attributes = @attributesForItem(item, model)
185
+ content = @contentForItem(item)
186
+
187
+ try
188
+ Backbone.View::make(@itemTagName, attributes, content)
189
+ catch e
190
+ console.log "Error generating DOM element for CollectionView", @, model, index
191
+
192
+ # Given a model, attempt to re-render the contents of its item in this view's DOM contents.
193
+ refreshModel: (model)->
194
+ index = @collection.indexOf( model )
195
+ @locateItemElement(model.get('id')).empty().append( @contentForItem({model,index}, model) )
196
+ @trigger("model:refreshed", index, model)
197
+
198
+
199
+ registerEvent: (domEvent, selector, handler)->
200
+ if !handler? and _.isFunction(selector)
201
+ handler = selector
202
+ selector = undefined
203
+
204
+ eventTrigger = _([domEvent,"#{ @itemTagName }.#{ @itemClassName }", selector]).compact().join(" ")
205
+ Luca.View::registerEvent(eventTrigger,handler)
206
+
207
+ collectionView.register()
@@ -2,36 +2,44 @@ controller = Luca.register "Luca.components.Controller"
2
2
  controller.extends "Luca.containers.CardView"
3
3
 
4
4
  controller.publicInterface
5
+ tracker: "page"
6
+
5
7
  default: (callback)->
6
8
  @navigate_to(@defaultPage || @defaultCard, callback)
7
9
 
8
10
  activePage: ()->
9
11
  @activeSection()
10
12
 
11
- # switch the active card of this controller
12
- # optionally passing an onActivation callback
13
- # will fire this callback in the context of
14
- # the currently active card
15
13
  navigate_to: (section, callback)->
16
14
  section ||= @defaultCard
17
15
 
18
- # activate is a method on Luca.containers.CardView which
19
- # selects a component and makes it visible, hiding any
20
- # other component which may be monopolizing the view at that time.
21
-
22
- # after activation it triggers a after:card:switch event
23
- # and if it is the first time that view is being activated,
24
- # it triggers a first:activation event which gets relayed to all
25
- # child components in that view
26
16
  @activate section, false, (activator, previous,current)=>
17
+ if current.activatedByController is true
18
+ current.trigger("on:controller:reactivation")
19
+ else
20
+ current.trigger("on:controller:reactivation")
21
+ current.trigger("on:controller:activation")
22
+ current.activatedByController = true
23
+
27
24
  @state.set(active_section: current.name )
25
+
26
+ if app = Luca.getApplication?()
27
+ app.state.set(@tracker, current.name)
28
+
29
+ Luca.key?.setScope( current.name )
30
+
28
31
  if _.isFunction( callback )
29
- callback.apply(current)
32
+ callback.call(current)
30
33
 
31
34
  # return the section we are navigating to
32
35
  @find(section)
33
36
 
34
37
  controller.classMethods
38
+ setupComponentKeyEvents: ()->
39
+ @_().each (component)->
40
+ if _.isObject(component.keyEvents) and component.name?
41
+ Luca.util.setupKeymaster(component.keyEvents, component.name).on(component)
42
+
35
43
  controllerPath: ()->
36
44
  component = @
37
45
 
@@ -45,6 +53,9 @@ controller.classMethods
45
53
 
46
54
  list.reverse()
47
55
 
56
+ controller.afterDefinition ()->
57
+ Luca.View::hooks.push "on:controller:activation"
58
+
48
59
  controller.defines
49
60
  additionalClassNames: 'luca-ui-controller'
50
61
  activeAttribute: "active-section"
@@ -66,6 +77,9 @@ controller.defines
66
77
  @_().each (component)->
67
78
  component.controllerPath = Luca.components.Controller.controllerPath
68
79
 
80
+ @on "after:render", @default, @
81
+ @on "before:render", Luca.components.Controller.setupComponentKeyEvents, @
82
+
69
83
  each: (fn)->
70
84
  _( @components ).each (component)=> fn.call(@,component)
71
85
 
@@ -6,7 +6,7 @@ field.triggers "before:validation",
6
6
  "after:validation",
7
7
  "on:change"
8
8
 
9
- field.publicConfiguration
9
+ field.publicConfiguration
10
10
  labelAlign: 'top'
11
11
  className: 'luca-ui-text-field luca-ui-field'
12
12
  statuses: [
@@ -23,8 +23,24 @@ field.publicInterface
23
23
  @getInputElement().attr('disabled', false)
24
24
 
25
25
  getValue: ()->
26
- raw = @getInputElement()?.attr('value')
26
+ @getParsedValue(@getInputElement()?.attr('value'))
27
27
 
28
+ setValue: (value)->
29
+ @getInputElement()?.attr('value', value)
30
+
31
+ updateState: (state)->
32
+ _( @statuses ).each (cls)=>
33
+ @$el.removeClass(cls)
34
+ @$el.addClass(state)
35
+
36
+ clearErrors: ()->
37
+ @$el.removeClass('error')
38
+
39
+ displayErrors: (errors)->
40
+ @updateState('error')
41
+
42
+ field.methods
43
+ getParsedValue: (raw)->
28
44
  return raw if _.str.isBlank( raw )
29
45
 
30
46
  switch @valueType
@@ -33,14 +49,6 @@ field.publicInterface
33
49
  when "float" then parseFloat(raw)
34
50
  else raw
35
51
 
36
- setValue: (value)->
37
- @getInputElement()?.attr('value', value)
38
-
39
- updateState: (state)->
40
- _( @statuses ).each (cls)=>
41
- @$el.removeClass(cls)
42
- @$el.addClass(state)
43
-
44
52
  field.privateConfiguration
45
53
  isField: true
46
54
  template: 'fields/text_field'
@@ -5,12 +5,13 @@ buttonField.extends "Luca.core.Field"
5
5
  buttonField.triggers "button:click"
6
6
 
7
7
  buttonField.publicConfiguration
8
- readOnly: true
9
- input_value: undefined
10
- input_type: "button"
11
- icon_class: undefined
12
- input_name: undefined
13
- white: undefined
8
+ readOnly: true
9
+ input_value: undefined
10
+ input_type: "button"
11
+ icon_class: undefined
12
+ input_name: undefined
13
+ white: undefined
14
+ buttonClasses: ""
14
15
 
15
16
  buttonField.privateConfiguration
16
17
  isButton: true
@@ -35,12 +36,10 @@ buttonField.privateInterface
35
36
  @input_id ||= _.uniqueId('button')
36
37
  @input_name ||= @name ||= @input_id
37
38
  @input_value ||= @label ||= @text
38
- @input_class ||= @class
39
+ @input_class ||= @class ||= @buttonClasses
39
40
  @icon_class ||= ""
40
41
  @icon_class = "icon-#{ @icon_class }" if @icon_class.length and !@icon_class.match(/^icon-/)
41
42
  @icon_class += " icon-white" if @white
42
43
 
43
44
  setValue: ()-> true
44
45
 
45
- buttonField.defines
46
- version: 1
@@ -0,0 +1,159 @@
1
+ selectField = Luca.register "Luca.fields.SelectField"
2
+
3
+ selectField.extends "Luca.core.Field"
4
+
5
+ selectField.triggers "after:select",
6
+ "on:change"
7
+
8
+ selectField.publicConfiguration
9
+ # Enables multi-select UI element.
10
+ allowMultiple: false
11
+
12
+ # Includes a blank option in addition to all of the items
13
+ # in the underlying collection. Defaults to `true`
14
+ includeBlank: true
15
+
16
+ # determines which value is sent when
17
+ # the blank option is selected?
18
+ blankValue: ''
19
+
20
+ # Determines the text displayed when
21
+ # the blank option is selected
22
+ blankText: 'Select One'
23
+
24
+ # Specifying a value for maxDisplayLength will truncate
25
+ # values displayed in the select field when they reach
26
+ # past a certain point, using the _.str truncate method.
27
+ # Leave at 0 if you want to keep this feature disabled.
28
+ maxDisplayLength: 0
29
+
30
+ # When the underlying collection is reset and we re-render
31
+ # the options elements, should we keep the value that was set
32
+ # on this field prior to that? Defaults to `true` unless otherwise
33
+ # specified.
34
+ retainValue: undefined
35
+
36
+ # Determines which value is rendered in the label element that gets
37
+ # rendered along with this control group.
38
+ label: undefined
39
+
40
+ selectField.privateConfiguration
41
+ template: "fields/select_field"
42
+ events:
43
+ "change select" : "change_handler"
44
+
45
+ selectField.publicMethods
46
+ # sets the value of this select field.
47
+ setValue: (value)->
48
+ @currentValue = value
49
+ Luca.core.Field::setValue.apply @, arguments
50
+
51
+ # returns the value of the select field. runs
52
+ # the value through the getParsedValue method which
53
+ # enforces the valueType type conversion.
54
+ getValue: ()->
55
+ raw = @getInputElement()?.val()
56
+
57
+ if @allowMultiple
58
+ _.map raw, (value)=>
59
+ @getParsedValue(value)
60
+ else
61
+ @getParsedValue(raw)
62
+
63
+ selectField.privateMethods
64
+ initialize: (@options={})->
65
+ _.extend @, @options
66
+ _.extend @, Luca.concerns.Deferrable
67
+ _.bindAll @, "change_handler"
68
+
69
+ if _.isArray(@collection)
70
+ @collection = data: @collection
71
+
72
+ Luca.core.Field::initialize.apply @, arguments
73
+
74
+ @input_id ||= _.uniqueId('field')
75
+ @input_name ||= @name
76
+ @valueType ||= Luca.config.idAttributeType if @valueField is "id"
77
+ @label ||= @name
78
+ @retainValue = true unless @retainValue?
79
+
80
+ afterInitialize: ()->
81
+ if @collection?.data
82
+ @valueField ||= "id"
83
+ @displayField ||= "name"
84
+ @sortOptionsBy ||= @displayField
85
+ @parseData()
86
+
87
+ try
88
+ @configure_collection( @setAsDeferrable )
89
+ catch e
90
+ console.log "Error Configuring Collection", @, e.message
91
+
92
+ @collection?.bind "before:fetch", @beforeFetch, @
93
+ @collection?.bind "reset", @populateOptions, @
94
+
95
+ # if the select field is configured with a data property
96
+ # then parse that data into the proper format. either
97
+ # an array of objects with the valueField and displayField
98
+ # properties, or an array of arrays with [valueField, displayField]
99
+ parseData: ()->
100
+ @collection.data = _( @collection.data ).map (record)=>
101
+ return record if not _.isArray( record )
102
+
103
+ hash = {}
104
+ hash[ @valueField ] = record[0]
105
+ hash[ @displayField ] = record[1] || record[0]
106
+
107
+ hash
108
+
109
+ getInputElement: ()->
110
+ @input ||= @$('select').eq(0)
111
+
112
+ afterRender: ()->
113
+ if @collection?.models?.length > 0
114
+ @populateOptions()
115
+ else
116
+ @collection?.trigger("reset")
117
+
118
+ beforeFetch: ()->
119
+ @resetOptions()
120
+
121
+ change_handler: (e)->
122
+ @trigger "on:change", @, e
123
+
124
+ resetOptions: ()->
125
+ @getInputElement().html('')
126
+
127
+ if @allowMultiple
128
+ @getInputElement().attr(multiple: true)
129
+ else if @includeBlank
130
+ @getInputElement().append("<option value='#{ @blankValue }'>#{ @blankText }</option>")
131
+
132
+ populateOptions: ()->
133
+ @resetOptions()
134
+
135
+ if @collection?.length > 0
136
+ if @sortOptionsBy?
137
+ models = @collection.sortBy (model)=>
138
+ if model.read?
139
+ model.read( @sortOptionsBy )
140
+ else
141
+ model.get( @sortOptionsBy )
142
+ else
143
+ models = @collection.models
144
+
145
+ for model in models
146
+ v = model.read?( @valueField ) || model.get(@valueField)
147
+ d = model.read?( @displayField ) || model.get(@displayField)
148
+
149
+ if @maxDisplayLength and @maxDisplayLength > 0
150
+ d = _.str.truncate(d, @maxDisplayLength)
151
+
152
+ selected = "selected" if @selected and v is @selected
153
+ option = "<option #{ selected } value='#{ v }'>#{ d }</option>"
154
+ @getInputElement().append( option )
155
+
156
+ @trigger "after:populate:options", @
157
+ @setValue( @currentValue )
158
+
159
+ selectField.register()