releaf-core 0.2.1 → 1.0.3
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 +4 -4
- data/LICENSE +19 -21
- data/app/assets/javascripts/releaf/application.js +1 -2
- data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +19 -21
- data/app/assets/javascripts/releaf/include/field.type_richtext.js +31 -9
- data/app/assets/javascripts/releaf/include/localization.js +3 -8
- data/app/assets/javascripts/releaf/include/nested_fields.js +1 -1
- data/app/assets/javascripts/releaf/include/remote_validator.js +7 -4
- data/app/assets/javascripts/releaf/include/sortable.js +1 -1
- data/app/assets/javascripts/releaf/include/{profile_settings.js → store_settings.js} +4 -10
- data/app/assets/javascripts/releaf/include/toolbox.js +7 -11
- data/app/assets/stylesheets/releaf/layout/fields.scss +1 -0
- data/app/assets/stylesheets/releaf/layout/header.scss +1 -0
- data/app/assets/stylesheets/releaf/layout/search.scss +15 -0
- data/app/builders/releaf/builders/base.rb +11 -9
- data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +2 -2
- data/app/builders/releaf/builders/confirm_dialog_builder.rb +3 -3
- data/app/builders/releaf/builders/edit_builder.rb +51 -6
- data/app/builders/releaf/builders/form_builder/associated_set_field.rb +37 -0
- data/app/builders/releaf/builders/form_builder/associations.rb +153 -0
- data/app/builders/releaf/builders/form_builder/boolean_fields.rb +12 -0
- data/app/builders/releaf/builders/form_builder/date_fields.rb +30 -0
- data/app/builders/releaf/builders/form_builder/fields.rb +10 -0
- data/app/builders/releaf/builders/form_builder/file_fields.rb +47 -0
- data/app/builders/releaf/builders/form_builder/i18n_fields.rb +75 -0
- data/app/builders/releaf/builders/form_builder/label.rb +34 -0
- data/app/builders/releaf/builders/form_builder/number_fields.rb +13 -0
- data/app/builders/releaf/builders/form_builder/richtext_fields.rb +28 -0
- data/app/builders/releaf/builders/form_builder/text_fields.rb +43 -0
- data/app/builders/releaf/builders/form_builder.rb +8 -489
- data/app/builders/releaf/builders/index_builder.rb +10 -3
- data/app/builders/releaf/builders/page/header_builder.rb +23 -59
- data/app/builders/releaf/builders/page/layout_builder.rb +125 -115
- data/app/builders/releaf/builders/page/menu_builder.rb +96 -106
- data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +7 -12
- data/app/builders/releaf/builders/resource_view.rb +4 -4
- data/app/builders/releaf/builders/table_builder.rb +20 -30
- data/app/builders/releaf/builders/toolbox_builder.rb +1 -1
- data/app/builders/releaf/builders/utilities/date_fields.rb +100 -0
- data/app/builders/releaf/builders/utilities/resolve_attribute_field_method_name.rb +80 -0
- data/app/builders/releaf/builders/view.rb +5 -2
- data/app/builders/releaf/settings/form_builder.rb +18 -0
- data/app/builders/releaf/settings/table_builder.rb +9 -0
- data/app/controllers/releaf/action_controller.rb +174 -0
- data/app/controllers/releaf/{core/errors_controller.rb → errors_controller.rb} +1 -1
- data/app/controllers/releaf/root_controller.rb +23 -0
- data/app/controllers/releaf/settings_controller.rb +22 -0
- data/app/helpers/releaf/application_helper.rb +1 -1
- data/app/lib/releaf/action_controller/ajax.rb +24 -0
- data/app/lib/releaf/action_controller/breadcrumbs.rb +26 -0
- data/app/lib/releaf/action_controller/builders.rb +34 -0
- data/app/lib/releaf/action_controller/features.rb +47 -0
- data/app/lib/releaf/action_controller/notifications.rb +28 -0
- data/app/lib/releaf/action_controller/resources.rb +59 -0
- data/app/{controllers/concerns/releaf → lib/releaf/action_controller}/richtext_attachments.rb +1 -1
- data/app/lib/releaf/action_controller/search.rb +22 -0
- data/app/lib/releaf/action_controller/urls.rb +49 -0
- data/app/lib/releaf/action_controller/views.rb +29 -0
- data/app/lib/releaf/assets_resolver.rb +51 -0
- data/app/lib/releaf/build_errors_hash.rb +81 -0
- data/app/lib/releaf/controller_definition.rb +22 -0
- data/app/lib/releaf/controller_group_definition.rb +12 -0
- data/app/lib/releaf/{core/default_searchable_fields.rb → default_searchable_fields.rb} +1 -1
- data/app/lib/releaf/{core/resource_base.rb → resource_base.rb} +14 -6
- data/app/lib/releaf/{core/resource_fields.rb → resource_fields.rb} +1 -1
- data/app/lib/releaf/{core/resource_params.rb → resource_params.rb} +3 -3
- data/app/lib/releaf/resource_table_fields.rb +10 -0
- data/app/lib/releaf/{core/resource_utilities.rb → resource_utilities.rb} +2 -2
- data/app/lib/releaf/{core/responders → responders}/access_denied_responder.rb +2 -2
- data/app/lib/releaf/{core/responders → responders}/after_save_responder.rb +3 -3
- data/app/lib/releaf/{core/responders → responders}/confirm_destroy_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/destroy_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/error_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/feature_disabled_responder.rb +2 -2
- data/app/lib/releaf/{core/responders → responders}/page_not_found_responder.rb +2 -2
- data/app/lib/releaf/responders.rb +31 -0
- data/app/lib/releaf/{core/search.rb → search.rb} +1 -1
- data/app/lib/releaf/settings/normalize_value.rb +45 -0
- data/app/lib/releaf/settings/register.rb +45 -0
- data/app/models/releaf/settings.rb +25 -13
- data/app/services/array/reorder.rb +82 -0
- data/app/views/releaf/{base → action}/confirm_destroy.ruby +0 -0
- data/app/views/releaf/{base → action}/create_releaf_richtext_attachment.haml +0 -0
- data/app/views/releaf/{base → action}/edit.ruby +0 -0
- data/app/views/releaf/{base → action}/index.ruby +0 -0
- data/app/views/releaf/{base → action}/new.ruby +0 -0
- data/app/views/releaf/{base → action}/refused_destroy.ruby +0 -0
- data/app/views/releaf/{base → action}/show.ruby +0 -0
- data/app/views/releaf/{base → action}/toolbox.ruby +0 -0
- data/lib/generators/dummy/install_generator.rb +5 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/books.js +23 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/nodes.js +1 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/other_site/other_nodes.js +1 -0
- data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/nodes.scss +1 -0
- data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/other_site/other_nodes.scss +1 -0
- data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +11 -1
- data/lib/generators/dummy/templates/config/routes.rb +31 -7
- data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +3 -6
- data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/admin/nodes_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/other_site/other_nodes_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/application_controller.rb +27 -5
- data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +13 -3
- data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -1
- data/lib/generators/dummy/templates/initializers/releaf.rb +31 -25
- data/lib/generators/dummy/templates/migrations/create_home_pages.rb +1 -0
- data/lib/generators/dummy/templates/migrations/create_other_nodes.rb +29 -0
- data/lib/generators/dummy/templates/models/author.rb +2 -2
- data/lib/generators/dummy/templates/models/book.rb +0 -2
- data/lib/generators/dummy/templates/models/chapter.rb +0 -2
- data/lib/generators/dummy/templates/models/home_page.rb +1 -0
- data/lib/generators/dummy/templates/models/other_site/other_node.rb +7 -0
- data/lib/generators/dummy/templates/models/publisher.rb +0 -5
- data/lib/generators/dummy/templates/models/text_page.rb +0 -1
- data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -1
- data/lib/generators/dummy/templates/views/layouts/application.html.haml +9 -1
- data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -1
- data/lib/generators/releaf/templates/initializers/releaf.rb +6 -17
- data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +13 -14
- data/lib/generators/releaf/templates/seeds/seeds.rb +28 -32
- data/lib/releaf/{core/application.rb → application.rb} +5 -4
- data/lib/releaf/{core/component.rb → component.rb} +6 -2
- data/lib/releaf/configuration.rb +95 -0
- data/lib/releaf/core_ext/array/reorder.rb +5 -0
- data/lib/releaf/engine.rb +12 -0
- data/lib/releaf/exceptions.rb +5 -0
- data/lib/releaf/instance_cache.rb +72 -0
- data/lib/releaf/{core → rails_ext}/validation_error_codes.rb +1 -1
- data/lib/releaf/root/configuration.rb +6 -0
- data/lib/releaf/root/default_controller_resolver.rb +37 -0
- data/lib/releaf/root/settings_manager.rb +12 -0
- data/lib/releaf/root.rb +17 -0
- data/lib/releaf/{core/route_mapper.rb → route_mapper.rb} +6 -6
- data/lib/releaf/service.rb +11 -0
- data/lib/releaf/settings_ui.rb +7 -0
- data/lib/releaf/version.rb +1 -1
- data/lib/releaf-core.rb +38 -9
- data/spec/builders/{builders → releaf/builders}/association_reflector_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/base_spec.rb +17 -21
- data/spec/builders/{builders → releaf/builders}/collection_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/confirm_destroy_dialog_builder_spec.rb +5 -5
- data/spec/builders/{builders → releaf/builders}/confirm_dialog_builder_spec.rb +9 -7
- data/spec/builders/{builders → releaf/builders}/edit_builder_spec.rb +127 -20
- data/spec/builders/releaf/builders/form_builder/associations_spec.rb +129 -0
- data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +86 -0
- data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +48 -0
- data/spec/builders/releaf/builders/form_builder/label_spec.rb +106 -0
- data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +37 -0
- data/spec/builders/releaf/builders/form_builder_spec.rb +228 -0
- data/spec/builders/{builders → releaf/builders}/index_builder_spec.rb +29 -10
- data/spec/builders/releaf/builders/page/header_builder_spec.rb +65 -0
- data/spec/builders/releaf/builders/page/layout_builder_spec.rb +170 -0
- data/spec/builders/releaf/builders/page/menu_builder_spec.rb +345 -0
- data/spec/builders/{builders → releaf/builders}/pagination_builder_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/resource_dialog_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/resource_view_spec.rb +8 -8
- data/spec/builders/{builders → releaf/builders}/show_builder_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/table_builder_spec.rb +31 -75
- data/spec/builders/{builders → releaf/builders}/template_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/toolbox_builder_spec.rb +4 -4
- data/spec/builders/{builders → releaf/builders}/toolbox_spec.rb +0 -0
- data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +125 -0
- data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +318 -0
- data/spec/builders/{builders → releaf/builders}/view_spec.rb +1 -1
- data/spec/builders/{builders_spec.rb → releaf/builders_spec.rb} +0 -0
- data/spec/builders/releaf/settings/form_builder_spec.rb +48 -0
- data/spec/builders/{core → releaf}/settings/table_builder_spec.rb +6 -4
- data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +1 -1
- data/spec/controllers/releaf/{base_controller_spec.rb → action_controller_spec.rb} +132 -161
- data/spec/controllers/releaf/root_controller_spec.rb +40 -0
- data/spec/controllers/releaf/settings_controller_spec.rb +52 -0
- data/spec/error_hash_builder_spec.rb +83 -0
- data/spec/ext/array_reorder_spec.rb +12 -0
- data/spec/features/ajaxbox_spec.rb +6 -6
- data/spec/features/errors_spec.rb +2 -1
- data/spec/features/index_table_spec.rb +6 -3
- data/spec/features/richtext_attachments_spec.rb +2 -2
- data/spec/features/richtext_custom_config_spec.rb +28 -0
- data/spec/features/richtext_embed_spec.rb +1 -1
- data/spec/features/richtext_spec.rb +10 -1
- data/spec/features/search_spec.rb +1 -1
- data/spec/features/settings_spec.rb +10 -5
- data/spec/helpers/application_helper_spec.rb +4 -6
- data/spec/lib/releaf/action_controller/features_spec.rb +171 -0
- data/spec/lib/releaf/action_controller/search_spec.rb +84 -0
- data/spec/lib/releaf/{core/application_spec.rb → application_spec.rb} +7 -6
- data/spec/lib/releaf/assets_resolver_spec.rb +130 -0
- data/spec/lib/releaf/build_errors_hash_spec.rb +141 -0
- data/spec/lib/releaf/configuration_spec.rb +205 -0
- data/spec/lib/releaf/controller_definition_spec.rb +49 -0
- data/spec/lib/releaf/controller_group_definition_spec.rb +27 -0
- data/spec/lib/releaf/{core/default_searchable_fields_spec.rb → default_searchable_fields_spec.rb} +1 -1
- data/spec/lib/releaf/instance_cache_spec.rb +98 -0
- data/spec/lib/releaf/{core/resource_base_spec.rb → resource_base_spec.rb} +59 -21
- data/spec/lib/releaf/{core/resource_fields_spec.rb → resource_fields_spec.rb} +1 -1
- data/spec/lib/releaf/{core/resource_params_spec.rb → resource_params_spec.rb} +3 -5
- data/spec/lib/releaf/resource_table_fields_spec.rb +20 -0
- data/spec/lib/releaf/{core/resource_utilities_spec.rb → resource_utilities_spec.rb} +1 -1
- data/spec/lib/releaf/{core/responders → responders}/access_denied_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders → responders}/after_save_responder_spec.rb +9 -8
- data/spec/lib/releaf/{core/responders → responders}/confirm_destroy_responder_spec.rb +2 -2
- data/spec/lib/releaf/{core/responders → responders}/destroy_responder_spec.rb +2 -2
- data/spec/lib/releaf/{core/responders → responders}/error_responder_spec.rb +4 -4
- data/spec/lib/releaf/{core/responders → responders}/feature_disabled_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders → responders}/page_not_found_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders_spec.rb → responders_spec.rb} +14 -14
- data/spec/lib/releaf/root/configuration_spec.rb +9 -0
- data/spec/lib/releaf/root/default_controller_resolver_spec.rb +108 -0
- data/spec/lib/releaf/root_spec.rb +13 -0
- data/spec/lib/releaf/service_spec.rb +20 -0
- data/spec/lib/releaf/settings/normalize_value_spec.rb +103 -0
- data/spec/lib/releaf/settings/register_spec.rb +135 -0
- data/spec/lib/releaf/settings_manager_spec.rb +22 -0
- data/spec/lib/validation_error_codes_spec.rb +1 -1
- data/spec/misc/factories_spec.rb +0 -12
- data/spec/models/settings_spec.rb +74 -32
- data/spec/routing/route_mapper_spec.rb +5 -5
- data/spec/rspec_helpers/test_helpers_spec.rb +1 -1
- data/spec/rspec_helpers/test_spec.rb +14 -0
- data/spec/{lib/releaf/core/item_orderer_spec.rb → services/array/reorder_spec.rb} +32 -53
- metadata +299 -224
- data/app/builders/releaf/builders/orderer.rb +0 -5
- data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +0 -40
- data/app/builders/releaf/core/settings/form_builder.rb +0 -21
- data/app/builders/releaf/core/settings/table_builder.rb +0 -11
- data/app/controllers/concerns/releaf/breadcrumbs.rb +0 -42
- data/app/controllers/releaf/base_controller.rb +0 -458
- data/app/controllers/releaf/core/settings_controller.rb +0 -50
- data/app/helpers/releaf/javascript_helper.rb +0 -75
- data/app/lib/releaf/core/assets_resolver.rb +0 -58
- data/app/lib/releaf/core/error_formatter.rb +0 -103
- data/app/lib/releaf/core/item_orderer.rb +0 -102
- data/app/lib/releaf/core/resource_table_fields.rb +0 -10
- data/app/lib/releaf/core/responders.rb +0 -31
- data/app/lib/releaf/core/template_field_type_mapper.rb +0 -127
- data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
- data/lib/releaf/core/builders_autoload.rb +0 -27
- data/lib/releaf/core/configuration.rb +0 -101
- data/lib/releaf/core/engine.rb +0 -35
- data/lib/releaf/core/exceptions.rb +0 -38
- data/lib/releaf/core/settings_ui_component.rb +0 -7
- data/releaf-core.gemspec +0 -35
- data/spec/builders/builders/form_builder_spec.rb +0 -562
- data/spec/builders/builders/orderer_spec.rb +0 -22
- data/spec/builders/builders/page/header_builder_spec.rb +0 -143
- data/spec/builders/builders/page/layout_builder_spec.rb +0 -73
- data/spec/builders/builders/page/menu_builder_spec.rb +0 -160
- data/spec/builders/core/settings/form_builder_spec.rb +0 -69
- data/spec/controllers/releaf/core/settings_controller_spec.rb +0 -31
- data/spec/lib/releaf/core/assets_resolver_spec.rb +0 -113
- data/spec/lib/releaf/core/configuration_spec.rb +0 -230
- data/spec/lib/releaf/core/error_formatter_spec.rb +0 -242
- data/spec/lib/releaf/core/resource_table_fields_spec.rb +0 -18
- data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +0 -311
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Releaf::ActionController::Features
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
before_action :verify_feature_availability!
|
|
6
|
+
helper_method :feature_available?
|
|
7
|
+
rescue_from Releaf::FeatureDisabled, with: :feature_disabled
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def verify_feature_availability!
|
|
11
|
+
feature = action_feature(params[:action])
|
|
12
|
+
raise Releaf::FeatureDisabled, feature.to_s if feature.present? && !feature_available?(feature)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def action_feature(action)
|
|
16
|
+
action_features[action.to_sym]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def features
|
|
20
|
+
[:edit, :create, :create_another, :destroy, :index, :toolbox, :search]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def action_features
|
|
24
|
+
{
|
|
25
|
+
index: :index,
|
|
26
|
+
new: :create,
|
|
27
|
+
create: :create,
|
|
28
|
+
show: (feature_available?(:show) ? :show : :edit),
|
|
29
|
+
edit: :edit,
|
|
30
|
+
update: :edit,
|
|
31
|
+
confirm_destroy: :destroy,
|
|
32
|
+
destroy: :destroy
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def feature_disabled(exception)
|
|
37
|
+
@feature = exception.message
|
|
38
|
+
respond_with(nil, responder: action_responder(:feature_disabled))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def feature_available?(feature)
|
|
42
|
+
return false if feature.blank?
|
|
43
|
+
return false if feature == :create_another && !feature_available?(:create)
|
|
44
|
+
return false if feature == :search && !feature_available?(:index)
|
|
45
|
+
features.include? feature
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Releaf::ActionController::Notifications
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
# Tries to return resource class.
|
|
5
|
+
#
|
|
6
|
+
# If it fails to return proper resource class for your controller, or your
|
|
7
|
+
# controllers name has no relation to resource class name, then simply
|
|
8
|
+
# override this method to return class that you want.
|
|
9
|
+
#
|
|
10
|
+
def render_notification(status, success_message_key: "#{params[:action]} succeeded", failure_message_key: "#{params[:action]} failed", now: false)
|
|
11
|
+
if now == true
|
|
12
|
+
flash_target = flash.now
|
|
13
|
+
else
|
|
14
|
+
flash_target = flash
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if status
|
|
18
|
+
flash_target["success"] = { "id" => "resource_status", "message" => I18n.t(success_message_key, scope: notice_scope_name) }
|
|
19
|
+
else
|
|
20
|
+
flash_target["error"] = { "id" => "resource_status", "message" => I18n.t(failure_message_key, scope: notice_scope_name) }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns notice scope name
|
|
25
|
+
def notice_scope_name
|
|
26
|
+
'notices.' + controller_scope_name
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Releaf::ActionController::Resources
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :resource_class,
|
|
6
|
+
|
|
7
|
+
# Tries to return resource class.
|
|
8
|
+
#
|
|
9
|
+
# If it fails to return proper resource class for your controller, or your
|
|
10
|
+
# controllers name has no relation to resource class name, then simply
|
|
11
|
+
# override this method to return class that you want.
|
|
12
|
+
#
|
|
13
|
+
# @return class
|
|
14
|
+
def self.resource_class
|
|
15
|
+
self.name.split('::', 2).last.sub(/Controller$/, '').classify.constantize
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def resource_params
|
|
20
|
+
required_params.permit(*permitted_params)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# It sets various instance variables, that are later used in views and # controllers
|
|
24
|
+
def resources_per_page
|
|
25
|
+
40
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns which resource attributes can be updated with mass assignment.
|
|
29
|
+
#
|
|
30
|
+
# The resulting array will be passed to strong_parameters ``permit``
|
|
31
|
+
def permitted_params
|
|
32
|
+
Releaf::ResourceParams.new(resource_class).values
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def new_resource
|
|
36
|
+
@resource = resource_class.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def load_resource
|
|
40
|
+
@resource = resource_class.find(params[:id])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns true if @resource is assigned (even if it's nil)
|
|
44
|
+
def resource_given?
|
|
45
|
+
!!defined? @resource
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Return ActiveRecord::Relation used in index
|
|
49
|
+
#
|
|
50
|
+
# @return ActiveRecord::Relation
|
|
51
|
+
def resources
|
|
52
|
+
resource_class.all
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @return class
|
|
56
|
+
def resource_class
|
|
57
|
+
@resource_class ||= self.class.resource_class
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Releaf::ActionController::Search
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :searchable_fields
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def searchable_fields
|
|
9
|
+
@searchable_fields ||= Releaf::DefaultSearchableFields.new(resource_class).find
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def search(text)
|
|
13
|
+
return unless feature_available?(:search)
|
|
14
|
+
return if text.blank?
|
|
15
|
+
return if searchable_fields.blank?
|
|
16
|
+
@collection = searcher_class.prepare(relation: @collection, fields: searchable_fields, text: text)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def searcher_class
|
|
20
|
+
Releaf::Search
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Releaf::ActionController::Urls
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :current_path, :index_path
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Returns path to redirect after successul resource create/update actions
|
|
9
|
+
#
|
|
10
|
+
# @return [String] path
|
|
11
|
+
def success_path
|
|
12
|
+
if create_another?
|
|
13
|
+
url_for(action: :new, only_path: true)
|
|
14
|
+
else
|
|
15
|
+
url_for(action: :edit, id: @resource.id, only_path: true, index_path: index_path)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns index path for current request
|
|
20
|
+
#
|
|
21
|
+
# @return [String] path
|
|
22
|
+
def index_path
|
|
23
|
+
@index_path ||= resolve_index_path
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def resolve_index_path
|
|
27
|
+
# use current url
|
|
28
|
+
if action_name == "index"
|
|
29
|
+
current_path
|
|
30
|
+
# use from get params
|
|
31
|
+
elsif valid_index_path?(params[:index_path])
|
|
32
|
+
params[:index_path]
|
|
33
|
+
# fallback to index view
|
|
34
|
+
else
|
|
35
|
+
url_for(action: :index, only_path: true)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def valid_index_path?(value)
|
|
40
|
+
value.present? && value.is_a?(String) && value.first == "/"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns current path without internal params
|
|
44
|
+
#
|
|
45
|
+
# @return String
|
|
46
|
+
def current_path
|
|
47
|
+
@current_path ||= [request.path, (request.query_parameters.to_query if request.query_parameters.present?)].compact.join("?")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Releaf::ActionController::Views
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :active_view
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Returns action > view translation hash
|
|
9
|
+
# @return Hash
|
|
10
|
+
def action_views
|
|
11
|
+
{
|
|
12
|
+
new: :edit,
|
|
13
|
+
update: :edit,
|
|
14
|
+
create: :edit,
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Returns generic view name for given action
|
|
19
|
+
# @return String
|
|
20
|
+
def action_view(name_of_action)
|
|
21
|
+
action_views[name_of_action.to_sym] || name_of_action
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns generic view name for current action
|
|
25
|
+
# @return String
|
|
26
|
+
def active_view
|
|
27
|
+
action_view(action_name)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Releaf
|
|
2
|
+
class AssetsResolver
|
|
3
|
+
NONCOMPILED_PATTERN = /(javascripts|stylesheets)\/(controllers\/(.*?))\..*/
|
|
4
|
+
COMPILED_PATTERN = /controllers\/(.*?)\.(js|css)$/
|
|
5
|
+
TYPE_EXTENSION_MAP = {
|
|
6
|
+
"stylesheets" => "css",
|
|
7
|
+
"javascripts" => "js",
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
def self.base_assets
|
|
11
|
+
["releaf/application"]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.controller_assets(controller, type)
|
|
15
|
+
asset_path = "controllers/#{controller}.#{TYPE_EXTENSION_MAP[type.to_s]}"
|
|
16
|
+
base_assets + [assets[asset_path]].compact
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.noncompiled_assets
|
|
20
|
+
Rails.application.assets.each_file.map do|file|
|
|
21
|
+
match = file.to_s.match(NONCOMPILED_PATTERN)
|
|
22
|
+
"#{match[2]}.#{TYPE_EXTENSION_MAP[match[1]]}" if match
|
|
23
|
+
end.compact
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.compiled_assets
|
|
27
|
+
Rails.application.assets_manifest.files.map do|_, asset|
|
|
28
|
+
match = asset["logical_path"].match(COMPILED_PATTERN)
|
|
29
|
+
asset["logical_path"] if match
|
|
30
|
+
end.compact.uniq
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.compiled_assets?
|
|
34
|
+
Rails.application.assets.nil?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.assets_hash(assets)
|
|
38
|
+
assets.inject({}) do|hash, asset|
|
|
39
|
+
hash.update(asset => asset)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.assets
|
|
44
|
+
if compiled_assets?
|
|
45
|
+
@@compiled_assets ||= assets_hash(compiled_assets)
|
|
46
|
+
else
|
|
47
|
+
assets_hash(noncompiled_assets)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Releaf
|
|
2
|
+
class BuildErrorsHash
|
|
3
|
+
include Releaf::Service
|
|
4
|
+
attribute :resource, Object
|
|
5
|
+
attribute :field_name_prefix, String
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
errors.inject({}) do |h, item|
|
|
9
|
+
field_name = item.delete(:field_name)
|
|
10
|
+
h[field_name] ||= []
|
|
11
|
+
h[field_name] << item
|
|
12
|
+
h
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def errors
|
|
17
|
+
resource.errors.map do |attribute, message|
|
|
18
|
+
format_error(attribute, message)
|
|
19
|
+
end.flatten
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def attribute_error(attribute, message)
|
|
23
|
+
{
|
|
24
|
+
field_name: field_name(attribute),
|
|
25
|
+
error_code: message.error_code,
|
|
26
|
+
message: message.to_s,
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def format_error(attribute, message)
|
|
31
|
+
if resource_attribute?(attribute)
|
|
32
|
+
attribute_error(attribute, message)
|
|
33
|
+
else
|
|
34
|
+
nested_attribute_errors(attribute)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def nested_attribute_errors(attribute)
|
|
39
|
+
association_name = attribute.to_s.split('.', 2).first
|
|
40
|
+
if single_association?(association_name)
|
|
41
|
+
prefix_template = "#{field_name_prefix}[#{association_name}_attributes]"
|
|
42
|
+
nested_resources = [resource.send(association_name)]
|
|
43
|
+
else
|
|
44
|
+
prefix_template = "#{field_name_prefix}[#{association_name}_attributes][%d]"
|
|
45
|
+
nested_resources = resource.send(association_name)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
nested_resources.each_with_index.map do |nested_resource, i|
|
|
49
|
+
prefix = prefix_template % i
|
|
50
|
+
self.class.new(resource: nested_resource, field_name_prefix: prefix).errors
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def single_association?(association_name)
|
|
55
|
+
[:belongs_to, :has_one].include? association_type(association_name)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def resource_attribute?(attribute)
|
|
59
|
+
attribute !~ /\./
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def field_name(attribute)
|
|
63
|
+
return field_name_prefix if attribute.to_sym == :base
|
|
64
|
+
|
|
65
|
+
field = attribute
|
|
66
|
+
if association(attribute).present?
|
|
67
|
+
field = association(attribute).foreign_key.to_s
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
"#{field_name_prefix}[#{field}]"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def association_type(association_name)
|
|
74
|
+
association(association_name).macro
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def association(association_name)
|
|
78
|
+
resource.class.reflect_on_association(association_name.to_sym)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Releaf::ControllerDefinition
|
|
2
|
+
attr_accessor :name, :controller_name
|
|
3
|
+
|
|
4
|
+
def self.for(controller_name)
|
|
5
|
+
Releaf.application.config.controllers[controller_name]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def initialize(options)
|
|
9
|
+
options = {controller: options} if options.is_a? String
|
|
10
|
+
options[:name] ||= options[:controller]
|
|
11
|
+
self.name = options[:name]
|
|
12
|
+
self.controller_name = options[:controller]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def localized_name
|
|
16
|
+
I18n.t(name, scope: "admin.controllers")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def path
|
|
20
|
+
Rails.application.routes.url_helpers.url_for(action: :index, controller: controller_name, only_path: true)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class Releaf::ControllerGroupDefinition
|
|
2
|
+
attr_accessor :name, :controllers
|
|
3
|
+
|
|
4
|
+
def initialize(options)
|
|
5
|
+
self.name = options[:name]
|
|
6
|
+
self.controllers = options[:items].map{|option| Releaf::ControllerDefinition.new(option) }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def localized_name
|
|
10
|
+
I18n.t(name, scope: "admin.controllers")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Releaf::
|
|
1
|
+
class Releaf::ResourceBase
|
|
2
2
|
attr_accessor :resource_class
|
|
3
3
|
|
|
4
4
|
def initialize(resource_class)
|
|
@@ -14,21 +14,19 @@ class Releaf::Core::ResourceBase
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def localized_attributes
|
|
17
|
-
resource_class.translated_attribute_names.
|
|
17
|
+
@localized_attributes ||= localized_attributes? ? resource_class.translated_attribute_names.map(&:to_s) : []
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def base_attributes
|
|
21
|
-
resource_class.column_names
|
|
21
|
+
resource_class.column_names
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def values(include_associations: true)
|
|
25
|
-
list = base_attributes
|
|
26
|
-
list += localized_attributes if localized_attributes?
|
|
25
|
+
list = base_attributes + localized_attributes - excluded_attributes
|
|
27
26
|
list += associations_attributes if include_associations
|
|
28
27
|
list
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
|
|
32
30
|
def associations_attributes
|
|
33
31
|
associations.collect do |association|
|
|
34
32
|
{association.name => association_attributes(association)}
|
|
@@ -63,4 +61,14 @@ class Releaf::Core::ResourceBase
|
|
|
63
61
|
def excluded_associations
|
|
64
62
|
[:translations]
|
|
65
63
|
end
|
|
64
|
+
|
|
65
|
+
def self.title(resource)
|
|
66
|
+
title_methods.each do|method_name|
|
|
67
|
+
return resource.send(method_name) if resource.respond_to?(method_name)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.title_methods
|
|
72
|
+
[:releaf_title, :name, :title, :to_s]
|
|
73
|
+
end
|
|
66
74
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Releaf::
|
|
1
|
+
class Releaf::ResourceParams < Releaf::ResourceBase
|
|
2
2
|
|
|
3
3
|
def file_attributes
|
|
4
4
|
resource_class.dragonfly_attachment_classes.collect{|c| "#{c.attribute}_uid" }
|
|
@@ -16,7 +16,7 @@ class Releaf::Core::ResourceParams < Releaf::Core::ResourceBase
|
|
|
16
16
|
def base_attributes
|
|
17
17
|
super.inject([]) do|list, attribute|
|
|
18
18
|
if file_attribute?(attribute)
|
|
19
|
-
list
|
|
19
|
+
list + file_attribute_params(attribute)
|
|
20
20
|
else
|
|
21
21
|
list << attribute
|
|
22
22
|
end
|
|
@@ -25,7 +25,7 @@ class Releaf::Core::ResourceParams < Releaf::Core::ResourceBase
|
|
|
25
25
|
|
|
26
26
|
def localized_attributes
|
|
27
27
|
super.inject([]) do |list, column|
|
|
28
|
-
list
|
|
28
|
+
list + localized_attribute_params(column)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Releaf::
|
|
1
|
+
class Releaf::ResourceUtilities
|
|
2
2
|
# Lists relations for @resource with dependent: :restrict_with_exception
|
|
3
3
|
#
|
|
4
4
|
# @return hash of all related objects, who have dependancy :restrict_with_exception
|
|
@@ -27,7 +27,7 @@ class Releaf::Core::ResourceUtilities
|
|
|
27
27
|
# @return controller name
|
|
28
28
|
def self.association_controller(association)
|
|
29
29
|
guessed_name = association.name.to_s.pluralize
|
|
30
|
-
guessed_name if Releaf.application.config.controllers.values.map { |v| v
|
|
30
|
+
guessed_name if Releaf.application.config.controllers.values.map { |v| v.controller_name }.grep(/(\/#{guessed_name}$|^#{guessed_name}$)/).present?
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def self.destroyable?(resource)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
module Releaf::
|
|
1
|
+
module Releaf::Responders
|
|
2
2
|
class AfterSaveResponder < ActionController::Responder
|
|
3
3
|
delegate :render_notification, to: :controller
|
|
4
4
|
|
|
5
5
|
def json_resource_errors
|
|
6
|
-
{errors: Releaf::
|
|
6
|
+
{errors: Releaf::BuildErrorsHash.call(resource: resource, field_name_prefix: :resource)}
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def to_json
|
|
@@ -12,7 +12,7 @@ module Releaf::Core::Responders
|
|
|
12
12
|
elsif options[:redirect]
|
|
13
13
|
render json: {url: resource_location}, status: 303
|
|
14
14
|
else
|
|
15
|
-
redirect_to resource_location, status: 303
|
|
15
|
+
redirect_to resource_location, status: 303, turbolinks: false
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Releaf::Responders
|
|
2
|
+
|
|
3
|
+
def respond_with(resource = nil, options = {}, &block)
|
|
4
|
+
options[:responder] = active_responder unless options.has_key? :responder
|
|
5
|
+
super
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def action_responders
|
|
9
|
+
{
|
|
10
|
+
create: Releaf::Responders::AfterSaveResponder,
|
|
11
|
+
update: Releaf::Responders::AfterSaveResponder,
|
|
12
|
+
confirm_destroy: Releaf::Responders::ConfirmDestroyResponder,
|
|
13
|
+
destroy: Releaf::Responders::DestroyResponder,
|
|
14
|
+
access_denied: Releaf::Responders::AccessDeniedResponder,
|
|
15
|
+
feature_disabled: Releaf::Responders::FeatureDisabledResponder,
|
|
16
|
+
page_not_found: Releaf::Responders::PageNotFoundResponder,
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Returns generic view name for given action
|
|
21
|
+
# @return String
|
|
22
|
+
def action_responder(name_of_action)
|
|
23
|
+
action_responders[name_of_action.to_sym]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns generic view name for current action
|
|
27
|
+
# @return String
|
|
28
|
+
def active_responder
|
|
29
|
+
action_responder(action_name)
|
|
30
|
+
end
|
|
31
|
+
end
|