luca 0.9.9 → 0.9.42

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 (604) hide show
  1. data/CHANGELOG +9 -153
  2. data/Gemfile +1 -10
  3. data/Gemfile.lock +40 -113
  4. data/Guardfile +25 -3
  5. data/README.md +57 -54
  6. data/ROADMAP +32 -15
  7. data/Rakefile +75 -24
  8. data/app.rb +46 -12
  9. data/{app/assets → assets}/images/glyphicons-halflings-white.png +0 -0
  10. data/{app/assets → assets}/images/glyphicons-halflings.png +0 -0
  11. data/assets/javascripts/dependencies/backbone-min.js +37 -0
  12. data/assets/javascripts/dependencies/backbone-query.min.js +1 -0
  13. data/assets/javascripts/dependencies/bootstrap.min.js +7 -0
  14. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-coffeescript.js +0 -0
  15. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-css.js +0 -0
  16. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-html.js +0 -0
  17. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-javascript.js +0 -0
  18. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-less.js +0 -0
  19. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror-vim.js +0 -0
  20. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/codemirror.js +0 -0
  21. data/assets/javascripts/dependencies/coffee-script.js +12189 -0
  22. data/{spec → assets}/javascripts/dependencies/jasmine-html.js +0 -0
  23. data/{spec → assets}/javascripts/dependencies/jasmine.js +0 -0
  24. data/assets/javascripts/dependencies/jquery.js +4 -0
  25. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/modal.js +0 -0
  26. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/modernizr.min.js +0 -0
  27. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/prettify.js +0 -0
  28. data/{spec → assets}/javascripts/dependencies/sinon.js +0 -0
  29. data/{vendor/assets/javascripts → assets/javascripts/dependencies}/spin-min.js +0 -0
  30. data/assets/javascripts/dependencies/underscore-min.js +31 -0
  31. data/assets/javascripts/dependencies/underscore-string.min.js +14 -0
  32. data/assets/javascripts/dependencies.coffee +5 -0
  33. data/assets/javascripts/luca/index.coffee +1 -0
  34. data/assets/javascripts/luca-templates.js +1 -0
  35. data/assets/javascripts/luca-ui-base.coffee +1 -0
  36. data/assets/javascripts/luca-ui-bootstrap.js +1 -0
  37. data/assets/javascripts/luca-ui-development-tools.coffee +9 -0
  38. data/assets/javascripts/luca-ui-full.js +3 -0
  39. data/assets/javascripts/luca-ui-spec.coffee +2 -0
  40. data/assets/javascripts/luca-ui.js +3 -0
  41. data/assets/javascripts/sandbox/application.coffee +57 -0
  42. data/assets/javascripts/sandbox/config.coffee +7 -0
  43. data/assets/javascripts/sandbox/router.coffee +24 -0
  44. data/assets/javascripts/sandbox/templates/builder/component_list.luca +1 -0
  45. data/assets/javascripts/sandbox/templates/builder.luca +2 -0
  46. data/assets/javascripts/sandbox/templates/main.luca +53 -0
  47. data/assets/javascripts/sandbox/templates/sandbox/docs_index.luca +1 -0
  48. data/assets/javascripts/sandbox/templates/sandbox/navigation.luca +8 -0
  49. data/assets/javascripts/sandbox/templates/sandbox/readme.luca +30 -0
  50. data/assets/javascripts/sandbox/templates/sandbox.luca +1 -0
  51. data/assets/javascripts/sandbox/views/builder/builder_canvas.coffee +3 -0
  52. data/assets/javascripts/sandbox/views/builder/builder_editor.coffee +6 -0
  53. data/assets/javascripts/sandbox/views/builder/component_list.coffee +38 -0
  54. data/assets/javascripts/sandbox/views/builder/project_browser.coffee +14 -0
  55. data/assets/javascripts/sandbox/views/builder.coffee +133 -0
  56. data/assets/javascripts/sandbox/views/docs_controller.coffee +7 -0
  57. data/assets/javascripts/sandbox/views/inspector/instance_filter.coffee +18 -0
  58. data/{app/assets/stylesheets/luca/containers/modal_view.scss → assets/javascripts/sandbox/views/inspector/instance_list.coffee} +0 -0
  59. data/assets/javascripts/sandbox/views/inspector.coffee +11 -0
  60. data/assets/javascripts/sandbox/views/top_navigation.coffee +4 -0
  61. data/assets/javascripts/sandbox.coffee +7 -0
  62. data/assets/javascripts/spec-dependencies.coffee +4 -0
  63. data/assets/stylesheets/bootstrap-responsive.min.css +2 -0
  64. data/assets/stylesheets/bootstrap.min.css +727 -0
  65. data/{vendor/assets → assets}/stylesheets/codemirror-blackboard.css +0 -0
  66. data/{vendor/assets → assets}/stylesheets/codemirror-monokai.css +0 -0
  67. data/{vendor/assets → assets}/stylesheets/codemirror.css +0 -0
  68. data/{vendor/assets → assets}/stylesheets/jasmine.css +0 -0
  69. data/assets/stylesheets/luca-ui-bootstrap.css +4 -0
  70. data/assets/stylesheets/luca-ui-development-tools.css +5 -0
  71. data/assets/stylesheets/luca-ui-full.css +3 -0
  72. data/assets/stylesheets/luca-ui-spec.css +3 -0
  73. data/assets/stylesheets/luca-ui.css +3 -0
  74. data/assets/stylesheets/prettify.css +40 -0
  75. data/assets/stylesheets/sandbox/builder.scss +79 -0
  76. data/assets/stylesheets/sandbox/sandbox.scss +18 -0
  77. data/assets/stylesheets/sandbox.css +3 -0
  78. data/assets/stylesheets/themes/amelia-bootstrap.css +826 -0
  79. data/assets/stylesheets/themes/slate-bootstrap.css +797 -0
  80. data/assets/stylesheets/themes/superhero-bootstrap.css +830 -0
  81. data/config.ru +2 -1
  82. data/docs/{old/application.md → application.md} +0 -0
  83. data/docs/{old/collection.md → collection.md} +0 -0
  84. data/docs/{old/collection_manager.md → collection_manager.md} +0 -0
  85. data/docs/{old/container_philosophy.md → container_philosophy.md} +0 -0
  86. data/docs/{old/event_binding_helpers.md → event_binding_helpers.md} +0 -0
  87. data/docs/{old/method_caching_and_computed_properties.md → method_caching_and_computed_properties.md} +0 -0
  88. data/docs/{old/view.md → view.md} +0 -0
  89. data/lib/luca/code_browser.rb +55 -0
  90. data/lib/luca/command_line.rb +69 -0
  91. data/lib/luca/rails/engine.rb +0 -12
  92. data/lib/luca/rails/version.rb +2 -1
  93. data/lib/luca/rails.rb +3 -5
  94. data/lib/luca/template.rb +0 -2
  95. data/lib/luca.rb +1 -25
  96. data/luca.gemspec +7 -16
  97. data/site/assets/bootstrap.min.js +7 -0
  98. data/site/assets/dependencies.js +94 -0
  99. data/site/assets/glyphicons-halflings-white.png +0 -0
  100. data/site/assets/glyphicons-halflings.png +0 -0
  101. data/site/assets/luca-ui-bootstrap.css +1331 -0
  102. data/site/assets/luca-ui-bootstrap.js +9 -0
  103. data/site/assets/luca-ui-development-tools.css +234 -0
  104. data/site/assets/luca-ui-development-tools.js +18561 -0
  105. data/site/assets/luca-ui-development-tools.min.js +15 -0
  106. data/site/assets/luca-ui-full.min.js +8 -0
  107. data/site/assets/luca-ui.min.js +4 -0
  108. data/site/assets/sandbox.css +62 -0
  109. data/site/assets/sandbox.js +469 -0
  110. data/site/docs/application.html +41 -0
  111. data/site/docs/caching.html +43 -0
  112. data/site/docs/collection.html +75 -0
  113. data/site/docs/collection_manager.html +71 -0
  114. data/site/docs/containers.html +118 -0
  115. data/site/docs/events.html +153 -0
  116. data/site/docs/view.html +128 -0
  117. data/site/img/glyphicons-halflings-white.png +0 -0
  118. data/site/img/glyphicons-halflings.png +0 -0
  119. data/site/index.html +20 -0
  120. data/site/source-map.js +1 -0
  121. data/spec/{javascripts/components → components}/application_spec.coffee +0 -0
  122. data/spec/{javascripts/components → components}/collection_loader_view_spec.coffee +0 -0
  123. data/{site/source/app/assets/javascripts/docs/lib/util.coffee → spec/components/controller_spec.coffee} +0 -0
  124. data/spec/{javascripts/components → components}/fields/checkbox_array_spec.coffee +0 -0
  125. data/spec/components/form_view_spec.coffee +80 -0
  126. data/spec/{javascripts/components → components}/grid_view_spec.coffee +0 -0
  127. data/spec/{javascripts/components → components}/record_manager_spec.coffee +0 -0
  128. data/spec/{javascripts/components → components}/template_spec.coffee +0 -0
  129. data/spec/containers/card_view_spec.coffee +50 -0
  130. data/{site/source/app/assets/javascripts/docs/views/components/code_editor/index.coffee → spec/containers/column_view_spec.coffee} +0 -0
  131. data/spec/{javascripts/containers → containers}/modal_view_spec.coffee +0 -0
  132. data/spec/{javascripts/containers → containers}/panel_view_spec.coffee +0 -0
  133. data/spec/{javascripts/components/pagination_control_spec.coffee → containers/split_view_spec.coffee} +0 -0
  134. data/spec/{javascripts/containers → containers}/tab_view_spec.coffee +0 -0
  135. data/spec/{javascripts/containers → containers}/viewport_spec.coffee +0 -0
  136. data/spec/{javascripts/core → core}/collection_spec.coffee +1 -26
  137. data/spec/core/container_spec.coffee +66 -0
  138. data/spec/{javascripts/concerns/paginatable_spec.coffee → core/field_spec.coffee} +0 -0
  139. data/spec/{javascripts/core → core}/model_spec.coffee +3 -26
  140. data/spec/{javascripts/core → core}/observer_spec.coffee +0 -0
  141. data/spec/{javascripts/core → core}/view_spec.coffee +38 -114
  142. data/spec/{javascripts/core/framework_spec.coffee → framework_spec.coffee} +2 -31
  143. data/spec/{javascripts/helper.coffee → helper.coffee} +0 -0
  144. data/spec/{javascripts/managers → managers}/collection_manager_spec.coffee +0 -0
  145. data/spec/{javascripts/managers → managers}/socket_manager_spec.coffee +0 -0
  146. data/src/components/application.coffee +318 -0
  147. data/src/components/base_toolbar.coffee +15 -0
  148. data/{app/assets/javascripts/luca → src}/components/collection_loader_view.coffee +1 -3
  149. data/src/components/collection_view.coffee +131 -0
  150. data/src/components/controller.coffee +63 -0
  151. data/src/components/fields/button_field.coffee +38 -0
  152. data/{app/assets/javascripts/luca → src}/components/fields/checkbox_array.coffee +7 -18
  153. data/{app/assets/javascripts/luca → src}/components/fields/checkbox_field.coffee +10 -19
  154. data/{app/assets/javascripts/luca → src}/components/fields/file_upload_field.coffee +4 -5
  155. data/src/components/fields/hidden_field.coffee +12 -0
  156. data/src/components/fields/label_field.coffee +14 -0
  157. data/src/components/fields/select_field.coffee +97 -0
  158. data/src/components/fields/text_area_field.coffee +40 -0
  159. data/{app/assets/javascripts/luca → src}/components/fields/text_field.coffee +5 -16
  160. data/src/components/fields/type_ahead_field.coffee +22 -0
  161. data/src/components/form_button_toolbar.coffee +25 -0
  162. data/src/components/form_view.coffee +275 -0
  163. data/src/components/grid_view.coffee +269 -0
  164. data/src/components/index.coffee +1 -0
  165. data/src/components/load_mask.coffee +3 -0
  166. data/src/components/nav_bar.coffee +22 -0
  167. data/src/components/page_controller.coffee +2 -0
  168. data/{app/assets/javascripts/luca → src}/components/record_manager.coffee +0 -0
  169. data/{app/assets/javascripts/luca → src}/components/router.coffee +1 -6
  170. data/src/components/table_view.coffee +53 -0
  171. data/src/components/template.coffee +5 -0
  172. data/src/components/toolbar_dialog.coffee +25 -0
  173. data/src/containers/card_view.coffee +93 -0
  174. data/src/containers/column_view.coffee +42 -0
  175. data/{app/assets/javascripts/luca → src}/containers/modal_view.coffee +9 -9
  176. data/src/containers/page_view.coffee +2 -0
  177. data/{app/assets/javascripts/luca → src}/containers/panel_toolbar.coffee +84 -89
  178. data/src/containers/panel_view.coffee +23 -0
  179. data/src/containers/split_view.coffee +8 -0
  180. data/{app/assets/javascripts/luca → src}/containers/tab_view.coffee +21 -27
  181. data/{app/assets/javascripts/luca → src}/containers/viewport.coffee +18 -14
  182. data/{app/assets/javascripts/luca → src}/core/collection.coffee +51 -97
  183. data/src/core/container.coffee +374 -0
  184. data/{tutorials/component-definitions.md → src/core/core.coffee} +0 -0
  185. data/src/core/field.coffee +79 -0
  186. data/src/core/model.coffee +43 -0
  187. data/{app/assets/javascripts/luca → src}/core/observer.coffee +0 -0
  188. data/src/core/panel.coffee +118 -0
  189. data/{app/assets/javascripts/luca/core/registry → src/core}/registry.coffee +43 -63
  190. data/{app/assets/javascripts/luca/util → src/core}/script_loader.coffee +0 -0
  191. data/src/core/view.coffee +264 -0
  192. data/src/define.coffee +110 -0
  193. data/{app/assets/javascripts/luca → src}/framework.coffee +103 -98
  194. data/src/index.coffee +23 -0
  195. data/{app/assets/javascripts/luca → src}/managers/collection_manager.coffee +13 -37
  196. data/src/managers/socket_manager.coffee +54 -0
  197. data/{app/assets/javascripts/luca/concerns → src/modules}/deferrable.coffee +4 -5
  198. data/src/modules/grid_layout.coffee +3 -0
  199. data/{app/assets/javascripts/luca/concerns/loadmaskable.coffee → src/modules/load_mask.coffee} +11 -23
  200. data/{app/assets/javascripts/luca/concerns → src/modules}/local_storage.coffee +0 -0
  201. data/src/plugins/development_tool_helpers.coffee +21 -0
  202. data/src/plugins/events.coffee +54 -0
  203. data/src/samples/definition.coffee +49 -0
  204. data/{tutorials/component-definitions/01_intro.md → src/stylesheets/base.scss} +0 -0
  205. data/{app/assets/stylesheets/luca → src/stylesheets}/components/checkbox_array.scss +1 -1
  206. data/src/stylesheets/components/form_view.scss +59 -0
  207. data/{app/assets/stylesheets/luca → src/stylesheets}/components/grid_view.scss +0 -0
  208. data/{app/assets/stylesheets/luca → src/stylesheets}/components/load_mask.scss +0 -0
  209. data/src/stylesheets/components/toolbar.scss +0 -0
  210. data/{app/assets/stylesheets/luca → src/stylesheets}/components/viewport.scss +4 -1
  211. data/src/stylesheets/containers/container.scss +16 -0
  212. data/src/stylesheets/containers/modal_view.scss +0 -0
  213. data/{app/assets/stylesheets/luca → src/stylesheets}/containers/panels.scss +0 -0
  214. data/{app/assets/stylesheets/luca → src/stylesheets}/containers/tab_view.scss +5 -5
  215. data/{app/assets/stylesheets/luca → src/stylesheets}/normalize.scss +0 -0
  216. data/src/stylesheets/tools/class_browser.scss +32 -0
  217. data/src/stylesheets/tools/code_editor.scss +24 -0
  218. data/src/stylesheets/tools/component_tester.scss +26 -0
  219. data/{app/assets/stylesheets/luca/development → src/stylesheets/tools}/console.scss +0 -0
  220. data/src/templates/components/bootstrap_form_controls.luca +7 -0
  221. data/src/templates/components/collection_loader_view.luca +5 -0
  222. data/src/templates/components/form_alert +0 -0
  223. data/src/templates/components/form_alert.luca +3 -0
  224. data/src/templates/components/grid_view.luca +7 -0
  225. data/src/templates/components/grid_view_empty_text.luca +3 -0
  226. data/src/templates/components/load_mask.luca +3 -0
  227. data/src/templates/components/nav_bar.luca +2 -0
  228. data/src/templates/containers/basic.luca +1 -0
  229. data/src/templates/containers/tab_selector_container.luca +8 -0
  230. data/src/templates/containers/tab_view.luca +2 -0
  231. data/src/templates/containers/toolbar_wrapper.luca +1 -0
  232. data/src/templates/fields/button_field.luca +2 -0
  233. data/src/templates/fields/button_field_link.luca +5 -0
  234. data/src/templates/fields/checkbox_array.luca +4 -0
  235. data/src/templates/fields/checkbox_array_item.luca +4 -0
  236. data/src/templates/fields/checkbox_field.luca +9 -0
  237. data/src/templates/fields/file_upload_field.luca +8 -0
  238. data/src/templates/fields/hidden_field.luca +1 -0
  239. data/src/templates/fields/select_field.luca +8 -0
  240. data/src/templates/fields/text_area_field.luca +8 -0
  241. data/src/templates/fields/text_field.luca +17 -0
  242. data/src/templates/sample/contents.luca +1 -0
  243. data/src/templates/sample/welcome.luca +1 -0
  244. data/src/templates/table_view.luca +4 -0
  245. data/src/tools/application_inspector.coffee +2 -0
  246. data/src/tools/code_editor.coffee +258 -0
  247. data/{app/assets/javascripts/luca/development → src/tools}/code_mirror_field.coffee +1 -2
  248. data/src/tools/coffee_script_editor.coffee +82 -0
  249. data/src/tools/collection_inspector.coffee +4 -0
  250. data/src/tools/collections/components.coffee +59 -0
  251. data/src/tools/collections/instances.coffee +15 -0
  252. data/src/tools/component_tester.coffee +462 -0
  253. data/{app/assets/javascripts/luca/development → src/tools}/console.coffee +24 -55
  254. data/src/tools/models/components.coffee +25 -0
  255. data/src/tools/models/instance.coffee +2 -0
  256. data/src/tools/templates/component_tester/help.luca +14 -0
  257. data/{app/assets/javascripts/luca/util/luca.coffee → src/util.coffee} +6 -90
  258. data/vendor/assets/javascripts/luca-ui-development-tools.js +18533 -0
  259. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +15 -0
  260. data/vendor/assets/javascripts/luca-ui-full.js +4806 -0
  261. data/vendor/assets/javascripts/luca-ui-full.min.js +8 -0
  262. data/vendor/assets/javascripts/luca-ui-templates.js +24 -0
  263. data/vendor/assets/javascripts/luca-ui.js +1703 -4394
  264. data/vendor/assets/javascripts/luca-ui.min.js +4 -5
  265. data/vendor/assets/luca-ui/base.css +85 -0
  266. data/vendor/assets/luca-ui/components/application.js +91 -0
  267. data/vendor/assets/luca-ui/components/base_toolbar.js +23 -0
  268. data/vendor/assets/luca-ui/components/controller.js +38 -0
  269. data/vendor/assets/luca-ui/components/fields/button_field.js +45 -0
  270. data/vendor/assets/luca-ui/components/fields/checkbox_field.js +43 -0
  271. data/vendor/assets/luca-ui/components/fields/file_upload_field.js +20 -0
  272. data/vendor/assets/luca-ui/components/fields/hidden_field.js +20 -0
  273. data/vendor/assets/luca-ui/components/fields/select_field.js +97 -0
  274. data/vendor/assets/luca-ui/components/fields/text_area_field.js +48 -0
  275. data/vendor/assets/luca-ui/components/fields/text_field.js +46 -0
  276. data/vendor/assets/luca-ui/components/fields/type_ahead_field.js +13 -0
  277. data/vendor/assets/luca-ui/components/form_button_toolbar.js +32 -0
  278. data/vendor/assets/luca-ui/components/form_view.css +32 -0
  279. data/vendor/assets/luca-ui/components/form_view.js +207 -0
  280. data/{app/assets/stylesheets/luca/components/table_view.scss → vendor/assets/luca-ui/components/grid_view.css} +51 -60
  281. data/vendor/assets/luca-ui/components/grid_view.js +202 -0
  282. data/vendor/assets/luca-ui/components/record_manager.js +207 -0
  283. data/vendor/assets/luca-ui/components/router.js +36 -0
  284. data/vendor/assets/luca-ui/components/template.js +26 -0
  285. data/vendor/assets/luca-ui/components/toolbar.css +11 -0
  286. data/vendor/assets/luca-ui/containers/card_view.js +98 -0
  287. data/vendor/assets/luca-ui/containers/column_view.js +52 -0
  288. data/vendor/assets/luca-ui/containers/container.css +3 -0
  289. data/vendor/assets/luca-ui/containers/modal_view.css +0 -0
  290. data/vendor/assets/luca-ui/containers/modal_view.js +87 -0
  291. data/vendor/assets/luca-ui/containers/panel_view.js +34 -0
  292. data/vendor/assets/luca-ui/containers/split_view.js +13 -0
  293. data/vendor/assets/luca-ui/containers/tab_view.css +16 -0
  294. data/vendor/assets/luca-ui/containers/tab_view.js +80 -0
  295. data/vendor/assets/luca-ui/containers/viewport.js +18 -0
  296. data/vendor/assets/luca-ui/core/collection.js +221 -0
  297. data/vendor/assets/luca-ui/core/container.js +205 -0
  298. data/vendor/assets/luca-ui/core/field.js +59 -0
  299. data/vendor/assets/luca-ui/core/observer.js +42 -0
  300. data/vendor/assets/luca-ui/core/view.js +127 -0
  301. data/vendor/assets/luca-ui/framework.js +110 -0
  302. data/vendor/assets/luca-ui/index.js +5 -0
  303. data/vendor/assets/luca-ui/managers/collection_manager.js +98 -0
  304. data/vendor/assets/luca-ui/managers/socket_manager.js +52 -0
  305. data/vendor/assets/luca-ui/modules/deferrable.js +21 -0
  306. data/vendor/assets/luca-ui/modules/local_storage.js +81 -0
  307. data/vendor/assets/luca-ui/normalize.css +359 -0
  308. data/vendor/assets/luca-ui/stylesheets/base.css +85 -0
  309. data/vendor/assets/luca-ui/stylesheets/components/form_view.css +32 -0
  310. data/vendor/assets/luca-ui/stylesheets/components/grid_view.css +76 -0
  311. data/vendor/assets/luca-ui/stylesheets/components/toolbar.css +11 -0
  312. data/vendor/assets/luca-ui/stylesheets/containers/container.css +3 -0
  313. data/vendor/assets/luca-ui/stylesheets/containers/modal_view.css +0 -0
  314. data/vendor/assets/luca-ui/stylesheets/containers/tab_view.css +16 -0
  315. data/vendor/assets/luca-ui/stylesheets/normalize.css +359 -0
  316. data/vendor/assets/luca-ui/templates/components/bootstrap_form_controls.js +4 -0
  317. data/vendor/assets/luca-ui/templates/components/form_view.js +4 -0
  318. data/vendor/assets/luca-ui/templates/components/grid_view.js +4 -0
  319. data/vendor/assets/luca-ui/templates/components/grid_view_empty_text.js +4 -0
  320. data/vendor/assets/luca-ui/templates/containers/basic.js +4 -0
  321. data/vendor/assets/luca-ui/templates/containers/tab_selector_container.js +4 -0
  322. data/vendor/assets/luca-ui/templates/containers/tab_view.js +4 -0
  323. data/vendor/assets/luca-ui/templates/containers/toolbar_wrapper.js +4 -0
  324. data/vendor/assets/luca-ui/templates/fields/button_field.js +4 -0
  325. data/vendor/assets/luca-ui/templates/fields/button_field_link.js +4 -0
  326. data/vendor/assets/luca-ui/templates/fields/checkbox_field.js +4 -0
  327. data/vendor/assets/luca-ui/templates/fields/file_upload_field.js +4 -0
  328. data/vendor/assets/luca-ui/templates/fields/hidden_field.js +4 -0
  329. data/vendor/assets/luca-ui/templates/fields/select_field.js +4 -0
  330. data/vendor/assets/luca-ui/templates/fields/text_area_field.js +4 -0
  331. data/vendor/assets/luca-ui/templates/fields/text_field.js +4 -0
  332. data/vendor/assets/luca-ui/templates/sample/contents.js +4 -0
  333. data/vendor/assets/luca-ui/templates/sample/welcome.js +4 -0
  334. data/vendor/assets/stylesheets/luca-ui.css +471 -68
  335. data/views/jasmine.erb +2 -2
  336. metadata +328 -496
  337. data/app/assets/javascripts/luca/basic.coffee +0 -8
  338. data/app/assets/javascripts/luca/components/application.coffee +0 -530
  339. data/app/assets/javascripts/luca/components/collection_view.coffee +0 -211
  340. data/app/assets/javascripts/luca/components/controller.coffee +0 -176
  341. data/app/assets/javascripts/luca/components/fields/base.coffee +0 -144
  342. data/app/assets/javascripts/luca/components/fields/button_field.coffee +0 -91
  343. data/app/assets/javascripts/luca/components/fields/hidden_field.coffee +0 -11
  344. data/app/assets/javascripts/luca/components/fields/label_field.coffee +0 -12
  345. data/app/assets/javascripts/luca/components/fields/select_field.coffee +0 -159
  346. data/app/assets/javascripts/luca/components/fields/text_area_field.coffee +0 -57
  347. data/app/assets/javascripts/luca/components/fields/type_ahead_field.coffee +0 -20
  348. data/app/assets/javascripts/luca/components/form_view.coffee +0 -421
  349. data/app/assets/javascripts/luca/components/grid_layout_view.coffee +0 -42
  350. data/app/assets/javascripts/luca/components/index.coffee +0 -7
  351. data/app/assets/javascripts/luca/components/load_mask.coffee +0 -8
  352. data/app/assets/javascripts/luca/components/multi_collection_view.coffee +0 -92
  353. data/app/assets/javascripts/luca/components/nav_bar.coffee +0 -80
  354. data/app/assets/javascripts/luca/components/page.coffee +0 -70
  355. data/app/assets/javascripts/luca/components/pagination_control.coffee +0 -104
  356. data/app/assets/javascripts/luca/components/simple_collection_view.coffee +0 -10
  357. data/app/assets/javascripts/luca/components/table_view.coffee +0 -93
  358. data/app/assets/javascripts/luca/components/table_view_scrollable.coffee +0 -23
  359. data/app/assets/javascripts/luca/concerns/application_event_bindings.coffee +0 -19
  360. data/app/assets/javascripts/luca/concerns/collection_event_bindings.coffee +0 -47
  361. data/app/assets/javascripts/luca/concerns/development_tool_helpers.coffee +0 -30
  362. data/app/assets/javascripts/luca/concerns/dom_helpers.coffee +0 -61
  363. data/app/assets/javascripts/luca/concerns/enhanced_properties.coffee +0 -23
  364. data/app/assets/javascripts/luca/concerns/filterable.coffee +0 -101
  365. data/app/assets/javascripts/luca/concerns/form_model_bindings.coffee +0 -20
  366. data/app/assets/javascripts/luca/concerns/grid_layout.coffee +0 -15
  367. data/app/assets/javascripts/luca/concerns/modal_view.coffee +0 -63
  368. data/app/assets/javascripts/luca/concerns/model_presenter.coffee +0 -23
  369. data/app/assets/javascripts/luca/concerns/paginatable.coffee +0 -79
  370. data/app/assets/javascripts/luca/concerns/query_collection_bindings.coffee +0 -52
  371. data/app/assets/javascripts/luca/concerns/sortable.coffee +0 -69
  372. data/app/assets/javascripts/luca/concerns/state_model.coffee +0 -58
  373. data/app/assets/javascripts/luca/concerns/templating.coffee +0 -13
  374. data/app/assets/javascripts/luca/config.coffee +0 -54
  375. data/app/assets/javascripts/luca/containers/card_view.coffee +0 -178
  376. data/app/assets/javascripts/luca/containers/container.coffee +0 -711
  377. data/app/assets/javascripts/luca/containers/index.coffee +0 -2
  378. data/app/assets/javascripts/luca/containers/page_controller.coffee +0 -25
  379. data/app/assets/javascripts/luca/core/events.coffee +0 -114
  380. data/app/assets/javascripts/luca/core/index.coffee +0 -12
  381. data/app/assets/javascripts/luca/core/model.coffee +0 -56
  382. data/app/assets/javascripts/luca/core/panel.coffee +0 -124
  383. data/app/assets/javascripts/luca/core/registry/component_definition.coffee +0 -319
  384. data/app/assets/javascripts/luca/core/registry/concerns.coffee +0 -70
  385. data/app/assets/javascripts/luca/core/registry/index.coffee +0 -4
  386. data/app/assets/javascripts/luca/core/registry/meta_data.coffee +0 -99
  387. data/app/assets/javascripts/luca/core/templates.coffee +0 -51
  388. data/app/assets/javascripts/luca/core/view.coffee +0 -383
  389. data/app/assets/javascripts/luca/dependencies.coffee +0 -9
  390. data/app/assets/javascripts/luca/development/code_sync_manager.coffee +0 -173
  391. data/app/assets/javascripts/luca/development/component.coffee +0 -76
  392. data/app/assets/javascripts/luca/development/components.coffee +0 -57
  393. data/app/assets/javascripts/luca/development/index.coffee +0 -5
  394. data/app/assets/javascripts/luca/index.coffee +0 -9
  395. data/app/assets/javascripts/luca/managers/index.coffee +0 -2
  396. data/app/assets/javascripts/luca/managers/socket_manager.coffee +0 -89
  397. data/app/assets/javascripts/luca/templates/components/bootstrap_form_controls.jst.ejs +0 -10
  398. data/app/assets/javascripts/luca/templates/components/collection_loader_view.jst.ejs +0 -6
  399. data/app/assets/javascripts/luca/templates/components/form_alert.jst.ejs +0 -4
  400. data/app/assets/javascripts/luca/templates/components/grid_view.jst.ejs +0 -11
  401. data/app/assets/javascripts/luca/templates/components/grid_view_empty_text.jst.ejs +0 -3
  402. data/app/assets/javascripts/luca/templates/components/load_mask.jst.ejs +0 -5
  403. data/app/assets/javascripts/luca/templates/components/nav_bar.jst.ejs +0 -19
  404. data/app/assets/javascripts/luca/templates/components/pagination.jst.ejs +0 -10
  405. data/app/assets/javascripts/luca/templates/components/table_view.jst.ejs +0 -4
  406. data/app/assets/javascripts/luca/templates/containers/basic.jst.ejs +0 -1
  407. data/app/assets/javascripts/luca/templates/containers/tab_selector_container.jst.ejs +0 -12
  408. data/app/assets/javascripts/luca/templates/containers/tab_view.jst.ejs +0 -2
  409. data/app/assets/javascripts/luca/templates/containers/toolbar_wrapper.jst.ejs +0 -1
  410. data/app/assets/javascripts/luca/templates/fields/button_field.jst.ejs +0 -2
  411. data/app/assets/javascripts/luca/templates/fields/button_field_link.jst.ejs +0 -6
  412. data/app/assets/javascripts/luca/templates/fields/checkbox_array.jst.ejs +0 -4
  413. data/app/assets/javascripts/luca/templates/fields/checkbox_array_item.jst.ejs +0 -3
  414. data/app/assets/javascripts/luca/templates/fields/checkbox_field.jst.ejs +0 -10
  415. data/app/assets/javascripts/luca/templates/fields/file_upload_field.jst.ejs +0 -10
  416. data/app/assets/javascripts/luca/templates/fields/hidden_field.jst.ejs +0 -1
  417. data/app/assets/javascripts/luca/templates/fields/select_field.jst.ejs +0 -11
  418. data/app/assets/javascripts/luca/templates/fields/text_area_field.jst.ejs +0 -11
  419. data/app/assets/javascripts/luca/templates/fields/text_field.jst.ejs +0 -16
  420. data/app/assets/javascripts/luca/util/deprecations.coffee +0 -18
  421. data/app/assets/javascripts/luca/util/index.coffee +0 -4
  422. data/app/assets/javascripts/luca/util/keybindings.coffee +0 -24
  423. data/app/assets/javascripts/luca/util/logging.coffee +0 -30
  424. data/app/assets/javascripts/luca-ui.js +0 -1
  425. data/app/assets/stylesheets/luca/components/form_view.scss +0 -7
  426. data/app/assets/stylesheets/luca/containers/container.scss +0 -19
  427. data/app/assets/stylesheets/luca/development/index.css +0 -3
  428. data/app/assets/stylesheets/luca/index.css +0 -4
  429. data/bin/luca +0 -14
  430. data/docs/framework.json +0 -1
  431. data/docs/luca-framework-documentation.js +0 -1
  432. data/lib/generators/luca/application/application_generator.rb +0 -75
  433. data/lib/generators/luca/application/templates/controller.rb +0 -4
  434. data/lib/generators/luca/application/templates/index.html.erb +0 -19
  435. data/lib/generators/luca/application/templates/index.html.haml +0 -7
  436. data/lib/generators/luca/application/templates/javascripts/application.coffee +0 -18
  437. data/lib/generators/luca/application/templates/javascripts/collection_manager.coffee +0 -2
  438. data/lib/generators/luca/application/templates/javascripts/config.coffee +0 -3
  439. data/lib/generators/luca/application/templates/javascripts/dependencies.coffee +0 -3
  440. data/lib/generators/luca/application/templates/javascripts/home.jst.ejs +0 -2
  441. data/lib/generators/luca/application/templates/javascripts/index.coffee +0 -15
  442. data/lib/generators/luca/application/templates/javascripts/router.coffee +0 -4
  443. data/lib/guard/luca.rb +0 -84
  444. data/lib/luca/asset_compiler.rb +0 -117
  445. data/lib/luca/cli/generate.rb +0 -37
  446. data/lib/luca/cli/server.rb +0 -20
  447. data/lib/luca/cli/sync.rb +0 -40
  448. data/lib/luca/cli/watch.rb +0 -16
  449. data/lib/luca/cli.rb +0 -68
  450. data/lib/luca/collection/endpoint.rb +0 -38
  451. data/lib/luca/collection/file_backend.rb +0 -121
  452. data/lib/luca/collection/redis_backend.rb +0 -153
  453. data/lib/luca/collection.rb +0 -64
  454. data/lib/luca/compiled_asset.rb +0 -61
  455. data/lib/luca/component_definition.rb +0 -356
  456. data/lib/luca/luca_application.rb +0 -258
  457. data/lib/luca/project.rb +0 -73
  458. data/lib/luca/project_harness.rb +0 -96
  459. data/lib/luca/server.rb +0 -7
  460. data/lib/luca/stylesheet.rb +0 -35
  461. data/lib/luca/template_asset.rb +0 -64
  462. data/lib/luca/version.rb +0 -3
  463. data/lib/luca/watcher.rb +0 -72
  464. data/lib/railties/luca/tasks.rake +0 -38
  465. data/site/.bundle/config +0 -2
  466. data/site/.gitignore +0 -5
  467. data/site/.rvmrc +0 -1
  468. data/site/CHANGELOG.md +0 -41
  469. data/site/DOCS.md +0 -41
  470. data/site/Gemfile +0 -8
  471. data/site/Gemfile.lock +0 -134
  472. data/site/LICENSE.md +0 -19
  473. data/site/config.rb +0 -84
  474. data/site/helpers/site_helpers.rb +0 -20
  475. data/site/html5bp-docs/README.md +0 -38
  476. data/site/html5bp-docs/contribute.md +0 -104
  477. data/site/html5bp-docs/crossdomain.md +0 -21
  478. data/site/html5bp-docs/css.md +0 -135
  479. data/site/html5bp-docs/extend.md +0 -507
  480. data/site/html5bp-docs/faq.md +0 -77
  481. data/site/html5bp-docs/htaccess.md +0 -323
  482. data/site/html5bp-docs/html.md +0 -170
  483. data/site/html5bp-docs/js.md +0 -31
  484. data/site/html5bp-docs/misc.md +0 -25
  485. data/site/html5bp-docs/usage.md +0 -109
  486. data/site/readme.md +0 -47
  487. data/site/source/.htaccess +0 -540
  488. data/site/source/404.html +0 -157
  489. data/site/source/app/assets/javascripts/dependencies.js.coffee +0 -6
  490. data/site/source/app/assets/javascripts/docs/application.coffee +0 -64
  491. data/site/source/app/assets/javascripts/docs/collections/docs_documentation.coffee +0 -17
  492. data/site/source/app/assets/javascripts/docs/collections/github_repositories.coffee +0 -7
  493. data/site/source/app/assets/javascripts/docs/collections/index.coffee +0 -1
  494. data/site/source/app/assets/javascripts/docs/collections/luca_documentation.coffee +0 -17
  495. data/site/source/app/assets/javascripts/docs/collections/public_gists.coffee +0 -4
  496. data/site/source/app/assets/javascripts/docs/config.coffee +0 -5
  497. data/site/source/app/assets/javascripts/docs/index.coffee +0 -12
  498. data/site/source/app/assets/javascripts/docs/lib/router.coffee +0 -3
  499. data/site/source/app/assets/javascripts/docs/models/component.coffee +0 -99
  500. data/site/source/app/assets/javascripts/docs/models/github_repository.coffee +0 -3
  501. data/site/source/app/assets/javascripts/docs/models/index.coffee +0 -1
  502. data/site/source/app/assets/javascripts/docs/templates/component_documentation.jst.ejs +0 -55
  503. data/site/source/app/assets/javascripts/docs/templates/examples_browser/overview.jst.ejs +0 -4
  504. data/site/source/app/assets/javascripts/docs/templates/examples_browser/selector.jst.ejs +0 -11
  505. data/site/source/app/assets/javascripts/docs/templates/github_repository.jst.ejs +0 -4
  506. data/site/source/app/assets/javascripts/docs/templates/layouts/main.jst.ejs +0 -4
  507. data/site/source/app/assets/javascripts/docs/templates/left_navigation.jst.ejs +0 -5
  508. data/site/source/app/assets/javascripts/docs/templates/pages/getting_started.jst.ejs +0 -78
  509. data/site/source/app/assets/javascripts/docs/templates/pages/home.jst.ejs +0 -57
  510. data/site/source/app/assets/javascripts/docs/views/components/code_editor.coffee +0 -45
  511. data/site/source/app/assets/javascripts/docs/views/components/component_documentation.coffee +0 -72
  512. data/site/source/app/assets/javascripts/docs/views/index.coffee +0 -3
  513. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/details.coffee +0 -37
  514. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/list.coffee +0 -31
  515. data/site/source/app/assets/javascripts/docs/views/pages/browse_source.coffee +0 -46
  516. data/site/source/app/assets/javascripts/docs/views/pages/component_editor.coffee +0 -10
  517. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/docs.coffee +0 -12
  518. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/source.coffee +0 -13
  519. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser.coffee +0 -102
  520. data/site/source/app/assets/javascripts/docs/views/pages/home.coffee +0 -10
  521. data/site/source/app/assets/javascripts/docs/views/views/api_browser/index.coffee +0 -43
  522. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/grid_layout_view_example.coffee +0 -14
  523. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/table_view_example.coffee +0 -39
  524. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/basic_example.coffee +0 -38
  525. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/complex_layout.coffee +0 -110
  526. data/site/source/app/assets/javascripts/docs/views/views/top_navigation.coffee +0 -6
  527. data/site/source/app/assets/javascripts/docs-docs.js +0 -1
  528. data/site/source/app/assets/javascripts/luca-docs.js +0 -1
  529. data/site/source/app/assets/javascripts/luca-framework-documentation.js +0 -1
  530. data/site/source/app/assets/javascripts/site.js.coffee +0 -4
  531. data/site/source/app/assets/javascripts/vendor/codemirror.js +0 -4786
  532. data/site/source/app/assets/javascripts/vendor/coffeescript.js +0 -346
  533. data/site/source/app/assets/javascripts/vendor/css.js +0 -465
  534. data/site/source/app/assets/javascripts/vendor/htmlmixed.js +0 -84
  535. data/site/source/app/assets/javascripts/vendor/javascript.js +0 -422
  536. data/site/source/app/assets/javascripts/vendor/js-beautify.js +0 -1353
  537. data/site/source/app/assets/javascripts/vendor/modernizr-2.6.1.min.js +0 -4
  538. data/site/source/app/assets/javascripts/vendor/vim.js +0 -2511
  539. data/site/source/app/assets/stylesheets/docs/api-browser.css.scss +0 -5
  540. data/site/source/app/assets/stylesheets/docs/application.css.scss +0 -35
  541. data/site/source/app/assets/stylesheets/docs/browse-source.css.scss +0 -5
  542. data/site/source/app/assets/stylesheets/docs/scrollable-table.css.scss +0 -5
  543. data/site/source/app/assets/stylesheets/site.css.scss +0 -2
  544. data/site/source/app/assets/stylesheets/vendor/codemirror.css +0 -240
  545. data/site/source/app/assets/stylesheets/vendor/prettify-tomorrow-night-bright.css +0 -160
  546. data/site/source/app/assets/stylesheets/vendor/twilight.css +0 -26
  547. data/site/source/crossdomain.xml +0 -15
  548. data/site/source/documentation.html.haml +0 -1
  549. data/site/source/favicon_base.png +0 -0
  550. data/site/source/humans.txt +0 -15
  551. data/site/source/images/background.png +0 -0
  552. data/site/source/images/middleman.png +0 -0
  553. data/site/source/index.html.haml +0 -1
  554. data/site/source/layouts/layout.haml +0 -55
  555. data/site/source/readme.md +0 -63
  556. data/site/source/robots.txt +0 -3
  557. data/spec/javascripts/components/collection_view_spec.coffee +0 -59
  558. data/spec/javascripts/components/controller_spec.coffee +0 -62
  559. data/spec/javascripts/components/form_view_spec.coffee +0 -162
  560. data/spec/javascripts/components/multi_collection_view_spec.coffee +0 -5
  561. data/spec/javascripts/components/table_view_spec.coffee +0 -17
  562. data/spec/javascripts/concerns/collection_event_bindings_spec.coffee +0 -15
  563. data/spec/javascripts/concerns/dom_helpers_spec.coffee +0 -16
  564. data/spec/javascripts/concerns/filterable_spec.coffee +0 -25
  565. data/spec/javascripts/concerns/model_presenter_spec.coffee +0 -31
  566. data/spec/javascripts/concerns/state_model_spec.coffee +0 -55
  567. data/spec/javascripts/containers/card_view_spec.coffee +0 -108
  568. data/spec/javascripts/core/concerns_spec.coffee +0 -88
  569. data/spec/javascripts/core/container_spec.coffee +0 -287
  570. data/spec/javascripts/core/define_spec.coffee +0 -116
  571. data/spec/javascripts/core/events_spec.coffee +0 -26
  572. data/spec/javascripts/core/field_spec.coffee +0 -4
  573. data/spec/javascripts/core/util_spec.coffee +0 -24
  574. data/spec/javascripts/dependencies/index.coffee +0 -3
  575. data/spec/lib/component_definition_spec.rb +0 -63
  576. data/spec/lib/input_compiler_spec.rb +0 -9
  577. data/spec/lib/luca_application_spec.rb +0 -30
  578. data/spec/support/fixtures/application.coffee +0 -45
  579. data/spec/support/fixtures/component.coffee +0 -34
  580. data/tutorials/component-driven-design.md +0 -140
  581. data/tutorials/structure-of-a-project.md +0 -63
  582. data/vendor/assets/javascripts/backbone-ext.js +0 -21
  583. data/vendor/assets/javascripts/backbone-min.js +0 -42
  584. data/vendor/assets/javascripts/backbone-query.min.js +0 -1
  585. data/vendor/assets/javascripts/bootstrap.min.js +0 -7
  586. data/vendor/assets/javascripts/codemirror-ui.js +0 -503
  587. data/vendor/assets/javascripts/hogan.js +0 -707
  588. data/vendor/assets/javascripts/inflections.js +0 -656
  589. data/vendor/assets/javascripts/jasmine-html.js +0 -190
  590. data/vendor/assets/javascripts/jasmine.js +0 -2476
  591. data/vendor/assets/javascripts/jquery.js +0 -5
  592. data/vendor/assets/javascripts/keymaster.min.js +0 -4
  593. data/vendor/assets/javascripts/luca-dependencies.min.js +0 -8
  594. data/vendor/assets/javascripts/luca-development.min.js +0 -1
  595. data/vendor/assets/javascripts/luca-spec.js +0 -11
  596. data/vendor/assets/javascripts/luca.full.min.js +0 -12
  597. data/vendor/assets/javascripts/luca.min.js +0 -5
  598. data/vendor/assets/javascripts/sinon.js +0 -3469
  599. data/vendor/assets/javascripts/underscore-min.js +0 -1
  600. data/vendor/assets/javascripts/underscore-string.min.js +0 -1
  601. data/vendor/assets/stylesheets/bootstrap-responsive.min.css +0 -9
  602. data/vendor/assets/stylesheets/bootstrap.min.css +0 -9
  603. data/vendor/assets/stylesheets/luca-components.css +0 -202
  604. data/vendor/assets/stylesheets/luca-development.css +0 -23
