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