alchemy_cms 4.4.4 → 5.0.0.beta2

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +56 -18
  3. data/.github/workflows/stale.yml +1 -1
  4. data/.gitignore +20 -2
  5. data/.hound.yml +2 -1
  6. data/.prettierrc +6 -0
  7. data/.rubocop.yml +33 -20
  8. data/CHANGELOG.md +121 -0
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +7 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -2
  14. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
  16. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +5 -5
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
  18. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  19. data/app/assets/javascripts/alchemy/templates/index.js +2 -0
  20. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +3 -0
  22. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -3
  24. data/app/assets/stylesheets/alchemy/_variables.scss +2 -2
  25. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  26. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  27. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  28. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  29. data/app/assets/stylesheets/alchemy/lists.scss +0 -8
  30. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  31. data/app/assets/stylesheets/alchemy/nodes.scss +6 -1
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +63 -21
  33. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  35. data/app/controllers/alchemy/admin/base_controller.rb +13 -33
  36. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  37. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  38. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  39. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  40. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  41. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  42. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  43. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -14
  44. data/app/controllers/alchemy/admin/pages_controller.rb +50 -63
  45. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  46. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  47. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  48. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  49. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  50. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  51. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  52. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  53. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  54. data/app/controllers/alchemy/api/nodes_controller.rb +65 -0
  55. data/app/controllers/alchemy/api/pages_controller.rb +15 -22
  56. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  57. data/app/controllers/alchemy/base_controller.rb +10 -9
  58. data/app/controllers/alchemy/messages_controller.rb +16 -23
  59. data/app/controllers/alchemy/pages_controller.rb +13 -11
  60. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  61. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  62. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  63. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  64. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  65. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  66. data/app/decorators/alchemy/content_editor.rb +55 -0
  67. data/app/decorators/alchemy/element_editor.rb +39 -0
  68. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  69. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  70. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  71. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  72. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  73. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  74. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  75. data/app/helpers/alchemy/admin/pages_helper.rb +12 -12
  76. data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
  77. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  78. data/app/helpers/alchemy/base_helper.rb +13 -8
  79. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  80. data/app/helpers/alchemy/elements_helper.rb +12 -58
  81. data/app/helpers/alchemy/pages_helper.rb +24 -174
  82. data/app/helpers/alchemy/url_helper.rb +2 -1
  83. data/app/mailers/alchemy/base_mailer.rb +1 -1
  84. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  85. data/app/models/alchemy/attachment.rb +20 -18
  86. data/app/models/alchemy/base_record.rb +2 -5
  87. data/app/models/alchemy/content.rb +33 -52
  88. data/app/models/alchemy/content/factory.rb +24 -31
  89. data/app/models/alchemy/element.rb +45 -53
  90. data/app/models/alchemy/element/definitions.rb +4 -4
  91. data/app/models/alchemy/element/element_contents.rb +9 -6
  92. data/app/models/alchemy/element/element_essences.rb +4 -3
  93. data/app/models/alchemy/element/presenters.rb +3 -2
  94. data/app/models/alchemy/element_to_page.rb +1 -1
  95. data/app/models/alchemy/essence_boolean.rb +1 -3
  96. data/app/models/alchemy/essence_date.rb +2 -3
  97. data/app/models/alchemy/essence_file.rb +4 -4
  98. data/app/models/alchemy/essence_html.rb +1 -3
  99. data/app/models/alchemy/essence_link.rb +1 -3
  100. data/app/models/alchemy/essence_node.rb +18 -0
  101. data/app/models/alchemy/essence_page.rb +3 -16
  102. data/app/models/alchemy/essence_picture.rb +17 -16
  103. data/app/models/alchemy/essence_picture_view.rb +7 -6
  104. data/app/models/alchemy/essence_richtext.rb +1 -3
  105. data/app/models/alchemy/essence_select.rb +1 -3
  106. data/app/models/alchemy/essence_text.rb +0 -2
  107. data/app/models/alchemy/folded_page.rb +1 -0
  108. data/app/models/alchemy/language.rb +21 -35
  109. data/app/models/alchemy/language/code.rb +4 -4
  110. data/app/models/alchemy/legacy_page_url.rb +1 -1
  111. data/app/models/alchemy/message.rb +3 -3
  112. data/app/models/alchemy/node.rb +55 -9
  113. data/app/models/alchemy/page.rb +53 -123
  114. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  115. data/app/models/alchemy/page/page_elements.rb +35 -44
  116. data/app/models/alchemy/page/page_naming.rb +20 -70
  117. data/app/models/alchemy/page/page_natures.rb +7 -34
  118. data/app/models/alchemy/page/page_scopes.rb +23 -29
  119. data/app/models/alchemy/page/url_path.rb +64 -0
  120. data/app/models/alchemy/picture.rb +40 -30
  121. data/app/models/alchemy/picture/preprocessor.rb +26 -0
  122. data/app/models/alchemy/picture/transformations.rb +9 -7
  123. data/app/models/alchemy/picture/url.rb +5 -5
  124. data/app/models/alchemy/site.rb +6 -36
  125. data/app/models/alchemy/site/layout.rb +2 -2
  126. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  127. data/app/serializers/alchemy/content_serializer.rb +0 -3
  128. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  131. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  132. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  133. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  134. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  135. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  136. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  137. data/app/serializers/alchemy/node_serializer.rb +14 -0
  138. data/app/serializers/alchemy/page_serializer.rb +2 -1
  139. data/app/serializers/alchemy/page_tree_serializer.rb +11 -14
  140. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  141. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  142. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  143. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  144. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  145. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  146. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  147. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  148. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  149. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  150. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  151. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  152. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  153. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  154. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  155. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  156. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  157. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  158. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  159. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -2
  160. data/app/views/alchemy/admin/nodes/_form.html.erb +23 -15
  161. data/app/views/alchemy/admin/nodes/_node.html.erb +5 -19
  162. data/app/views/alchemy/admin/nodes/index.html.erb +3 -18
  163. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  164. data/app/views/alchemy/admin/pages/_form.html.erb +1 -2
  165. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  166. data/app/views/alchemy/admin/pages/_page.html.erb +14 -25
  167. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  168. data/app/views/alchemy/admin/pages/_sitemap.html.erb +6 -0
  169. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  170. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  171. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  172. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  173. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -0
  174. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  175. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  176. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  177. data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
  178. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  179. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  180. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  181. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  182. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  183. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  184. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  185. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  186. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  187. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  188. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  189. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  190. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  191. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  192. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  193. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  194. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  195. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  196. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  197. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  198. data/app/views/alchemy/pages/show.rss.builder +3 -2
  199. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  200. data/babel.config.js +12 -0
  201. data/bin/rails +5 -4
  202. data/config/alchemy/config.yml +23 -22
  203. data/config/brakeman.ignore +1 -1
  204. data/config/initializers/assets.rb +2 -1
  205. data/config/initializers/dragonfly.rb +2 -1
  206. data/config/initializers/mime_types.rb +1 -0
  207. data/config/initializers/mini_profiler.rb +3 -2
  208. data/config/initializers/simple_form.rb +6 -6
  209. data/config/locales/alchemy.en.yml +37 -14
  210. data/config/routes.rb +32 -28
  211. data/config/spring.rb +3 -2
  212. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  213. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  214. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  215. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  216. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  217. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  218. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  219. data/lib/alchemy/admin/locale.rb +3 -1
  220. data/lib/alchemy/admin/preview_url.rb +85 -0
  221. data/lib/alchemy/auth_accessors.rb +8 -7
  222. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  223. data/lib/alchemy/config.rb +26 -2
  224. data/lib/alchemy/configuration_methods.rb +3 -1
  225. data/lib/alchemy/controller_actions.rb +6 -5
  226. data/lib/alchemy/deprecation.rb +2 -1
  227. data/lib/alchemy/elements_finder.rb +5 -5
  228. data/lib/alchemy/engine.rb +23 -8
  229. data/lib/alchemy/errors.rb +0 -7
  230. data/lib/alchemy/essence.rb +17 -16
  231. data/lib/alchemy/filetypes.rb +5 -5
  232. data/lib/alchemy/forms/builder.rb +4 -4
  233. data/lib/alchemy/hints.rb +1 -1
  234. data/lib/alchemy/i18n.rb +2 -1
  235. data/lib/alchemy/modules.rb +12 -12
  236. data/lib/alchemy/name_conversions.rb +5 -5
  237. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  238. data/lib/alchemy/page_layout.rb +15 -12
  239. data/lib/alchemy/paths.rb +1 -1
  240. data/lib/alchemy/permissions.rb +7 -6
  241. data/lib/alchemy/resource.rb +23 -13
  242. data/lib/alchemy/resources_helper.rb +12 -18
  243. data/lib/alchemy/routing_constraints.rb +1 -1
  244. data/lib/alchemy/seeder.rb +42 -14
  245. data/lib/alchemy/shell.rb +13 -10
  246. data/lib/alchemy/taggable.rb +1 -0
  247. data/lib/alchemy/tasks/tidy.rb +4 -3
  248. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  249. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  250. data/lib/alchemy/test_support/factories.rb +1 -1
  251. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  253. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  254. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  255. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  256. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  257. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  258. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  259. data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
  260. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  261. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  262. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  263. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  264. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  265. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  266. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  267. data/lib/alchemy/tinymce.rb +15 -13
  268. data/lib/alchemy/upgrader.rb +8 -7
  269. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  270. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  271. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  272. data/lib/alchemy/version.rb +1 -1
  273. data/lib/alchemy_cms.rb +52 -50
  274. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  275. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  276. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  277. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  280. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  281. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  285. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  286. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  288. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  290. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  291. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  292. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  293. data/lib/generators/alchemy/install/templates/menus.yml.tt +8 -0
  294. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +5 -5
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  298. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  299. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  300. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +2 -2
  301. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +2 -2
  302. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  303. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  307. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  309. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  311. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  312. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  313. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  314. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  315. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  316. data/lib/tasks/alchemy/db.rake +3 -19
  317. data/lib/tasks/alchemy/install.rake +3 -2
  318. data/lib/tasks/alchemy/tidy.rake +9 -8
  319. data/lib/tasks/alchemy/upgrade.rake +28 -105
  320. data/package.json +45 -0
  321. data/package/admin.js +14 -0
  322. data/package/src/__tests__/i18n.spec.js +70 -0
  323. data/package/src/i18n.js +48 -0
  324. data/package/src/node_tree.js +72 -0
  325. data/package/src/translations.js +32 -0
  326. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  327. data/package/src/utils/__tests__/events.spec.js +38 -0
  328. data/package/src/utils/ajax.js +48 -0
  329. data/package/src/utils/events.js +16 -0
  330. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  331. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  332. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  333. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  334. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  335. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  336. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  337. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  338. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  339. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  341. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  342. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  343. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  344. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  345. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  346. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  347. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  348. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  349. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  350. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  351. metadata +131 -83
  352. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  353. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  354. data/app/helpers/alchemy/essences_helper.rb +0 -119
  355. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  356. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  357. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  358. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -33
  359. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  360. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  361. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  362. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  363. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  364. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  365. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  366. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  367. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  368. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  369. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  370. data/lib/alchemy/ssl_protection.rb +0 -32
  371. data/lib/alchemy/tasks/helpers.rb +0 -81
  372. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  373. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  374. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  375. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  376. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  377. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  378. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  379. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  380. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  381. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  382. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  383. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  384. data/lib/tasks/alchemy/convert.rake +0 -95
  385. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  386. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -23,13 +23,6 @@ module Alchemy
