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
@@ -25,21 +25,30 @@ describe Releaf::Builders::Base, type: :module do
25
25
  :render, :link_to, :flash, :truncate, :radio_button_tag,
26
26
  :options_for_select, :action_name, :options_from_collection_for_select,
27
27
  :select_tag, :text_field_tag,
28
- :image_tag, :jquery_date_format, :cookies, :button_tag, :merge_attributes
28
+ :image_tag, :cookies, :button_tag, :merge_attributes
29
29
  ].each do|method_name|
30
30
  it "deletages #{method_name} to template" do
31
31
  expect(subject).to delegate_method(method_name).to(:template)
32
32
  end
33
33
  end
34
34
 
35
- [:layout_settings, :access_control, :controller_scope_name, :feature_available?,
36
- :index_url].each do|method_name|
35
+ [:controller_scope_name, :feature_available?, :builder_class, :index_path].each do|method_name|
37
36
  it "delegates #{method_name} to controller" do
38
37
  expect(subject).to delegate_method(method_name).to(:controller)
39
38
  end
40
39
  end
41
40
  end
42
41
 
42
+ describe "#layout_settings" do
43
+ it "returns settings manager setting for given key" do
44
+ allow(Releaf.application.config.settings_manager).to receive(:read)
45
+ .with(controller: "_ctrl_", key: "a.x").and_return("xxxxx")
46
+ allow(subject).to receive(:controller).and_return("_ctrl_")
47
+
48
+ expect(subject.layout_settings("a.x")).to eq("xxxxx")
49
+ end
50
+ end
51
+
43
52
  describe "#html_escape" do
44
53
  it "escapes given value with " do
45
54
  allow(ERB::Util).to receive(:html_escape).with("a").and_return("b")
@@ -47,7 +56,6 @@ describe Releaf::Builders::Base, type: :module do
47
56
  end
48
57
  end
49
58
 
50
-
51
59
  it "aliases #button to #releaf_button" do
52
60
  allow(subject.template).to receive(:releaf_button).with("x", a: "y", b: "z").and_return("xx")
53
61
  expect(subject.button("x", a: "y", b: "z")).to eq("xx")
@@ -246,28 +254,16 @@ describe Releaf::Builders::Base, type: :module do
246
254
  end
247
255
  end
248
256
 
249
- describe "#resource_to_text" do
250
- let(:resource){ Releaf::Permissions::User.new(name: "a", surname: "b") }
251
-
252
- context "when given resource respond to #to_text method" do
253
- it "returns resource #to_text output" do
254
- expect(subject.resource_to_text(resource)).to eq("a b")
255
- end
256
- end
257
-
258
- context "when given resource does not respond to #to_text method" do
259
- it "returns resource #to_s output" do
260
- allow(resource).to receive(:respond_to?).and_call_original
261
- allow(resource).to receive(:respond_to?).with(:to_text).and_return(false)
262
- allow(resource).to receive(:to_s).and_return("x")
263
- expect(subject.resource_to_text(resource)).to eq("x")
264
- end
257
+ describe "#resource_title" do
258
+ it "pass given resource to Releaf::ResourceBase.title and return result" do
259
+ allow(Releaf::ResourceBase).to receive(:title).with("x").and_return("ljhg")
260
+ expect(subject.resource_title("x")).to eq("ljhg")
265
261
  end
266
262
  end
267
263
 
268
264
  describe "#default_translation_scope" do
269
265
  it "returns controller scope" do
270
- controller = Releaf::BaseController.new
266
+ controller = Releaf::ActionController.new
271
267
  allow(subject).to receive(:controller).and_return(controller)
272
268
  allow(controller).to receive(:controller_scope_name).and_return("x")
273
269
  expect(subject.default_translation_scope).to eq("x")
@@ -25,8 +25,8 @@ describe Releaf::Builders::ConfirmDestroyDialogBuilder, type: :class do
25
25
 
26
26
  before do
27
27
  subject.resource = object
28
- allow(subject.template).to receive(:controller).and_return(Releaf::BaseController.new)
29
- allow(subject.controller).to receive(:index_url).and_return("y")
28
+ allow(subject.template).to receive(:controller).and_return(Releaf::ActionController.new)
29
+ allow(subject.controller).to receive(:index_path).and_return("y")
30
30
  end
31
31
 
32
32
  describe "#question_content" do
@@ -37,8 +37,8 @@ describe Releaf::Builders::ConfirmDestroyDialogBuilder, type: :class do
37
37
  end
38
38
 
