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