releaf-core 0.2.1

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 (288) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
  4. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
  5. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
  6. data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  7. data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  8. data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  9. data/app/assets/images/releaf/icons/favicon.ico +0 -0
  10. data/app/assets/images/releaf/icons/favicon.png +0 -0
  11. data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
  12. data/app/assets/images/releaf/logo-login.png +0 -0
  13. data/app/assets/images/releaf/logo.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
  17. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
  18. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
  19. data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
  20. data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
  21. data/app/assets/javascripts/releaf/application.js +13 -0
  22. data/app/assets/javascripts/releaf/include/ajax.js +66 -0
  23. data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
  24. data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
  25. data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
  26. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
  27. data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
  28. data/app/assets/javascripts/releaf/include/loader.js +45 -0
  29. data/app/assets/javascripts/releaf/include/localization.js +213 -0
  30. data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
  31. data/app/assets/javascripts/releaf/include/notifications.js +267 -0
  32. data/app/assets/javascripts/releaf/include/pagination.js +19 -0
  33. data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
  34. data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
  35. data/app/assets/javascripts/releaf/include/search.js +140 -0
  36. data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
  37. data/app/assets/javascripts/releaf/include/sortable.js +69 -0
  38. data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
  39. data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
  40. data/app/assets/stylesheets/releaf/application.scss +9 -0
  41. data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
  42. data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
  43. data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
  44. data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
  45. data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
  46. data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
  47. data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
  48. data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
  49. data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
  50. data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
  51. data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
  52. data/app/assets/stylesheets/releaf/environment.scss +4 -0
  53. data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
  54. data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
  55. data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
  56. data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
  57. data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
  58. data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
  59. data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
  60. data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
  61. data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
  62. data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
  63. data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
  64. data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
  65. data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
  66. data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
  67. data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
  68. data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
  69. data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
  70. data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
  71. data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
  72. data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
  73. data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
  74. data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
  75. data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
  76. data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
  77. data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
  78. data/app/assets/stylesheets/releaf/layout.scss +35 -0
  79. data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
  80. data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
  81. data/app/builders/releaf/builders/association_reflector.rb +58 -0
  82. data/app/builders/releaf/builders/base.rb +80 -0
  83. data/app/builders/releaf/builders/collection.rb +8 -0
  84. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
  85. data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
  86. data/app/builders/releaf/builders/edit_builder.rb +66 -0
  87. data/app/builders/releaf/builders/form_builder.rb +594 -0
  88. data/app/builders/releaf/builders/index_builder.rb +118 -0
  89. data/app/builders/releaf/builders/orderer.rb +5 -0
  90. data/app/builders/releaf/builders/page/header_builder.rb +70 -0
  91. data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
  92. data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
  93. data/app/builders/releaf/builders/pagination_builder.rb +107 -0
  94. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
  95. data/app/builders/releaf/builders/resource.rb +9 -0
  96. data/app/builders/releaf/builders/resource_dialog.rb +8 -0
  97. data/app/builders/releaf/builders/resource_view.rb +54 -0
  98. data/app/builders/releaf/builders/show_builder.rb +3 -0
  99. data/app/builders/releaf/builders/table_builder.rb +280 -0
  100. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
  101. data/app/builders/releaf/builders/template.rb +8 -0
  102. data/app/builders/releaf/builders/toolbox.rb +23 -0
  103. data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
  104. data/app/builders/releaf/builders/view.rb +132 -0
  105. data/app/builders/releaf/builders.rb +38 -0
  106. data/app/builders/releaf/core/settings/form_builder.rb +21 -0
  107. data/app/builders/releaf/core/settings/table_builder.rb +11 -0
  108. data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
  109. data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
  110. data/app/controllers/releaf/base_controller.rb +458 -0
  111. data/app/controllers/releaf/core/errors_controller.rb +5 -0
  112. data/app/controllers/releaf/core/settings_controller.rb +50 -0
  113. data/app/helpers/releaf/application_helper.rb +53 -0
  114. data/app/helpers/releaf/button_helper.rb +50 -0
  115. data/app/helpers/releaf/javascript_helper.rb +75 -0
  116. data/app/lib/releaf/core/assets_resolver.rb +58 -0
  117. data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
  118. data/app/lib/releaf/core/error_formatter.rb +103 -0
  119. data/app/lib/releaf/core/item_orderer.rb +102 -0
  120. data/app/lib/releaf/core/resource_base.rb +66 -0
  121. data/app/lib/releaf/core/resource_fields.rb +6 -0
  122. data/app/lib/releaf/core/resource_params.rb +47 -0
  123. data/app/lib/releaf/core/resource_table_fields.rb +10 -0
  124. data/app/lib/releaf/core/resource_utilities.rb +36 -0
  125. data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
  126. data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
  127. data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
  128. data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
  129. data/app/lib/releaf/core/responders/error_responder.rb +9 -0
  130. data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
  131. data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
  132. data/app/lib/releaf/core/responders.rb +31 -0
  133. data/app/lib/releaf/core/search.rb +147 -0
  134. data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
  135. data/app/models/releaf/richtext_attachment.rb +6 -0
  136. data/app/models/releaf/settings.rb +27 -0
  137. data/app/views/layouts/releaf/admin.html.erb +1 -0
  138. data/app/views/releaf/base/confirm_destroy.ruby +1 -0
  139. data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
  140. data/app/views/releaf/base/edit.ruby +1 -0
  141. data/app/views/releaf/base/index.ruby +1 -0
  142. data/app/views/releaf/base/new.ruby +1 -0
  143. data/app/views/releaf/base/refused_destroy.ruby +1 -0
  144. data/app/views/releaf/base/show.ruby +1 -0
  145. data/app/views/releaf/base/toolbox.ruby +1 -0
  146. data/app/views/releaf/error_pages/_error.html.haml +10 -0
  147. data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
  148. data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
  149. data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
  150. data/lib/generators/dummy/install_generator.rb +18 -0
  151. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
  152. data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
  153. data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
  154. data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
  155. data/lib/generators/dummy/templates/config/routes.rb +19 -0
  156. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
  157. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
  158. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
  159. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
  160. data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
  161. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  162. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
  163. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
  164. data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
  165. data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
  166. data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
  167. data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
  168. data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
  169. data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
  170. data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
  171. data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
  172. data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
  173. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
  174. data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
  175. data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
  176. data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
  177. data/lib/generators/dummy/templates/models/author.rb +10 -0
  178. data/lib/generators/dummy/templates/models/banner.rb +5 -0
  179. data/lib/generators/dummy/templates/models/book.rb +19 -0
  180. data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
  181. data/lib/generators/dummy/templates/models/bundle.rb +17 -0
  182. data/lib/generators/dummy/templates/models/chapter.rb +7 -0
  183. data/lib/generators/dummy/templates/models/home_page.rb +5 -0
  184. data/lib/generators/dummy/templates/models/node.rb +10 -0
  185. data/lib/generators/dummy/templates/models/publisher.rb +9 -0
  186. data/lib/generators/dummy/templates/models/text_page.rb +5 -0
  187. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
  188. data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
  189. data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
  190. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
  191. data/lib/generators/releaf/install_generator.rb +93 -0
  192. data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
  193. data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
  194. data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
  195. data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
  196. data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
  197. data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
  198. data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
  199. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
  200. data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
  201. data/lib/generators/releaf/templates/models/node.rb +3 -0
  202. data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
  203. data/lib/releaf/core/application.rb +17 -0
  204. data/lib/releaf/core/builders_autoload.rb +27 -0
  205. data/lib/releaf/core/component.rb +9 -0
  206. data/lib/releaf/core/configuration.rb +101 -0
  207. data/lib/releaf/core/engine.rb +35 -0
  208. data/lib/releaf/core/exceptions.rb +38 -0
  209. data/lib/releaf/core/route_mapper.rb +59 -0
  210. data/lib/releaf/core/settings_ui_component.rb +7 -0
  211. data/lib/releaf/core/validation_error_codes.rb +36 -0
  212. data/lib/releaf/version.rb +3 -0
  213. data/lib/releaf-core.rb +14 -0
  214. data/lib/tasks/releaf_tasks.rake +4 -0
  215. data/releaf-core.gemspec +35 -0
  216. data/spec/builders/builders/association_reflector_spec.rb +138 -0
  217. data/spec/builders/builders/base_spec.rb +276 -0
  218. data/spec/builders/builders/collection_spec.rb +18 -0
  219. data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
  220. data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
  221. data/spec/builders/builders/edit_builder_spec.rb +215 -0
  222. data/spec/builders/builders/form_builder_spec.rb +562 -0
  223. data/spec/builders/builders/index_builder_spec.rb +345 -0
  224. data/spec/builders/builders/orderer_spec.rb +22 -0
  225. data/spec/builders/builders/page/header_builder_spec.rb +143 -0
  226. data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
  227. data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
  228. data/spec/builders/builders/pagination_builder_spec.rb +330 -0
  229. data/spec/builders/builders/resource_dialog_spec.rb +21 -0
  230. data/spec/builders/builders/resource_view_spec.rb +158 -0
  231. data/spec/builders/builders/show_builder_spec.rb +7 -0
  232. data/spec/builders/builders/table_builder_spec.rb +638 -0
  233. data/spec/builders/builders/template_spec.rb +12 -0
  234. data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
  235. data/spec/builders/builders/toolbox_spec.rb +48 -0
  236. data/spec/builders/builders/view_spec.rb +281 -0
  237. data/spec/builders/builders_spec.rb +134 -0
  238. data/spec/builders/core/settings/form_builder_spec.rb +69 -0
  239. data/spec/builders/core/settings/table_builder_spec.rb +21 -0
  240. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
  241. data/spec/controllers/releaf/base_controller_spec.rb +447 -0
  242. data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
  243. data/spec/features/ajaxbox_spec.rb +111 -0
  244. data/spec/features/authorization_spec.rb +50 -0
  245. data/spec/features/dragonfly_integration_spec.rb +24 -0
  246. data/spec/features/edit_actions_spec.rb +142 -0
  247. data/spec/features/errors_spec.rb +29 -0
  248. data/spec/features/index_actions_spec.rb +85 -0
  249. data/spec/features/index_table_spec.rb +32 -0
  250. data/spec/features/menu_spec.rb +71 -0
  251. data/spec/features/richtext_attachments_spec.rb +64 -0
  252. data/spec/features/richtext_embed_spec.rb +29 -0
  253. data/spec/features/richtext_spec.rb +19 -0
  254. data/spec/features/search_spec.rb +825 -0
  255. data/spec/features/settings_spec.rb +38 -0
  256. data/spec/features/title_spec.rb +13 -0
  257. data/spec/fixtures/common_fields.yml +17 -0
  258. data/spec/fixtures/cs.png +0 -0
  259. data/spec/fixtures/time.formats.xlsx +0 -0
  260. data/spec/fixtures/unicorn.jpg +0 -0
  261. data/spec/helpers/application_helper_spec.rb +75 -0
  262. data/spec/helpers/button_helper_spec.rb +146 -0
  263. data/spec/lib/releaf/core/application_spec.rb +42 -0
  264. data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
  265. data/spec/lib/releaf/core/configuration_spec.rb +230 -0
  266. data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
  267. data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
  268. data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
  269. data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
  270. data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
  271. data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
  272. data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
  273. data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
  274. data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
  275. data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
  276. data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
  277. data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
  278. data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
  279. data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
  280. data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
  281. data/spec/lib/releaf/core/responders_spec.rb +60 -0
  282. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
  283. data/spec/lib/validation_error_codes_spec.rb +56 -0
  284. data/spec/misc/factories_spec.rb +43 -0
  285. data/spec/models/settings_spec.rb +58 -0
  286. data/spec/routing/route_mapper_spec.rb +185 -0
  287. data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
  288. metadata +657 -0
