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,8 @@
1
1
  class Releaf::Builders::FormBuilder < ActionView::Helpers::FormBuilder
2
2
  include Releaf::Builders::Base
3
- include Releaf::Tags::AssociatedSetField
4
- include Releaf::Builders::Orderer
3
+ include Releaf::Builders::FormBuilder::Label
4
+ include Releaf::Builders::FormBuilder::Fields
5
+ include Releaf::Builders::FormBuilder::Associations
5
6
  attr_accessor :template
6
7
 
7
8
  def field_names
@@ -9,7 +10,7 @@ class Releaf::Builders::FormBuilder < ActionView::Helpers::FormBuilder
9
10
  end
10
11
 
11
12
  def resource_fields
12
- Releaf::Core::ResourceFields.new(object.class)
13
+ Releaf::ResourceFields.new(object.class)
13
14
  end
14
15
 
15
16
  def field_render_method_name(name)
@@ -65,124 +66,8 @@ class Releaf::Builders::FormBuilder < ActionView::Helpers::FormBuilder
65
66
  end
66
67
  end
67
68
 
68
- def reflect_on_association(association_name)
69
- object.class.reflect_on_association(association_name)
70
- end
71
-
72
- def association_reflector(reflection, fields)
73
- fields ||= resource_fields.association_attributes(reflection)
74
- Releaf::Builders::AssociationReflector.new(reflection, fields, sortable_column_name)
75
- end
76
-
77
- def releaf_association_fields(reflection, fields)
78
- reflector = association_reflector(reflection, fields)
79
-
80
- case reflector.macro
81
- when :has_many
82
- releaf_has_many_association(reflector)
83
- when :belongs_to
84
- releaf_belongs_to_association(reflector)
85
- when :has_one
86
- releaf_has_one_association(reflector)
87
- else
88
- raise 'not implemented'
89
- end
90
- end
91
-
92
- def releaf_belongs_to_association(reflector)
93
- releaf_has_one_or_belongs_to_association(reflector)
94
- end
95
-
96
- def releaf_has_one_association(reflector)
97
- object.send("build_#{reflector.name}") unless object.send(reflector.name).present?
98
- releaf_has_one_or_belongs_to_association(reflector)
99
- end
100
-
101
- def releaf_has_one_or_belongs_to_association(reflector)
102
- tag(:fieldset, class: "type-association", data: {name: reflector.name}) do
103
- tag(:legend, translate_attribute(reflector.name)) <<
104
- fields_for(reflector.name, object.send(reflector.name), relation_name: reflector.name, builder: self.class) do |builder|
105
- builder.releaf_fields(reflector.fields)
106
- end
107
- end
108
- end
109
-
110
- def releaf_has_many_association(reflector)
111
- item_template = releaf_has_many_association_fields(reflector, reflector.klass.new, '_template_', true)
112
-
113
- tag(:section, class: "nested", data: {name: reflector.name, "releaf-template" => html_escape(item_template.to_str)}) do
114
- [
115
- releaf_has_many_association_header(reflector),
116
- releaf_has_many_association_body(reflector),
117
- releaf_has_many_association_footer(reflector)
118
- ]
119
- end
120
- end
121
-
122
- def releaf_has_many_association_header(reflector)
123
- tag(:header) do
124
- tag(:h1, translate_attribute(reflector.name))
125
- end
126
- end
127
-
128
- def releaf_has_many_association_body(reflector)
129
- attributes = {
130
- class: ["body", "list"]
131
- }
132
- attributes["data"] = {sortable: nil} if reflector.sortable?
133
-
134
- tag(:div, attributes) do
135
- association_collection(reflector).each_with_index.map do |association_object, index|
136
- releaf_has_many_association_fields(reflector, association_object, index, reflector.destroyable?)
137
- end
138
- end
139
- end
140
-
141
- def releaf_has_many_association_footer(reflector)
142
- tag(:footer){ field_type_add_nested }
143
- end
144
-
145
- def releaf_has_many_association_fields(reflector, association_object, association_index, destroyable)
146
- tag(:fieldset, class: ["item", "type-association"], data: {name: reflector.name, index: association_index}) do
147
- fields_for(reflector.name, association_object, relation_name: reflector.name,
148
- child_index: association_index, builder: self.class) do |builder|
149
- builder.releaf_has_many_association_field(reflector, destroyable)
150
- end
151
- end
152
- end
153
-
154
- def releaf_has_many_association_field(reflector, destroyable)
155
- content = ActiveSupport::SafeBuffer.new
156
- skippable_fields = []
157
-
158
- if reflector.sortable?
159
- skippable_fields << sortable_column_name
160
- content << hidden_field(sortable_column_name.to_sym, class: "item-position")
161
- content << tag(:div, "&nbsp;".html_safe, class: "handle")
162
- end
163
-
164
- content << releaf_fields(reflector.fields - skippable_fields)
165
- content << field_type_remove_nested if destroyable
166
-
167
- content
168
- end
169
-
170
- def field_type_remove_nested
171
- button_attributes = {title: t('Remove item'), class: "danger remove-nested-item"}
172
- wrapper(class: "remove-item-box") do
173
- button(nil, "trash-o", button_attributes) << hidden_field("_destroy", class: "destroy")
174
- end
175
- end
176
-
177
- def field_type_add_nested
178
- button(t('Add item'), "plus", class: "primary add-nested-item")
179
- end
180
-
181
69
  def field_type_method(name)
