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,18 +1,13 @@
1
- collection = Luca.register 'Luca.Collection'
2
- collection.extends 'Backbone.QueryCollection'
3
- collection.includes 'Luca.Events'
1
+ source = 'Backbone.Collection'
2
+ source = 'Backbone.QueryCollection' if Backbone.QueryCollection?
4
3
 
5
- collection.triggers "after:initialize",
6
- "before:fetch",
7
- "after:response"
8
-
9
- collection.publicConfiguration
10
- model: Luca.Model
4
+ _.def("Luca.Collection").extends( source ).with
5
+ include: ['Luca.Events']
11
6
  # cachedMethods refers to a list of methods on the collection
12
7
  # whose value gets cached once it is ran. the collection then
13
8
  # binds to change, add, remove, and reset events and then expires
14
9
  # the cached value once these events are fired.
15
- #
10
+
16
11
  # cachedMethods expects an array of strings representing the method name
17
12
  # or objects containing @method and @resetEvents properties. by default
18
13
  # @resetEvents are 'add','remove',reset' and 'change'.
@@ -22,19 +17,9 @@ collection.publicConfiguration
22
17
  # and return the filtered results that way, then set this to true
23
18
  remoteFilter: false
24
19
 
25
- # setting a cache key to a string, or to a function which returns
26
- # a string, will determine where the collections' models are pulled
27
- # from if they are available on page load. also known as "bootstrapping"
28
- # your collections with data. The cache key will look in whatever object
29
- # is set in Luca.config.modelBootstrap for its models.
30
- cache_key: undefined
31
-
32
- # Which CollectionManager should we register with? Expects either a string
33
- # which will get resolved into a global variable, or a
34
- manager: undefined
35
-
36
20
  initialize: (models=[], @options)->
37
21
  _.extend @, @options
22
+ @setupMethodCaching()
38
23
  @_reset()
39
24
 
40
25
  # By specifying a @cache_key property or method, you can instruct
@@ -46,7 +31,7 @@ collection.publicConfiguration
46
31
  console.log 'The @cached property of Luca.Collection is being deprecated. Please change to cache_key'
47
32
 
48
33
  if @cache_key ||= @cached
49
- @bootstrap_cache_key = Luca.util.read(@cache_key)
34
+ @bootstrap_cache_key = if _.isFunction( @cache_key ) then @cache_key() else @cache_key
50
35
 
51
36
  if @registerAs or @registerWith
52
37
  console.log "This configuration API is deprecated. use @name and @manager properties instead"
@@ -55,7 +40,7 @@ collection.publicConfiguration
55
40
  @name ||= @registerAs
56
41
  @manager ||= @registerWith
57
42
 
58
- @manager = Luca.util.read(@manager) if @manager?
43
+ @manager = if _.isFunction(@manager) then @manager() else @manager
59
44
 
60
45
  # if they specify a
61
46
  if @name and not @manager
@@ -67,8 +52,8 @@ collection.publicConfiguration
67
52
  # to be scoped with some sort of unique id, as say some sort of belongsTo relationship
68
53
  # then you can specify @registerAs as a method()
69
54
  if @manager
70
- @name ||= Luca.util.read(@cache_key)
71
- @name = Luca.util.read(@name)
55
+ @name ||= @cache_key()
56
+ @name = if _.isFunction( @name ) then @name() else @name
72
57
 
73
58
  unless @private or @anonymous
74
59
  @bind "after:initialize", ()=>
@@ -79,7 +64,7 @@ collection.publicConfiguration
79
64
  # locally in localStorage
80
65
  if @useLocalStorage is true and window.localStorage?
81
66
  table = @bootstrap_cache_key || @name
82
- throw "Must specify a cache_key property or method to use localStorage"
67
+ throw "Must specify either a cached or registerAs property to use localStorage"
83
68
  @localStorage = new Luca.LocalStore( table )
84
69
 
85
70
  # Populating a collection with local data
@@ -100,11 +85,6 @@ collection.publicConfiguration
100
85
  if models
101
86
  @reset models, silent: true, parse: options?.parse
102
87
 
103
- Luca.concern.setup.call(@)
104
- Luca.util.setupHooks.call(@, @hooks)
105
-
106
- @setupMethodCaching()
107
-
108
88
  @trigger "after:initialize"
109
89
 
110
90
  # Luca.Collections will append a query string to the URL
@@ -153,43 +133,43 @@ collection.publicConfiguration
153
133
  @
154
134
 
155
135
  applyFilter: (filter={}, options={})->
