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,69 @@
1
+ Luca.concerns.Sortable =
2
+ __included: (component, module)->
3
+ _.extend(Luca.Collection::, __sortables:{})
4
+
5
+ __initializer:()->
6
+ if @sortable is false
7
+ return
8
+
9
+ if _.isString(@sortable)
10
+ @sortable = sortBy: @sortable
11
+
12
+ unless Luca.isBackboneCollection(@collection)
13
+ @debug "Skipping Sortable due to no collection being present on #{ @name || @cid }"
14
+ @debug "collection", @collection
15
+ return
16
+
17
+ collection = (@getCollection ||= ()-> @collection)()
18
+
19
+ sortableState = @getSortableState()
20
+
21
+ @optionsSources ||= []
22
+ @queryOptions ||= {}
23
+
24
+ @optionsSources.push ->
25
+ _(sortableState.toJSON()).pick('sortBy','order')
26
+
27
+ sortableState.on "change", ()=> @trigger "sortable:change"
28
+
29
+ @defer ()=>
30
+ @$(".sortable-toggle").on "click", (e)=>
31
+ me = my = @$( e.target )
32
+ me = my = my.closest('.sortable-toggle')
33
+ @toggleSortOrderDirection( my.data('sortableSortBy') )
34
+
35
+ .until "after:render"
36
+
37
+ @on "sortable:change", Luca.concerns.Filterable.classMethods.prepare, @
38
+
39
+ isRemote: ()->
40
+ @getQueryOptions().remote is true
41
+
42
+ getSortableState: ()->
43
+ options = _( @sortable || {} ).pick 'sortBy', 'order'
44
+ @collection.__sortables[ @cid ] ||= new SortableState(options)
45
+
46
+ sortBy: (field,order)->
47
+ @setSortBy(field) if field?
48
+ @setOrder(order) if order?
49
+ @
50
+
51
+ setSortBy: (field, options={})->
52
+ @getSortableState().set('sortBy', field, options)
53
+ @
54
+
55
+ toggleSortOrderDirection: (sortBy)->
56
+ current = @getSortableState().get('order') || "ASC"
57
+ changeTo = if current is "ASC" then "DESC" else "ASC"
58
+ sortBy ||= @getSortableState().get('sortBy')
59
+ @sortBy(sortBy, changeTo)
60
+
61
+ setOrder: (order, options={})->
62
+ @getSortableState().set('order', order, options)
63
+ @
64
+
65
+ Luca.util.makeSortableToggleElement = (el, sortBy, order)->
66
+ $(el).attr('data-sortable-sort-by', sortBy ).attr('data-sortable-order', order)
67
+ $(el)
68
+
69
+ SortableState = Backbone.Model.extend()
@@ -0,0 +1,58 @@
1
+
2
+ stateModel = Luca.register("Luca.ViewState").extends("Luca.Model")
3
+
4
+ Luca.concerns.StateModel =
5
+ __onModelChange: (args...)->
6
+ statefulView = @
7
+ state = statefulView.state
8
+
9
+ @trigger.call(statefulView, "state:change", args... )
10
+
11
+ for changed, value of state.changedAttributes()
12
+ @trigger.call statefulView, "state:change:#{ changed }", state, value, state.previous(changed)
13
+
14
+ __initializer: ()->
15
+ @stateful = @stateAttributes if @stateAttributes?
16
+
17
+ return unless @stateful?
18
+
19
+ statefulView = @
20
+
21
+ if _.isObject(@stateful) and not @defaultState?
22
+ @defaultState = @stateful
23
+
24
+ @state ||= new Luca.ViewState(@defaultState || {})
25
+
26
+ view = @
27
+
28
+ @get = ()->
29
+ view.state.get.apply(view.state, arguments)
30
+
31
+ @set = ()->
32
+ view.state.set.apply(view.state, arguments)
33
+
34
+ for key, value of @state.toJSON()
35
+ hook = "on" + _.str.capitalize(key) + "Change"
36
+ getter = "get" + _.str.capitalize(key)
37
+ unless _.isFunction(@[getter])
38
+ 1
39
+ if _.isFunction(@[hook])
40
+ 1
41
+
42
+ Luca.concerns.StateModel.__setupModelBindings.call(@, "on")
43
+
44
+ __setupModelBindings: (direction="on")->
45
+ statefulView = @
46
+ for attribute, handler of @stateChangeEvents
47
+ fn = if _.isString(handler) then statefulView[handler] else handler
48
+
49
+ if attribute is "*"
50
+ statefulView[direction]("state:change", fn, statefulView)
51
+ else
52
+ statefulView[direction]("state:change:#{ attribute }", fn, statefulView)
53
+
54
+ # Any time there is a model change event on the internal state machine
55
+ # we will trigger a general state:change event on the component as well
56
+ # as individual state:change:attribute events
57
+ state = statefulView.state
58
+ statefulView.state[direction]("change", Luca.concerns.StateModel.__onModelChange, statefulView)
@@ -4,5 +4,10 @@ Luca.concerns.Templating =
4
4
 
