releaf-core 0.2.1
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
- data/LICENSE +24 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/favicon.ico +0 -0
- data/app/assets/images/releaf/icons/favicon.png +0 -0
- data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
- data/app/assets/images/releaf/logo-login.png +0 -0
- data/app/assets/images/releaf/logo.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
- data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
- data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
- data/app/assets/javascripts/releaf/application.js +13 -0
- data/app/assets/javascripts/releaf/include/ajax.js +66 -0
- data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
- data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
- data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
- data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
- data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
- data/app/assets/javascripts/releaf/include/loader.js +45 -0
- data/app/assets/javascripts/releaf/include/localization.js +213 -0
- data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
- data/app/assets/javascripts/releaf/include/notifications.js +267 -0
- data/app/assets/javascripts/releaf/include/pagination.js +19 -0
- data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
- data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
- data/app/assets/javascripts/releaf/include/search.js +140 -0
- data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
- data/app/assets/javascripts/releaf/include/sortable.js +69 -0
- data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
- data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
- data/app/assets/stylesheets/releaf/application.scss +9 -0
- data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
- data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
- data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
- data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
- data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
- data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
- data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
- data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
- data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
- data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
- data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
- data/app/assets/stylesheets/releaf/environment.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
- data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
- data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
- data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
- data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
- data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
- data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
- data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
- data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
- data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
- data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
- data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
- data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
- data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
- data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
- data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
- data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
- data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
- data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
- data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
- data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
- data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
- data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
- data/app/assets/stylesheets/releaf/layout.scss +35 -0
- data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
- data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
- data/app/builders/releaf/builders/association_reflector.rb +58 -0
- data/app/builders/releaf/builders/base.rb +80 -0
- data/app/builders/releaf/builders/collection.rb +8 -0
- data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
- data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
- data/app/builders/releaf/builders/edit_builder.rb +66 -0
- data/app/builders/releaf/builders/form_builder.rb +594 -0
- data/app/builders/releaf/builders/index_builder.rb +118 -0
- data/app/builders/releaf/builders/orderer.rb +5 -0
- data/app/builders/releaf/builders/page/header_builder.rb +70 -0
- data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
- data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
- data/app/builders/releaf/builders/pagination_builder.rb +107 -0
- data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
- data/app/builders/releaf/builders/resource.rb +9 -0
- data/app/builders/releaf/builders/resource_dialog.rb +8 -0
- data/app/builders/releaf/builders/resource_view.rb +54 -0
- data/app/builders/releaf/builders/show_builder.rb +3 -0
- data/app/builders/releaf/builders/table_builder.rb +280 -0
- data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
- data/app/builders/releaf/builders/template.rb +8 -0
- data/app/builders/releaf/builders/toolbox.rb +23 -0
- data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
- data/app/builders/releaf/builders/view.rb +132 -0
- data/app/builders/releaf/builders.rb +38 -0
- data/app/builders/releaf/core/settings/form_builder.rb +21 -0
- data/app/builders/releaf/core/settings/table_builder.rb +11 -0
- data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
- data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
- data/app/controllers/releaf/base_controller.rb +458 -0
- data/app/controllers/releaf/core/errors_controller.rb +5 -0
- data/app/controllers/releaf/core/settings_controller.rb +50 -0
- data/app/helpers/releaf/application_helper.rb +53 -0
- data/app/helpers/releaf/button_helper.rb +50 -0
- data/app/helpers/releaf/javascript_helper.rb +75 -0
- data/app/lib/releaf/core/assets_resolver.rb +58 -0
- data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
- data/app/lib/releaf/core/error_formatter.rb +103 -0
- data/app/lib/releaf/core/item_orderer.rb +102 -0
- data/app/lib/releaf/core/resource_base.rb +66 -0
- data/app/lib/releaf/core/resource_fields.rb +6 -0
- data/app/lib/releaf/core/resource_params.rb +47 -0
- data/app/lib/releaf/core/resource_table_fields.rb +10 -0
- data/app/lib/releaf/core/resource_utilities.rb +36 -0
- data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
- data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
- data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
- data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
- data/app/lib/releaf/core/responders/error_responder.rb +9 -0
- data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
- data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
- data/app/lib/releaf/core/responders.rb +31 -0
- data/app/lib/releaf/core/search.rb +147 -0
- data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
- data/app/models/releaf/richtext_attachment.rb +6 -0
- data/app/models/releaf/settings.rb +27 -0
- data/app/views/layouts/releaf/admin.html.erb +1 -0
- data/app/views/releaf/base/confirm_destroy.ruby +1 -0
- data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
- data/app/views/releaf/base/edit.ruby +1 -0
- data/app/views/releaf/base/index.ruby +1 -0
- data/app/views/releaf/base/new.ruby +1 -0
- data/app/views/releaf/base/refused_destroy.ruby +1 -0
- data/app/views/releaf/base/show.ruby +1 -0
- data/app/views/releaf/base/toolbox.ruby +1 -0
- data/app/views/releaf/error_pages/_error.html.haml +10 -0
- data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
- data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
- data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
- data/lib/generators/dummy/install_generator.rb +18 -0
- data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
- data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
- data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
- data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
- data/lib/generators/dummy/templates/config/routes.rb +19 -0
- data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
- data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
- data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
- data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
- data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
- data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
- data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
- data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
- data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
- data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
- data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
- data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
- data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
- data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
- data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
- data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
- data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
- data/lib/generators/dummy/templates/models/author.rb +10 -0
- data/lib/generators/dummy/templates/models/banner.rb +5 -0
- data/lib/generators/dummy/templates/models/book.rb +19 -0
- data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
- data/lib/generators/dummy/templates/models/bundle.rb +17 -0
- data/lib/generators/dummy/templates/models/chapter.rb +7 -0
- data/lib/generators/dummy/templates/models/home_page.rb +5 -0
- data/lib/generators/dummy/templates/models/node.rb +10 -0
- data/lib/generators/dummy/templates/models/publisher.rb +9 -0
- data/lib/generators/dummy/templates/models/text_page.rb +5 -0
- data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
- data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
- data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
- data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
- data/lib/generators/releaf/install_generator.rb +93 -0
- data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
- data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
- data/lib/generators/releaf/templates/models/node.rb +3 -0
- data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
- data/lib/releaf/core/application.rb +17 -0
- data/lib/releaf/core/builders_autoload.rb +27 -0
- data/lib/releaf/core/component.rb +9 -0
- data/lib/releaf/core/configuration.rb +101 -0
- data/lib/releaf/core/engine.rb +35 -0
- data/lib/releaf/core/exceptions.rb +38 -0
- data/lib/releaf/core/route_mapper.rb +59 -0
- data/lib/releaf/core/settings_ui_component.rb +7 -0
- data/lib/releaf/core/validation_error_codes.rb +36 -0
- data/lib/releaf/version.rb +3 -0
- data/lib/releaf-core.rb +14 -0
- data/lib/tasks/releaf_tasks.rake +4 -0
- data/releaf-core.gemspec +35 -0
- data/spec/builders/builders/association_reflector_spec.rb +138 -0
- data/spec/builders/builders/base_spec.rb +276 -0
- data/spec/builders/builders/collection_spec.rb +18 -0
- data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
- data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
- data/spec/builders/builders/edit_builder_spec.rb +215 -0
- data/spec/builders/builders/form_builder_spec.rb +562 -0
- data/spec/builders/builders/index_builder_spec.rb +345 -0
- data/spec/builders/builders/orderer_spec.rb +22 -0
- data/spec/builders/builders/page/header_builder_spec.rb +143 -0
- data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
- data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
- data/spec/builders/builders/pagination_builder_spec.rb +330 -0
- data/spec/builders/builders/resource_dialog_spec.rb +21 -0
- data/spec/builders/builders/resource_view_spec.rb +158 -0
- data/spec/builders/builders/show_builder_spec.rb +7 -0
- data/spec/builders/builders/table_builder_spec.rb +638 -0
- data/spec/builders/builders/template_spec.rb +12 -0
- data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
- data/spec/builders/builders/toolbox_spec.rb +48 -0
- data/spec/builders/builders/view_spec.rb +281 -0
- data/spec/builders/builders_spec.rb +134 -0
- data/spec/builders/core/settings/form_builder_spec.rb +69 -0
- data/spec/builders/core/settings/table_builder_spec.rb +21 -0
- data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
- data/spec/controllers/releaf/base_controller_spec.rb +447 -0
- data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
- data/spec/features/ajaxbox_spec.rb +111 -0
- data/spec/features/authorization_spec.rb +50 -0
- data/spec/features/dragonfly_integration_spec.rb +24 -0
- data/spec/features/edit_actions_spec.rb +142 -0
- data/spec/features/errors_spec.rb +29 -0
- data/spec/features/index_actions_spec.rb +85 -0
- data/spec/features/index_table_spec.rb +32 -0
- data/spec/features/menu_spec.rb +71 -0
- data/spec/features/richtext_attachments_spec.rb +64 -0
- data/spec/features/richtext_embed_spec.rb +29 -0
- data/spec/features/richtext_spec.rb +19 -0
- data/spec/features/search_spec.rb +825 -0
- data/spec/features/settings_spec.rb +38 -0
- data/spec/features/title_spec.rb +13 -0
- data/spec/fixtures/common_fields.yml +17 -0
- data/spec/fixtures/cs.png +0 -0
- data/spec/fixtures/time.formats.xlsx +0 -0
- data/spec/fixtures/unicorn.jpg +0 -0
- data/spec/helpers/application_helper_spec.rb +75 -0
- data/spec/helpers/button_helper_spec.rb +146 -0
- data/spec/lib/releaf/core/application_spec.rb +42 -0
- data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
- data/spec/lib/releaf/core/configuration_spec.rb +230 -0
- data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
- data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
- data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
- data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
- data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
- data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
- data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
- data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
- data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
- data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
- data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
- data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
- data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders_spec.rb +60 -0
- data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
- data/spec/lib/validation_error_codes_spec.rb +56 -0
- data/spec/misc/factories_spec.rb +43 -0
- data/spec/models/settings_spec.rb +58 -0
- data/spec/routing/route_mapper_spec.rb +185 -0
- data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
- metadata +657 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::SettingsController do
|
|
4
|
+
login_as_user :user
|
|
5
|
+
|
|
6
|
+
describe "GET index" do
|
|
7
|
+
login_as_user :user
|
|
8
|
+
it "lists only settings that not scoped to any object and exists within `Releaf::Settings.registry`" do
|
|
9
|
+
Releaf::Settings.destroy_all
|
|
10
|
+
Releaf::Settings.registry = {}
|
|
11
|
+
|
|
12
|
+
Releaf::Settings.create(var: "a", value: "1")
|
|
13
|
+
Releaf::Settings.create(var: "b", value: "2")
|
|
14
|
+
Releaf::Settings.create(var: "c", value: "2")
|
|
15
|
+
Releaf::Settings.create(var: "a", value: "3", thing_type: "User", thing_id: "1")
|
|
16
|
+
|
|
17
|
+
Releaf::Settings.register(key: "a", default: "x", description: "some setting")
|
|
18
|
+
Releaf::Settings.register(key: "b", default: "xxxx", description: "some other setting")
|
|
19
|
+
|
|
20
|
+
get :index
|
|
21
|
+
expect(assigns(:collection).size).to eq(2)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "GET new" do
|
|
26
|
+
it "creation of new records is disabled" do
|
|
27
|
+
get :new
|
|
28
|
+
expect(response.status).to eq(403)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Ajaxbox", js: true do
|
|
3
|
+
background do
|
|
4
|
+
auth_as_user
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
scenario "Close ajaxbox with footer 'cancel' button without reloading page" do
|
|
8
|
+
user = Releaf::Permissions::User.last
|
|
9
|
+
visit releaf_permissions_users_path
|
|
10
|
+
click_link user.name
|
|
11
|
+
expect(page).to have_header(text: user.to_text)
|
|
12
|
+
|
|
13
|
+
open_toolbox_dialog "Delete"
|
|
14
|
+
within_dialog{ click_link "No" }
|
|
15
|
+
expect(page).to_not have_css(".dialog")
|
|
16
|
+
expect(current_path).to eq(edit_releaf_permissions_user_path(user))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
scenario "Close ajaxbox with footer 'cancel' button (wrapped within form) without reloading page" do
|
|
20
|
+
node = create(:home_page_node, name: "MyNode")
|
|
21
|
+
node_path = edit_releaf_content_node_path(node)
|
|
22
|
+
visit node_path
|
|
23
|
+
open_toolbox_dialog "Move"
|
|
24
|
+
within_dialog{ click_link "Cancel" }
|
|
25
|
+
expect(page).to_not have_css(".dialog")
|
|
26
|
+
expect(current_path).to eq(node_path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
scenario "Close ajaxbox with header 'close' button without reloading page" do
|
|
30
|
+
node = create(:home_page_node, name: "MyNode")
|
|
31
|
+
node_path = edit_releaf_content_node_path(node)
|
|
32
|
+
visit node_path
|
|
33
|
+
open_toolbox_dialog "Add child"
|
|
34
|
+
within_dialog{ find("button.close").click }
|
|
35
|
+
expect(page).to_not have_css(".dialog")
|
|
36
|
+
expect(current_path).to eq(node_path)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
scenario "Drag ajaxbox within header" do
|
|
40
|
+
node = create(:home_page_node, name: "MyNode")
|
|
41
|
+
node_path = edit_releaf_content_node_path(node)
|
|
42
|
+
visit node_path
|
|
43
|
+
open_toolbox_dialog "Add child"
|
|
44
|
+
header = find(".dialog > header")
|
|
45
|
+
target = find("body > header a.home")
|
|
46
|
+
|
|
47
|
+
start_position = page.driver.evaluate_script <<-EOS
|
|
48
|
+
function() {
|
|
49
|
+
var ele = jQuery(".dialog")[0];
|
|
50
|
+
var rect = ele.getBoundingClientRect();
|
|
51
|
+
return [rect.left, rect.top];
|
|
52
|
+
}();
|
|
53
|
+
EOS
|
|
54
|
+
header.drag_to(target)
|
|
55
|
+
|
|
56
|
+
end_position = page.driver.evaluate_script <<-EOS
|
|
57
|
+
function() {
|
|
58
|
+
var ele = jQuery(".dialog")[0];
|
|
59
|
+
var rect = ele.getBoundingClientRect();
|
|
60
|
+
return [rect.left, rect.top];
|
|
61
|
+
}();
|
|
62
|
+
EOS
|
|
63
|
+
|
|
64
|
+
expect(start_position).to_not eq(end_position)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
scenario "Ajaxbox without modality (background is clickable)" do
|
|
68
|
+
node = create(:home_page_node, name: "MyNode")
|
|
69
|
+
node_path = edit_releaf_content_node_path(node)
|
|
70
|
+
visit node_path
|
|
71
|
+
open_toolbox_dialog "Add child"
|
|
72
|
+
|
|
73
|
+
expect(page).to have_css(".mfp-bg")
|
|
74
|
+
page.driver.click(10, 10)
|
|
75
|
+
expect(page).to_not have_css(".mfp-bg")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
scenario "Ajaxbox with modality (background is not clickable)" do
|
|
79
|
+
user = Releaf::Permissions::User.last
|
|
80
|
+
visit releaf_permissions_users_path
|
|
81
|
+
click_link user.name
|
|
82
|
+
expect(page).to have_header(text: user.to_text)
|
|
83
|
+
open_toolbox_dialog "Delete"
|
|
84
|
+
|
|
85
|
+
expect(page).to have_css(".mfp-bg")
|
|
86
|
+
page.driver.click(10, 10)
|
|
87
|
+
expect(page).to have_css(".mfp-bg")
|
|
88
|
+
expect(find(".mfp-bg")).to be_visible
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
scenario "Ajaxbox single image view" do
|
|
92
|
+
image = Rack::Test::UploadedFile.new(File.expand_path('../../spec/fixtures/unicorn.jpg', __dir__), "image/jpg")
|
|
93
|
+
book = create(:book, cover_image: image)
|
|
94
|
+
visit edit_admin_book_path(book)
|
|
95
|
+
|
|
96
|
+
find(".field[data-name='cover_image'] .value-preview img").click
|
|
97
|
+
expect(page).to have_css(".mfp-bg")
|
|
98
|
+
page.driver.click(10, 10)
|
|
99
|
+
expect(page).to_not have_css(".mfp-bg")
|
|
100
|
+
|
|
101
|
+
find(".field[data-name='cover_image'] .value-preview img").click
|
|
102
|
+
|
|
103
|
+
image_url = find(".field[data-name='cover_image'] .value-preview a.ajaxbox")["href"] + "&ajax=1"
|
|
104
|
+
ajaxbox_image_selector = '.ajaxbox-inner img.mfp-img'
|
|
105
|
+
expect(find(ajaxbox_image_selector)['src']).to eq image_url
|
|
106
|
+
|
|
107
|
+
find(".ajaxbox-inner button.close").click
|
|
108
|
+
expect(page).to have_no_css(".mfp-bg")
|
|
109
|
+
expect(page).to have_no_css(ajaxbox_image_selector)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Authorization" do
|
|
3
|
+
let(:user){ create(:user) }
|
|
4
|
+
|
|
5
|
+
scenario "Url preserving after authorization" do
|
|
6
|
+
current_unauthorized_url = new_admin_book_url
|
|
7
|
+
visit current_unauthorized_url
|
|
8
|
+
|
|
9
|
+
within("form") do
|
|
10
|
+
fill_in 'Email', with: user.email
|
|
11
|
+
fill_in 'Password', with: user.password
|
|
12
|
+
click_button 'Sign in'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
expect(current_url).to eq current_unauthorized_url
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
scenario "Redirection to role default controller after authorization" do
|
|
19
|
+
visit releaf_root_url
|
|
20
|
+
within("form.login") do
|
|
21
|
+
fill_in 'Email', with: user.email
|
|
22
|
+
fill_in 'Password', with: user.password
|
|
23
|
+
click_button 'Sign in'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
scenario "Redirection to role :redirect_to GET parameter after authorization when parameter value is relative url" do
|
|
30
|
+
visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_path)
|
|
31
|
+
within("form.login") do
|
|
32
|
+
fill_in 'Email', with: user.email
|
|
33
|
+
fill_in 'Password', with: user.password
|
|
34
|
+
click_button 'Sign in'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
expect(current_url).to eq new_admin_book_url
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
scenario "Redirection to role default controller after authorization when :redirect_to GET parameter is absolute url" do
|
|
41
|
+
visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_url)
|
|
42
|
+
within("form.login") do
|
|
43
|
+
fill_in 'Email', with: user.email
|
|
44
|
+
fill_in 'Password', with: user.password
|
|
45
|
+
click_button 'Sign in'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Dragonfly integration", js: true do
|
|
3
|
+
background do
|
|
4
|
+
auth_as_user
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
scenario "Upload, view and remove image" do
|
|
8
|
+
visit new_admin_book_path
|
|
9
|
+
create_resource do
|
|
10
|
+
fill_in "Title", with: "xx"
|
|
11
|
+
attach_file "Cover image", File.expand_path('../fixtures/cs.png', __dir__)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
find(".field[data-name='cover_image'] a.ajaxbox" ).click
|
|
15
|
+
expect(page).to have_css(".ajaxbox-inner img.mfp-img")
|
|
16
|
+
find(".ajaxbox-inner button.close" ).click
|
|
17
|
+
expect(page).to have_no_css(".ajaxbox-inner img.mfp-img")
|
|
18
|
+
|
|
19
|
+
update_resource do
|
|
20
|
+
check "Remove"
|
|
21
|
+
end
|
|
22
|
+
expect(page).to have_no_css(".field[data-name='cover_image'] a.ajaxbox")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Base controller edit", js: true do
|
|
3
|
+
background do
|
|
4
|
+
auth_as_user
|
|
5
|
+
@author = FactoryGirl.create(:author)
|
|
6
|
+
@good_book = FactoryGirl.create(:book, title: "good book", author: @author, price: 12.34, description_lv: "in lv", description_en: "in en")
|
|
7
|
+
FactoryGirl.create(:book, title: "bad book", author: @author)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
scenario "creation of new resources" do
|
|
11
|
+
|
|
12
|
+
# normal save button redirects to edit view of the newly created resource
|
|
13
|
+
visit admin_books_path
|
|
14
|
+
click_link "Create new resource"
|
|
15
|
+
wait_for_all_richtexts
|
|
16
|
+
fill_in "Title", with: "Lorem ipsum"
|
|
17
|
+
click_button 'Save'
|
|
18
|
+
expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
|
|
19
|
+
wait_for_all_richtexts
|
|
20
|
+
expect(page).to have_css('header h1', text: 'Lorem ipsum')
|
|
21
|
+
|
|
22
|
+
# "save and create another" button redirects to new resource view
|
|
23
|
+
visit new_admin_book_path
|
|
24
|
+
wait_for_all_richtexts
|
|
25
|
+
fill_in "Title", with: "Other ipsum"
|
|
26
|
+
click_button "Save and create another"
|
|
27
|
+
expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
|
|
28
|
+
wait_for_all_richtexts
|
|
29
|
+
expect(current_path).to eq new_admin_book_path
|
|
30
|
+
expect(page).to have_css('header h1', text: 'Create new resource')
|
|
31
|
+
|
|
32
|
+
# ENTER key in a field defaults to "save and create another"
|
|
33
|
+
visit new_admin_book_path
|
|
34
|
+
wait_for_all_richtexts
|
|
35
|
+
fill_in "Title", with: "Another ipsum"
|
|
36
|
+
find('#resource_title').native.send_key(:Enter)
|
|
37
|
+
expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
|
|
38
|
+
expect(page).to have_css('header h1', text: 'Create new resource')
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
scenario "keeps search params after deleting record from edit view" do
|
|
43
|
+
visit admin_books_path(search: "good")
|
|
44
|
+
click_link("good book")
|
|
45
|
+
open_toolbox_dialog("Delete")
|
|
46
|
+
click_button("Yes")
|
|
47
|
+
expect(page).to have_number_of_resources(0)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
scenario "when deleting item with restrict relation" do
|
|
51
|
+
visit edit_admin_author_path @author
|
|
52
|
+
open_toolbox_dialog("Delete")
|
|
53
|
+
|
|
54
|
+
within_dialog do
|
|
55
|
+
expect(page).to have_css('.restricted-relations .relations li', count: 2)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
scenario "drag and drop nested items with ckeditors" do
|
|
60
|
+
skip "implement drag and drop test"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
scenario "when clicking on delete restriction relation, it opens edit for related object" do
|
|
64
|
+
visit edit_admin_author_path @author
|
|
65
|
+
open_toolbox_dialog("Delete")
|
|
66
|
+
|
|
67
|
+
within_dialog do
|
|
68
|
+
find('.restricted-relations .relations li a', text: "good book").click
|
|
69
|
+
end
|
|
70
|
+
expect(page).to have_header(text: "good book")
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
scenario "remember last active locale for localized fields" do
|
|
74
|
+
visit admin_book_path(id: @good_book.id)
|
|
75
|
+
within(".localization-switch") do
|
|
76
|
+
click_button "en"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
within(".localization-menu-items") do
|
|
80
|
+
click_button "Lv"
|
|
81
|
+
end
|
|
82
|
+
wait_for_all_richtexts
|
|
83
|
+
|
|
84
|
+
visit admin_book_path(id: @good_book.id)
|
|
85
|
+
expect(page).to have_css('#resource_description_lv[value="in lv"]')
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
scenario "editing book uses Book#price instead of Book[:price] (issue #95)" do
|
|
89
|
+
visit admin_book_path(id: @good_book.id)
|
|
90
|
+
expect(page).to have_css('#resource_price[value="12.34"]')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
scenario "do not show 'Back to list' url when no index url passed" do
|
|
94
|
+
visit admin_books_path(search: "good")
|
|
95
|
+
click_link("good book")
|
|
96
|
+
expect(page).to have_link("Back to list")
|
|
97
|
+
wait_for_all_richtexts
|
|
98
|
+
|
|
99
|
+
visit admin_book_path(Book.first)
|
|
100
|
+
expect(page).to_not have_link("Back to list")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
scenario "editing nested object with allow_destroy: false" do
|
|
104
|
+
visit admin_book_path(id: @good_book.id)
|
|
105
|
+
expect(page).to_not have_css('.remove-nested-item')
|
|
106
|
+
|
|
107
|
+
update_resource do
|
|
108
|
+
find('.nested[data-name="chapters"] .add-nested-item').click
|
|
109
|
+
expect(page).to have_css('.remove-nested-item')
|
|
110
|
+
fill_in 'resource_chapters_attributes_0_title', with: 'Chapter 1'
|
|
111
|
+
fill_in 'resource_chapters_attributes_0_text', with: 'todo'
|
|
112
|
+
fill_in_richtext 'Sample', with: "xx"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
expect(page).to_not have_css('.remove-nested-item')
|
|
116
|
+
expect(page).to have_css('#resource_chapters_attributes_0_title[value="Chapter 1"]')
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
scenario "adding nested objects" do
|
|
120
|
+
visit new_admin_book_path
|
|
121
|
+
|
|
122
|
+
create_resource do
|
|
123
|
+
fill_in "Title", with: "Master and Margarita"
|
|
124
|
+
within "[data-name='chapters']" do
|
|
125
|
+
|
|
126
|
+
# verify that there are no visible inputs
|
|
127
|
+
expect( page ).to have_no_selector('input', visible: true)
|
|
128
|
+
expect( page ).to have_no_selector('textarea', visible: true)
|
|
129
|
+
|
|
130
|
+
click_button "Add item"
|
|
131
|
+
|
|
132
|
+
fill_in "Title", with: "Chapter 1"
|
|
133
|
+
fill_in "Text", with: "some text"
|
|
134
|
+
fill_in_richtext 'Sample', with: "xx"
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
new_book = Book.where(title: "Master and Margarita").first
|
|
139
|
+
expect( new_book.chapters.count ).to eq 1
|
|
140
|
+
expect( new_book.chapters.first.title ).to eq "Chapter 1"
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
describe "Errors feature" do
|
|
3
|
+
before do
|
|
4
|
+
auth_as_user
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
it "returns 404 status code and generic error page for nonexistent rotues" do
|
|
8
|
+
visit(releaf_root_path + "/asdassd")
|
|
9
|
+
|
|
10
|
+
expect(page.status_code).to eq(404)
|
|
11
|
+
expect(page.body).to match(/not found/)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "returns 403 status code and generic error page for disabled feature" do
|
|
15
|
+
allow_any_instance_of(Releaf::Permissions::RolesController).to receive(:verify_feature_availability!).and_raise(Releaf::FeatureDisabled, "edit")
|
|
16
|
+
visit releaf_permissions_roles_path
|
|
17
|
+
|
|
18
|
+
expect(page.status_code).to eq(403)
|
|
19
|
+
expect(page.body).to match(/edit feature disabled for roles/i)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "returns 403 status code and generic error page for restricted content" do
|
|
23
|
+
allow_any_instance_of(Releaf::Permissions::AccessControl).to receive(:controller_permitted?).and_return(false)
|
|
24
|
+
visit releaf_permissions_roles_path
|
|
25
|
+
|
|
26
|
+
expect(page.status_code).to eq(403)
|
|
27
|
+
expect(page.body).to match(/you are not authorized to access roles/i)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Base controller index", js: true do
|
|
3
|
+
background do
|
|
4
|
+
auth_as_user
|
|
5
|
+
author = FactoryGirl.create(:author)
|
|
6
|
+
good_book = FactoryGirl.create(:book, title: "good book", author: author, published_at: Date.parse("2015-12-12"))
|
|
7
|
+
FactoryGirl.create(:chapter, title: 'Scary night', text: 'Once upon a time...', book: good_book)
|
|
8
|
+
FactoryGirl.create(:book, title: "bad book", author: author)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
scenario "shows resource count" do
|
|
12
|
+
visit admin_books_path
|
|
13
|
+
expect(page).to have_number_of_resources(2)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
scenario "search resources dynamically" do
|
|
17
|
+
visit admin_books_path
|
|
18
|
+
search "good"
|
|
19
|
+
expect(page).to have_number_of_resources(1)
|
|
20
|
+
|
|
21
|
+
check "Only active"
|
|
22
|
+
expect(page).to have_number_of_resources(0)
|
|
23
|
+
|
|
24
|
+
uncheck "Only active"
|
|
25
|
+
expect(page).to have_number_of_resources(1)
|
|
26
|
+
|
|
27
|
+
fill_in "Published between", with: "2015-11-11"
|
|
28
|
+
click_button "Filter"
|
|
29
|
+
|
|
30
|
+
expect(page).to have_number_of_resources(1)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
scenario "search by 2nd level nested fields" do
|
|
34
|
+
visit admin_authors_path
|
|
35
|
+
search "upon"
|
|
36
|
+
expect(page).to have_number_of_resources(1)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
scenario "search nonexisting stuff" do
|
|
40
|
+
visit admin_authors_path
|
|
41
|
+
search "bunnyrabit"
|
|
42
|
+
expect(page).to have_number_of_resources(0)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
scenario "no row urls when :edit feature is not available" do
|
|
46
|
+
visit admin_books_path
|
|
47
|
+
expect(page).to have_link("good book")
|
|
48
|
+
|
|
49
|
+
allow_any_instance_of(Admin::BooksController).to receive(:feature_available?).with(:edit).and_return(false)
|
|
50
|
+
visit admin_books_path
|
|
51
|
+
expect(page).to_not have_link("good book")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
scenario "keeps search parameters when navigating to edit and back" do
|
|
55
|
+
visit admin_books_path(search: "good")
|
|
56
|
+
click_link("good book")
|
|
57
|
+
wait_for_all_richtexts
|
|
58
|
+
click_link("Back to list")
|
|
59
|
+
expect(page).to have_number_of_resources(1)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
scenario "keeps search parameters after delete" do
|
|
63
|
+
visit admin_books_path(search: "good")
|
|
64
|
+
open_toolbox_dialog('Delete', Book.first)
|
|
65
|
+
click_button("Yes")
|
|
66
|
+
expect(page).to have_number_of_resources(0)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
scenario "when deleting item in edit" do
|
|
70
|
+
visit admin_books_path(search: "good")
|
|
71
|
+
click_link("good book")
|
|
72
|
+
open_toolbox_dialog('Delete')
|
|
73
|
+
click_button("Yes")
|
|
74
|
+
expect(page).to have_number_of_resources(0)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
scenario "when deleting item with restrict relation" do
|
|
78
|
+
visit admin_authors_path
|
|
79
|
+
open_toolbox_dialog('Delete', Author.first)
|
|
80
|
+
|
|
81
|
+
within_dialog do
|
|
82
|
+
expect(page).to have_css('.restricted-relations .relations li', count: 2)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|