156
- options = _( options ).clone()
157
-
158
136
  if options.remote? is true or @remoteFilter is true
159
137
  @applyParams(filter)
160
- @fetch _.extend(options,refresh:true,remote:true)
138
+ @fetch _.extend(options,refresh:true)
161
139
  else
162
- @reset @query(filter, options)
140
+ @reset @query filter
163
141
 
164
142
  # You can apply params to a collection, so that any upcoming requests
165
143
  # made to the REST API are made with the key values specified
166
144
  applyParams: (params)->
167
- @base_params = _( Luca.Collection.baseParams() ).clone() || {}
145
+ @base_params = _( Luca.Collection.baseParams() ).clone()
168
146
  _.extend @base_params, params
169
147
 
170
148
  @
171
149
 
172
- register: (collectionManager, key="", collection)->
173
- collectionManager ||= Luca.CollectionManager.get()
174
-
175
- unless key.length >= 1
176
- throw "Attempt to register a collection without specifying a key."
177
-
150
+ # If this collection is to be registered with some global collection
151
+ # tracker such as new Luca.CollectionManager() then we will register
152
+ # ourselves automatically
153
+ #
154
+ # To automatically register a collection with the registry, instantiate
155
+ # it with the registerWith property, which can either be a reference to
156
+ # the manager itself, or a string in case the manager isn't available
157
+ # at compile time
158
+ register: (collectionManager=Luca.CollectionManager.get(), key="", collection)->
159
+ throw "Can not register with a collection manager without a key" unless key.length >= 1
160
+ throw "Can not register with a collection manager without a valid collection manager" unless collectionManager?
178
161
 
179
162
  # by passing a string instead of a reference to an object, we can look up
180
163
  # that object only when necessary. this prevents us from having to create
181
164
  # the manager instance before we can define our collections
182
165
  if _.isString( collectionManager )
183
- collectionManager = Luca.util.resolve( collectionManager )
166
+ collectionManager = Luca.util.nestedValue( collectionManager, (window || global) )
184
167
 
185
- unless collectionManager?
186
- throw "Attempt to register with a non existent collection manager."
168
+ throw "Could not register with collection manager" unless collectionManager
187
169
 
188
170
  if _.isFunction( collectionManager.add )
189
171
  return collectionManager.add(key, collection)
190
172
 
191
- # If we don't want to use the CollectionManager class, and just want
192
- # to cache collection instances on an object, we can do that too.
193
173
  if _.isObject( collectionManager )
194
174
  collectionManager[ key ] = collection
195
175
 
@@ -225,7 +205,7 @@ collection.publicConfiguration
225
205
  # fetch will try to pull from the bootstrap if it is setup to do so
226
206
  # you can actually make the roundtrip to the server anyway if you pass
227
207
  # refresh = true in the options hash
228
- return @bootstrap() if @cached_models().length and not (options.refresh is true or options.remote is true)
208
+ return @bootstrap() if @cached_models().length and not options.refresh
229
209
 
230
210
  url = if _.isFunction(@url) then @url() else @url
231
211
 
@@ -244,11 +224,10 @@ collection.publicConfiguration
244
224
  # reset trigger with a function wrapped in _.once
245
225
  # so that it only gets run...ahem...once.
246
226
  #
227
+ # that being said, if the collection already has models
247
228
  # it won't even bother fetching it it will just run
248
229
  # as if reset was already triggered
249
- onceLoaded: (fn, options={})->
250
- _.defaults(options, autoFetch: true)
251
-
230
+ onceLoaded: (fn, options={autoFetch:true})->
252
231
  if @length > 0 and not @fetching
253
232
  fn.apply @, [@]
254
233
  return
@@ -259,7 +238,7 @@ collection.publicConfiguration
259
238
  wrapped()
260
239
  @unbind "reset", @
261
240
 
262
- unless @fetching or not !!options.autoFetch
241
+ unless @fetching or not options.autoFetch
263
242
  @fetch()
264
243
 
265
244
  # ifLoaded is equivalent to binding to the reset trigger with
@@ -277,6 +256,17 @@ collection.publicConfiguration
277
256
  unless @fetching is true or !options.autoFetch or @length > 0
278
257
  @fetch()
279
258
 