5
5
  if template = @bodyTemplate
6
6
  @$el.empty()
7
- templateContent = Luca.template(template, templateVars)
7
+
8
+ try
9
+ templateContent = Luca.template(template, templateVars)
10
+ catch e
11
+ console.log "Error Rendering #{ template} in View: #{ @identifier?() || @name || @cid }"
12
+
8
13
  Luca.View::$html.call(@, templateContent)
@@ -0,0 +1,54 @@
1
+ Luca.config.maintainStyleHierarchy = true
2
+ Luca.config.maintainClassHierarchy = true
3
+ Luca.config.autoApplyClassHierarchyAsCssClasses = true
4
+
5
+ Luca.config.idAttributeType = "integer"
6
+
7
+ Luca.config.apiSortByParameter = 'sortBy'
8
+ Luca.config.apiPageParameter = 'page'
9
+ Luca.config.apiLimitParameter = 'limit'
10
+
11
+ # When using Luca.define() should we automatically register
12
+ # the component with the registry?
13
+ Luca.autoRegister = Luca.config.autoRegister = true
14
+
15
+ # if developmentMode is true, you have access to some neat development tools
16
+ Luca.developmentMode = Luca.config.developmentMode = false
17
+
18
+ # The Global Observer is very helpful in development
19
+ # it observes every event triggered on every view, collection, model
20
+ # and allows you to inspect / respond to them. Use in production
21
+ # may have performance impacts which has not been tested
22
+ Luca.enableGlobalObserver = Luca.config.enableGlobalObserver = false
23
+
24
+ # let's use the Twitter 2.0 Bootstrap Framework
25
+ # for what it is best at, and not try to solve this
26
+ # problem on our own!
27
+ Luca.config.enableBoostrap = Luca.config.enableBootstrap = true
28
+ Luca.config.fluidWrapperClass = "container-fluid"
29
+ Luca.config.wrapperClass = "container"
30
+
31
+ Luca.config.enhancedViewProperties = true
32
+
33
+ # Need to replace this with something like keymaster.js
34
+ Luca.keys = Luca.config.keys =
35
+ ENTER: 13
36
+ ESCAPE: 27
37
+ KEYLEFT: 37
38
+ KEYUP: 38
39
+ KEYRIGHT: 39
40
+ KEYDOWN: 40
41
+ SPACEBAR: 32
42
+ FORWARDSLASH: 191
43
+ TAB: 9
44
+
45
+ Luca.config.toolbarContainerClass = "toolbar-container"
46
+
47
+ # build a reverse map
48
+ Luca.keyMap = Luca.config.keyMap = _( Luca.keys ).inject (memo, value, symbol)->
49
+ memo[value] = symbol.toLowerCase()
50
+ memo
51
+ , {}
52
+
53
+ Luca.config.showWarnings = true
54
+ Luca.config.default_socket_port = 9292
@@ -1,5 +1,7 @@
1
1
  component = Luca.define "Luca.containers.CardView"