23
23
  end
24
24
  end
25
25
 
26
- class DefaultLanguageNotDeletable < StandardError
27
- # Raised if one tries to delete the default language.
28
- def message
29
- "Default language is not deletable!"
30
- end
31
- end
32
-
33
26
  class ElementDefinitionError < StandardError
34
27
  # Raised if element definition can not be found.
35
28
  def initialize(attributes)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_record'
3
+ require "active_record"
4
4
 
5
5
  module Alchemy #:nodoc:
6
6
  # A bogus association that skips eager loading for essences not having an ingredient association
@@ -40,7 +40,7 @@ module Alchemy #:nodoc:
40
40
  register_as_essence_association!
41
41
 
42
42
  configuration = {
43
- ingredient_column: 'body'
43
+ ingredient_column: "body",
44
44
  }.update(options)
45
45
 
46
46
  @_classes_with_ingredient_association ||= []
@@ -48,7 +48,7 @@ module Alchemy #:nodoc:
48
48
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
49
49
  attr_writer :validation_errors
50
50
  include Alchemy::Essence::InstanceMethods
51
- stampable stamper_class_name: Alchemy.user_class_name
51
+
52
52
  validate :validate_ingredient, on: :update, if: -> { validations.any? }
53
53
 
54
54
  has_one :content, as: :essence, class_name: "Alchemy::Content", inverse_of: :essence
