releaf-core 0.2.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,40 +0,0 @@
|
|
1
|
-
module Releaf::Tags
|
2
|
-
module AssociatedSetField
|
3
|
-
def releaf_associated_set_field(name, input: {}, label: {}, field: {}, options: {}, &block)
|
4
|
-
options = {field: {type: "associated-set"}}.deep_merge(options)
|
5
|
-
content = releaf_associated_set_content(name, input: input, options: options)
|
6
|
-
input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
|
7
|
-
end
|
8
|
-
|
9
|
-
def releaf_associated_set_content(name, input: {}, options: {})
|
10
|
-
association_options = options[:association]
|
11
|
-
association = object.send(name)
|
12
|
-
key_field = association_options[:field]
|
13
|
-
|
14
|
-
list = []
|
15
|
-
|
16
|
-
association_options[:items].each_pair do|value, label_text|
|
17
|
-
item = association.find_by(key_field => value) || association.build(key_field => value)
|
18
|
-
|
19
|
-
list << fields_for(name, item, relation_name: name, builder: self.class) do |builder|
|
20
|
-
builder.releaf_associated_set_item(association_options, label_text)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
safe_join do
|
25
|
-
list
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def releaf_associated_set_item(association_options, label_text)
|
31
|
-
wrapper(class: "type-associated-set-item") do
|
32
|
-
[hidden_field(:_destroy, value: object.new_record?, class: "destroy"),
|
33
|
-
check_box(association_options[:field], {class: "keep", name: "keep"}, (object.send(association_options[:field]) if object.persisted?)),
|
34
|
-
label(association_options[:field], label_text),
|
35
|
-
hidden_field(association_options[:field])
|
36
|
-
]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Releaf::Core::Settings
|
2
|
-
class FormBuilder < Releaf::Builders::FormBuilder
|
3
|
-
def field_names
|
4
|
-
[:value]
|
5
|
-
end
|
6
|
-
|
7
|
-
def render_value
|
8
|
-
method_name = "releaf_#{settings_field_type}_field"
|
9
|
-
send(method_name, :value, options: { label: { label_text: settings_field_label_text }})
|
10
|
-
end
|
11
|
-
|
12
|
-
def settings_field_label_text
|
13
|
-
label_text = Releaf::Settings.registry[object.var][:description]
|
14
|
-
label_text.present? ? t(label_text, scope: "settings") : "Value"
|
15
|
-
end
|
16
|
-
|
17
|
-
def settings_field_type
|
18
|
-
Releaf::Settings.registry[object.var].fetch(:type, :text)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Releaf
|
2
|
-
module Breadcrumbs
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
before_filter :build_breadcrumbs
|
7
|
-
end
|
8
|
-
|
9
|
-
def build_breadcrumbs
|
10
|
-
@breadcrumbs = [home_breadcrumb, controller_breadcrumb].compact
|
11
|
-
end
|
12
|
-
|
13
|
-
def home_breadcrumb
|
14
|
-
{ name: I18n.t('Home', scope: 'admin.breadcrumbs'), url: releaf_root_path }
|
15
|
-
end
|
16
|
-
|
17
|
-
def controller_breadcrumb
|
18
|
-
controller_params = Releaf.application.config.controllers[self.class.name.sub(/Controller$/, '').underscore]
|
19
|
-
if controller_params
|
20
|
-
{
|
21
|
-
name: I18n.t(controller_params[:name], scope: "admin.controllers"),
|
22
|
-
url: send("#{controller_params[:url_helper]}_path")
|
23
|
-
}
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def add_resource_breadcrumb resource, url = nil
|
28
|
-
if resource.new_record?
|
29
|
-
name= I18n.t('New record', scope: 'admin.breadcrumbs')
|
30
|
-
url = url_for(action: :new, only_path: true) if url.nil?
|
31
|
-
else
|
32
|
-
if resource.respond_to?(:to_text)
|
33
|
-
name = resource.send(:to_text)
|
34
|
-
else
|
35
|
-
name = I18n.t('Edit record', scope: 'admin.breadcrumbs')
|
36
|
-
end
|
37
|
-
url = url_for(action: :edit, id: resource.id, only_path: true) if url.nil?
|
38
|
-
end
|
39
|
-
@breadcrumbs << { name: name, url: url }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,458 +0,0 @@
|
|
1
|
-
module Releaf
|
2
|
-
class FeatureDisabled < StandardError; end
|
3
|
-
|
4
|
-
class BaseController < ActionController::Base
|
5
|
-
respond_to :html
|
6
|
-
respond_to :json, only: [:create, :update]
|
7
|
-
protect_from_forgery
|
8
|
-
include Releaf.application.config.access_control_module
|
9
|
-
include Releaf::Breadcrumbs
|
10
|
-
include Releaf::RichtextAttachments
|
11
|
-
include Releaf::Core::Responders
|
12
|
-
|
13
|
-
before_filter :manage_ajax, :setup, :verify_feature_availability!
|
14
|
-
|
15
|
-
rescue_from Releaf::Core::AccessDenied, with: :access_denied
|
16
|
-
rescue_from Releaf::FeatureDisabled, with: :feature_disabled
|
17
|
-
|
18
|
-
layout :layout
|
19
|
-
|
20
|
-
helper_method \
|
21
|
-
:form_options,
|
22
|
-
:table_options,
|
23
|
-
:ajax?,
|
24
|
-
:controller_scope_name,
|
25
|
-
:current_url,
|
26
|
-
:active_view,
|
27
|
-
:index_url,
|
28
|
-
:page_title,
|
29
|
-
:resource_class,
|
30
|
-
:feature_available?,
|
31
|
-
:builder_class,
|
32
|
-
:searchable_fields
|
33
|
-
|
34
|
-
def search(text)
|
35
|
-
return if text.blank?
|
36
|
-
return if searchable_fields.blank?
|
37
|
-
@collection = searcher_class.prepare(relation: @collection, fields: searchable_fields, text: text)
|
38
|
-
end
|
39
|
-
|
40
|
-
def searcher_class
|
41
|
-
Releaf::Core::Search
|
42
|
-
end
|
43
|
-
|
44
|
-
def index
|
45
|
-
prepare_index
|
46
|
-
respond_with(@collection)
|
47
|
-
end
|
48
|
-
|
49
|
-
def new
|
50
|
-
prepare_new
|
51
|
-
respond_with(@resource)
|
52
|
-
end
|
53
|
-
|
54
|
-
def show
|
55
|
-
if feature_available?(:show)
|
56
|
-
prepare_show
|
57
|
-
else
|
58
|
-
redirect_to url_for(action: 'edit', id: params[:id])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def edit
|
63
|
-
prepare_edit
|
64
|
-
respond_with(@resource)
|
65
|
-
end
|
66
|
-
|
67
|
-
def create
|
68
|
-
prepare_create
|
69
|
-
@resource.save
|
70
|
-
respond_with(@resource, location: (success_url if @resource.persisted?), redirect: true)
|
71
|
-
end
|
72
|
-
|
73
|
-
def update
|
74
|
-
prepare_update
|
75
|
-
@resource.update_attributes(resource_params)
|
76
|
-
respond_with(@resource, location: success_url)
|
77
|
-
end
|
78
|
-
|
79
|
-
def confirm_destroy
|
80
|
-
prepare_destroy
|
81
|
-
@restricted_relations = Releaf::Core::ResourceUtilities.restricted_relations(@resource)
|
82
|
-
respond_with(@resource, destroyable: destroyable?)
|
83
|
-
end
|
84
|
-
|
85
|
-
def toolbox
|
86
|
-
prepare_toolbox
|
87
|
-
respond_with(@resource)
|
88
|
-
end
|
89
|
-
|
90
|
-
def destroy
|
91
|
-
prepare_destroy
|
92
|
-
@resource.destroy if destroyable?
|
93
|
-
respond_with(@resource, location: index_url)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Check if @resource has existing restrict relation and it can be deleted
|
97
|
-
#
|
98
|
-
# @return boolean true or false
|
99
|
-
def destroyable?
|
100
|
-
Releaf::Core::ResourceUtilities.destroyable?(@resource)
|
101
|
-
end
|
102
|
-
|
103
|
-
# Helper methods ##############################################################################
|
104
|
-
|
105
|
-
# Returns current url without internal params
|
106
|
-
#
|
107
|
-
# @return String
|
108
|
-
def current_url
|
109
|
-
@current_url ||= [request.path, (request.query_parameters.to_query if request.query_parameters.present?)].compact.join("?")
|
110
|
-
end
|
111
|
-
|
112
|
-
# Returns index url for current request
|
113
|
-
#
|
114
|
-
# @return String
|
115
|
-
def index_url
|
116
|
-
if @index_url.nil?
|
117
|
-
# use current url
|
118
|
-
if action_name == "index"
|
119
|
-
@index_url = current_url
|
120
|
-
# use from get params
|
121
|
-
elsif params[:index_url].present?
|
122
|
-
@index_url = params[:index_url]
|
123
|
-
# fallback to index view
|
124
|
-
else
|
125
|
-
@index_url = url_for(action: 'index')
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
@index_url
|
130
|
-
end
|
131
|
-
|
132
|
-
# Tries to return resource class.
|
133
|
-
#
|
134
|
-
# If it fails to return proper resource class for your controller, or your
|
135
|
-
# controllers name has no relation to resource class name, then simply
|
136
|
-
# override this method to return class that you want.
|
137
|
-
#
|
138
|
-
# @return class
|
139
|
-
def self.resource_class
|
140
|
-
self.name.split('::', 2).last.sub(/Controller$/, '').classify.constantize
|
141
|
-
end
|
142
|
-
|
143
|
-
# Tries to return resource class.
|
144
|
-
#
|
145
|
-
# If it fails to return proper resource class for your controller, or your
|
146
|
-
# controllers name has no relation to resource class name, then simply
|
147
|
-
# override this method to return class that you want.
|
148
|
-
#
|
149
|
-
# @return class
|
150
|
-
def resource_class
|
151
|
-
@resource_class ||= self.class.resource_class
|
152
|
-
end
|
153
|
-
|
154
|
-
# Returns action > view translation hash
|
155
|
-
# @return Hash
|
156
|
-
def action_views
|
157
|
-
{
|
158
|
-
new: :edit,
|
159
|
-
update: :edit,
|
160
|
-
create: :edit,
|
161
|
-
}
|
162
|
-
end
|
163
|
-
|
164
|
-
# Returns generic view name for given action
|
165
|
-
# @return String
|
166
|
-
def action_view(_action_name)
|
167
|
-
action_views[_action_name.to_sym] || _action_name
|
168
|
-
end
|
169
|
-
|
170
|
-
# Returns generic view name for current action
|
171
|
-
# @return String
|
172
|
-
def active_view
|
173
|
-
action_view(action_name)
|
174
|
-
end
|
175
|
-
|
176
|
-
def form_url(form_type, object)
|
177
|
-
url_for(action: object.new_record? ? 'create' : 'update', id: object.id)
|
178
|
-
end
|
179
|
-
|
180
|
-
def form_attributes(form_type, object, object_name)
|
181
|
-
action = object.respond_to?(:persisted?) && object.persisted? ? :edit : :new
|
182
|
-
action_object_name = "#{action}-#{object_name}"
|
183
|
-
classes = [ action_object_name ]
|
184
|
-
classes << "has-error" if object.errors.any?
|
185
|
-
{
|
186
|
-
multipart: true,
|
187
|
-
id: action_object_name,
|
188
|
-
class: classes,
|
189
|
-
data: {
|
190
|
-
"remote" => true,
|
191
|
-
"remote-validation" => true,
|
192
|
-
"type" => :json,
|
193
|
-
},
|
194
|
-
novalidate: ''
|
195
|
-
}
|
196
|
-
end
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
def builder_class(builder_type)
|
201
|
-
Releaf::Builders.builder_class(builder_scopes, builder_type)
|
202
|
-
end
|
203
|
-
|
204
|
-
def application_builder_scope
|
205
|
-
[application_scope, "Builders"].reject(&:blank?).join("::")
|
206
|
-
end
|
207
|
-
|
208
|
-
def application_scope
|
209
|
-
scope = Releaf.application.config.mount_location.capitalize
|
210
|
-
scope if scope.present? && Releaf::Builders.constant_defined_at_scope?(scope, Object)
|
211
|
-
end
|
212
|
-
|
213
|
-
def builder_scopes
|
214
|
-
[self.class.name.gsub(/Controller$/, ""), application_builder_scope]
|
215
|
-
end
|
216
|
-
|
217
|
-
def form_options(form_type, object, object_name)
|
218
|
-
{
|
219
|
-
builder: builder_class(:form),
|
220
|
-
as: object_name,
|
221
|
-
url: form_url(form_type, object),
|
222
|
-
html: form_attributes(form_type, object, object_name)
|
223
|
-
}
|
224
|
-
end
|
225
|
-
|
226
|
-
def table_options
|
227
|
-
{
|
228
|
-
builder: builder_class(:table),
|
229
|
-
toolbox: feature_available?(:toolbox)
|
230
|
-
}
|
231
|
-
end
|
232
|
-
|
233
|
-
# return contoller translation scope name for using
|
234
|
-
# with I18.translation call within hash params
|
235
|
-
# ex. t("save", scope: controller_scope_name)
|
236
|
-
def controller_scope_name
|
237
|
-
@controller_scope_name ||= 'admin.' + self.class.name.sub(/Controller$/, '').underscore.gsub('/', '_')
|
238
|
-
end
|
239
|
-
|
240
|
-
def feature_available? feature
|
241
|
-
@features[feature].present?
|
242
|
-
end
|
243
|
-
|
244
|
-
def page_title
|
245
|
-
I18n.t(params[:controller], scope: "admin.controllers") + " - " + Rails.application.class.parent_name
|
246
|
-
end
|
247
|
-
|
248
|
-
def render_notification(status, success_message_key: "#{params[:action]} succeeded", failure_message_key: "#{params[:action]} failed", now: false)
|
249
|
-
if now == true
|
250
|
-
flash_target = flash.now
|
251
|
-
else
|
252
|
-
flash_target = flash
|
253
|
-
end
|
254
|
-
|
255
|
-
if status
|
256
|
-
flash_target["success"] = { "id" => "resource_status", "message" => I18n.t(success_message_key, scope: notice_scope_name) }
|
257
|
-
else
|
258
|
-
flash_target["error"] = { "id" => "resource_status", "message" => I18n.t(failure_message_key, scope: notice_scope_name) }
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
def prepare_index
|
263
|
-
# load resource only if they are not loaded yet
|
264
|
-
@collection = resources unless collection_given?
|
265
|
-
|
266
|
-
search(params[:search])
|
267
|
-
|
268
|
-
unless @resources_per_page.nil?
|
269
|
-
@collection = @collection.page( params[:page] ).per_page( @resources_per_page )
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
def prepare_new
|
274
|
-
# load resource only if is not initialized yet
|
275
|
-
new_resource unless resource_given?
|
276
|
-
add_resource_breadcrumb(@resource)
|
277
|
-
end
|
278
|
-
|
279
|
-
def prepare_create
|
280
|
-
# load resource only if is not initialized yet
|
281
|
-
new_resource unless resource_given?
|
282
|
-
@resource.assign_attributes(resource_params)
|
283
|
-
end
|
284
|
-
|
285
|
-
def prepare_show
|
286
|
-
prepare_resource_view
|
287
|
-
end
|
288
|
-
|
289
|
-
def prepare_edit
|
290
|
-
prepare_resource_view
|
291
|
-
end
|
292
|
-
|
293
|
-
def prepare_resource_view
|
294
|
-
# load resource only if is not loaded yet
|
295
|
-
load_resource unless resource_given?
|
296
|
-
add_resource_breadcrumb(@resource)
|
297
|
-
end
|
298
|
-
|
299
|
-
def prepare_update
|
300
|
-
# load resource only if is not loaded yet
|
301
|
-
load_resource unless resource_given?
|
302
|
-
end
|
303
|
-
|
304
|
-
def prepare_destroy
|
305
|
-
load_resource
|
306
|
-
end
|
307
|
-
|
308
|
-
def prepare_toolbox
|
309
|
-
load_resource
|
310
|
-
end
|
311
|
-
|
312
|
-
def new_resource
|
313
|
-
@resource = resource_class.new
|
314
|
-
end
|
315
|
-
|
316
|
-
def load_resource
|
317
|
-
@resource = resource_class.find(params[:id])
|
318
|
-
end
|
319
|
-
|
320
|
-
def verify_feature_availability!
|
321
|
-
feature = action_feature(params[:action])
|
322
|
-
raise FeatureDisabled, feature.to_s if (feature.present? && !feature_available?(feature))
|
323
|
-
end
|
324
|
-
|
325
|
-
def action_feature action
|
326
|
-
action_features[action]
|
327
|
-
end
|
328
|
-
|
329
|
-
def action_features
|
330
|
-
{
|
331
|
-
index: :index,
|
332
|
-
new: :create,
|
333
|
-
create: :create,
|
334
|
-
show: (feature_available?(:show) ? :show : :edit),
|
335
|
-
edit: :edit,
|
336
|
-
update: :edit,
|
337
|
-
confirm_destroy: :destroy,
|
338
|
-
destroy: :destroy
|
339
|
-
}.with_indifferent_access
|
340
|
-
end
|
341
|
-
|
342
|
-
# Returns true if @resource is assigned (even if it's nil)
|
343
|
-
def resource_given?
|
344
|
-
!!defined? @resource
|
345
|
-
end
|
346
|
-
|
347
|
-
# Returns true if @collection is assigned (even if it's nil)
|
348
|
-
def collection_given?
|
349
|
-
!!defined? @collection
|
350
|
-
end
|
351
|
-
|
352
|
-
# Returns notice scope name
|
353
|
-
def notice_scope_name
|
354
|
-
'notices.' + controller_scope_name
|
355
|
-
end
|
356
|
-
|
357
|
-
# Return ActiveRecord::Relation used in index
|
358
|
-
#
|
359
|
-
# @return ActiveRecord::Relation
|
360
|
-
def resources
|
361
|
-
resource_class.all
|
362
|
-
end
|
363
|
-
|
364
|
-
def required_params
|
365
|
-
params.require(:resource)
|
366
|
-
end
|
367
|
-
|
368
|
-
# Called before each request by before_filter.
|
369
|
-
# It sets various instance variables, that are later used in views and # controllers
|
370
|
-
#
|
371
|
-
# == Defines
|
372
|
-
# @features::
|
373
|
-
# Hash with symbol keys and boolean values. Each key represents action
|
374
|
-
# (currently only `:edit`, `:create`, `:destroy` are supported). If one
|
375
|
-
# of features is disabled, then routing to it will raise <tt>Releaf::FeatureDisabled</tt>
|
376
|
-
# error
|
377
|
-
#
|
378
|
-
# @resources_per_page::
|
379
|
-
# Integer - sets the number of resources to display on `#index` view
|
380
|
-
#
|
381
|
-
# To change controller settings `setup` method should be overriden like this
|
382
|
-
#
|
383
|
-
# @example
|
384
|
-
# def setup
|
385
|
-
# super
|
386
|
-
# @features[:edit] = false
|
387
|
-
# @resources_per_page = 20
|
388
|
-
# end
|
389
|
-
def setup
|
390
|
-
@features = {
|
391
|
-
show: false,
|
392
|
-
edit: true,
|
393
|
-
create: true,
|
394
|
-
create_another: true,
|
395
|
-
destroy: true,
|
396
|
-
index: true,
|
397
|
-
toolbox: true
|
398
|
-
}
|
399
|
-
@panel_layout = true
|
400
|
-
@resources_per_page = 40
|
401
|
-
end
|
402
|
-
|
403
|
-
def searchable_fields
|
404
|
-
@searchable_fields ||= Releaf::Core::DefaultSearchableFields.new(resource_class).find
|
405
|
-
end
|
406
|
-
|
407
|
-
def resource_params
|
408
|
-
required_params.permit(*permitted_params)
|
409
|
-
end
|
410
|
-
|
411
|
-
# Returns which resource attributes can be updated with mass assignment.
|
412
|
-
#
|
413
|
-
# The resulting array will be passed to strong_parameters ``permit``
|
414
|
-
def permitted_params
|
415
|
-
Releaf::Core::ResourceParams.new(resource_class).values
|
416
|
-
end
|
417
|
-
|
418
|
-
# Returns url to redirect after successul resource create/update actions
|
419
|
-
#
|
420
|
-
# @return [String] url
|
421
|
-
def success_url
|
422
|
-
if create_another?
|
423
|
-
url_for(action: 'new')
|
424
|
-
else
|
425
|
-
url_for(action: 'edit', id: @resource.id, index_url: index_url)
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
def create_another?
|
430
|
-
params[:after_save] == "create_another" && feature_available?(:create_another)
|
431
|
-
end
|
432
|
-
|
433
|
-
def feature_disabled exception
|
434
|
-
@feature = exception.message
|
435
|
-
respond_with(nil, responder: action_responder(:feature_disabled))
|
436
|
-
end
|
437
|
-
|
438
|
-
def access_denied
|
439
|
-
respond_with(nil, responder: action_responder(:access_denied))
|
440
|
-
end
|
441
|
-
|
442
|
-
def ajax?
|
443
|
-
@_ajax || false
|
444
|
-
end
|
445
|
-
|
446
|
-
def layout
|
447
|
-
ajax? ? false : "releaf/admin"
|
448
|
-
end
|
449
|
-
|
450
|
-
def manage_ajax
|
451
|
-
@_ajax = params.has_key? :ajax
|
452
|
-
if @_ajax
|
453
|
-
request.query_parameters.delete(:ajax)
|
454
|
-
params.delete(:ajax)
|
455
|
-
end
|
456
|
-
end
|
457
|
-
end
|
458
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
class Releaf::Core::SettingsController < ::Releaf::BaseController
|
2
|
-
|
3
|
-
def self.resource_class
|
4
|
-
::Releaf::Settings
|
5
|
-
end
|
6
|
-
|
7
|
-
def resources
|
8
|
-
super.where(thing_type: nil, var: resource_class.registered_keys)
|
9
|
-
end
|
10
|
-
|
11
|
-
def normalize_value(value)
|
12
|
-
case resource_class.registry[@resource.var][:type]
|
13
|
-
when :boolean
|
14
|
-
value == '1'
|
15
|
-
when :date
|
16
|
-
Date.parse(value)
|
17
|
-
when :time
|
18
|
-
Time.parse(value)
|
19
|
-
when :datetime
|
20
|
-
DateTime.parse(value)
|
21
|
-
when :integer
|
22
|
-
value.to_i
|
23
|
-
when :float
|
24
|
-
value.to_s.sub(",", ".").to_f
|
25
|
-
when :decimal
|
26
|
-
value.to_s.sub(",", ".").to_d
|
27
|
-
else
|
28
|
-
value
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def searchable_fields
|
33
|
-
[:var]
|
34
|
-
end
|
35
|
-
|
36
|
-
protected
|
37
|
-
|
38
|
-
def prepare_update
|
39
|
-
@resource = resource_class.find(params[:id]) unless resource_given?
|
40
|
-
params[:resource][:value] = normalize_value(params[:resource][:value])
|
41
|
-
end
|
42
|
-
|
43
|
-
def setup
|
44
|
-
super
|
45
|
-
@features = {
|
46
|
-
edit: true,
|
47
|
-
index: true,
|
48
|
-
}
|
49
|
-
end
|
50
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
module Releaf
|
2
|
-
module JavascriptHelper
|
3
|
-
|
4
|
-
# converts date format used by ruby to dateformat used by jquery (when possible)
|
5
|
-
#
|
6
|
-
# references:
|
7
|
-
# http://www.ruby-doc.org/core-2.0/Time.html#strftime-method
|
8
|
-
# http://api.jqueryui.com/datepicker/#utility-formatDate
|
9
|
-
# http://trentrichardson.com/examples/timepicker/#tp-formatting
|
10
|
-
def jquery_date_format date_format
|
11
|
-
|
12
|
-
raise ArgumentError, "date_format is not a string" unless date_format.is_a? String
|
13
|
-
|
14
|
-
ruby2jquery = {
|
15
|
-
'%' => '%',
|
16
|
-
'-d' => 'd',
|
17
|
-
'-j' => 'o',
|
18
|
-
'-m' => 'm',
|
19
|
-
'3N' => 'l',
|
20
|
-
':z' => 'Z',
|
21
|
-
'A' => nil,
|
22
|
-
'B' => 'MM',
|
23
|
-
'C' => nil,
|
24
|
-
'D' => 'mm/dd/y',
|
25
|
-
'F' => 'yy-mm-dd',
|
26
|
-
'G' => nil,
|
27
|
-
'H' => 'HH',
|
28
|
-
'I' => 'h',
|
29
|
-
'L' => 'l',
|
30
|
-
'M' => 'mm',
|
31
|
-
'P' => 'tt',
|
32
|
-
'R' => 'HH:mm',
|
33
|
-
'S' => 'ss',
|
34
|
-
'T' => 'HH:mm:ss',
|
35
|
-
'U' => nil,
|
36
|
-
'V' => nil,
|
37
|
-
'W' => nil,
|
38
|
-
'X' => 'HH:mm:ss',
|
39
|
-
'Y' => 'yy',
|
40
|
-
'Z' => nil,
|
41
|
-
'_m' => 'm',
|
42
|
-
'a' => nil,
|
43
|
-
'b' => 'M',
|
44
|
-
'c' => 'M d HH:mm:ss yy', # not exact translation
|
45
|
-
'd' => 'dd',
|
46
|
-
'e' => 'd',
|
47
|
-
'g' => nil,
|
48
|
-
'h' => 'M',
|
49
|
-
'j' => 'oo',
|
50
|
-
'k' => 'H',
|
51
|
-
'l' => 'hh',
|
52
|
-
'm' => 'mm',
|
53
|
-
'n' => nil,
|
54
|
-
'p' => 'TT',
|
55
|
-
'r' => 'h:mm:ss TT',
|
56
|
-
's' => '@',
|
57
|
-
't' => nil,
|
58
|
-
'u' => nil,
|
59
|
-
'v' => nil,
|
60
|
-
'w' => nil,
|
61
|
-
'x' => 'mm/dd/y',
|
62
|
-
'y' => 'y',
|
63
|
-
'z' => nil
|
64
|
-
}
|
65
|
-
|
66
|
-
match_regexp = Regexp.new "%( #{ruby2jquery.reject { |k,v| v.nil? }.keys.join('|') })"
|
67
|
-
jquery_date_format = date_format.gsub(match_regexp) do |match|
|
68
|
-
ruby2jquery[match[1..-1]]
|
69
|
-
end
|
70
|
-
|
71
|
-
return jquery_date_format
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|