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
data/app.rb CHANGED
@@ -1,7 +1,10 @@
1
-
1
+ $LOAD_PATH.unshift( File.join(File.dirname(__FILE__),'lib') )
2
2
  require 'rubygems'
3
3
  require 'bundler'
4
- Bundler.require
4
+ require 'luca'
5
+ require 'redcarpet'
6
+ require 'active_support/core_ext'
7
+ Bundler.require(:default, :development)
5
8
 
6
9
  require 'faker'
7
10
 
@@ -11,9 +14,6 @@ module AssetHelpers
11
14
  end
12
15
  end
13
16
 
14
- require "#{ File.expand_path('../', __FILE__) }/lib/luca/template.rb"
15
- require "#{ File.expand_path('../', __FILE__) }/lib/luca/code_browser.rb"
16
-
17
17
  module Luca
18
18
  class Template
19
19
  def self.namespace
@@ -25,23 +25,26 @@ end
25
25
  class App < Sinatra::Base
26
26
  set :root, File.expand_path('../', __FILE__)
27
27
  set :sprockets, Sprockets::Environment.new(root)
28
- set :precompile, [ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]
29
28
  set :assets_prefix, 'assets'
30
29
  set :assets_path, File.join(root, 'public', assets_prefix)
31
30
 
32
31
  sprockets.register_engine '.luca', Luca::Template
33
32
 
34
33
  configure do
35
- sprockets.append_path(File.join(root, 'assets', 'stylesheets'))
36
- sprockets.append_path(File.join(root, 'assets', 'javascripts'))
34
+ HoganAssets::Config.configure do |config|
35
+ config.template_namespace = 'JST'
36
+ end
37
+
38
+ sprockets.append_path(File.join(root, 'app', 'assets', 'stylesheets'))
39
+ sprockets.append_path(File.join(root, 'app', 'assets', 'javascripts'))
37
40
  sprockets.append_path(File.join(root, 'vendor', 'assets', 'javascripts'))
38
41
  sprockets.append_path(File.join(root, 'vendor', 'assets', 'stylesheets'))
39
- sprockets.append_path(File.join(root, 'assets', 'images'))
40
42
  sprockets.append_path(File.join(root, 'vendor', 'assets', 'images'))
41
43
 
42
44
  sprockets.context_class.instance_eval do
43
45
  include AssetHelpers
44
46
  end
47
+
45
48
  end
46
49
 
47
50
  helpers do
@@ -56,41 +59,4 @@ class App < Sinatra::Base
56
59
  erb :jasmine
57
60
  end
58
61
 