@@ -1,711 +0,0 @@
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
- # If you find yourself needing a container view with a complicated
132
- # visual layout, you can provide your own DOM template as a `@bodyTemplate`
133
- # and assign each child view in `@components` to its own specific CSS selector.
134
- #
135
- # ...
136
- # container.contains
137
- # role: "filter"
138
- # container: "#filter-wrapper-dom-selector"
139
- # ,
140
- # role: "results"
141
- # container: "#results-wrapper-dom-selector"
142
- # ...
143
- # container.defines
144
- # # assumes the template will provide the CSS selectors used above
145
- # bodyTemplate: "layouts/custom_template"
146
- container = Luca.register "Luca.Container"
147
-
148
- container.extends "Luca.Panel"
149
-
150
- container.triggers "before:components",
151
- "before:render:components",
152
- "before:layout",
153
- "after:components",
154
- "after:layout",
155
- "first:activation"
156
-
157
- container.replaces "Luca.Container"
158
-
159
- container.publicConfiguration
160
- # @components should contain a list of object configurations for child view(s)
161
- # of this container. The values specified in the configuration object will override the
162
- # values defined as properties and methods on your view prototypes.
163
- #
164
- # There are special properties you can define in your components configuration items
165
- # that will effect the container:
166
- #
167
- # - role: will create a camelized getter for you on the container. e.g. when role is `my_custom_role`,
168
- # the container will have a method `getMyCustomRole()` that returns that child view.
169
- #
170
- # - name: a name for the child view. this allows you to access the component by name using
171
- # the find() method on the container.
172
- #
173
- # - type: a type alias from the component registry. type alias are underscore'd strings
174
- # matching the component class name. e.g. App.views.MyCustomView type alias is `my_custom_view`
175
- #
176
- # - component: a convenience property for setting type, role, and name to be equal.
177
- components:[]
178
-
179
- # The `@defaults` property is an object of configuration parameters which will be set
180
- # on each child component. Values explicitly defines in the components config will
181
- # take precedence over the default.
182
- defaults: {}
183
-
184
- # The `@extensions` property is useful when you are subclassing a container view
185
- # which already defines an array of components, and you want to specifically override
186
- # properties and settings on the children. The `@extensions` property expects either:
187
- #
188
- # An object whose keys match the names of the `@role` property defined on the child components.
189
- # The value should be an object which will override any values defined on the parent class.
190
- #
191
- # or:
192
- #
193
- # An array of objects in the same array position / index as the target child view you wish to extend.
194
- extensions: {}
195
-
196
- # @componentEvents provides declarative syntax for responding to events on
197
- # the components in this container. the format of the syntax is very similar
198
- # to the other event binding helpers:
199
- #
200
- # `component_accessor component:trigger`
201
- #
202
- # where component_accessor is either the name of the component, or a the role
203
- # property on the component, component:trigger is the event that component fires.
204
- # handler is a method on the container which will respond to the child component event.
205
- # <pre>
206
- # myContainer = new Luca.Container
207
- # componentEvents:
208
- # "name component:trigger" : "handler"
209
- # "role component:trigger" : "handler"
210
- # "getter component:trigger" : "handler"
211
- # components:[
212
- # name: "name"
213
- # ]
214
- # </pre>
215
- componentEvents: {}
216
-
217
- container.privateConfiguration
218
- className: 'luca-ui-container'
219
-
220
- # This is a convenience attribute for identifying
221
- # views which are luca containers
222
- isContainer: true
223
-
224
- # if set to true, we will generate DOM elements
225
- # to wrap each of our components in. This should
226
- # generally be avoided IMO as it pollutes the DOM,
227
- # but is currently necessary for some container implementations
228
- generateComponentElements: false
229
-
230
- # if set to true, the DOM elements which wrap
231
- # our components will be emptied prior to rendering
232
- # the component inside this container.
233
- emptyContainerElements: false
234
-
235
- # if @generateComponentElements is true, which tag should this
236
- # container wrap our components in?
237
- componentTag: 'div'
238
-
239
- # if @generateComponentElements is true, which class should we
240
- # apply to the container elements which wrap our components?
241
- componentClass: 'luca-ui-panel'
242
-
243
- rendered: false
244
-
245
-
246
-
247
- container.privateMethods
248
- initialize: (@options={})->
249
- _.extend @, @options
250
-
251
- # aliases for the components property
252
- @components ||= @fields ||= @pages ||= @cards ||= @views
253
-
254
- # accept components as an array of strings representing
255
- # the luca component type
256
- for component in @components when _.isString(component)
257
- component = (type: component, role: component, name: component)
258
-
259
- _.bindAll(@, "beforeRender")
260
-
261
- @setupHooks( Luca.Container::hooks )
262
-
263
- validateContainerConfiguration(@)
264
-
265
- Luca.View::initialize.apply @, arguments
266
-
267
- # Removing a container will call remove on all of the nested components as well.
268
- remove: ()->
269
- Luca.View::remove.apply(@, arguments)
270
- @eachComponent (component)->
271
- component.remove?()
272
-
273
- beforeRender: ()->
274
- doLayout.call(@)
275
- doComponents.call(@)
276
- Luca.Panel::beforeRender?.apply(@, arguments)
277
-
278
- # Components which inherit from Luca.Container can implement
279
- # their own versions of this method, if they need to apply any sort
280
- # of additional styling / configuration for the DOM elements that
281
- # are created to wrap each container.
282
- customizeContainerEl: (containerEl, panel, panelIndex)->
283
- containerEl
284
-
285
- prepareLayout: ()->
286
- container = @
287
- @componentContainers = _( @components ).map (component, index)->
288
- applyDOMConfig.call(container, component, index)
289
-
290
- componentsWithClassBasedAssignment = @_().select (component)->
291
- _.isString(component.container) and component.container?.match(/^\./) and container.$( component.container ).length > 0
292
-
293
- # TEMP / HACK / Workaround
294
- #
295
- # Containers with components assigned to .class-based-containers
296
- # seem to get double rendered in the renderComponents() method.
297
- #
298
- # So here I am uniquely identifying the containers in a way that is not possible
299
- # in the templates ( since we want to be able to inherit templates and component assignments )
300
- if componentsWithClassBasedAssignment.length > 0
301
- for specialComponent in componentsWithClassBasedAssignment
302
- containerAssignment = _.uniqueId('container')
303
- targetEl = container.$( specialComponent.container )
304
- if targetEl.length > 0
305
- $(targetEl).attr('data-container-assignment', containerAssignment)
306
- specialComponent.container += "[data-container-assignment='#{ containerAssignment }']"
307
-
308
- prepareComponents: ()->
309
- container = @
310
-
311
- _( @components ).each (component, index)=>
312
- ce = componentContainerElement = @componentContainers?[index]
313
-
314
- # support a variety of the bad naming conventions
315
- ce.class = ce.class || ce.className || ce.classes
316
-
317
- if @generateComponentElements
318
- panel = @make(@componentTag, componentContainerElement, '')
319
- @$append( panel )
320
-
321
- # if the container defines a @defaults property
322
- # then we should make sure our child components inherit
323
- # these values unless specifically defined
324
- if container.defaults?
325
- component = _.defaults(component, (container.defaults || {}))
326
-
327
- # if the container defines an @extensions property as an array of
328
- # configuration objects, then we will extend the component config with
329
- # the object in the matching position of the @extensions array.
330
- if _.isArray(container.extensions) and _.isObject(container.extensions?[ index ])
331
- componentExtension = container.extensions[index]
332
- component = _.extend(component, componentExtension)
333
-
334
- # if the container defines an @extensions property as an object of nested hashes,
335
- # then extensions is a key/value pair whose key represents the role of the component
336
- # that we wish to extend / customize
337
- if component.role? and _.isObject(container.extensions) and _.isObject(container.extensions[component.role])
338
- componentExtension = container.extensions[component.role]
339
- component = _.extend(component, componentExtension)
340
-
341
- unless component.container?
342
- component.container = "##{ componentContainerElement.id }" if @generateComponentElements
343
- component.container ||= @$bodyEl()
344
-
345
- # create components is responsible for turning the JSON syntax of the
346
- # container's definition into live objects against a given Luca Component
347
- # type.
348
- #
349
- # In addition to this, a container builds an index of the components
350
- # which belong to it, so that they can easily be looked up by name
351
- createComponents: ()->
352
- return if @componentsCreated is true
353
-
354
- map = @componentIndex =
355
- name_index: {}
356
- cid_index: {}
357
- role_index: {}
358
-
359
- container = @
360
-
361
- @components = _( @components ).map (object, index)=>
362
-
363
- # you can include normal backbone views as components
364
- # you will want to make sure your render method handles
365
- # adding the views @$el to the appropriate @container.
366
-
367
- # you can also just pass a string representing the component_type
368
- component = if Luca.isComponent( object )
369
- object
370
- else
371
- # if a component is tagged with a @component property
372
- # we assume this is the kind of singleton component
373
- # and set the type, role and name to the same value (if they're blank)
374
- if object.component? and not (object.type || object.ctype)
375
- object.type = object.component
376
- object.name ||= object.component
377
- object.role ||= object.component
378
-
379
- object.type ||= object.ctype
380
-
381
- # guess the type based on the properties
382
- if !object.type?
383
- # TODO
384
- # Add support for all of the various components property aliases
385
- if object.components?
386
- object.type = object.ctype = 'container'
387
- else
388
- object.type = object.ctype = Luca.defaultComponentType
389
-
390
- object._parentCid ||= container.cid
391
- created = Luca.util.lazyComponent( object )
392
-
393
- # if we're using base backbone views, then they don't extend themselves
394
- # with their passed options, so this is a workaround to get them to
395
- # pick up the container config property
396
- if !component.container and component.options?.container
397
- component.container = component.options.container
398
-
399
- component.getParent ||= ()-> Luca( component._parentCid )
400
-
401
- if not component.container?
402
- console.log component,index,@
403
- console.error "could not assign container property to component on container #{ @name || @cid }"
404
-
405
- indexComponent( component ).at(index).in( @componentIndex )
406
-
407
- component
408
-
409
- @componentsCreated = true
410
-
411
- map
412
-
413
- # Trigger the Rendering Pipeline process on all of the nested components
414
- renderComponents: (@debugMode="")->
415
- @debug "container render components"
416
-
417
- container = @
418
-
419
- _(@components).each (component)->
420
- try
421
- component.trigger "before:attach"
422
-
423
- containerElement = container.$(component.container)
424
-
425
- if containerElement.length is 0
426
- if _.isString( component.container )
427
- # the container trying to assign this component to is not in the dom
428
- 1
429
-
430
- # try in the window context. this is almost always certainly a bug
431
- # so look into wtf is going on and which components are problematic
432
- containerElement = @$( component.container ).eq(0) if containerElement.length is 0
433
-
434
- if @emptyContainerElements is true
435
- containerElement.empty()
436
-
437
- containerElement.append( component.el )
438
-
439
- component.trigger "after:attach"
440
- component.render()
441
- component.rendered = true
442
- catch e
443
- console.log "Error Rendering Component #{ component.name || component.cid }", component
444
-
445
- if _.isObject(e)
446
- console.log e.message
447
- console.log e.stack
448
-
449
- throw e unless Luca.silenceRenderErrors? is true
450
-
451
- # When a container is first activated is a good time to perform
452
- # operations which are not needed unless that component becomes
453
- # visible. This first activation event should be relayed to all
454
- # of the nested components. Components which hide / display
455
- # other components, such as a CardView or TabContainer
456
- # will trigger first:activation on the components as they become
457
- # displayed.
458
- firstActivation: ()->
459
- activator = @
460
- @each (component, index)->
461
- # apply the first:activation trigger on the component, in the context of the component
462
- # passing as arguments the component itself, and the component doing the activation
463
- unless component?.previously_activated is true
464
- component?.trigger?.call component, "first:activation", component, activator
465
- component.previously_activated = true
466
-
467
- registerComponentEvents: (eventList, direction="on")->
468
- container = @
469
-
470
- for listener, handler of (eventList || @componentEvents||{})
471
- [componentNameOrRole,eventId] = listener.split(' ')
472
-
473
- unless _.isFunction( @[handler] )
474
- console.log "Error registering component event", listener, componentNameOrRole, eventId
475
- throw "Invalid component event definition #{ listener }. Specified handler is not a method on the container"
476
-
477
- if componentNameOrRole is "*"
478
- @eachComponent (component)=> component.on(eventId, @[handler], container)
479
- else
480
- component = @findComponentForEventBinding( componentNameOrRole )
481
-
482
- unless component? and Luca.isComponent(component)
483
- console.log "Error registering component event", listener, componentNameOrRole, eventId
484
- throw "Invalid component event definition: #{ componentNameOrRole }"
485
-
486
- component[direction](eventId, @[handler], container)
487
-
488
- container.publicMethods
489
- # Returns an underscore.js object that wraps the components array
490
- _: ()-> _( @components )
491
-
492
- # Return the value of attribute of each component
493
- pluck: (attribute)->
494
- @_().pluck(attribute)
495
-
496
- # Invoke the passed method name on each component
497
- invoke: (method)->
498
- @_().invoke(method)
499
-
500
- # Select any component for which the passed iterator returns true
501
- select: (iterator)->
502
- @_().select(iterator)
503
-
504
- # Find the first matching component for which the passed iterator returns true
505
- detect: (iterator)->
506
- @_().detect(iterator)
507
-
508
- # Return a list of components without the components for which the passed iterator returns true
509
- reject: (iterator)->
510
- @_().reject(iterator)
511
-
512
- # Run the passed iterator over each component and return the result in an array
513
- map: (fn)->
514
- @_().map(fn)
515
-
516
- # Returns a list of nested components which are also containers
517
- subContainers: ()->
518
- @select (component)->
519
- component.isContainer is true
520
-
521
- roles: ()->
522
- _( @allChildren() ).chain().pluck('role').compact().value()
523
-
524
- allChildren: ()->
525
- children = @components
526
-
527
- grandchildren = _( @subContainers() ).map (component)->
528
- component?.allChildren?()
529
-
530
- _([children,grandchildren]).chain().compact().flatten().value()
531
-
532
- # Find a direct component on this card by its name.
533
- find: (name)->
534
- _( @components ).detect (c)->
535
- c.name is name
536
-
537
- findComponentForEventBinding: (nameRoleOrGetter, deep=true)->
538
- @findComponentByName(nameRoleOrGetter, deep) || @findComponentByGetter( nameRoleOrGetter, deep ) || @findComponentByRole( nameRoleOrGetter, deep )
539
-
540
- findComponentByGetter: (getter, deep=false)->
541
- _( @allChildren() ).detect (component)->
542
- component?.getter is getter
543
-
544
- findComponentByRole: (role,deep=false)->
545
- _( @allChildren() ).detect (component)->
546
- component?.role is role or component?.type is role or component?.ctype is role
547
-
548
- findComponentByType: (desired,deep=false)->
549
- _( @allChildren() ).detect (component)->
550
- desired is (component.type || component.ctype)
551
-
552
- findComponentByName: (name, deep=false)->
553
- _( @allChildren() ).detect (component)->
554
- component.name is name
555
-
556
- findComponentById: (id, deep=false)->
557
- @findComponent(id, "cid_index", deep)
558
-
559
- findComponent: (needle, haystack="name", deep=false)->
560
- @createComponents() unless @componentsCreated is true
561
-
562
- position = @componentIndex?[ haystack ][ needle ]
563
- component = @components[ position ]
564
-
565
- return component if component
566
-
567
- if deep is true
568
- sub_container = _( @components ).detect (component)->
569
- component?.findComponent?(needle, haystack, true)
570
-
571
- sub_container?.findComponent?(needle, haystack, true)
572
-
573
- each: (fn)->
574
- @eachComponent(fn, false)
575
-
576
- # run a function for each component in this container
577
- # and any nested containers in those components, recursively
578
- # pass false as the second argument to skip the deep recursion
579
- eachComponent: (fn, deep=true)->
580
- _( @components ).each (component, index)=>
581
- fn.call component, component, index
582
- component?.eachComponent?.apply component, [fn,deep] if deep
583
-
584
- indexOfComponentName: (name)->
585
- names = _( @components ).pluck('name')
586
- _( names ).indexOf(name)
587
-
588
- indexOf: (nameOrComponent)->
589
- if _.isString(nameOrComponent)
590
- return @indexOfComponentName(nameOrComponent)
591
-
592
- if _.isObject(nameOrComponent)
593
- _( @components ).indexOf( nameOrComponent )
594
-
595
- activeComponent: ()->
596
- return @ unless @activeItem
597
- return @components[ @activeItem ]
598
-
599
- componentElements: ()->
600
- @$("[data-luca-parent='#{ @name || @cid }']")
601
-
602
- getComponent: (needle)->
603
- @components[ needle ]
604
-
605
- isRootComponent:()->
606
- @rootComponent is true || !@getParent?
607
-
608
- getRootComponent: ()->
609
- if @isRootComponent() then @ else @getParent().getRootComponent()
610
-
611
-
612
- selectByAttribute: (attribute, value=undefined, deep=false)->
613
- components = _( @components ).map (component)->
614
- matches = []
615
- test = component[ attribute ]
616
-
617
- matches.push( component ) if test is value or (not value? and test?)
618
-
619
- # recursively traverse our components
620
- matches.push component.selectByAttribute?(attribute, value, true) if deep is true
621
-
622
- _.compact matches
623
-
624
- _.flatten( components )
625
-
626
-
627
- container.register()
628
-
629
- # This is the method by which a container injects the rendered child views
630
- # into the DOM. It will get passed the container object, and the component
631
- # that is being rendered.
632
- Luca.Container.componentRenderer = (container, component)->
633
- attachMethod = $( component.container )[ component.attachWith || "append" ]
634
- attachMethod( component.render().el )
635
-
636
-
637
- #### Private Helpers
638
-
639
- doLayout = ()->
640
- @trigger "before:layout", @
641
- @prepareLayout()
642
- @trigger "after:layout", @
643
-
644
- applyDOMConfig = (panel, panelIndex)->
645
- style_declarations = []
646
-
647
- style_declarations.push "height: #{ (if _.isNumber(panel.height) then panel.height + 'px' else panel.height ) }" if panel.height?
648
- style_declarations.push "width: #{ (if _.isNumber(panel.width) then panel.width + 'px' else panel.width ) }" if panel.width?
649
- style_declarations.push "float: #{ panel.float }" if panel.float
650
-
651
- config =
652
- class: panel?.classes || @componentClass
653
- id: "#{ @cid }-#{ panelIndex }"
654
- style: style_declarations.join(';')
655
- "data-luca-parent" : @name || @cid
656
-
657
- if @customizeContainerEl?
658
- config = @customizeContainerEl( config, panel, panelIndex )
659
-
660
- config
661
-
662
-
663
-
664
- createGetterMethods = ()->
665
- container = @
666
-
667
- childrenWithGetter = _( @allChildren() ).select (component)->
668
- component?.getter?
669
-
670
- _( childrenWithGetter ).each (component)->
671
- container[ component.getter ] ||= ()-> component
672
-
673
- createMethodsToGetComponentsByRole = ()->
674
- container = @
675
-
676
- childrenWithRole = _( @allChildren() ).select (component)->
677
- component?.role?
678
-
679
- _( childrenWithRole ).each (component)->
680
- getter = _.str.camelize( "get_" + component.role )
681
- getterFn = ()-> component
682
- container[ getter ] ||= _.bind(getterFn, container)
683
-
684
- doComponents = ()->
685
- @trigger "before:components", @, @components
686
- @prepareComponents()
687
- @trigger "before:create:components", @, @components
688
- @createComponents()
689
- @trigger "before:render:components", @, @components
690
- @renderComponents()
691
- @trigger "after:components", @, @components
692
-
693
- unless @skipGetterMethods is true
694
- createGetterMethods.call(@)
695
- createMethodsToGetComponentsByRole.call(@)
696
-
697
- @registerComponentEvents()
698
-
699
- validateContainerConfiguration = ()->
700
- true
701
-
702
- # indexComponent( component ).at( index ).in( componentsInternalIndexMap )
703
- indexComponent = (component)->
704
- at: (index)->
705
- in: (map)->
706
- if component.cid?
707
- map.cid_index[ component.cid ] = index
708
- if component.role?
709
- map.role_index[ component.role ] = index
710
- if component.name?
711
- map.name_index[ component.name ] = index