@@ -62,7 +62,7 @@ module Alchemy #:nodoc:
62
62
  delegate :trashed?, to: :element, allow_nil: true
63
63
  delegate :public?, to: :element, allow_nil: true
64
64
 
65
- after_update :touch_content
65
+ after_save :touch_element
66
66
 
67
67
  def acts_as_essence_class
68
68
  #{name}
@@ -109,7 +109,7 @@ module Alchemy #:nodoc:
109
109
  def register_as_essence_association!
110
110
  klass_name = model_name.to_s
111
111
  arguments = [:has_many, klass_name.demodulize.tableize.to_sym, through: :contents,
112
- source: :essence, source_type: klass_name]
112
+ source: :essence, source_type: klass_name]
113
113
  %w(Page Element).each { |k| "Alchemy::#{k}".constantize.send(*arguments) }
114
114
  end
115
115
  end
@@ -171,7 +171,7 @@ module Alchemy #:nodoc:
171
171
  end
172
172
 
173
173
  def validations
174
- @validations ||= definition.present? ? definition['validate'] || [] : []
174
+ @validations ||= definition.present? ? definition["validate"] || [] : []
175
175
  end
176
176
 
177
177
  def validation_errors
@@ -187,6 +187,7 @@ module Alchemy #:nodoc:
187
187
 
