releaf-core 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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