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.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +19 -21
  3. data/app/assets/javascripts/releaf/application.js +1 -2
  4. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +19 -21
  5. data/app/assets/javascripts/releaf/include/field.type_richtext.js +31 -9
  6. data/app/assets/javascripts/releaf/include/localization.js +3 -8
  7. data/app/assets/javascripts/releaf/include/nested_fields.js +1 -1
  8. data/app/assets/javascripts/releaf/include/remote_validator.js +7 -4
  9. data/app/assets/javascripts/releaf/include/sortable.js +1 -1
  10. data/app/assets/javascripts/releaf/include/{profile_settings.js → store_settings.js} +4 -10
  11. data/app/assets/javascripts/releaf/include/toolbox.js +7 -11
  12. data/app/assets/stylesheets/releaf/layout/fields.scss +1 -0
  13. data/app/assets/stylesheets/releaf/layout/header.scss +1 -0
  14. data/app/assets/stylesheets/releaf/layout/search.scss +15 -0
  15. data/app/builders/releaf/builders/base.rb +11 -9
  16. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +2 -2
  17. data/app/builders/releaf/builders/confirm_dialog_builder.rb +3 -3
  18. data/app/builders/releaf/builders/edit_builder.rb +51 -6
  19. data/app/builders/releaf/builders/form_builder/associated_set_field.rb +37 -0
  20. data/app/builders/releaf/builders/form_builder/associations.rb +153 -0
  21. data/app/builders/releaf/builders/form_builder/boolean_fields.rb +12 -0
  22. data/app/builders/releaf/builders/form_builder/date_fields.rb +30 -0
  23. data/app/builders/releaf/builders/form_builder/fields.rb +10 -0
  24. data/app/builders/releaf/builders/form_builder/file_fields.rb +47 -0
  25. data/app/builders/releaf/builders/form_builder/i18n_fields.rb +75 -0
  26. data/app/builders/releaf/builders/form_builder/label.rb +34 -0
  27. data/app/builders/releaf/builders/form_builder/number_fields.rb +13 -0
  28. data/app/builders/releaf/builders/form_builder/richtext_fields.rb +28 -0
  29. data/app/builders/releaf/builders/form_builder/text_fields.rb +43 -0
  30. data/app/builders/releaf/builders/form_builder.rb +8 -489
  31. data/app/builders/releaf/builders/index_builder.rb +10 -3
  32. data/app/builders/releaf/builders/page/header_builder.rb +23 -59
  33. data/app/builders/releaf/builders/page/layout_builder.rb +125 -115
  34. data/app/builders/releaf/builders/page/menu_builder.rb +96 -106
  35. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +7 -12
  36. data/app/builders/releaf/builders/resource_view.rb +4 -4
  37. data/app/builders/releaf/builders/table_builder.rb +20 -30
  38. data/app/builders/releaf/builders/toolbox_builder.rb +1 -1
  39. data/app/builders/releaf/builders/utilities/date_fields.rb +100 -0
  40. data/app/builders/releaf/builders/utilities/resolve_attribute_field_method_name.rb +80 -0
  41. data/app/builders/releaf/builders/view.rb +5 -2
  42. data/app/builders/releaf/settings/form_builder.rb +18 -0
  43. data/app/builders/releaf/settings/table_builder.rb +9 -0
  44. data/app/controllers/releaf/action_controller.rb +174 -0
  45. data/app/controllers/releaf/{core/errors_controller.rb → errors_controller.rb} +1 -1
  46. data/app/controllers/releaf/root_controller.rb +23 -0
  47. data/app/controllers/releaf/settings_controller.rb +22 -0
  48. data/app/helpers/releaf/application_helper.rb +1 -1
  49. data/app/lib/releaf/action_controller/ajax.rb +24 -0
  50. data/app/lib/releaf/action_controller/breadcrumbs.rb +26 -0
  51. data/app/lib/releaf/action_controller/builders.rb +34 -0
  52. data/app/lib/releaf/action_controller/features.rb +47 -0
  53. data/app/lib/releaf/action_controller/notifications.rb +28 -0
  54. data/app/lib/releaf/action_controller/resources.rb +59 -0
  55. data/app/{controllers/concerns/releaf → lib/releaf/action_controller}/richtext_attachments.rb +1 -1
  56. data/app/lib/releaf/action_controller/search.rb +22 -0
  57. data/app/lib/releaf/action_controller/urls.rb +49 -0
  58. data/app/lib/releaf/action_controller/views.rb +29 -0
  59. data/app/lib/releaf/assets_resolver.rb +51 -0
  60. data/app/lib/releaf/build_errors_hash.rb +81 -0
  61. data/app/lib/releaf/controller_definition.rb +22 -0
  62. data/app/lib/releaf/controller_group_definition.rb +12 -0
  63. data/app/lib/releaf/{core/default_searchable_fields.rb → default_searchable_fields.rb} +1 -1
  64. data/app/lib/releaf/{core/resource_base.rb → resource_base.rb} +14 -6
  65. data/app/lib/releaf/{core/resource_fields.rb → resource_fields.rb} +1 -1
  66. data/app/lib/releaf/{core/resource_params.rb → resource_params.rb} +3 -3
  67. data/app/lib/releaf/resource_table_fields.rb +10 -0
  68. data/app/lib/releaf/{core/resource_utilities.rb → resource_utilities.rb} +2 -2
  69. data/app/lib/releaf/{core/responders → responders}/access_denied_responder.rb +2 -2
  70. data/app/lib/releaf/{core/responders → responders}/after_save_responder.rb +3 -3
  71. data/app/lib/releaf/{core/responders → responders}/confirm_destroy_responder.rb +1 -1
  72. data/app/lib/releaf/{core/responders → responders}/destroy_responder.rb +1 -1
  73. data/app/lib/releaf/{core/responders → responders}/error_responder.rb +1 -1
  74. data/app/lib/releaf/{core/responders → responders}/feature_disabled_responder.rb +2 -2
  75. data/app/lib/releaf/{core/responders → responders}/page_not_found_responder.rb +2 -2
  76. data/app/lib/releaf/responders.rb +31 -0
  77. data/app/lib/releaf/{core/search.rb → search.rb} +1 -1
  78. data/app/lib/releaf/settings/normalize_value.rb +45 -0
  79. data/app/lib/releaf/settings/register.rb +45 -0
  80. data/app/models/releaf/settings.rb +25 -13
  81. data/app/services/array/reorder.rb +82 -0
  82. data/app/views/releaf/{base → action}/confirm_destroy.ruby +0 -0
  83. data/app/views/releaf/{base → action}/create_releaf_richtext_attachment.haml +0 -0
  84. data/app/views/releaf/{base → action}/edit.ruby +0 -0
  85. data/app/views/releaf/{base → action}/index.ruby +0 -0
  86. data/app/views/releaf/{base → action}/new.ruby +0 -0
  87. data/app/views/releaf/{base → action}/refused_destroy.ruby +0 -0
  88. data/app/views/releaf/{base → action}/show.ruby +0 -0
  89. data/app/views/releaf/{base → action}/toolbox.ruby +0 -0
  90. data/lib/generators/dummy/install_generator.rb +5 -0
  91. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/books.js +23 -0
  92. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/nodes.js +1 -0
  93. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/other_site/other_nodes.js +1 -0
  94. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/nodes.scss +1 -0
  95. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/other_site/other_nodes.scss +1 -0
  96. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +11 -1
  97. data/lib/generators/dummy/templates/config/routes.rb +31 -7
  98. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +3 -6
  99. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +1 -1
  100. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +1 -1
  101. data/lib/generators/dummy/templates/controllers/admin/nodes_controller.rb +3 -0
  102. data/lib/generators/dummy/templates/controllers/admin/other_site/other_nodes_controller.rb +3 -0
  103. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +1 -1
  104. data/lib/generators/dummy/templates/controllers/application_controller.rb +27 -5
  105. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +13 -3
  106. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -1
  107. data/lib/generators/dummy/templates/initializers/releaf.rb +31 -25
  108. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +1 -0
  109. data/lib/generators/dummy/templates/migrations/create_other_nodes.rb +29 -0
  110. data/lib/generators/dummy/templates/models/author.rb +2 -2
  111. data/lib/generators/dummy/templates/models/book.rb +0 -2
  112. data/lib/generators/dummy/templates/models/chapter.rb +0 -2
  113. data/lib/generators/dummy/templates/models/home_page.rb +1 -0
  114. data/lib/generators/dummy/templates/models/other_site/other_node.rb +7 -0
  115. data/lib/generators/dummy/templates/models/publisher.rb +0 -5
  116. data/lib/generators/dummy/templates/models/text_page.rb +0 -1
  117. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -1
  118. data/lib/generators/dummy/templates/views/layouts/application.html.haml +9 -1
  119. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -1
  120. data/lib/generators/releaf/templates/initializers/releaf.rb +6 -17
  121. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +13 -14
  122. data/lib/generators/releaf/templates/seeds/seeds.rb +28 -32
  123. data/lib/releaf/{core/application.rb → application.rb} +5 -4
  124. data/lib/releaf/{core/component.rb → component.rb} +6 -2
  125. data/lib/releaf/configuration.rb +95 -0
  126. data/lib/releaf/core_ext/array/reorder.rb +5 -0
  127. data/lib/releaf/engine.rb +12 -0
  128. data/lib/releaf/exceptions.rb +5 -0
  129. data/lib/releaf/instance_cache.rb +72 -0
  130. data/lib/releaf/{core → rails_ext}/validation_error_codes.rb +1 -1
  131. data/lib/releaf/root/configuration.rb +6 -0
  132. data/lib/releaf/root/default_controller_resolver.rb +37 -0
  133. data/lib/releaf/root/settings_manager.rb +12 -0
  134. data/lib/releaf/root.rb +17 -0
  135. data/lib/releaf/{core/route_mapper.rb → route_mapper.rb} +6 -6
  136. data/lib/releaf/service.rb +11 -0
  137. data/lib/releaf/settings_ui.rb +7 -0
  138. data/lib/releaf/version.rb +1 -1
  139. data/lib/releaf-core.rb +38 -9
  140. data/spec/builders/{builders → releaf/builders}/association_reflector_spec.rb +0 -0
  141. data/spec/builders/{builders → releaf/builders}/base_spec.rb +17 -21
  142. data/spec/builders/{builders → releaf/builders}/collection_spec.rb +0 -0
  143. data/spec/builders/{builders → releaf/builders}/confirm_destroy_dialog_builder_spec.rb +5 -5
  144. data/spec/builders/{builders → releaf/builders}/confirm_dialog_builder_spec.rb +9 -7
  145. data/spec/builders/{builders → releaf/builders}/edit_builder_spec.rb +127 -20
  146. data/spec/builders/releaf/builders/form_builder/associations_spec.rb +129 -0
  147. data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +86 -0
  148. data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +48 -0
  149. data/spec/builders/releaf/builders/form_builder/label_spec.rb +106 -0
  150. data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +37 -0
  151. data/spec/builders/releaf/builders/form_builder_spec.rb +228 -0
  152. data/spec/builders/{builders → releaf/builders}/index_builder_spec.rb +29 -10
  153. data/spec/builders/releaf/builders/page/header_builder_spec.rb +65 -0
  154. data/spec/builders/releaf/builders/page/layout_builder_spec.rb +170 -0
  155. data/spec/builders/releaf/builders/page/menu_builder_spec.rb +345 -0
  156. data/spec/builders/{builders → releaf/builders}/pagination_builder_spec.rb +0 -0
  157. data/spec/builders/{builders → releaf/builders}/resource_dialog_spec.rb +0 -0
  158. data/spec/builders/{builders → releaf/builders}/resource_view_spec.rb +8 -8
  159. data/spec/builders/{builders → releaf/builders}/show_builder_spec.rb +0 -0
  160. data/spec/builders/{builders → releaf/builders}/table_builder_spec.rb +31 -75
  161. data/spec/builders/{builders → releaf/builders}/template_spec.rb +0 -0
  162. data/spec/builders/{builders → releaf/builders}/toolbox_builder_spec.rb +4 -4
  163. data/spec/builders/{builders → releaf/builders}/toolbox_spec.rb +0 -0
  164. data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +125 -0
  165. data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +318 -0
  166. data/spec/builders/{builders → releaf/builders}/view_spec.rb +1 -1
  167. data/spec/builders/{builders_spec.rb → releaf/builders_spec.rb} +0 -0
  168. data/spec/builders/releaf/settings/form_builder_spec.rb +48 -0
  169. data/spec/builders/{core → releaf}/settings/table_builder_spec.rb +6 -4
  170. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +1 -1
  171. data/spec/controllers/releaf/{base_controller_spec.rb → action_controller_spec.rb} +132 -161
  172. data/spec/controllers/releaf/root_controller_spec.rb +40 -0
  173. data/spec/controllers/releaf/settings_controller_spec.rb +52 -0
  174. data/spec/error_hash_builder_spec.rb +83 -0
  175. data/spec/ext/array_reorder_spec.rb +12 -0
  176. data/spec/features/ajaxbox_spec.rb +6 -6
  177. data/spec/features/errors_spec.rb +2 -1
  178. data/spec/features/index_table_spec.rb +6 -3
  179. data/spec/features/richtext_attachments_spec.rb +2 -2
  180. data/spec/features/richtext_custom_config_spec.rb +28 -0
  181. data/spec/features/richtext_embed_spec.rb +1 -1
  182. data/spec/features/richtext_spec.rb +10 -1
  183. data/spec/features/search_spec.rb +1 -1
  184. data/spec/features/settings_spec.rb +10 -5
  185. data/spec/helpers/application_helper_spec.rb +4 -6
  186. data/spec/lib/releaf/action_controller/features_spec.rb +171 -0
  187. data/spec/lib/releaf/action_controller/search_spec.rb +84 -0
  188. data/spec/lib/releaf/{core/application_spec.rb → application_spec.rb} +7 -6
  189. data/spec/lib/releaf/assets_resolver_spec.rb +130 -0
  190. data/spec/lib/releaf/build_errors_hash_spec.rb +141 -0
  191. data/spec/lib/releaf/configuration_spec.rb +205 -0
  192. data/spec/lib/releaf/controller_definition_spec.rb +49 -0
  193. data/spec/lib/releaf/controller_group_definition_spec.rb +27 -0
  194. data/spec/lib/releaf/{core/default_searchable_fields_spec.rb → default_searchable_fields_spec.rb} +1 -1
  195. data/spec/lib/releaf/instance_cache_spec.rb +98 -0
  196. data/spec/lib/releaf/{core/resource_base_spec.rb → resource_base_spec.rb} +59 -21
  197. data/spec/lib/releaf/{core/resource_fields_spec.rb → resource_fields_spec.rb} +1 -1
  198. data/spec/lib/releaf/{core/resource_params_spec.rb → resource_params_spec.rb} +3 -5
  199. data/spec/lib/releaf/resource_table_fields_spec.rb +20 -0
  200. data/spec/lib/releaf/{core/resource_utilities_spec.rb → resource_utilities_spec.rb} +1 -1
  201. data/spec/lib/releaf/{core/responders → responders}/access_denied_responder_spec.rb +1 -1
  202. data/spec/lib/releaf/{core/responders → responders}/after_save_responder_spec.rb +9 -8
  203. data/spec/lib/releaf/{core/responders → responders}/confirm_destroy_responder_spec.rb +2 -2
  204. data/spec/lib/releaf/{core/responders → responders}/destroy_responder_spec.rb +2 -2
  205. data/spec/lib/releaf/{core/responders → responders}/error_responder_spec.rb +4 -4
  206. data/spec/lib/releaf/{core/responders → responders}/feature_disabled_responder_spec.rb +1 -1
  207. data/spec/lib/releaf/{core/responders → responders}/page_not_found_responder_spec.rb +1 -1
  208. data/spec/lib/releaf/{core/responders_spec.rb → responders_spec.rb} +14 -14
  209. data/spec/lib/releaf/root/configuration_spec.rb +9 -0
  210. data/spec/lib/releaf/root/default_controller_resolver_spec.rb +108 -0
  211. data/spec/lib/releaf/root_spec.rb +13 -0
  212. data/spec/lib/releaf/service_spec.rb +20 -0
  213. data/spec/lib/releaf/settings/normalize_value_spec.rb +103 -0
  214. data/spec/lib/releaf/settings/register_spec.rb +135 -0
  215. data/spec/lib/releaf/settings_manager_spec.rb +22 -0
  216. data/spec/lib/validation_error_codes_spec.rb +1 -1
  217. data/spec/misc/factories_spec.rb +0 -12
  218. data/spec/models/settings_spec.rb +74 -32
  219. data/spec/routing/route_mapper_spec.rb +5 -5
  220. data/spec/rspec_helpers/test_helpers_spec.rb +1 -1
  221. data/spec/rspec_helpers/test_spec.rb +14 -0
  222. data/spec/{lib/releaf/core/item_orderer_spec.rb → services/array/reorder_spec.rb} +32 -53
  223. metadata +299 -224
  224. data/app/builders/releaf/builders/orderer.rb +0 -5
  225. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +0 -40
  226. data/app/builders/releaf/core/settings/form_builder.rb +0 -21
  227. data/app/builders/releaf/core/settings/table_builder.rb +0 -11
  228. data/app/controllers/concerns/releaf/breadcrumbs.rb +0 -42
  229. data/app/controllers/releaf/base_controller.rb +0 -458
  230. data/app/controllers/releaf/core/settings_controller.rb +0 -50
  231. data/app/helpers/releaf/javascript_helper.rb +0 -75
  232. data/app/lib/releaf/core/assets_resolver.rb +0 -58
  233. data/app/lib/releaf/core/error_formatter.rb +0 -103
  234. data/app/lib/releaf/core/item_orderer.rb +0 -102
  235. data/app/lib/releaf/core/resource_table_fields.rb +0 -10
  236. data/app/lib/releaf/core/responders.rb +0 -31
  237. data/app/lib/releaf/core/template_field_type_mapper.rb +0 -127
  238. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  239. data/lib/releaf/core/builders_autoload.rb +0 -27
  240. data/lib/releaf/core/configuration.rb +0 -101
  241. data/lib/releaf/core/engine.rb +0 -35
  242. data/lib/releaf/core/exceptions.rb +0 -38
  243. data/lib/releaf/core/settings_ui_component.rb +0 -7
  244. data/releaf-core.gemspec +0 -35
  245. data/spec/builders/builders/form_builder_spec.rb +0 -562
  246. data/spec/builders/builders/orderer_spec.rb +0 -22
  247. data/spec/builders/builders/page/header_builder_spec.rb +0 -143
  248. data/spec/builders/builders/page/layout_builder_spec.rb +0 -73
  249. data/spec/builders/builders/page/menu_builder_spec.rb +0 -160
  250. data/spec/builders/core/settings/form_builder_spec.rb +0 -69
  251. data/spec/controllers/releaf/core/settings_controller_spec.rb +0 -31
  252. data/spec/lib/releaf/core/assets_resolver_spec.rb +0 -113
  253. data/spec/lib/releaf/core/configuration_spec.rb +0 -230
  254. data/spec/lib/releaf/core/error_formatter_spec.rb +0 -242
  255. data/spec/lib/releaf/core/resource_table_fields_spec.rb +0 -18
  256. 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