2
- component.extends "Luca.core.Container"
2
+ component.extends "Luca.Container"
3
+
4
+ component.aliases "Luca.PageView"
3
5
  #
4
6
  # The CardView is a type of Container which has many sub-views
5
7
  # which are only going to be visible one at a time. A CardView
@@ -23,9 +25,6 @@ component.extends "Luca.core.Container"
23
25
  # cardView.activeComponent().name # => "two"
24
26
  #
25
27
  component.defaults
26
-
27
- className: 'luca-ui-card-view-wrapper'
28
-
29
28
  activeCard: 0
30
29
 
31
30
  components: []
@@ -40,11 +39,19 @@ component.defaults
40
39
 
41
40
  initialize: (@options)->
42
41
  @components ||= @pages ||= @cards
43
- Luca.core.Container::initialize.apply @,arguments
42
+ Luca.Container::initialize.apply @,arguments
44
43
  @setupHooks(@hooks)
45
44
 
45
+ @defer( @simulateActivationEvent, @ ).until("after:render")
46
+
47
+ simulateActivationEvent: ()->
48
+ c = @activeComponent()
49
+
50
+ if c? and @$el.is(":visible")
51
+ c?.trigger "activation", @, c, c
52
+
46
53
  prepareComponents: ()->
47
- Luca.core.Container::prepareComponents?.apply(@, arguments)
54
+ Luca.Container::prepareComponents?.apply(@, arguments)
48
55
  @componentElements().hide()
49
56
  @activeComponentElement().show()
50
57
 
@@ -80,7 +87,7 @@ component.defaults
80
87
  find: (name)-> Luca(name)
81
88
 
82
89
  firstActivation: ()->
83
- @activeComponent().trigger "first:activation", @, @activeComponent()
90
+ @activeComponent()?.trigger "first:activation", @, @activeComponent()
84
91
 
85
92
  activate: (index, silent=false, callback)->
86
93
  if _.isFunction(silent)
@@ -110,7 +117,13 @@ component.defaults
110
117
  @componentElements().hide()
111
118
 
112
119
  unless current.previously_activated is true
113
- current.trigger "first:activation"
120
+ if current.rendered is true
121
+ current.trigger "first:activation"
122
+ else
123
+ current.defer ()->
124
+ current.trigger("first:activation")
125
+ .until current, "after:render"
126
+
114
127
  current.previously_activated = true
115
128
 
116
129
  @activeCard = index
@@ -119,7 +132,9 @@ component.defaults
119
132
  unless silent is true
120
133
  @trigger "after:card:switch", previous, current
121
134
  previous?.trigger "deactivation", @, previous, current
135
+ current?.trigger "on:deactivation", @, previous, current
122
136
  current?.trigger "activation", @, previous, current
137
+ current?.trigger "on:activation", @, previous, current
123
138
 
124
139
  activationContext = @
125
140
 