188
188
  def validate_uniqueness(validate = true)
189
189
  return if !validate || !public?
190
+
190
191
  if duplicates.any?
191
192
  errors.add(ingredient_column, :taken)
192
193
  validation_errors << :taken
@@ -194,7 +195,7 @@ module Alchemy #:nodoc:
194
195
  end
195
196
 
196
197
  def validate_format(format)
197
- matcher = Config.get('format_matchers')[format] || format
198
+ matcher = Config.get("format_matchers")[format] || format
198
199
  if ingredient.to_s.match(Regexp.new(matcher)).nil?
199
200
  errors.add(ingredient_column, :invalid)
200
201
  validation_errors << :invalid
@@ -216,7 +217,7 @@ module Alchemy #:nodoc:
216
217
  end
217
218
  end
218
219
 
219
- # Returns the value stored from the database column that is configured as ingredient column.
220
+ # Sets the value stored in the database column that is configured as ingredient column.
220
221
  def ingredient=(value)
221
222
  if respond_to?(ingredient_setter_method)
222
223
  send(ingredient_setter_method, value)
@@ -225,19 +226,19 @@ module Alchemy #:nodoc:
225
226
 
226
227
  # Returns the setter method for ingredient column
227
228
  def ingredient_setter_method
228
- ingredient_column.to_s + '='
229
+ ingredient_column.to_s + "="
229
230
  end
230
231
 
231
232
  # Essence definition from config/elements.yml
232
233
  def definition
233
234
  return {} if element.nil? || element.content_definitions.nil?
234
- element.content_definitions.detect { |c| c['name'] == content.name } || {}
235
+
236
+ element.content_definitions.detect { |c| c["name"] == content.name } || {}
235
237
  end
236
238
 
237
- # Touch content. Called after update.
238
- def touch_content
239
- return nil if content.nil?
240
- content.touch
239
+ # Touches element. Called after save.
240
+ def touch_element
241
+ element&.touch
241
242
  end
242
243
 
243
244
  # Returns the first x (default 30) characters of ingredient for the Element#preview_text method.
@@ -247,11 +248,11 @@ module Alchemy #:nodoc:
247
248
  end
248
249
 