182
- type = Releaf::Core::TemplateFieldTypeMapper.field_type_name(object, name)
183
- localization = Releaf::Core::TemplateFieldTypeMapper.use_i18n?(object, name)
184
-
185
- "releaf_#{type}_#{'i18n_' if localization}field"
70
+ Releaf::Builders::Utilities::ResolveAttributeFieldMethodName.call(object: object, attribute_name: name.to_s)
186
71
  end
187
72
 
188
73
  def releaf_field(name, input: {}, label: {}, field: {}, options: {}, &block)
@@ -190,338 +75,6 @@ class Releaf::Builders::FormBuilder < ActionView::Helpers::FormBuilder
190
75
  send(method_name, name, input: input, label: label, field: field, options: options, &block)
191
76
  end
192
77
 
193
- def releaf_item_field_collection(name, options = {})
194
- options[:collection] || object.class.reflect_on_association(relation_name(name)).try(:klass).try(:all)
195
- end
196
-
197
- def releaf_item_field_choices(name, options = {})
198
- unless options.key? :select_options
199
- options[:select_options] = releaf_item_field_collection(name, options)
200
- .collect{|item| [resource_to_text(item), item.id]}
201
- end
202
-
203
- if options[:select_options].is_a? Array
204
- choices = options_for_select(options[:select_options], object.send(name))
205
- else
206
- choices = options[:select_options]
207
- end
208
-
209
- choices
210
- end
211
-
212
- def relation_name(name)
213
- name.to_s.sub(/_id$/, '').to_sym
214
- end
215
-
216
- def releaf_item_field(name, input: {}, label: {}, field: {}, options: {}, &block)
217
- label = {translation_key: name.to_s.sub(/_id$/, '').to_s}.deep_merge(label)
218
- attributes = input_attributes(name, {value: object.send(name)}.merge(input), options)
219
- options = {field: {type: "item"}}.deep_merge(options)
220
-
221
-
222
- # add empty value when validation exists, so user is forced to choose something
223
- unless options.key? :include_blank
224
- options[:include_blank] = true
225
- object.class.validators_on(name).each do |validator|
226
- next unless validator.is_a? ActiveModel::Validations::PresenceValidator
227
- # if new record, or object is missing (was deleted)
228
- options[:include_blank] = object.new_record? || object.send(relation_name(name)).blank?
229
- break
230
- end
231
- end
232
-
233
-
234
- choices = releaf_item_field_choices(name, options)
235
- content = select(name, choices, options, attributes)
236
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
237
- end
238
-
239
- def releaf_image_field(name, input: {}, label: {}, field: {}, options: {}, &block)
240
- name = name.to_s.sub(/_uid$/, '')
241
-
242
- attributes = {
243
- accept: 'image/png,image/jpeg,image/bmp,image/gif'
244
- }.merge(input)
245
-
246
- attributes = input_attributes(name, attributes, options)
247
-
248
- options = {field: {type: "image"}}.deep_merge(options)
249
- content = file_field(name, attributes)
250
- if object.send(name).present?
251
- content += tag(:div, class: "value-preview") do
252
- inner_content = tag(:div, class: "image-wrap") do
253
- thumbnail = image_tag(object.send(name).thumb('410x128>').url, alt: '')
254
- hidden_field("retained_#{name}") +
255
- link_to(thumbnail, object.send(name).url, target: :_blank, class: :ajaxbox, rel: :image)
256
- end
257
- inner_content << releaf_file_remove_button(name)
258
- end
259
- end
260
-
261
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
262
- end
263
-
264
- def releaf_file_remove_button(name)
265
- tag(:div, class: "remove") do
266
- check_box("remove_#{name}") << label("remove_#{name}", t("Remove"))
267
- end
268
- end
269
-
270
- def releaf_file_field(name, input: {}, label: {}, field: {}, options: {}, &block)
271
- name = name.to_s.sub(/_uid$/, '')
272
- attributes = input_attributes(name, input, options)
273
- options = {field: {type: "file"}}.deep_merge(options)
274
-
275
- content = file_field(name, attributes)
276
- if object.send(name).present?
277
- content << hidden_field("retained_#{name}")
278
- content << link_to(t("Download"), object.send(name).url, target: "_blank")
279
- content << releaf_file_remove_button(name)
280
- end
281
-
282
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
283
- end
284
-
285
- def releaf_boolean_field(name, input: {}, label: {}, field: {}, options: {})
286
- attributes = input_attributes(name, input, options)
287
- options = {field: {type: "boolean"}}.deep_merge(options)
288
-
289
- wrapper(field_attributes(name, field, options)) do
290
- wrapper(class: "value") do
291
- check_box(name, attributes) << releaf_label(name, label, options.deep_merge(label: {minimal: true}))
292
- end
293
- end
294
- end
295
-
296
- def date_or_time_fields(name, type, input: {}, label: {}, field: {}, options: {})
297
- input = date_or_time_fields_input_attributes(name, type, input)
298
- options = {field: {type: type.to_s}}.deep_merge(options)
299
- releaf_text_field(name, input: input, label: label, field: field, options: options)
300
- end
301
-
302
- def date_or_time_fields_input_attributes(name, type, attributes)
303
- value = object.send(name)
304
- {
305
- class: "text #{type}-picker",
306
- data: {
307
- "date-format" => date_format_for_jquery,
308
- "time-format" => time_format_for_jquery
309
- },
310
- value: (format_date_or_time_value(value, type) if value)
311
- }.merge(attributes)
312
- end
313
-
314
- def normalize_date_or_time_value(value, type)
315
- case type
316
- when :date
317
- value.to_date
318
- when :datetime
319
- value.to_datetime
320
- when :time
321
- value.to_time
322
- end
323
- end
324
-
325
- def format_date_or_time_value(value, type)
326
- default_format = date_or_time_default_format(type)
327
- value = normalize_date_or_time_value(value, type)
328
-
329
- if type == :time
330
- value.strftime(default_format)
331
- else
332
- I18n.l(value, default: default_format)
333
- end
334
- end
335
-
336
- def time_format_for_jquery
337
- format = date_or_time_default_format(:time)
338
- jquery_date_format(format)
339
- end
340
-
341
- def date_format_for_jquery
342
- format = date_or_time_default_format(:date)
343
- jquery_date_format(t("default", scope: "date.formats", default: format))
344
- end
345
-
346
- def date_or_time_default_format(type)
347
- case type
348
- when :date
349
- "%Y-%m-%d"
350
- when :datetime
351
- "%Y-%m-%d %H:%M"
352
- when :time
353
- "%H:%M"
354
- end
355
- end
356
-
357
- def releaf_datetime_field(name, input: {}, label: {}, field: {}, options: {})
358
- date_or_time_fields(name, :datetime, input: input, label: label, field: field, options: options)
359
- end
360
-
361
- def releaf_time_field(name, input: {}, label: {}, field: {}, options: {})
362
- date_or_time_fields(name, :time, input: input, label: label, field: field, options: options)
363
- end
364
-
365
- def releaf_date_field(name, input: {}, label: {}, field: {}, options: {})
366
- date_or_time_fields(name, :date, input: input, label: label, field: field, options: options)
367
- end
368
-
369
- def releaf_richtext_field(name, input: {}, label: {}, field: {}, options: {}, &block)
370
- attributes = richtext_input_attributes(name)
371
- .merge(value: object.send(name))
372
- .merge(input)
373
- attributes = input_attributes(name, attributes, options)
374
-
375
- options = richtext_options(name, options)
376
- content = text_area(name, attributes)
377
-
378
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
379
- end
380
-
381
- def releaf_textarea_field(name, input: {}, label: {}, field: {}, options: {}, &block)
382
- attributes = {
383
- rows: 5,
384
- cols: 75,
385
- value: object.send(name)
386
- }.merge(input)
387
-
388
- attributes = input_attributes(name, attributes, options)
389
-
390
- options = {field: {type: "textarea"}}.deep_merge(options)
391
- content = text_area(name, attributes)
392
-
393
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
394
- end
395
-
396
- def releaf_email_field(name, input: {}, label: {}, field: {}, options: {}, &block)
397
- options = {field: {type: "email"}}.deep_merge(options)
398
- input = {type: "email"}.deep_merge(input)
399
- releaf_text_field(name, input: input, label: label, field: field, options: options, &block)
400
- end
401
-
402
- def releaf_link_field(name, input: {}, label: {}, field: {}, options: {}, &block)
403
- options = {field: {type: "link"}}.deep_merge(options)
404
- releaf_text_field(name, input: input, label: label, field: field, options: options, &block)
405
- end
406
-
407
- def releaf_password_field(name, input: {}, label: {}, field: {}, options: {}, &block)
408
- attributes = input_attributes(name, {autocomplete: "off", class: "text"}.merge(input), options)
409
- options = {field: {type: "password"}}.deep_merge(options)
410
- content = password_field(name, attributes)
411
-
412
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
413
- end
414
-
415
- def releaf_number_field(name, input: {}, label: {}, field: {}, options: {}, &block)
416
- attributes = input_attributes(name, {value: object.send(name), step: "any", class: "text" }.merge(input), options)
417
- options = {field: {type: "number"}}.deep_merge(options)
418
- content = number_field(name, attributes)
419
-
420
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
421
- end
422
-
423
- alias_method :releaf_integer_field, :releaf_number_field
424
- alias_method :releaf_float_field, :releaf_number_field
425
- alias_method :releaf_decimal_field, :releaf_number_field
426
-
427
- def releaf_text_field(name, input: {}, label: {}, field: {}, options: {}, &block)
428
- attributes = input_attributes(name, {value: object.send(name), class: "text"}.merge(input), options)
429
- options = {field: {type: "text"}}.deep_merge(options)
430
- content = text_field(name, attributes)
431
-
432
- input_wrapper_with_label(name, content, label: label, field: field, options: options, &block)
433
- end
434
-
435
- def releaf_text_i18n_field(name, input: {}, label: {}, field: {}, options: {})
436
- options = {field: {type: "text"}}.deep_merge(options)
437
- input = {class: "text"}.deep_merge(input)
438
- localized_field(name, :text_field, input: input, label: label, field: field, options: options)
439
- end
440
-
441
- def releaf_link_i18n_field(name, input: {}, label: {}, field: {}, options: {})
442
- options = {field: {type: "link"}}.deep_merge(options)
443
- input = {class: "text"}.deep_merge(input)
444
- localized_field(name, :text_field, input: input, label: label, field: field, options: options)
445
- end
446
-
447
- def richtext_input_attributes(name)
448
- {
449
- rows: 5,
450
- cols: 50,
451
- class: "richtext",
452
- data: {
453
- "attachment-upload-url" => (controller.respond_to?(:releaf_richtext_attachment_upload_url) ? controller.releaf_richtext_attachment_upload_url : '')
454
- },
455
- }
456
- end
457
-
458
- def richtext_options(name, options)
459
- {field: {type: "richtext"}, label: {translation_key: name.to_s.sub(/_html$/, '').to_s }}.deep_merge(options)
460
- end
461
-
462
- def releaf_richtext_i18n_field(name, input: {}, label: {}, field: {}, options: {})
463
- input = richtext_input_attributes(name).merge(input)
464
- options = richtext_options(name, options)
465
- localized_field(name, :text_area, input: input, label: label, field: field, options: options)
466
- end
467
-
468
- def releaf_textarea_i18n_field(name, input: {}, label: {}, field: {}, options: {})
469
- input = {
470
- rows: 5,
471
- cols: 75,
472
- }.merge(input)
473
- options = {field: {type: "textarea"}}.deep_merge(options)
474
- localized_field(name, :text_area, input: input, label: label, field: field, options: options)
475
- end
476
-
477
- def default_locale
478
- selected_locale = (cookies[:'releaf.i18n.locale'] || I18n.locale).to_sym
479
- locales.include?(selected_locale) ? selected_locale : locales.first
480
- end
481
-
482
- def locales
483
- object.class.globalize_locales
484
- end
485
-
486
- def localized_field(name, field_type, input: {}, label: {}, field: {}, options: {})
487
- options = {i18n: true, label: {translation_key: name}}.deep_merge(options)
488
-
489
- wrapper(field_attributes(name, field, options)) do
490
- content = object.class.globalize_locales.collect do |locale|
491
- localized_name = "#{name}_#{locale}"
492
- html_class = ["localization"]
493
- html_class << "active" if locale == default_locale
494
-
495
- tag(:div, class: html_class, data: {locale: locale}) do
496
- releaf_label(localized_name, label, options) <<
497
- tag(:div, class: "value") do
498
- attributes = input_attributes(name, {value: object.send(localized_name)}.merge(input), options)
499
- send(field_type, localized_name, attributes)
500
- end
501
- end
502
- end
503
-
504
- content << localization_switch
505
- end
506
- end
507
-
508
- def localization_switch
509
- tag(:div, class: "localization-switch") do
510
- button_tag(type: 'button', title: t('Switch locale'), class: "trigger") do
511
- tag(:span, default_locale, class: "label") + tag(:i, nil, class: ["fa", "fa-chevron-down"])
512
- end <<
513
- tag(:menu, class: ["localization-menu-items"], type: 'toolbar') do
514
- tag(:ul) do
515
- object.class.globalize_locales.collect do |locale, i|
516
- tag(:li) do
517
- tag(:button, translate_locale(locale), type: "button", data: {locale: locale})
518
- end
519
- end
520
- end
521
- end
522
- end
523
- end
524
-
525
78
  def input_wrapper_with_label(name, input_content, label: {}, field: {}, options: {})