@@ -1,6 +1,147 @@
1
- container = Luca.register "Luca.core.Container"
2
-
3
- container.extends "Luca.components.Panel"
1
+ # The Luca.Container is the heart and soul of the Luca framework
2
+ # and the component driven design philosophy. The central idea
3
+ # is that every component should be designed as an isolated unit
4
+ # which completely encapsulates its features. It should not know about
5
+ # other components outside of it.
6
+ #
7
+ # It is the responsibility of a `Luca.Container` to define its
8
+ # child `@components`, render them, and broker communication between them
9
+ # in response to events which occur in the user interface.
10
+ #
11
+ # A common use case for this would be a page which has a filter form, and
12
+ # a grid of search results. The fields in the filter form are used to
13
+ # filter the table. Neither the form or the table know about each other,
14
+ # since both can be used in other contexts. A `Luca.Container` would be used
15
+ # to relay events from the form to the table, and in doing so create a higher
16
+ # level component which can be extended and re-used.
17
+ #
18
+ # #### Using a container to combine a Filter View and Results Table
19
+ #
20
+ # form = Luca.register "App.views.FilterForm"
21
+ # form.extends "Luca.components.FormView"
22
+ #
23
+ # form.contains
24
+ # type: "text"
25
+ # label: "Filter by"
26
+ # name: "filter_text"
27
+ # ,
28
+ # type: "button"
29
+ # className: "filter"
30
+ # value: "Filter"
31
+ #
32
+ #
33
+ # form.defines
34
+ # toolbar: false
35
+ #
36
+ # Elsewhere, we have a table that lists records in a collection:
37
+ #
38
+ # table = Luca.register "App.views.ResultsTable"
39
+ # table.extends "Luca.components.TableView"
40
+ # table.defines
41
+ # striped: true
42
+ # collection: "components"
43
+ # columns:[
44
+ # header: "Component Class"
45
+ # reader: "class_name"
46
+ # ,
47
+ # header: "Component Type Alias"
48
+ # reader: "type_alias"
49
+ # ]
50
+ #
51
+ # We can join these two components together by declaring their relationship
52
+ # in a `Luca.Container`. Remember the components we defined above are just
53
+ # prototypes. We can override specific instance configuration and properties
54
+ # in our container.
55
+ #
56
+ # #### Container Example
57
+ #
58
+ # container = Luca.register "App.views.ComponentFinder"
59
+ # container.extends "Luca.Container"
60
+ #
61
+ # # This is the same as defining a components property on the component.
62
+ # # The type alias is derived from the name of the component. It is
63
+ # # a short hand way of referencing a component you might reuse a lot.
64
+ # container.contains
65
+ # type: "filter_form"
66
+ # role: "filter"
67
+ # ,
68
+ # type: "results_table"
69
+ # # change the prototype's default
70
+ # striped: false
71
+ # role: "results"
72
+ # filterable: true
73
+ #
74
+ # # A Container will generally define some component event bindings
75
+ # # and handler methods to handle the communication between its sub
76
+ # # components. By default a container is able to access events
77
+ # # from all of its descendants in the hierarchy.
78
+ # container.defines
79
+ # # These will be applied to each of our components.
80
+ # defaults:
81
+ # attributes:
82
+ # "data-attribute": "whatever"
83
+ #
84
+ # componentEvents:
85
+ # # Any time any of our child components emit
86
+ # # the on:change event, pass it to the filterTable method
87
+ # "* on:change" : "filterTable"
88
+ #
89
+ # # Communicates between the filter and the table's
90
+ # # underlying collection. NOtice the use of the @role
91
+ # # property. It automatically creates getter helpers for us.
92
+ # filterTable: ()->
93
+ # filter = @getFilter()
94
+ # results = @getResults()
95
+ # # filter.getValues() is a hash of each field and its value
96
+ # results.applyFilter( filter.getValues() )
97
+ #
98
+ # ### DOM Layout Configuration
99
+ #
100
+ # Another responsibility of the container is to structurally layout its
101
+ # child components in the DOM. There are a number of different
102
+ # options available depending on how you need to do this. By default,
103
+ # a `Luca.Container` will simply append the @$el of all of its views
104
+ # to its own.
105
+ #
106
+ # The `Luca.components.Controller` is a container which hides every page
107
+ # but the active page. Similarly, there is the `Luca.containers.TabView`
108
+ # which does the same thing, but renders a tab selector menu for you. You
109
+ # can create any type of interface you want using containers.
110
+ #
111
+ # To make this easy for you, you can do a few different things:
112
+ #
113
+ # #### Use the Twitter Bootstrap Fluid Grid
114
+ #
115
+ # container = Luca.register "App.views.ColumnLayout"
116
+ # container.extends "App.views.ComponentFinder"
117
+ #
118
+ # container.contains
119
+ # span: 4
120
+ # type: "filter_form"
121
+ # role: "filter"
122
+ # ,
123
+ # span: 8
124
+ # type: "results_table"
125
+ # role: "results"
126
+ #
127
+ # container.defines
128
+ # rowFluid: true
129
+ #
130
+ # #### Using a layout template with CSS Selectors
131
+ # ...
132
+ # container.contains
133
+ # role: "filter"
134
+ # container: "#filter-wrapper-dom-selector"
135
+ # ,
136
+ # role: "results"
137
+ # container: "#results-wrapper-dom-selector"
138
+ # ...
139
+ # container.defines
140
+ # # assumes the template will provide the CSS selectors used above
141
+ # bodyTemplate: "layouts/custom_template"
142
+ container = Luca.register "Luca.Container"
143
+
144
+ container.extends "Luca.Panel"
4
145
 
