lanes 0.1.2 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -0
- data/client/lanes/access/Extension.coffee +19 -0
- data/client/lanes/access/LoginDialog.coffee +47 -0
- data/client/lanes/access/Roles.coffee +88 -0
- data/client/lanes/access/User.coffee +72 -0
- data/client/lanes/access/index.js +5 -0
- data/client/lanes/access/login-dialog.html +16 -0
- data/client/lanes/access/screens/user-management/GridUserEditor.coffee +25 -0
- data/client/lanes/access/screens/user-management/UserManagement.coffee +24 -0
- data/client/lanes/access/screens/user-management/grid-popover-editor.html +33 -0
- data/client/lanes/access/screens/user-management/index.js +3 -0
- data/client/lanes/access/screens/user-management/index.scss +7 -0
- data/client/lanes/access/screens/user-management/screen.html +7 -0
- data/client/lanes/{components/enabled.scss.erb → access/styles.scss} +0 -0
- data/{lib/lanes/command/templates/client/components → client/lanes/access/views}/.gitkeep +0 -0
- data/client/lanes/components/Base.coffee +3 -4
- data/client/lanes/components/enabled.js.erb +2 -0
- data/client/lanes/components/grid/Editor.coffee +1 -1
- data/client/lanes/components/grid/Grid.coffee +26 -27
- data/client/lanes/components/grid/{_index.scss → styles.scss} +0 -0
- data/client/lanes/components/grid/template.html +1 -1
- data/client/lanes/components/grid/vendor/dataTables.scroller.js +119 -42
- data/client/lanes/components/grid/vendor/jquery.dataTables.js +984 -526
- data/client/lanes/components/modal/ModalDialog.coffee +25 -4
- data/client/lanes/components/modal/styles.scss +19 -0
- data/client/lanes/components/modal/template.html +2 -2
- data/client/lanes/components/multi-select/MultiSelect.coffee +46 -0
- data/client/lanes/components/popover/PopOver.coffee +1 -1
- data/client/lanes/components/popover/styles.scss +2 -0
- data/client/lanes/components/{radio_group → radio-group}/RadioGroup.coffee +12 -23
- data/client/lanes/components/radio-group/index.js +1 -0
- data/client/lanes/components/radio-group/styles.scss +1 -0
- data/client/lanes/components/record-finder/Clause.coffee +38 -0
- data/client/lanes/components/record-finder/Dialog.coffee +45 -0
- data/client/lanes/components/record-finder/RecordFinder.coffee +55 -0
- data/client/lanes/components/{record_finder/clause.skr → record-finder/clause.html} +7 -5
- data/client/lanes/components/record-finder/config.json +3 -0
- data/client/lanes/components/{record_finder/dialog.skr → record-finder/dialog.html} +0 -0
- data/client/lanes/components/{record_finder/field.skr → record-finder/field.html} +1 -1
- data/client/lanes/components/record-finder/index.js +4 -0
- data/client/lanes/{styles/components/record-finder.scss → components/record-finder/styles.scss} +22 -20
- data/client/lanes/components/select-field/SelectField.coffee +62 -0
- data/client/lanes/components/{select_field → select-field}/index.js +0 -0
- data/client/lanes/components/{select_field/_index.scss → select-field/styles.scss} +0 -0
- data/client/lanes/extension/EarlyExtensions.js.erb +3 -3
- data/client/lanes/extension/Extensions.coffee +4 -1
- data/client/lanes/extension/LateLoaded.js.erb +3 -3
- data/client/lanes/index.js +2 -2
- data/client/lanes/index.scss.erb +30 -0
- data/client/lanes/lib/MakeBaseClass.coffee +20 -19
- data/client/lanes/lib/ModuleSupport.coffee +1 -1
- data/client/lanes/lib/results.coffee +1 -9
- data/client/lanes/lib/utilFunctions.coffee +56 -10
- data/client/lanes/models/Base.coffee +57 -116
- data/client/lanes/models/ChangeMonitor.coffee +29 -0
- data/client/lanes/models/ChangeSet.coffee +3 -3
- data/client/lanes/models/Collection.coffee +36 -4
- data/client/lanes/models/ModelAssociations.coffee +118 -0
- data/client/lanes/models/PubSub.coffee +5 -5
- data/client/lanes/models/Query.coffee +37 -27
- data/client/lanes/models/Sync.coffee +1 -1
- data/client/lanes/models/index.js +1 -0
- data/client/lanes/screens/Base.coffee +5 -8
- data/client/lanes/screens/ChangeListener.coffee +6 -3
- data/client/lanes/{models/Screens.coffee → screens/Definitions.coffee} +22 -9
- data/client/lanes/screens/Instance.coffee +22 -22
- data/client/lanes/screens/Router.coffee +1 -3
- data/client/lanes/screens/all.js.erb +3 -0
- data/client/lanes/screens/index.js +6 -1
- data/client/lanes/screens/{screen-definitions.js.erb → register.js.erb} +3 -3
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_alerts.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_badges.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_breadcrumbs.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_button-groups.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_buttons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_carousel.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_close.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_code.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_component-animations.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_dropdowns.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_forms.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_glyphicons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_grid.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_input-groups.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_jumbotron.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_labels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_list-group.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_media.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_mixins.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_modals.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_navbar.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_navs.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_normalize.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_pager.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_pagination.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_panels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_popovers.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_print.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_progress-bars.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_responsive-embed.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_responsive-utilities.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_scaffolding.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_tables.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_theme.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_thumbnails.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_tooltip.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_type.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_utilities.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_variables.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_wells.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_alerts.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_background-variant.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_border-radius.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_buttons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_center-block.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_clearfix.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_forms.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_gradients.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_grid-framework.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_grid.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_hide-text.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_image.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_labels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_list-group.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_nav-divider.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_nav-vertical-align.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_opacity.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_pagination.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_panels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_progress-bar.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_reset-filter.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_resize.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_responsive-visibility.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_size.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_tab-focus.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_table-row.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_text-emphasis.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_text-overflow.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_vendor-prefixes.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_alerts.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_badges.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_breadcrumbs.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_button-groups.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_buttons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_carousel.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_close.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_code.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_component-animations.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_dropdowns.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_forms.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_glyphicons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_grid.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_input-groups.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_jumbotron.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_labels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_list-group.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_media.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_mixins.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_modals.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_navbar.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_navs.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_normalize.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_pager.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_pagination.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_panels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_popovers.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_print.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_progress-bars.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_responsive-embed.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_responsive-utilities.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_scaffolding.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_tables.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_theme.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_thumbnails.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_tooltip.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_type.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_utilities.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_variables.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_wells.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/bootstrap.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_alerts.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_background-variant.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_border-radius.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_buttons.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_center-block.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_clearfix.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_forms.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_gradients.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_grid-framework.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_grid.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_hide-text.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_image.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_labels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_list-group.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_nav-divider.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_nav-vertical-align.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_opacity.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_pagination.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_panels.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_progress-bar.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_reset-filter.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_resize.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_responsive-visibility.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_size.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_tab-focus.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_table-row.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_text-emphasis.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_text-overflow.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_vendor-prefixes.scss +0 -0
- data/client/lanes/styles/{vendor/bootstrap-custom-grid.scss → bootstrap-custom-grid.scss} +0 -0
- data/client/lanes/styles/{vendor/bootstrap-custom-modals.scss → bootstrap-custom-modals.scss} +0 -0
- data/client/lanes/styles/bootstrap.scss +71 -0
- data/client/lanes/styles/{vendor/dataTables.scss → dataTables.scss} +0 -0
- data/client/lanes/styles/fonts.scss +9 -20
- data/client/lanes/vendor/packaged.js +27 -25
- data/client/lanes/views/Base.coffee +47 -34
- data/client/lanes/views/FormBindings.coffee +10 -9
- data/client/lanes/views/Helpers.coffee +14 -16
- data/client/lanes/views/ModelObserver.coffee +4 -4
- data/client/lanes/views/ModelUpdate.coffee +5 -2
- data/client/lanes/views/PubSub.coffee +1 -1
- data/client/lanes/views/Viewport.coffee +8 -78
- data/client/lanes/views/_button.html +1 -1
- data/client/lanes/views/_toolbar.html +21 -25
- data/client/lanes/views/model-update.html +7 -5
- data/client/lanes/workspace/ActiveScreensSwitcher.coffee +6 -12
- data/client/lanes/workspace/Extension.coffee +3 -0
- data/client/lanes/workspace/Layout.coffee +13 -9
- data/client/lanes/workspace/Navbar.coffee +2 -18
- data/client/lanes/workspace/Pages.coffee +13 -14
- data/client/lanes/workspace/ScreensMenu.coffee +9 -18
- data/client/lanes/workspace/UIState.coffee +78 -0
- data/client/lanes/workspace/WorkspaceView.coffee +4 -1
- data/client/lanes/workspace/index.js +0 -3
- data/client/lanes/workspace/navbar.html +0 -4
- data/client/lanes/workspace/pages.html +1 -1
- data/client/lanes/workspace/styles/changes-notification.scss +57 -0
- data/client/lanes/{styles → workspace/styles}/forms.scss +0 -0
- data/client/lanes/workspace/styles/header.scss +42 -0
- data/client/lanes/{styles → workspace/styles}/keybindings.scss +0 -0
- data/client/lanes/workspace/styles/layout.scss +209 -0
- data/client/lanes/workspace/styles/screens.scss +67 -0
- data/client/lanes/workspace/styles/tabs.scss +147 -0
- data/client/lanes/workspace/styles/toolbar.scss +4 -0
- data/client/lanes/workspace/styles.scss +20 -0
- data/docs/model.md +39 -7
- data/docs/todo-example-part-1.md +7 -7
- data/docs/view.md +57 -40
- data/lib/lanes/access/authentication_provider.rb +59 -0
- data/lib/lanes/access/config/routes.rb +26 -0
- data/lib/lanes/access/config/screens.rb +16 -0
- data/lib/lanes/access/db/migrate/20140615031600_create_lanes_users.rb +12 -0
- data/lib/lanes/access/extension.rb +40 -0
- data/lib/lanes/access/locked_fields.rb +43 -0
- data/lib/lanes/access/role.rb +60 -0
- data/lib/lanes/access/role_collection.rb +76 -0
- data/lib/lanes/access/roles/administrator.rb +39 -0
- data/lib/lanes/access/roles/support.rb +15 -0
- data/lib/lanes/access/track_modifications.rb +48 -0
- data/lib/lanes/access/user.rb +128 -0
- data/lib/lanes/access/version.rb +5 -0
- data/lib/lanes/access.rb +51 -0
- data/lib/lanes/api/helper_methods.rb +2 -2
- data/lib/lanes/api/javascript_processor.rb +3 -3
- data/lib/lanes/api/null_authentication_provider.rb +1 -1
- data/lib/lanes/api/pub_sub.rb +3 -3
- data/lib/lanes/api/request_wrapper.rb +1 -1
- data/lib/lanes/api/root.rb +1 -2
- data/lib/lanes/api/sprockets_extension.rb +6 -4
- data/lib/lanes/api/test_specs.rb +2 -8
- data/lib/lanes/command/app.rb +30 -12
- data/lib/lanes/command/db.rb +3 -0
- data/lib/lanes/command/generate_model.rb +4 -4
- data/lib/lanes/command/generate_screen.rb +12 -10
- data/lib/lanes/command/generate_view.rb +12 -9
- data/lib/lanes/command/named_command.rb +7 -5
- data/lib/lanes/command/server.rb +1 -1
- data/lib/lanes/command.rb +2 -5
- data/lib/lanes/components.rb +1 -1
- data/lib/lanes/concerns/queries.rb +1 -1
- data/lib/lanes/concerns/set_attribute_data.rb +5 -7
- data/lib/lanes/db.rb +5 -4
- data/lib/lanes/extension/definition.rb +95 -0
- data/lib/lanes/extension.rb +34 -69
- data/lib/lanes/guard_tasks.rb +2 -2
- data/lib/lanes/screen.rb +8 -0
- data/lib/lanes/spec_helper.rb +1 -37
- data/lib/lanes/version.rb +1 -1
- data/lib/lanes/workspace/extension.rb +28 -0
- data/lib/lanes/workspace.rb +7 -0
- data/npm-build/package.json +2 -2
- data/spec/api/javascript_processor_spec.rb +1 -1
- data/spec/lanes/components/grid/GridSpec.coffee +31 -0
- data/{lib/lanes/command/templates/client/views → spec/lanes/helpers}/.gitkeep +0 -0
- data/spec/{helpers → lanes/helpers}/jasmine-matchers.js +0 -0
- data/spec/{helpers → lanes/helpers}/lanes-helpers.coffee +2 -4
- data/spec/lanes/helpers/mock-ajax.js +576 -0
- data/spec/lanes/models/BaseSpec.coffee +24 -37
- data/spec/lanes/models/CollectionSpec.coffee +15 -2
- data/spec/lanes/models/ModelAssociationsSpec.coffee +51 -0
- data/spec/lanes/views/BaseSpec.coffee +14 -14
- data/spec/server/command_spec.rb +39 -0
- data/spec/{concerns → server/concerns}/api_path_spec.rb +1 -1
- data/spec/{concerns → server/concerns}/association_extensions_spec.rb +1 -2
- data/spec/{concerns → server/concerns}/attr_accessor_with_default_spec.rb +0 -0
- data/spec/{concerns → server/concerns}/export_associations_spec.rb +1 -2
- data/spec/{concerns → server/concerns}/export_methods_spec.rb +1 -3
- data/spec/{concerns → server/concerns}/export_scope_spec.rb +2 -2
- data/spec/{concerns → server/concerns}/exported_limits_spec.rb +1 -2
- data/spec/{concerns → server/concerns}/pub_sub_spec.rb +1 -1
- data/spec/{concerns → server/concerns}/set_attribute_data_spec.rb +1 -1
- data/spec/{configuration_spec.rb → server/configuration_spec.rb} +1 -1
- data/spec/{helpers → server}/minitest_assertions.rb +1 -1
- data/spec/{numbers_spec.rb → server/numbers_spec.rb} +1 -2
- data/{lib/lanes/testing_models.rb → spec/server/spec_helper.rb} +17 -3
- data/spec/{strings_spec.rb → server/strings_spec.rb} +1 -1
- data/templates/Gemfile +6 -0
- data/{lib/lanes/command/templates → templates}/Guardfile +0 -0
- data/templates/Rakefile +2 -0
- data/templates/client/Extension.coffee +7 -0
- data/templates/client/Router.coffee +4 -0
- data/{lib/lanes/command/templates/public → templates/client/components}/.gitkeep +0 -0
- data/templates/client/components/Component.coffee +1 -0
- data/{lib/lanes/command/templates → templates}/client/index.js +1 -0
- data/templates/client/models/BaseModel.coffee +5 -0
- data/{lib/lanes/command/templates → templates}/client/models/Model.coffee +2 -3
- data/{lib/lanes/command/templates → templates}/client/screens/Screen.coffee +6 -1
- data/{lib/lanes/command/templates → templates}/client/screens/index.js +0 -0
- data/{lib/lanes/command/templates → templates}/client/screens/layout.html +0 -0
- data/{lib/lanes/command/templates → templates}/client/screens/styles.scss +1 -2
- data/{lib/lanes/command/templates → templates}/client/styles.scss +0 -0
- data/{spec/helpers → templates/client/views}/.gitkeep +0 -0
- data/templates/client/views/BaseView.coffee +5 -0
- data/templates/client/views/View.coffee +10 -0
- data/{lib/lanes/command/templates → templates}/client/views/template.html +0 -0
- data/{lib/lanes/command/templates → templates}/config/database.yml +0 -0
- data/{lib/lanes/command/templates → templates}/config/lanes.rb +0 -0
- data/{lib/lanes/command/templates → templates}/config/routes.rb +0 -0
- data/templates/config/screen.rb +12 -0
- data/{lib/lanes/command/templates → templates}/config.ru +1 -1
- data/{lib/lanes/command/templates → templates}/db/create_table_migration.rb +1 -1
- data/{lib/lanes/command/templates → templates}/gitignore +1 -0
- data/templates/lib/namespace/base_model.rb +11 -0
- data/{lib/lanes/command/templates → templates}/lib/namespace/extension.rb +3 -3
- data/{lib/lanes/command/templates → templates}/lib/namespace/model.rb +1 -1
- data/templates/lib/namespace/version.rb +3 -0
- data/templates/lib/namespace.rb +14 -0
- data/templates/public/.gitkeep +0 -0
- data/templates/spec/client/Screen.coffee +5 -0
- data/templates/spec/client/helpers/ClientHelpers.coffee +5 -0
- data/templates/spec/client/models/ModelSpec.coffee +5 -0
- data/templates/spec/client/views/ViewSpec.coffee +5 -0
- data/{lib/lanes/command/templates → templates}/spec/fixtures/namespace/model.yml +0 -0
- data/{lib/lanes/command/templates/spec/namespace → templates/spec/server}/model_spec.rb +2 -2
- data/{lib/lanes/command/templates/spec/spec_helper.rb → templates/spec/server/spec_helpers.rb} +3 -2
- data/views/index.erb +5 -4
- data/views/specs.erb +2 -1
- metadata +273 -238
- data/client/lanes/components/grid/vendor/dataTables.bootstrap.js +0 -156
- data/client/lanes/components/grid/vendor/datatables.responsive.js +0 -666
- data/client/lanes/components/modal/_index.scss +0 -20
- data/client/lanes/components/popover/_index.scss +0 -1
- data/client/lanes/components/record_finder/RecordFinder.coffee +0 -143
- data/client/lanes/components/select_field/SelectField.coffee +0 -87
- data/client/lanes/extension/GlAccounts.coffee +0 -9
- data/client/lanes/minimal.js +0 -11
- data/client/lanes/minimal.scss.erb +0 -12
- data/client/lanes/styles/components/all.scss +0 -6
- data/client/lanes/styles/components/changes-notification.scss +0 -44
- data/client/lanes/styles/components/suggest.scss +0 -266
- data/client/lanes/styles/index.css +0 -4
- data/client/lanes/styles/layout.scss +0 -272
- data/client/lanes/styles/screens.scss +0 -66
- data/client/lanes/styles/tabs.scss +0 -148
- data/client/lanes/styles/vendor/bootstrap.scss +0 -74
- data/client/lanes/workspace.scss.erb +0 -29
- data/client/lanes-complete.js +0 -3
- data/client/lanes-workspace.scss.erb +0 -21
- data/db/migrate/20140615031600_create_hip_users.rb +0 -17
- data/lib/lanes/command/templates/Gemfile +0 -9
- data/lib/lanes/command/templates/Rakefile +0 -2
- data/lib/lanes/command/templates/client/Extension.coffee +0 -5
- data/lib/lanes/command/templates/client/components/Component.coffee +0 -1
- data/lib/lanes/command/templates/client/models/BaseModel.coffee +0 -5
- data/lib/lanes/command/templates/client/views/BaseView.coffee +0 -5
- data/lib/lanes/command/templates/client/views/View.coffee +0 -7
- data/lib/lanes/command/templates/config/screen.rb +0 -8
- data/lib/lanes/command/templates/lib/namespace/base_model.rb +0 -9
- data/lib/lanes/command/templates/lib/namespace/version.rb +0 -3
- data/lib/lanes/command/templates/lib/namespace.rb +0 -12
- data/lib/lanes/command/templates/spec/client/Screen.coffee +0 -7
- data/lib/lanes/command/templates/spec/client/models/ModelSpec.coffee +0 -5
- data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +0 -5
- data/lib/lanes/db/migration_helpers.rb +0 -178
- data/public/javascripts/jasmine_examples/Player.js +0 -22
- data/public/javascripts/jasmine_examples/Song.js +0 -7
- data/spec/command_spec.rb +0 -49
- data/spec/helpers/jasmine-jquery.js +0 -813
@@ -0,0 +1,118 @@
|
|
1
|
+
# ------------------------------------------------------------------ #
|
2
|
+
# Handles Association definitions. #
|
3
|
+
# It creates a derived definition for each one #
|
4
|
+
# and contains utility functions to operate on them #
|
5
|
+
# ------------------------------------------------------------------ #
|
6
|
+
class Lanes.Models.AssocationMap
|
7
|
+
constructor: (@klass)->
|
8
|
+
@klass::derived ||= {}
|
9
|
+
@definitions = @klass::associations
|
10
|
+
@definitions['created_by'] ||= { model: 'Lanes.Models.User', readOnly: true }
|
11
|
+
@definitions['updated_by'] ||= { model: 'Lanes.Models.User', readOnly: true }
|
12
|
+
for name, options of @definitions
|
13
|
+
@klass::derived[name] = this.derivedDefinition(name,options)
|
14
|
+
|
15
|
+
getClassFor: (name)->
|
16
|
+
definition = @definitions[name]
|
17
|
+
object = definition.model || definition.collection
|
18
|
+
Lanes.u.findObject( object, 'Models', @klass::FILE)
|
19
|
+
|
20
|
+
getOptions: (name, definition, model)->
|
21
|
+
options = { parent: model }
|
22
|
+
if definition.options
|
23
|
+
_.extend(options, Lanes.u.resultsFor(model,definition.options))
|
24
|
+
options
|
25
|
+
|
26
|
+
# will be called in the scope of the model
|
27
|
+
createModel: (association, name, definition, fk, pk, target_klass)->
|
28
|
+
target_klass ||= association.getClassFor(name)
|
29
|
+
options = association.getOptions(name,definition,this)
|
30
|
+
model_id = this.get(pk)
|
31
|
+
if model_id && model_id == this._cache[name]?.id
|
32
|
+
this._cache[name]
|
33
|
+
else
|
34
|
+
target_klass.findOrCreate(options)
|
35
|
+
|
36
|
+
# will be called in the scope of the model
|
37
|
+
createCollection: (association, name, definition, fk, pk, target_klass)->
|
38
|
+
target_klass ||= association.getClassFor(name)
|
39
|
+
options = association.getOptions(name,definition,this)
|
40
|
+
options.filter ||= {}
|
41
|
+
options.filter[fk]=this.get(pk)
|
42
|
+
|
43
|
+
if target_klass::isCollection
|
44
|
+
new target_klass(options.models||[],options)
|
45
|
+
else
|
46
|
+
options.model=target_klass
|
47
|
+
new Lanes.Models.AssociationCollection(options.models||[],options)
|
48
|
+
# returns the definition for the derived property
|
49
|
+
derivedDefinition: (name,definition)->
|
50
|
+
# me = this
|
51
|
+
# target_klass = this.getClassFor(name)
|
52
|
+
# fk = this.fk(name) ; pk = this.pk(name)
|
53
|
+
|
54
|
+
# if definition.defaultValue
|
55
|
+
# _.defaults(args, _.evaluateFunction(definition.defaultValue))
|
56
|
+
createFn = _.partial(
|
57
|
+
if definition.model then this.createModel else this.createCollection,
|
58
|
+
this, name, definition, this.fk(name), this.pk(name), this.getClassFor(name)
|
59
|
+
)
|
60
|
+
{ deps: [this.pk(name)], fn: createFn }
|
61
|
+
|
62
|
+
# createAssocation = if definition.model then ->
|
63
|
+
# target_klass ||= me.getClassFor(name)
|
64
|
+
# _.extend(args, parent: this)
|
65
|
+
# model_id = this.get(pk)
|
66
|
+
# if model_id && model_id == this._cache[name]?.id
|
67
|
+
# this._cache[name]
|
68
|
+
# else
|
69
|
+
# target_klass.findOrCreate(args)
|
70
|
+
# else ->
|
71
|
+
# target_klass ||= me.getClassFor(name)
|
72
|
+
# filter = {}
|
73
|
+
# filter[ fk ] = this.get( pk)
|
74
|
+
# _.extend(args, filter: filter, parent: this)
|
75
|
+
# if target_klass::isCollection
|
76
|
+
# new target_klass([],args)
|
77
|
+
# else
|
78
|
+
# args.model=target_klass
|
79
|
+
# new Lanes.Models.AssociationCollection(args)
|
80
|
+
# { deps: [pk], fn: createFn }
|
81
|
+
|
82
|
+
# Sets the assocations for "model"
|
83
|
+
set: (model, data)->
|
84
|
+
for name, value of data
|
85
|
+
if @definitions[name]
|
86
|
+
attributes = if _.isFunction(value.serialize) then value.serialize() else value
|
87
|
+
model[name].set( attributes )
|
88
|
+
|
89
|
+
pk: (name)->
|
90
|
+
def = @definitions[name]
|
91
|
+
return null unless name
|
92
|
+
def.pk || ( if def.model then "#{name}_id" else "id" )
|
93
|
+
|
94
|
+
fk: (name)->
|
95
|
+
def = @definitions[name]
|
96
|
+
return null unless name
|
97
|
+
def.fk || ( if def.model then "id" else "#{name}_id" )
|
98
|
+
|
99
|
+
# returns the data from all assocations for saving
|
100
|
+
dataForSave: (model,options)->
|
101
|
+
ret = {}
|
102
|
+
options.saveDepth = ( if options.saveDepth then options.saveDepth+1 else 1 )
|
103
|
+
return ret if options.saveDepth > 5
|
104
|
+
for name, assoc_options of @definitions
|
105
|
+
unless assoc_options.readOnly
|
106
|
+
data = model[name].dataForSave(options)
|
107
|
+
unless _.isEmpty( data )
|
108
|
+
ret[name] = data
|
109
|
+
|
110
|
+
ret
|
111
|
+
|
112
|
+
# return a list of assocations from "name" that are not loaded
|
113
|
+
nonLoaded: (model, names)->
|
114
|
+
list = []
|
115
|
+
for name in names
|
116
|
+
if _.has(@definitions, name) && model[name].isNew()
|
117
|
+
list.push(name)
|
118
|
+
list
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
1
|
class ModelType extends Lanes.Models.State
|
2
|
+
|
3
3
|
constructor: ->
|
4
4
|
super
|
5
5
|
@records = {}
|
@@ -9,7 +9,7 @@ class ModelType extends Lanes.Models.State
|
|
9
9
|
records: 'object'
|
10
10
|
|
11
11
|
subscribe: (model)->
|
12
|
-
channel = "/#{model.api_path}/#{model.id}"
|
12
|
+
channel = "/#{model.api_path()}/#{model.id}"
|
13
13
|
Lanes.Vendor.MessageBus.subscribe(channel,(changes)->
|
14
14
|
model.addChangeSet(changes)
|
15
15
|
)
|
@@ -27,13 +27,13 @@ class ModelType extends Lanes.Models.State
|
|
27
27
|
delete @records[model.id]
|
28
28
|
|
29
29
|
|
30
|
-
|
31
30
|
class ModelTypesCollection extends Lanes.Models.BasicCollection
|
31
|
+
|
32
32
|
constructor: -> super
|
33
33
|
model: ModelType
|
34
34
|
|
35
35
|
forModel: (model)->
|
36
|
-
models = this.get(model.api_path) || this.add(id: model.api_path)
|
36
|
+
models = this.get(model.api_path()) || this.add(id: model.api_path())
|
37
37
|
|
38
38
|
|
39
39
|
Lanes.Models.PubSub = {
|
@@ -51,7 +51,7 @@ Lanes.Models.PubSub = {
|
|
51
51
|
@types.forModel(model).remove(model)
|
52
52
|
|
53
53
|
instanceFor: ( model_klass, id )->
|
54
|
-
@types.get(model_klass.prototype.api_path)?.records[id]?.model
|
54
|
+
@types.get(model_klass.prototype.api_path())?.records[id]?.model
|
55
55
|
|
56
56
|
clear: ->
|
57
57
|
@types = new ModelTypesCollection
|
@@ -2,21 +2,21 @@ class Field extends Lanes.Models.Base
|
|
2
2
|
|
3
3
|
constructor: (attributes)->
|
4
4
|
super( _.defaults( attributes, {
|
5
|
-
title: _.titleize(attributes.
|
5
|
+
title: _.titleize(attributes.id)
|
6
6
|
}))
|
7
7
|
|
8
8
|
session:
|
9
|
+
id: 'string'
|
9
10
|
title: 'string'
|
10
|
-
field: 'string'
|
11
11
|
selected: 'boolean'
|
12
|
-
type:
|
13
|
-
type: 'string'
|
14
|
-
default: -> @model_field?.type
|
15
12
|
|
16
13
|
derived:
|
17
14
|
model_field:
|
18
|
-
deps: ['
|
19
|
-
this.collection.query.
|
15
|
+
deps: ['id'], fn:->
|
16
|
+
this.collection.query.modelClass::_definition[@id]
|
17
|
+
type:
|
18
|
+
deps: ['model_field'], fn: ->
|
19
|
+
@model_field?.type
|
20
20
|
|
21
21
|
validValue: (value)->
|
22
22
|
if this.type == 'n'
|
@@ -30,8 +30,8 @@ class AvailableFields extends Lanes.Models.Collection
|
|
30
30
|
constructor: (models,options)->
|
31
31
|
@query = options.query
|
32
32
|
super
|
33
|
-
model: Field
|
34
33
|
|
34
|
+
model: Field
|
35
35
|
|
36
36
|
|
37
37
|
class Operator extends Lanes.Models.Base
|
@@ -76,9 +76,15 @@ class Clause extends Lanes.Models.Base
|
|
76
76
|
|
77
77
|
session:
|
78
78
|
value : { type: 'string', default: '' }
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
field : 'state'
|
80
|
+
operator : 'state'
|
81
|
+
|
82
|
+
associations:
|
83
|
+
operators : { collection: Operators }
|
84
|
+
fields:
|
85
|
+
collection: AvailableFields, options: ->
|
86
|
+
query: this.collection.query
|
87
|
+
|
82
88
|
|
83
89
|
derived:
|
84
90
|
description:
|
@@ -89,10 +95,9 @@ class Clause extends Lanes.Models.Base
|
|
89
95
|
deps: ['field', 'operator', 'value']
|
90
96
|
fn: -> this.field.validValue(@value)
|
91
97
|
|
92
|
-
|
98
|
+
constructor: (options)->
|
93
99
|
super
|
94
|
-
|
95
|
-
@fields = @collection.fields
|
100
|
+
this.fields.reset(options.available_fields.models)
|
96
101
|
@operators.field = @fields.first()
|
97
102
|
@fields.on('change:selected', this.setField, this)
|
98
103
|
@operators.on('change:selected', this.setOperator, this)
|
@@ -100,7 +105,12 @@ class Clause extends Lanes.Models.Base
|
|
100
105
|
@fields.at(0).selected = true
|
101
106
|
@operators.at(0).selected = true
|
102
107
|
|
103
|
-
|
108
|
+
|
109
|
+
setFromView: (type, val)->
|
110
|
+
if type=="fields" || type == "operators"
|
111
|
+
this[type].get(val).selected=true
|
112
|
+
else
|
113
|
+
super
|
104
114
|
|
105
115
|
setField: (field)->
|
106
116
|
return unless field.selected
|
@@ -120,7 +130,7 @@ class Clause extends Lanes.Models.Base
|
|
120
130
|
value = this.get('value')
|
121
131
|
value +='%' if 'like' == op
|
122
132
|
value = parseFloat(value) if @field.type == "n"
|
123
|
-
param[ this.field.
|
133
|
+
param[ this.field.id ] = if 'eq' == op then value else { op: op, value: value }
|
124
134
|
param
|
125
135
|
|
126
136
|
|
@@ -139,26 +149,26 @@ class Lanes.Models.Query extends Lanes.Models.Base
|
|
139
149
|
session:
|
140
150
|
fields: 'collection'
|
141
151
|
clauses: 'collection'
|
142
|
-
|
143
|
-
|
152
|
+
modelClass: 'function'
|
153
|
+
initialField: 'state'
|
144
154
|
|
145
155
|
derived:
|
146
|
-
|
147
|
-
deps:['
|
156
|
+
collection_class:
|
157
|
+
deps:['modelClass'], fn: -> @modelClass?.Collection
|
148
158
|
url:
|
149
|
-
deps:['
|
159
|
+
deps:['modelClass'], fn: -> @modelClass?::urlRoot()
|
150
160
|
|
151
161
|
constructor: (options={})->
|
152
162
|
super
|
153
163
|
@fields = new AvailableFields(
|
154
|
-
_.map( options.fields, (col)-> if _.isObject(col) then col else {
|
164
|
+
_.map( options.fields, (col)-> if _.isObject(col) then col else { id: col } ),
|
155
165
|
query: this
|
156
166
|
)
|
157
167
|
@clauses = new Clauses([], query: this )
|
158
168
|
this.listenTo(@clauses,'change remove reset', ->
|
159
169
|
this.trigger('change', arguments...)
|
160
170
|
)
|
161
|
-
@
|
171
|
+
@initialField = @fields.first()
|
162
172
|
this.addNewClause()
|
163
173
|
this
|
164
174
|
|
@@ -167,11 +177,11 @@ class Lanes.Models.Query extends Lanes.Models.Base
|
|
167
177
|
|
168
178
|
loadSingle: (code,options)->
|
169
179
|
options.query = {}
|
170
|
-
options.query[ @
|
171
|
-
@
|
180
|
+
options.query[ @initialField ] = code
|
181
|
+
@modelClass.fetch(options)
|
172
182
|
|
173
183
|
defaultField: ->
|
174
|
-
@fields.findWhere( field: @
|
184
|
+
@fields.findWhere( field: @initialField )
|
175
185
|
|
176
186
|
asParams: ->
|
177
187
|
params = {}
|
@@ -181,4 +191,4 @@ class Lanes.Models.Query extends Lanes.Models.Base
|
|
181
191
|
params
|
182
192
|
|
183
193
|
addNewClause: ->
|
184
|
-
@clauses.add({
|
194
|
+
@clauses.add({ available_fields: @fields, field: @initialField })
|
@@ -48,7 +48,7 @@ Lanes.Models.Sync = {
|
|
48
48
|
options.error = (reply, status, req)->
|
49
49
|
options.rejectPromise(
|
50
50
|
Lanes.Models.Sync.copyServerReply( record,
|
51
|
-
|
51
|
+
reply.responseJSON || {error: reply.responseText}
|
52
52
|
)
|
53
53
|
)
|
54
54
|
delete record.requestInProgress
|
@@ -2,26 +2,23 @@
|
|
2
2
|
|
3
3
|
class ScreenBase
|
4
4
|
|
5
|
-
|
5
|
+
abstractClass: true
|
6
6
|
|
7
|
+
constructor: ->
|
8
|
+
super
|
7
9
|
|
8
10
|
mixins:[
|
9
11
|
Lanes.Screens.ChangeListener
|
10
12
|
]
|
11
13
|
|
12
|
-
initializeChanges:->
|
13
|
-
@_changeListeners = {}
|
14
|
-
for keypath in ( @usingModels || ['model'] )
|
15
|
-
@_changeListeners[keypath] = new Lanes.Views.ScreenChangeListener(this, keypath)
|
16
|
-
|
17
14
|
reset: Lanes.emptyFn
|
18
15
|
|
19
|
-
|
16
|
+
templateName: 'layout'
|
20
17
|
|
21
18
|
render: ->
|
22
19
|
previouslyRendered = this.rendered
|
23
20
|
Lanes.Views.RenderContext.start(this)
|
24
|
-
#
|
21
|
+
# Here we cheat and skip ViewBase so it doesn't push to context
|
25
22
|
this.reset()
|
26
23
|
this.renderContextFree()
|
27
24
|
#Lanes.Views.Base.__super__.render.apply(this, arguments)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Lanes.Screens.ChangeListener = {
|
2
2
|
|
3
|
-
|
3
|
+
modelEvents:
|
4
4
|
'remote-update': 'onChange'
|
5
5
|
|
6
|
-
|
6
|
+
domEvents:
|
7
7
|
'show.bs.dropdown .changes-notification': 'onChangesShow'
|
8
8
|
|
9
9
|
session:
|
@@ -24,7 +24,7 @@ Lanes.Screens.ChangeListener = {
|
|
24
24
|
subviews:
|
25
25
|
changesDropDown:
|
26
26
|
hook: 'changes-display'
|
27
|
-
view: 'ModelUpdate'
|
27
|
+
view: 'Lanes.Views.ModelUpdate'
|
28
28
|
collection: 'changes'
|
29
29
|
|
30
30
|
onChange: (model,change)->
|
@@ -40,4 +40,7 @@ Lanes.Screens.ChangeListener = {
|
|
40
40
|
this.changes.invoke('updateTimeAgo')
|
41
41
|
this.$('.changes-notification .scroller').animate({ scrollTop: 0 })
|
42
42
|
|
43
|
+
# included: ->
|
44
|
+
# console.log this
|
45
|
+
|
43
46
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
class ScreenView extends Lanes.Models.BasicModel
|
2
|
+
FILE: FILE
|
2
3
|
|
3
4
|
session:
|
4
5
|
screen: 'object'
|
@@ -18,18 +19,19 @@ class ScreenView extends Lanes.Models.BasicModel
|
|
18
19
|
initialize: (options)->
|
19
20
|
super
|
20
21
|
@screen=options.screen
|
21
|
-
Lanes.
|
22
|
+
Lanes.Screens.Definitions.displaying.add( this )
|
22
23
|
this.active=true
|
23
24
|
|
24
25
|
renderScreen: ->
|
25
26
|
this.view.render()
|
26
27
|
|
27
28
|
remove: ->
|
28
|
-
Lanes.
|
29
|
+
Lanes.Screens.Definitions.displaying.remove( this )
|
29
30
|
|
30
31
|
|
31
32
|
|
32
33
|
class ScreenDefinition extends Lanes.Models.BasicModel
|
34
|
+
FILE: FILE
|
33
35
|
|
34
36
|
session:
|
35
37
|
id: 'string'
|
@@ -47,7 +49,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
|
|
47
49
|
derived:
|
48
50
|
model_type:
|
49
51
|
deps: ['model'], fn: ->
|
50
|
-
Lanes.
|
52
|
+
Lanes.u.findObject(@model, "Models", this.FILE)
|
51
53
|
|
52
54
|
initialize: ->
|
53
55
|
@views = []
|
@@ -56,7 +58,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
|
|
56
58
|
@views.push( new ScreenView( screen: this, viewport: viewport ) )
|
57
59
|
|
58
60
|
getScreen: ->
|
59
|
-
@viewModel ||= Lanes.getPath(this.view)
|
61
|
+
@viewModel ||= Lanes.u.getPath(this.view,@FILE?['Views'])
|
60
62
|
if @viewModel?
|
61
63
|
_.Promise.resolve(@viewMOdel)
|
62
64
|
else
|
@@ -69,7 +71,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
|
|
69
71
|
Lanes.lib.Request(me.assets)
|
70
72
|
.then ->
|
71
73
|
me.loading=false
|
72
|
-
me.viewModel = Lanes.getPath(me.view)
|
74
|
+
me.viewModel = Lanes.u.getPath(me.view, me.FILE?['Views'])
|
73
75
|
if me.viewModel then resolve(me.viewModel)
|
74
76
|
else reject("Screen #{me.view} not definied after file retrieval")
|
75
77
|
,(msg)->
|
@@ -84,6 +86,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
|
|
84
86
|
|
85
87
|
|
86
88
|
class ScreenViewSet extends Lanes.Models.BasicCollection
|
89
|
+
FILE: FILE
|
87
90
|
|
88
91
|
model: ScreenView
|
89
92
|
|
@@ -122,6 +125,7 @@ class ScreenViewSet extends Lanes.Models.BasicCollection
|
|
122
125
|
|
123
126
|
|
124
127
|
class ScreenSet extends Lanes.Models.BasicCollection
|
128
|
+
FILE: FILE
|
125
129
|
|
126
130
|
model: ScreenDefinition
|
127
131
|
|
@@ -134,6 +138,7 @@ class ScreenSet extends Lanes.Models.BasicCollection
|
|
134
138
|
|
135
139
|
|
136
140
|
class MenuGroup extends Lanes.Models.BasicModel
|
141
|
+
FILE: FILE
|
137
142
|
|
138
143
|
session:
|
139
144
|
id: 'string'
|
@@ -143,13 +148,16 @@ class MenuGroup extends Lanes.Models.BasicModel
|
|
143
148
|
active: ['boolean', true, false]
|
144
149
|
|
145
150
|
screens: ->
|
146
|
-
@avail ||= new Lanes.Models.SubCollection( Lanes.
|
151
|
+
@avail ||= new Lanes.Models.SubCollection( Lanes.Screens.Definitions.all, {
|
147
152
|
filter: (screen)=>
|
148
|
-
screen.group_id == @id &&
|
153
|
+
screen.group_id == @id &&
|
154
|
+
(!screen.model_type || Lanes.current_user.canRead(screen.model_type))
|
149
155
|
watched: ['group_id']
|
150
156
|
})
|
151
157
|
|
152
158
|
class MenuGroupSet extends Lanes.Models.BasicCollection
|
159
|
+
FILE: FILE
|
160
|
+
|
153
161
|
constructor: -> super
|
154
162
|
model: MenuGroup
|
155
163
|
|
@@ -160,9 +168,14 @@ class MenuGroupSet extends Lanes.Models.BasicCollection
|
|
160
168
|
mgs.screens().length > 0
|
161
169
|
})
|
162
170
|
|
171
|
+
Lanes.Screens.display_id = (screen_id)->
|
172
|
+
definition = Lanes.Screens.Definitions.all.get(screen_id)
|
173
|
+
if (definition)
|
174
|
+
definition.display()
|
175
|
+
else
|
176
|
+
Lanes.warn "Unable to find definition for screen #{screen_id}"
|
163
177
|
|
164
|
-
|
165
|
-
Lanes.Models.Screens = {
|
178
|
+
Lanes.Screens.Definitions = {
|
166
179
|
all: new ScreenSet
|
167
180
|
displaying: new ScreenViewSet([],{ single_active_only: true })
|
168
181
|
groups: new MenuGroupSet
|
@@ -5,45 +5,45 @@ Lanes.renderScreenTo = (selector, options)->
|
|
5
5
|
class Lanes.Screens.Instance
|
6
6
|
|
7
7
|
constructor: (selector, options)->
|
8
|
-
this.viewport = new Lanes.Views.Viewport({ selector: selector, instance: this })
|
9
|
-
Lanes.Models.Bootstrap.initialize(options)
|
8
|
+
this.viewport = new Lanes.Views.Viewport({ selector: selector, instance: this })
|
9
|
+
Lanes.Models.Bootstrap.initialize(options)
|
10
10
|
Lanes.$(document).ready => @boot(options)
|
11
11
|
|
12
12
|
boot: (options)->
|
13
|
-
this.root = Lanes.$( this.viewport.selector )
|
14
|
-
this.root.data().workspace = this
|
15
|
-
this.viewport.root = this.root
|
13
|
+
this.root = Lanes.$( this.viewport.selector )
|
14
|
+
this.root.data().workspace = this
|
15
|
+
this.viewport.root = this.root
|
16
16
|
|
17
17
|
Lanes.lib.ResizeSensor(this.root[0], _.bind( _.debounce( =>
|
18
|
-
@viewport.set({ width: this.root.width(), height: this.root.height() })
|
19
|
-
, 250 ), this) )
|
18
|
+
@viewport.set({ width: this.root.width(), height: this.root.height() })
|
19
|
+
, 250 ), this) )
|
20
20
|
|
21
|
-
this.root.addClass('lanes root')
|
21
|
+
this.root.addClass('lanes root')
|
22
22
|
this.root.tooltip({
|
23
23
|
viewport: '.lanes'
|
24
24
|
selector: '[data-tooltip-message]'
|
25
25
|
title: -> this.getAttribute('data-tooltip-message')
|
26
|
-
})
|
27
|
-
Lanes.Views.Keys.initialize()
|
28
|
-
Lanes.Models.PubSub.initialize() if options.pub_sub
|
29
|
-
|
30
|
-
view = Lanes.getPath(options.root_view)
|
26
|
+
})
|
27
|
+
Lanes.Views.Keys.initialize()
|
28
|
+
Lanes.Models.PubSub.initialize() if options.pub_sub
|
29
|
+
cntrl = Lanes.Extensions.controlling()
|
30
|
+
view = Lanes.u.getPath(options.root_view)
|
31
31
|
if view
|
32
|
-
this.displayInitialView(view)
|
32
|
+
this.displayInitialView(view)
|
33
33
|
else
|
34
|
-
definition=Lanes.
|
34
|
+
definition=Lanes.Screens.Definitions.all.findWhere({view: options.root_view})
|
35
35
|
if definition
|
36
36
|
definition.getScreen().then( (screen)=>
|
37
37
|
# break out of the promise so an errors during render get thrown properly
|
38
|
-
_.defer( => @displayInitialView(screen)
|
38
|
+
_.defer( => @displayInitialView(screen) )
|
39
39
|
,(msg)->
|
40
|
-
Lanes.fatal("Unable to load initial screen ${options.root_view}", msg)
|
40
|
+
Lanes.fatal("Unable to load initial screen ${options.root_view}", msg)
|
41
41
|
)
|
42
42
|
else
|
43
|
-
Lanes.fatal(options.root_view + " doesn't exist!")
|
43
|
+
Lanes.fatal(options.root_view + " doesn't exist!")
|
44
44
|
|
45
45
|
displayInitialView:(view)->
|
46
|
-
this.view = new view({parent: this, model: this.viewport}).render()
|
47
|
-
this.viewport.el = this.view.$el
|
48
|
-
this.root.append( this.view.el )
|
49
|
-
Lanes.Extensions.fireOnAvailable(this)
|
46
|
+
this.view = new view({parent: this, model: this.viewport}).render()
|
47
|
+
this.viewport.el = this.view.$el
|
48
|
+
this.root.append( this.view.el )
|
49
|
+
Lanes.Extensions.fireOnAvailable(this)
|
@@ -4,12 +4,12 @@ require_asset screen.js
|
|
4
4
|
end %>
|
5
5
|
|
6
6
|
<% Lanes::Screen.each_group do | spec | %>
|
7
|
-
Lanes.
|
7
|
+
Lanes.Screens.Definitions.groups.add( <%= spec.to_json %> );
|
8
8
|
<% end %>
|
9
9
|
|
10
10
|
<% Lanes::Screen.each do | spec | %>
|
11
|
-
Lanes.
|
11
|
+
Lanes.Screens.Definitions.register( <%= spec.to_json %> );
|
12
12
|
<% end %>
|
13
13
|
|
14
|
-
<%
|
14
|
+
<% Lanes::Screen.uncache_file_on_update(self) %>
|
15
15
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|