releaf-core 0.2.1 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
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