@@ -1,4 +1,4 @@
1
- module Releaf::RichtextAttachments
1
+ module Releaf::ActionController::RichtextAttachments
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
@@ -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
- module Releaf::Core
1
+ module Releaf
2
2
  class DefaultSearchableFields
3
3
  attr_accessor :klass
4
4
 
@@ -1,4 +1,4 @@
1
- class Releaf::Core::ResourceBase
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.collect { |a| a.to_s }
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 - excluded_attributes
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::Core::ResourceFields < Releaf::Core::ResourceBase
1
+ class Releaf::ResourceFields < Releaf::ResourceBase
2
2
 
3
3
  def excluded_attributes
4
4
  super + %w(password password_confirmation encrypted_password)
@@ -1,4 +1,4 @@
1
- class Releaf::Core::ResourceParams < Releaf::Core::ResourceBase
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 += file_attribute_params(attribute)
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 += localized_attribute_params(column)
28
+ list + localized_attribute_params(column)
29
29
  end
30
30
  end
31
31
 
@@ -0,0 +1,10 @@
1
+ class Releaf::ResourceTableFields < Releaf::ResourceFields
2
+
3
+ def excluded_attributes
4
+ super + table_excluded_attributes
5
+ end
6
+
7
+ def table_excluded_attributes
8
+ (base_attributes + localized_attributes).select{|c| c.match(/.*(_uid|_html)$/) }
9
+ end
10
+ end
@@ -1,4 +1,4 @@
1
- class Releaf::Core::ResourceUtilities
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[:controller] }.grep(/(\/#{guessed_name}$|^#{guessed_name}$)/).present?
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,6 +1,6 @@
1
- module Releaf::Core::Responders
1
+ module Releaf::Responders
2
2
  class AccessDeniedResponder < ActionController::Responder
3
- include Releaf::Core::Responders::ErrorResponder
3
+ include Releaf::Responders::ErrorResponder
4
4
 
5
5
  def status_code
6
6
  403
@@ -1,9 +1,9 @@
1
- module Releaf::Core::Responders
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::Core::ErrorFormatter.format_errors(resource)}
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
 
@@ -1,4 +1,4 @@
1
- module Releaf::Core::Responders
1
+ module Releaf::Responders
2
2
  class ConfirmDestroyResponder < ActionController::Responder
3
3
  delegate :render_notification, to: :controller
4
4
 
@@ -1,4 +1,4 @@
1
- module Releaf::Core::Responders
1
+ module Releaf::Responders
2
2
  class DestroyResponder < ActionController::Responder
3
3
  delegate :render_notification, to: :controller
4
4
 
@@ -1,4 +1,4 @@
1
- module Releaf::Core::Responders::ErrorResponder
1
+ module Releaf::Responders::ErrorResponder
2
2
  def template
3
3
  self.class.name.split("::").last.gsub(/Responder$/, "").underscore
4
4
  end
@@ -1,6 +1,6 @@
1
- module Releaf::Core::Responders
1
+ module Releaf::Responders
2
2
  class FeatureDisabledResponder < ActionController::Responder
3
- include Releaf::Core::Responders::ErrorResponder
3
+ include Releaf::Responders::ErrorResponder
4
4
 
5
5
  def status_code
6
6
  403
@@ -1,6 +1,6 @@
1
- module Releaf::Core::Responders
1
+ module Releaf::Responders
2
2
  class PageNotFoundResponder < ActionController::Responder
3
- include Releaf::Core::Responders::ErrorResponder
3
+ include Releaf::Responders::ErrorResponder
4
4
 
5
5
  def status_code
6
6
  404
@@ -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
@@ -1,4 +1,4 @@
1
- module Releaf::Core
1
+ module Releaf
2
2
  class Search
3
3
  attr_accessor :relation, :fields, :text, :join_index, :searchable_arel_fields
4
4