5
146
  container.triggers "before:components",
6
147
  "before:render:components",
@@ -9,19 +150,19 @@ container.triggers "before:components",
9
150
  "after:layout",
10
151
  "first:activation"
11
152
 
12
- container.defines
13
- className: 'luca-ui-container'
153
+ container.replaces "Luca.Container"
14
154
 
15
- componentTag: 'div'
155
+ container.publicConfiguration
156
+ components:[]
16
157
 
158
+ container.privateConfiguration
159
+ emptyContainerElements: false
160
+ className: 'luca-ui-container'
161
+ componentTag: 'div'
17
162
  componentClass: 'luca-ui-panel'
18
-
19
163
  isContainer: true
20
-
21
164
  rendered: false
22
165
 
23
- components: []
24
-
25
166
  # @componentEvents provides declarative syntax for responding to events on
26
167
  # the components in this container. the format of the syntax is very similar
27
168
  # to the other event binding helpers:
@@ -31,7 +172,7 @@ container.defines
31
172
  # where component_accessor is either the name of the role, or a method on the container
32
173
  # which will find the component in question.
33
174
  #
34
- # myContainer = new Luca.core.Container
175
+ # myContainer = new Luca.Container
35
176
  # componentEvents:
36
177
  # "name component:trigger" : "handler"
37
178
  # "role component:trigger" : "handler"
@@ -52,65 +193,23 @@ container.defines
52
193
 
53
194
  _.bindAll(@, "beforeRender")
54
195
 
55
- @setupHooks( Luca.core.Container::hooks )
56
-
196
+ @setupHooks( Luca.Container::hooks )
57
197
 
58
198
  validateContainerConfiguration(@)
59
199
 
60
200
  Luca.View::initialize.apply @, arguments
61
201
 
62
- # Rendering Pipeline
63
- #
64
- # A container has nested components. these components
65
- # are automatically rendered inside their own DOM element
66
- # and then CSS configuration is generally applied to these
67
- # DOM elements. Each component is assigned to this DOM
68
- # element by specifying a @container property on the component.
69
- #
70
- # Each component is instantiated by looking up its @ctype propery
71
- # in the Luca Component Registry. Then the components are rendered
72
- # by having their @render() method called on them.
73
- #
74
- # Any class which extends Luca.View will have its defined render method
75
- # wrapped in a method which triggers "before:render", and "after:render"
76
- # before and after the defined render method.
77
- #
78
- # so you can expect the following, for any container or nested container
79
- #
80
- # DOM Element Manipulation:
81
- #
82
- # beforeRender()
83
- # beforeLayout()
84
- # prepareLayout()
85
- # afterLayout()
86
- #
87
- # Luca / Backbone Component Manipulation
88
- #
89
- # beforeComponents()
90
- # prepareComponents()
91
- # createComponents()
92
- # beforeRenderComponents()
93
- # renderComponents() ->
94
- # calls render() on each component, starting this whole cycle
95
- #
96
- # afterComponents()
97
- #
98
- # DOM Injection
99
- #
100
- # render()
101
- # afterRender()
102
- #
103
- # For Components which are originally hidden
104
- # ( card view, tab view, etc )
105
- #
106
- # firstActivation()
107
- #
202
+ remove: ()->
203
+ Luca.View::remove.apply(@, arguments)
204
+ @eachComponent (component)->
205
+ component.remove?()
206
+
108
207
  beforeRender: ()->