526
79
  field(name, field, options) do
527
80
  input_content = safe_join{[input_content, yield.to_s]} if block_given?
@@ -539,49 +92,15 @@ class Releaf::Builders::FormBuilder < ActionView::Helpers::FormBuilder
539
92
  classes = ["field", "type-#{type}"]
540
93
  classes << "i18n" if options.key? :i18n
541
94
 
542
- merge_attributes({class: classes, data: {name: name}}, attributes)
95
+ merge_attributes({class: classes, data: {name: name.to_s}}, attributes)
543
96
  end
544
97
 
545
- def label_attributes(name, attributes, options)
98
+ def input_attributes(_name, attributes, _options)
546
99
  attributes
547
100
  end
548
101
 
549
- def input_attributes(name, attributes, options)
550
- attributes
551
- end
552
-
553
-
554
- def releaf_label(name, attributes, options = {})
555
- label_options = options.fetch(:label, {})
556
- attributes = label_attributes(name, attributes, options)
557
- text = label_text(name, label_options)
558
-
559
- content = label(name, text, attributes)
560
-
561
- if label_options.fetch(:minimal, false) == true
562
- content
563
- else
564
- content += wrapper(label_options[:description], class: "description") if label_options.fetch(:description, nil).present?
565
- wrapper(content, class: "label-wrap")
566
- end
567
- end
568
-
569
- def label_text(name, options = {})
570
- if options[:label_text].present?
571
- options[:label_text]
572
- else
573
- if options[:translation_key].present?
574
- key = options[:translation_key]
575
- else
576
- key = name.to_s.sub(/_uid$/, '')
577
- end
578
-
579
- translate_attribute(key)
580
- end
581
- end
582
-
583
102
  def translate_attribute(attribute)