59
- Luca::CodeBrowser.look_for_source_in( File.join(File.expand_path('../', __FILE__),'src') )
60
-
61
- get "/luca/source-map.js" do
62
- source_map = {}
63
-
64
- files = (["src/**/*.coffee","assets/javascripts/sandbox/**/*.coffee"]).map do |location|
65
- Dir.glob("#{ App.root }/#{ location }")
66
- end
67
-
68
- files.flatten.each do |file|
69
- definitions = IO.read(file).lines.to_a.grep /_\.def/
70
-
71
- definitions.each do |definition|
72
- component = definition.match(/_\.def\(['"](.+)['"]\)\./)
73
-
74
- if component and component[1]
75
- componentId = component[1].gsub(/['"].*$/,'')
76
- if componentId
77
- source_map[ componentId ] = {className:componentId,file:file,source:IO.read(file)}
78
- end
79
- end
80
- end
81
- end
82
-
83
- JSON.generate source_map.values
84
- end
85
-
86
- get "/components" do
87
- if params[:component]
88
- component = params[:component]
89
- source = Luca::CodeBrowser.get_source_for( component )
90
- {className:component, source:source}.to_json
91
- else
92
- Luca::CodeBrowser.map_source
93
- end
94
- end
95
-
96
62
  end
@@ -0,0 +1 @@
1
+ //= require ./luca/index
@@ -0,0 +1,8 @@
1
+ #= require_tree ./templates
2
+ #= require_self
3
+ #= require ./config
4
+ #= require ./util
5
+ #= require ./managers
6
+ #= require ./core
7
+ #= require ./containers/container
8
+ #= require ./framework
@@ -1,14 +1,72 @@
1
- # Luca.Application
1
+ # The `Luca.Application` is the main entry point into your Application.
2
+ # It acts as a global state machine, page controller, and router, in addition
3
+ # to providing access to other singletons such as the CollectionManager, and SocketManager.
4
+ #
5
+ # The structure of a common `Luca.Application` is that it contains one or many `Pages` which
6
+ # themselves are made up of the components of your application. One `Page` is visible at a time
7
+ # and which page is displayed is managed by an instance of the `Luca.components.Controller` class.
2
8
  #
3
- # The Application class is the global state tracking mechanism
4
- # for your single page application, as well as the entry point.
9
+ # ### Example Configuration
10
+ # application = Luca.register "App.Application"
11
+ # application.extends "Luca.Application"
12
+ #
13
+ # application.defines
14
+ # name: "MyApplication"
15
+ # routes:
16
+ # "" : "home"
17
+ # "standard/backbone/style/:route" : "name_of_page#name_of_method"
18
+ #
19
+ # components:[
20
+ # name: "home"
21
+ # ,
22
+ # type: "your_view"
23
+ # name: "name_of_page"
24
+ # name_of_method: (routeParam)->
25
+ # @doSomethignToSetupYourPageWithThePassed(routeParam)
26
+ # ]
27
+ #
28
+ # App.onReady ()->
29
+ # window.MyApp = new App.Application();
30
+ # window.MyApp.boot()
31
+ #
32
+ # #### @routes and pages
33
+ #
34
+ # In the above example, our application contains two pages, one with the name 'home'
35
+ # and one with the name 'name_of_page'. It also specifies a `@routes` property which
36
+ # is identical to the configuration you would see in a standard `Backbone.Router`.
37
+ #
38
+ # Whenever the route matches 'standard/backbone/style/route' the `App.Application` instance
39
+ # will send an instruction to the `Luca.components.Controller` to `activate` the page whose name
40
+ # is passed in the `@routes` config.
41
+ #
42
+ # If that page defines a method called `@routeHandler` it will be called with the parameters
43
+ # from the route. In the `@routes` config you can specify your own route handler method
44
+ # by using the rails style `page_name#action` and it will call the `@action` method instead
45
+ # on the view named `page_name`.
46
+ #
47
+ # The `App.Application` instance, also accessible by `window.MyApp`, or through the helper `App()`
48
+ # or `Luca.getApplication()` maintains the state of which page is active. You can access this
49
+ # in your code by calling `App().activePage()`.
50
+ #
51
+ # #### Controllers
52
+ #
53
+ # The `Luca.components.Controller` is a special type of component which contains
54
+ # other views, or `Pages` which only one will be visible at any given time. It expects
55
+ # that each page will have its own unique `@name` property. A `Luca.components.Controller` can
56
+ # contain other controllers, providing you with a way of structuring your application layout
57
+ # in an organized, hierarchal fashion.
58
+ #
59
+ # By default, any `Luca.Application` will have one `Luca.components.Controller` automatically
60
+ # created named 'main_controller' which is accessible by `MyApp.getMainController()`. Any
61
+ # components you define on the `Luca.Application` instance will be wrapped by the main controller
62
+ # automatically unless you specify `@useController = false` in your Application component definition.
5
63
  application = Luca.register "Luca.Application"
6
64
  application.extends "Luca.containers.Viewport"
7
65
 
8
66
  application.triggers "controller:change",
9
67
  "action:change"
10
68
 
11
- application.publicInterface
69
+ application.publicConfiguration
12
70
  name: "MyApp"
13
71
 
14
72
  # The Application uses a Backbone.Model as a state machine, which
@@ -16,7 +74,7 @@ application.publicInterface
16
74
  # most importantly to bind to change events of certain attributes.
17
75
  #
18
76
  # the @defaultState property will be the default attributes
19
- defaultState: {}
77
+ stateful: {}
20
78
 
21
79
  # if autoBoot is set to true, the application will
22
80
  # attempt to boot on document ready.
@@ -52,6 +110,12 @@ application.publicInterface
52
110
  # with several 'pages' so to speak
53
111
  useController: true
54
112
 
113
+ # if you have special rendering requirements for
114
+ # the application's components, you can assign the
115
+ # specific element you want to render the container
116
+ # to inside of the #viewport
117
+ mainControllerContainer: undefined
118
+
55
119
  # Key Handler
56
120
  #
57
121
  # One responsibility of the application, since it is a viewport which monopolizes the entire screen
@@ -61,21 +125,23 @@ application.publicInterface
61
125
  useKeyHandler: false
62
126
 
63
127
  # You can configure key events by specifying them by their name, as it exists in Luca.keyMap. For example:
64
- #
65
- keyEvents: {}
66
128
 
67
- # keyEvents
68
- # keyup: keyUpHandler
69
- # enter: enterHandler
70
- # meta:
71
- # up: metaUpHandler
72
- # control:
73
- # forwardslash: controlSlashHandler
74
- # keyup: controlUpHandler
75
- # control_meta:
76
- # keydown: metaControlKeyDownHandler
77
- #
129
+ # keyEvents understands the following modifiers:
130
+ # `⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, and `⌘`.
131
+
132
+ # The following special keys can be used for shortcuts:
133
+ # `backspace`, `tab`, `clear`, `enter`, `return`, `esc`, `escape`, `space`,
134
+ # `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`, `del`, `delete`
135
+ # and `f1` through `f19`.
78
136
  #
137
+ # Example:
138
+ # ```coffeescript
139
+ # application.configuration
140
+ # keyEvents:
141
+ # '⌘+r, ctrl+r': "keyHandlerFunction"
142
+ # keyHandlerFunction: -> alert 'something + r was pressed'
143
+ # ```
144
+ keyEvents: {}
79
145
 
80
146
  # applications have one component, the controller.
81
147
  # any components defined on the application class directly
@@ -88,6 +154,19 @@ application.publicInterface
88
154
  templateContainer: "Luca.templates"
89
155
  ]
90
156
 
157
+ # create getter methods for the various
158
+ # roles in the application's components on the
159
+ # application itself. false by default.
160
+ createRoleBasedGetters: false
161
+
162
+ # create an instance of Luca.SocketManager
163
+ # which is a Backbone.Events style abstraction that
164
+ # sits on top of services like faye, or socket.io
165
+ useSocketManager: false
166
+ socketManagerOptions: {}
167
+
168
+ # Don't create getters on this component
169
+ # for the nested components
91
170
  initialize: (@options={})->
92
171
  app = @
93
172
  appName = @name
@@ -95,19 +174,26 @@ application.publicInterface
95
174
 
96
175
  Luca.Application.registerInstance(@)
97
176
 
98
- Luca.containers.Viewport::initialize.apply @, arguments
177
+ Luca.concerns.StateModel.__initializer.call(@)
99
178
 
100
- @state = new Luca.Model( @defaultState )
179
+ # The Collection Manager is responsible for managing instances
180
+ # of collections, usually to guarantee only a single collection is
181
+ # instantiated for a given resource, to maintain 'authoritative'
182
+ # representations of models.
183
+ @setupCollectionManager()
184
+
185
+ # Socket Manager provides a bridge between remote pub/sub providers and
186
+ # the backbone.events interface on various components in the system.
187
+ @setupSocketManager()
188
+
189
+ Luca.containers.Viewport::initialize.apply @, arguments
101
190
 
102
191
  # The Controller is the piece of the application that handles showing
103
192
  # and hiding 'pages' of the app. The Application has a navigate_to
104
193
  # method which delegates to the controller, and allows you to navigate
105
194
  # to a given page, or component, by its name. The controller integrates
106
195
  # with the state machine of the application
107
- @setupMainController() if @useController is true
108
-
109
- # The Collection Manager is responsible
110
- @setupCollectionManager()
196
+ @setupMainController() if @useController is true
111
197
 
112
198
  # we will render when all of the various components
113
199
  # which handle our data dependencies determine that
@@ -126,10 +212,8 @@ application.publicInterface
126
212
  # keyEvents:
127
213
  # meta:
128
214
  # forwardslash: "altSlashHandler"
129
- if @useKeyRouter is true
130
- console.log "The useKeyRouter property is being deprecated. switch to useKeyHandler instead"
131
-
132
- @setupKeyHandler() if (@useKeyHandler is true or @useKeyRouter is true) and @keyEvents?
215
+ if (@useKeyHandler is true or @useKeyRouter is true) and @keyEvents?
216
+ @setupKeyHandler()
133
217
 
134
218
  # if the application is a plugin designed to modify the behavior
135
219
  # of another app, then don't claim ownership. otherwise the most common
@@ -147,12 +231,12 @@ application.publicInterface
147
231
  window[ appName ] = app
148
232
  app.boot()
149
233
 
234
+ Luca.trigger "application:available", @
235
+
150
236
  # @activeView() returns a reference to the instance of the view
151
- # which is currently monopolizing the viewport.
152
- #
153
- # this will be whicever component is active on the controllers
154
- # nested within the main controller, if there are any, or the view
155
- # itself which is active on the main controller.
237
+ # which is currently monopolizing the viewport. In an application
238
+ # which uses a controller hierarchy, it will be the last controller
239
+ # has activated one of its pages.
156
240
  activeView: ()->
157
241
  if active = @activeSubSection()
158
242
  @view( active )
@@ -182,6 +266,8 @@ application.publicInterface
182
266
  # of the views
183
267
  boot: ()->
184
268
  @trigger "ready"
269
+ for service in [@collectionManager, @socket, @router]
270
+ service?.trigger("ready")
185
271
 
186
272
  # delegate to the collection manager's get or create function.
187
273
  # use App.collection() to create or access existing collections
@@ -225,7 +311,7 @@ application.privateInterface
225
311
 
226
312
  if keyEvent = source?[keyname]
227
313
  if @[keyEvent]? and _.isFunction(@[keyEvent])
228
- @[keyEvent]?.call(@)
314
+ @[keyEvent]?.call(@, e, keyname, keyEvent)
229
315
  else
230
316
  @trigger(keyEvent, e, keyname)
231
317
 
@@ -235,31 +321,35 @@ application.privateInterface
235
321
  # the active card on the global state chart
236
322
  @getMainController()?.bind "after:card:switch", (previous,current)=>
237
323
  @state.set(active_section:current.name)
238
- app.trigger "controller:change"
324
+ app.trigger "controller:change", previous.name, current.name
239
325
 
240
326
  # any time the card switches on one of the sub controllers
241
327
  # then we should track the active sub section on the global state chart
242
328
  @getMainController()?.each (component)=>
243
- type = component.type || component.type
329
+ type = component.type || component.ctype
244
330
  if type.match(/controller$/)
245
331
  component.bind "after:card:switch", (previous,current)=>
246
332
  @state.set(active_sub_section:current.name)
247
- app.trigger "action:change"
333
+ app.trigger "action:change", previous.name, current.name
248
334
 
249
335
  setupMainController: ()->
250
336
  if @useController is true
251
337
  definedComponents = @components || []
252
-
253
- @components = [
338
+ base =
254
339
  type: 'controller'
255
340
  name: "main_controller"
256
341
  role: "main_controller"
257
342
  components: definedComponents
258
- ]
259
-
260
- @getMainController = ()=> @findComponentByRole('main_controller')
261
343
 
262
- @defer( @setupControllerBindings, false ).until("after:components")
344
+ if @mainControllerContainer?
345
+ _.extend(base, container: @mainControllerContainer)
346
+
347
+ @components = [base]
348
+
349
+ @getMainController = ()=>
350
+ @findComponentByRole('main_controller')
351
+
352
+ @defer( @setupControllerBindings, false ).until("after:components")
263
353
 
264
354
  setupCollectionManager: ()->
265
355
  return unless @useCollectionManager is true
@@ -286,19 +376,43 @@ application.privateInterface
286
376
  collectionManagerOptions =
287
377
  name: @collectionManager
288
378
 
379
+
289
380
  # let's try and get the collection manager by name if we can
290
381
  @collectionManager = Luca.CollectionManager.get?( collectionManagerOptions.name )
291
382
 
292
383
  # if we can't, then we will have to create one ourselves
293
384
  unless _.isFunction(@collectionManager?.get)
385
+ collectionManagerOptions.autoStart = false
294
386
  @collectionManager = new @collectionManagerClass( collectionManagerOptions )
295
387
 
388
+ setupSocketManager: ()->
389
+ return if _.isEmpty(@socketManagerOptions)
390
+ _.extend(@socketManagerOptions, autoStart: false)
391
+
392
+ @socket = new Luca.SocketManager(@socketManagerOptions)
393
+
296
394
  setupRouter: ()->
297
- app = @
395
+ return if not @router? and not @routes?
396
+
397
+ routerClass = Luca.Router
398
+ routerClass = Luca.util.resolve(@router) if _.isString(@router)
298
399
 
299
- if _.isString( @router )
300
- routerClass = Luca.util.resolve(@router)
301
- @router = new routerClass({app})
400
+ routerConfig = routerClass.prototype
401
+ routerConfig.routes ||= {}
402
+ routerConfig.app = @
403
+
404
+ if _.isObject( @routes )
405
+ for routePattern, endpoint of @routes
406
+ if endpoint.match(/\ /)
407
+ [page, action] = endpoint.split(' ')
408
+ else if endpoint.match(/\#/)
409
+ [page, action] = endpoint.split('#')
410
+
411
+ fn = _.uniqueId(page)
412
+ routerConfig[fn] = Luca.Application.routeTo(page).action(action)
413
+ routerConfig.routes[ routePattern ] = fn
414
+
415
+ @router = new routerClass(routerConfig)
302
416
 
303
417
  # if this application has a router associated with it
304
418
  # then we need to start backbone history on a certain event.
@@ -321,9 +435,54 @@ application.privateInterface
321
435
  $( document ).on( keyEvent, handler )
322
436
 
323
437
  application.classInterface
324
- instances: {}
438
+ instances:{}
439
+
440
+ # Public: For purely informational purposes, describes the structure
441
+ # of the Application's controller views, and any of their nested controllers views.
442
+ pageHierarchy: ()->
443
+ app = Luca()
444
+ mainController = app.getMainController()
445
+
446
+ getTree = (node)->
447
+ return {} unless node.components? or node.pages?
448
+
449
+ # recursively walks the pages on a controller
450
+ _( node.components || node.pages ).reduce (memo, page)->
451
+ memo[ page.name ] = page.name
452
+ memo[ page.name ] = getTree(page) if page.navigate_to?
453
+ memo
454
+ , {}
455
+
456
+ getTree( mainController )
457
+
458
+ # Private: registers the instance of the Luca.Appliction
459
+ # so that it is available via the Luca() helper, or through
460
+ # a call to Luca.Application.get()
325
461
  registerInstance: (app)->
326
462
  Luca.Application.instances[ app.name ] = app
463
+
464
+ # Keymaster understands the following modifiers:
465
+ # `⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, and `⌘`.
466
+
467
+ # The following special keys can be used for shortcuts:
468
+ # `backspace`, `tab`, `clear`, `enter`, `return`, `esc`, `escape`, `space`,
469
+ # `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`, `del`, `delete`
470
+ # and `f1` through `f19`.
471
+ checkForKeymaster: ()->
472
+ if window?.key?.noConflict
473
+ Luca.key = window.key.noConflict()
474
+
475
+ Luca.Application::setupKeyHandler = ()->
476
+ return unless @keyEvents
477
+ Luca.util.setupKeymaster(@keyEvents, "all").on(@)
478
+
479
+ # Private: Recursively navigates down the controller page hierarchy
480
+ # to the page you specify by name. You can specify the
481
+ # method which is to be called at the end of the chain.
482
+ #
483
+ # This is used internally by the Application as it sets up
484
+ # the @routes property and uses it to configure the Luca.Router
485
+ # instance for your app.
327
486
  routeTo: (pages...)->
328
487
  last = _( pages ).last()
329
488
  first = _( pages ).first()
@@ -335,35 +494,44 @@ application.classInterface
335
494
  path = @app || Luca()
336
495
  index = 0
337
496
 
497
+ # we can specify a page by name, and not have to know its full path
338
498
  if pages.length is 1 and target = Luca(first)
339
499
  pages = target.controllerPath()
340
500
 
501
+ # when we do know the full path
341
502
  for page in pages when _.isString(page)
342
503
  nextItem = pages[++index]
343
- action = undefined
504
+ target = Luca(page)
344
505
 
345
- if _.isFunction(nextItem)
346
- action = nextItem
347
- else if _.isObject(nextItem) and nextItem.action?
348
- action = nextItem.action
349
- else if page is last and routeHandler = Luca(last)?.routeHandler
350
- action = Luca.util.read(routeHandler)
506
+ if page is last
507
+ callback = if specifiedAction? and target[ specifiedAction ]?
508
+ _.bind(target[ specifiedAction ], target)
509
+ else if target.routeHandler?
510
+ target.routeHandler
351
511
 
352
- if _.isString( action )
353
- callback = ()->
354
- @[ action ].apply(@, args)
512
+ callback ||= if _.isFunction(nextItem)
513
+ _.bind(nextItem, target)
514
+ else if _.isObject(nextItem)
515
+ if action = nextItem.action and target[action]?
516
+ _.bind(target[action], target)
355
517
 
356
- if _.isFunction( action )
357
- callback = nextItem
518
+ path = path.navigate_to page, ()->
519
+ callback?.apply(target, args)
358
520
 
359
- path = path.navigate_to(page, callback)
521
+ routeHelper.action = (action)->
522
+ specifiedAction = action
523
+ routeHelper
360
524
 
361
- routeHelper.action = (action)->
362
- pages.push(action: action)
363
-
364
- return routeHelper
525
+ routeHelper
365
526
 
527
+ # Public: you can override Luca.Application.startHistory to
528
+ # modify how Backbone.history.start is called. This will get called
529
+ # by the Application instance in response to the @autoStartHistory property.
366
530
  startHistory: ()->
367
531
  Backbone.history.start()
368
532
 
533
+ application.afterDefinition ()->
534
+ Luca.routeHelper = Luca.Application.routeTo
535
+ Luca.Application.checkForKeymaster()
536
+
369
537
  application.register()