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
@@ -1,58 +0,0 @@
1
- module Releaf::Core
2
- class AssetsResolver
3
- NONCOMPILED_PATTERN = /app\/assets\/(javascripts|stylesheets)\/((releaf\/)?controllers\/(.*?))\..*/
4
- COMPILED_PATTERN = /(releaf\/)?controllers\/(.*?)\.(js|css)$/
5
-
6
- def self.base_assets
7
- ["releaf/application"]
8
- end
9
-
10
- def self.controller_assets(controller, type)
11
- base_assets + assets.fetch(controller, {}).fetch(type, [])
12
- end
13
-
14
- def self.noncompiled_assets
15
- list = {}
16
-
17
- Rails.application.assets.each_file do|file|
18
- match = file.to_s.match(NONCOMPILED_PATTERN)
19
- if match
20
- controller = match[4]
21
- asset_type = match[1].to_sym
22
- list[controller] ||= {stylesheets: [], javascripts: []}
23
- list[controller][asset_type] << match[2]
24
- end
25
- end
26
-
27
- list
28
- end
29
-
30
- def self.compiled_assets
31
- list = {}
32
-
33
- Rails.application.assets_manifest.files.each_pair do|asset_path, asset|
34
- match = asset["logical_path"].match(COMPILED_PATTERN)
35
- if match
36
- controller = match[2]
37
- asset_type = match[3] == "css" ? :stylesheets : :javascripts
38
- list[controller] ||= {stylesheets: [], javascripts: []}
39
- list[controller][asset_type] << asset["logical_path"]
40
- end
41
- end
42
-
43
- list
44
- end
45
-
46
- def self.compiled_assets?
47
- Rails.application.assets.nil?
48
- end
49
-
50
- def self.assets
51
- if compiled_assets?
52
- @@compiled_assets ||= compiled_assets
53
- else
54
- noncompiled_assets
55
- end
56
- end
57
- end
58
- end
@@ -1,103 +0,0 @@
1
- module Releaf::Core
2
- class ErrorFormatter
3
- attr_reader :errors
4
-
5
- def self.format_errors(resource, field_name_prefix = "resource")
6
- validator = new(resource, field_name_prefix)
7
- validator.errors
8
- end
9
-
10
- def initialize(resource, field_name_prefix)
11
- @resource = resource
12
- @klass = @resource.class
13
- @field_name_prefix = field_name_prefix
14
- @errors = {}
15
- @error_message_i18n_scope = "activerecord.errors.messages.#{@klass.name.underscore}"
16
- format_errors
17
- end
18
-
19
- private
20
-
21
- def format_errors
22
- @resource.errors.each do |attribute, message|
23
- if models_attribute? attribute
24
- add_error attribute, message
25
- else
26
- process_nested_resource_errors attribute
27
- end
28
- end
29
- end
30
-
31
- def process_nested_resource_errors(attribute)
32
- association_name = attribute.to_s.split('.', 2).first
33
- if single_association? association_name
34
- prefix_template = "#{@field_name_prefix}[#{association_name}_attributes]"
35
- nested_resources = [@resource.send(association_name)]
36
- else
37
- prefix_template = "#{@field_name_prefix}[#{association_name}_attributes][%d]"
38
- nested_resources = @resource.send(association_name)
39
- end
40
-
41
- nested_resources.each_with_index do |resource, i|
42
- prefix = prefix_template % i
43
- resource_errors = ErrorFormatter.format_errors(resource, prefix)
44
- @errors.merge!(resource_errors)
45
- end
46
- end
47
-
48
- def models_attribute?(attribute)
49
- attribute !~ /\./
50
- end
51
-
52
- def add_error(attribute, message)
53
- @errors[field_id(attribute)] ||= []
54
- @errors[field_id(attribute)] << error_hash(attribute, message)
55
- end
56
-
57
- def error_hash(attribute, message)
58
- h = {
59
- error_code: message.error_code,
60
- message: I18n.t(message, scope: @error_message_i18n_scope),
61
- full_message: full_error_message(attribute, message)
62
- }
63
- h[:data] = message.data unless message.data.nil?
64
- h
65
- end
66
-
67
- def full_error_message(attribute, message)
68
- template = "%{class} with id %{id} has error \"#{message}\""
69
- template += ' on attribute "%{attribute}"' unless attribute.to_sym == :base
70
- options = {
71
- default: template,
72
- attribute: attribute,
73
- class: @resource.class.name,
74
- id: @resource.id ? @resource.id.to_s : 'null',
75
- scope: @error_message_i18n_scope
76
- }
77
- I18n.t(template, options)
78
- end
79
-
80
- def field_id(attribute)
81
- return @field_name_prefix if attribute.to_sym == :base
82
- field = attribute
83
- if association(attribute).present?
84
- field = association(attribute).foreign_key.to_s
85
- end
86
-
87
- "#{@field_name_prefix}[#{field}]"
88
- end
89
-
90
- def single_association?(association_name)
91
- [:belongs_to, :has_one].include? association_type(association_name)
92
- end
93
-
94
- def association_type(association_name)
95
- association(association_name).macro
96
- end
97
-
98
- def association(association_name)
99
- @klass.reflect_on_association(association_name.to_sym)
100
- end
101
-
102
- end
103
- end
@@ -1,102 +0,0 @@
1
- module Releaf::Core
2
- # Utility class for array items reordering.
3
- #
4
- # There are 4 possible reordering options: <code>:first, :last, :before and :after</code>.
5
- #
6
- # All reorder methods are chainable, so:
7
- # Releaf::Core::ItemOrderer.new(:a, :b, :c, :d, :e, :f).reorder(:c, :last).reorder([:a, :b], after: :d).result
8
- # will return
9
- # [:d, :a, :b, :e, :f, :c]
10
- #
11
- # For reordering with <code>`first`</code> and <code>`last`</code> options you must give this option as symbols.
12
- # Example:
13
- # Releaf::Core::ItemOrderer.new(:a, :b, :c).reorder(:c, :first)
14
- #
15
- # For reorderind with <code>`before`</code> and <code>`after`</code> options you must give option together with target value as hash.
16
- # Example:
17
- # Releaf::Core::ItemOrderer.new(:a, :b, :c).reorder(:a, after: :b)
18
- class ItemOrderer
19
-
20
- attr_accessor :list
21
-
22
- def initialize(*args)
23
- self.list = args
24
- end
25
-
26
- def result
27
- list
28
- end
29
-
30
- def to_a
31
- result
32
- end
33
-
34
- def reorder(values, options)
35
- values = [values] unless values.is_a? Array
36
- deleted_values = delete(values)
37
- index = reorder_index(options)
38
-
39
- values.reverse.each do|value|
40
- list.insert(index, deleted_values[value])
41
- end
42
-
43
- self
44
- end
45
-
46
- def reorder_index(options)
47
- if options == :first
48
- index = 0
49
- elsif options == :last
50
- index = list.length
51
- elsif options[:after]
52
- index = index(options[:after]) + 1
53
- elsif options[:before]
54
- index = index(options[:before])
55
- else
56
- raise ArgumentError, "unknown reorder option"
57
- end
58
- end
59
-
60
- def delete(values)
61
- deleted = {}
62
-
63
- values.each do|value|
64
- index = index(value)
65
- deleted[value] = list[index]
66
- list.delete_at(index)
67
- end
68
-
69
- deleted
70
- end
71
-
72
- def index(value)
73
- value = value.to_s
74
- list.index do |existing_value|
75
- if existing_value.is_a? Hash
76
- existing_value.keys.first.to_s == value
77
- else
78
- existing_value.to_s == value
79
- end
80
- end
81
- end
82
-
83
- # Shortcut for creating new ItemOrderer class, ordering and result retrieving.
84
- #
85
- # Releaf::Core::ItemOrderer.reorder([:a, :b, :c, :d, :e, :f], c: :last, [:a, :b] => {after: :d})
86
- # is same as
87
- # Releaf::Core::ItemOrderer.new(:a, :b, :c, :d, :e, :f).reorder(:c, :last).reorder([:a, :b], after: :d).result
88
- #
89
- # @param list [Array] array to reorder
90
- # @param options_list [Hash] hash with reorder options
91
- # @return [Array] reordered array
92
- def self.reorder(list, options_list)
93
- orderer = new(*list)
94
-
95
- options_list.each_pair do|values, options|
96
- orderer.reorder(values, options)
97
- end
98
-
99
- orderer.result
100
- end
101
- end
102
- end
@@ -1,10 +0,0 @@
1
- class Releaf::Core::ResourceTableFields < Releaf::Core::ResourceFields
2
-
3
- def excluded_attributes
4
- super + table_excluded_attributes
5
- end
6
-
7
- def table_excluded_attributes
8
- resource_class.column_names.select{|c| c.match(/.*_html$/) }
9
- end
10
- end
@@ -1,31 +0,0 @@
1
- module Releaf::Core::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::Core::Responders::AfterSaveResponder,
11
- update: Releaf::Core::Responders::AfterSaveResponder,
12
- confirm_destroy: Releaf::Core::Responders::ConfirmDestroyResponder,
13
- destroy: Releaf::Core::Responders::DestroyResponder,
14
- access_denied: Releaf::Core::Responders::AccessDeniedResponder,
15
- feature_disabled: Releaf::Core::Responders::FeatureDisabledResponder,
16
- page_not_found: Releaf::Core::Responders::PageNotFoundResponder,
17
- }
18
- end
19
-
20
- # Returns generic view name for given action
21
- # @return String
22
- def action_responder(_action_name)
23
- action_responders[_action_name.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,127 +0,0 @@
1
- module Releaf::Core
2
- module TemplateFieldTypeMapper
3
-
4
- # Helps to determinate which template to render in :edit feature
5
- # for given objects attribute.
6
- #
7
- # @return field_type
8
- #
9
- # where field_type is a string representing field type
10
- # and use_i18n is a `true` or `false`. If use_i18n is true, then template
11
- # with localization features should be used (if exists)
12
- #
13
- # This helper is used by views.
14
- #
15
- # @todo document rendering conventions
16
- def self.field_type_name obj, attribute_name
17
- field_type = nil
18
- column_type = nil
19
-
20
- if use_i18n?(obj, attribute_name)
21
- begin
22
- column_type = obj.class::Translation.columns_hash[attribute_name.to_s].try(:type)
23
- rescue
24
- end
25
- else
26
- column_type = obj.class.columns_hash[attribute_name.to_s].try(:type)
27
- end
28
-
29
- column_type ||= 'string'
30
-
31
- if respond_to?("field_type_name_for_#{column_type}")
32
- field_type = send("field_type_name_for_#{column_type}", attribute_name, obj)
33
- end
34
-
35
- return field_type || 'text'
36
- end
37
-
38
- # should localized template be preffered?
39
- def self.use_i18n? obj, attribute_name
40
- return false unless obj.class.respond_to? :translates?
41
- return false unless obj.class.translates?
42
- return obj.class.translated_attribute_names.include?(attribute_name.to_sym)
43
- end
44
-
45
- protected
46
-
47
- def self.image_or_error attribute_name, obj
48
- field_type_or_error 'image', attribute_name, obj
49
- end
50
-
51
- def self.file_or_error attribute_name, obj
52
- field_type_or_error 'file', attribute_name, obj
53
- end
54
-
55
- def self.field_type_or_error type, attribute_name, obj
56
- raise ArgumentError, 'attribute_name must end with _uid' unless attribute_name =~ /_uid$/
57
- file_method_name = attribute_name.to_s.sub(/_uid$/, '')
58
- if obj.respond_to? file_method_name
59
- return type
60
- else
61
- raise "object doesn't respond to `#{file_method_name}` method. Did you forgot to add `#{type}_accessor :#{file_method_name}` to `#{obj.class.name}` model?"
62
- end
63
- end
64
-
65
- def self.field_type_name_for_string attribute_name, obj
66
- case attribute_name.to_s
67
- when /(thumbnail|image|photo(graphy)?|picture|avatar|logo|banner|icon)_uid$/
68
- return image_or_error attribute_name, obj
69
-
70
- when /_uid$/
71
- return file_or_error attribute_name, obj
72
-
73
- when /password/, 'pin'
74
- return 'password'
75
-
76
- when /_email$/, 'email'
77
- return 'email'
78
-
79
- when /_link$/, 'link'
80
- return 'link'
81
-
82
- else
83
- return 'text'
84
- end
85
- end
86
-
87
- def self.field_type_name_for_text attribute_name, obj
88
- case attribute_name.to_s
89
- when /_(url|homepage|link)$/, 'homepage', 'url'
90
- 'link'
91
- when /_html$/, 'html'
92
- 'richtext'
93
- else
94
- 'textarea'
95
- end
96
- end
97
-
98
- def self.field_type_name_for_datetime attribute_name, obj
99
- 'datetime'
100
- end
101
-
102
- def self.field_type_name_for_date attribute_name, obj
103
- 'date'
104
- end
105
-
106
- def self.field_type_name_for_time attribute_name, obj
107
- 'time'
108
- end
109
-
110
- def self.field_type_name_for_float attribute_name, obj
111
- 'float'
112
- end
113
-
114
- def self.field_type_name_for_decimal attribute_name, obj
115
- 'decimal'
116
- end
117
-
118
- def self.field_type_name_for_integer attribute_name, obj
119
- return 'item' if attribute_name.to_s =~ /_id$/ && obj.class.reflect_on_association(attribute_name[0..-4].to_sym)
120
- return 'integer'
121
- end
122
-
123
- def self.field_type_name_for_boolean attribute_name, obj
124
- return 'boolean'
125
- end
126
- end
127
- end
@@ -1,27 +0,0 @@
1
- root_path = File.expand_path('../..', File.dirname(__dir__))
2
- files = %w(
3
- builders/tags/releaf_associated_set_field
4
- builders
5
- builders/base
6
- builders/orderer
7
- builders/template
8
- builders/toolbox
9
- builders/view
10
- builders/collection
11
- builders/resource
12
- builders/resource_dialog
13
- builders/resource_view
14
- builders/confirm_dialog_builder
15
- builders/confirm_destroy_dialog_builder
16
- builders/edit_builder
17
- builders/form_builder
18
- builders/index_builder
19
- builders/refused_destroy_dialog_builder
20
- builders/table_builder
21
- builders/toolbox_builder
22
- core/settings/form_builder
23
- core/settings/table_builder
24
- )
25
- files.each do|file|
26
- require "#{root_path}/app/builders/releaf/#{file}"
27
- end
@@ -1,101 +0,0 @@
1
- module Releaf::Core
2
- class Configuration
3
- attr_accessor :available_locales, :available_admin_locales, :all_locales
4
- attr_accessor :access_control_module_name, :assets_resolver_class_name, :layout_builder_class_name
5
- attr_accessor :menu, :devise_for, :mount_location, :components,
6
- :available_controllers, :additional_controllers, :controllers
7
-
8
- def configure
9
- initialize_defaults
10
- initialize_locales
11
- initialize_controllers
12
- initialize_components
13
- end
14
-
15
- def assets_resolver
16
- assets_resolver_class_name.constantize
17
- end
18
-
19
- def access_control_module
20
- access_control_module_name.constantize
21
- end
22
-
23
- def initialize_defaults
24
- default_values.each_pair do|key, value|
25
- send("#{key}=", value) if send(key).nil?
26
- end
27
- end
28
-
29
- def initialize_locales
30
- ::I18n.available_locales = available_locales
31
- self.available_admin_locales = available_locales if available_admin_locales.nil?
32
- self.all_locales = (available_locales + available_admin_locales).map(&:to_s).uniq
33
- end
34
-
35
- def initialize_components
36
- self.components = flatten_components(components)
37
- components.each do|component_class|
38
- component_class.initialize_component if component_class.respond_to? :initialize_component
39
- end
40
- end
41
-
42
- def flatten_components(raw_components)
43
- raw_components.each.inject([]) do |list, component_class|
44
- list += flatten_components(component_class.components) if component_class.respond_to? :components
45
- list << component_class # add component itself latter as there can be dependancy to be loadable first
46
- end
47
- end
48
-
49
- def initialize_controllers
50
- self.menu = normalize_controllers(menu)
51
- self.additional_controllers = normalize_controllers(additional_controllers)
52
- self.controllers = extract_controllers(menu + additional_controllers)
53
- self.available_controllers = controllers.keys
54
- end
55
-
56
- def extract_controllers(list)
57
- list.each.inject({}) do |controller_list, item|
58
- controller_list[item[:controller]] = item if item.has_key? :controller
59
- controller_list.merge!(extract_controllers(item[:items])) if item.has_key? :items
60
- controller_list
61
- end
62
- end
63
-
64
- def normalize_controllers(list)
65
- list.map{|item| normalize_controller_item(item)}
66
- end
67
-
68
- def normalize_controller_item(item_data)
69
- if item_data.is_a? String
70
- item = {controller: item_data}
71
- elsif item_data.is_a? Hash
72
- item = item_data
73
- end
74
-
75
- item[:name] = item[:controller] unless item.has_key? :name
76
-
77
- if item.has_key? :helper
78
- item[:url_helper] = item[:helper].to_sym
79
- elsif item.has_key? :controller
80
- item[:url_helper] = item[:controller].gsub('/', '_').to_sym
81
- end
82
-
83
- item[:items] = normalize_controllers(item[:items]) if item.has_key?(:items)
84
-
85
- item
86
- end
87
-
88
- def default_values
89
- {
90
- menu: [],
91
- devise_for: 'releaf/permissions/user',
92
- additional_controllers: [],
93
- controllers: {},
94
- components: [],
95
- assets_resolver_class_name: 'Releaf::Core::AssetsResolver',
96
- layout_builder_class_name: 'Releaf::Builders::Page::LayoutBuilder',
97
- access_control_module_name: 'Releaf::Permissions'
98
- }
99
- end
100
- end
101
- end
@@ -1,35 +0,0 @@
1
- require 'jquery-cookie-rails'
2
- require 'rails-settings-cached'
3
- require 'ckeditor_rails'
4
- require 'will_paginate'
5
- require 'font-awesome-rails'
6
- require 'haml'
7
- require 'haml-rails'
8
- require 'jquery-rails'
9
- require 'jquery-ui-rails'
10
- require 'acts_as_list'
11
- require 'dragonfly'
12
- require 'globalize'
13
- require 'globalize-accessors'
14
-
15
- module Releaf::Core
16
- require 'releaf/core/component'
17
- require 'releaf/core/settings_ui_component'
18
- require 'releaf/core/route_mapper'
19
- require 'releaf/core/builders_autoload'
20
-
21
- def self.components
22
- [Releaf::Core::SettingsUIComponent]
23
- end
24
-
25
- class Engine < ::Rails::Engine
26
- initializer 'precompile', group: :all do |app|
27
- app.config.assets.precompile += %w(ckeditor/*)
28
- app.config.assets.precompile += %w(releaf/application.css releaf/controllers/*.css releaf/*.js releaf/*.png releaf/*.gif releaf/*.ico)
29
- end
30
- end
31
-
32
- ActiveSupport.on_load :action_controller do
33
- ActionDispatch::Routing::Mapper.send(:include, Releaf::Core::RouteMapper)
34
- end
35
- end
@@ -1,38 +0,0 @@
1
- module Releaf::Core
2
- # A general Releaf exception
3
- class Error < StandardError; end
4
-
5
- # This error is raised when a user isn't allowed to access a given controller action.
6
- # This usually happens within a call to ControllerAdditions#authorize! but can be
7
- # raised manually.
8
- #
9
- # raise Releaf::AccessDenied.new("Not authorized!", AdminArticles, :read)
10
- #
11
- # The passed message, action, and subject are optional and can later be retrieved when
12
- # rescuing from the exception.
13
- #
14
- # exception.message # => "Not authorized!"
15
- # exception.action # => :read
16
- # exception.subject # => Article
17
- #
18
- # If the message is not specified (or is nil) it will default to "You are not authorized
19
- # to access this page." This default can be overridden by setting default_message.
20
- #
21
- # exception.default_message = "Default error message"
22
- # exception.message # => "Default error message"
23
- #
24
- # See ControllerAdditions#authorized! for more information on rescuing from this exception
25
- # and customizing the message using I18n.
26
- class AccessDenied < Error
27
- attr_reader :action, :subject
28
- attr_writer :default_message
29
-
30
- def initialize(controller = nil, action = nil, message = nil)
31
- @message = message
32
- @controller = controller
33
- @action = action
34
- @default_message = I18n.t(:"unauthorized.default", :default => "You are not authorized to access this page.")
35
- end
36
-
37
- end
38
- end
@@ -1,7 +0,0 @@
1
- module Releaf::Core::SettingsUIComponent
2
- extend Releaf::Core::Component
3
-
4
- def self.draw_component_routes router
5
- resource_route(router, :core, :settings)
6
- end
7
- end
data/releaf-core.gemspec DELETED
@@ -1,35 +0,0 @@
1
- require File.expand_path('../lib/releaf/version', __FILE__)
2
-
3
- Gem::Specification.new do |s|
4
- s.name = "releaf-core"
5
- s.version = Releaf::VERSION
6
-
7
- s.summary = "core gem for releaf"
8
- s.description = "Admin interface for RubyOnRails projects inspired by Leaf CMS"
9
- s.authors = ["CubeSystems"]
10
- s.email = 'info@cubesystems.lv'
11
- s.homepage = 'https://github.com/cubesystems/releaf'
12
-
13
- s.files = `git ls-files`.split("\n")
14
- s.test_files = Dir["spec/**/*"]
15
-
16
- s.add_dependency 'rails', '~> 4.2', '>= 4.2.0'
17
- s.add_dependency 'i18n', '~> 0.7', '>= 0.7.0'
18
- s.add_dependency 'sprockets-rails', '~> 3.0', '>= 3.0.0'
19
- s.add_dependency 'sass-rails'
20
- s.add_dependency 'jquery-rails'
21
- s.add_dependency 'jquery-ui-rails'
22
- s.add_dependency 'railties'
23
- s.add_dependency 'haml-rails'
24
- s.add_dependency 'dragonfly'
25
- s.add_dependency 'rails-settings-cached', '>= 0.4.5'
26
- s.add_dependency 'ckeditor_rails'
27
- s.add_dependency 'acts_as_list'
28
- s.add_dependency 'will_paginate'
29
- s.add_dependency 'font-awesome-rails'
30
- s.add_dependency 'jquery-cookie-rails'
31
- s.add_dependency 'globalize-accessors'
32
- s.add_dependency 'rack-cache'
33
-
34
- s.required_ruby_version = '>= 2.2.0'
35
- end