39
39
  describe "#description_content" do
40
- it "returns `resource_to_text` value" do
41
- allow(subject).to receive(:resource_to_text).with(object).and_return("xx")
40
+ it "returns `resource_title` value" do
41
+ allow(subject).to receive(:resource_title).with(object).and_return("xx")
42
42
  expect(subject.description_content).to eq("xx")
43
43
  end
44
44
  end
@@ -64,7 +64,7 @@ describe Releaf::Builders::ConfirmDestroyDialogBuilder, type: :class do
64
64
 
65
65
  describe "#confirm_url" do
66
66
  it "returns resource destroy url" do
67
- allow(subject.template).to receive(:url_for).with(action: 'destroy', id: 99, index_url: "y").and_return("x")
67
+ allow(subject.template).to receive(:url_for).with(action: 'destroy', id: 99, index_path: "y").and_return("x")
68
68
  expect(subject.confirm_url).to eq("x")
69
69
  end
70
70
  end
@@ -33,8 +33,8 @@ describe Releaf::Builders::ConfirmDialogBuilder, type: :class do
33
33
 
34
34
  before do
35
35
  subject.resource = object
36
- allow(subject.template).to receive(:controller).and_return(Releaf::BaseController.new)
37
- allow(subject.controller).to receive(:index_url).and_return("y")
36
+ allow(subject.template).to receive(:controller).and_return(Releaf::ActionController.new)
37
+ allow(subject.controller).to receive(:index_path).and_return("y")
38
38
  end
39
39
 
40
40
  describe "#section_body" do
@@ -88,17 +88,19 @@ describe Releaf::Builders::ConfirmDialogBuilder, type: :class do
88
88
  end
89
89
  end
90
90
 
91
- describe "#cancel_url" do
92
- it "returns index url" do
93
- allow(subject).to receive(:index_url).and_return("x")
94
- expect(subject.cancel_url).to eq("x")
91
+ describe "#cancel_path" do
92
+ it "returns index path" do
93
+ allow(subject).to receive(:index_path).and_return("x")
94
+ expect(subject.cancel_path).to eq("x")
95
95
  end
96
96
  end
97
97
 
98
98
  describe "#cancel_button" do
99
99
  it "returns cancel button" do
100
+ allow(subject).to receive(:cancel_path).and_return("xasd")
100
101
  allow(subject).to receive(:t).with("No").and_return("Noo")
101
- allow(subject).to receive(:button).with("Noo", "ban", class: "secondary", data: {type: "cancel"}, href: "y").and_return("x")
102
+ allow(subject).to receive(:button).with("Noo", "ban", class: "secondary", data: {type: "cancel"}, href: "xasd")
103
+ .and_return("x")
102
104
  expect(subject.cancel_button).to eq("x")
103
105
  end
104
106
  end
@@ -20,7 +20,7 @@ describe Releaf::Builders::EditBuilder, type: :class do
20
20
 
21
21
  let(:template){ TranslationsEditBuilderTestHelper.new }
22
22
  let(:subject){ described_class.new(template) }
23
- let(:controller){ Releaf::BaseController.new }
23
+ let(:controller){ Releaf::ActionController.new }
24
24
  let(:resource){ Book.new }
25
25
 
26
26
  before do
@@ -33,12 +33,12 @@ describe Releaf::Builders::EditBuilder, type: :class do
33
33
  before do
34
34
  allow(subject).to receive(:section_attributes).and_return(a: "b")
35
35
  allow(subject).to receive(:form_options).and_return(url: "xxx", builder: Releaf::Builders::FormBuilder)
36
- allow(subject).to receive(:index_url_preserver).and_return("_index_url_")
36
+ allow(subject).to receive(:index_path_preserver).and_return("_index_path_")
37
37
  allow(subject).to receive(:section_blocks).and_return(["_section_","_blocks_"])
38
38
  end
39
39
 
40
40
  it "returns section with index url preserver and section blocks" do
41
- expect(subject.section_content).to eq('<form class="new_book" id="new_book" action="xxx" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="yyy" value="xxx" />_index_url__section__blocks_</form>')
41
+ expect(subject.section_content).to eq('<form class="new_book" id="new_book" action="xxx" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="yyy" value="xxx" />_index_path__section__blocks_</form>')
42
42
  end
43
43
 
44
44
  it "assigns form instance to builder" do
@@ -47,11 +47,11 @@ describe Releaf::Builders::EditBuilder, type: :class do
47
47
  end
48
48
  end
49
49
 