@@ -0,0 +1,345 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::IndexBuilder, type: :class do
4
+ class TranslationsIndexBuilderTestHelper < ActionView::Base
5
+ include Releaf::ApplicationHelper
6
+ delegate :resource_class, :table_options, to: :controller
7
+
8
+ def controller
9
+ @controller ||= begin
10
+ c = Admin::BooksController.new
11
+ c.setup
12
+ c
13
+ end
14
+ end
15
+ end
16
+
17
+ let(:template){ TranslationsIndexBuilderTestHelper.new }
18
+ let(:subject){ described_class.new(template) }
19
+ let(:collection){ Book.page(1).per_page(2) }
20
+
21
+ before do
22
+ allow(subject).to receive(:controller_name).and_return("_controller_name_")
23
+ allow(subject).to receive(:collection).and_return(collection)
24
+ end
25
+
26
+ it "includes Releaf::Builders::View" do
27
+ expect(described_class.ancestors).to include(Releaf::Builders::View)
28
+ end
29
+
30
+ it "includes Releaf::Builders::Collection" do
31
+ expect(described_class.ancestors).to include(Releaf::Builders::Collection)
32
+ end
33
+
34
+ describe "#dialog?" do
35
+ it "returns false" do
36
+ expect(subject.dialog?).to be false
37
+ end
38
+ end
39
+
40
+ describe "#search_block" do
41
+ before do
42
+ allow(subject).to receive(:text_search_block).and_return("aa")
43
+ allow(subject).to receive(:extra_search_block).and_return("bb")
44
+ allow(subject).to receive(:search_form_attributes).and_return(a: "xx")
45
+ end
46
+
47
+ it "returns search from with attributes and text/extra search blocks" do
48
+ expect(subject.search_block).to eq('<form a="xx">aabb</form>')
49
+ end
50
+
51
+ context "when no text blocks available" do
52
+ it "returns nil" do
53
+ allow(subject).to receive(:text_search_block).and_return(nil)
54
+ allow(subject).to receive(:extra_search_block).and_return(nil)
55
+ expect(subject.search_block).to be nil
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "#search_form_attributes" do
61
+ before do
62
+ allow(subject).to receive(:text_search_available?).and_return(true)
63
+ allow(subject).to receive(:extra_search_available?).and_return(true)
64
+ allow(subject.template).to receive(:url_for).with(controller: "_controller_name_", action: "index").and_return("x")
65
+ end
66
+
67
+ it "returns url and css classes for search form" do
68
+ classes = ["search", "has-text-search", "has-extra-search"]
69
+ expect(subject.search_form_attributes).to eq(class: classes, action: "x")
70
+ end
71
+
72
+ context "when text search is not available" do
73
+ it "does not add text search class" do
74
+ allow(subject).to receive(:text_search_available?).and_return(false)
75
+ expect(subject.search_form_attributes[:class]).to_not include("has-text-search")
76
+ end
77
+ end
78
+
79
+ context "when extra search is not available" do
80
+ it "does not add extra search class" do
81
+ allow(subject).to receive(:extra_search_available?).and_return(false)
82
+ expect(subject.search_form_attributes[:class]).to_not include("has-extra-search")
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#header_extras" do
88
+ it "returns search block" do
89
+ allow(subject).to receive(:search_block).and_return("x")
90
+ expect(subject.header_extras).to eq("x")
91
+ end
92
+ end
93
+
94
+ describe "#extra_search_available?" do
95
+ context "when extra search block is present" do
96
+ it "returns true" do
97
+ allow(subject).to receive(:extra_search_block).and_return("x")
98
+ expect(subject.extra_search_available?).to be true
99
+ end
100
+ end
101
+
102
+ context "when extra search block is nil" do
103
+ it "returns false" do
104
+ allow(subject).to receive(:extra_search_block).and_return(nil)
105
+ expect(subject.extra_search_available?).to be false
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "#text_search_available?", focus: true do
111
+ context "when template variable `searchable_fields` is present" do
112
+ it "returns true" do
113
+ allow( template.controller ).to receive(:searchable_fields).and_return([:a])
114
+ expect(subject.text_search_available?).to be true
115
+ end
116
+ end
117
+
118
+ context "when template variable `searchable_fields` is blank" do
119
+ it "returns false" do
120
+ allow( template.controller ).to receive(:searchable_fields).and_return([])
121
+ expect(subject.text_search_available?).to be false
122
+ end
123
+ end
124
+ end
125
+
126
+ describe "#text_search_block" do
127
+ before do
128
+ allow(subject).to receive(:text_search_content).and_return("x")
129
+ end
130
+
131
+ context "when text search is available" do
132
+ it "returns true" do
133
+ allow(subject).to receive(:text_search_available?).and_return(true)
134
+ expect(subject.text_search_block).to eq('<div class="text-search">x</div>')
135
+ end
136
+ end
137
+
138
+ context "when text search is not available" do
139
+ it "returns false" do
140
+ allow(subject).to receive(:text_search_available?).and_return(false)
141
+ expect(subject.text_search_block).to be nil
142
+ end
143
+ end
144
+ end
145
+
146
+ describe "#text_search_content" do
147
+
148
+ it "returns text search field and button" do
149
+ allow(subject).to receive(:t).with('Search').and_return("sss")
150
+ allow(subject).to receive(:params).and_return(search: "xxx")
151
+ allow(subject).to receive(:button)
152
+ .with(nil, "search", type: "submit", title: 'sss')
153
+ .and_return("<search_button />".html_safe)
154
+ expect(subject).to receive(:search_field).with("search").and_call_original
155
+ expect(subject.text_search_content).to match_html(%Q[
156
+ <div class="search-field" data-name="search">
157
+ <input name="search" type="search" class="text" value="xxx" autofocus="autofocus"></input>
158
+ <search_button />
159
+ </div>
160
+ ])
161
+ end
162
+
163
+ end
164
+
165
+ describe "#search_field" do
166
+ it "returns the given block in a search field wrapper" do
167
+ expect(subject.search_field("foo") { '<block_html>'.html_safe }).to match_html(%Q[
168
+ <div class="search-field" data-name="foo">
169
+ <block_html>
170
+ </div>
171
+ ])
172
+ end
173
+ end
174
+
175
+ describe "#extra_search_content" do
176
+ it "returns nil(available for override)" do
177
+ expect(subject.extra_search_content).to be nil
178
+ end
179
+ end
180
+
181
+ describe "#extra_search_button" do
182
+ it "returns extra search button" do
183
+ allow(subject).to receive(:t).with('Search').and_return("sss")
184
+ allow(subject).to receive(:t).with('Filter').and_return("fff")
185
+ allow(subject).to receive(:button)
186
+ .with("fff", "search", type: "submit", title: 'sss')
187
+ .and_return("xx")
188
+ expect(subject.extra_search_button).to eq("xx")
189
+ end
190
+ end
191
+
192
+ describe "#extra_search_block" do
193
+ before do
194
+ allow(subject).to receive(:extra_search_button).and_return("btn")
195
+ allow(subject).to receive(:extra_search_content).and_return("xx")
196
+ end
197
+
198
+ it "returns extra search block" do
199
+ expect(subject.extra_search_block).to eq('<div class="extras">xxbtn</div>')
200
+ end
201
+
202
+ it "caches extra search content" do
203
+ allow(subject).to receive(:extra_search_content).and_return("xx").once
204
+ subject.extra_search_block
205
+ subject.extra_search_block
206
+ end
207
+
208
+ context "when extra search content is not present" do
209
+ it "returns nil" do
210
+ allow(subject).to receive(:extra_search_content).and_return(nil)
211
+ expect(subject.extra_search_block).to be nil
212
+ end
213
+ end
214
+ end
215
+
216
+ describe "#section_header_text" do
217
+ it "returns section header text" do
218
+ allow(subject).to receive(:t).with('All resources').and_return("all")
219
+ expect(subject.section_header_text).to eq("all")
220
+ end
221
+ end
222
+
223
+ describe "#section_header_extras" do
224
+ it "returns true" do
225
+ allow(subject).to receive(:t)
226
+ .with("Resources found", count: 0, default: "%{count} resources found", create_plurals: true)
227
+ .and_return("sss")
228
+ expect(subject.section_header_extras).to eq('<span class="extras totals only-text">sss</span>')
229
+ end
230
+
231
+ context "when collection does not respond to total_entries" do
232
+ it "returns nil" do
233
+ allow(subject).to receive(:collection).and_return(Book.all)
234
+ expect(subject.section_header_extras).to be nil
235
+ end
236
+ end
237
+ end
238
+
239
+ describe "#footer_blocks" do
240
+ before do
241
+ allow(subject).to receive(:footer_primary_block).and_return("a")
242
+ allow(subject).to receive(:pagination_block).and_return("b")
243
+ allow(subject).to receive(:footer_secondary_block).and_return("c")
244
+ allow(subject).to receive(:pagination?).and_return(true)
245
+ end
246
+
247
+ it "returns array with footer primary, pagination and secondary blocks" do
248
+ expect(subject.footer_blocks).to eq(["a", "b", "c"])
249
+ end
250
+
251
+ context "when pagination is not available" do
252
+ it "does not include pagination block within returned array" do
253
+ allow(subject).to receive(:pagination?).and_return(false)
254
+ expect(subject.footer_blocks).to eq(["a", "c"])
255
+ end
256
+ end
257
+ end
258
+
259
+ describe "#footer_primary_tools" do
260
+ before do
261
+ allow(subject).to receive(:resource_creation_button).and_return("a")
262
+ allow(subject).to receive(:feature_available?).with(:create).and_return(true)
263
+ end
264
+
265
+ it "returns array with resource creation button" do
266
+ expect(subject.footer_primary_tools).to eq(["a"])
267
+ end
268
+
269
+ context "when creation feature is not available" do
270
+ it "returns empty array" do
271
+ allow(subject).to receive(:feature_available?).with(:create).and_return(false)
272
+ expect(subject.footer_primary_tools).to eq([])
273
+ end
274
+ end
275
+ end
276
+
277
+ describe "#pagination?" do
278
+ context "when collection responds to `page` method" do
279
+ it "returns true" do
280
+ expect(subject.pagination?).to be true
281
+ end
282
+ end
283
+
284
+ context "when collection does not respond to `page` method" do
285
+ it "returns false" do
286
+ allow(subject).to receive(:collection).and_return(Book.all)
287
+ expect(subject.pagination?).to be true
288
+ end
289
+ end
290
+ end
291
+
292
+ describe "#pagination_builder_class" do
293
+ it "returns a builder class" do
294
+ expect(subject.pagination_builder_class).to be_a Class
295
+ end
296
+ end
297
+
298
+ describe "#pagination_block" do
299
+
300
+ before do
301
+ allow(subject).to receive(:params).and_return(page: "2")
302
+ end
303
+
304
+ it "constructs a new pagination builder and returns its output" do
305
+ builder_args = [ template, { collection: collection, params: { page: "2" } } ]
306
+ builder = Releaf::Builders::PaginationBuilder.new( *builder_args )
307
+
308
+ expect(builder.class).to receive(:new).with( *builder_args ).and_return( builder )
309
+ expect(builder).to receive(:output).and_return("xx")
310
+
311
+ expect(subject.pagination_block).to eq("xx")
312
+ end
313
+
314
+ it "uses pagination builder class" do
315
+ dummy = double
316
+ allow(dummy).to receive(:new).and_return(dummy)
317
+ allow(dummy).to receive(:output).and_return(:ok)
318
+ expect(subject).to receive(:pagination_builder_class).and_return(dummy)
319
+ expect( subject.pagination_block).to eq :ok
320
+ end
321
+
322
+ end
323
+
324
+
325
+
326
+ describe "#resource_creation_button" do
327
+ it "returns resource creation button" do
328
+ allow(subject.template).to receive(:url_for).with(controller: "_controller_name_", action: "new").and_return("x")
329
+ allow(subject).to receive(:t).with('Create new resource').and_return("sss")
330
+ allow(subject).to receive(:button)
331
+ .with("sss", "plus", class: "primary", href: "x")
332
+ .and_return("btn")
333
+ expect(subject.resource_creation_button).to eq("btn")
334
+ end
335
+ end
336
+
337
+ describe "#section_body" do
338
+ it "returns collection table" do
339
+ allow(template).to receive(:releaf_table)
340
+ .with(collection, Book, builder: Admin::Books::TableBuilder, toolbox: true)
341
+ .and_return("xx")
342
+ expect(subject.section_body).to eq('<div class="body">xx</div>')
343
+ end
344
+ end
345
+ end
@@ -0,0 +1,22 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::Orderer, type: :module do
4
+ class OrdererIncluder
5
+ include Releaf::Builders::Orderer
6
+ end
7
+ let(:subject){ OrdererIncluder.new }
8
+
9
+ describe "#orderer" do
10
+ it "initializes new `Releaf::Core::ItemOrderer` instance" do
11
+ expect(subject.orderer([:a, :b])).to be_instance_of Releaf::Core::ItemOrderer
12
+ end
13
+
14
+ it "initializes new `Releaf::Core::ItemOrderer` with given array values" do
15
+ expect(subject.orderer([:a, :b]).list).to eq([:a, :b])
16
+ end
17
+
18
+ it "casts given value to array before passing to `Releaf::Core::ItemOrderer` constructor" do
19
+ expect(subject.orderer(Releaf::Core::ItemOrderer.new(:a, :b)).list).to eq([:a, :b])
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,143 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::Page::HeaderBuilder, type: :class do
4
+ class PageHeaderBuilderTestHelper < ActionView::Base
5
+ include Rails.application.routes.url_helpers
6
+ include FontAwesome::Rails::IconHelper
7
+
8
+ def protect_against_forgery?
9
+ true
10
+ end
11
+
12
+ def form_authenticity_token
13
+ "xxx"
14
+ end
15
+
16
+ def request_forgery_protection_token
17
+ "yyy"
18
+ end
19
+ end
20
+
21
+ subject { described_class.new(template) }
22
+ let(:template){ PageHeaderBuilderTestHelper.new }
23
+
24
+ describe "#output" do
25
+ it "returns safely joined items" do
26
+ allow(subject).to receive(:items).and_return([ '<', ActiveSupport::SafeBuffer.new(">")])
27
+ expect(subject.output).to eq("&lt;>")
28
+ end
29
+ end
30
+
31
+ describe "#items" do
32
+ it "returns array of home link, profile block and logout form content" do
33
+ allow(subject).to receive(:home_link).and_return("a")
34
+ allow(subject).to receive(:profile_block).and_return("b")
35
+ allow(subject).to receive(:sign_out_form).and_return("c")
36
+ expect(subject.items).to eq(["a", "b", "c"])
37
+ end
38
+ end
39
+
40
+ describe "#home_link" do
41
+ it "returns home link with a logo" do
42
+ allow(subject).to receive(:home_url).and_return("www.xxx")
43
+ allow(subject).to receive(:home_text).and_return("Rrr")
44
+ allow(subject).to receive(:home_image_path).and_return("releaf/foo.png")
45
+ content = '<a class="home" href="www.xxx"><img alt="Rrr" src="/images/releaf/foo.png" /></a>'
46
+ expect(subject.home_link).to eq(content)
47
+ end
48
+ end
49
+
50
+ describe "#home_url" do
51
+ it "returns home url" do
52
+ expect(subject.home_url).to eq("/admin")
53
+ end
54
+ end
55
+
56
+ describe "#home_image_path" do
57
+ it "returns image to the logo image asset" do
58
+ expect(subject.home_image_path).to eq("releaf/logo.png")
59
+ end
60
+ end
61
+
62
+ describe "#home_text" do
63
+ it "returns releaf home link text" do
64
+ expect(subject.home_text).to eq("Releaf")
65
+ end
66
+ end
67
+
68
+
69
+ describe "#profile_url" do
70
+ it "returns profile edit url for defined profile controller" do
71
+ expect(subject.profile_url).to eq("/admin/profile")
72
+
73
+ allow(subject).to receive(:profile_controller).and_return("/releaf/home")
74
+ expect{ subject.profile_url }
75
+ .to raise_error(ActionController::UrlGenerationError, 'No route matches {:action=>"edit", :controller=>"releaf/home"}')
76
+ end
77
+ end
78
+
79
+ describe "#profile_settings_url" do
80
+ it "returns profile edit url for defined profile controller" do
81
+ expect(subject.profile_settings_url).to eq("/admin/profile/settings")
82
+
83
+ allow(subject).to receive(:profile_controller).and_return("/releaf/home")
84
+ expect{ subject.profile_settings_url }
85
+ .to raise_error(ActionController::UrlGenerationError, 'No route matches {:action=>"settings", :controller=>"releaf/home"}')
86
+ end
87
+ end
88
+
89
+ describe "#profile_controller" do
90
+ it "returns releaf permissions profile controller" do
91
+ expect(subject.profile_controller).to eq("/releaf/permissions/profile")
92
+ end
93
+ end
94
+
95
+ describe "#profile_block" do
96
+ it "returns profile block with content" do
97
+ allow(subject).to receive(:profile_user_name).and_return("neim")
98
+ allow(subject).to receive(:profile_settings_url).and_return("url_a")
99
+ allow(subject).to receive(:profile_url).and_return("url_b")
100
+ content = '<a class="button profile" href="url_b" data-settings-url="url_a"><span class="name">neim</span></a>'
101
+ expect(subject.profile_block).to eq(content)
102
+ end
103
+ end
104
+
105
+ describe "#user" do
106
+ it "returns permissions manager user" do
107
+ access_control = double(Releaf::Permissions::AccessControl)
108
+ allow(subject).to receive(:access_control).and_return(access_control)
109
+ allow(access_control).to receive(:user).and_return("x")
110
+ expect(subject.user).to eq("x")
111
+ end
112
+ end
113
+
114
+ describe "#profile_user_name" do
115
+ it "returns profile user name" do
116
+ admin = Releaf::Permissions::User.new(name: "a", surname: "b")
117
+ allow(subject).to receive(:user).and_return(admin)
118
+ expect(subject.profile_user_name).to eq("a b")
119
+ end
120
+ end
121
+
122
+ describe "#sign_out_url" do
123
+ it "returns sign out url" do
124
+ expect(subject.sign_out_url).to eq("/admin/sign_out")
125
+ end
126
+ end
127
+
128
+ describe "#sign_out_form" do
129
+ it "returns sign out form" do
130
+ allow(subject).to receive(:sign_out_url).and_return("url_a")
131
+ content = %Q[
132
+ <form class="sign-out" action="url_a" accept-charset="UTF-8" method="post">
133
+ <input name="utf8" type="hidden" value="&#x2713;" />
134
+ <input type="hidden" name="_method" value="delete" />
135
+ <input type="hidden" name="yyy" value="xxx" />
136
+ <button class="button only-icon" type="submit" title="Sign out">
137
+ <i class="fa fa-power-off fa-icon-header"></i>
138
+ </button>
139
+ </form>]
140
+ expect(subject.sign_out_form).to match_html( content )
141
+ end
142
+ end
143
+ end