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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
class Releaf::Builders::TableBuilder
|
|
2
2
|
include Releaf::Builders::Base
|
|
3
3
|
include Releaf::Builders::Toolbox
|
|
4
|
-
include Releaf::Builders::Orderer
|
|
5
4
|
attr_accessor :collection, :options, :template, :resource_class
|
|
6
5
|
|
|
7
6
|
def initialize(collection, resource_class, template, options)
|
|
@@ -12,7 +11,7 @@ class Releaf::Builders::TableBuilder
|
|
|
12
11
|
end
|
|
13
12
|
|
|
14
13
|
def column_names
|
|
15
|
-
Releaf::
|
|
14
|
+
Releaf::ResourceTableFields.new(resource_class).values(include_associations: false)
|
|
16
15
|
end
|
|
17
16
|
|
|
18
17
|
def columns
|
|
@@ -57,7 +56,7 @@ class Releaf::Builders::TableBuilder
|
|
|
57
56
|
tag(:thead) do
|
|
58
57
|
tag(:tr) do
|
|
59
58
|
content = ActiveSupport::SafeBuffer.new
|
|
60
|
-
columns.each_pair do|column,
|
|
59
|
+
columns.each_pair do|column, _options|
|
|
61
60
|
content << head_cell(column)
|
|
62
61
|
end
|
|
63
62
|
content
|
|
@@ -73,8 +72,8 @@ class Releaf::Builders::TableBuilder
|
|
|
73
72
|
|
|
74
73
|
def head_cell_content(column)
|
|
75
74
|
unless column.to_sym == :toolbox
|
|
76
|
-
attribute = column.to_s.
|
|
77
|
-
resource_class.human_attribute_name(attribute
|
|
75
|
+
attribute = column.to_s.tr(".", "_")
|
|
76
|
+
resource_class.human_attribute_name(attribute)
|
|
78
77
|
end
|
|
79
78
|
end
|
|
80
79
|
|
|
@@ -98,14 +97,14 @@ class Releaf::Builders::TableBuilder
|
|
|
98
97
|
|
|
99
98
|
def row_url(resource)
|
|
100
99
|
resource_action = row_url_action(resource)
|
|
101
|
-
url_for(action: resource_action, id: resource.id,
|
|
100
|
+
url_for(action: resource_action, id: resource.id, index_path: index_path) if resource_action
|
|
102
101
|
end
|
|
103
102
|
|
|
104
|
-
def row_url_action(
|
|
103
|
+
def row_url_action(_resource)
|
|
105
104
|
if feature_available?(:show)
|
|
106
|
-
|
|
105
|
+
:show
|
|
107
106
|
elsif feature_available?(:edit)
|
|
108
|
-
|
|
107
|
+
:edit
|
|
109
108
|
end
|
|
110
109
|
end
|
|
111
110
|
|
|
@@ -148,11 +147,7 @@ class Releaf::Builders::TableBuilder
|
|
|
148
147
|
|
|
149
148
|
def format_string_content(resource, column)
|
|
150
149
|
value = column_value(resource, column)
|
|
151
|
-
|
|
152
|
-
value.to_text
|
|
153
|
-
else
|
|
154
|
-
value.to_s
|
|
155
|
-
end
|
|
150
|
+
resource_title(value)
|
|
156
151
|
end
|
|
157
152
|
|
|
158
153
|
def format_boolean_content(resource, column)
|
|
@@ -169,13 +164,6 @@ class Releaf::Builders::TableBuilder
|
|
|
169
164
|
I18n.l(value, format: :default, default: '%Y-%m-%d %H:%M:%S') unless value.nil?
|
|
170
165
|
end
|
|
171
166
|
|
|
172
|
-
def format_image_content(resource, column)
|
|
173
|
-
if resource.send(column).present?
|
|
174
|
-
association_name = column.to_s.sub(/_uid$/, '')
|
|
175
|
-
image_tag(resource.send(association_name).thumb('x16').url, alt: '')
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
167
|
def format_association_content(resource, column)
|
|
180
168
|
format_string_content(resource, association_name(column))
|
|
181
169
|
end
|
|
@@ -213,8 +201,14 @@ class Releaf::Builders::TableBuilder
|
|
|
213
201
|
|
|
214
202
|
def column_type_format_method(column)
|
|
215
203
|
klass = column_klass(resource_class, column)
|
|
204
|
+
type = column_type(klass, column)
|
|
205
|
+
|
|
206
|
+
type_format_method(type)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def type_format_method(type)
|
|
210
|
+
format_method = "format_#{type}_content".to_sym
|
|
216
211
|
|
|
217
|
-
format_method = "format_#{column_type(klass, column)}_content".to_sym
|
|
218
212
|
if respond_to?(format_method)
|
|
219
213
|
format_method
|
|
220
214
|
else
|
|
@@ -242,23 +236,17 @@ class Releaf::Builders::TableBuilder
|
|
|
242
236
|
def cell_format_method(column)
|
|
243
237
|
if association_column?(column)
|
|
244
238
|
:format_association_content
|
|
245
|
-
elsif image_column?(column)
|
|
246
|
-
:format_image_content
|
|
247
239
|
else
|
|
248
240
|
column_type_format_method(column)
|
|
249
241
|
end
|
|
250
242
|
end
|
|
251
243
|
|
|
252
|
-
def image_column?(column)
|
|
253
|
-
column =~ /(thumbnail|image|photo|picture|avatar|logo|icon)_uid$/
|
|
254
|
-
end
|
|
255
|
-
|
|
256
244
|
def association_column?(column)
|
|
257
245
|
!!(column =~ /_id$/) && resource_class.reflections[association_name(column).to_s].present?
|
|
258
246
|
end
|
|
259
247
|
|
|
260
248
|
def toolbox_cell(resource, options)
|
|
261
|
-
toolbox_args = {
|
|
249
|
+
toolbox_args = {index_path: index_path}.merge(options.fetch(:toolbox, {}))
|
|
262
250
|
tag(:td, class: "only-icon toolbox-cell") do
|
|
263
251
|
toolbox(resource, toolbox_args)
|
|
264
252
|
end
|
|
@@ -269,7 +257,9 @@ class Releaf::Builders::TableBuilder
|
|
|
269
257
|
|
|
270
258
|
tag(:td) do
|
|
271
259
|
if options[:url].blank?
|
|
272
|
-
|
|
260
|
+
tag(:span) do
|
|
261
|
+
content
|
|
262
|
+
end
|
|
273
263
|
else
|
|
274
264
|
tag(:a, href: options[:url]) do
|
|
275
265
|
content
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module Releaf::Builders::Utilities
|
|
2
|
+
class DateFields
|
|
3
|
+
RUBY_TO_JQUERY_DATE_FORMAT_MAP = {
|
|
4
|
+
'-d' => 'd',
|
|
5
|
+
'-j' => 'o',
|
|
6
|
+
'-m' => 'm',
|
|
7
|
+
'3N' => 'l',
|
|
8
|
+
':z' => 'Z',
|
|
9
|
+
'B' => 'MM',
|
|
10
|
+
'D' => 'mm/dd/y',
|
|
11
|
+
'F' => 'yy-mm-dd',
|
|
12
|
+
'H' => 'HH',
|
|
13
|
+
'I' => 'h',
|
|
14
|
+
'L' => 'l',
|
|
15
|
+
'M' => 'mm',
|
|
16
|
+
'P' => 'tt',
|
|
17
|
+
'R' => 'HH:mm',
|
|
18
|
+
'S' => 'ss',
|
|
19
|
+
'T' => 'HH:mm:ss',
|
|
20
|
+
'X' => 'HH:mm:ss',
|
|
21
|
+
'Y' => 'yy',
|
|
22
|
+
'_m' => 'm',
|
|
23
|
+
'b' => 'M',
|
|
24
|
+
'c' => 'M d HH:mm:ss yy', # not exact translation
|
|
25
|
+
'd' => 'dd',
|
|
26
|
+
'e' => 'd',
|
|
27
|
+
'h' => 'M',
|
|
28
|
+
'j' => 'oo',
|
|
29
|
+
'k' => 'H',
|
|
30
|
+
'l' => 'hh',
|
|
31
|
+
'm' => 'mm',
|
|
32
|
+
'p' => 'TT',
|
|
33
|
+
'r' => 'h:mm:ss TT',
|
|
34
|
+
's' => '@',
|
|
35
|
+
'x' => 'mm/dd/y',
|
|
36
|
+
'y' => 'y'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# converts date format used by ruby to dateformat used by jquery (when possible)
|
|
40
|
+
#
|
|
41
|
+
# references:
|
|
42
|
+
# http://www.ruby-doc.org/core-2.0/Time.html#strftime-method
|
|
43
|
+
# http://api.jqueryui.com/datepicker/#utility-formatDate
|
|
44
|
+
# http://trentrichardson.com/examples/timepicker/#tp-formatting
|
|
45
|
+
def self.jquery_date_format(ruby_date_format)
|
|
46
|
+
ruby_date_format.gsub(ruby_date_format_regexp) do |match|
|
|
47
|
+
RUBY_TO_JQUERY_DATE_FORMAT_MAP[match[1..-1]]
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.ruby_date_format_regexp
|
|
52
|
+
@@jquery_date_replacement_regexp ||= Regexp.new("%(#{RUBY_TO_JQUERY_DATE_FORMAT_MAP.keys.join('|')})")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.normalize_date_or_time_value(value, type)
|
|
56
|
+
case type
|
|
57
|
+
when :date
|
|
58
|
+
value.to_date
|
|
59
|
+
when :datetime
|
|
60
|
+
value.to_datetime
|
|
61
|
+
when :time
|
|
62
|
+
value.to_time
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def self.format_date_or_time_value(value, type)
|
|
67
|
+
return value if value.nil?
|
|
68
|
+
|
|
69
|
+
default_format = date_or_time_default_format(type)
|
|
70
|
+
value = normalize_date_or_time_value(value, type)
|
|
71
|
+
|
|
72
|
+
if type == :time
|
|
73
|
+
value.strftime(default_format)
|
|
74
|
+
else
|
|
75
|
+
I18n.l(value, default: default_format)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.time_format_for_jquery
|
|
80
|
+
format = date_or_time_default_format(:time)
|
|
81
|
+
jquery_date_format(format)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.date_format_for_jquery
|
|
85
|
+
format = date_or_time_default_format(:date)
|
|
86
|
+
jquery_date_format(I18n.t("default", scope: "date.formats", default: format))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.date_or_time_default_format(type)
|
|
90
|
+
case type
|
|
91
|
+
when :date
|
|
92
|
+
"%Y-%m-%d"
|
|
93
|
+
when :datetime
|
|
94
|
+
"%Y-%m-%d %H:%M"
|
|
95
|
+
when :time
|
|
96
|
+
"%H:%M"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Releaf::Builders::Utilities
|
|
2
|
+
class ResolveAttributeFieldMethodName
|
|
3
|
+
include Releaf::Service
|
|
4
|
+
attribute :object, Object
|
|
5
|
+
attribute :attribute_name, String
|
|
6
|
+
|
|
7
|
+
FIELD_TYPE_RESOLVERS = {
|
|
8
|
+
string: [:image, :file, :password, :email, :link, :text],
|
|
9
|
+
text: [:link, :richtext, :textarea],
|
|
10
|
+
integer: [:item],
|
|
11
|
+
datetime: [],
|
|
12
|
+
date: [],
|
|
13
|
+
time: [],
|
|
14
|
+
float: [],
|
|
15
|
+
decimal: [],
|
|
16
|
+
boolean: [],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
def call
|
|
20
|
+
"releaf_#{field_type}_#{"i18n_" if localized_attribute?}field"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def field_type
|
|
24
|
+
column_field_type_resolvers.find{|resolver_name| send("#{resolver_name}?") == true } || column_type
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def column_type
|
|
28
|
+
@column_type ||= columns_class.columns_hash[attribute_name] ? columns_class.columns_hash[attribute_name].type : :string
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def columns_class
|
|
32
|
+
localized_attribute? ? object.class::Translation : object.class
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def localized_attribute?
|
|
36
|
+
@localized_attribute ||= (object.class.respond_to?(:translates?) && object.class.translates? &&
|
|
37
|
+
object.class.translated_attribute_names.include?(attribute_name.to_sym))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def column_field_type_resolvers
|
|
41
|
+
FIELD_TYPE_RESOLVERS[column_type]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def image?
|
|
45
|
+
attribute_name.match(/(thumbnail|image|photo|picture|avatar|logo|banner|icon)_uid$/).present? && file?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def file?
|
|
49
|
+
attribute_name.match(/_uid$/).present? && object.respond_to?(attribute_name.sub(/_uid$/, ''))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def password?
|
|
53
|
+
attribute_name.match(/(password|^pin$)/).present?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def email?
|
|
57
|
+
attribute_name.match(/(_email$|^email$)/).present?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def link?
|
|
61
|
+
attribute_name.match(/(_url$|_link$|^url$|^link$)/).present?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def richtext?
|
|
65
|
+
attribute_name.match(/(_html$|^html$)/).present?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def textarea?
|
|
69
|
+
column_type == :text
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def text?
|
|
73
|
+
column_type == :string
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def item?
|
|
77
|
+
attribute_name.match(/_id$/).present? && object.class.reflect_on_association(attribute_name[0..-4].to_sym).present?
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -44,7 +44,7 @@ module Releaf::Builders::View
|
|
|
44
44
|
tag(:ul, class: "breadcrumbs") do
|
|
45
45
|
safe_join do
|
|
46
46
|
last_item = breadcrumb_items.last
|
|
47
|
-
breadcrumb_items.each.collect do |item,
|
|
47
|
+
breadcrumb_items.each.collect do |item, _index|
|
|
48
48
|
breadcrumb_item(item, item == last_item)
|
|
49
49
|
end
|
|
50
50
|
end
|
|
@@ -74,7 +74,10 @@ module Releaf::Builders::View
|
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
def flash_item(name, item)
|
|
77
|
-
|
|
77
|
+
item_data = {type: name}
|
|
78
|
+
item_data[:id] = item["id"] if item.is_a?(Hash)
|
|
79
|
+
|
|
80
|
+
tag(:div, class: "flash", data: item_data) do
|
|
78
81
|
item.is_a?(Hash) ? item["message"] : item
|
|
79
82
|
end
|
|
80
83
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class Releaf::Settings::FormBuilder < Releaf::Builders::FormBuilder
|
|
2
|
+
def field_names
|
|
3
|
+
[:value]
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def render_value
|
|
7
|
+
send(value_render_method_name, :value, options: { label: { label_text: value_label_text }})
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def value_render_method_name
|
|
11
|
+
"releaf_#{object.input_type}_field"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def value_label_text
|
|
15
|
+
label_text = object.description
|
|
16
|
+
label_text.present? ? t(label_text, scope: "settings") : translate_attribute(:value)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
class Releaf::ActionController < ActionController::Base
|
|
2
|
+
# must be first other in stange way non-text env will
|
|
3
|
+
# have CSRF on richtext attachment upload
|
|
4
|
+
protect_from_forgery
|
|
5
|
+
|
|
6
|
+
include Releaf::ActionController::Notifications
|
|
7
|
+
include Releaf::ActionController::Resources
|
|
8
|
+
include Releaf::ActionController::Builders
|
|
9
|
+
include Releaf::ActionController::Search
|
|
10
|
+
include Releaf::ActionController::Features
|
|
11
|
+
include Releaf::ActionController::Ajax
|
|
12
|
+
include Releaf::ActionController::Urls
|
|
13
|
+
include Releaf::ActionController::Breadcrumbs
|
|
14
|
+
include Releaf::ActionController::RichtextAttachments
|
|
15
|
+
include Releaf::ActionController::Views
|
|
16
|
+
include Releaf::Responders
|
|
17
|
+
|
|
18
|
+
helper_method :controller_scope_name, :page_title
|
|
19
|
+
rescue_from Releaf::AccessDenied, with: :access_denied
|
|
20
|
+
|
|
21
|
+
respond_to :html
|
|
22
|
+
respond_to :json, only: [:create, :update]
|
|
23
|
+
layout :layout
|
|
24
|
+
|
|
25
|
+
def index
|
|
26
|
+
prepare_index
|
|
27
|
+
respond_with(@collection)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def new
|
|
31
|
+
prepare_new
|
|
32
|
+
respond_with(@resource)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def show
|
|
36
|
+
if feature_available?(:show)
|
|
37
|
+
prepare_show
|
|
38
|
+
else
|
|
39
|
+
redirect_to url_for(action: 'edit', id: params[:id])
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def edit
|
|
44
|
+
prepare_edit
|
|
45
|
+
respond_with(@resource)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def create
|
|
49
|
+
prepare_create
|
|
50
|
+
@resource.save
|
|
51
|
+
respond_with(@resource, location: (success_path if @resource.persisted?), redirect: true)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def update
|
|
55
|
+
prepare_update
|
|
56
|
+
@resource.update_attributes(resource_params)
|
|
57
|
+
respond_with(@resource, location: success_path)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def confirm_destroy
|
|
61
|
+
prepare_destroy
|
|
62
|
+
@restricted_relations = Releaf::ResourceUtilities.restricted_relations(@resource)
|
|
63
|
+
respond_with(@resource, destroyable: destroyable?)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def toolbox
|
|
67
|
+
prepare_toolbox
|
|
68
|
+
respond_with(@resource)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def destroy
|
|
72
|
+
prepare_destroy
|
|
73
|
+
@resource.destroy if destroyable?
|
|
74
|
+
respond_with(@resource, location: index_path)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def prepare_index
|
|
78
|
+
# load resource only if they are not loaded yet
|
|
79
|
+
@collection = resources unless collection_given?
|
|
80
|
+
|
|
81
|
+
search(params[:search])
|
|
82
|
+
|
|
83
|
+
unless resources_per_page.nil?
|
|
84
|
+
@collection = @collection.page( params[:page] ).per_page( resources_per_page )
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def prepare_new
|
|
89
|
+
# load resource only if is not initialized yet
|
|
90
|
+
new_resource unless resource_given?
|
|
91
|
+
add_resource_breadcrumb(@resource)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def prepare_create
|
|
95
|
+
# load resource only if is not initialized yet
|
|
96
|
+
new_resource unless resource_given?
|
|
97
|
+
@resource.assign_attributes(resource_params)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def prepare_show
|
|
101
|
+
prepare_resource_view
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def prepare_edit
|
|
105
|
+
prepare_resource_view
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def prepare_resource_view
|
|
109
|
+
# load resource only if is not loaded yet
|
|
110
|
+
load_resource unless resource_given?
|
|
111
|
+
add_resource_breadcrumb(@resource)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def prepare_update
|
|
115
|
+
# load resource only if is not loaded yet
|
|
116
|
+
load_resource unless resource_given?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def prepare_destroy
|
|
120
|
+
load_resource
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def prepare_toolbox
|
|
124
|
+
load_resource
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Returns true if @collection is assigned (even if it's nil)
|
|
128
|
+
def collection_given?
|
|
129
|
+
!!defined? @collection
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def required_params
|
|
133
|
+
params.require(:resource)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def create_another?
|
|
137
|
+
params[:after_save] == "create_another" && feature_available?(:create_another)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def access_denied
|
|
141
|
+
respond_with(nil, responder: action_responder(:access_denied))
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Check if @resource has existing restrict relation and it can be deleted
|
|
145
|
+
#
|
|
146
|
+
# @return boolean true or false
|
|
147
|
+
def destroyable?
|
|
148
|
+
Releaf::ResourceUtilities.destroyable?(@resource)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# return contoller translation scope name for using
|
|
152
|
+
# with I18.translation call within hash params
|
|
153
|
+
# ex. t("save", scope: controller_scope_name)
|
|
154
|
+
def controller_scope_name
|
|
155
|
+
@controller_scope_name ||= 'admin.' + self.class.name.sub(/Controller$/, '').underscore.tr('/', '_')
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def page_title
|
|
159
|
+
title = Rails.application.class.parent_name
|
|
160
|
+
title = "#{definition.localized_name} - #{title}" if definition
|
|
161
|
+
|
|
162
|
+
title
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def short_name
|
|
166
|
+
self.class.name.sub(/Controller$/, "").underscore
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def definition
|
|
170
|
+
Releaf::ControllerDefinition.for(short_name)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
ActiveSupport.run_load_hooks(:base_controller, self)
|
|
174
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class Releaf::RootController < Releaf::ActionController
|
|
2
|
+
def home
|
|
3
|
+
respond_to do |format|
|
|
4
|
+
format.html do
|
|
5
|
+
redirect_to Releaf.application.config.root.default_controller_resolver.call(current_controller: self)
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Store settings for menu collapsing and others
|
|
11
|
+
def store_settings
|
|
12
|
+
if params[:settings].is_a? Hash
|
|
13
|
+
params[:settings].each_pair do|key, value|
|
|
14
|
+
value = false if value == "false"
|
|
15
|
+
value = true if value == "true"
|
|
16
|
+
Releaf.application.config.settings_manager.write(controller: self, key: key, value: value)
|
|
17
|
+
end
|
|
18
|
+
render nothing: true, status: 200
|
|
19
|
+
else
|
|
20
|
+
render nothing: true, status: 422
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Releaf::SettingsController < Releaf::ActionController
|
|
2
|
+
|
|
3
|
+
def self.resource_class
|
|
4
|
+
Releaf::Settings
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def resources
|
|
8
|
+
resource_class.registered
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def searchable_fields
|
|
12
|
+
[:var, :value]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def resource_params
|
|
16
|
+
{value: Releaf::Settings::NormalizeValue.call(value: super.fetch(:value, nil), input_type: @resource.input_type)}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def features
|
|
20
|
+
[:index, :edit, :search]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -30,7 +30,7 @@ module Releaf
|
|
|
30
30
|
|
|
31
31
|
container.each do|element|
|
|
32
32
|
text, value = i18n_option_text_and_value(element).map { |item| item.to_s }
|
|
33
|
-
text = I18n.t("#{prefix
|
|
33
|
+
text = I18n.t("#{prefix}-#{text}", i18n_options.merge(default: text))
|
|
34
34
|
translated_container << [text, value]
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Releaf::ActionController::Ajax
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :ajax?
|
|
6
|
+
before_action :manage_ajax
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def ajax?
|
|
10
|
+
@_ajax || false
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def layout
|
|
14
|
+
ajax? ? false : "releaf/admin"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def manage_ajax
|
|
18
|
+
@_ajax = params.has_key? :ajax
|
|
19
|
+
if @_ajax
|
|
20
|
+
request.query_parameters.delete(:ajax)
|
|
21
|
+
params.delete(:ajax)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Releaf::ActionController::Breadcrumbs
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
before_action :build_breadcrumbs
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def build_breadcrumbs
|
|
9
|
+
@breadcrumbs = [controller_breadcrumb].compact
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def controller_breadcrumb
|
|
13
|
+
{name: definition.localized_name, url: definition.path} if definition
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_resource_breadcrumb(resource, url = nil)
|
|
17
|
+
if resource.new_record?
|
|
18
|
+
name= I18n.t('New record', scope: 'admin.breadcrumbs')
|
|
19
|
+
url = url_for(action: :new, only_path: true) if url.nil?
|
|
20
|
+
else
|
|
21
|
+
name = Releaf::ResourceBase.title(resource)
|
|
22
|
+
url = url_for(action: :edit, id: resource.id, only_path: true) if url.nil?
|
|
23
|
+
end
|
|
24
|
+
@breadcrumbs << { name: name, url: url }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Releaf::ActionController::Builders
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :builder_class
|
|
6
|
+
|
|
7
|
+
def self.own_builder_scope
|
|
8
|
+
name.gsub(/Controller$/, "")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.ancestor_controllers
|
|
12
|
+
# return all ancestor controllers up to but not including Releaf::ActionController
|
|
13
|
+
ancestor_classes = ancestors - included_modules
|
|
14
|
+
ancestor_classes.slice( 0...ancestor_classes.index(Releaf::ActionController) ) - [ self ]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.ancestor_builder_scopes
|
|
18
|
+
ancestor_controllers.map(&:own_builder_scope)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def builder_class(builder_type)
|
|
23
|
+
Releaf::Builders.builder_class(builder_scopes, builder_type)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def application_scope
|
|
27
|
+
scope = Releaf.application.config.mount_location.capitalize
|
|
28
|
+
scope if scope.present? && Releaf::Builders.constant_defined_at_scope?(scope, Object)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def builder_scopes
|
|
32
|
+
[self.class.own_builder_scope, self.class.ancestor_builder_scopes, application_scope].flatten
|
|
33
|
+
end
|
|
34
|
+
end
|