109
208
  doLayout.call(@)
110
209
  doComponents.call(@)
111
- Luca.components.Panel::beforeRender?.apply(@, arguments)
210
+ Luca.Panel::beforeRender?.apply(@, arguments)
112
211
 
113
- # Components which inherit from Luca.core.Container can implement
212
+ # Components which inherit from Luca.Container can implement
114
213
  # their own versions of this method, if they need to apply any sort
115
214
  # of additional styling / configuration for the DOM elements that
116
215
  # are created to wrap each container.
@@ -122,10 +221,27 @@ container.defines
122
221
  @componentContainers = _( @components ).map (component, index)->
123
222
  applyDOMConfig.call(container, component, index)
124
223
 
224
+ componentsWithClassBasedAssignment = @_().select (component)->
225
+ _.isString(component.container) and component.container?.match(/^\./) and container.$( component.container ).length > 0
226
+
227
+ # TEMP / HACK / Workaround
228
+ #
229
+ # Containers with components assigned to .class-based-containers
230
+ # seem to get double rendered in the renderComponents() method.
231
+ #
232
+ # So here I am uniquely identifying the containers in a way that is not possible
233
+ # in the templates ( since we want to be able to inherit templates and component assignments )
234
+ if componentsWithClassBasedAssignment.length > 0
235
+ for specialComponent in componentsWithClassBasedAssignment
236
+ containerAssignment = _.uniqueId('container')
237
+ targetEl = container.$( specialComponent.container )
238
+ if targetEl.length > 0
239
+ $(targetEl).attr('data-container-assignment', containerAssignment)
240
+ specialComponent.container += "[data-container-assignment='#{ containerAssignment }']"
241
+
125
242
  prepareComponents: ()->
126
243
  container = @
127
244
 
128
-
129
245
  _( @components ).each (component, index)=>
130
246
  ce = componentContainerElement = @componentContainers?[index]
131
247
 
@@ -186,8 +302,17 @@ container.defines
186
302
  component = if Luca.isComponent( object )
187
303
  object
188
304
  else
305
+ # if a component is tagged with a @component property
306
+ # we assume this is the kind of singleton component
307
+ # and set the type, role and name to the same value (if they're blank)
308
+ if object.component? and not (object.type || object.ctype)
309
+ object.type = object.component
310
+ object.name ||= object.component
311
+ object.role ||= object.component
312
+
189
313
  object.type ||= object.ctype
190
314
 
315
+ # guess the type based on the properties
191
316
  if !object.type?
192
317
  # TODO
193
318
  # Add support for all of the various components property aliases
@@ -228,8 +353,27 @@ container.defines
228
353
 
229
354
  _(@components).each (component)->
230
355
  try
231
- @$( component.container ).eq(0).append( component.el )
356
+ component.trigger "before:attach"
357
+
358
+ containerElement = container.$(component.container)
359
+
360
+ if containerElement.length is 0
361
+ if _.isString( component.container )
362
+ # the container trying to assign this component to is not in the dom
363
+ 1
364
+
365
+ # try in the window context. this is almost always certainly a bug
366
+ # so look into wtf is going on and which components are problematic
367
+ containerElement = @$( component.container ).eq(0) if containerElement.length is 0
368
+
369
+ if @emptyContainerElements is true
370
+ containerElement.empty()
371
+
372
+ containerElement.append( component.el )
373
+
374
+ component.trigger "after:attach"
232
375
  component.render()
376
+ component.rendered = true
233
377
  catch e
234
378
  console.log "Error Rendering Component #{ component.name || component.cid }", component
235
379
 
@@ -278,7 +422,7 @@ container.defines
278
422
  map: (fn)->
279
423
  @_().map(fn)
280
424
 
281
- registerComponentEvents: (eventList)->
425
+ registerComponentEvents: (eventList, direction="on")->
282
426
  container = @