249
250
  def open_link_in_new_window?
250
- respond_to?(:link_target) && link_target == 'blank'
251
+ respond_to?(:link_target) && link_target == "blank"
251
252
  end
252
253
 
253
254
  def partial_name
254
- self.class.name.split('::').last.underscore
255
+ self.class.name.split("::").last.underscore
255
256
  end
256
257
 
257
258
  def acts_as_essence?
@@ -8,7 +8,7 @@ module Alchemy
8
8
  "audio/mpeg",
9
9
  "audio/mp4",
10
10
  "audio/wav",
11
- "audio/x-wav"
11
+ "audio/x-wav",
12
12
  ]
13
13
 
14
14
  IMAGE_FILE_TYPES = [
@@ -17,7 +17,7 @@ module Alchemy
17
17
  "image/png",
18
18
  "image/svg+xml",
19
19
  "image/tiff",
20
- "image/x-psd"
20
+ "image/x-psd",
21
21
  ]
22
22
 
23
23
  VCARD_FILE_TYPES = ["text/x-vcard", "application/vcard"]
@@ -29,18 +29,18 @@ module Alchemy
29
29
  "video/mpeg",
30
30
  "video/quicktime",
31
31
  "video/x-msvideo",
32
- "video/x-ms-wmv"
32
+ "video/x-ms-wmv",
33
33
  ]
34
34
 
35
35
  TEXT_FILE_TYPES = [
36
36
  "application/rtf",
37
- "text/plain"
37
+ "text/plain",
38
38
  ]
39
39
 
40
40
  EXCEL_FILE_TYPES = [
41
41
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
42
42
  "application/vnd.ms-excel",
43
- "text/csv"
43
+ "text/csv",
44
44
  ]
45
45
  end
46
46
  end
@@ -11,7 +11,7 @@ module Alchemy
11
11
  if object.respond_to?(:attribute_fixed?) && object.attribute_fixed?(attribute_name)
12
12
  options[:disabled] = true
13
13
  options[:input_html] = options.fetch(:input_html, {}).merge(
14
- 'data-alchemy-tooltip' => Alchemy.t(:attribute_fixed, attribute_name)
14
+ "data-alchemy-tooltip" => Alchemy.t(:attribute_fixed, attribute_name),
15
15
  )
16
16
  end
17
17
 
@@ -22,10 +22,10 @@ module Alchemy
22
22
  #
23
23
  def submit(label, options = {})
24
24
  options = {
25
- wrapper_html: {class: 'submit'}
25
+ wrapper_html: {class: "submit"},
26
26
  }.update(options)
27
- template.content_tag('div', options.delete(:wrapper_html)) do
28
- template.content_tag('button', label, options.delete(:input_html))
27
+ template.content_tag("div", options.delete(:wrapper_html)) do
28
+ template.content_tag("button", label, options.delete(:input_html))
29
29
  end
30
30
  end
31
31
  end
@@ -35,7 +35,7 @@ module Alchemy
35
35
  # @return String
36
36
  #
37
37
  def hint
38
- hint = definition['hint']
38
+ hint = definition["hint"]
39
39
  if hint == true
40
40
  Alchemy.t(name, scope: hint_translation_scope)
41
41
  else
@@ -74,11 +74,12 @@ module Alchemy
74
74
 
75
75
  def humanize_default_string!(msg, options)
76
76
  return if options[:default].present?
77
+
77
78
  options[:default] = msg.is_a?(Symbol) ? msg.to_s.humanize : msg
78
79
  end
79
80
 
80
81
  def alchemy_scoped_scope(options)
81
- default_scope = ['alchemy']
82
+ default_scope = ["alchemy"]
82
83
  case options[:scope]
83
84
  when Array
84
85
  default_scope + options[:scope]
@@ -4,7 +4,7 @@ module Alchemy
4
4
  module Modules
5
5
  mattr_accessor :alchemy_modules
6
6
 
7
- @@alchemy_modules = YAML.load_file(File.expand_path('../../config/alchemy/modules.yml', __dir__))
7
+ @@alchemy_modules = YAML.load_file(File.expand_path("../../config/alchemy/modules.yml", __dir__))
8
8
 