50
- describe "#index_url_preserver" do
50
+ describe "#index_path_preserver" do
51
51
  it "returns hidden index url input" do
52
- allow(subject).to receive(:params).and_return(index_url: "?asd=23&lf=dd")
53
- result = '<input type="hidden" name="index_url" id="index_url" value="?asd=23&amp;lf=dd" />'
54
- expect(subject.index_url_preserver).to eq(result)
52
+ allow(subject).to receive(:params).and_return(index_path: "?asd=23&lf=dd")
53
+ result = '<input type="hidden" name="index_path" id="index_path" value="?asd=23&amp;lf=dd" />'
54
+ expect(subject.index_path_preserver).to eq(result)
55
55
  end
56
56
  end
57
57
 
@@ -78,7 +78,7 @@ describe Releaf::Builders::EditBuilder, type: :class do
78
78
  <div class="form-error-box">
79
79
  <error_notice_header />
80
80
  <ul>
81
- <li class="error">Title Blank</li>
81
+ <li class="error">Title can&#39;t be blank</li>
82
82
  </ul>
83
83
  </div>
84
84
  ])
@@ -126,11 +126,6 @@ describe Releaf::Builders::EditBuilder, type: :class do
126
126
  end
127
127
 
128
128
  describe "#create_another_available?" do
129
-
130
- before do
131
- controller.setup
132
- end
133
-
134
129
  context "when editing an existing record" do
135
130
  let(:resource){ FactoryGirl.create(:book) }
136
131
 
@@ -184,6 +179,125 @@ describe Releaf::Builders::EditBuilder, type: :class do
184
179
  end
185
180
  end
186
181
 
182
+ describe "#form_options" do
183
+ it "returns form options" do
184
+ allow(subject).to receive(:form_builder_class).and_return("CustomFormBuilderClassHere")
185
+ allow(subject).to receive(:form_url).and_return("/some-url-here")
186
+ allow(subject).to receive(:form_attributes).and_return(some: "options_here")
187
+ allow(subject).to receive(:resource_name).and_return(:author)
188
+
189
+ options = {
190
+ builder: "CustomFormBuilderClassHere",
191
+ as: :author,
192
+ url: "/some-url-here",
193
+ html: {some: "options_here"}
194
+ }
195
+ expect(subject.form_options).to eq(options)
196
+ end
197
+ end
198
+
199
+ describe "#form_url" do
200
+ it "returns form url built from form action and resource id" do
201
+ resource.id = 23
202
+ allow(subject).to receive(:form_action).and_return("upd")
203
+ allow(subject).to receive(:url_for).with(action: "upd", id: 23).and_return("/res/new")
204
+ expect(subject.form_url).to eq("/res/new")
205
+ end
206
+ end
207
+
208
+ describe "#form_action" do
209
+ context "when new resource" do
210
+ it "returns `create`" do
211
+ allow(resource).to receive(:new_record?).and_return(true)
212
+ expect(subject.form_action).to eq("create")
213
+ end
214
+ end
215
+
216
+ context "when persisted resource" do
217
+ it "returns `update`" do
218
+ allow(resource).to receive(:new_record?).and_return(false)
219
+ expect(subject.form_action).to eq("update")
220
+ end
221
+ end
222
+ end
223
+
224
+ describe "#resource_name" do
225
+ it "returns `:resource`" do
226
+ expect(subject.resource_name).to eq(:resource)
227
+ end
228
+ end
229
+
230
+ describe "#form_url" do
231
+ it "returns form builder class" do
232
+ allow(subject).to receive(:builder_class).with(:form).and_return("x")
233
+ expect(subject.form_builder_class).to eq("x")
234
+ end
235
+ end
236
+
237
+ describe "#form_identifier" do
238
+ before do
239
+ allow(subject).to receive(:resource_name).and_return(:book)
240
+ end
241
+
242
+ context "when resource has persistance check method and it's persisted" do
243
+ it "returns resource name prefixed with `edit-`" do
244
+ allow(resource).to receive(:persisted?).and_return(true)
245
+ expect(subject.form_identifier).to eq("edit-book")
246
+ end
247
+ end
248
+
249
+ context "when resource has persistance check method and it's not persisted" do
250
+ it "returns resource name prefixed with `new-`" do
251
+ allow(resource).to receive(:persisted?).and_return(false)
252
+ expect(subject.form_identifier).to eq("new-book")
253
+ end
254
+ end
255
+
256
+ context "when resource has no persistance check method" do
257
+ it "returns resource name prefixed with `update-`" do
258
+ allow(subject).to receive(:resource).and_return(String.new)
259
+ expect(subject.form_identifier).to eq("edit-book")
260
+ end
261
+ end
262
+ end
263
+
264
+ describe "#form_classes" do
265
+ before do
266
+ allow(subject).to receive(:form_identifier).and_return("xx")
267
+ end
268
+
269
+ it "returns array with form identifier" do
270
+ expect(subject.form_classes).to eq(["xx"])
271
+ end
272
+
273
+ context "when object has any errors" do
274
+ it "adds has-error class to returned array" do
275
+ resource.title = nil
276
+ resource.valid?
277
+ expect(subject.form_classes).to eq(["xx", "has-error"])
278
+ end
279
+ end
280
+ end
281
+
282
+ describe "#form_attributes" do
283
+ it "returns form attributes" do
284
+ allow(subject).to receive(:form_identifier).and_return("xx")
285
+ allow(subject).to receive(:form_classes).and_return(["a", "b"])
286
+
287
+ attributes = {
288
+ multipart: true,
289
+ novalidate: "",
290
+ class: ["a", "b"],
291
+ id: "xx",
292
+ data: {
293
+ "remote"=>true,
294
+ "remote-validation"=>true,
295
+ "type"=>:json
296
+ }
297
+ }
298
+ expect(subject.form_attributes).to eq(attributes)
299
+ end
300
+ end
187
301
 
