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,73 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Builders::Page::LayoutBuilder, type: :class do
|
|
4
|
+
class PageHeaderBuilderTestHelper < ActionView::Base
|
|
5
|
+
include Rails.application.routes.url_helpers
|
|
6
|
+
include FontAwesome::Rails::IconHelper
|
|
7
|
+
|
|
8
|
+
def protect_against_forgery?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def form_authenticity_token
|
|
13
|
+
"xxx"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def request_forgery_protection_token
|
|
17
|
+
"yyy"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class NewRolesController < Releaf::Permissions::RolesController
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subject { described_class.new(template) }
|
|
25
|
+
let(:template){ PageHeaderBuilderTestHelper.new }
|
|
26
|
+
|
|
27
|
+
describe "#controller_classes" do
|
|
28
|
+
it "returns array of ignorable ancester classes" do
|
|
29
|
+
allow(subject).to receive(:controller).and_return(NewRolesController.new)
|
|
30
|
+
expect(subject.controller_classes).to eq([Releaf::Permissions::RolesController, NewRolesController])
|
|
31
|
+
|
|
32
|
+
allow(subject).to receive(:controller).and_return(Releaf::Permissions::RolesController.new)
|
|
33
|
+
expect(subject.controller_classes).to eq([Releaf::Permissions::RolesController])
|
|
34
|
+
|
|
35
|
+
allow(subject).to receive(:controller).and_return(Releaf::Permissions::SessionsController.new)
|
|
36
|
+
expect(subject.controller_classes).to eq([Releaf::Permissions::SessionsController])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "#controller_body_classes" do
|
|
41
|
+
it "returns normalized html classes from controller classes" do
|
|
42
|
+
allow(subject).to receive(:controller_classes).and_return([Releaf::BaseController, Releaf::Permissions::RolesController])
|
|
43
|
+
expect(subject.controller_body_classes).to eq(["controller-releaf-base", "controller-releaf-permissions-roles"])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "#head_blocks" do
|
|
48
|
+
it "returns array" do
|
|
49
|
+
{
|
|
50
|
+
title: :title_sym,
|
|
51
|
+
meta: :meta_sym,
|
|
52
|
+
favicons: :favicon_sym,
|
|
53
|
+
ms_tile: :ms_tile_sym,
|
|
54
|
+
assets: :assets_sym,
|
|
55
|
+
csrf: :csrf_sym,
|
|
56
|
+
}.each_pair do |method, stub_answer|
|
|
57
|
+
allow(subject).to receive(method).and_return stub_answer
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
expect(subject.head_blocks).to match_array(
|
|
61
|
+
[
|
|
62
|
+
:title_sym,
|
|
63
|
+
:meta_sym,
|
|
64
|
+
:favicon_sym,
|
|
65
|
+
:ms_tile_sym,
|
|
66
|
+
:assets_sym,
|
|
67
|
+
:csrf_sym,
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Builders::Page::MenuBuilder, type: :class do
|
|
4
|
+
class MenuBuilderTestHelper < ActionView::Base
|
|
5
|
+
include FontAwesome::Rails::IconHelper
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
let(:controller){ Releaf::BaseController.new }
|
|
9
|
+
let(:template){ MenuBuilderTestHelper.new }
|
|
10
|
+
subject { described_class.new(template) }
|
|
11
|
+
|
|
12
|
+
before do
|
|
13
|
+
allow(template).to receive(:controller).and_return(controller)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "includes Releaf::Builders::Base" do
|
|
17
|
+
expect(described_class.ancestors).to include(Releaf::Builders::Base)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "includes Releaf::Builders::Template" do
|
|
21
|
+
expect(described_class.ancestors).to include(Releaf::Builders::Template)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "#output" do
|
|
25
|
+
pending
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "#menu_level" do
|
|
29
|
+
pending
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "#menu_item" do
|
|
33
|
+
pending
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "#collapsed_item?" do
|
|
37
|
+
pending
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "#item_attributes" do
|
|
41
|
+
pending
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "#item_name_content" do
|
|
45
|
+
let(:item) { { name: :item_name } }
|
|
46
|
+
|
|
47
|
+
it "returns abbreviation and full name elements" do
|
|
48
|
+
allow(subject).to receive(:t).with( :item_name, scope: "admin.controllers" ).and_return('Item full name')
|
|
49
|
+
allow(subject).to receive(:item_name_abbreviation).with('Item full name').and_return('Item abbreviation')
|
|
50
|
+
expect( subject.item_name_content( item ) ).to eq('<abbr title="Item full name">Item abbreviation</abbr><span class="name">Item full name</span>')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe "#item_name_abbreviation" do
|
|
56
|
+
|
|
57
|
+
it "returns first two letters of given text string" do
|
|
58
|
+
expect( subject.item_name_abbreviation( "Foo bar" )).to eq("Fo")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "when the first two letters are lowercase" do
|
|
62
|
+
it "capitalizes the first letter" do
|
|
63
|
+
expect( subject.item_name_abbreviation( "foo bar" )).to eq("Fo")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "when the first two letters are uppercase" do
|
|
68
|
+
it "makes the second letter lowercase" do
|
|
69
|
+
expect( subject.item_name_abbreviation( "FOO BAR" )).to eq("Fo")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "when the string contains slashes" do
|
|
74
|
+
|
|
75
|
+
it "uses the first word after the last slash" do
|
|
76
|
+
expect( subject.item_name_abbreviation( "Releaf/core/settings" )).to eq("Se")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "ignores slashes surrounded by spaces" do
|
|
80
|
+
expect( subject.item_name_abbreviation( "Inputs / Outputs" )).to eq("In")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "ignores trailing slashes" do
|
|
84
|
+
expect( subject.item_name_abbreviation( "Releaf/core/settings/" )).to eq("Se")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
context "when string consists of a single slash" do
|
|
88
|
+
it "returns an empty string" do
|
|
89
|
+
expect( subject.item_name_abbreviation( "/" )).to eq("")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "works with non-latin characters" do
|
|
95
|
+
expect( subject.item_name_abbreviation( "žņ" )).to eq("Žņ")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "when given an empty string value" do
|
|
99
|
+
it "returns an empty string" do
|
|
100
|
+
expect( subject.item_name_abbreviation( "" )).to eq("")
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "when given nil" do
|
|
105
|
+
it "returns an empty string" do
|
|
106
|
+
expect( subject.item_name_abbreviation( nil )).to eq("")
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
describe "#item_collapser" do
|
|
112
|
+
|
|
113
|
+
it "returns a collapser span with a button and collapser icon" do
|
|
114
|
+
allow(subject).to receive(:item_collapser_icon).with(:foo).and_return(subject.icon('dummy'))
|
|
115
|
+
expect(subject.item_collapser(:foo)).to eq '<span class="collapser"><button type="button"><i class="fa fa-dummy"></i></button></span>'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "#item_collapser_icon" do
|
|
121
|
+
|
|
122
|
+
before do
|
|
123
|
+
allow(subject).to receive(:layout_settings).with('releaf.side.compact').and_return(false)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
let(:item) { {} }
|
|
127
|
+
|
|
128
|
+
context "when side is compacted in layout settings" do
|
|
129
|
+
it "returns a beak pointing right" do
|
|
130
|
+
allow(subject).to receive(:layout_settings).with('releaf.side.compact').and_return(true)
|
|
131
|
+
allow(subject).to receive(:icon).with('chevron-right').and_return("icon ok")
|
|
132
|
+
expect(subject.item_collapser_icon(item)).to eq "icon ok"
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "when side is not compacted in layout settings" do
|
|
137
|
+
context "when the given item is collapsed" do
|
|
138
|
+
it "returns a beak pointing down" do
|
|
139
|
+
allow(subject).to receive(:collapsed_item?).with(item).and_return(true)
|
|
140
|
+
allow(subject).to receive(:icon).with('chevron-down').and_return("icon ok")
|
|
141
|
+
expect(subject.item_collapser_icon(item)).to eq "icon ok"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
context "when the given item is expanded" do
|
|
145
|
+
it "returns a beak pointing up" do
|
|
146
|
+
allow(subject).to receive(:collapsed_item?).with(item).and_return(false)
|
|
147
|
+
allow(subject).to receive(:icon).with('chevron-up').and_return("icon ok")
|
|
148
|
+
expect(subject.item_collapser_icon(item)).to eq "icon ok"
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
describe "#compacter" do
|
|
157
|
+
pending
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Builders::PaginationBuilder, type: :class do
|
|
4
|
+
|
|
5
|
+
class PaginationTestView < ActionView::Base
|
|
6
|
+
include Releaf::ApplicationHelper
|
|
7
|
+
include Releaf::ButtonHelper
|
|
8
|
+
include FontAwesome::Rails::IconHelper
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:template){ PaginationTestView.new }
|
|
12
|
+
|
|
13
|
+
let(:items_per_page) { 3 }
|
|
14
|
+
let(:current_page_number) { 1 }
|
|
15
|
+
let(:collection){ Book.page(current_page_number).per_page(items_per_page) }
|
|
16
|
+
let(:params){ { search: "xxx"} }
|
|
17
|
+
let(:subject){ described_class.new(template, collection: collection, params: params ) }
|
|
18
|
+
|
|
19
|
+
before do |example|
|
|
20
|
+
unless example.metadata[:stub_url_for] === false
|
|
21
|
+
allow(template).to receive(:url_for) { |params| "http://example.com/?#{params.to_query}" }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "provides accessor for template given in constructor" do
|
|
26
|
+
subject = described_class.new( :foo )
|
|
27
|
+
expect( subject.template ).to eq :foo
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "provides accessor for collection given in constructor" do
|
|
31
|
+
subject = described_class.new( nil, collection: :foo )
|
|
32
|
+
expect( subject.collection ).to eq :foo
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "provides accessor for params given in constructor" do
|
|
36
|
+
subject = described_class.new( nil, params: :foo )
|
|
37
|
+
expect( subject.params ).to eq :foo
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
describe "#output" do
|
|
42
|
+
|
|
43
|
+
context "when collection has no entries" do
|
|
44
|
+
it "returns nil" do
|
|
45
|
+
expect(subject.total_entries).to eq 0
|
|
46
|
+
expect(subject).to_not receive(:pagination_block)
|
|
47
|
+
expect(subject.output).to be nil
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "when collection has less entries than allowed on one page" do
|
|
52
|
+
before do
|
|
53
|
+
FactoryGirl.create( :book )
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "returns nil" do
|
|
57
|
+
expect(subject.total_entries).to eq 1
|
|
58
|
+
expect(subject).to_not receive(:pagination_block)
|
|
59
|
+
expect(subject.output).to be nil
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context "when collection has exactly the number of entries that fits on one page" do
|
|
64
|
+
before do
|
|
65
|
+
items_per_page.times do
|
|
66
|
+
FactoryGirl.create( :book )
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "returns nil" do
|
|
71
|
+
expect(subject.total_entries).to eq 3
|
|
72
|
+
expect(subject).to_not receive(:pagination_block)
|
|
73
|
+
expect(subject.output).to be nil
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
context "when collection has more than one page" do
|
|
79
|
+
before do
|
|
80
|
+
(items_per_page + 1).times do
|
|
81
|
+
FactoryGirl.create( :book )
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "returns #pagination_block" do
|
|
86
|
+
expect(subject.total_entries).to eq 4
|
|
87
|
+
expect(subject).to receive(:pagination_block).and_return('ok')
|
|
88
|
+
expect(subject.output).to eq "ok"
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe "#pagination_block" do
|
|
95
|
+
|
|
96
|
+
let(:current_page_number) { 2 }
|
|
97
|
+
|
|
98
|
+
it "returns pagination parts wrapped in a container" do
|
|
99
|
+
allow(subject).to receive(:pagination_parts).and_return [ "<strong>weak</strong>".html_safe, "<escape_me>" ]
|
|
100
|
+
expect(subject.pagination_block).to match_html %Q[
|
|
101
|
+
<div class="pagination">
|
|
102
|
+
<strong>weak</strong>
|
|
103
|
+
<escape_me>
|
|
104
|
+
</div>
|
|
105
|
+
]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "returns pagination buttons and select with options" do
|
|
109
|
+
|
|
110
|
+
14.times do
|
|
111
|
+
FactoryGirl.create :book
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
expect(subject.pagination_block).to match_html %Q[
|
|
115
|
+
<div class="pagination">
|
|
116
|
+
|
|
117
|
+
<a class="button only-icon secondary previous" title="Previous page" rel="prev" href="http://example.com/?page=1&search=xxx">
|
|
118
|
+
<i class="fa fa-chevron-left"></i>
|
|
119
|
+
</a>
|
|
120
|
+
|
|
121
|
+
<select name="page">
|
|
122
|
+
<option value="1">1-3</option>
|
|
123
|
+
<option value="2" selected="selected">4-6</option>
|
|
124
|
+
<option value="3">7-9</option>
|
|
125
|
+
<option value="4">10-12</option>
|
|
126
|
+
<option value="5">13-14</option>
|
|
127
|
+
</select>
|
|
128
|
+
|
|
129
|
+
<a class="button only-icon secondary next" title="Next page" rel="next" href="http://example.com/?page=3&search=xxx">
|
|
130
|
+
<i class="fa fa-chevron-right"></i>
|
|
131
|
+
</a>
|
|
132
|
+
|
|
133
|
+
</div>
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
describe "#pagination_parts" do
|
|
142
|
+
it "returns an array with previous page button, page select and next page button" do
|
|
143
|
+
allow(subject).to receive(:previous_page_button).and_return("previous")
|
|
144
|
+
allow(subject).to receive(:next_page_button).and_return("next")
|
|
145
|
+
allow(subject).to receive(:pagination_select).and_return("select")
|
|
146
|
+
expect(subject.pagination_parts).to eq [ "previous", "select", "next" ]
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def previous_page_button
|
|
152
|
+
page_button( -1, 'previous', 'chevron-left' )
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def next_page_button
|
|
156
|
+
page_button( 1, 'next', 'chevron-right' )
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
describe "#previous_page_button" do
|
|
160
|
+
it "returns #page_button with -1 offset and appropriate class and icon names" do
|
|
161
|
+
expect(subject).to receive(:page_button).with( -1, 'previous', 'chevron-left').and_return('ok')
|
|
162
|
+
expect(subject.previous_page_button).to eq 'ok'
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
describe "#next_page_button" do
|
|
167
|
+
it "returns #page_button with +1 offset and appropriate class and icon names" do
|
|
168
|
+
expect(subject).to receive(:page_button).with( 1, 'next', 'chevron-right').and_return('ok')
|
|
169
|
+
expect(subject.next_page_button).to eq 'ok'
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
describe "#page_button" do
|
|
174
|
+
|
|
175
|
+
before do
|
|
176
|
+
allow(subject).to receive(:t).with('Foo page', scope: 'pagination').and_return('Foo page label')
|
|
177
|
+
allow(subject).to receive(:t).with('Bar page', scope: 'pagination').and_return('Bar page label')
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "when calculated relative page number is valid" do
|
|
182
|
+
|
|
183
|
+
it "returns a button with correct class and rel attributes and a href pointing to the offset page" do
|
|
184
|
+
|
|
185
|
+
5.times do
|
|
186
|
+
FactoryGirl.create(:book)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
expect(subject.page_button( 1, 'foo', 'foo-icon' )).to match_html %Q[
|
|
190
|
+
<a class="button only-icon secondary foo" title="Foo page label" rel="next" href="http://example.com/?page=2&search=xxx">
|
|
191
|
+
<i class="fa fa-foo-icon"></i>
|
|
192
|
+
</a>
|
|
193
|
+
]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
context "when the calculated relative page number is invalid" do
|
|
199
|
+
|
|
200
|
+
it "returns a disabled button with correct class" do
|
|
201
|
+
expect(subject.page_button( -1, 'bar', 'bar-icon' )).to match_html %Q[
|
|
202
|
+
<button class="button only-icon secondary bar" title="Bar page label" type="button" autocomplete="off" disabled="disabled">
|
|
203
|
+
<i class="fa fa-bar-icon"></i>
|
|
204
|
+
</button>
|
|
205
|
+
]
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
describe "#page_numbers" do
|
|
214
|
+
|
|
215
|
+
it "returns an array of integers from 1 to total number of pages" do
|
|
216
|
+
allow(collection).to receive(:total_pages).and_return(12)
|
|
217
|
+
expect(subject.page_numbers).to eq [1,2,3,4,5,6,7,8,9,10,11,12]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
describe "#relative_page_number" do
|
|
224
|
+
|
|
225
|
+
before do
|
|
226
|
+
allow(collection).to receive(:current_page).and_return(3)
|
|
227
|
+
allow(collection).to receive(:total_pages).and_return(12)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "when adding the offset to current page number" do
|
|
231
|
+
context "results in a valid page number" do
|
|
232
|
+
it "returns the page number" do
|
|
233
|
+
expect(subject.relative_page_number(-1)).to eq 2
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "results in a page number larger than the total number of pages" do
|
|
238
|
+
it "returns nil" do
|
|
239
|
+
expect(subject.relative_page_number(10)).to be nil
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context "results in a page number less than one" do
|
|
244
|
+
it "returns nil" do
|
|
245
|
+
expect(subject.relative_page_number(-3)).to be nil
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
describe "#relative_page_relationship" do
|
|
254
|
+
|
|
255
|
+
context "when given -1" do
|
|
256
|
+
it "returns :prev" do
|
|
257
|
+
expect(subject.relative_page_relationship(-1)).to eq :prev
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
context "when given 1" do
|
|
262
|
+
it "returns :next" do
|
|
263
|
+
expect(subject.relative_page_relationship(1)).to eq :next
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
[0, -2, 3, nil, true, false].each do |arg|
|
|
268
|
+
context "when given #{arg.nil? ? 'nil' : arg.to_s}" do
|
|
269
|
+
it "returns nil" do
|
|
270
|
+
expect(subject.relative_page_relationship(arg)).to be nil
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
describe "#page_url", stub_url_for: false do
|
|
278
|
+
|
|
279
|
+
it "calls url_for on template with added page number param" do
|
|
280
|
+
expect(template).to receive(:url_for).with( search: "xxx", page: 3).and_return("ok")
|
|
281
|
+
expect(subject.page_url(3)).to eq "ok"
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
describe "#pagination_select" do
|
|
287
|
+
|
|
288
|
+
it "returns select tag with pagination options" do
|
|
289
|
+
allow(subject).to receive(:pagination_options).and_return [ "<option>1-2</option>".html_safe, "<escape_me>" ]
|
|
290
|
+
expect(subject.pagination_select).to match_html %Q[
|
|
291
|
+
<select name="page">
|
|
292
|
+
<option>1-2</option>
|
|
293
|
+
<escape_me>
|
|
294
|
+
</select>
|
|
295
|
+
]
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
describe "#pagination_options" do
|
|
301
|
+
|
|
302
|
+
let(:current_page_number) { 2 }
|
|
303
|
+
|
|
304
|
+
it "returns an array with option tags for page select" do
|
|
305
|
+
allow(subject).to receive(:page_numbers).and_return( [ 1, 2, 3 ] )
|
|
306
|
+
allow(subject).to receive(:page_label) { |page_number| "page label #{page_number}" }
|
|
307
|
+
expect(subject.pagination_options).to eq [
|
|
308
|
+
'<option value="1">page label 1</option>',
|
|
309
|
+
'<option value="2" selected="selected">page label 2</option>',
|
|
310
|
+
'<option value="3">page label 3</option>'
|
|
311
|
+
]
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
describe "#page_label" do
|
|
318
|
+
|
|
319
|
+
before do
|
|
320
|
+
14.times { FactoryGirl.create :book }
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
it "returns a string with the numbers of first and last items in page" do
|
|
324
|
+
expect(subject.page_label(1)).to eq "1-3"
|
|
325
|
+
expect(subject.page_label(5)).to eq "13-14"
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
end
|