9
9
  class << self
10
10
  def included(base)
@@ -28,11 +28,11 @@ module Alchemy
28
28
  definition_hash = module_definition.deep_stringify_keys
29
29
 
30
30
  ### Validate controller(s) existence
31
- if definition_hash['navigation'].is_a?(Hash)
32
- defined_controllers = [definition_hash['navigation']['controller']]
31
+ if definition_hash["navigation"].is_a?(Hash)
32
+ defined_controllers = [definition_hash["navigation"]["controller"]]
33
33
 
34
- if definition_hash['navigation']['sub_navigation'].is_a?(Array)
35
- defined_controllers.concat(definition_hash['navigation']['sub_navigation'].map{ |x| x['controller'] })
34
+ if definition_hash["navigation"]["sub_navigation"].is_a?(Array)
35
+ defined_controllers.concat(definition_hash["navigation"]["sub_navigation"].map{ |x| x["controller"] })
36
36
  end
37
37
 
38
38
  validate_controllers_existence(defined_controllers)
@@ -52,7 +52,7 @@ module Alchemy
52
52
  begin
53
53
  controller_name.constantize
54
54
  rescue NameError
55
- raise "Error in AlchemyCMS module definition: '#{definition_hash['name']}'. Could not find the matching controller class #{controller_name.sub(/^::/, '')} for the specified controller: '#{controller_val}'"
55
+ raise "Error in AlchemyCMS module definition: '#{definition_hash["name"]}'. Could not find the matching controller class #{controller_name.sub(/^::/, "")} for the specified controller: '#{controller_val}'"
56
56
  end
57
57
  end
58
58
  end
@@ -66,11 +66,11 @@ module Alchemy
66
66
  def module_definition_for(name_or_params)
67
67
  case name_or_params
68
68
  when String
69
- alchemy_modules.detect { |m| m['name'] == name_or_params }
69
+ alchemy_modules.detect { |m| m["name"] == name_or_params }
70
70
  when Hash
71
71
  name_or_params.stringify_keys!
72
72
  alchemy_modules.detect do |alchemy_module|
73
- module_navi = alchemy_module.fetch('navigation', {})
73
+ module_navi = alchemy_module.fetch("navigation", {})
74
74
  definition_from_mainnavi(module_navi, name_or_params) ||
75
75
  definition_from_subnavi(module_navi, name_or_params)
76
76
  end
@@ -86,7 +86,7 @@ module Alchemy
86
86
  end
87
87
 
88
88
  def definition_from_subnavi(module_navi, params)
89
- subnavi = module_navi['sub_navigation']
89
+ subnavi = module_navi["sub_navigation"]
90
90
  return if subnavi.nil?
91
91
 
92
92
  subnavi.any? do |navi|
@@ -95,15 +95,15 @@ module Alchemy
95
95
  end
96
96
 
97
97
  def controller_matches?(navi, params)
98
- remove_slash(navi['controller']) == remove_slash(params['controller'])
98
+ remove_slash(navi["controller"]) == remove_slash(params["controller"])
99
99
  end
100
100
 
101
101
  def action_matches?(navi, params)
102
- navi['action'] == params['action']
102
+ navi["action"] == params["action"]
103
103
  end
104
104
 
105
105
  def remove_slash(str)
