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,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