259
+ # parse is very close to the stock Backbone.Collection parse, which
260
+ # just returns the response. However, it also triggers a callback
261
+ # after:response, and automatically parses responses which contain
262
+ # a JSON root like you would see in rails, if you specify the @root
263
+ # property.
264
+ #
265
+ # it will also update the Luca.Collection.cache with the models from
266
+ # the response, so that any subsequent calls to fetch() on a bootstrapped
267
+ # collection, will have updated models from the server. Really only
268
+ # useful if you call fetch(refresh:true) manually on any bootstrapped
269
+ # collection
280
270
  parse: (response)->
281
271
  @fetching = false
282
272
  @trigger "after:response", response
@@ -306,8 +296,6 @@ collection.publicConfiguration
306
296
  @clearMethodCache(name)
307
297
 
308
298
  setupMethodCaching: ()->
309
- return unless @cachedMethods?.length > 0
310
-
311
299
  collection = @
312
300
  membershipEvents = ["reset","add","remove"]
313
301
  cache = @_methodCache = {}
@@ -322,7 +310,7 @@ collection.publicConfiguration
322
310
 
323
311
  # wrap the collection method with a basic memoize operation
324
312
  collection[ method ] = ()->
325
- cache[method].value ||= cache[method].original.apply(collection, arguments)
313
+ cache[method].value ||= cache[method].original.apply collection, arguments
326
314
 
327
315
  # bind to events on the collection, which once triggered, will
328
316
  # invalidate the cached value. causing us to have to restore it
@@ -333,33 +321,19 @@ collection.publicConfiguration
333
321
  dependencies = method.split(':')[1]
334
322
 
335
323
  if dependencies
336
- watchForChangesOn = dependencies.split(",")
337
-
338
- _( watchForChangesOn ).each (dependency)->
324
+ for dependency in dependencies.split(",")
339
325
  collection.bind "change:#{dependency}", ()->
340
326
  collection.clearMethodCache(method: method)
341
327
 
342
-
343
328
  # make sure the querying interface from backbone.query is present
344
329
  # in the case backbone-query isn't loaded. without it, it will
345
330
  # just return the models
346
- #
347
- # TODO:
348
- #
349
- # Currently the View mixins: Filterable, Sortable, and Paginatable
350
- # implement a lot of logic that belongs in this interface.
351
331
  query: (filter={},options={})->
352
332
  if Backbone.QueryCollection?
353
- if _.isFunction(prepare = options.prepare || @prepareQuery)
354
- filter = prepare(filter)
355
-
356
- return Backbone.QueryCollection::query.call(@, filter, options)
333
+ return Backbone.QueryCollection::query.apply(@, arguments)
357
334
  else
358
335
  @models
359
336
 
360
- collection.register()
361
-
362
-
363
337
  # Global Collection Observer
364
338
  _.extend Luca.Collection.prototype,
365
339
  trigger: ()->
@@ -369,38 +343,18 @@ _.extend Luca.Collection.prototype,
369
343
 
370
344
  Backbone.View.prototype.trigger.apply @, arguments
371
345
 
372
- Luca.Collection._originalExtend = Backbone.Collection.extend
373
-
374
- Luca.Collection.extend = (definition={})->
375
- # for backward compatibility
376
- definition.concerns ||= definition.concerns if definition.concerns?
377
-
378
- componentClass = Luca.Collection._originalExtend.call(@, definition)
379
-
380
- if definition.concerns? and _.isArray( definition.concerns )
381
- for module in definition.concerns
382
- Luca.decorate( componentClass ).with( module )
383
-
384
- componentClass
385
-
386
- Luca.Collection.namespace = (namespace)->
387
- namespace = Luca.util.resolve(namespace) if _.isString(namespace)
388
- Luca.Collection.__defaultNamespace = namespace if namespace?
389
- Luca.Collection.__defaultNamespace ||= (window || global)
390
- Luca.util.read( Luca.Collection.__defaultNamespace )
391
-
392
346
  # Always include these parameters in every request to your REST API.
393
347
  #
394
348
  # either specify a function which returns a hash, or just a normal hash
395
349
  Luca.Collection.baseParams = (obj)->
396
- obj = Luca.util.resolve(obj) if _.isString(obj)
397
- Luca.Collection._baseParams = obj if obj
350
+ return Luca.Collection._baseParams = obj if obj
351
+
352
+ if _.isFunction( Luca.Collection._baseParams )
353
+ return Luca.Collection._baseParams()
398
354
 
399
- Luca.util.read( Luca.Collection._baseParams )
355
+ if _.isObject( Luca.Collection._baseParams )
356
+ Luca.Collection._baseParams
400
357
 
401
- Luca.Collection.resetBaseParams = ()->
402
- Luca.Collection._baseParams = {}
403
-
404
358
  # In order to make our Backbone Apps super fast it is a good practice