283
427
 
284
428
  for listener, handler of (eventList || @componentEvents||{})
@@ -297,7 +441,7 @@ container.defines
297
441
  console.log "Error registering component event", listener, componentNameOrRole, eventId
298
442
  throw "Invalid component event definition: #{ componentNameOrRole }"
299
443
 
300
- component?.bind eventId, @[handler], container
444
+ component[direction](eventId, @[handler], container)
301
445
 
302
446
 
303
447
  subContainers: ()->
@@ -309,7 +453,10 @@ container.defines
309
453
 
310
454
  allChildren: ()->
311
455
  children = @components
312
- grandchildren = _( @subContainers() ).invoke('allChildren')
456
+
457
+ grandchildren = _( @subContainers() ).map (component)->
458
+ component?.allChildren?()
459
+
313
460
  _([children,grandchildren]).chain().compact().flatten().value()
314
461
 
315
462
  findComponentForEventBinding: (nameRoleOrGetter, deep=true)->
@@ -317,11 +464,15 @@ container.defines
317
464
 
318
465
  findComponentByGetter: (getter, deep=false)->
319
466
  _( @allChildren() ).detect (component)->
320
- component.getter is getter
467
+ component?.getter is getter
321
468
 
322
469
  findComponentByRole: (role,deep=false)->
323
470
  _( @allChildren() ).detect (component)->
324
- component.role is role or component.type is role or component.ctype is role
471
+ component?.role is role or component?.type is role or component?.ctype is role
472
+
473
+ findComponentByType: (desired,deep=false)->
474
+ _( @allChildren() ).detect (component)->
475
+ desired is (component.type || component.ctype)
325
476
 
326
477
  findComponentByName: (name, deep=false)->
327
478
  _( @allChildren() ).detect (component)->
@@ -391,10 +542,12 @@ container.defines
391
542
  _.flatten( components )
392
543
 
393
544
 
545
+ container.register()
546
+
394
547
  # This is the method by which a container injects the rendered child views
395
548
  # into the DOM. It will get passed the container object, and the component
396
549
  # that is being rendered.
397
- Luca.core.Container.componentRenderer = (container, component)->
550
+ Luca.Container.componentRenderer = (container, component)->
398
551
  attachMethod = $( component.container )[ component.attachWith || "append" ]
399
552
  attachMethod( component.render().el )
400
553
 
@@ -430,27 +583,26 @@ createGetterMethods = ()->
430
583
  container = @
431
584
 
432
585
  childrenWithGetter = _( @allChildren() ).select (component)->
433
- component.getter?
586
+ component?.getter?
434
587
 
435
588
  _( childrenWithGetter ).each (component)->
436
- container[ component.getter ] ||= ()->
437
- console.log component.getter, component, container
438
- component
589
+ container[ component.getter ] ||= ()-> component
439
590
 
440
591
  createMethodsToGetComponentsByRole = ()->
441
592
  container = @
442
593
 
443
594
  childrenWithRole = _( @allChildren() ).select (component)->
444
- component.role?
595
+ component?.role?
445
596
 
446
597
  _( childrenWithRole ).each (component)->
447
598
  getter = _.str.camelize( "get_" + component.role )
448
- container[ getter ] ||= ()->
449
- component
599
+ getterFn = ()-> component
600
+ container[ getter ] ||= _.bind(getterFn, container)
450
601
 
451
602
  doComponents = ()->
452
603
  @trigger "before:components", @, @components
453
604
  @prepareComponents()
605
+ @trigger "before:create:components", @, @components
454
606
  @createComponents()
455
607
  @trigger "before:render:components", @, @components
456
608
  @renderComponents()
@@ -465,7 +617,6 @@ doComponents = ()->
465
617
  validateContainerConfiguration = ()->
466
618
  true
467
619
 
468
-
469
620
  # Private Helpers
470
621
  #
471
622
  # indexComponent( component ).at( index ).in( componentsInternalIndexMap )