188
302
  describe "#save_button" do
189
303
  it "returns save button" do
@@ -195,13 +309,6 @@ describe Releaf::Builders::EditBuilder, type: :class do
195
309
  end
196
310
  end
197
311
 
198
- describe "#form_options" do
199
- it "returns controller form options for current action and resource" do
200
- allow(controller).to receive(:form_options).with(:edit, resource, :resource).and_return(:y)
201
- expect(subject.form_options).to eq(:y)
202
- end
203
- end
204
-
205
312
  describe "#form_fields" do
206
313
  it "returns form `releaf_fields` output for form `field_names` casted to array" do
207
314
  form = Releaf::Builders::FormBuilder.new(:book, Book.new, template, {})
@@ -0,0 +1,129 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::FormBuilder::Associations, type: :class do
4
+ class FormBuilderTestHelper < ActionView::Base
5
+ include Releaf::ApplicationHelper
6
+ include Releaf::ButtonHelper
7
+ include FontAwesome::Rails::IconHelper
8
+ end
9
+
10
+ let(:template){ FormBuilderTestHelper.new }
11
+ let(:object){ Book.new }
12
+ let(:subject){ Releaf::Builders::FormBuilder.new(:book, object, template, {}) }
13
+
14
+ describe "#reflect_on_association" do
15
+ it "returns reflection for given reflection name" do
16
+ expect(subject.reflect_on_association(:author)).to eq(object.class.reflections["author"])
17
+ expect(subject.reflect_on_association("author")).to eq(object.class.reflections["author"])
18
+ end
19
+ end
20
+
21
+ describe "#association_reflector" do
22
+ before do
23
+ resource_fields = subject.resource_fields
24
+ allow(resource_fields).to receive(:association_attributes).with(:x).and_return([:c, :d])
25
+
26
+ allow(subject).to receive(:resource_fields).and_return(resource_fields)
27
+ allow(subject).to receive(:sortable_column_name).and_return("sortable column name")
28
+ end
29
+
30
+ it "returns association reflector for given reflection" do
31
+ expect(subject.association_reflector(:x, [:a, :b])).to be_instance_of Releaf::Builders::AssociationReflector
32
+ end
33
+
34
+ it "pass reflection, fields and sortable column name to association reflector constructor" do
35
+ expect(Releaf::Builders::AssociationReflector).to receive(:new)
36
+ .with(:x, [:a, :b], "sortable column name")
37
+ subject.association_reflector(:x, [:a, :b])
38
+ end
39
+
40
+ context "when given fields is nil" do
41
+ it "uses resource fields returned association fields instead" do
42
+ expect(Releaf::Builders::AssociationReflector).to receive(:new)
43
+ .with(:x, [:c, :d], "sortable column name")
44
+ subject.association_reflector(:x, nil)
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "#releaf_association_fields" do
50
+ let(:reflector){ Releaf::Builders::AssociationReflector.new(:a, :b, :c) }
51
+ let(:fields){ ["a"] }
52
+
53
+ before do
54
+ allow(subject).to receive(:association_reflector).with(:author, fields).and_return(reflector)
55
+ allow(subject).to receive(:releaf_has_many_association).with(reflector).and_return("_has_many_content_")
56
+ allow(subject).to receive(:releaf_belongs_to_association).with(reflector).and_return("_belongs_to_content_")
57
+ allow(subject).to receive(:releaf_has_one_association).with(reflector).and_return("_has_one_content_")
58
+ end
59
+
60
+ context "when reflector macro is :has_many" do
61
+ it "renders association with #releaf_has_many_association" do
62
+ allow(reflector).to receive(:macro).and_return(:has_many)
63
+ expect(subject.releaf_association_fields(:author, fields)).to eq("_has_many_content_")
64
+ end
65
+ end
66
+
67
+ context "when :belongs_to association given" do
68
+ it "renders association with #releaf_belongs_to_association" do
69
+ allow(reflector).to receive(:macro).and_return(:belongs_to)
70
+ expect(subject.releaf_association_fields(:author, fields)).to eq("_belongs_to_content_")
71
+ end
72
+ end
73
+
74
+ context "when :has_one association given" do
75
+ it "renders association with #releaf_has_one_association" do
76
+ allow(reflector).to receive(:macro).and_return(:has_one)
77
+ expect(subject.releaf_association_fields(:author, fields)).to eq("_has_one_content_")
78
+ end
79
+ end
80
+
81
+ context "when non implemented assocation type given" do
82
+ it "raises error" do
83
+ allow(reflector).to receive(:macro).and_return(:new_macro_type)
84
+ expect{ subject.releaf_association_fields(:author, fields) }.to raise_error("not implemented")
85
+ end
86
+ end
87
+ end
88
+
89
+ describe "#releaf_item_field_choices" do
90
+ before do
91
+ collection = [Author.new(name: "a", surname: "b", id: 1), Author.new(name: "c", surname: "d", id: 2)]
92
+ allow(subject).to receive(:releaf_item_field_collection)
93
+ .with(:author_id, x: "a").and_return(collection)
94
+ end
95
+
96
+ context "when no select_options passed within options" do
97
+ it "returns corresponding collection array" do
98
+ expect(subject.releaf_item_field_choices(:author_id, x: "a")).to eq([["a b", 1], ["c d", 2]])
99
+ end
100
+ end
101
+
102
+ context "when options have select_options passed" do
103
+ it "returns `select_options` value" do
104
+ expect(subject.releaf_item_field_choices(:author_id, select_options: "xx")).to eq("xx")
105
+ end
106
+ end
107
+ end
108
+
109
+ describe "#releaf_item_field_collection" do
110
+ context "when collection exists within options" do
111
+ it "returns collection" do
112
+ expect(subject.releaf_item_field_collection(:author_id, collection: "x")).to eq("x")
113
+ end
114
+ end
115
+
116
+ context "when collection does not exist within options" do
117
+ it "returns all relation objects" do
118
+ allow(Author).to receive(:all).and_return("y")
119
+ expect(subject.releaf_item_field_collection(:author_id)).to eq("y")
120
+ end
121
+ end
122
+ end
123
+
124
+ describe "#relation_name" do
125
+ it "strips _id from given string and returns it as symbol" do
126
+ expect(subject.relation_name("admin_id")).to eq(:admin)
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,86 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::FormBuilder::DateFields, type: :class do
4
+ class FormBuilderTestHelper < ActionView::Base
5
+ include Releaf::ApplicationHelper
6
+ include Releaf::ButtonHelper
7
+ include FontAwesome::Rails::IconHelper
8
+ end
9
+
10
+ let(:template){ FormBuilderTestHelper.new }
11
+ let(:object){ Book.new }
12
+ let(:subject){ Releaf::Builders::FormBuilder.new(:book, object, template, {}) }
13
+
14
+ describe "#date_or_time_field" do
15
+ it "returns releaf text field with resolved date or time input attributes" do
16
+ allow(subject).to receive(:date_or_time_field_input_attributes)
17
+ .with(:published_at, :datetime, a: 1).and_return(aa: 11)
18
+ allow(subject).to receive(:releaf_text_field)
19
+ .with(:published_at, input: {aa: 11}, label: {b: 1}, field: {c: 3}, options: {field: {type: "datetime"}, d: 4})
20
+ .and_return("_fld")
21
+
22
+ expect(subject.date_or_time_field(:published_at, :datetime, input: {a: 1}, label: {b: 1},
23
+ field: {c: 3}, options: {d: 4}))
24
+ .to eq("_fld")
25
+ end
26
+ end
27
+
28
+ describe "#date_or_time_field_input_attributes" do
29
+ before do
30
+ allow(object).to receive(:published_at).and_return("_val")
31
+ allow(Releaf::Builders::Utilities::DateFields).to receive(:format_date_or_time_value)
32
+ .with("_val", :datetime).and_return("_frmt_val")
33
+ allow(Releaf::Builders::Utilities::DateFields).to receive(:date_format_for_jquery).and_return("_date_frm")
34
+ allow(Releaf::Builders::Utilities::DateFields).to receive(:time_format_for_jquery).and_return("_time_frm")
35
+ end
36
+
37
+ it "returns date or time field input attributes" do
38
+ expect(subject.date_or_time_field_input_attributes(:published_at, :datetime, {})).to eq(
39
+ class: "text datetime-picker",
40
+ value: "_frmt_val",
41
+ data: {"date-format"=>"_date_frm", "time-format"=>"_time_frm"}
42
+ )
43
+ end
44
+
45
+ it "deep merges given attributes over resolved" do
46
+ expect(subject.date_or_time_field_input_attributes(:published_at, :datetime, data: {"date-format" => "LK"})).to eq(
47
+ class: "text datetime-picker",
48
+ value: "_frmt_val",
49
+ data: {"date-format"=>"LK", "time-format"=>"_time_frm"}
50
+ )
51
+ end
52
+ end
53
+
54
+ describe "#releaf_datetime_field" do
55
+ it "returns releaf date or time field with `datetime` option" do
56
+ expect(subject).to receive(:date_or_time_field)
57
+ .with("year", :datetime, input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"})
58
+ .and_return("x")
59
+
60
+ expect(subject.releaf_datetime_field("year", input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"}))
61
+ .to eq("x")
62
+ end
63
+ end
64
+
65
+ describe "#releaf_time_field" do
66
+ it "returns releaf date or time field with `time` option" do
67
+ expect(subject).to receive(:date_or_time_field)
68
+ .with("year", :time, input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"})
69
+ .and_return("x")
70
+
71
+ expect(subject.releaf_time_field("year", input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"}))
72
+ .to eq("x")
73
+ end
74
+ end
75
+
76
+ describe "#releaf_date_field" do
77
+ it "returns releaf date or time field with `date` option" do
78
+ expect(subject).to receive(:date_or_time_field)
79
+ .with("year", :date, input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"})
80
+ .and_return("x")
81
+
82
+ expect(subject.releaf_date_field("year", input: {a: "b"}, label: {c: "d"}, field: {e: "f"}, options: {g: "h"}))
83
+ .to eq("x")
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,48 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::FormBuilder::I18nFields, type: :class do
4
+ class FormBuilderTestHelper < ActionView::Base
5
+ include Releaf::ApplicationHelper
6
+ include Releaf::ButtonHelper
7
+ include FontAwesome::Rails::IconHelper
8
+ end
9
+
10
+ let(:template){ FormBuilderTestHelper.new }
11
+ let(:object){ Book.new }
12
+ let(:subject){ Releaf::Builders::FormBuilder.new(:book, object, template, {}) }
13
+
14
+ describe "#locales" do
15
+ it "returns object globalize locales" do
16
+ allow(subject.object.class).to receive(:globalize_locales).and_return([:de, :ru])
17
+ expect(subject.locales).to eq([:de, :ru])
18
+ end
19
+ end
20
+
21
+ describe "#default_locale" do
22
+ before do
23
+ allow(subject).to receive(:layout_settings).with("releaf.i18n.locale").and_return("de")
24
+ allow(I18n).to receive(:locale).and_return(:ru)
25
+ allow(subject).to receive(:locales).and_return([:de, :ru])
26
+ end
27
+
28
+ context "when layout settings has stored locale" do
29
+ it "returns stored locale normalized to symbol" do
30
+ expect(subject.default_locale).to eq(:de)
31
+ end
32
+ end
33
+
34
+ context "when layout settings hasn't stored locale" do
35
+ it "returns current I18n locale" do
36
+ allow(subject).to receive(:layout_settings).with("releaf.i18n.locale").and_return(nil)
37
+ expect(subject.default_locale).to eq(:ru)
38
+ end
39
+ end
40
+
41
+ context "when stored locale or I18n locale is not within form locales" do
42
+ it "returns first form locale" do
43
+ allow(subject).to receive(:locales).and_return([:lv, :en])
44
+ expect(subject.default_locale).to eq(:lv)
45
+ end
46
+ end
47
+ end
48
+ end