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