luca 0.9.8 → 0.9.9
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.
- data/CHANGELOG +49 -0
- data/Gemfile +8 -1
- data/Gemfile.lock +97 -53
- data/Guardfile +3 -25
- data/README.md +5 -16
- data/ROADMAP +15 -9
- data/Rakefile +24 -75
- data/app.rb +10 -42
- data/app/assets/javascripts/luca/basic.coffee +1 -1
- data/app/assets/javascripts/luca/components/application.coffee +187 -104
- data/app/assets/javascripts/luca/components/collection_view.coffee +115 -51
- data/app/assets/javascripts/luca/components/controller.coffee +87 -10
- data/app/assets/javascripts/luca/components/fields/base.coffee +74 -13
- data/app/assets/javascripts/luca/components/fields/button_field.coffee +60 -13
- data/app/assets/javascripts/luca/components/fields/checkbox_array.coffee +12 -7
- data/app/assets/javascripts/luca/components/fields/select_field.coffee +82 -23
- data/app/assets/javascripts/luca/components/fields/text_area_field.coffee +25 -10
- data/app/assets/javascripts/luca/components/fields/text_field.coffee +9 -3
- data/app/assets/javascripts/luca/components/form_view.coffee +105 -33
- data/app/assets/javascripts/luca/components/grid_layout_view.coffee +42 -0
- data/app/assets/javascripts/luca/components/index.coffee +6 -0
- data/app/assets/javascripts/luca/components/nav_bar.coffee +60 -6
- data/app/assets/javascripts/luca/components/page.coffee +70 -0
- data/app/assets/javascripts/luca/components/simple_collection_view.coffee +10 -0
- data/app/assets/javascripts/luca/components/table_view.coffee +7 -3
- data/app/assets/javascripts/luca/components/table_view_scrollable.coffee +23 -0
- data/app/assets/javascripts/luca/concerns/collection_event_bindings.coffee +4 -1
- data/app/assets/javascripts/luca/concerns/development_tool_helpers.coffee +23 -14
- data/app/assets/javascripts/luca/concerns/dom_helpers.coffee +2 -2
- data/app/assets/javascripts/luca/concerns/filterable.coffee +8 -11
- data/app/assets/javascripts/luca/concerns/form_model_bindings.coffee +20 -0
- data/app/assets/javascripts/luca/concerns/modal_view.coffee +40 -15
- data/app/assets/javascripts/luca/concerns/query_collection_bindings.coffee +7 -1
- data/app/assets/javascripts/luca/concerns/state_model.coffee +40 -26
- data/app/assets/javascripts/luca/concerns/templating.coffee +3 -1
- data/app/assets/javascripts/luca/config.coffee +5 -0
- data/app/assets/javascripts/luca/containers/card_view.coffee +87 -52
- data/app/assets/javascripts/luca/containers/container.coffee +305 -108
- data/app/assets/javascripts/luca/containers/modal_view.coffee +9 -9
- data/app/assets/javascripts/luca/containers/page_controller.coffee +25 -0
- data/app/assets/javascripts/luca/containers/panel_toolbar.coffee +5 -6
- data/app/assets/javascripts/luca/containers/tab_view.coffee +19 -10
- data/app/assets/javascripts/luca/containers/viewport.coffee +12 -16
- data/app/assets/javascripts/luca/core/collection.coffee +19 -5
- data/app/assets/javascripts/luca/core/events.coffee +5 -5
- data/app/assets/javascripts/luca/core/model.coffee +1 -1
- data/app/assets/javascripts/luca/core/panel.coffee +18 -6
- data/app/assets/javascripts/luca/core/registry/component_definition.coffee +2 -1
- data/app/assets/javascripts/luca/core/registry/meta_data.coffee +2 -0
- data/app/assets/javascripts/luca/core/registry/registry.coffee +14 -11
- data/app/assets/javascripts/luca/core/templates.coffee +5 -1
- data/app/assets/javascripts/luca/core/view.coffee +200 -47
- data/app/assets/javascripts/luca/dependencies.coffee +2 -0
- data/app/assets/javascripts/luca/development/code_sync_manager.coffee +173 -0
- data/app/assets/javascripts/luca/development/component.coffee +76 -0
- data/app/assets/javascripts/luca/development/components.coffee +57 -0
- data/app/assets/javascripts/luca/development/console.coffee +1 -1
- data/app/assets/javascripts/luca/development/index.coffee +4 -1
- data/app/assets/javascripts/luca/framework.coffee +7 -3
- data/app/assets/javascripts/luca/index.coffee +2 -1
- data/app/assets/javascripts/luca/managers/collection_manager.coffee +2 -3
- data/app/assets/javascripts/luca/managers/index.coffee +1 -1
- data/app/assets/javascripts/luca/managers/socket_manager.coffee +31 -8
- data/app/assets/javascripts/luca/templates/components/nav_bar.jst.ejs +16 -1
- data/app/assets/javascripts/luca/templates/containers/tab_view.jst.ejs +1 -1
- data/app/assets/javascripts/luca/util/index.coffee +1 -0
- data/app/assets/javascripts/luca/util/keybindings.coffee +24 -0
- data/app/assets/javascripts/luca/util/logging.coffee +15 -0
- data/app/assets/javascripts/luca/util/luca.coffee +9 -1
- data/app/assets/stylesheets/luca/components/table_view.scss +85 -0
- data/app/assets/stylesheets/luca/components/viewport.scss +0 -4
- data/app/assets/stylesheets/luca/containers/container.scss +8 -0
- data/app/assets/stylesheets/luca/index.css +2 -2
- data/bin/luca +14 -0
- data/config.ru +1 -2
- data/docs/framework.json +1 -0
- data/docs/luca-framework-documentation.js +1 -0
- data/docs/{application.md → old/application.md} +0 -0
- data/docs/{collection.md → old/collection.md} +0 -0
- data/docs/{collection_manager.md → old/collection_manager.md} +0 -0
- data/docs/{container_philosophy.md → old/container_philosophy.md} +0 -0
- data/docs/{event_binding_helpers.md → old/event_binding_helpers.md} +0 -0
- data/docs/{method_caching_and_computed_properties.md → old/method_caching_and_computed_properties.md} +0 -0
- data/docs/{view.md → old/view.md} +0 -0
- data/lib/generators/luca/application/templates/javascripts/dependencies.coffee +2 -5
- data/lib/guard/luca.rb +84 -0
- data/lib/luca.rb +25 -1
- data/lib/luca/asset_compiler.rb +117 -0
- data/lib/luca/cli.rb +68 -0
- data/lib/luca/cli/generate.rb +37 -0
- data/lib/luca/cli/server.rb +20 -0
- data/lib/luca/cli/sync.rb +40 -0
- data/lib/luca/cli/watch.rb +16 -0
- data/lib/luca/collection.rb +64 -0
- data/lib/luca/collection/endpoint.rb +38 -0
- data/lib/luca/collection/file_backend.rb +121 -0
- data/lib/luca/collection/redis_backend.rb +153 -0
- data/lib/luca/compiled_asset.rb +61 -0
- data/lib/luca/component_definition.rb +356 -0
- data/lib/luca/luca_application.rb +258 -0
- data/lib/luca/project.rb +73 -0
- data/lib/luca/project_harness.rb +96 -0
- data/lib/luca/rails.rb +5 -3
- data/lib/luca/rails/engine.rb +8 -0
- data/lib/luca/rails/version.rb +1 -2
- data/lib/luca/server.rb +7 -0
- data/lib/luca/stylesheet.rb +35 -0
- data/lib/luca/template.rb +2 -0
- data/lib/luca/template_asset.rb +64 -0
- data/lib/luca/version.rb +3 -0
- data/lib/luca/watcher.rb +72 -0
- data/lib/railties/luca/tasks.rake +7 -0
- data/site/.bundle/config +2 -0
- data/site/.gitignore +5 -0
- data/site/.rvmrc +1 -0
- data/site/CHANGELOG.md +41 -0
- data/site/DOCS.md +41 -0
- data/site/Gemfile +8 -0
- data/site/Gemfile.lock +134 -0
- data/site/LICENSE.md +19 -0
- data/site/config.rb +84 -0
- data/site/helpers/site_helpers.rb +20 -0
- data/site/html5bp-docs/README.md +38 -0
- data/site/html5bp-docs/contribute.md +104 -0
- data/site/html5bp-docs/crossdomain.md +21 -0
- data/site/html5bp-docs/css.md +135 -0
- data/site/html5bp-docs/extend.md +507 -0
- data/site/html5bp-docs/faq.md +77 -0
- data/site/html5bp-docs/htaccess.md +323 -0
- data/site/html5bp-docs/html.md +170 -0
- data/site/html5bp-docs/js.md +31 -0
- data/site/html5bp-docs/misc.md +25 -0
- data/site/html5bp-docs/usage.md +109 -0
- data/site/readme.md +47 -0
- data/site/source/.htaccess +540 -0
- data/site/source/404.html +157 -0
- data/site/source/app/assets/javascripts/dependencies.js.coffee +6 -0
- data/site/source/app/assets/javascripts/docs-docs.js +1 -0
- data/site/source/app/assets/javascripts/docs/application.coffee +64 -0
- data/site/source/app/assets/javascripts/docs/collections/docs_documentation.coffee +17 -0
- data/site/source/app/assets/javascripts/docs/collections/github_repositories.coffee +7 -0
- data/site/source/app/assets/javascripts/docs/collections/index.coffee +1 -0
- data/site/source/app/assets/javascripts/docs/collections/luca_documentation.coffee +17 -0
- data/site/source/app/assets/javascripts/docs/collections/public_gists.coffee +4 -0
- data/site/source/app/assets/javascripts/docs/config.coffee +5 -0
- data/site/source/app/assets/javascripts/docs/index.coffee +12 -0
- data/site/source/app/assets/javascripts/docs/lib/router.coffee +3 -0
- data/{spec/components/application_spec.coffee → site/source/app/assets/javascripts/docs/lib/util.coffee} +0 -0
- data/site/source/app/assets/javascripts/docs/models/component.coffee +99 -0
- data/site/source/app/assets/javascripts/docs/models/github_repository.coffee +3 -0
- data/site/source/app/assets/javascripts/docs/models/index.coffee +1 -0
- data/site/source/app/assets/javascripts/docs/templates/component_documentation.jst.ejs +55 -0
- data/site/source/app/assets/javascripts/docs/templates/examples_browser/overview.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/examples_browser/selector.jst.ejs +11 -0
- data/site/source/app/assets/javascripts/docs/templates/github_repository.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/layouts/main.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/left_navigation.jst.ejs +5 -0
- data/site/source/app/assets/javascripts/docs/templates/pages/getting_started.jst.ejs +78 -0
- data/site/source/app/assets/javascripts/docs/templates/pages/home.jst.ejs +57 -0
- data/site/source/app/assets/javascripts/docs/views/components/code_editor.coffee +45 -0
- data/{spec/components/collection_loader_view_spec.coffee → site/source/app/assets/javascripts/docs/views/components/code_editor/index.coffee} +0 -0
- data/site/source/app/assets/javascripts/docs/views/components/component_documentation.coffee +72 -0
- data/site/source/app/assets/javascripts/docs/views/index.coffee +3 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source.coffee +46 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source/details.coffee +37 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source/list.coffee +31 -0
- data/site/source/app/assets/javascripts/docs/views/pages/component_editor.coffee +10 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser.coffee +102 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/docs.coffee +12 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/source.coffee +13 -0
- data/site/source/app/assets/javascripts/docs/views/pages/home.coffee +10 -0
- data/site/source/app/assets/javascripts/docs/views/views/api_browser/index.coffee +43 -0
- data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/grid_layout_view_example.coffee +14 -0
- data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/table_view_example.coffee +39 -0
- data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/basic_example.coffee +38 -0
- data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/complex_layout.coffee +110 -0
- data/site/source/app/assets/javascripts/docs/views/views/top_navigation.coffee +6 -0
- data/site/source/app/assets/javascripts/luca-docs.js +1 -0
- data/site/source/app/assets/javascripts/luca-framework-documentation.js +1 -0
- data/site/source/app/assets/javascripts/site.js.coffee +4 -0
- data/site/source/app/assets/javascripts/vendor/codemirror.js +4786 -0
- data/site/source/app/assets/javascripts/vendor/coffeescript.js +346 -0
- data/site/source/app/assets/javascripts/vendor/css.js +465 -0
- data/site/source/app/assets/javascripts/vendor/htmlmixed.js +84 -0
- data/site/source/app/assets/javascripts/vendor/javascript.js +422 -0
- data/site/source/app/assets/javascripts/vendor/js-beautify.js +1353 -0
- data/site/source/app/assets/javascripts/vendor/modernizr-2.6.1.min.js +4 -0
- data/site/source/app/assets/javascripts/vendor/vim.js +2511 -0
- data/site/source/app/assets/stylesheets/docs/api-browser.css.scss +5 -0
- data/site/source/app/assets/stylesheets/docs/application.css.scss +35 -0
- data/site/source/app/assets/stylesheets/docs/browse-source.css.scss +5 -0
- data/site/source/app/assets/stylesheets/docs/scrollable-table.css.scss +5 -0
- data/site/source/app/assets/stylesheets/site.css.scss +2 -0
- data/site/source/app/assets/stylesheets/vendor/codemirror.css +240 -0
- data/site/source/app/assets/stylesheets/vendor/prettify-tomorrow-night-bright.css +160 -0
- data/site/source/app/assets/stylesheets/vendor/twilight.css +26 -0
- data/site/source/crossdomain.xml +15 -0
- data/site/source/documentation.html.haml +1 -0
- data/site/source/favicon_base.png +0 -0
- data/site/source/humans.txt +15 -0
- data/site/source/images/background.png +0 -0
- data/site/source/images/middleman.png +0 -0
- data/site/source/index.html.haml +1 -0
- data/site/source/layouts/layout.haml +55 -0
- data/site/source/readme.md +63 -0
- data/site/source/robots.txt +3 -0
- data/spec/{components/grid_view_spec.coffee → javascripts/components/application_spec.coffee} +0 -0
- data/spec/{components/pagination_control_spec.coffee → javascripts/components/collection_loader_view_spec.coffee} +0 -0
- data/spec/{components → javascripts/components}/collection_view_spec.coffee +1 -1
- data/spec/{components → javascripts/components}/controller_spec.coffee +0 -0
- data/spec/{components → javascripts/components}/fields/checkbox_array_spec.coffee +0 -0
- data/spec/javascripts/components/form_view_spec.coffee +162 -0
- data/spec/{components/record_manager_spec.coffee → javascripts/components/grid_view_spec.coffee} +0 -0
- data/spec/{components → javascripts/components}/multi_collection_view_spec.coffee +0 -0
- data/spec/{components/template_spec.coffee → javascripts/components/pagination_control_spec.coffee} +0 -0
- data/spec/{concerns/paginatable_spec.coffee → javascripts/components/record_manager_spec.coffee} +0 -0
- data/spec/{components → javascripts/components}/table_view_spec.coffee +0 -0
- data/spec/{containers/modal_view_spec.coffee → javascripts/components/template_spec.coffee} +0 -0
- data/spec/{concerns → javascripts/concerns}/collection_event_bindings_spec.coffee +0 -0
- data/spec/{concerns → javascripts/concerns}/dom_helpers_spec.coffee +0 -0
- data/spec/{concerns → javascripts/concerns}/filterable_spec.coffee +0 -0
- data/spec/{concerns → javascripts/concerns}/model_presenter_spec.coffee +0 -0
- data/spec/{containers/panel_view_spec.coffee → javascripts/concerns/paginatable_spec.coffee} +0 -0
- data/spec/{concerns → javascripts/concerns}/state_model_spec.coffee +5 -0
- data/spec/javascripts/containers/card_view_spec.coffee +108 -0
- data/spec/{containers/tab_view_spec.coffee → javascripts/containers/modal_view_spec.coffee} +0 -0
- data/spec/{containers/viewport_spec.coffee → javascripts/containers/panel_view_spec.coffee} +0 -0
- data/spec/{core/observer_spec.coffee → javascripts/containers/tab_view_spec.coffee} +0 -0
- data/spec/{managers/socket_manager_spec.coffee → javascripts/containers/viewport_spec.coffee} +0 -0
- data/spec/{core → javascripts/core}/collection_spec.coffee +1 -1
- data/spec/{core → javascripts/core}/concerns_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/container_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/define_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/events_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/field_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/framework_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/model_spec.coffee +0 -0
- data/spec/javascripts/core/observer_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/util_spec.coffee +0 -0
- data/spec/{core → javascripts/core}/view_spec.coffee +51 -39
- data/spec/{dependencies → javascripts/dependencies}/index.coffee +0 -0
- data/spec/{dependencies → javascripts/dependencies}/jasmine-html.js +0 -0
- data/spec/{dependencies → javascripts/dependencies}/jasmine.js +0 -0
- data/spec/{dependencies → javascripts/dependencies}/sinon.js +0 -0
- data/spec/{helper.coffee → javascripts/helper.coffee} +0 -0
- data/spec/{managers → javascripts/managers}/collection_manager_spec.coffee +0 -0
- data/spec/javascripts/managers/socket_manager_spec.coffee +0 -0
- data/spec/lib/component_definition_spec.rb +63 -0
- data/spec/lib/input_compiler_spec.rb +9 -0
- data/spec/lib/luca_application_spec.rb +30 -0
- data/spec/support/fixtures/application.coffee +45 -0
- data/spec/support/fixtures/component.coffee +34 -0
- data/tutorials/component-definitions.md +0 -0
- data/tutorials/component-definitions/01_intro.md +0 -0
- data/tutorials/component-driven-design.md +140 -0
- data/tutorials/structure-of-a-project.md +63 -0
- data/vendor/assets/javascripts/backbone-min.js +37 -33
- data/vendor/assets/javascripts/backbone-query.min.js +1 -1
- data/vendor/assets/javascripts/hogan.js +707 -0
- data/vendor/assets/javascripts/jquery.js +5 -4
- data/vendor/assets/javascripts/keymaster.min.js +4 -0
- data/vendor/assets/javascripts/luca-dependencies.min.js +8 -0
- data/vendor/assets/javascripts/luca-development.min.js +1 -0
- data/vendor/assets/javascripts/luca-spec.js +6 -6
- data/vendor/assets/javascripts/luca-ui.js +7386 -0
- data/vendor/assets/javascripts/luca-ui.min.js +5 -0
- data/vendor/assets/javascripts/luca.full.min.js +12 -0
- data/vendor/assets/javascripts/luca.min.js +5 -0
- data/vendor/assets/javascripts/underscore-min.js +1 -5
- data/vendor/assets/javascripts/underscore-string.min.js +1 -1
- data/vendor/assets/stylesheets/luca-components.css +202 -0
- data/vendor/assets/stylesheets/luca-development.css +23 -0
- data/vendor/assets/stylesheets/luca-ui.css +198 -0
- metadata +324 -94
- data/app/assets/javascripts/luca/components/base_toolbar.coffee +0 -17
- data/app/assets/javascripts/luca/components/form_button_toolbar.coffee +0 -28
- data/app/assets/javascripts/luca/components/grid_view.coffee +0 -269
- data/app/assets/javascripts/luca/components/page_controller.coffee +0 -7
- data/app/assets/javascripts/luca/components/template.coffee +0 -5
- data/app/assets/javascripts/luca/components/toolbar_dialog.coffee +0 -25
- data/lib/luca/code_browser.rb +0 -55
- data/lib/luca/command_line.rb +0 -69
- data/lib/luca/component_documentation.rb +0 -72
- data/site/assets/bootstrap.min.js +0 -7
- data/site/assets/dependencies.js +0 -94
- data/site/assets/glyphicons-halflings-white.png +0 -0
- data/site/assets/glyphicons-halflings.png +0 -0
- data/site/assets/luca-ui-bootstrap.css +0 -1331
- data/site/assets/luca-ui-bootstrap.js +0 -9
- data/site/assets/luca-ui-development-tools.css +0 -234
- data/site/assets/luca-ui-development-tools.js +0 -18561
- data/site/assets/luca-ui-development-tools.min.js +0 -15
- data/site/assets/luca-ui-full.min.js +0 -8
- data/site/assets/luca-ui.min.js +0 -4
- data/site/assets/sandbox.css +0 -62
- data/site/assets/sandbox.js +0 -469
- data/site/docs/application.html +0 -41
- data/site/docs/caching.html +0 -43
- data/site/docs/collection.html +0 -75
- data/site/docs/collection_manager.html +0 -71
- data/site/docs/containers.html +0 -118
- data/site/docs/events.html +0 -153
- data/site/docs/view.html +0 -128
- data/site/img/glyphicons-halflings-white.png +0 -0
- data/site/img/glyphicons-halflings.png +0 -0
- data/site/index.html +0 -20
- data/site/source-map.js +0 -1
- data/spec/components/form_view_spec.coffee +0 -84
- data/spec/containers/card_view_spec.coffee +0 -50
- data/spec/luca-spec.coffee +0 -9
@@ -12,7 +12,7 @@ if window.JST?
|
|
12
12
|
|
13
13
|
# optionally, passing in variables will compile the template for you, instead
|
14
14
|
# of returning a reference to the function which you would then call yourself
|
15
|
-
Luca.template = (template_name, variables)->
|
15
|
+
Luca.template = (template_name, variables, partials)->
|
16
16
|
window.JST ||= {}
|
17
17
|
|
18
18
|
if _.isFunction(template_name)
|
@@ -34,6 +34,10 @@ Luca.template = (template_name, variables)->
|
|
34
34
|
|
35
35
|
template = luca || jst
|
36
36
|
|
37
|
+
if template instanceof Hogan.template
|
38
|
+
if variables?
|
39
|
+
return template.render(variables, partials)
|
40
|
+
|
37
41
|
return template(variables) if variables?
|
38
42
|
|
39
43
|
template
|
@@ -1,16 +1,89 @@
|
|
1
|
+
# `Luca.View` is an enhanced `Backbone.View` which provides common patterns for view components,
|
2
|
+
# and various helper methods and configuration conventions.
|
3
|
+
#
|
4
|
+
# #### Instance caching / naming
|
5
|
+
#
|
6
|
+
# If you provide a `@name` property to your views, they will be accessible by that property
|
7
|
+
# using the Application helper.
|
8
|
+
#
|
9
|
+
# view = new Luca.View(name:"my_view")
|
10
|
+
# Luca("my_view") === view
|
11
|
+
#
|
12
|
+
# #### CSS @className conventions
|
13
|
+
#
|
14
|
+
# In order to make it easier to componentize your views, extending from `Luca.View` will
|
15
|
+
# enable CSS class based inheritance based on the names of the view class.
|
16
|
+
#
|
17
|
+
# ##### For Example:
|
18
|
+
#
|
19
|
+
# base = Luca.register "App.views.BaseViewClass"
|
20
|
+
# base.extends "Luca.View"
|
21
|
+
# base.defines
|
22
|
+
# className: "some-other-class"
|
23
|
+
#
|
24
|
+
# child = Luca.register "App.views.ChildViewClass"
|
25
|
+
# child.extends "App.views.BaseViewClass"
|
26
|
+
# child.defines
|
27
|
+
# myClasses: ()->
|
28
|
+
# @$el.attr('class')
|
29
|
+
#
|
30
|
+
# view = new App.views.ChildViewClass()
|
31
|
+
# view.myClasses() #=> "app-base-view-class app-child-view-class some-other-class"
|
32
|
+
#
|
33
|
+
# This establishes a convention for css class names, and allows you to componetize your css
|
34
|
+
# along with the component by joining them based on the name of your view class. When using
|
35
|
+
# Sass scoping / nesting it fits very nicely together.
|
36
|
+
#
|
37
|
+
# #### Internal state machine
|
38
|
+
#
|
39
|
+
# Any `Luca.View` class which defines a `@stateful` property will automatically generate a
|
40
|
+
# `@state` model that can be used to get/set attributes on the view as well as bind to change events on these attributes.
|
41
|
+
#
|
42
|
+
# This gives your views a dedicated place to store state, and you can bind to your data models separately
|
43
|
+
# and update the DOM without confusing the two.
|
44
|
+
#
|
45
|
+
# statefulView = Luca.register "App.views.StatefulView"
|
46
|
+
# statefulView.extends "Luca.View"
|
47
|
+
#
|
48
|
+
# statefulView.defines
|
49
|
+
# # Passing an object allows you to set default values on the @state model.
|
50
|
+
# stateful:
|
51
|
+
# attribute: "value"
|
52
|
+
#
|
53
|
+
# # Whenever the attribute specified changes, call the specified method.
|
54
|
+
# stateChangeEvents:
|
55
|
+
# "attribute" : "onAttributeChange"
|
56
|
+
#
|
57
|
+
# onAttributeChange: (stateMachine, attributeValue)->
|
58
|
+
# @doSomethingWhenAttributeChanges()
|
59
|
+
#
|
60
|
+
# If this type of declarative style isn't your thing, you can still bind to events in code:
|
61
|
+
#
|
62
|
+
# view = new App.views.StatefulView()
|
63
|
+
# view.on "state:change:attribute", (stateMachine, attributeValue)=> @$el.html("New Attribute: #")
|
64
|
+
# view.set "attribute", "something"
|
65
|
+
#
|
66
|
+
# #### Event binding helpers
|
67
|
+
#
|
68
|
+
# In addition to the `@stateChangeEvent` bindings documented above, you have available
|
69
|
+
# to you similar configuration helpers for binding to events emitted by the singletons:
|
70
|
+
#
|
71
|
+
# - `Luca.Application` via `@applicationEvents`
|
72
|
+
# - `Luca.CollectionManager` via `@collectionEvents`
|
73
|
+
# - `Luca.SocketManager` via `@socketEvents`
|
1
74
|
view = Luca.register "Luca.View"
|
2
|
-
|
3
75
|
view.extends "Backbone.View"
|
4
76
|
|
5
77
|
# includes are extensions to the prototype, and have no special behavior
|
6
78
|
view.includes "Luca.Events",
|
7
|
-
"Luca.concerns.DomHelpers"
|
79
|
+
"Luca.concerns.DomHelpers",
|
80
|
+
"Luca.concerns.DevelopmentToolHelpers"
|
8
81
|
|
9
82
|
# concerns are includes with special property / method conventions
|
10
83
|
# which customize the components through the use of __initializer and
|
11
84
|
# __included method names. These will be called every time an instance
|
12
85
|
# is created, and the first time the mixin is used to enhance a component.
|
13
|
-
view.mixesIn "DomHelpers",
|
86
|
+
view.mixesIn "DomHelpers",
|
14
87
|
"Templating",
|
15
88
|
"EnhancedProperties",
|
16
89
|
"CollectionEventBindings",
|
@@ -18,10 +91,10 @@ view.mixesIn "DomHelpers",
|
|
18
91
|
"StateModel"
|
19
92
|
|
20
93
|
# Luca.View classes have the concept of special events called hooks
|
21
|
-
# which allow you to tap into the lifecycle events of your view to
|
94
|
+
# which allow you to tap into the lifecycle events of your view to
|
22
95
|
# customize their behavior. This is especially useful in subclasses.
|
23
96
|
#
|
24
|
-
# You can utilize a @hook method by camelcasing the triggers defined below:
|
97
|
+
# You can utilize a @hook method by camelcasing the triggers defined below:
|
25
98
|
view.triggers "before:initialize",
|
26
99
|
"after:initialize",
|
27
100
|
"before:render",
|
@@ -30,84 +103,163 @@ view.triggers "before:initialize",
|
|
30
103
|
"activation",
|
31
104
|
"deactivation"
|
32
105
|
|
106
|
+
view.publicConfiguration
|
107
|
+
# Specifying a `@name` for your views is useful for views which
|
108
|
+
# there will only be one instance. This allows you to reference
|
109
|
+
# the view instances by name using the application helper:
|
110
|
+
# Luca("my_view_name")
|
111
|
+
name: undefined
|
112
|
+
|
113
|
+
# Setting this property to true will automatically bind the context
|
114
|
+
# of your event handler methods to the instance of this view. This
|
115
|
+
# saves you from having to manually do:
|
116
|
+
#
|
117
|
+
# Luca.View.extend
|
118
|
+
# events:
|
119
|
+
# "click .one" : "oneHandler"
|
120
|
+
# "click .two" : "twoHandler"
|
121
|
+
# initialize: ()->
|
122
|
+
# _.bindAll(@, "oneHandler", "twoHandler")
|
123
|
+
#
|
124
|
+
# Instead:
|
125
|
+
#
|
126
|
+
# Luca.View.extend
|
127
|
+
# autoBindEventHandlers: true
|
128
|
+
# events:
|
129
|
+
# "click .one" : "oneHandler"
|
130
|
+
#
|
131
|
+
# Optionally, you can define an array of method names you want bound
|
132
|
+
# to this view:
|
133
|
+
#
|
134
|
+
# Luca.View.extend
|
135
|
+
# bindMethods:["oneHandler","twoHandler"]
|
136
|
+
#
|
137
|
+
autoBindEventHandlers: false
|
138
|
+
|
139
|
+
# Supplying configuration to `@_inheritEvents` will ensure that this configuration
|
140
|
+
# is present on views which extend from this view. In normal Backbone behavior
|
141
|
+
# the `@events` property can be overridden by views which extend, and this isn't
|
142
|
+
# always what you want from your component.
|
143
|
+
_inheritEvents: undefined
|
144
|
+
|
145
|
+
|
146
|
+
|
33
147
|
# Luca.View decorates Backbone.View with some patterns and conventions.
|
34
|
-
view.
|
148
|
+
view.publicMethods
|
35
149
|
identifier: ()->
|
36
150
|
(@displayName || @type ) + ":" + (@name || @role || @cid)
|
37
151
|
|
152
|
+
# Calls Backbone.View::remove, and removes the view from the
|
153
|
+
# instance cache. Triggers a "before:remove" event.
|
154
|
+
remove: ()->
|
155
|
+
@trigger("before:remove", @)
|
156
|
+
Luca.remove(@)
|
157
|
+
Backbone.View::remove.apply(@, arguments)
|
158
|
+
|
38
159
|
initialize: (@options={})->
|
39
160
|
@trigger "before:initialize", @, @options
|
40
161
|
|
41
162
|
_.extend @, @options
|
42
163
|
|
43
164
|
if @autoBindEventHandlers is true or @bindAllEvents is true
|
44
|
-
bindAllEventHandlers.call(@)
|
165
|
+
bindAllEventHandlers.call(@)
|
45
166
|
|
46
167
|
@cid = _.uniqueId(@name) if @name?
|
47
168
|
|
48
169
|
@$el.attr("data-luca-id", @name || @cid)
|
49
|
-
|
170
|
+
|
50
171
|
Luca.registry.cacheInstance( @cid, @ )
|
51
172
|
|
52
173
|
@setupHooks _( Luca.View::hooks.concat( @hooks ) ).uniq()
|
53
174
|
|
54
175
|
Luca.concern.setup.call(@)
|
55
176
|
|
56
|
-
@delegateEvents()
|
57
|
-
|
177
|
+
@delegateEvents() unless _.isEmpty(@events)
|
178
|
+
|
58
179
|
@trigger "after:initialize", @
|
59
180
|
|
60
181
|
_.bindAll(@, @bindMethods...) if @bindMethods?.legth > 0
|
61
182
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
183
|
+
unless _.isEmpty(@_inheritEvents)
|
184
|
+
for eventId, handler of @_inheritEvents
|
185
|
+
@registerEvent(eventId, handler)
|
186
|
+
|
187
|
+
|
188
|
+
debug: (args...)->
|
189
|
+
if @debugMode is true or window.LucaDebugMode is true
|
190
|
+
args.unshift @identifier()
|
191
|
+
console.log args...
|
192
|
+
|
193
|
+
trigger: ()->
|
194
|
+
if Luca.enableGlobalObserver
|
195
|
+
if Luca.developmentMode is true or @observeEvents is true
|
196
|
+
Luca.ViewObserver ||= new Luca.Observer(type:"view")
|
197
|
+
Luca.ViewObserver.relay @, arguments
|
198
|
+
|
199
|
+
Backbone.View::trigger.apply @, arguments
|
200
|
+
|
201
|
+
# Backbone.View.prototype.make is removed in 0.9.10.
|
202
|
+
# As we happen to rely on this little utility heavily,
|
203
|
+
# we add it to Luca.View
|
204
|
+
make: (tagName, attributes, content)->
|
205
|
+
el = document.createElement(tagName);
|
206
|
+
if (attributes)
|
207
|
+
Backbone.$(el).attr(attributes)
|
208
|
+
if (content != null)
|
209
|
+
Backbone.$(el).html(content)
|
210
|
+
|
211
|
+
el
|
76
212
|
|
77
213
|
registerEvent: (selector, handler)->
|
78
214
|
@events ||= {}
|
79
|
-
@events[ selector ] = handler
|
80
215
|
|
81
216
|
if _.isObject(selector)
|
82
|
-
_.extend(@events, selector)
|
83
|
-
|
217
|
+
@events = _.extend(@events, selector)
|
218
|
+
else
|
219
|
+
if _.isFunction(handler) || (_.isString(handler) && @[handler]?)
|
220
|
+
@events[selector] = handler
|
221
|
+
|
84
222
|
@delegateEvents()
|
85
223
|
|
224
|
+
view.privateMethods
|
225
|
+
# Returns a reference to the class which this view is an instance of.
|
86
226
|
definitionClass: ()->
|
87
227
|
Luca.util.resolve(@displayName, window)?.prototype
|
88
228
|
|
89
|
-
collections
|
229
|
+
# Returns a list of all of the collections which are properties on this view.
|
230
|
+
_collections: ()->
|
90
231
|
Luca.util.selectProperties( Luca.isBackboneCollection, @ )
|
91
232
|
|
92
|
-
models
|
233
|
+
# Returns a list of all of the models which are properties on this view.
|
234
|
+
_models: ()->
|
93
235
|
Luca.util.selectProperties( Luca.isBackboneModel, @ )
|
94
236
|
|
95
|
-
views
|
237
|
+
# Returns a list of all of the views which are properties on this view.
|
238
|
+
_views: ()->
|
96
239
|
Luca.util.selectProperties( Luca.isBackboneView, @ )
|
97
240
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
241
|
+
# views which inherit from Luca.View can define hooks
|
242
|
+
# or events which can be emitted from them. Automatically,
|
243
|
+
# any functions on the view which are named according to the
|
244
|
+
# convention will automatically get run.
|
245
|
+
#
|
246
|
+
# by default, all Luca.View classes come with the following:
|
247
|
+
#
|
248
|
+
# - before:render : beforeRender()
|
249
|
+
# - after:render : afterRender()
|
250
|
+
# - after:initialize : afterInitialize()
|
251
|
+
# - first:activation : firstActivation()
|
252
|
+
setupHooks: Luca.util.setupHooks
|
108
253
|
|
109
|
-
|
254
|
+
# In order to support some Luca apps which rely
|
255
|
+
# on Backbone.View.make.
|
256
|
+
view.afterDefinition ()->
|
257
|
+
if not Backbone.View::make?
|
258
|
+
Backbone.View::make = ()->
|
259
|
+
console.log "Backbone.View::make has been removed from backbone. You should use Luca.View::make instead."
|
260
|
+
Luca.View::make
|
110
261
|
|
262
|
+
view.register()
|
111
263
|
|
112
264
|
Luca.View._originalExtend = Backbone.View.extend
|
113
265
|
|
@@ -115,12 +267,12 @@ Luca.View._originalExtend = Backbone.View.extend
|
|
115
267
|
#
|
116
268
|
# I will be removing this prior to 1.0. Optimizing for collection based
|
117
269
|
# views does not belong in here, so the deferrable / collection binding stuff
|
118
|
-
# needs to go.
|
270
|
+
# needs to go.
|
119
271
|
#
|
120
272
|
# Being able to defer rendering until the firing of an event on another object
|
121
273
|
# is something that does ask for some syntactic sugar though, so need to rethink.
|
122
274
|
|
123
|
-
Luca.View.renderStrategies =
|
275
|
+
Luca.View.renderStrategies =
|
124
276
|
legacy: ( _userSpecifiedMethod )->
|
125
277
|
view = @
|
126
278
|
# if a view has a deferrable property set
|
@@ -132,10 +284,11 @@ Luca.View.renderStrategies =
|
|
132
284
|
@deferrable = @collection
|
133
285
|
|
134
286
|
target ||= @deferrable
|
135
|
-
trigger = if @deferrable_event then @deferrable_event else Luca.View.deferrableEvent
|
287
|
+
trigger = if @deferrable_event then @deferrable_event else Luca.View.deferrableEvent
|
136
288
|
|
137
289
|
deferred = ()->
|
138
290
|
_userSpecifiedMethod.call(view)
|
291
|
+
@rendered = true
|
139
292
|
view.trigger("after:render", view)
|
140
293
|
|
141
294
|
view.defer(deferred).until(target, trigger)
|
@@ -155,6 +308,7 @@ Luca.View.renderStrategies =
|
|
155
308
|
else
|
156
309
|
@trigger "before:render", @
|
157
310
|
_userSpecifiedMethod.apply(@, arguments)
|
311
|
+
@rendered = true
|
158
312
|
@trigger "after:render", @
|
159
313
|
|
160
314
|
return @
|
@@ -162,10 +316,9 @@ Luca.View.renderStrategies =
|
|
162
316
|
improved: (_userSpecifiedMethod)->
|
163
317
|
@trigger "before:render", @
|
164
318
|
|
165
|
-
|
166
319
|
deferred = ()=>
|
167
320
|
_userSpecifiedMethod.apply(@, arguments)
|
168
|
-
@trigger "after:render", @
|
321
|
+
@trigger "after:render", @
|
169
322
|
|
170
323
|
console.log "doing the improved one", @deferrable
|
171
324
|
|
@@ -203,7 +356,7 @@ Luca.View.renderWrapper = (definition)->
|
|
203
356
|
|
204
357
|
bindAllEventHandlers = ()->
|
205
358
|
for config in [@events, @componentEvents, @collectionEvents, @applicationEvents] when not _.isEmpty(config)
|
206
|
-
bindEventHandlers.call(@, config)
|
359
|
+
bindEventHandlers.call(@, config)
|
207
360
|
|
208
361
|
bindEventHandlers = (events={})->
|
209
362
|
for eventSignature, handler of events
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# The `Luca.CodeSyncManager` works along with the Guard adapter that ships with
|
2
|
+
# the ruby gem. This is still an experimental option at this point, but I use
|
3
|
+
# it regularly on all of my Luca projects and it allows me to develop my applications
|
4
|
+
# directly from my editor and rarely have the need to refresth the browser to work with
|
5
|
+
# javascript and css changes.
|
6
|
+
#
|
7
|
+
# #### Similar to LiveReload
|
8
|
+
# It is similar to projects like LiveReload, except that it knows a lot about the luca
|
9
|
+
# framework and application conventions and uses this knowledge to optimize live reloading
|
10
|
+
# behavior, avoiding the need to do full browser reloads. This typically doesn't work well
|
11
|
+
# with state heavy applications, since the browser reloading doesn't always construct application
|
12
|
+
# state exactly as you need it when you're making your css changes etc.
|
13
|
+
#
|
14
|
+
# #### 1) Add an entry to your Guardfile:
|
15
|
+
# guard 'luca' do
|
16
|
+
# watch(%r{^app/assets/stylesheets/(.+)}) do |match|
|
17
|
+
# path = match.last
|
18
|
+
# end
|
19
|
+
|
20
|
+
# watch(%r{^app/assets/javascripts/(.+)}) do |match|
|
21
|
+
# path = match.last
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# #### 2) Add the `CodeSyncManager` to your development mode application.
|
26
|
+
# **Note:** This expect
|
27
|
+
# you to have a `Luca.SocketManager` capable backend such as faye or socket.io running. It
|
28
|
+
# handles the same configuration options as the `Luca.SocketManager` as well.
|
29
|
+
#
|
30
|
+
# app = Luca()
|
31
|
+
# app.codeSyncManager = new Luca.CodeSyncManager
|
32
|
+
# host: "//localhost:9292/faye"
|
33
|
+
# channel: "/changes"
|
34
|
+
# app.codeSyncManager.trigger("ready")
|
35
|
+
#
|
36
|
+
# #### 3) Run guard.
|
37
|
+
# Edit your files, watch your changes appear.
|
38
|
+
#
|
39
|
+
# ### Using the Syncpad
|
40
|
+
#
|
41
|
+
# The syncpad is a special naming convention for development scratch paper in your editor. A file
|
42
|
+
# named syncpad.coffee, syncpad.css.scss, syncpad.jst.ejs.haml, etc will be evaluated live when you change
|
43
|
+
# them in your editor. I personally use this to experiment with code / css and get immediate results without
|
44
|
+
# needing to refresh the browser.
|
45
|
+
codeManager = Luca.register "Luca.CodeSyncManager"
|
46
|
+
codeManager.extends "Luca.SocketManager"
|
47
|
+
|
48
|
+
codeManager.publicConfiguration
|
49
|
+
host: Luca.config.codeSyncHost || "//localhost:9292/faye"
|
50
|
+
namespace: "luca"
|
51
|
+
channel: Luca.config.codeSyncChannel || "/luca-code-sync"
|
52
|
+
|
53
|
+
codeManager.classMethods
|
54
|
+
setup: (options={})->
|
55
|
+
@codeSyncManager = new Luca.CodeSyncManager(options)
|
56
|
+
@codeSyncManager.trigger "ready"
|
57
|
+
|
58
|
+
codeManager.privateMethods
|
59
|
+
initialize: (@attributes={})->
|
60
|
+
unless @attributes.host?
|
61
|
+
_.extend(@attributes, host: (@host || Luca.config.codeSyncHost))
|
62
|
+
|
63
|
+
Luca.SocketManager::initialize.call(@, @attributes)
|
64
|
+
@bindToChannel()
|
65
|
+
|
66
|
+
start: ()->
|
67
|
+
@trigger "ready"
|
68
|
+
|
69
|
+
bindToChannel: ()->
|
70
|
+
if @client?
|
71
|
+
@client.subscribe @channel, ()=>
|
72
|
+
@onChangesNotification.apply(@, arguments)
|
73
|
+
else
|
74
|
+
@on "change:client", (socketManager, client)=>
|
75
|
+
@client.subscribe @channel, ()=>
|
76
|
+
@onChangesNotification.apply(@, arguments)
|
77
|
+
|
78
|
+
# changeData is a payload that gets sent over the socket
|
79
|
+
# whenever an asset that is being watched changes.
|
80
|
+
# it is different if the type of file is css or javascript.
|
81
|
+
onChangesNotification: (changeData={}, applicationName)->
|
82
|
+
return if _.isEmpty(changeData)
|
83
|
+
data = _( changeData ).values()[0] || {}
|
84
|
+
|
85
|
+
if data.type is "template"
|
86
|
+
@processTemplate(data)
|
87
|
+
@rerunSyncPad(data.type)
|
88
|
+
|
89
|
+
if data.type is "component_definition"
|
90
|
+
@processComponentDefinitionChange(data)
|
91
|
+
@processJavascriptChange(data)
|
92
|
+
|
93
|
+
_.delay ()=>
|
94
|
+
@rerunSyncPad(data.type)
|
95
|
+
, 25
|
96
|
+
|
97
|
+
if data.type is "javascript"
|
98
|
+
@processJavascriptChange(data)
|
99
|
+
|
100
|
+
if data.type is "stylesheet" and data?.path
|
101
|
+
@processStylesheetChange(data)
|
102
|
+
|
103
|
+
rerunSyncPad: ()->
|
104
|
+
if last = @get("last_syncpad_javascript_payload")
|
105
|
+
@processJavascriptChange(last)
|
106
|
+
|
107
|
+
processTemplate: (change={})->
|
108
|
+
fn = ()->
|
109
|
+
eval( change.contents )
|
110
|
+
|
111
|
+
fn.apply(window)
|
112
|
+
|
113
|
+
processComponentDefinitionChange: (change={})->
|
114
|
+
return if _.isEmpty(change)
|
115
|
+
@components ||= Luca.collections.Components.generate()
|
116
|
+
|
117
|
+
if change.class_name?
|
118
|
+
component = @components.findByClassName( change.class_name )
|
119
|
+
|
120
|
+
if component && change.source_file_contents?
|
121
|
+
component.set(source_file_contents: change.source_file_contents )
|
122
|
+
|
123
|
+
processJavascriptChange: (change={})->
|
124
|
+
return unless change?.compiled
|
125
|
+
existing = $("body script[data-path='#{ change.source }']")
|
126
|
+
|
127
|
+
# just to be clean
|
128
|
+
if existing.length > 1
|
129
|
+
existing.remove()
|
130
|
+
|
131
|
+
if change.source?.match(/syncpad/) and change?.compiled and true
|
132
|
+
@set("last_syncpad_javascript_payload", change)
|
133
|
+
|
134
|
+
script = @make("script", {"data-path": change.source, type:"text/javascript"}, change.compiled)
|
135
|
+
$('body').append(script)
|
136
|
+
|
137
|
+
processStylesheetChange: (change={})->
|
138
|
+
return if _.isEmpty(change)
|
139
|
+
|
140
|
+
if change.path?.match(/syncpad/) or Luca.config.codeSyncStylesheetMode is "single"
|
141
|
+
@syncStylesheet(change)
|
142
|
+
else
|
143
|
+
@replaceStylesheetAndEverythingAfter(change.path)
|
144
|
+
|
145
|
+
replaceStylesheetAndEverythingAfter: (path)->
|
146
|
+
stylesheet = path.replace('./app/assets/stylesheets', Luca.config.assetsUrlPrefix )
|
147
|
+
stylesheet = stylesheet.replace('.scss','')
|
148
|
+
existing = $("link[href*='#{ stylesheet }']")
|
149
|
+
parent = existing.parent()
|
150
|
+
|
151
|
+
return unless existing.length > 0
|
152
|
+
|
153
|
+
replaced = existing.clone()
|
154
|
+
comesAfter = existing.nextAll('link')
|
155
|
+
cloned = comesAfter.clone()
|
156
|
+
|
157
|
+
$(existing, comesAfter).remove()
|
158
|
+
|
159
|
+
parent.append( replaced )
|
160
|
+
parent.append( cloned )
|
161
|
+
|
162
|
+
syncStylesheet: (change)->
|
163
|
+
existing = $("head style[data-file='#{ change.path }']")
|
164
|
+
|
165
|
+
if existing.length > 0
|
166
|
+
existing.remove()
|
167
|
+
|
168
|
+
if change.compiled? or change.contents?
|
169
|
+
link = @make("style",{"data-file":change.path, type:"text/css"}, change.compiled || change.contents)
|
170
|
+
$('head').append( link )
|
171
|
+
|
172
|
+
codeManager.defines
|
173
|
+
make: Luca.View::make
|