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,73 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::Page::LayoutBuilder, 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
+ class NewRolesController < Releaf::Permissions::RolesController
22
+ end
23
+
24
+ subject { described_class.new(template) }
25
+ let(:template){ PageHeaderBuilderTestHelper.new }
26
+
27
+ describe "#controller_classes" do
28
+ it "returns array of ignorable ancester classes" do
29
+ allow(subject).to receive(:controller).and_return(NewRolesController.new)
30
+ expect(subject.controller_classes).to eq([Releaf::Permissions::RolesController, NewRolesController])
31
+
32
+ allow(subject).to receive(:controller).and_return(Releaf::Permissions::RolesController.new)
33
+ expect(subject.controller_classes).to eq([Releaf::Permissions::RolesController])
34
+
35
+ allow(subject).to receive(:controller).and_return(Releaf::Permissions::SessionsController.new)
36
+ expect(subject.controller_classes).to eq([Releaf::Permissions::SessionsController])
37
+ end
38
+ end
39
+
40
+ describe "#controller_body_classes" do
41
+ it "returns normalized html classes from controller classes" do
42
+ allow(subject).to receive(:controller_classes).and_return([Releaf::BaseController, Releaf::Permissions::RolesController])
43
+ expect(subject.controller_body_classes).to eq(["controller-releaf-base", "controller-releaf-permissions-roles"])
44
+ end
45
+ end
46
+
47
+ describe "#head_blocks" do
48
+ it "returns array" do
49
+ {
50
+ title: :title_sym,
51
+ meta: :meta_sym,
52
+ favicons: :favicon_sym,
53
+ ms_tile: :ms_tile_sym,
54
+ assets: :assets_sym,
55
+ csrf: :csrf_sym,
56
+ }.each_pair do |method, stub_answer|
57
+ allow(subject).to receive(method).and_return stub_answer
58
+ end
59
+
60
+ expect(subject.head_blocks).to match_array(
61
+ [
62
+ :title_sym,
63
+ :meta_sym,
64
+ :favicon_sym,
65
+ :ms_tile_sym,
66
+ :assets_sym,
67
+ :csrf_sym,
68
+ ]
69
+ )
70
+ end
71
+ end
72
+ end
73
+
@@ -0,0 +1,160 @@
1
+ require "spec_helper"
2
+
3
+ describe Releaf::Builders::Page::MenuBuilder, type: :class do
4
+ class MenuBuilderTestHelper < ActionView::Base
5
+ include FontAwesome::Rails::IconHelper
6
+ end
7
+
8
+ let(:controller){ Releaf::BaseController.new }
9
+ let(:template){ MenuBuilderTestHelper.new }
10
+ subject { described_class.new(template) }
11
+
12
+ before do
13
+ allow(template).to receive(:controller).and_return(controller)
14
+ end
15
+
16
+ it "includes Releaf::Builders::Base" do
17
+ expect(described_class.ancestors).to include(Releaf::Builders::Base)
18
+ end
19
+
20
+ it "includes Releaf::Builders::Template" do
21
+ expect(described_class.ancestors).to include(Releaf::Builders::Template)
22
+ end
23
+
24
+ describe "#output" do
25
+ pending
26
+ end
27
+
28
+ describe "#menu_level" do
29
+ pending
30
+ end
31
+
32
+ describe "#menu_item" do
33
+ pending
34
+ end
35
+
36
+ describe "#collapsed_item?" do
37
+ pending
38
+ end
39
+
40
+ describe "#item_attributes" do
41
+ pending
42
+ end
43
+
44
+ describe "#item_name_content" do
45
+ let(:item) { { name: :item_name } }
46
+
47
+ it "returns abbreviation and full name elements" do
48
+ allow(subject).to receive(:t).with( :item_name, scope: "admin.controllers" ).and_return('Item full name')
49
+ allow(subject).to receive(:item_name_abbreviation).with('Item full name').and_return('Item abbreviation')
50
+ expect( subject.item_name_content( item ) ).to eq('<abbr title="Item full name">Item abbreviation</abbr><span class="name">Item full name</span>')
51
+ end
52
+
53
+ end
54
+
55
+ describe "#item_name_abbreviation" do
56
+
57
+ it "returns first two letters of given text string" do
58
+ expect( subject.item_name_abbreviation( "Foo bar" )).to eq("Fo")
59
+ end
60
+
61
+ context "when the first two letters are lowercase" do
62
+ it "capitalizes the first letter" do
63
+ expect( subject.item_name_abbreviation( "foo bar" )).to eq("Fo")
64
+ end
65
+ end
66
+
67
+ context "when the first two letters are uppercase" do
68
+ it "makes the second letter lowercase" do
69
+ expect( subject.item_name_abbreviation( "FOO BAR" )).to eq("Fo")
70
+ end
71
+ end
72
+
73
+ context "when the string contains slashes" do
74
+
75
+ it "uses the first word after the last slash" do
76
+ expect( subject.item_name_abbreviation( "Releaf/core/settings" )).to eq("Se")
77
+ end
78
+
79
+ it "ignores slashes surrounded by spaces" do
80
+ expect( subject.item_name_abbreviation( "Inputs / Outputs" )).to eq("In")
81
+ end
82
+
83
+ it "ignores trailing slashes" do
84
+ expect( subject.item_name_abbreviation( "Releaf/core/settings/" )).to eq("Se")
85
+ end
86
+
87
+ context "when string consists of a single slash" do
88
+ it "returns an empty string" do
89
+ expect( subject.item_name_abbreviation( "/" )).to eq("")
90
+ end
91
+ end
92
+ end
93
+
94
+ it "works with non-latin characters" do
95
+ expect( subject.item_name_abbreviation( "žņ" )).to eq("Žņ")
96
+ end
97
+
98
+ context "when given an empty string value" do
99
+ it "returns an empty string" do
100
+ expect( subject.item_name_abbreviation( "" )).to eq("")
101
+ end
102
+ end
103
+
104
+ context "when given nil" do
105
+ it "returns an empty string" do
106
+ expect( subject.item_name_abbreviation( nil )).to eq("")
107
+ end
108
+ end
109
+ end
110
+
111
+ describe "#item_collapser" do
112
+
113
+ it "returns a collapser span with a button and collapser icon" do
114
+ allow(subject).to receive(:item_collapser_icon).with(:foo).and_return(subject.icon('dummy'))
115
+ expect(subject.item_collapser(:foo)).to eq '<span class="collapser"><button type="button"><i class="fa fa-dummy"></i></button></span>'
116
+ end
117
+
118
+ end
119
+
120
+ describe "#item_collapser_icon" do
121
+
122
+ before do
123
+ allow(subject).to receive(:layout_settings).with('releaf.side.compact').and_return(false)
124
+ end
125
+
126
+ let(:item) { {} }
127
+
128
+ context "when side is compacted in layout settings" do
129
+ it "returns a beak pointing right" do
130
+ allow(subject).to receive(:layout_settings).with('releaf.side.compact').and_return(true)
131
+ allow(subject).to receive(:icon).with('chevron-right').and_return("icon ok")
132
+ expect(subject.item_collapser_icon(item)).to eq "icon ok"
133
+ end
134
+ end
135
+
136
+ context "when side is not compacted in layout settings" do
137
+ context "when the given item is collapsed" do
138
+ it "returns a beak pointing down" do
139
+ allow(subject).to receive(:collapsed_item?).with(item).and_return(true)
140
+ allow(subject).to receive(:icon).with('chevron-down').and_return("icon ok")
141
+ expect(subject.item_collapser_icon(item)).to eq "icon ok"
142
+ end
143
+ end
144
+ context "when the given item is expanded" do
145
+ it "returns a beak pointing up" do
146
+ allow(subject).to receive(:collapsed_item?).with(item).and_return(false)
147
+ allow(subject).to receive(:icon).with('chevron-up').and_return("icon ok")
148
+ expect(subject.item_collapser_icon(item)).to eq "icon ok"
149
+ end
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+
156
+ describe "#compacter" do
157
+ pending
158
+ end
159
+
160
+ end
@@ -0,0 +1,330 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Builders::PaginationBuilder, type: :class do
4
+
5
+ class PaginationTestView < ActionView::Base
6
+ include Releaf::ApplicationHelper
7
+ include Releaf::ButtonHelper
8
+ include FontAwesome::Rails::IconHelper
9
+ end
10
+
11
+ let(:template){ PaginationTestView.new }
12
+
13
+ let(:items_per_page) { 3 }
14
+ let(:current_page_number) { 1 }
15
+ let(:collection){ Book.page(current_page_number).per_page(items_per_page) }
16
+ let(:params){ { search: "xxx"} }
17
+ let(:subject){ described_class.new(template, collection: collection, params: params ) }
18
+
19
+ before do |example|
20
+ unless example.metadata[:stub_url_for] === false
21
+ allow(template).to receive(:url_for) { |params| "http://example.com/?#{params.to_query}" }
22
+ end
23
+ end
24
+
25
+ it "provides accessor for template given in constructor" do
26
+ subject = described_class.new( :foo )
27
+ expect( subject.template ).to eq :foo
28
+ end
29
+
30
+ it "provides accessor for collection given in constructor" do
31
+ subject = described_class.new( nil, collection: :foo )
32
+ expect( subject.collection ).to eq :foo
33
+ end
34
+
35
+ it "provides accessor for params given in constructor" do
36
+ subject = described_class.new( nil, params: :foo )
37
+ expect( subject.params ).to eq :foo
38
+ end
39
+
40
+
41
+ describe "#output" do
42
+
43
+ context "when collection has no entries" do
44
+ it "returns nil" do
45
+ expect(subject.total_entries).to eq 0
46
+ expect(subject).to_not receive(:pagination_block)
47
+ expect(subject.output).to be nil
48
+ end
49
+ end
50
+
51
+ context "when collection has less entries than allowed on one page" do
52
+ before do
53
+ FactoryGirl.create( :book )
54
+ end
55
+
56
+ it "returns nil" do
57
+ expect(subject.total_entries).to eq 1
58
+ expect(subject).to_not receive(:pagination_block)
59
+ expect(subject.output).to be nil
60
+ end
61
+ end
62
+
63
+ context "when collection has exactly the number of entries that fits on one page" do
64
+ before do
65
+ items_per_page.times do
66
+ FactoryGirl.create( :book )
67
+ end
68
+ end
69
+
70
+ it "returns nil" do
71
+ expect(subject.total_entries).to eq 3
72
+ expect(subject).to_not receive(:pagination_block)
73
+ expect(subject.output).to be nil
74
+ end
75
+ end
76
+
77
+
78
+ context "when collection has more than one page" do
79
+ before do
80
+ (items_per_page + 1).times do
81
+ FactoryGirl.create( :book )
82
+ end
83
+ end
84
+
85
+ it "returns #pagination_block" do
86
+ expect(subject.total_entries).to eq 4
87
+ expect(subject).to receive(:pagination_block).and_return('ok')
88
+ expect(subject.output).to eq "ok"
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ describe "#pagination_block" do
95
+
96
+ let(:current_page_number) { 2 }
97
+
98
+ it "returns pagination parts wrapped in a container" do
99
+ allow(subject).to receive(:pagination_parts).and_return [ "<strong>weak</strong>".html_safe, "<escape_me>" ]
100
+ expect(subject.pagination_block).to match_html %Q[
101
+ <div class="pagination">
102
+ <strong>weak</strong>
103
+ &lt;escape_me&gt;
104
+ </div>
105
+ ]
106
+ end
107
+
108
+ it "returns pagination buttons and select with options" do
109
+
110
+ 14.times do
111
+ FactoryGirl.create :book
112
+ end
113
+
114
+ expect(subject.pagination_block).to match_html %Q[
115
+ <div class="pagination">
116
+
117
+ <a class="button only-icon secondary previous" title="Previous page" rel="prev" href="http://example.com/?page=1&amp;search=xxx">
118
+ <i class="fa fa-chevron-left"></i>
119
+ </a>
120
+
121
+ <select name="page">
122
+ <option value="1">1-3</option>
123
+ <option value="2" selected="selected">4-6</option>
124
+ <option value="3">7-9</option>
125
+ <option value="4">10-12</option>
126
+ <option value="5">13-14</option>
127
+ </select>
128
+
129
+ <a class="button only-icon secondary next" title="Next page" rel="next" href="http://example.com/?page=3&amp;search=xxx">
130
+ <i class="fa fa-chevron-right"></i>
131
+ </a>
132
+
133
+ </div>
134
+ ]
135
+
136
+ end
137
+
138
+ end
139
+
140
+
141
+ describe "#pagination_parts" do
142
+ it "returns an array with previous page button, page select and next page button" do
143
+ allow(subject).to receive(:previous_page_button).and_return("previous")
144
+ allow(subject).to receive(:next_page_button).and_return("next")
145
+ allow(subject).to receive(:pagination_select).and_return("select")
146
+ expect(subject.pagination_parts).to eq [ "previous", "select", "next" ]
147
+ end
148
+ end
149
+
150
+
151
+ def previous_page_button
152
+ page_button( -1, 'previous', 'chevron-left' )
153
+ end
154
+
155
+ def next_page_button
156
+ page_button( 1, 'next', 'chevron-right' )
157
+ end
158
+
159
+ describe "#previous_page_button" do
160
+ it "returns #page_button with -1 offset and appropriate class and icon names" do
161
+ expect(subject).to receive(:page_button).with( -1, 'previous', 'chevron-left').and_return('ok')
162
+ expect(subject.previous_page_button).to eq 'ok'
163
+ end
164
+ end
165
+
166
+ describe "#next_page_button" do
167
+ it "returns #page_button with +1 offset and appropriate class and icon names" do
168
+ expect(subject).to receive(:page_button).with( 1, 'next', 'chevron-right').and_return('ok')
169
+ expect(subject.next_page_button).to eq 'ok'
170
+ end
171
+ end
172
+
173
+ describe "#page_button" do
174
+
175
+ before do
176
+ allow(subject).to receive(:t).with('Foo page', scope: 'pagination').and_return('Foo page label')
177
+ allow(subject).to receive(:t).with('Bar page', scope: 'pagination').and_return('Bar page label')
178
+
179
+ end
180
+
181
+ context "when calculated relative page number is valid" do
182
+
183
+ it "returns a button with correct class and rel attributes and a href pointing to the offset page" do
184
+
185
+ 5.times do
186
+ FactoryGirl.create(:book)
187
+ end
188
+
189
+ expect(subject.page_button( 1, 'foo', 'foo-icon' )).to match_html %Q[
190
+ <a class="button only-icon secondary foo" title="Foo page label" rel="next" href="http://example.com/?page=2&amp;search=xxx">
191
+ <i class="fa fa-foo-icon"></i>
192
+ </a>
193
+ ]
194
+ end
195
+
196
+ end
197
+
198
+ context "when the calculated relative page number is invalid" do
199
+
200
+ it "returns a disabled button with correct class" do
201
+ expect(subject.page_button( -1, 'bar', 'bar-icon' )).to match_html %Q[
202
+ <button class="button only-icon secondary bar" title="Bar page label" type="button" autocomplete="off" disabled="disabled">
203
+ <i class="fa fa-bar-icon"></i>
204
+ </button>
205
+ ]
206
+ end
207
+
208
+ end
209
+
210
+ end
211
+
212
+
213
+ describe "#page_numbers" do
214
+
215
+ it "returns an array of integers from 1 to total number of pages" do
216
+ allow(collection).to receive(:total_pages).and_return(12)
217
+ expect(subject.page_numbers).to eq [1,2,3,4,5,6,7,8,9,10,11,12]
218
+ end
219
+
220
+ end
221
+
222
+
223
+ describe "#relative_page_number" do
224
+
225
+ before do
226
+ allow(collection).to receive(:current_page).and_return(3)
227
+ allow(collection).to receive(:total_pages).and_return(12)
228
+ end
229
+
230
+ context "when adding the offset to current page number" do
231
+ context "results in a valid page number" do
232
+ it "returns the page number" do
233
+ expect(subject.relative_page_number(-1)).to eq 2
234
+ end
235
+ end
236
+
237
+ context "results in a page number larger than the total number of pages" do
238
+ it "returns nil" do
239
+ expect(subject.relative_page_number(10)).to be nil
240
+ end
241
+ end
242
+
243
+ context "results in a page number less than one" do
244
+ it "returns nil" do
245
+ expect(subject.relative_page_number(-3)).to be nil
246
+ end
247
+ end
248
+ end
249
+
250
+ end
251
+
252
+
253
+ describe "#relative_page_relationship" do
254
+
255
+ context "when given -1" do
256
+ it "returns :prev" do
257
+ expect(subject.relative_page_relationship(-1)).to eq :prev
258
+ end
259
+ end
260
+
261
+ context "when given 1" do
262
+ it "returns :next" do
263
+ expect(subject.relative_page_relationship(1)).to eq :next
264
+ end
265
+ end
266
+
267
+ [0, -2, 3, nil, true, false].each do |arg|
268
+ context "when given #{arg.nil? ? 'nil' : arg.to_s}" do
269
+ it "returns nil" do
270
+ expect(subject.relative_page_relationship(arg)).to be nil
271
+ end
272
+ end
273
+ end
274
+
275
+ end
276
+
277
+ describe "#page_url", stub_url_for: false do
278
+
279
+ it "calls url_for on template with added page number param" do
280
+ expect(template).to receive(:url_for).with( search: "xxx", page: 3).and_return("ok")
281
+ expect(subject.page_url(3)).to eq "ok"
282
+ end
283
+
284
+ end
285
+
286
+ describe "#pagination_select" do
287
+
288
+ it "returns select tag with pagination options" do
289
+ allow(subject).to receive(:pagination_options).and_return [ "<option>1-2</option>".html_safe, "<escape_me>" ]
290
+ expect(subject.pagination_select).to match_html %Q[
291
+ <select name="page">
292
+ <option>1-2</option>
293
+ &lt;escape_me&gt;
294
+ </select>
295
+ ]
296
+ end
297
+
298
+ end
299
+
300
+ describe "#pagination_options" do
301
+
302
+ let(:current_page_number) { 2 }
303
+
304
+ it "returns an array with option tags for page select" do
305
+ allow(subject).to receive(:page_numbers).and_return( [ 1, 2, 3 ] )
306
+ allow(subject).to receive(:page_label) { |page_number| "page label #{page_number}" }
307
+ expect(subject.pagination_options).to eq [
308
+ '<option value="1">page label 1</option>',
309
+ '<option value="2" selected="selected">page label 2</option>',
310
+ '<option value="3">page label 3</option>'
311
+ ]
312
+ end
313
+
314
+ end
315
+
316
+
317
+ describe "#page_label" do
318
+
319
+ before do
320
+ 14.times { FactoryGirl.create :book }
321
+ end
322
+
323
+ it "returns a string with the numbers of first and last items in page" do
324
+ expect(subject.page_label(1)).to eq "1-3"
325
+ expect(subject.page_label(5)).to eq "13-14"
326
+ end
327
+ end
328
+
329
+
330
+ end