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,38 @@
1
+ require 'rails_helper'
2
+ feature "Settings", js: true do
3
+ scenario "edit settings" do
4
+ values = [
5
+ {key: "content.updated_at", default: Time.parse("2014-07-01 14:33:59"), description: "Content update time", type: :time},
6
+ {key: "content.updated", default: true, description: "Content is updated?", type: :boolean},
7
+ {key: "content.rating", default: 5.65, type: :decimal},
8
+ {key: "content.title", default: "some"}
9
+ ]
10
+ Releaf::Settings.destroy_all
11
+ Releaf::Settings.register(values)
12
+ auth_as_user
13
+
14
+ visit releaf_core_settings_path
15
+ expect(page).to have_number_of_resources(4)
16
+
17
+ search "content.updated"
18
+ expect(page).to have_number_of_resources(2)
19
+
20
+ click_link "content.updated_at"
21
+ update_resource do
22
+ fill_in "Content update time", with: '2014-04-01 12:33:59'
23
+ end
24
+ click_link "Back to list"
25
+ expect(page).to have_content("2014-04-01 12:33:59")
26
+ expect(Releaf::Settings["content.updated_at"]).to eq(Time.parse("2014-04-01 12:33:59"))
27
+
28
+ click_link "content.updated"
29
+ expect(page).to have_field("Content is updated?")
30
+ expect(page).to have_css(".field input[type='checkbox'][checked='checked']")
31
+
32
+ visit releaf_core_settings_path
33
+
34
+ click_link "content.rating"
35
+ expect(page).to have_field("Value")
36
+ expect(page).to have_css(".field input[type='number'][value='5.65']")
37
+ end
38
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails_helper'
2
+ feature "Controller title" do
3
+ scenario "shows only application title" do
4
+ visit releaf_root_path
5
+ expect(page.title).to eq("Dummy")
6
+ end
7
+
8
+ scenario "shows only controller and application title" do
9
+ auth_as_user
10
+ visit releaf_permissions_user_profile_path
11
+ expect(page.title).to eq("Releaf/permissions/profile - Dummy")
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ -
2
+ field_name: 'meta_description'
3
+ field_type: 'boolean'
4
+ apply_to: '*'
5
+ default: 'common stuff'
6
+ deny_for: 'Text'
7
+
8
+ -
9
+ field_name: 'meta_copyright'
10
+ field_type: 'text'
11
+ apply_to: ['Text', 'ContactsController']
12
+ levels: [1]
13
+
14
+ -
15
+ field_name: 'other_attribute'
16
+ field_type: 'text'
17
+ apply_to: 'ContactsController'
Binary file
Binary file
Binary file
@@ -0,0 +1,75 @@
1
+ require 'rails_helper'
2
+
3
+ describe Releaf::ApplicationHelper do
4
+ describe "#releaf_table" do
5
+ it "returns table builder output for collection and resource class with given options" do
6
+ builder = Releaf::Permissions::Users::TableBuilder
7
+ collection = "collection"
8
+
9
+ allow(builder).to receive(:new).with(collection, TextPage, subject, toolbox: false).and_call_original
10
+ allow_any_instance_of(builder).to receive(:output).and_return("table")
11
+
12
+ expect(releaf_table(collection, TextPage, builder: builder, toolbox: false)).to eq("table")
13
+ end
14
+ end
15
+
16
+ describe "#merge_attributes" do
17
+ it "makes deep merge second over first hash" do
18
+ expect(helper.merge_attributes({a: {b: "c"}, d: "e"}, {a: {b: "č"}, f: "x"})).to eq(a: {b: "č"}, d: "e", f: "x")
19
+ end
20
+
21
+ it "merges class values from both hashes" do
22
+ expect(helper.merge_attributes({class: ["a", "b"]}, {})[:class]).to eq(["a", "b"])
23
+ expect(helper.merge_attributes({}, {class: "d c"})[:class]).to eq(["d c"])
24
+ expect(helper.merge_attributes({class: ["a", "b"]}, {class: "d c"})[:class]).to eq(["a", "b", "d c"])
25
+ end
26
+
27
+ it "removes empty class values on merging" do
28
+ expect(helper.merge_attributes({class: ["a", nil, "b"]}, {class: ["", "c"]})[:class]).to eq(["a", "b", "c"])
29
+ end
30
+ end
31
+
32
+ describe "#i18n_options_for_select" do
33
+ Color = Struct.new(:id, :to_s)
34
+ let(:helper) do
35
+ helper = instance_double(Releaf::BaseController)
36
+ helper.extend Releaf::ApplicationHelper
37
+ helper.extend ActionView::Helpers
38
+
39
+ helper
40
+ end
41
+
42
+ before do
43
+
44
+ translation = FactoryGirl.create(:translation, :key => "admin.xx.colors-red")
45
+ FactoryGirl.create(:translation_data, :lang => "en", :localization => "Color red", :translation => translation)
46
+ I18n.backend.reload_cache
47
+
48
+ allow(helper).to receive(:controller_scope_name).and_return("admin.xx")
49
+ end
50
+
51
+ context "when array of string" do
52
+ it "returns translated options" do
53
+ input = ["red", "green", "blue"]
54
+ output = ['<option value="red">Color red</option>', '<option selected="selected" value="green">green</option>', '<option value="blue">blue</option>'].join("\n")
55
+ expect(helper.i18n_options_for_select(input, "green", "colors")).to eq(output)
56
+ end
57
+ end
58
+
59
+ context "when hash" do
60
+ it "returns translated options" do
61
+ input = {"red" => "r", "green" => "g", "blue" => "b"}
62
+ output = ['<option value="r">Color red</option>', '<option selected="selected" value="g">green</option>', '<option value="b">blue</option>'].join("\n")
63
+ expect(helper.i18n_options_for_select(input, "g", "colors")).to eq(output)
64
+ end
65
+ end
66
+
67
+ context "when array of string for another translation scope" do
68
+ it "returns translated options" do
69
+ input = ["red", "green", "blue"]
70
+ output = ['<option value="red">red</option>', '<option selected="selected" value="green">green</option>', '<option value="blue">blue</option>'].join("\n")
71
+ expect(helper.i18n_options_for_select(input, "green", "colors", {:scope => "admin.products"})).to eq(output)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,146 @@
1
+ require 'rails_helper'
2
+
3
+ describe Releaf::ButtonHelper do
4
+
5
+ describe "#releaf_button" do
6
+
7
+ it "returns an HTML button element with title, icon, text and optional extra attributes" do
8
+ output = '<button class="button with-icon danger secondary" title="escape&gt;&lt;this" type="button" autocomplete="off" data-x="escape&lt;this&gt;too"><i class="fa fa-plus"></i>escape&gt;&lt;this</button>'
9
+ expect(helper.releaf_button("escape><this", "plus", class: [ :danger, "secondary" ], 'data-x' => 'escape<this>too' )).to eq(output)
10
+ end
11
+
12
+ it "uses #releaf_button_attributes and #releaf_button_content to collect button attributes and content" do
13
+ processed_attributes = { attr: :value, data: { attrx: "valuex" } }
14
+
15
+ expect(helper).to receive(:releaf_button_attributes).with("foo", "bar", {} ).and_return(processed_attributes)
16
+ expect(helper).to receive(:releaf_button_content).with("foo", "bar", processed_attributes).and_return("button content")
17
+
18
+ expect(helper.releaf_button("foo", "bar")).to eq('<button attr="value" data-attrx="valuex">button content</button>')
19
+ end
20
+
21
+ context "when href is given in attributes" do
22
+
23
+ it "returns a link element instead of a button" do
24
+ html = '<a class="button with-icon" title="x" href="http://example.com/?a&amp;b"><i class="fa fa-plus"></i>x</a>'
25
+ expect(helper.releaf_button("x", "plus", href: "http://example.com/?a&b")).to eq(html)
26
+ end
27
+
28
+ it "returns a link element even if the given href is blank" do
29
+ html = '<a class="button with-icon" title="x"><i class="fa fa-plus"></i>x</a>'
30
+ expect(helper.releaf_button("x", "plus", href: nil)).to eq(html)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ describe "#releaf_button_attributes" do
38
+
39
+ it "returns a hash of attributes" do
40
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar )).to be_a Hash
41
+ end
42
+
43
+ it "adds button class" do
44
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar )[:class]).to include( "button" )
45
+ end
46
+
47
+ it "sets title attribute to given text" do
48
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar )).to include( title: :text_foo )
49
+ end
50
+
51
+ context "when href attribute given" do
52
+ it "does not set type attribute" do
53
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar, href: :baz )).to_not include( :type )
54
+ end
55
+ end
56
+
57
+ context "when href attribute not given" do
58
+ it "sets type attribute to button" do
59
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar )).to include( type: :button )
60
+ end
61
+ end
62
+
63
+ context "when icon given" do
64
+
65
+ context "when text also given" do
66
+ it "adds with-icon class" do
67
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar )[:class]).to include( "with-icon" )
68
+ end
69
+ end
70
+
71
+ context "when text not given" do
72
+ it "adds only-icon class" do
73
+ expect(helper.releaf_button_attributes( nil, :icon_bar )[:class]).to include( "only-icon" )
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ context "when extra attributes given" do
80
+
81
+ it "includes given custom attributes with the default ones" do
82
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar, data: { x: "y" })).to include( class: ["button", "with-icon"], data: { x: "y" } )
83
+ end
84
+
85
+ it "overwrites default attributes if needed" do
86
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar, type: :submit, title: "custom")).to include( type: :submit, title: "custom" )
87
+ end
88
+
89
+ it "combines given class names with the deault ones" do
90
+ expect(helper.releaf_button_attributes( :text_foo, :icon_bar, class: "danger") ).to include( class: ["button", "with-icon", "danger"] )
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+
97
+
98
+ describe "#releaf_button_content" do
99
+
100
+ let(:icon_html) { '<i class="fa fa-icon_bar"></i>' }
101
+
102
+ it "returns an html-safe buffer" do
103
+ expect(helper.releaf_button_content( :text_foo, :icon_bar )).to be_a ActiveSupport::SafeBuffer
104
+ end
105
+
106
+ context "when text and icon given" do
107
+ it "returns icon HTML followed by given text" do
108
+ expect(helper.releaf_button_content( "escape<this>text", :icon_bar )).to eq(icon_html + 'escape&lt;this&gt;text')
109
+ end
110
+ end
111
+
112
+ context "when only text given" do
113
+ it "returns given text" do
114
+ expect(helper.releaf_button_content( "escape<this>text", nil )).to eq('escape&lt;this&gt;text')
115
+ end
116
+ end
117
+
118
+ context "when only icon given" do
119
+
120
+ context "when title attribute is present" do
121
+ it "returns icon HTML" do
122
+ expect(helper.releaf_button_content( nil, :icon_bar, title: "foo" )).to eq(icon_html)
123
+ end
124
+ end
125
+
126
+ context "when title attribute is not present" do
127
+
128
+ it "raises an ArgumentError" do
129
+ expect{ helper.releaf_button_content(nil, :icon_bar, title: "") }.to raise_error(ArgumentError, "Title is required for icon-only buttons")
130
+ end
131
+
132
+ end
133
+
134
+ end
135
+
136
+
137
+ context "when both text and icon are blank" do
138
+ it "raises an ArgumentError" do
139
+ expect{ helper.releaf_button_content(nil, nil ) }.to raise_error(ArgumentError, "Either text or icon is required for buttons")
140
+ expect{ helper.releaf_button_content("", "" ) }.to raise_error(ArgumentError, "Either text or icon is required for buttons")
141
+ end
142
+ end
143
+
144
+ end
145
+
146
+ end
@@ -0,0 +1,42 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::Application do
4
+ describe "#configure" do
5
+ it "assigns new `Releaf::Core::Configuration` instance, evaluate block and call instance configuration" do
6
+ configuration = Releaf::Core::Configuration.new
7
+ allow(Releaf::Core::Configuration).to receive(:new).and_return(configuration)
8
+
9
+ expect(subject).to receive(:config=).with(configuration).and_call_original.ordered
10
+ expect(configuration).to receive(:menu=).with("x").ordered
11
+ expect(configuration).to receive(:configure)
12
+ subject.configure{ config.menu = "x" }
13
+ end
14
+ end
15
+
16
+ describe "#render_layout" do
17
+ before do
18
+ class DummyBuilder
19
+ def initialize(x)
20
+ end
21
+
22
+ def output(&block)
23
+ yield
24
+ end
25
+ end
26
+
27
+ subject.config = Releaf::Core::Configuration.new
28
+ allow(subject.config).to receive(:layout_builder_class_name).and_return("DummyBuilder")
29
+ builder = DummyBuilder.new("xx")
30
+ allow(DummyBuilder).to receive(:new).with("tmpl").and_return(builder)
31
+ end
32
+
33
+ it "returns layout builder rendered layout" do
34
+ expect(subject.render_layout("tmpl"){ "pp" }).to eq("pp")
35
+ end
36
+
37
+ it "returns html safe content" do
38
+ expect(subject.render_layout("tmpl"){ "pp" }.html_safe?).to be true
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,113 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::AssetsResolver do
4
+ describe ".base_assets" do
5
+ it "returns array with `releaf/application`" do
6
+ expect(described_class.base_assets).to eq(["releaf/application"])
7
+ end
8
+ end
9
+
10
+ describe ".controller_assets" do
11
+ before do
12
+ allow(described_class).to receive(:base_assets).and_return(["a", "b"])
13
+ end
14
+
15
+ it "returns array with controller specific asset alognside base assets" do
16
+ allow(described_class).to receive(:assets).and_return(
17
+ "releaf/i18n_database/translations" => {
18
+ javascripts: ["c"],
19
+ stylesheets: ["d", "e"],
20
+ }
21
+ )
22
+ expect(described_class.controller_assets("releaf/i18n_database/translations", :javascripts))
23
+ .to eq(["a", "b", "c"])
24
+ expect(described_class.controller_assets("releaf/i18n_database/translations", :stylesheets))
25
+ .to eq(["a", "b", "d", "e"])
26
+ end
27
+
28
+ context "when no controller specific assets exists" do
29
+ it "returns only base assets" do
30
+ allow(described_class).to receive(:assets).and_return({})
31
+ expect(described_class.controller_assets("releaf/i18n_database/translations", :stylesheets))
32
+ .to eq(["a", "b"])
33
+ end
34
+ end
35
+ end
36
+
37
+ describe ".compiled_assets" do
38
+ it "returns array with controller scoped stylesheets and javascripts" do
39
+ allow(Rails.application.assets_manifest).to receive(:files).and_return(
40
+ "releaf/controllers/releaf/content/nodes-72ac849dd467fe827933f15c45ea77a2b7beac55379147f3be4a21779787f484.js"=>{"logical_path"=>"releaf/controllers/releaf/content/nodes.js", "mtime"=>"2015-12-01T13:55:41+02:00", "size"=>1530, "digest"=>"72ac849dd467fe827933f15c45ea77a2b7beac55379147f3be4a21779787f484", "integrity"=>"sha256-cqyEndRn/oJ5M/FcRep3ore+rFU3kUfzvkohd5eH9IQ="},
41
+ "releaf/controllers/releaf/content/nodes-2ac6b38702a01d9e0918f058f923b39c8320cdfa61f41c7494752b648a45e746.css"=>{"logical_path"=>"releaf/controllers/releaf/content/nodes.css", "mtime"=>"2016-01-18T13:36:15+02:00", "size"=>5919, "digest"=>"2ac6b38702a01d9e0918f058f923b39c8320cdfa61f41c7494752b648a45e746", "integrity"=>"sha256-KsazhwKgHZ4JGPBY+SOznIMgzfph9Bx0lHUrZIpF50Y="},
42
+ "releaf/controllers/releaf/permissions/sessions-9eb2f3275ea7578a6a95ca413d318a9984ef93c0d6645f11cf77fe82a2639cf0.css"=>{"logical_path"=>"releaf/controllers/releaf/permissions/sessions.css", "mtime"=>"2016-01-18T13:36:15+02:00", "size"=>2205, "digest"=>"9eb2f3275ea7578a6a95ca413d318a9984ef93c0d6645f11cf77fe82a2639cf0", "integrity"=>"sha256-nrLzJ16nV4pqlcpBPTGKmYTvk8DWZF8Rz3f+gqJjnPA="}
43
+ )
44
+
45
+ list = {
46
+ "releaf/content/nodes"=>{:stylesheets=>["releaf/controllers/releaf/content/nodes.css"],
47
+ :javascripts=>["releaf/controllers/releaf/content/nodes.js"]},
48
+ "releaf/permissions/sessions" => {:stylesheets=>["releaf/controllers/releaf/permissions/sessions.css"], :javascripts=>[]}
49
+ }
50
+ expect(described_class.compiled_assets).to eq(list)
51
+ end
52
+ end
53
+
54
+ describe ".noncompiled_assets" do
55
+ it "returns array with controller scoped stylesheets and javascripts" do
56
+ list = {
57
+ "releaf/content/nodes"=>{:stylesheets=>["releaf/controllers/releaf/content/nodes"],
58
+ :javascripts=>["releaf/controllers/releaf/content/nodes"]},
59
+ "releaf/i18n_database/translations"=>{:stylesheets=>["releaf/controllers/releaf/i18n_database/translations"],
60
+ :javascripts=>["releaf/controllers/releaf/i18n_database/translations"]},
61
+ "releaf/permissions/sessions" => {:stylesheets=>["releaf/controllers/releaf/permissions/sessions"], :javascripts=>[]}
62
+ }
63
+ expect(described_class.noncompiled_assets).to eq(list)
64
+ end
65
+ end
66
+
67
+ describe ".compiled_assets?" do
68
+ context "when `Rails.application.assets` is not nil" do
69
+ it "returns true" do
70
+ allow(Rails.application).to receive(:assets).and_return(nil)
71
+ expect(described_class.compiled_assets?).to be true
72
+ end
73
+ end
74
+
75
+ context "when `Rails.application.assets` is nil" do
76
+ it "returns false" do
77
+ allow(Rails.application).to receive(:assets).and_return("x")
78
+ expect(described_class.compiled_assets?).to be false
79
+ end
80
+ end
81
+ end
82
+
83
+ describe ".assets" do
84
+ before do
85
+ described_class.class_variable_set(:@@compiled_assets, nil)
86
+ allow(described_class).to receive(:compiled_assets).and_return("a")
87
+ allow(described_class).to receive(:noncompiled_assets).and_return("b")
88
+ end
89
+
90
+ context "when compiled assets is not available" do
91
+ it "returns non compiled assets" do
92
+ allow(described_class).to receive(:compiled_assets?).and_return(false)
93
+ expect(described_class.assets).to eq("b")
94
+ end
95
+ end
96
+
97
+ context "when compiled assets available" do
98
+ before do
99
+ allow(described_class).to receive(:compiled_assets?).and_return(true)
100
+ end
101
+
102
+ it "caches compiled assets list" do
103
+ expect(described_class).to receive(:compiled_assets).once.and_return("a")
104
+ described_class.assets
105
+ described_class.assets
106
+ end
107
+
108
+ it "returns compiled assets" do
109
+ expect(described_class.assets).to eq("a")
110
+ end
111
+ end
112
+ end
113
+ end