releaf-core 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
  4. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
  5. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
  6. data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  7. data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  8. data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  9. data/app/assets/images/releaf/icons/favicon.ico +0 -0
  10. data/app/assets/images/releaf/icons/favicon.png +0 -0
  11. data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
  12. data/app/assets/images/releaf/logo-login.png +0 -0
  13. data/app/assets/images/releaf/logo.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
  17. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
  18. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
  19. data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
  20. data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
  21. data/app/assets/javascripts/releaf/application.js +13 -0
  22. data/app/assets/javascripts/releaf/include/ajax.js +66 -0
  23. data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
  24. data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
  25. data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
  26. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
  27. data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
  28. data/app/assets/javascripts/releaf/include/loader.js +45 -0
  29. data/app/assets/javascripts/releaf/include/localization.js +213 -0
  30. data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
  31. data/app/assets/javascripts/releaf/include/notifications.js +267 -0
  32. data/app/assets/javascripts/releaf/include/pagination.js +19 -0
  33. data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
  34. data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
  35. data/app/assets/javascripts/releaf/include/search.js +140 -0
  36. data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
  37. data/app/assets/javascripts/releaf/include/sortable.js +69 -0
  38. data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
  39. data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
  40. data/app/assets/stylesheets/releaf/application.scss +9 -0
  41. data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
  42. data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
  43. data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
  44. data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
  45. data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
  46. data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
  47. data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
  48. data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
  49. data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
  50. data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
  51. data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
  52. data/app/assets/stylesheets/releaf/environment.scss +4 -0
  53. data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
  54. data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
  55. data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
  56. data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
  57. data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
  58. data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
  59. data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
  60. data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
  61. data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
  62. data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
  63. data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
  64. data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
  65. data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
  66. data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
  67. data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
  68. data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
  69. data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
  70. data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
  71. data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
  72. data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
  73. data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
  74. data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
  75. data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
  76. data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
  77. data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
  78. data/app/assets/stylesheets/releaf/layout.scss +35 -0
  79. data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
  80. data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
  81. data/app/builders/releaf/builders/association_reflector.rb +58 -0
  82. data/app/builders/releaf/builders/base.rb +80 -0
  83. data/app/builders/releaf/builders/collection.rb +8 -0
  84. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
  85. data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
  86. data/app/builders/releaf/builders/edit_builder.rb +66 -0
  87. data/app/builders/releaf/builders/form_builder.rb +594 -0
  88. data/app/builders/releaf/builders/index_builder.rb +118 -0
  89. data/app/builders/releaf/builders/orderer.rb +5 -0
  90. data/app/builders/releaf/builders/page/header_builder.rb +70 -0
  91. data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
  92. data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
  93. data/app/builders/releaf/builders/pagination_builder.rb +107 -0
  94. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
  95. data/app/builders/releaf/builders/resource.rb +9 -0
  96. data/app/builders/releaf/builders/resource_dialog.rb +8 -0
  97. data/app/builders/releaf/builders/resource_view.rb +54 -0
  98. data/app/builders/releaf/builders/show_builder.rb +3 -0
  99. data/app/builders/releaf/builders/table_builder.rb +280 -0
  100. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
  101. data/app/builders/releaf/builders/template.rb +8 -0
  102. data/app/builders/releaf/builders/toolbox.rb +23 -0
  103. data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
  104. data/app/builders/releaf/builders/view.rb +132 -0
  105. data/app/builders/releaf/builders.rb +38 -0
  106. data/app/builders/releaf/core/settings/form_builder.rb +21 -0
  107. data/app/builders/releaf/core/settings/table_builder.rb +11 -0
  108. data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
  109. data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
  110. data/app/controllers/releaf/base_controller.rb +458 -0
  111. data/app/controllers/releaf/core/errors_controller.rb +5 -0
  112. data/app/controllers/releaf/core/settings_controller.rb +50 -0
  113. data/app/helpers/releaf/application_helper.rb +53 -0
  114. data/app/helpers/releaf/button_helper.rb +50 -0
  115. data/app/helpers/releaf/javascript_helper.rb +75 -0
  116. data/app/lib/releaf/core/assets_resolver.rb +58 -0
  117. data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
  118. data/app/lib/releaf/core/error_formatter.rb +103 -0
  119. data/app/lib/releaf/core/item_orderer.rb +102 -0
  120. data/app/lib/releaf/core/resource_base.rb +66 -0
  121. data/app/lib/releaf/core/resource_fields.rb +6 -0
  122. data/app/lib/releaf/core/resource_params.rb +47 -0
  123. data/app/lib/releaf/core/resource_table_fields.rb +10 -0
  124. data/app/lib/releaf/core/resource_utilities.rb +36 -0
  125. data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
  126. data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
  127. data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
  128. data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
  129. data/app/lib/releaf/core/responders/error_responder.rb +9 -0
  130. data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
  131. data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
  132. data/app/lib/releaf/core/responders.rb +31 -0
  133. data/app/lib/releaf/core/search.rb +147 -0
  134. data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
  135. data/app/models/releaf/richtext_attachment.rb +6 -0
  136. data/app/models/releaf/settings.rb +27 -0
  137. data/app/views/layouts/releaf/admin.html.erb +1 -0
  138. data/app/views/releaf/base/confirm_destroy.ruby +1 -0
  139. data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
  140. data/app/views/releaf/base/edit.ruby +1 -0
  141. data/app/views/releaf/base/index.ruby +1 -0
  142. data/app/views/releaf/base/new.ruby +1 -0
  143. data/app/views/releaf/base/refused_destroy.ruby +1 -0
  144. data/app/views/releaf/base/show.ruby +1 -0
  145. data/app/views/releaf/base/toolbox.ruby +1 -0
  146. data/app/views/releaf/error_pages/_error.html.haml +10 -0
  147. data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
  148. data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
  149. data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
  150. data/lib/generators/dummy/install_generator.rb +18 -0
  151. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
  152. data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
  153. data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
  154. data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
  155. data/lib/generators/dummy/templates/config/routes.rb +19 -0
  156. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
  157. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
  158. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
  159. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
  160. data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
  161. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  162. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
  163. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
  164. data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
  165. data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
  166. data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
  167. data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
  168. data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
  169. data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
  170. data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
  171. data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
  172. data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
  173. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
  174. data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
  175. data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
  176. data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
  177. data/lib/generators/dummy/templates/models/author.rb +10 -0
  178. data/lib/generators/dummy/templates/models/banner.rb +5 -0
  179. data/lib/generators/dummy/templates/models/book.rb +19 -0
  180. data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
  181. data/lib/generators/dummy/templates/models/bundle.rb +17 -0
  182. data/lib/generators/dummy/templates/models/chapter.rb +7 -0
  183. data/lib/generators/dummy/templates/models/home_page.rb +5 -0
  184. data/lib/generators/dummy/templates/models/node.rb +10 -0
  185. data/lib/generators/dummy/templates/models/publisher.rb +9 -0
  186. data/lib/generators/dummy/templates/models/text_page.rb +5 -0
  187. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
  188. data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
  189. data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
  190. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
  191. data/lib/generators/releaf/install_generator.rb +93 -0
  192. data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
  193. data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
  194. data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
  195. data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
  196. data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
  197. data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
  198. data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
  199. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
  200. data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
  201. data/lib/generators/releaf/templates/models/node.rb +3 -0
  202. data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
  203. data/lib/releaf/core/application.rb +17 -0
  204. data/lib/releaf/core/builders_autoload.rb +27 -0
  205. data/lib/releaf/core/component.rb +9 -0
  206. data/lib/releaf/core/configuration.rb +101 -0
  207. data/lib/releaf/core/engine.rb +35 -0
  208. data/lib/releaf/core/exceptions.rb +38 -0
  209. data/lib/releaf/core/route_mapper.rb +59 -0
  210. data/lib/releaf/core/settings_ui_component.rb +7 -0
  211. data/lib/releaf/core/validation_error_codes.rb +36 -0
  212. data/lib/releaf/version.rb +3 -0
  213. data/lib/releaf-core.rb +14 -0
  214. data/lib/tasks/releaf_tasks.rake +4 -0
  215. data/releaf-core.gemspec +35 -0
  216. data/spec/builders/builders/association_reflector_spec.rb +138 -0
  217. data/spec/builders/builders/base_spec.rb +276 -0
  218. data/spec/builders/builders/collection_spec.rb +18 -0
  219. data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
  220. data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
  221. data/spec/builders/builders/edit_builder_spec.rb +215 -0
  222. data/spec/builders/builders/form_builder_spec.rb +562 -0
  223. data/spec/builders/builders/index_builder_spec.rb +345 -0
  224. data/spec/builders/builders/orderer_spec.rb +22 -0
  225. data/spec/builders/builders/page/header_builder_spec.rb +143 -0
  226. data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
  227. data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
  228. data/spec/builders/builders/pagination_builder_spec.rb +330 -0
  229. data/spec/builders/builders/resource_dialog_spec.rb +21 -0
  230. data/spec/builders/builders/resource_view_spec.rb +158 -0
  231. data/spec/builders/builders/show_builder_spec.rb +7 -0
  232. data/spec/builders/builders/table_builder_spec.rb +638 -0
  233. data/spec/builders/builders/template_spec.rb +12 -0
  234. data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
  235. data/spec/builders/builders/toolbox_spec.rb +48 -0
  236. data/spec/builders/builders/view_spec.rb +281 -0
  237. data/spec/builders/builders_spec.rb +134 -0
  238. data/spec/builders/core/settings/form_builder_spec.rb +69 -0
  239. data/spec/builders/core/settings/table_builder_spec.rb +21 -0
  240. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
  241. data/spec/controllers/releaf/base_controller_spec.rb +447 -0
  242. data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
  243. data/spec/features/ajaxbox_spec.rb +111 -0
  244. data/spec/features/authorization_spec.rb +50 -0
  245. data/spec/features/dragonfly_integration_spec.rb +24 -0
  246. data/spec/features/edit_actions_spec.rb +142 -0
  247. data/spec/features/errors_spec.rb +29 -0
  248. data/spec/features/index_actions_spec.rb +85 -0
  249. data/spec/features/index_table_spec.rb +32 -0
  250. data/spec/features/menu_spec.rb +71 -0
  251. data/spec/features/richtext_attachments_spec.rb +64 -0
  252. data/spec/features/richtext_embed_spec.rb +29 -0
  253. data/spec/features/richtext_spec.rb +19 -0
  254. data/spec/features/search_spec.rb +825 -0
  255. data/spec/features/settings_spec.rb +38 -0
  256. data/spec/features/title_spec.rb +13 -0
  257. data/spec/fixtures/common_fields.yml +17 -0
  258. data/spec/fixtures/cs.png +0 -0
  259. data/spec/fixtures/time.formats.xlsx +0 -0
  260. data/spec/fixtures/unicorn.jpg +0 -0
  261. data/spec/helpers/application_helper_spec.rb +75 -0
  262. data/spec/helpers/button_helper_spec.rb +146 -0
  263. data/spec/lib/releaf/core/application_spec.rb +42 -0
  264. data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
  265. data/spec/lib/releaf/core/configuration_spec.rb +230 -0
  266. data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
  267. data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
  268. data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
  269. data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
  270. data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
  271. data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
  272. data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
  273. data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
  274. data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
  275. data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
  276. data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
  277. data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
  278. data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
  279. data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
  280. data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
  281. data/spec/lib/releaf/core/responders_spec.rb +60 -0
  282. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
  283. data/spec/lib/validation_error_codes_spec.rb +56 -0
  284. data/spec/misc/factories_spec.rb +43 -0
  285. data/spec/models/settings_spec.rb +58 -0
  286. data/spec/routing/route_mapper_spec.rb +185 -0
  287. data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
  288. metadata +657 -0
@@ -0,0 +1,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