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