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,31 @@
1
+ require 'rails_helper'
2
+
3
+ describe Releaf::Core::SettingsController do
4
+ login_as_user :user
5
+
6
+ describe "GET index" do
7
+ login_as_user :user
8
+ it "lists only settings that not scoped to any object and exists within `Releaf::Settings.registry`" do
9
+ Releaf::Settings.destroy_all
10
+ Releaf::Settings.registry = {}
11
+
12
+ Releaf::Settings.create(var: "a", value: "1")
13
+ Releaf::Settings.create(var: "b", value: "2")
14
+ Releaf::Settings.create(var: "c", value: "2")
15
+ Releaf::Settings.create(var: "a", value: "3", thing_type: "User", thing_id: "1")
16
+
17
+ Releaf::Settings.register(key: "a", default: "x", description: "some setting")
18
+ Releaf::Settings.register(key: "b", default: "xxxx", description: "some other setting")
19
+
20
+ get :index
21
+ expect(assigns(:collection).size).to eq(2)
22
+ end
23
+ end
24
+
25
+ describe "GET new" do
26
+ it "creation of new records is disabled" do
27
+ get :new
28
+ expect(response.status).to eq(403)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,111 @@
1
+ require 'rails_helper'
2
+ feature "Ajaxbox", js: true do
3
+ background do
4
+ auth_as_user
5
+ end
6
+
7
+ scenario "Close ajaxbox with footer 'cancel' button without reloading page" do
8
+ user = Releaf::Permissions::User.last
9
+ visit releaf_permissions_users_path
10
+ click_link user.name
11
+ expect(page).to have_header(text: user.to_text)
12
+
13
+ open_toolbox_dialog "Delete"
14
+ within_dialog{ click_link "No" }
15
+ expect(page).to_not have_css(".dialog")
16
+ expect(current_path).to eq(edit_releaf_permissions_user_path(user))
17
+ end
18
+
19
+ scenario "Close ajaxbox with footer 'cancel' button (wrapped within form) without reloading page" do
20
+ node = create(:home_page_node, name: "MyNode")
21
+ node_path = edit_releaf_content_node_path(node)
22
+ visit node_path
23
+ open_toolbox_dialog "Move"
24
+ within_dialog{ click_link "Cancel" }
25
+ expect(page).to_not have_css(".dialog")
26
+ expect(current_path).to eq(node_path)
27
+ end
28
+
29
+ scenario "Close ajaxbox with header 'close' button without reloading page" do
30
+ node = create(:home_page_node, name: "MyNode")
31
+ node_path = edit_releaf_content_node_path(node)
32
+ visit node_path
33
+ open_toolbox_dialog "Add child"
34
+ within_dialog{ find("button.close").click }
35
+ expect(page).to_not have_css(".dialog")
36
+ expect(current_path).to eq(node_path)
37
+ end
38
+
39
+ scenario "Drag ajaxbox within header" do
40
+ node = create(:home_page_node, name: "MyNode")
41
+ node_path = edit_releaf_content_node_path(node)
42
+ visit node_path
43
+ open_toolbox_dialog "Add child"
44
+ header = find(".dialog > header")
45
+ target = find("body > header a.home")
46
+
47
+ start_position = page.driver.evaluate_script <<-EOS
48
+ function() {
49
+ var ele = jQuery(".dialog")[0];
50
+ var rect = ele.getBoundingClientRect();
51
+ return [rect.left, rect.top];
52
+ }();
53
+ EOS
54
+ header.drag_to(target)
55
+
56
+ end_position = page.driver.evaluate_script <<-EOS
57
+ function() {
58
+ var ele = jQuery(".dialog")[0];
59
+ var rect = ele.getBoundingClientRect();
60
+ return [rect.left, rect.top];
61
+ }();
62
+ EOS
63
+
64
+ expect(start_position).to_not eq(end_position)
65
+ end
66
+
67
+ scenario "Ajaxbox without modality (background is clickable)" do
68
+ node = create(:home_page_node, name: "MyNode")
69
+ node_path = edit_releaf_content_node_path(node)
70
+ visit node_path
71
+ open_toolbox_dialog "Add child"
72
+
73
+ expect(page).to have_css(".mfp-bg")
74
+ page.driver.click(10, 10)
75
+ expect(page).to_not have_css(".mfp-bg")
76
+ end
77
+
78
+ scenario "Ajaxbox with modality (background is not clickable)" do
79
+ user = Releaf::Permissions::User.last
80
+ visit releaf_permissions_users_path
81
+ click_link user.name
82
+ expect(page).to have_header(text: user.to_text)
83
+ open_toolbox_dialog "Delete"
84
+
85
+ expect(page).to have_css(".mfp-bg")
86
+ page.driver.click(10, 10)
87
+ expect(page).to have_css(".mfp-bg")
88
+ expect(find(".mfp-bg")).to be_visible
89
+ end
90
+
91
+ scenario "Ajaxbox single image view" do
92
+ image = Rack::Test::UploadedFile.new(File.expand_path('../../spec/fixtures/unicorn.jpg', __dir__), "image/jpg")
93
+ book = create(:book, cover_image: image)
94
+ visit edit_admin_book_path(book)
95
+
96
+ find(".field[data-name='cover_image'] .value-preview img").click
97
+ expect(page).to have_css(".mfp-bg")
98
+ page.driver.click(10, 10)
99
+ expect(page).to_not have_css(".mfp-bg")
100
+
101
+ find(".field[data-name='cover_image'] .value-preview img").click
102
+
103
+ image_url = find(".field[data-name='cover_image'] .value-preview a.ajaxbox")["href"] + "&ajax=1"
104
+ ajaxbox_image_selector = '.ajaxbox-inner img.mfp-img'
105
+ expect(find(ajaxbox_image_selector)['src']).to eq image_url
106
+
107
+ find(".ajaxbox-inner button.close").click
108
+ expect(page).to have_no_css(".mfp-bg")
109
+ expect(page).to have_no_css(ajaxbox_image_selector)
110
+ end
111
+ end
@@ -0,0 +1,50 @@
1
+ require 'rails_helper'
2
+ feature "Authorization" do
3
+ let(:user){ create(:user) }
4
+
5
+ scenario "Url preserving after authorization" do
6
+ current_unauthorized_url = new_admin_book_url
7
+ visit current_unauthorized_url
8
+
9
+ within("form") do
10
+ fill_in 'Email', with: user.email
11
+ fill_in 'Password', with: user.password
12
+ click_button 'Sign in'
13
+ end
14
+
15
+ expect(current_url).to eq current_unauthorized_url
16
+ end
17
+
18
+ scenario "Redirection to role default controller after authorization" do
19
+ visit releaf_root_url
20
+ within("form.login") do
21
+ fill_in 'Email', with: user.email
22
+ fill_in 'Password', with: user.password
23
+ click_button 'Sign in'
24
+ end
25
+
26
+ expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
27
+ end
28
+
29
+ scenario "Redirection to role :redirect_to GET parameter after authorization when parameter value is relative url" do
30
+ visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_path)
31
+ within("form.login") do
32
+ fill_in 'Email', with: user.email
33
+ fill_in 'Password', with: user.password
34
+ click_button 'Sign in'
35
+ end
36
+
37
+ expect(current_url).to eq new_admin_book_url
38
+ end
39
+
40
+ scenario "Redirection to role default controller after authorization when :redirect_to GET parameter is absolute url" do
41
+ visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_url)
42
+ within("form.login") do
43
+ fill_in 'Email', with: user.email
44
+ fill_in 'Password', with: user.password
45
+ click_button 'Sign in'
46
+ end
47
+
48
+ expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails_helper'
2
+ feature "Dragonfly integration", js: true do
3
+ background do
4
+ auth_as_user
5
+ end
6
+
7
+ scenario "Upload, view and remove image" do
8
+ visit new_admin_book_path
9
+ create_resource do
10
+ fill_in "Title", with: "xx"
11
+ attach_file "Cover image", File.expand_path('../fixtures/cs.png', __dir__)
12
+ end
13
+
14
+ find(".field[data-name='cover_image'] a.ajaxbox" ).click
15
+ expect(page).to have_css(".ajaxbox-inner img.mfp-img")
16
+ find(".ajaxbox-inner button.close" ).click
17
+ expect(page).to have_no_css(".ajaxbox-inner img.mfp-img")
18
+
19
+ update_resource do
20
+ check "Remove"
21
+ end
22
+ expect(page).to have_no_css(".field[data-name='cover_image'] a.ajaxbox")
23
+ end
24
+ end
@@ -0,0 +1,142 @@
1
+ require 'rails_helper'
2
+ feature "Base controller edit", js: true do
3
+ background do
4
+ auth_as_user
5
+ @author = FactoryGirl.create(:author)
6
+ @good_book = FactoryGirl.create(:book, title: "good book", author: @author, price: 12.34, description_lv: "in lv", description_en: "in en")
7
+ FactoryGirl.create(:book, title: "bad book", author: @author)
8
+ end
9
+
10
+ scenario "creation of new resources" do
11
+
12
+ # normal save button redirects to edit view of the newly created resource
13
+ visit admin_books_path
14
+ click_link "Create new resource"
15
+ wait_for_all_richtexts
16
+ fill_in "Title", with: "Lorem ipsum"
17
+ click_button 'Save'
18
+ expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
19
+ wait_for_all_richtexts
20
+ expect(page).to have_css('header h1', text: 'Lorem ipsum')
21
+
22
+ # "save and create another" button redirects to new resource view
23
+ visit new_admin_book_path
24
+ wait_for_all_richtexts
25
+ fill_in "Title", with: "Other ipsum"
26
+ click_button "Save and create another"
27
+ expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
28
+ wait_for_all_richtexts
29
+ expect(current_path).to eq new_admin_book_path
30
+ expect(page).to have_css('header h1', text: 'Create new resource')
31
+
32
+ # ENTER key in a field defaults to "save and create another"
33
+ visit new_admin_book_path
34
+ wait_for_all_richtexts
35
+ fill_in "Title", with: "Another ipsum"
36
+ find('#resource_title').native.send_key(:Enter)
37
+ expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
38
+ expect(page).to have_css('header h1', text: 'Create new resource')
39
+
40
+ end
41
+
42
+ scenario "keeps search params after deleting record from edit view" do
43
+ visit admin_books_path(search: "good")
44
+ click_link("good book")
45
+ open_toolbox_dialog("Delete")
46
+ click_button("Yes")
47
+ expect(page).to have_number_of_resources(0)
48
+ end
49
+
50
+ scenario "when deleting item with restrict relation" do
51
+ visit edit_admin_author_path @author
52
+ open_toolbox_dialog("Delete")
53
+
54
+ within_dialog do
55
+ expect(page).to have_css('.restricted-relations .relations li', count: 2)
56
+ end
57
+ end
58
+
59
+ scenario "drag and drop nested items with ckeditors" do
60
+ skip "implement drag and drop test"
61
+ end
62
+
63
+ scenario "when clicking on delete restriction relation, it opens edit for related object" do
64
+ visit edit_admin_author_path @author
65
+ open_toolbox_dialog("Delete")
66
+
67
+ within_dialog do
68
+ find('.restricted-relations .relations li a', text: "good book").click
69
+ end
70
+ expect(page).to have_header(text: "good book")
71
+ end
72
+
73
+ scenario "remember last active locale for localized fields" do
74
+ visit admin_book_path(id: @good_book.id)
75
+ within(".localization-switch") do
76
+ click_button "en"
77
+ end
78
+
79
+ within(".localization-menu-items") do
80
+ click_button "Lv"
81
+ end
82
+ wait_for_all_richtexts
83
+
84
+ visit admin_book_path(id: @good_book.id)
85
+ expect(page).to have_css('#resource_description_lv[value="in lv"]')
86
+ end
87
+
88
+ scenario "editing book uses Book#price instead of Book[:price] (issue #95)" do
89
+ visit admin_book_path(id: @good_book.id)
90
+ expect(page).to have_css('#resource_price[value="12.34"]')
91
+ end
92
+
93
+ scenario "do not show 'Back to list' url when no index url passed" do
94
+ visit admin_books_path(search: "good")
95
+ click_link("good book")
96
+ expect(page).to have_link("Back to list")
97
+ wait_for_all_richtexts
98
+
99
+ visit admin_book_path(Book.first)
100
+ expect(page).to_not have_link("Back to list")
101
+ end
102
+
103
+ scenario "editing nested object with allow_destroy: false" do
104
+ visit admin_book_path(id: @good_book.id)
105
+ expect(page).to_not have_css('.remove-nested-item')
106
+
107
+ update_resource do
108
+ find('.nested[data-name="chapters"] .add-nested-item').click
109
+ expect(page).to have_css('.remove-nested-item')
110
+ fill_in 'resource_chapters_attributes_0_title', with: 'Chapter 1'
111
+ fill_in 'resource_chapters_attributes_0_text', with: 'todo'
112
+ fill_in_richtext 'Sample', with: "xx"
113
+ end
114
+
115
+ expect(page).to_not have_css('.remove-nested-item')
116
+ expect(page).to have_css('#resource_chapters_attributes_0_title[value="Chapter 1"]')
117
+ end
118
+
119
+ scenario "adding nested objects" do
120
+ visit new_admin_book_path
121
+
122
+ create_resource do
123
+ fill_in "Title", with: "Master and Margarita"
124
+ within "[data-name='chapters']" do
125
+
126
+ # verify that there are no visible inputs
127
+ expect( page ).to have_no_selector('input', visible: true)
128
+ expect( page ).to have_no_selector('textarea', visible: true)
129
+
130
+ click_button "Add item"
131
+
132
+ fill_in "Title", with: "Chapter 1"
133
+ fill_in "Text", with: "some text"
134
+ fill_in_richtext 'Sample', with: "xx"
135
+ end
136
+ end
137
+
138
+ new_book = Book.where(title: "Master and Margarita").first
139
+ expect( new_book.chapters.count ).to eq 1
140
+ expect( new_book.chapters.first.title ).to eq "Chapter 1"
141
+ end
142
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_helper'
2
+ describe "Errors feature" do
3
+ before do
4
+ auth_as_user
5
+ end
6
+
7
+ it "returns 404 status code and generic error page for nonexistent rotues" do
8
+ visit(releaf_root_path + "/asdassd")
9
+
10
+ expect(page.status_code).to eq(404)
11
+ expect(page.body).to match(/not found/)
12
+ end
13
+
14
+ it "returns 403 status code and generic error page for disabled feature" do
15
+ allow_any_instance_of(Releaf::Permissions::RolesController).to receive(:verify_feature_availability!).and_raise(Releaf::FeatureDisabled, "edit")
16
+ visit releaf_permissions_roles_path
17
+
18
+ expect(page.status_code).to eq(403)
19
+ expect(page.body).to match(/edit feature disabled for roles/i)
20
+ end
21
+
22
+ it "returns 403 status code and generic error page for restricted content" do
23
+ allow_any_instance_of(Releaf::Permissions::AccessControl).to receive(:controller_permitted?).and_return(false)
24
+ visit releaf_permissions_roles_path
25
+
26
+ expect(page.status_code).to eq(403)
27
+ expect(page.body).to match(/you are not authorized to access roles/i)
28
+ end
29
+ end
@@ -0,0 +1,85 @@
1
+ require 'rails_helper'
2
+ feature "Base controller index", js: true do
3
+ background do
4
+ auth_as_user
5
+ author = FactoryGirl.create(:author)
6
+ good_book = FactoryGirl.create(:book, title: "good book", author: author, published_at: Date.parse("2015-12-12"))
7
+ FactoryGirl.create(:chapter, title: 'Scary night', text: 'Once upon a time...', book: good_book)
8
+ FactoryGirl.create(:book, title: "bad book", author: author)
9
+ end
10
+
11
+ scenario "shows resource count" do
12
+ visit admin_books_path
13
+ expect(page).to have_number_of_resources(2)
14
+ end
15
+
16
+ scenario "search resources dynamically" do
17
+ visit admin_books_path
18
+ search "good"
19
+ expect(page).to have_number_of_resources(1)
20
+
21
+ check "Only active"
22
+ expect(page).to have_number_of_resources(0)
23
+
24
+ uncheck "Only active"
25
+ expect(page).to have_number_of_resources(1)
26
+
27
+ fill_in "Published between", with: "2015-11-11"
28
+ click_button "Filter"
29
+
30
+ expect(page).to have_number_of_resources(1)
31
+ end
32
+
33
+ scenario "search by 2nd level nested fields" do
34
+ visit admin_authors_path
35
+ search "upon"
36
+ expect(page).to have_number_of_resources(1)
37
+ end
38
+
39
+ scenario "search nonexisting stuff" do
40
+ visit admin_authors_path
41
+ search "bunnyrabit"
42
+ expect(page).to have_number_of_resources(0)
43
+ end
44
+
45
+ scenario "no row urls when :edit feature is not available" do
46
+ visit admin_books_path
47
+ expect(page).to have_link("good book")
48
+
49
+ allow_any_instance_of(Admin::BooksController).to receive(:feature_available?).with(:edit).and_return(false)
50
+ visit admin_books_path
51
+ expect(page).to_not have_link("good book")
52
+ end
53
+
54
+ scenario "keeps search parameters when navigating to edit and back" do
55
+ visit admin_books_path(search: "good")
56
+ click_link("good book")
57
+ wait_for_all_richtexts
58
+ click_link("Back to list")
59
+ expect(page).to have_number_of_resources(1)
60
+ end
61
+
62
+ scenario "keeps search parameters after delete" do
63
+ visit admin_books_path(search: "good")
64
+ open_toolbox_dialog('Delete', Book.first)
65
+ click_button("Yes")
66
+ expect(page).to have_number_of_resources(0)
67
+ end
68
+
69
+ scenario "when deleting item in edit" do
70
+ visit admin_books_path(search: "good")
71
+ click_link("good book")
72
+ open_toolbox_dialog('Delete')
73
+ click_button("Yes")
74
+ expect(page).to have_number_of_resources(0)
75
+ end
76
+
77
+ scenario "when deleting item with restrict relation" do
78
+ visit admin_authors_path
79
+ open_toolbox_dialog('Delete', Author.first)
80
+
81
+ within_dialog do
82
+ expect(page).to have_css('.restricted-relations .relations li', count: 2)
83
+ end
84
+ end
85
+ end