405
359
  # to pre-populate your collections by what is referred to as bootstrapping
406
360
  #
@@ -0,0 +1,374 @@
1
+ # The Component Container
2
+ #
3
+ # The Component Container is a nestable component
4
+ # which are responsible for handling communication between multiple
5
+ # nested views.
6
+ #
7
+ # One: Layout
8
+ #
9
+ # a container is responsible for laying out the nested views
10
+ # and rendering them in a special DOM element
11
+ doLayout = ()->
12
+ @trigger "before:layout", @
13
+ @prepareLayout()
14
+ @trigger "after:layout", @
15
+
16
+ # and displaying those elements in a way that is
17
+ # optimal for the desired user experience of that view
18
+ # ( i.e seeing only one of them at a time, seeing them side by side )
19
+ applyDOMConfig = (panel, panelIndex)->
20
+ style_declarations = []
21
+
22
+ style_declarations.push "height: #{ (if _.isNumber(panel.height) then panel.height + 'px' else panel.height ) }" if panel.height?
23
+ style_declarations.push "width: #{ (if _.isNumber(panel.width) then panel.width + 'px' else panel.width ) }" if panel.width?
24
+ style_declarations.push "float: #{ panel.float }" if panel.float
25
+
26
+ config =
27
+ class: panel?.classes || @componentClass
28
+ id: "#{ @cid }-#{ panelIndex }"
29
+ style: style_declarations.join(';')
30
+ "data-luca-owner" : @name || @cid
31
+
32
+ if @customizeContainerEl?
33
+ config = @customizeContainerEl( config, panel, panelIndex )
34
+
35
+ config
36
+
37
+ # Two: Component Creation
38
+ #
39
+ # A container is responsible for creating and storing references to the nested
40
+ # views that are required for its functioning.
41
+ doComponents = ()->
42
+
43
+ @trigger "before:components", @, @components
44
+ @prepareComponents()
45
+ @createComponents()
46
+ @trigger "before:render:components", @, @components
47
+ @renderComponents()
48
+ @trigger "after:components", @, @components
49
+
50
+
51
+ # Containers are central to Luca. They are what make it easy to structure
52
+ # your application in a logical way and to specify much of the behavior of
53
+ # complex / composite views at define time using JSON syntax combined with
54
+ # the meta data contained in the Luca component registry.
55
+ _.def('Luca.core.Container').extends('Luca.components.Panel').with
56
+
57
+ className: 'luca-ui-container'
58
+
59
+ componentTag: 'div'
60
+ componentClass: 'luca-ui-panel'
61
+
62
+ isContainer: true
63
+
64
+ hooks:[
65
+ "before:components"
66
+ "before:render:components"
67
+ "before:layout"
68
+ "after:components"
69
+ "after:layout"
70
+ "first:activation"
71
+ ]
72
+
73
+ rendered: false
74
+
75
+ components: []
76
+
77
+ initialize: (@options={})->
78
+ _.extend @, @options
79
+
80
+ @setupHooks [
81
+ "before:components"
82
+ "before:render:components"
83
+ "before:layout"
84
+ "after:components"
85
+ "after:layout"
86
+ "first:activation"
87
+ ]
88
+
89
+ Luca.View::initialize.apply @, arguments
90
+
91
+ # Rendering Pipeline
92
+ #
93
+ # A container has nested components. these components
94
+ # are automatically rendered inside their own DOM element
95
+ # and then CSS configuration is generally applied to these
96
+ # DOM elements. Each component is assigned to this DOM
97
+ # element by specifying a @container property on the component.
98
+ #
99
+ # Each component is instantiated by looking up its @ctype propery
100
+ # in the Luca Component Registry. Then the components are rendered
101
+ # by having their @render() method called on them.
102
+ #
103
+ # Any class which extends Luca.View will have its defined render method
104
+ # wrapped in a method which triggers "before:render", and "after:render"
105
+ # before and after the defined render method.
106
+ #
107
+ # so you can expect the following, for any container or nested container
108
+ #
109
+ # DOM Element Manipulation:
110
+ #
111
+ # beforeRender()
112
+ # beforeLayout()
113
+ # prepareLayout()
114
+ # afterLayout()
115
+ #
116
+ # Luca / Backbone Component Manipulation
117
+ #
118
+ # beforeComponents()
119
+ # prepareComponents()
120
+ # createComponents()
121
+ # beforeRenderComponents()
122
+ # renderComponents() ->
123
+ # calls render() on each component, starting this whole cycle
124
+ #
125
+ # afterComponents()
126
+ #
127
+ # DOM Injection
128
+ #
129
+ # render()
130
+ # afterRender()
131
+ #
132
+ # For Components which are originally hidden
133
+ # ( card view, tab view, etc )
134
+ #
135
+ # firstActivation()
136
+ #
137
+ beforeRender: ()->
138
+ doLayout.call(@)
139
+ doComponents.call(@)
140
+ Luca.components.Panel::beforeRender?.apply(@, arguments)
141
+
142
+ # Components which inherit from Luca.core.Container can implement
143
+ # their own versions of this method, if they need to apply any sort
144
+ # of additional styling / configuration for the DOM elements that
145
+ # are created to wrap each container.
146
+ customizeContainerEl: (containerEl, panel, panelIndex)->
147
+ containerEl
148
+
149
+ prepareLayout: ()->
150
+ container = @
151
+ @componentContainers = _( @components ).map (component, index)->
152
+ applyDOMConfig.call(container, component, index)
153
+
154
+ prepareComponents: ()->
155
+ # accept components as an array of strings representing
156
+ # the luca component type
157
+ for component in @components when _.isString(component)
158
+ component = (type: component)
159
+
160
+ _( @components ).each (component, index)=>
161
+ ce = componentContainerElement = @componentContainers?[index]
162
+
163
+ # support a variety of the bad naming conventions
164
+ ce.class = ce.class || ce.className || ce.classes
165
+
166
+ if @generateComponentElements
167
+ panel = @make(@componentTag, componentContainerElement, '')
168
+ @$append( panel )
169
+
170
+ unless component.container?
171
+ component.container = "##{ componentContainerElement.id }" if @generateComponentElements
172
+ component.container ||= @$bodyEl()
173
+
174
+ # create components is responsible for turning the JSON syntax of the
175
+ # container's definition into live objects against a given Luca Component
176
+ # type.
177
+ #
178
+ # In addition to this, a container builds an index of the components
179
+ # which belong to it, so that they can easily be looked up by name
180
+ createComponents: ()->
181
+ return if @componentsCreated is true
182
+
183
+ map = @componentIndex =
184
+ name_index: {}
185
+ cid_index: {}
186
+
187
+ @components = _( @components ).map (object, index)=>
188
+
189
+ # you can include normal backbone views as components
190
+ # you will want to make sure your render method handles
191
+ # adding the views @$el to the appropriate @container.
192
+
193
+ # you can also just pass a string representing the component_type
194
+ component = if Luca.isBackboneView( object )
195
+ object
196
+ else
197
+ object.type ||= object.ctype
198
+
199
+ if !object.type?
200
+ if object.components?
201
+ object.type = object.ctype = 'container'
202
+ else
203
+ object.type = object.ctype = Luca.defaultComponentType
204
+
205
+ Luca.util.lazyComponent( object )
206
+
207
+ # if you define a @getter property as a string on your component
208
+ # we will create a function with that name on this container that
209
+ # allows you to access this component
210
+ if _.isString( component.getter )
211
+ @[ component.getter ] = (()-> component)
212
+
213
+ # if we're using base backbone views, then they don't extend themselves
214
+ # with their passed options, so this is a workaround to get them to
215
+ # pick up the container config property
216
+ if !component.container and component.options.container
217
+ component.container = component.options.container
218
+
219
+ if map and component.cid?
220
+ map.cid_index[ component.cid ] = index
221
+
222
+ if map and component.name?
223
+ map.name_index[ component.name ] = index
224
+
225
+ component
226
+
227
+ @componentsCreated = true
228
+
229
+ @registerComponentEvents() unless _.isEmpty(@componentEvents)
230
+
231
+ map
232
+
233
+ # Trigger the Rendering Pipeline process on all of the nested
234
+ # components
235
+ renderComponents: (@debugMode="")->
236
+ @debug "container render components"
237
+
238
+ container = @
239
+ _(@components).each (component)->
240
+ component.getParent = ()->
241
+ container
242
+
243
+ try
244
+ $( component.container ).append( component.el )
245
+ component.render()
246
+ catch e
247
+ console.log "Error Rendering Component #{ component.name || component.cid }", component
248
+
249
+ if _.isObject(e)
250
+ console.log e.message
251
+ console.log e.stack
252
+
253
+ throw e unless Luca.silenceRenderErrors? is true
254
+
255
+ #### Container Activation
256
+ #
257
+ # When a container is first activated is a good time to perform
258
+ # operations which are not needed unless that component becomes
259
+ # visible. This first activation event should be relayed to all
260
+ # of the nested components. Components which hide / display
261
+ # other components, such as a CardView or TabContainer
262
+ # will trigger first:activation on the components as they become
263
+ # displayed.
264
+ firstActivation: ()->
265
+ activator = @
266
+ @each (component, index)->
267
+ # apply the first:activation trigger on the component, in the context of the component
268
+ # passing as arguments the component itself, and the component doing the activation
269
+ unless component?.previously_activated is true
270
+ component?.trigger?.call component, "first:activation", component, activator
271
+ component.previously_activated = true
272
+
273
+ #### Underscore Methods For Working with Components
274
+ pluck: (attribute)->
275
+ _( @components ).pluck attribute
276
+
277
+ invoke: (method)->
278
+ _( @components ).invoke method
279
+
280
+ map: (fn)->
281
+ _( @components ).map(fn)
282
+
283
+ # event binding sugar for nested components
284
+ #
285
+ # you can define events like:
286
+
287
+ # _.def("MyContainer").extends("Luca.View").with
288
+ # componentEvents:
289
+ # "component_name before:load" : "mySpecialHandler"
290
+ componentEvents: {}
291
+
292
+ registerComponentEvents: ()->
293
+ for listener, handler of @componentEvents
294
+ [componentName,trigger] = listener.split(' ')
295
+ component = @findComponentByName(componentName)
296
+ component?.bind trigger, @[handler]
297
+
298
+ findComponentByName: (name, deep=false)->
299
+ @findComponent(name, "name_index", deep)
300
+
301
+ findComponentById: (id, deep=false)->
302
+ @findComponent(id, "cid_index", deep)
303
+
304
+ findComponent: (needle, haystack="name", deep=false)->
305
+ @createComponents() unless @componentsCreated is true
306
+
307
+ position = @componentIndex?[ haystack ][ needle ]
308
+ component = @components?[ position ]
309
+
310
+ return component if component
311
+
312
+ if deep is true
313
+ sub_container = _( @components ).detect (component)-> component?.findComponent?(needle, haystack, true)
314
+ sub_container?.findComponent?(needle, haystack, true)
315
+
316
+ each: (fn)->
317
+ @eachComponent(fn, false)
318
+
319
+ # run a function for each component in this container
320
+ # and any nested containers in those components, recursively
321
+ # pass false as the second argument to skip the deep recursion
322
+ eachComponent: (fn, deep=true)->
323
+ _( @components ).each (component, index)=>
324
+ fn.call component, component, index
325
+ component?.eachComponent?.apply component, [fn,deep] if deep
326
+
327
+ indexOf: (name)->
328
+ names = _( @components ).pluck('name')
329
+ _( names ).indexOf(name)
330
+
331
+ activeComponent: ()->
332
+ return @ unless @activeItem
333
+ return @components[ @activeItem ]
334
+
335
+ componentElements: ()->
336
+ @$(">.#{ @componentClass }", @$bodyEl())
337
+
338
+ getComponent: (needle)->
339
+ @components[ needle ]
340
+
341
+ rootComponent: ()->
342
+ console.log "Calling rootComponent will be deprecated. use isRootComponent instead"
343
+ !@getParent?
344
+
345
+ isRootComponent:()->
346
+ !@getParent?
347
+
348
+ getRootComponent: ()->
349
+ if @rootComponent() then @ else @getParent().getRootComponent()
350
+
351
+ selectByAttribute: (attribute, value, deep=false)->
352
+ components = _( @components ).map (component)->
353
+ matches = []
354
+ test = component[ attribute ]
355
+
356
+ matches.push( component ) if test is value
357
+
358
+ # recursively traverse our components
359
+ matches.push component.selectByAttribute?(attribute, value, true) if deep is true
360
+
361
+ _.compact matches
362
+
363
+ _.flatten( components )
364
+
365
+ select: (attribute, value, deep=false)->
366
+ console.log "Container.select will be replaced by selectByAttribute in 1.0"
367
+ Luca.core.Container::selectByAttribute.apply(@, arguments)
368
+
369
+ # This is the method by which a container injects the rendered child views
370
+ # into the DOM. It will get passed the container object, and the component
371
+ # that is being rendered.
372
+ Luca.core.Container.componentRenderer = (container, component)->
373
+ attachMethod = $( component.container )[ component.attachWith || "append" ]
374
+ attachMethod( component.render().el )