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,60 @@
|
|
1
|
+
module Lanes
|
2
|
+
module Access
|
3
|
+
|
4
|
+
class Role
|
5
|
+
class_attribute :read, :write, :delete
|
6
|
+
|
7
|
+
def initialize(user)
|
8
|
+
@user = user
|
9
|
+
end
|
10
|
+
|
11
|
+
def can_read?(model)
|
12
|
+
read.include?(model)
|
13
|
+
end
|
14
|
+
|
15
|
+
def can_write?(model)
|
16
|
+
write.include?(model)
|
17
|
+
end
|
18
|
+
|
19
|
+
def can_delete?(model)
|
20
|
+
delete.include?(model)
|
21
|
+
end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
ALL=Array.new
|
25
|
+
|
26
|
+
def grant_global_access(types=[:read,:write,:delete], *klass)
|
27
|
+
types = [*types]
|
28
|
+
ALL.each do | child |
|
29
|
+
types.each{ |type| child.send(type).concat(klass) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def inherited(subklass)
|
34
|
+
ALL << subklass
|
35
|
+
subklass.read = []; subklass.write = []; subklass.delete = []
|
36
|
+
end
|
37
|
+
|
38
|
+
def grant( *klasses )
|
39
|
+
self.read.push( *klasses )
|
40
|
+
write.push( *klasses )
|
41
|
+
delete.push( *klasses )
|
42
|
+
end
|
43
|
+
|
44
|
+
def lock(klass, attribute)
|
45
|
+
LockedFields.lock( klass, attribute, self)
|
46
|
+
end
|
47
|
+
|
48
|
+
def lock_writes(klass, attribute)
|
49
|
+
LockedFields.lock( klass, attribute, self, :write)
|
50
|
+
end
|
51
|
+
|
52
|
+
def all_available
|
53
|
+
ALL
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Lanes
|
2
|
+
module Access
|
3
|
+
|
4
|
+
class RoleCollection
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(user)
|
8
|
+
@roles ||= user.role_names.map{ |name|
|
9
|
+
"Lanes::Access::Roles::#{name.classify}".safe_constantize
|
10
|
+
}.compact.map{ |klass| klass.new(user) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def exposed_data
|
14
|
+
@roles.map{ |role| role.class.to_s.demodulize.downcase }
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param model [Lanes::Model]
|
18
|
+
# @param attribute [Symbol]
|
19
|
+
# @return [Boolean] Can the User view the model?
|
20
|
+
def can_read?(model, attribute = nil)
|
21
|
+
klass=model_to_class(model)
|
22
|
+
test_access(klass, attribute, :read){ |role| role.can_read?(klass) }
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param model [Lanes::Model]
|
26
|
+
# @param attribute [Symbol]
|
27
|
+
# @return [Boolean] Can the User create and update the model?
|
28
|
+
def can_write?(model, attribute = nil)
|
29
|
+
klass=model_to_class(model)
|
30
|
+
test_access(klass, attribute, :write){ |role| role.can_write?(klass) }
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param model [Lanes::Model]
|
34
|
+
# @param id [Fixnum] the id of the record to remove
|
35
|
+
# @return [Boolean] Can the User delete the model?
|
36
|
+
def can_delete?(model,id)
|
37
|
+
klass=model_to_class(model)
|
38
|
+
@roles.each{ |role| role.can_delete?(klass) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Array<symbol>] list of roles
|
42
|
+
def to_sym
|
43
|
+
@roles.map{ |r| r.class.to_s.demodulize.downcase.to_sym }
|
44
|
+
end
|
45
|
+
|
46
|
+
def each
|
47
|
+
@roles.each{|r| yield r}
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def model_to_class(model)
|
53
|
+
model.is_a?(Class) ? model : model.class
|
54
|
+
end
|
55
|
+
|
56
|
+
# Test if the given roles grant access to the model
|
57
|
+
def test_access(model, attribute, access_type)
|
58
|
+
# Check if the attribute is locked
|
59
|
+
# If it is, the locks determine access, otherwise use the model's grants
|
60
|
+
roles = LockedFields.roles_needed_for(model, attribute, access_type)
|
61
|
+
if roles.empty?
|
62
|
+
return !!@roles.detect { |role| yield role }.present?
|
63
|
+
else
|
64
|
+
roles.any?{ |role| role.models_include?(model) }
|
65
|
+
#!!roles.find { |role| @roles.map(&:class).include?(role) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
require_relative "roles/support"
|
76
|
+
require_relative "roles/administrator"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Lanes
|
2
|
+
module Access
|
3
|
+
|
4
|
+
module Roles
|
5
|
+
|
6
|
+
class Administrator < Role
|
7
|
+
|
8
|
+
def self.grant_global_access!
|
9
|
+
|
10
|
+
self.grant( *Lanes::Model.descendants )
|
11
|
+
|
12
|
+
LockedFields.definitions.each do | klass, fields |
|
13
|
+
fields.each do |field, grants|
|
14
|
+
grants.push({ role: self, only: nil })
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def can_read?(model)
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def can_write?(model)
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def can_delete?(model)
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
lock User, :password_digest
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Lanes::Concerns
|
2
|
+
|
3
|
+
# Extends Rails updated_by and created_by timestamps to also track who created and updated the model.
|
4
|
+
# It reads the current user's id from User.current_id when saving and updating the record
|
5
|
+
# The class_name for the created_by and updated_by is set to {Lanes::Configuration#user_model}
|
6
|
+
module TrackModifications
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
class_attribute :record_modifications, :instance_writer=>false
|
11
|
+
self.record_modifications = true
|
12
|
+
|
13
|
+
belongs_to :created_by, :class_name=>Lanes::User
|
14
|
+
belongs_to :updated_by, :class_name=>Lanes::User
|
15
|
+
|
16
|
+
self.blacklist_attributes :created_at, :updated_at, :created_by_id, :updated_by_id
|
17
|
+
before_update :record_update_modifications
|
18
|
+
before_create :record_create_modifications
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def _record_user_to_column( column )
|
24
|
+
user_id = Lanes::User.current_id ? Lanes::User.current_id : 0
|
25
|
+
write_attribute( column, user_id ) if self.class.column_names.include?( column )
|
26
|
+
end
|
27
|
+
|
28
|
+
def record_create_modifications
|
29
|
+
if self.record_modifications
|
30
|
+
_record_user_to_column('updated_by_id')
|
31
|
+
_record_user_to_column('created_by_id')
|
32
|
+
end
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def record_update_modifications
|
37
|
+
if self.record_modifications && should_record_timestamps?
|
38
|
+
_record_user_to_column('updated_by_id')
|
39
|
+
end
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
def change_tracking_fields
|
44
|
+
%w{updated_by_id created_by_id updated_at created_at}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Lanes
|
2
|
+
|
3
|
+
class User < Lanes::Model
|
4
|
+
self.table_name = 'lanes_users'
|
5
|
+
|
6
|
+
has_secure_password
|
7
|
+
validates :login, :name, :email, presence: true
|
8
|
+
validates :email, email: true, uniqueness: { case_sensitive: false }
|
9
|
+
validates :password, length: { minimum: 6 }, allow_nil: true
|
10
|
+
|
11
|
+
whitelist_attributes :password
|
12
|
+
|
13
|
+
def roles
|
14
|
+
@cached_roles ||= Access::RoleCollection.new(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def workspace_data
|
18
|
+
my_data = attributes.slice('id','login','name','email','created_at',
|
19
|
+
'created_by','updated_at','updated_by','role_names')
|
20
|
+
{ user: my_data, access: Access.for_user(self) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param model [Lanes::Model]
|
24
|
+
# @param attribute [Symbol]
|
25
|
+
# @return [Boolean] Can the User view the model?
|
26
|
+
def can_read?(model, attribute = nil)
|
27
|
+
roles.can_read?(model, attribute)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param model [Lanes::Model]
|
31
|
+
# @param attribute [Symbol]
|
32
|
+
# @return [Boolean] Can the User create and update the model?
|
33
|
+
def can_write?(model, attribute = nil)
|
34
|
+
roles.can_write?(model, attribute)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param model [Lanes::Model]
|
38
|
+
# @param id [Numberic] the id for the model
|
39
|
+
# @return [Boolean] Can the User delete the model?
|
40
|
+
def can_delete?(model, id)
|
41
|
+
roles.can_delete?(model, id)
|
42
|
+
end
|
43
|
+
|
44
|
+
# We override the default implementation so that we can gaurantee
|
45
|
+
# that the current user can always update their own information
|
46
|
+
USER_EDITABLE_ATTRIBUTES=[:name, :email, :password]
|
47
|
+
def setting_attribute_is_allowed?(name, user)
|
48
|
+
( !new_record? && user.id == self.id && USER_EDITABLE_ATTRIBUTES.include?(name) ) ? true : super
|
49
|
+
end
|
50
|
+
def can_write_attributes?( attr, user )
|
51
|
+
( !new_record? && user.id == self.id ) ? true : super
|
52
|
+
end
|
53
|
+
def self.can_write_attributes?( attr, user )
|
54
|
+
( attr[:id] && attr[:id].to_i == user.id ) ? true : super
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
# If all that's needed is the user's id, see `current_id`,
|
60
|
+
# that method does not not attempt to instantiate a User
|
61
|
+
# Defaults to nil
|
62
|
+
# @return [User] The user who's currently interacting with Lanes.
|
63
|
+
def self.current
|
64
|
+
uid = Thread.current[:lanes_current_user]
|
65
|
+
if uid.is_a?(User)
|
66
|
+
uid
|
67
|
+
else
|
68
|
+
user = Thread.current[:lanes_current_user] = User.find_by_id(uid)
|
69
|
+
return user ? user.id : nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Retrieve the current id of the user we're proxying for.
|
74
|
+
# get's a bit complicated since we can proxy both for a user object
|
75
|
+
# or just the user's id
|
76
|
+
# @return [Fixnum] current user's ID. If the current user is not set, returns 0
|
77
|
+
def self.current_id
|
78
|
+
uid = Thread.current[:lanes_current_user]
|
79
|
+
if uid.nil?
|
80
|
+
0
|
81
|
+
elsif uid.is_a?(User)
|
82
|
+
uid.id
|
83
|
+
else
|
84
|
+
uid
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# sets the user for the duration of the block
|
89
|
+
# @example Inside a Rails controller
|
90
|
+
#
|
91
|
+
# class DocumentsController < ApplicationController
|
92
|
+
# around_filter :set_lanes_user
|
93
|
+
#
|
94
|
+
# # update's the Document's owner to current
|
95
|
+
# # But sets all the notes to be owned by admin
|
96
|
+
# def update_owner
|
97
|
+
# doc = Document.find(params[:id])
|
98
|
+
# doc.current_owner = Lanes::User.current
|
99
|
+
# Lanes::User.scoped_to( admin_user ) do
|
100
|
+
# doc.notes.each{ |note| note.set_owner_to_current! } # will set to Lanese::User.current
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# private
|
105
|
+
#
|
106
|
+
# def set_lanes_user
|
107
|
+
# Lanes::User.scoped_to( session[:user_id] ) do
|
108
|
+
# yield
|
109
|
+
# end
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# @return [UserProxy] self
|
114
|
+
def self.scoped_to( user )
|
115
|
+
prev_user, Thread.current[:lanes_current_user] = self.current, user
|
116
|
+
yield user
|
117
|
+
ensure
|
118
|
+
Thread.current[:lanes_current_user] = prev_user
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
require_relative "track_modifications"
|
124
|
+
|
125
|
+
# We can only use the TrackModifications concern after the User model is defined
|
126
|
+
Model.send(:include, Concerns::TrackModifications )
|
127
|
+
|
128
|
+
end
|
data/lib/lanes/access.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative 'workspace'
|
2
|
+
|
3
|
+
module Lanes
|
4
|
+
|
5
|
+
module Access
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def _type_to_ref(klass)
|
10
|
+
klass.to_s.sub(/^(\w+).*?(\w+)$/,'\1.Models.\2')
|
11
|
+
end
|
12
|
+
|
13
|
+
def _type_to_id(klass)
|
14
|
+
( klass.is_a?(Class) ? klass : klass.class ).to_s.demodulize.underscore
|
15
|
+
end
|
16
|
+
|
17
|
+
def for_user( user )
|
18
|
+
{
|
19
|
+
:roles => user.roles.map{ | role |
|
20
|
+
{
|
21
|
+
type: _type_to_id(role),
|
22
|
+
read: role.read.map{ |klass| _type_to_ref(klass) },
|
23
|
+
write: role.write.map{ |klass| _type_to_ref(klass) },
|
24
|
+
delete: role.delete.map{ |klass| _type_to_ref(klass) }
|
25
|
+
}
|
26
|
+
},
|
27
|
+
:locked_fields => LockedFields.definitions.map{ | klass, locks |
|
28
|
+
{
|
29
|
+
type: _type_to_ref(klass),
|
30
|
+
locks: locks.each_with_object({}) do |(field, grants), result|
|
31
|
+
result[field] = grants.map do |grant|
|
32
|
+
{ role: _type_to_id(grant[:role]), only: grant[:only] }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
require_relative 'access/user'
|
46
|
+
require_relative 'access/authentication_provider'
|
47
|
+
require_relative 'access/locked_fields'
|
48
|
+
require_relative 'access/role'
|
49
|
+
require_relative 'access/role_collection'
|
50
|
+
require_relative 'access/track_modifications'
|
51
|
+
require_relative 'access/extension'
|
@@ -4,11 +4,11 @@ module Lanes
|
|
4
4
|
module HelperMethods
|
5
5
|
|
6
6
|
def lanes_javascript_tag
|
7
|
-
javascript_tag(
|
7
|
+
javascript_tag( 'lanes' )
|
8
8
|
end
|
9
9
|
|
10
10
|
def lanes_stylesheet_tag
|
11
|
-
stylesheet_tag(
|
11
|
+
stylesheet_tag( 'lanes' )
|
12
12
|
end
|
13
13
|
|
14
14
|
def client_bootstrap_data
|
@@ -22,7 +22,7 @@ module Lanes
|
|
22
22
|
def wrap_js(scope, js)
|
23
23
|
dirs = scope.logical_path.split(File::SEPARATOR)
|
24
24
|
ns = dirs.many? ? dirs.first.camelize : nil
|
25
|
-
|
25
|
+
path = "[" + dirs.map{|d| "\"#{d}\"" }.join(",") + "]"
|
26
26
|
# if the file is being loaded under the "lanes" directory
|
27
27
|
# it's not an extension
|
28
28
|
if ns && ns != "Lanes"
|
@@ -30,11 +30,11 @@ module Lanes
|
|
30
30
|
ref = "(window.Lanes ? window.Lanes['#{ns}'] : null)"
|
31
31
|
"(function(Lanes, #{ns}, _, window, FILE, undefined)"\
|
32
32
|
"{\n#{js}\n})(window.Lanes,#{ref},window._, window,"\
|
33
|
-
"{namespace:#{ref},extensionName:'#{ns}',path
|
33
|
+
"{namespace:#{ref},extensionName:'#{ns}',path:#{path}});"
|
34
34
|
else
|
35
35
|
"(function(Lanes, _, window, FILE, undefined)"\
|
36
36
|
"{\n#{js}\n})(window.Lanes,window._, window,"\
|
37
|
-
"{namespace:window.Lanes,extensionName:'Lanes',path
|
37
|
+
"{namespace:window.Lanes,extensionName:'Lanes',path:#{path}});"
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
data/lib/lanes/api/pub_sub.rb
CHANGED
@@ -4,15 +4,15 @@ module Lanes
|
|
4
4
|
class PubSub
|
5
5
|
|
6
6
|
def self.publish(channel, data)
|
7
|
-
MessageBus.publish channel, data
|
7
|
+
MessageBus.publish channel, data
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.initialize(api)
|
10
|
+
def self.initialize(api=nil)
|
11
11
|
return unless Extensions.require_pub_sub?
|
12
12
|
require "oj"
|
13
13
|
require_relative "updates"
|
14
14
|
require 'message_bus'
|
15
|
-
api.use MessageBus::Rack::Middleware
|
15
|
+
api.use MessageBus::Rack::Middleware if api
|
16
16
|
|
17
17
|
# Use OJ - it encodes dates properly as ISO 8601
|
18
18
|
# https://github.com/moment/moment/issues/1407
|
data/lib/lanes/api/root.rb
CHANGED
@@ -23,7 +23,6 @@ module Lanes
|
|
23
23
|
use Rack::Session::Cookie, :key => 'lanes.session', :secret => Lanes.config.session_secret_key_base
|
24
24
|
use ActiveRecord::ConnectionAdapters::ConnectionManagement
|
25
25
|
error do
|
26
|
-
Lanes.logger.warn request.env['sinatra.error']#.backtrace
|
27
26
|
Oj.dump({
|
28
27
|
success: false,
|
29
28
|
errors: { exception: request.env['sinatra.error'].message },
|
@@ -36,7 +35,7 @@ module Lanes
|
|
36
35
|
set :show_exceptions, false
|
37
36
|
DB.establish_connection
|
38
37
|
PubSub.initialize(self)
|
39
|
-
Extensions.
|
38
|
+
Extensions.load_controlling_config
|
40
39
|
# late load in case an extension has provided an alternative implementation
|
41
40
|
require "lanes/api/null_authentication_provider" unless API.const_defined?(:AuthenticationProvider)
|
42
41
|
# use Rack::Csrf, :skip=>['GET:/'], :raise => true
|
@@ -15,14 +15,13 @@ module Lanes
|
|
15
15
|
Lanes::API::SprocketsExtension.configure(env, compress:true)
|
16
16
|
manifest = Sprockets::Manifest.new( env.index, "public/assets/manifest.json" )
|
17
17
|
manifest.compile('lanes/workspace.js', 'lanes/workspace.css',
|
18
|
-
'lanes/minimal.js',
|
18
|
+
'lanes/minimal.js', 'lanes/minimal.css' )
|
19
19
|
Extensions.each{|ext|
|
20
20
|
manifest.compile(ext.client_images.map(&:to_s))
|
21
21
|
}
|
22
|
-
|
23
|
-
manifest.compile( screen.
|
22
|
+
Screen.each do | screen |
|
23
|
+
manifest.compile( screen.assets ) unless screen.assets.blank?
|
24
24
|
end
|
25
|
-
|
26
25
|
end
|
27
26
|
|
28
27
|
def configure(env, compress:false)
|
@@ -32,9 +31,12 @@ module Lanes
|
|
32
31
|
env.cache = ::Sprockets::Cache::FileStore.new(Pathname.pwd.join('tmp','cache'))
|
33
32
|
end
|
34
33
|
end
|
34
|
+
|
35
35
|
Lanes::Extensions.each do | ext |
|
36
|
+
ext.on_boot
|
36
37
|
ext.client_paths.each{ |path| env.append_path(path) }
|
37
38
|
end
|
39
|
+
|
38
40
|
if compress
|
39
41
|
require_relative 'sprockets_compressor'
|
40
42
|
env.js_compressor = AssetCompressor
|
data/lib/lanes/api/test_specs.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'jasmine-core'
|
2
|
-
require 'lanes/command'
|
3
2
|
|
4
3
|
module Lanes
|
5
4
|
module API
|
6
5
|
|
7
|
-
|
6
|
+
|
8
7
|
class TestSpecs
|
9
8
|
|
10
9
|
cattr_accessor :current
|
@@ -21,7 +20,6 @@ module Lanes
|
|
21
20
|
def js_files
|
22
21
|
urlpath(Jasmine::Core.js_files) +
|
23
22
|
urlpath(Jasmine::Core.boot_files) +
|
24
|
-
urlpath(spec_files("helpers")) +
|
25
23
|
urlpath(spec_files(extension.identifier))
|
26
24
|
end
|
27
25
|
|
@@ -40,13 +38,9 @@ module Lanes
|
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
|
-
ext = Lanes::Command.load_current_extension ||
|
45
|
-
LanesDummyExt.new('lanes', Pathname.new(__FILE__).dirname.join("../../../"))
|
41
|
+
ext = Extensions.controlling
|
46
42
|
TestSpecs.current = TestSpecs.new(ext)
|
47
43
|
Root.sprockets.append_path(ext.root_path.join("spec"))
|
48
|
-
|
49
|
-
|
50
44
|
Root.sprockets.append_path(Jasmine::Core.path)
|
51
45
|
|
52
46
|
routes.draw do
|
data/lib/lanes/command/app.rb
CHANGED
@@ -9,7 +9,8 @@ module Lanes
|
|
9
9
|
|
10
10
|
|
11
11
|
def load_namespace # override
|
12
|
-
@namespace = name
|
12
|
+
@namespace = name.underscore.camelize
|
13
|
+
@identifier = @namespace.underscore.dasherize
|
13
14
|
end
|
14
15
|
|
15
16
|
def set_variables
|
@@ -18,16 +19,17 @@ module Lanes
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def create_files
|
21
|
-
["Gemfile", "Rakefile", "Guardfile", "config.ru", "config/database.yml"].each do | file |
|
22
|
-
template file
|
22
|
+
["Gemfile", "Rakefile", "Guardfile", "config.ru", "config/database.yml"].each do | file | template file
|
23
23
|
end
|
24
|
-
template "lib/namespace.rb", "lib/#{
|
25
|
-
template "lib/namespace/version.rb", "lib/#{
|
26
|
-
template "lib/namespace/extension.rb", "lib/#{
|
27
|
-
template "lib/namespace/base_model.rb", "lib/#{
|
24
|
+
template "lib/namespace.rb", "lib/#{identifier}.rb"
|
25
|
+
template "lib/namespace/version.rb", "lib/#{identifier}/version.rb"
|
26
|
+
template "lib/namespace/extension.rb", "lib/#{identifier}/extension.rb"
|
27
|
+
template "lib/namespace/base_model.rb", "lib/#{identifier}/model.rb"
|
28
28
|
template "config/routes.rb"
|
29
29
|
template "config/lanes.rb"
|
30
30
|
template "gitignore",".gitignore"
|
31
|
+
create_file "lib/#{identifier}/models/empty.rb",""
|
32
|
+
create_file "log/.gitkeep",""
|
31
33
|
create_file "tmp/.gitkeep",""
|
32
34
|
create_file "db/.gitkeep", ""
|
33
35
|
create_file "config/screens.rb"
|
@@ -41,18 +43,34 @@ module Lanes
|
|
41
43
|
end
|
42
44
|
template "client/models/BaseModel.coffee", "#{client_dir}/models/Base.coffee"
|
43
45
|
template "client/views/BaseView.coffee", "#{client_dir}/views/Base.coffee"
|
44
|
-
template "client/index.js",
|
45
|
-
template "client/Extension.coffee",
|
46
|
-
template "client/
|
46
|
+
template "client/index.js", "#{client_dir}/index.js"
|
47
|
+
template "client/Extension.coffee", "#{client_dir}/Extension.coffee"
|
48
|
+
template "client/Router.coffee", "#{client_dir}/Router.coffee"
|
49
|
+
template "client/styles.scss", "#{client_dir}/styles.scss"
|
47
50
|
end
|
48
51
|
|
49
|
-
def
|
50
|
-
|
52
|
+
def create_spec_helpers
|
53
|
+
template "spec/client/helpers/ClientHelpers.coffee",
|
54
|
+
"#{spec_dir}/helpers/#{namespace}Helpers.coffee"
|
55
|
+
template "spec/server/spec_helpers.rb",
|
56
|
+
"spec/server/spec_helpers.rb"
|
51
57
|
end
|
52
58
|
|
53
59
|
def create_first_screen
|
60
|
+
options = self.options.dup
|
61
|
+
@class_name = "Base"
|
62
|
+
@template = "<div><h1>Base Screen</h1></div>"
|
63
|
+
options[:description] = "Base Screen for #{namespace.titleize}"
|
64
|
+
options[:fileless] = true
|
65
|
+
screen_id = 'base'
|
54
66
|
template "client/screens/Screen.coffee", "#{client_dir}/screens/Base.coffee"
|
67
|
+
template "spec/client/Screen.coffee", "#{spec_dir}/screens/Base.coffee"
|
68
|
+
insert_into_file "config/screens.rb", after: "" do
|
69
|
+
source = File.expand_path(find_in_source_paths("config/screen.rb"))
|
70
|
+
ERB.new(::File.binread(source), nil, "-","@output_buffer").result(binding)
|
71
|
+
end
|
55
72
|
end
|
73
|
+
|
56
74
|
end
|
57
75
|
|
58
76
|
end
|