584
- object.class.human_attribute_name(attribute, create_default: false)
103
+ object.class.human_attribute_name(attribute)
585
104
  end
586
105
 
587
106
  def association_collection(reflector)
@@ -3,7 +3,7 @@ class Releaf::Builders::IndexBuilder
3
3
  include Releaf::Builders::Collection
4
4
 
5
5
  def header_extras
6
- search_block
6
+ search_block if feature_available?(:search)
7
7
  end
8
8
 
9
9
  def dialog?
@@ -88,7 +88,7 @@ class Releaf::Builders::IndexBuilder
88
88
 
89
89
  def footer_primary_tools
90
90
  items = []
91
- items << resource_creation_button if feature_available? :create
91
+ items << resource_creation_button if feature_available?(:create)
92
92
  items
93
93
  end
94
94
 
@@ -110,9 +110,16 @@ class Releaf::Builders::IndexBuilder
110
110
  button(text, "plus", class: "primary", href: url)
111
111
  end
112
112
 
113
+ def table_options
114
+ {
115
+ builder: builder_class(:table),
116
+ toolbox: feature_available?(:toolbox)
117
+ }
118
+ end
119
+
113
120
  def section_body
114
121
  tag(:div, class: "body") do
115
- template.releaf_table(collection, template.resource_class, template.table_options)
122
+ template.releaf_table(collection, template.resource_class, table_options)
116
123
  end