106
- str.gsub(/^\//, '')
106
+ str.gsub(/^\//, "")
107
107
  end
108
108
  end
109
109
  end
@@ -10,17 +10,17 @@ module Alchemy
10
10
  # @returns String
11
11
  def convert_to_urlname(name)
12
12
  name
13
- .gsub(/[äÄ]/, 'ae')
14
- .gsub(/[üÜ]/, 'ue')
15
- .gsub(/[öÖ]/, 'oe')
16
- .gsub(/[ß]/, 'ss')
13
+ .gsub(/[äÄ]/, "ae")
14
+ .gsub(/[üÜ]/, "ue")
15
+ .gsub(/[öÖ]/, "oe")
16
+ .gsub(/[ß]/, "ss")
17
17
  .parameterize
18
18
  end
19
19
 
20
20
  # Converts a filename and suffix into a human readable name.
21
21
  #
22
22
  def convert_to_humanized_name(name, suffix)
23
- name.gsub(/\.#{::Regexp.quote(suffix)}$/i, '').tr('_', ' ').strip
23
+ name.gsub(/\.#{::Regexp.quote(suffix)}$/i, "").tr("_", " ").strip
24
24
  end
25
25
  end
26
26
  end
@@ -18,6 +18,7 @@ module Alchemy
18
18
  def run_on_page_layout_callbacks
19
19
  OnPageLayout.callbacks.each do |page_layout, callbacks|
20
20
  next unless call_page_layout_callback_for?(page_layout)
21
+
21
22
  callbacks.each do |callback|
22
23
  if callback.respond_to?(:call)
23
24
  instance_eval(&callback)
@@ -37,7 +37,8 @@ module Alchemy
37
37
  #
38
38
  def get(name)
39
39
  return {} if name.blank?
40
- all.detect { |a| a['name'].casecmp(name).zero? }
40
+
41
+ all.detect { |a| a["name"].casecmp(name).zero? }
41
42
  end
42
43
 
43
44
  def get_all_by_attributes(attributes)
@@ -66,7 +67,7 @@ module Alchemy
66
67
  #
67
68
  def layouts_with_own_for_select(page_layout_name, language_id, only_layoutpages = false)
68
69
  layouts = selectable_layouts(language_id, only_layoutpages)
69
- if layouts.detect { |l| l['name'] == page_layout_name }.nil?
70
+ if layouts.detect { |l| l["name"] == page_layout_name }.nil?
70
71
  @map_array = [[human_layout_name(page_layout_name), page_layout_name]]
71
72
  else
72
73
  @map_array = []
@@ -87,9 +88,9 @@ module Alchemy
87
88
  @language_id = language_id
88
89
  all.select do |layout|
89
90
  if only_layoutpages
90
- layout['layoutpage'] && layout_available?(layout)
91
+ layout["layoutpage"] && layout_available?(layout)
91
92
  else
92
- !layout['layoutpage'] && layout_available?(layout)
93
+ !layout["layoutpage"] && layout_available?(layout)
93
94
  end
94
95
  end
95
96
  end
@@ -98,7 +99,7 @@ module Alchemy
98
99
  #
99
100
  def element_names_for(page_layout)
100
101
  if definition = get(page_layout)
101
- definition.fetch('elements', [])
102
+ definition.fetch("elements", [])
102
103
  else
103
104
  Rails.logger.warn "\n+++ Warning: No layout definition for #{page_layout} found! in page_layouts.yml\n"
104
105
  []
@@ -118,7 +119,7 @@ module Alchemy
118
119
  # The layout name
119
120
  #
120
121
  def human_layout_name(layout)
121
- Alchemy.t(layout, scope: 'page_layout_names', default: layout.to_s.humanize)
122
+ Alchemy.t(layout, scope: "page_layout_names", default: layout.to_s.humanize)
122
123
  end
123
124
 
124
125
  private
@@ -126,13 +127,13 @@ module Alchemy
126
127
  # Returns true if the given layout is unique and not already taken or it should be hidden.
127
128
  #
128
129
  def layout_available?(layout)
129
- !layout['hide'] && !already_taken?(layout) && available_on_site?(layout)
130
+ !layout["hide"] && !already_taken?(layout) && available_on_site?(layout)
130
131
  end
131
132
 
132
133
  # Returns true if this layout is unique and already taken by another page.
133
134
  #
134
135
  def already_taken?(layout)
135
- layout['unique'] && page_with_layout_existing?(layout['name'])
136
+ layout["unique"] && page_with_layout_existing?(layout["name"])
136
137
  end
137
138
 
138
139
  # Returns true if one page already has the given layout
@@ -152,8 +153,10 @@ module Alchemy
152
153
  # page_layouts: [default_intro]
153
154
  #
154
155
  def available_on_site?(layout)
156
+ return false unless Alchemy::Site.current
157
+
155
158
  Alchemy::Site.current.definition.blank? ||
156
- Alchemy::Site.current.definition.fetch('page_layouts', []).include?(layout['name'])
159
+ Alchemy::Site.current.definition.fetch("page_layouts", []).include?(layout["name"])
157
160
  end
158
161
 
159
162
  # Reads the layout definitions from +config/alchemy/page_layouts.yml+.
@@ -162,21 +165,21 @@ module Alchemy
162
165
  if File.exist?(layouts_file_path)
163
166
  YAML.safe_load(ERB.new(File.read(layouts_file_path)).result, YAML_WHITELIST_CLASSES, [], true) || []
164
167
  else
165
- raise LoadError, "Could not find page_layouts.yml file! Please run `rails generate alchemy:scaffold`"
168
+ raise LoadError, "Could not find page_layouts.yml file! Please run `rails generate alchemy:install`"
166
169
  end
167
170
  end
168
171
 
169
172
  # Returns the page_layouts.yml file path
170
173
  #
171
174
  def layouts_file_path
172
- Rails.root.join 'config/alchemy/page_layouts.yml'
175
+ Rails.root.join "config/alchemy/page_layouts.yml"
173
176
  end
174
177
 
175
178
  # Maps given layouts for Rails select form helper.
176
179
  #
177
180
  def mapped_layouts_for_select(layouts)
178
181
  layouts.each do |layout|
179
- @map_array << [human_layout_name(layout['name']), layout["name"]]
182
+ @map_array << [human_layout_name(layout["name"]), layout["name"]]
180
183
  end
181
184
  @map_array
182
185
  end
@@ -29,6 +29,6 @@ module Alchemy
29
29
 
30
30
  # Defaults
31
31
  #
32
- @@admin_path = 'admin'
32
+ @@admin_path = "admin"
33
33
  @@admin_constraints = {}
34
34
  end
@@ -36,7 +36,7 @@ module Alchemy
36
36
  module GuestUser
37
37
  def alchemy_guest_user_rules
38
38
  can([:show, :download], Alchemy::Attachment) { |a| !a.restricted? }
39
- can :see, Alchemy::Page, restricted: false, visible: true
39
+ can :see, Alchemy::Page, restricted: false
40
40
 
41
41
  can :read, Alchemy::Content, Alchemy::Content.available.not_restricted do |c|
42
42
  c.public? && !c.restricted? && !c.trashed?
@@ -64,7 +64,7 @@ module Alchemy
64
64
 
65
65
  # Resources
66
66
  can [:show, :download], Alchemy::Attachment
67
- can :see, Alchemy::Page, restricted: true, visible: true
67
+ can :see, Alchemy::Page, restricted: true
68
68
 
69
69
  can :read, Alchemy::Content, Alchemy::Content.available do |c|
70
70
  c.public? && !c.trashed?
@@ -99,7 +99,7 @@ module Alchemy
99
99
  :alchemy_admin_pages,
100
100
  :alchemy_admin_pictures,
101
101
  :alchemy_admin_tags,
102
- :alchemy_admin_users
102
+ :alchemy_admin_users,
103
103
  ]
104
104
 
105
105
  # Controller actions
@@ -137,7 +137,7 @@ module Alchemy
137
137
  # Navigation
138
138
  can :index, [
139
139
  :alchemy_admin_languages,
140
- :alchemy_admin_users
140
+ :alchemy_admin_users,
141
141
  ]
142
142
 
143
143
  # Controller actions
@@ -150,7 +150,7 @@ module Alchemy
150
150
  :flush,
151
151
  :order,
152
152
  :sort,
153
- :switch_language
153
+ :switch_language,
154
154
  ], Alchemy::Page
155
155
 
156
156
  # Resources which may be locked via template permissions
@@ -164,7 +164,7 @@ module Alchemy
164
164
  can([
165
165
  :create,
166
166
  :destroy,
167
- :publish
167
+ :publish,
168
168
  ], Alchemy::Page) { |p| p.editable_by?(@user) }
169
169
 
170
170
  can :manage, Alchemy::Picture
@@ -200,6 +200,7 @@ module Alchemy
200
200
 
201
201
  def user_role_rules
202
202
  return alchemy_guest_user_rules if @user.alchemy_roles.blank?
203
+
203
204
  @user.alchemy_roles.each do |role|
204
205
  exec_role_rules(role)
205
206
  end