underworld 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/LICENSE +339 -0
- data/Rakefile +48 -0
- data/app/assets/fonts/DroidNaskh-Bold.ttf +0 -0
- data/app/assets/fonts/DroidNaskh-Regular.ttf +0 -0
- data/app/assets/fonts/OpenSans-Bold.ttf +0 -0
- data/app/assets/fonts/OpenSans-BoldItalic.ttf +0 -0
- data/app/assets/fonts/OpenSans-ExtraBold.ttf +0 -0
- data/app/assets/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- data/app/assets/fonts/OpenSans-Italic.ttf +0 -0
- data/app/assets/fonts/OpenSans-Light.ttf +0 -0
- data/app/assets/fonts/OpenSans-LightItalic.ttf +0 -0
- data/app/assets/fonts/OpenSans-Regular.ttf +0 -0
- data/app/assets/fonts/OpenSans-Semibold.ttf +0 -0
- data/app/assets/fonts/OpenSans-SemiboldItalic.ttf +0 -0
- data/app/assets/images/underworld/select2-spinner.gif +0 -0
- data/app/assets/images/underworld/select2.png +0 -0
- data/app/assets/images/underworld/select2x2.png +0 -0
- data/app/assets/javascripts/underworld/application.js +16 -0
- data/app/assets/javascripts/underworld/dashboard/application.js.erb +30 -0
- data/app/assets/javascripts/underworld/dashboard/functions.js.erb +50 -0
- data/app/assets/javascripts/underworld/dashboard/init.js.coffee +33 -0
- data/app/assets/javascripts/underworld/dashboard/lib/actions.js +7 -0
- data/app/assets/javascripts/underworld/dashboard/lib/amd.js.coffee.erb +0 -0
- data/app/assets/javascripts/underworld/dashboard/lib/flash_message.js +71 -0
- data/app/assets/javascripts/underworld/dashboard/lib/locale.js +14 -0
- data/app/assets/javascripts/underworld/dashboard/lib/misc.js +5 -0
- data/app/assets/javascripts/underworld/dashboard/lib/string.js +3 -0
- data/app/assets/javascripts/underworld/dashboard/lib/ujs_patches.js.coffee +28 -0
- data/app/assets/javascripts/underworld/dashboard/manifest.js +5 -0
- data/app/assets/javascripts/underworld/dashboard/variables.js.erb +6 -0
- data/app/assets/javascripts/underworld/groups.js +2 -0
- data/app/assets/javascripts/underworld/home.js +2 -0
- data/app/assets/javascripts/underworld/i18n.js +13 -0
- data/app/assets/javascripts/underworld/simple.js +20 -0
- data/app/assets/javascripts/underworld/users.js +2 -0
- data/app/assets/stylesheets/underworld/dashboard/loadindicator.scss +17 -0
- data/app/assets/stylesheets/underworld/dashboard/ltr/application.css +38 -0
- data/app/assets/stylesheets/underworld/dashboard/ltr/base.css.scss +0 -0
- data/app/assets/stylesheets/underworld/dashboard/rtl/application.css +11 -0
- data/app/assets/stylesheets/underworld/dashboard/rtl/base.css.scss +0 -0
- data/app/assets/stylesheets/underworld/dashboard/share.scss +62 -0
- data/app/assets/stylesheets/underworld/dashboard/variables.scss +9 -0
- data/app/assets/stylesheets/underworld/ltr/application.css +0 -0
- data/app/assets/stylesheets/underworld/rtl/application.css +0 -0
- data/app/assets/stylesheets/underworld/simple/ltr/application.css +2 -0
- data/app/assets/stylesheets/underworld/simple/rtl/application.css +2 -0
- data/app/assets/stylesheets/underworld/simple/rtl/rtl.scss +16 -0
- data/app/assets/stylesheets/underworld/simple/share.scss +11 -0
- data/app/controllers/underworld/api_controller.rb +133 -0
- data/app/controllers/underworld/application_controller.rb +16 -0
- data/app/controllers/underworld/assets_controller.rb +6 -0
- data/app/controllers/underworld/dashboard/application_controller.rb +43 -0
- data/app/controllers/underworld/dashboard/groups_controller.rb +85 -0
- data/app/controllers/underworld/dashboard/profile_controller.rb +49 -0
- data/app/controllers/underworld/dashboard/user_messages_controller.rb +27 -0
- data/app/controllers/underworld/dashboard/users_controller.rb +116 -0
- data/app/controllers/underworld/dashboard_controller.rb +16 -0
- data/app/controllers/underworld/omniauth/callbacks_controller.rb +24 -0
- data/app/helpers/underworld/application_helper.rb +4 -0
- data/app/helpers/underworld/dashboard_helper.rb +107 -0
- data/app/helpers/underworld/groups_helper.rb +4 -0
- data/app/helpers/underworld/home_helper.rb +4 -0
- data/app/helpers/underworld/users_helper.rb +8 -0
- data/app/models/application_record.rb +3 -0
- data/app/models/underworld/concerns/assignment.rb +16 -0
- data/app/models/underworld/concerns/user/auth_definitions.rb +87 -0
- data/app/models/underworld/concerns/user/gravatar.rb +11 -0
- data/app/models/underworld/concerns/user/mongoid_fields.rb +81 -0
- data/app/models/underworld/concerns/user/permission.rb +47 -0
- data/app/models/underworld/concerns/user/user_roles.rb +24 -0
- data/app/models/underworld/group.rb +57 -0
- data/app/models/underworld/permission.rb +43 -0
- data/app/models/underworld/user.rb +81 -0
- data/app/models/underworld/user_message.rb +6 -0
- data/app/policies/underworld/admin_only_policy.rb +66 -0
- data/app/policies/underworld/application_policy.rb +55 -0
- data/app/policies/underworld/group_policy.rb +8 -0
- data/app/policies/underworld/user_message_policy.rb +9 -0
- data/app/policies/underworld/user_policy.rb +9 -0
- data/app/views/angular/auth/groups/details.html +2 -0
- data/app/views/angular/auth/groups/index.html +2 -0
- data/app/views/angular/auth/groups/new.html +2 -0
- data/app/views/angular/auth/index.html +30 -0
- data/app/views/angular/auth/profile/edit.html +54 -0
- data/app/views/angular/auth/users/details.html +28 -0
- data/app/views/angular/auth/users/index.html +6 -0
- data/app/views/angular/auth/users/new.html +57 -0
- data/app/views/angular/conversations/details.html +19 -0
- data/app/views/angular/conversations/index.html +13 -0
- data/app/views/angular/conversations/new.html +39 -0
- data/app/views/angular/conversations/show.html +6 -0
- data/app/views/angular/conversations/show_details.html +15 -0
- data/app/views/angular/fields/boolean/boolean.html +4 -0
- data/app/views/angular/fields/control-combo/control-list.html +19 -0
- data/app/views/angular/fields/datetime/datetime.html +10 -0
- data/app/views/angular/fields/datetime/time.html +25 -0
- data/app/views/angular/fields/file/file.html.slim +0 -0
- data/app/views/angular/fields/float/float.html +4 -0
- data/app/views/angular/fields/image/image.html +1 -0
- data/app/views/angular/fields/integer/integer.html +4 -0
- data/app/views/angular/fields/relation/relation.html +44 -0
- data/app/views/angular/fields/string/string.html +22 -0
- data/app/views/angular/fields/tag/tag.html +1 -0
- data/app/views/angular/fields/text/text.html +4 -0
- data/app/views/angular/filter/index.html +15 -0
- data/app/views/angular/index.html +3 -0
- data/app/views/angular/locale/fa.po +25 -0
- data/app/views/angular/locale/templates.pot +24 -0
- data/app/views/angular/logs/index.html +6 -0
- data/app/views/angular/modules.html +0 -0
- data/app/views/angular/nav.html.erb +39 -0
- data/app/views/angular/underworld/views/generic_add_view.html.slim +5 -0
- data/app/views/devise/registrations/edit.html.erb +29 -0
- data/app/views/devise/registrations/new.html.erb +38 -0
- data/app/views/devise/sessions/new.html.erb +37 -0
- data/app/views/devise/shared/_links.erb +19 -0
- data/app/views/devise/shared/_omni_link.erb +33 -0
- data/app/views/kaminari/_first_page.html.slim +3 -0
- data/app/views/kaminari/_gap.html.slim +2 -0
- data/app/views/kaminari/_last_page.html.slim +3 -0
- data/app/views/kaminari/_next_page.html.slim +3 -0
- data/app/views/kaminari/_page.html.slim +3 -0
- data/app/views/kaminari/_paginator.html.slim +13 -0
- data/app/views/kaminari/_prev_page.html.slim +3 -0
- data/app/views/layouts/underworld/application.html.erb +79 -0
- data/app/views/layouts/underworld/dashboard.html.erb +52 -0
- data/app/views/layouts/underworld/simple.html.erb +27 -0
- data/app/views/underworld/api/v1/conversations/create.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/conversations/destroy.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/conversations/index.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/conversations/reply.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/conversations/show.json.jbuilder +14 -0
- data/app/views/underworld/api/v1/conversations/trash.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/groups/create.json.jbuilder +4 -0
- data/app/views/underworld/api/v1/groups/destroy.html.erb +2 -0
- data/app/views/underworld/api/v1/groups/destroy.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/groups/edit.html.erb +2 -0
- data/app/views/underworld/api/v1/groups/index.html.erb +2 -0
- data/app/views/underworld/api/v1/groups/index.json.jbuilder +6 -0
- data/app/views/underworld/api/v1/groups/new.html.erb +2 -0
- data/app/views/underworld/api/v1/groups/show.html.erb +2 -0
- data/app/views/underworld/api/v1/groups/show.json.jbuilder +5 -0
- data/app/views/underworld/api/v1/groups/update.json.jbuilder +4 -0
- data/app/views/underworld/api/v1/logs/index.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/permissions/index.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/permissions/user_permissions.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/users/create.html.erb +2 -0
- data/app/views/underworld/api/v1/users/create.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/users/destroy.json.jbuilder +1 -0
- data/app/views/underworld/api/v1/users/distroy.html.erb +2 -0
- data/app/views/underworld/api/v1/users/edit.html.erb +2 -0
- data/app/views/underworld/api/v1/users/index.html.erb +2 -0
- data/app/views/underworld/api/v1/users/index.json.jbuilder +4 -0
- data/app/views/underworld/api/v1/users/show.html.erb +2 -0
- data/app/views/underworld/api/v1/users/show.json.jbuilder +2 -0
- data/app/views/underworld/api/v1/users/update.json.jbuilder +1 -0
- data/app/views/underworld/dashboard/groups/_form.html.slim +68 -0
- data/app/views/underworld/dashboard/groups/create.js.erb +3 -0
- data/app/views/underworld/dashboard/groups/edit.html.slim +3 -0
- data/app/views/underworld/dashboard/groups/errors.js.erb +3 -0
- data/app/views/underworld/dashboard/groups/index.html.slim +47 -0
- data/app/views/underworld/dashboard/groups/new.html.slim +2 -0
- data/app/views/underworld/dashboard/groups/update.js.erb +3 -0
- data/app/views/underworld/dashboard/index.html.erb +0 -0
- data/app/views/underworld/dashboard/login_required_page.html.erb +5 -0
- data/app/views/underworld/dashboard/not_found.html.slim +9 -0
- data/app/views/underworld/dashboard/not_found.js.erb +1 -0
- data/app/views/underworld/dashboard/profile/_form.html.erb +33 -0
- data/app/views/underworld/dashboard/profile/_profile_form.html.erb +33 -0
- data/app/views/underworld/dashboard/profile/create.js.erb +3 -0
- data/app/views/underworld/dashboard/profile/edit.html.erb +2 -0
- data/app/views/underworld/dashboard/profile/edit_password.html.erb +2 -0
- data/app/views/underworld/dashboard/profile/errors.js.erb +3 -0
- data/app/views/underworld/dashboard/resource/_form.html.slim +33 -0
- data/app/views/underworld/dashboard/resource/_input.html.slim +3 -0
- data/app/views/underworld/dashboard/resource/create.js.erb +3 -0
- data/app/views/underworld/dashboard/resource/destroy.js.erb +2 -0
- data/app/views/underworld/dashboard/resource/edit.html.slim +3 -0
- data/app/views/underworld/dashboard/resource/index.html.slim +60 -0
- data/app/views/underworld/dashboard/resource/new.html.slim +2 -0
- data/app/views/underworld/dashboard/resource/show.html.slim +22 -0
- data/app/views/underworld/dashboard/resource/update.js.erb +3 -0
- data/app/views/underworld/dashboard/shared/_content_header.html.slim +15 -0
- data/app/views/underworld/dashboard/shared/_control_sidebar.html.slim +50 -0
- data/app/views/underworld/dashboard/shared/_footer.html.slim +7 -0
- data/app/views/underworld/dashboard/shared/_header.html.erb +98 -0
- data/app/views/underworld/dashboard/shared/_sidebar.html.erb +69 -0
- data/app/views/underworld/dashboard/shared/_toolbar.html.slim +0 -0
- data/app/views/underworld/dashboard/shared/errors.js.erb +3 -0
- data/app/views/underworld/dashboard/user_messages/_form.html.slim +0 -0
- data/app/views/underworld/dashboard/user_messages/create.js.erb +0 -0
- data/app/views/underworld/dashboard/user_messages/destroy.js.erb +0 -0
- data/app/views/underworld/dashboard/user_messages/new.html.slim +72 -0
- data/app/views/underworld/dashboard/users/_form.html.slim +73 -0
- data/app/views/underworld/dashboard/users/_password_form.html.slim +37 -0
- data/app/views/underworld/dashboard/users/create.js.erb +3 -0
- data/app/views/underworld/dashboard/users/destroy.js.erb +2 -0
- data/app/views/underworld/dashboard/users/edit.html.slim +3 -0
- data/app/views/underworld/dashboard/users/edit_password.html.slim +1 -0
- data/app/views/underworld/dashboard/users/errors.js.erb +3 -0
- data/app/views/underworld/dashboard/users/index.html.slim +66 -0
- data/app/views/underworld/dashboard/users/new.html.slim +2 -0
- data/app/views/underworld/dashboard/users/show.html.slim +6 -0
- data/app/views/underworld/dashboard/users/update.js.erb +3 -0
- data/app/views/underworld/dashboard/users/update_password.js.erb +3 -0
- data/app/views/underworld/relations/_belongs_to.json.jbuilder +11 -0
- data/config/initializers/devise.rb +24 -0
- data/config/locales/devise.en.yml +59 -0
- data/config/locales/devise.fa.yml +58 -0
- data/config/locales/underworld.en.yml +96 -0
- data/config/locales/underworld.fa.yml +108 -0
- data/config/routes.rb +43 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20131013091000_devise_create_underworld_users.rb +65 -0
- data/db/migrate/20131020124701_create_underworld_groups.rb +15 -0
- data/db/migrate/20131021170923_create_underworld_permissions.rb +15 -0
- data/db/migrate/20131123120422_add_permissions_groups_table.rb +16 -0
- data/db/migrate/20140613120923_add_users_groups_table.rb +13 -0
- data/db/migrate/20151122115129_add_uniqueness_index_to_users_groups.rb +11 -0
- data/db/migrate/20160310105736_create_underworld_user_messages.rb +25 -0
- data/db/seeds.rb +49 -0
- data/lib/generators/underworld/install_generator.rb +108 -0
- data/lib/generators/underworld/resource_generator.rb +70 -0
- data/lib/generators/underworld/resources_generator.rb +20 -0
- data/lib/generators/underworld/templates/README +21 -0
- data/lib/generators/underworld/templates/SPECS +13 -0
- data/lib/generators/underworld/templates/api/controller.rb.erb +60 -0
- data/lib/generators/underworld/templates/api_controller.rb +2 -0
- data/lib/generators/underworld/templates/dashboard/controller.rb.erb +2 -0
- data/lib/generators/underworld/templates/dashboard_controller.rb +18 -0
- data/lib/generators/underworld/templates/devise.rb +251 -0
- data/lib/generators/underworld/templates/features/api.feature +92 -0
- data/lib/generators/underworld/templates/features/api.step.rb +7 -0
- data/lib/generators/underworld/templates/features/step_definitions/email_steps.rb +206 -0
- data/lib/generators/underworld/templates/features/support/email_spec.rb +1 -0
- data/lib/generators/underworld/templates/features/support/env.rb +79 -0
- data/lib/generators/underworld/templates/javascripts/application.js +19 -0
- data/lib/generators/underworld/templates/policy/application_policy.rb +2 -0
- data/lib/generators/underworld/templates/policy/policy.rb.erb +2 -0
- data/lib/generators/underworld/templates/seeds.rb +1 -0
- data/lib/generators/underworld/templates/spec/factories/groups.rb +5 -0
- data/lib/generators/underworld/templates/spec/factories/users.rb +10 -0
- data/lib/generators/underworld/templates/spec/spec_helper.rb +69 -0
- data/lib/generators/underworld/templates/spec/support/devise.rb +3 -0
- data/lib/generators/underworld/templates/stylesheets/dashboard/ltr/application.css +3 -0
- data/lib/generators/underworld/templates/stylesheets/dashboard/rtl/application.css +3 -0
- data/lib/generators/underworld/templates/stylesheets/ltr/application.css +3 -0
- data/lib/generators/underworld/templates/stylesheets/rtl/application.css +3 -0
- data/lib/generators/underworld/templates/underworld.rb +12 -0
- data/lib/generators/underworld/templates/views/create.json.jbuilder.erb +3 -0
- data/lib/generators/underworld/templates/views/destroy.json.jbuilder.erb +1 -0
- data/lib/generators/underworld/templates/views/index.json.jbuilder.erb +13 -0
- data/lib/generators/underworld/templates/views/show.json.jbuilder.erb +6 -0
- data/lib/generators/underworld/templates/views/update.json.jbuilder.erb +6 -0
- data/lib/generators/underworld/views_generator.rb +57 -0
- data/lib/tasks/docs.rake +6 -0
- data/lib/tasks/sync.rake +9 -0
- data/lib/tasks/underworld_tasks.rake +38 -0
- data/lib/underworld.rb +35 -0
- data/lib/underworld/action_dispatch.rb +3 -0
- data/lib/underworld/api.rb +42 -0
- data/lib/underworld/api/groups_api.rb +41 -0
- data/lib/underworld/api/permissions_api.rb +24 -0
- data/lib/underworld/api/root.rb +15 -0
- data/lib/underworld/api/users_api.rb +20 -0
- data/lib/underworld/concerns.rb +7 -0
- data/lib/underworld/concerns/authorizable.rb +81 -0
- data/lib/underworld/configuration.rb +97 -0
- data/lib/underworld/dashboard.rb +11 -0
- data/lib/underworld/dashboard/dsl.rb +41 -0
- data/lib/underworld/dashboard/dsl/base.rb +133 -0
- data/lib/underworld/dashboard/dsl/create.rb +116 -0
- data/lib/underworld/dashboard/dsl/form_fields_properties.rb +62 -0
- data/lib/underworld/dashboard/dsl/index.rb +45 -0
- data/lib/underworld/dashboard/dsl/show.rb +6 -0
- data/lib/underworld/dashboard/dsl/update.rb +6 -0
- data/lib/underworld/dashboard/helpers/box_helpers.rb +129 -0
- data/lib/underworld/dashboard/models.rb +2 -0
- data/lib/underworld/dashboard/models/sidebar.rb +139 -0
- data/lib/underworld/dashboard/sections.rb +2 -0
- data/lib/underworld/dashboard/sections/resource.rb +229 -0
- data/lib/underworld/dashboard/sections/resource_create.rb +263 -0
- data/lib/underworld/dashboard/sections/resource_destroy.rb +27 -0
- data/lib/underworld/dashboard/sections/resource_show.rb +96 -0
- data/lib/underworld/dashboard/sections/resources_index.rb +113 -0
- data/lib/underworld/dashboard/sections/sidebar.rb +41 -0
- data/lib/underworld/discovery.rb +8 -0
- data/lib/underworld/discovery/permissions.rb +49 -0
- data/lib/underworld/engine.rb +53 -0
- data/lib/underworld/exceptions.rb +7 -0
- data/lib/underworld/extension.rb +18 -0
- data/lib/underworld/extension/base.rb +29 -0
- data/lib/underworld/fake_assets.rb +5 -0
- data/lib/underworld/i18n.rb +101 -0
- data/lib/underworld/initialize.rb +0 -0
- data/lib/underworld/liquid.rb +7 -0
- data/lib/underworld/liquid/block.rb +14 -0
- data/lib/underworld/liquid/render_tag.rb +50 -0
- data/lib/underworld/liquid/tag.rb +51 -0
- data/lib/underworld/middlewares.rb +1 -0
- data/lib/underworld/middlewares/locale.rb +29 -0
- data/lib/underworld/omniauth.rb +8 -0
- data/lib/underworld/omniauth/callbacks.rb +39 -0
- data/lib/underworld/orm.rb +30 -0
- data/lib/underworld/routes.rb +117 -0
- data/lib/underworld/version.rb +3 -0
- data/test/controllers/underworld/dashboard/resource_test.rb +118 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/javascripts/dashboard/application.js +19 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/assets/stylesheets/dashboard/ltr/application.css +3 -0
- data/test/dummy/app/assets/stylesheets/dashboard/rtl/application.css +3 -0
- data/test/dummy/app/assets/stylesheets/ltr/application.css +3 -0
- data/test/dummy/app/assets/stylesheets/rtl/application.css +3 -0
- data/test/dummy/app/controllers/api_controller.rb +2 -0
- data/test/dummy/app/controllers/application_controller.rb +6 -0
- data/test/dummy/app/controllers/dashboard/application_controller.rb +18 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/policies/application_policy.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +29 -0
- data/test/dummy/config/environments/production.rb +80 -0
- data/test/dummy/config/environments/test.rb +38 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/devise.rb +251 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/formstatic.rb +76 -0
- data/test/dummy/config/initializers/formtastic.rb +110 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/kaminari_config.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/underworld.rb +11 -0
- data/test/dummy/config/initializers/underworld_assets.rb +1 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +13 -0
- data/test/dummy/lib/templates/slim/scaffold/_form.html.slim +8 -0
- data/test/dummy/public/404.html +58 -0
- data/test/dummy/public/422.html +58 -0
- data/test/dummy/public/500.html +57 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fabricators/underworld/groups.rb +27 -0
- data/test/fabricators/underworld/permissions.rb +14 -0
- data/test/fabricators/underworld/users.rb +17 -0
- data/test/generators/install_generator_test.rb +84 -0
- data/test/integration/underworld/authentication_test.rb +36 -0
- data/test/integration/underworld/dashboard_test.rb +64 -0
- data/test/test_helper.rb +72 -0
- metadata +1045 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Underworld::Dashboard::Sections
|
|
2
|
+
module ResourceDestroy
|
|
3
|
+
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
# The actual action method of a dashboard controller
|
|
7
|
+
def destroy
|
|
8
|
+
@resource = model.find(params[:id])
|
|
9
|
+
authorize @resource
|
|
10
|
+
|
|
11
|
+
@resource_title = t(_resource_title.singularize)
|
|
12
|
+
|
|
13
|
+
before_destroy_hook(@resource)
|
|
14
|
+
@resource.destroy
|
|
15
|
+
|
|
16
|
+
return if _override_views.include? :destroy
|
|
17
|
+
render 'underworld/dashboard/resource/destroy'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# You can override this method to change the behaviour of `destroy`
|
|
23
|
+
# action
|
|
24
|
+
def before_destroy_hook(resource)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require_dependency 'underworld/dashboard/dsl/show'
|
|
2
|
+
|
|
3
|
+
module Underworld::Dashboard::Sections
|
|
4
|
+
module ResourceShow
|
|
5
|
+
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# The actual action method of a dashboard controller
|
|
9
|
+
def show
|
|
10
|
+
@resource = model.find(params[:id])
|
|
11
|
+
authorize @resource
|
|
12
|
+
|
|
13
|
+
collect_model_fields_for_show
|
|
14
|
+
|
|
15
|
+
@resource_title = t(_resource_title.singularize)
|
|
16
|
+
|
|
17
|
+
show_hook(@resource)
|
|
18
|
+
|
|
19
|
+
return if _override_views.include? :show
|
|
20
|
+
render 'underworld/dashboard/resource/show'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
|
|
25
|
+
def collect_model_fields_for_show
|
|
26
|
+
@_fields ||= show_properties.fields
|
|
27
|
+
#valid_columns = all_valid_columns_for_show
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def show_properties
|
|
31
|
+
Underworld::Dashboard::DSL::Show.new(model)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# def all_valid_columns_for_show
|
|
38
|
+
# return @all_valid_columns_for_show unless @all_valid_columns_for_show.nil?
|
|
39
|
+
# columns = model.columns_hash.dup
|
|
40
|
+
# relations = model.reflections
|
|
41
|
+
|
|
42
|
+
# relations.keys.each do |name|
|
|
43
|
+
# col = relations[name]
|
|
44
|
+
# column = columns.delete col.foreign_key
|
|
45
|
+
# columns[name] = column
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
# @all_valid_columns_for_show = columns
|
|
49
|
+
# end
|
|
50
|
+
def _show_fields
|
|
51
|
+
all_valid_columns_for_show.keys.map(&:to_sym)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# You can override this method to change the behaviour of `show`
|
|
55
|
+
# action
|
|
56
|
+
def show_hook(resource)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# The actual DSL for index ages
|
|
60
|
+
module ClassMethods
|
|
61
|
+
# To specify any property and action for `show` section
|
|
62
|
+
# you must use `in_index` class method with block of
|
|
63
|
+
# properties. For example:
|
|
64
|
+
#
|
|
65
|
+
# ```ruby
|
|
66
|
+
# class ExamplesController < Dashboard::Application
|
|
67
|
+
# in_show do
|
|
68
|
+
# attributes :name, :description
|
|
69
|
+
# action_button :close, label: 'Close', href: dashboard_example_close_path
|
|
70
|
+
# end
|
|
71
|
+
# end
|
|
72
|
+
# ```
|
|
73
|
+
#
|
|
74
|
+
def in_show(&block)
|
|
75
|
+
name = controller_name
|
|
76
|
+
path = controller_path.gsub(name, '').gsub(/dashboard\//, '')
|
|
77
|
+
model = "#{path}#{name}".classify.constantize
|
|
78
|
+
show_props = Underworld::Dashboard::DSL::Show.new(model)
|
|
79
|
+
|
|
80
|
+
unless block_given?
|
|
81
|
+
fail ArgumentError, "You have to provide a block for 'in_show'"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
show_props.instance_eval(&block) if block_given?
|
|
85
|
+
|
|
86
|
+
define_method(:show_properties) do
|
|
87
|
+
unless defined? @__show_props__
|
|
88
|
+
instance_exec(show_props, &block)
|
|
89
|
+
@__show_props__ = show_props
|
|
90
|
+
end
|
|
91
|
+
return @__show_props__
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require_dependency 'underworld/dashboard/dsl/index'
|
|
2
|
+
|
|
3
|
+
module Underworld::Dashboard::Sections
|
|
4
|
+
module ResourcesIndex
|
|
5
|
+
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# The actual action method of a dashboard controller
|
|
9
|
+
def index
|
|
10
|
+
authorize model
|
|
11
|
+
fetch_and_set_all
|
|
12
|
+
action_buttons(index_properties)
|
|
13
|
+
|
|
14
|
+
@_tools_buttons = index_properties.tool_buttons || {}
|
|
15
|
+
index_hook(@resources)
|
|
16
|
+
|
|
17
|
+
return if _override_views.include? :index
|
|
18
|
+
render 'underworld/dashboard/resource/index'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
# Fetch all or part of the corresponding resource
|
|
24
|
+
# from data base with respect to `scope` DSL.
|
|
25
|
+
#
|
|
26
|
+
# The important thing here is that by using `scope`
|
|
27
|
+
# DSL this method will chain the resulted scope
|
|
28
|
+
# with other scopes like `page` and `policy_scope`
|
|
29
|
+
def fetch_index_objects
|
|
30
|
+
scope = index_properties.default_scope
|
|
31
|
+
|
|
32
|
+
if !scope.nil?
|
|
33
|
+
|
|
34
|
+
# If user provided an scope for `index` section.
|
|
35
|
+
|
|
36
|
+
if scope.respond_to? :call
|
|
37
|
+
# If scope provided by a block
|
|
38
|
+
scope = scope.call
|
|
39
|
+
else
|
|
40
|
+
# If scope provided by a symbol
|
|
41
|
+
# which should be a method name
|
|
42
|
+
scope = self.send(scope)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
else
|
|
46
|
+
scope = model.all
|
|
47
|
+
#scope = ApplicationPolicy::Scope.new(current_user, model.all).resolve
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
scope = scope.order('created_at DESC').page(params[:page])
|
|
51
|
+
policy_scope(scope)
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def index_properties
|
|
56
|
+
Underworld::Dashboard::DSL::Index.new(model)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def fetch_and_set_all
|
|
62
|
+
result = fetch_index_objects
|
|
63
|
+
instance_variable_set("@#{plural_name}", result)
|
|
64
|
+
|
|
65
|
+
@index_fields = index_properties.fields
|
|
66
|
+
@resources = result
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# You can override this method to change the behaviour of `index`
|
|
70
|
+
# action
|
|
71
|
+
def index_hook(resources)
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
# The actual DSL for index ages
|
|
75
|
+
module ClassMethods
|
|
76
|
+
|
|
77
|
+
# To specify any property and action for `index` section
|
|
78
|
+
# you must use `in_index` class method with block of
|
|
79
|
+
# properties. For example:
|
|
80
|
+
#
|
|
81
|
+
# ```ruby
|
|
82
|
+
# class ExamplesController < Dashboard::Application
|
|
83
|
+
# in_index do
|
|
84
|
+
# attributes :name, :description
|
|
85
|
+
# action_button :close, label: 'Close', href: dashboard_example_close_path
|
|
86
|
+
# end
|
|
87
|
+
# end
|
|
88
|
+
# ```
|
|
89
|
+
#
|
|
90
|
+
def in_index(&block)
|
|
91
|
+
name = controller_name
|
|
92
|
+
path = controller_path.gsub(name, '').gsub(/dashboard\//, '')
|
|
93
|
+
model = "#{path}#{name}".classify.constantize
|
|
94
|
+
|
|
95
|
+
index_props = Underworld::Dashboard::DSL::Index.new(model)
|
|
96
|
+
|
|
97
|
+
unless block_given?
|
|
98
|
+
fail ArgumentError, "You have to provide a block for 'in_index'"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
define_method(:index_properties) do
|
|
102
|
+
unless defined? @__index_props__
|
|
103
|
+
instance_exec(index_props, &block)
|
|
104
|
+
@__index_props__ = index_props
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
return @__index_props__
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_dependency 'underworld/dashboard/models/sidebar'
|
|
2
|
+
|
|
3
|
+
module Underworld::Dashboard::Sections
|
|
4
|
+
module Sidebar
|
|
5
|
+
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
protected
|
|
9
|
+
|
|
10
|
+
def setup_sidebar
|
|
11
|
+
@sidebar = sidebar(t('dashboard')) do |sidebar|
|
|
12
|
+
sidebar.underworld_entries
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def sidebar(name, **options, &block)
|
|
19
|
+
sidebar = Underworld::Dashboard::Models::Sidebar.new(name, **options)
|
|
20
|
+
|
|
21
|
+
yield sidebar if block_given?
|
|
22
|
+
|
|
23
|
+
sidebar
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module ClassMethods
|
|
27
|
+
|
|
28
|
+
def sidebar(name, **options, &block)
|
|
29
|
+
side = Underworld::Dashboard::Models::Sidebar.new(name, **options)
|
|
30
|
+
|
|
31
|
+
side.instance_eval do
|
|
32
|
+
block.call if block_given?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
define_method(:setup_sidebar) do
|
|
36
|
+
instance_variable_set('@sidebar', side)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Underworld
|
|
2
|
+
module Discovery
|
|
3
|
+
# This class is responsible to discoering all Permissions
|
|
4
|
+
# classes and provide a list of available permissions
|
|
5
|
+
class Permissions
|
|
6
|
+
|
|
7
|
+
# Run the given block for each object with permissions
|
|
8
|
+
def self.permission_objects(&block)
|
|
9
|
+
objects = []
|
|
10
|
+
|
|
11
|
+
# Walkthrough all models in application by using
|
|
12
|
+
# model_discovery gem and check for `permission_strings`
|
|
13
|
+
# method in models (If `Underworld::Permissions` included in
|
|
14
|
+
# model it has the permission_strings). And concat the
|
|
15
|
+
# permissions to `@permissions` instance method.
|
|
16
|
+
::ApplicationModels.to_adapter.find_all.each do |m|
|
|
17
|
+
# `m` is a string contains name of a model and
|
|
18
|
+
# we use contstantize to get the model class with
|
|
19
|
+
# such name
|
|
20
|
+
model = m.model.constantize
|
|
21
|
+
if model.respond_to? :permission_strings
|
|
22
|
+
block.call(model)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.all_permissions
|
|
28
|
+
permissions = []
|
|
29
|
+
permission_objects do |object|
|
|
30
|
+
permissions.concat(object.permission_strings(object))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
permissions.uniq
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Creating all possible permissions in database using
|
|
37
|
+
# `Underworld::Permission` model
|
|
38
|
+
def self.create_all_permissions
|
|
39
|
+
|
|
40
|
+
permission_objects do |object|
|
|
41
|
+
object.possible_permissions.each do |perm|
|
|
42
|
+
Underworld::Permission.where(model: object.to_s,
|
|
43
|
+
permission_type: perm).first_or_create
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative './middlewares/locale'
|
|
2
|
+
require_relative './configuration'
|
|
3
|
+
|
|
4
|
+
module Underworld
|
|
5
|
+
|
|
6
|
+
# `Engine` class of **Underworld**.
|
|
7
|
+
class Engine < ::Rails::Engine
|
|
8
|
+
extend ::Underworld::Configuration
|
|
9
|
+
|
|
10
|
+
# TODO: Add a facility to allow developers to select
|
|
11
|
+
# features of underworld
|
|
12
|
+
isolate_namespace Underworld
|
|
13
|
+
engine_name 'underworld'
|
|
14
|
+
|
|
15
|
+
# Map `api` to `API` in Rails autoload
|
|
16
|
+
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
|
17
|
+
inflect.acronym 'API'
|
|
18
|
+
inflect.acronym 'DSL'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
config.generators do |g|
|
|
22
|
+
g.test_framework :minitest, fixture_replacement: :fabrication
|
|
23
|
+
g.fixture_replacement :fabrication, dir: "test/fabricators"
|
|
24
|
+
g.integration_tool :minitest
|
|
25
|
+
g.assets false
|
|
26
|
+
g.helper false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The actual setup method which is responsible for configuring
|
|
30
|
+
# `Underworld` environment. This method simply yield the current
|
|
31
|
+
# class and allows developers to change the configuration via
|
|
32
|
+
# the class methods defined in `Underworld::Configuration` ( which is
|
|
33
|
+
# extended in this class ).
|
|
34
|
+
def self.setup
|
|
35
|
+
yield self
|
|
36
|
+
|
|
37
|
+
# Load the dependencies needed by each particular feature.
|
|
38
|
+
load_dependencies_based_on_configuration
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Override devise layout
|
|
42
|
+
config.to_prepare do
|
|
43
|
+
Devise::SessionsController.layout 'underworld/simple'
|
|
44
|
+
Devise::RegistrationsController.layout 'underworld/simple'
|
|
45
|
+
Devise::ConfirmationsController.layout 'underworld/application'
|
|
46
|
+
Devise::UnlocksController.layout 'underworld/application'
|
|
47
|
+
Devise::PasswordsController.layout 'underworld/application'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
middleware.use Underworld::Middlewares::Locale
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Underworld
|
|
2
|
+
# Extension module of Underworld which contains all the related
|
|
3
|
+
# stuff to a Underworld extension.
|
|
4
|
+
module Extension
|
|
5
|
+
|
|
6
|
+
@@extensions = {}
|
|
7
|
+
|
|
8
|
+
def self.extensions
|
|
9
|
+
@@extensions
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.extensions=(value)
|
|
13
|
+
@@extensions = value
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
require 'underworld/extension/base'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Underworld
|
|
2
|
+
module Extension
|
|
3
|
+
# This module provide basic functionallity of a Underworld extension
|
|
4
|
+
# to a rails engine.
|
|
5
|
+
# It should be included in engine of all the Underworld extionsions
|
|
6
|
+
module Base
|
|
7
|
+
|
|
8
|
+
def included(base)
|
|
9
|
+
extend ClassMethods
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class ClassMethods
|
|
13
|
+
def register_extension(name, klass)
|
|
14
|
+
# TODO: Replace this mechanism with more elegant one
|
|
15
|
+
# For example use [] method or someting
|
|
16
|
+
Underworld::Extension.extensions[name] = klass
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# This method tells underworld that this extension will override
|
|
20
|
+
# the generators templates of underworld from `template_path` location
|
|
21
|
+
def override_generator_templates(template_path)
|
|
22
|
+
send(:define_singleton_method, 'generator_templates_path') do
|
|
23
|
+
template_path
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|