117
124
  end
118
125
  end
@@ -1,70 +1,34 @@
1
- class Releaf::Builders::Page::HeaderBuilder
2
- include Releaf::Builders::Base
3
- include Releaf::Builders::Template
4
-
5
- def output
6
- safe_join do
7
- items
1
+ module Releaf::Builders::Page
2
+ class HeaderBuilder
3
+ include Releaf::Builders::Base
4
+ include Releaf::Builders::Template
5
+
6
+ def output
7
+ safe_join do
8
+ items
9
+ end
8
10
  end
9
- end
10
11
 
11
- def items
12
- [home_link, profile_block, sign_out_form]
13
- end
14
-
15
- def home_link
16
- tag(:a, class: "home", href: home_url) do
17
- image_tag(home_image_path, alt: home_text)
12
+ def items
13
+ [home_link]
18
14
  end
19
- end
20
-
21
- def home_url
22
- url_for(:releaf_root)
23
- end
24
-
25
- def home_text
26
- "Releaf"
27
- end
28
-
29
- def home_image_path
30
- "releaf/logo.png"
31
- end
32
-
33
- def profile_url
34
- url_for(action: 'edit', controller: profile_controller)
35
- end
36
15
 
37
- def profile_settings_url
38
- url_for(action: 'settings', controller: profile_controller)
39
- end
40
-
41
- def profile_controller
42
- "/releaf/permissions/profile"
43
- end
44
-
45
- def profile_block
46
- tag(:a, class: "button profile", href: profile_url, "data-settings-url" => profile_settings_url) do
47
- [tag(:span, profile_user_name, class: "name")]
16
+ def home_link
17
+ tag(:a, class: "home", href: home_url) do
18
+ image_tag(home_image_path, alt: home_text)
19
+ end
48
20
  end
49
- end
50
21
 
51
- def user
52
- access_control.user
53
- end
54
-
55
- def profile_user_name
56
- user.to_text
57
- end
22
+ def home_url
23
+ url_for(:releaf_root)
24
+ end
58
25
 
59
- def sign_out_url
60
- url_for(action: 'destroy', controller: "/releaf/permissions/sessions")
61
- end
26
+ def home_text
27
+ "Releaf"
28
+ end
62
29
 
63
- def sign_out_form
64
- form_tag(sign_out_url, method: :delete, class: "sign-out") do
65
- tag(:button, class: "button only-icon", type: "submit", title: t('Sign out', scope: "admin.sessions")) do
66
- icon("power-off icon-header")
67
- end
30
+ def home_image_path
31
+ "releaf/logo.png"
68
32
  end
69
33
  end
70
34
  end