alchemy_cms 4.6.7 → 5.0.0.beta1

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 (384) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +33 -1
  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 +31 -10
  8. data/CHANGELOG.md +89 -32
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +6 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -5
  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.page_sorter.js +17 -17
  17. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  18. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  19. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  20. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  21. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  22. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  24. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  25. data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
  26. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
  27. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  28. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
  29. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
  30. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  31. data/app/controllers/alchemy/admin/base_controller.rb +16 -42
  32. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  33. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  34. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  35. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  36. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  37. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  38. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  39. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
  40. data/app/controllers/alchemy/admin/pages_controller.rb +50 -62
  41. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  42. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  43. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  44. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  45. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  46. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  47. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  48. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  49. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  50. data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
  51. data/app/controllers/alchemy/api/pages_controller.rb +14 -23
  52. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  53. data/app/controllers/alchemy/base_controller.rb +10 -9
  54. data/app/controllers/alchemy/messages_controller.rb +16 -23
  55. data/app/controllers/alchemy/pages_controller.rb +13 -11
  56. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  57. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  58. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  59. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  60. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  61. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  62. data/app/decorators/alchemy/element_editor.rb +39 -0
  63. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  64. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  65. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  66. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  67. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  68. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  69. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  70. data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
  71. data/app/helpers/alchemy/admin/pictures_helper.rb +3 -3
  72. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  73. data/app/helpers/alchemy/base_helper.rb +13 -8
  74. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  75. data/app/helpers/alchemy/elements_helper.rb +12 -58
  76. data/app/helpers/alchemy/pages_helper.rb +24 -174
  77. data/app/helpers/alchemy/url_helper.rb +2 -1
  78. data/app/mailers/alchemy/base_mailer.rb +1 -1
  79. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  80. data/app/models/alchemy/attachment.rb +21 -19
  81. data/app/models/alchemy/base_record.rb +2 -5
  82. data/app/models/alchemy/content/factory.rb +24 -31
  83. data/app/models/alchemy/content.rb +33 -38
  84. data/app/models/alchemy/element/definitions.rb +4 -4
  85. data/app/models/alchemy/element/element_contents.rb +9 -6
  86. data/app/models/alchemy/element/element_essences.rb +4 -3
  87. data/app/models/alchemy/element/presenters.rb +3 -2
  88. data/app/models/alchemy/element.rb +46 -54
  89. data/app/models/alchemy/element_to_page.rb +1 -1
  90. data/app/models/alchemy/essence_boolean.rb +1 -3
  91. data/app/models/alchemy/essence_date.rb +2 -3
  92. data/app/models/alchemy/essence_file.rb +4 -4
  93. data/app/models/alchemy/essence_html.rb +1 -3
  94. data/app/models/alchemy/essence_link.rb +1 -3
  95. data/app/models/alchemy/essence_node.rb +18 -0
  96. data/app/models/alchemy/essence_page.rb +3 -16
  97. data/app/models/alchemy/essence_picture.rb +17 -16
  98. data/app/models/alchemy/essence_picture_view.rb +7 -6
  99. data/app/models/alchemy/essence_richtext.rb +1 -3
  100. data/app/models/alchemy/essence_select.rb +1 -3
  101. data/app/models/alchemy/essence_text.rb +0 -2
  102. data/app/models/alchemy/folded_page.rb +1 -0
  103. data/app/models/alchemy/language/code.rb +4 -4
  104. data/app/models/alchemy/language.rb +21 -35
  105. data/app/models/alchemy/legacy_page_url.rb +1 -1
  106. data/app/models/alchemy/message.rb +3 -3
  107. data/app/models/alchemy/node.rb +28 -5
  108. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  109. data/app/models/alchemy/page/page_elements.rb +35 -44
  110. data/app/models/alchemy/page/page_naming.rb +20 -70
  111. data/app/models/alchemy/page/page_natures.rb +7 -34
  112. data/app/models/alchemy/page/page_scopes.rb +23 -29
  113. data/app/models/alchemy/page/url_path.rb +0 -2
  114. data/app/models/alchemy/page.rb +47 -128
  115. data/app/models/alchemy/picture/transformations.rb +9 -7
  116. data/app/models/alchemy/picture/url.rb +5 -5
  117. data/app/models/alchemy/picture.rb +19 -28
  118. data/app/models/alchemy/site/layout.rb +2 -2
  119. data/app/models/alchemy/site.rb +6 -36
  120. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  121. data/app/serializers/alchemy/content_serializer.rb +0 -3
  122. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  123. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  124. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  125. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  126. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  127. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  128. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  131. data/app/serializers/alchemy/node_serializer.rb +2 -0
  132. data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
  133. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  134. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  135. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  136. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  137. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  138. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  139. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  140. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  141. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  142. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  143. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  145. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  146. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  147. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  148. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  149. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  150. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  151. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  152. data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
  153. data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
  154. data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
  155. data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
  156. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  157. data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
  158. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  159. data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
  160. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  161. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  162. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  163. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  164. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  165. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  166. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  167. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  168. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  169. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  170. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  171. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  172. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  173. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  174. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  175. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  176. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  177. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  178. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  179. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  180. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  181. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  182. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  183. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  184. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  185. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  186. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  187. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  188. data/app/views/alchemy/pages/show.rss.builder +3 -2
  189. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  190. data/babel.config.js +12 -0
  191. data/bin/rails +5 -4
  192. data/config/alchemy/config.yml +15 -18
  193. data/config/brakeman.ignore +1 -1
  194. data/config/initializers/assets.rb +2 -1
  195. data/config/initializers/dragonfly.rb +2 -1
  196. data/config/initializers/mime_types.rb +1 -0
  197. data/config/initializers/mini_profiler.rb +3 -2
  198. data/config/initializers/simple_form.rb +6 -6
  199. data/config/locales/alchemy.en.yml +23 -8
  200. data/config/routes.rb +25 -24
  201. data/config/spring.rb +3 -2
  202. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  203. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  204. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  205. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  206. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  207. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  208. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  209. data/lib/alchemy/admin/locale.rb +3 -1
  210. data/lib/alchemy/admin/preview_url.rb +64 -0
  211. data/lib/alchemy/auth_accessors.rb +8 -7
  212. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  213. data/lib/alchemy/config.rb +1 -5
  214. data/lib/alchemy/configuration_methods.rb +3 -1
  215. data/lib/alchemy/controller_actions.rb +6 -5
  216. data/lib/alchemy/deprecation.rb +2 -1
  217. data/lib/alchemy/elements_finder.rb +5 -5
  218. data/lib/alchemy/engine.rb +22 -14
  219. data/lib/alchemy/errors.rb +0 -7
  220. data/lib/alchemy/essence.rb +17 -16
  221. data/lib/alchemy/filetypes.rb +5 -5
  222. data/lib/alchemy/forms/builder.rb +4 -4
  223. data/lib/alchemy/hints.rb +1 -1
  224. data/lib/alchemy/i18n.rb +2 -1
  225. data/lib/alchemy/modules.rb +12 -12
  226. data/lib/alchemy/name_conversions.rb +5 -5
  227. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  228. data/lib/alchemy/page_layout.rb +15 -12
  229. data/lib/alchemy/paths.rb +1 -1
  230. data/lib/alchemy/permissions.rb +7 -6
  231. data/lib/alchemy/resource.rb +25 -17
  232. data/lib/alchemy/resources_helper.rb +12 -18
  233. data/lib/alchemy/routing_constraints.rb +1 -1
  234. data/lib/alchemy/seeder.rb +42 -14
  235. data/lib/alchemy/shell.rb +13 -10
  236. data/lib/alchemy/taggable.rb +1 -0
  237. data/lib/alchemy/tasks/tidy.rb +4 -3
  238. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  239. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  240. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  241. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  242. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  243. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  244. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  245. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  246. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  247. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  248. data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
  249. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  250. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  251. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  253. data/lib/alchemy/test_support/factories.rb +1 -1
  254. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  255. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  256. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  257. data/lib/alchemy/tinymce.rb +15 -13
  258. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  259. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  260. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  261. data/lib/alchemy/upgrader.rb +8 -7
  262. data/lib/alchemy/userstamp.rb +1 -1
  263. data/lib/alchemy/version.rb +1 -1
  264. data/lib/alchemy_cms.rb +52 -51
  265. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  266. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  267. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  268. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  269. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  270. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  271. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  272. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  273. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  274. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  275. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  276. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  277. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  280. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  281. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
  285. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  286. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
  287. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  288. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  289. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  290. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  291. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
  292. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
  293. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  294. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  296. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  297. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  298. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  299. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  300. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  301. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  302. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  303. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  306. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  307. data/lib/tasks/alchemy/db.rake +3 -19
  308. data/lib/tasks/alchemy/install.rake +3 -2
  309. data/lib/tasks/alchemy/tidy.rake +9 -8
  310. data/lib/tasks/alchemy/upgrade.rake +18 -120
  311. data/package/admin.js +14 -0
  312. data/package/src/__tests__/i18n.spec.js +70 -0
  313. data/package/src/i18n.js +48 -0
  314. data/package/src/node_tree.js +72 -0
  315. data/package/src/translations.js +32 -0
  316. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  317. data/package/src/utils/__tests__/events.spec.js +38 -0
  318. data/package/src/utils/ajax.js +48 -0
  319. data/package/src/utils/events.js +16 -0
  320. data/package.json +45 -0
  321. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  322. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  323. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  324. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  325. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  326. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  327. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  328. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  329. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  330. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  332. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  333. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  334. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  335. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  336. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  337. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  338. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  339. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  340. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  341. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  342. metadata +117 -98
  343. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  344. data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
  345. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  346. data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
  347. data/app/helpers/alchemy/essences_helper.rb +0 -119
  348. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  349. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  350. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  351. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
  352. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  353. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  354. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  355. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  356. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  357. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  358. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  359. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  360. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  361. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  362. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  363. data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
  364. data/lib/alchemy/error_tracking.rb +0 -14
  365. data/lib/alchemy/ssl_protection.rb +0 -34
  366. data/lib/alchemy/tasks/helpers.rb +0 -81
  367. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  368. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  369. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  370. data/lib/alchemy/upgrader/four_point_six.rb +0 -50
  371. data/lib/alchemy/upgrader/four_point_two.rb +0 -86
  372. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -45
  373. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -166
  374. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -32
  375. data/lib/alchemy/upgrader/tasks/fixed_element_name_finder.rb +0 -31
  376. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  377. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  378. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  379. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  380. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  381. data/lib/tasks/alchemy/convert.rake +0 -98
  382. data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
  383. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  384. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'csv'
4
- require 'alchemy/resource'
5
- require 'alchemy/resources_helper'
3
+ require "csv"
4
+ require "alchemy/resource"
5
+ require "alchemy/resources_helper"
6
6
 
7
7
  module Alchemy
8
8
  module Admin
@@ -22,6 +22,7 @@ module Alchemy
22
22
 
23
23
  def index
24
24
  @query = resource_handler.model.ransack(search_filter_params[:q])
25
+ @query.sorts = default_sort_order if @query.sorts.empty?
25
26
  items = @query.result
26
27
 
27
28
  if contains_relations?
@@ -52,7 +53,7 @@ module Alchemy
52
53
  end
53
54
 
54
55
  def show
55
- render action: 'edit'
56
+ render action: "edit"
56
57
  end
57
58
 
58
59
  def edit; end
@@ -63,7 +64,7 @@ module Alchemy
63
64
  render_errors_or_redirect(
64
65
  resource_instance_variable,
65
66
  resources_path(resource_instance_variable.class, search_filter_params),
66
- flash_notice_for_resource_action
67
+ flash_notice_for_resource_action,
67
68
  )
68
69
  end
69
70
 
@@ -72,14 +73,17 @@ module Alchemy
72
73
  render_errors_or_redirect(
73
74
  resource_instance_variable,
74
75
  resources_path(resource_instance_variable.class, search_filter_params),
75
- flash_notice_for_resource_action
76
+ flash_notice_for_resource_action,
76
77
  )
77
78
  end
78
79
 
79
80
  def destroy
80
81
  resource_instance_variable.destroy
82
+ if resource_instance_variable.errors.any?
83
+ flash[:error] = resource_instance_variable.errors.full_messages.join(", ")
84
+ end
81
85
  flash_notice_for_resource_action
82
- do_redirect_to resource_url_proxy.url_for(search_filter_params.merge(action: 'index'))
86
+ do_redirect_to resource_url_proxy.url_for(search_filter_params.merge(action: "index"))
83
87
  end
84
88
 
85
89
  def resource_handler
@@ -92,6 +96,7 @@ module Alchemy
92
96
  # The key should look like "Modelname successfully created|updated|destroyed."
93
97
  def flash_notice_for_resource_action(action = params[:action])
94
98
  return if resource_instance_variable.errors.any?
99
+
95
100
  case action.to_sym
96
101
  when :create
97
102
  verb = "created"
@@ -104,11 +109,11 @@ module Alchemy
104
109
  end
105
110
 
106
111
  def is_alchemy_module?
107
- !alchemy_module.nil? && !alchemy_module['engine_name'].nil?
112
+ !alchemy_module.nil? && !alchemy_module["engine_name"].nil?
108
113
  end
109
114
 
110
115
  def alchemy_module
111
- @alchemy_module ||= module_definition_for(controller: params[:controller], action: 'index')
116
+ @alchemy_module ||= module_definition_for(controller: params[:controller], action: "index")
112
117
  end
113
118
 
114
119
  def load_resource
@@ -143,16 +148,14 @@ module Alchemy
143
148
 
144
149
  def common_search_filter_includes
145
150
  [
146
- # contrary to Rails' documentation passing an empty hash to permit all keys does not work
147
- {options: options_from_params.keys},
148
151
  {q: [
149
152
  resource_handler.search_field_name,
150
- :s
153
+ :s,
151
154
  ]},
152
155
  :tagged_with,
153
156
  :filter,
154
157
  :page,
155
- :per_page
158
+ :per_page,
156
159
  ].freeze
157
160
  end
158
161
 
@@ -164,6 +167,11 @@ module Alchemy
164
167
  per_page = Alchemy::Config.get(:items_per_page)
165
168
  [per_page, per_page * 2, per_page * 4]
166
169
  end
170
+
171
+ def default_sort_order
172
+ name = resource_handler.attributes.detect { |attr| attr[:name] == "name" }
173
+ name ? "name asc" : "#{resource_handler.attributes.first[:name]} asc"
174
+ end
167
175
  end
168
176
  end
169
177
  end
@@ -3,6 +3,24 @@
3
3
  module Alchemy
4
4
  module Admin
5
5
  class SitesController < ResourcesController
6
+ def create
7
+ @site = Alchemy::Site.new(resource_params)
8
+ if @site.save
9
+ flash[:notice] = Alchemy.t("Please create a default language for this site.")
10
+ redirect_to alchemy.admin_languages_path(site_id: @site)
11
+ else
12
+ render :new
13
+ end
14
+ end
15
+
16
+ def destroy
17
+ if @site.destroy
18
+ flash[:notice] = Alchemy.t("Site successfully removed")
19
+ else
20
+ flash[:warning] = @site.errors.full_messages.to_sentence
21
+ end
22
+ do_redirect_to alchemy.admin_sites_path
23
+ end
6
24
  end
7
25
  end
8
26
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Alchemy
2
3
  module Admin
3
4
  class StyleguideController < BaseController
@@ -7,6 +7,7 @@ module Alchemy
7
7
 
8
8
  def index
9
9
  @query = Gutentag::Tag.ransack(search_filter_params[:q])
10
+ @query.sorts = default_sort_order if @query.sorts.empty?
10
11
  @tags = @query
11
12
  .result
12
13
  .page(params[:page] || 1)
@@ -20,7 +21,7 @@ module Alchemy
20
21
 
21
22
  def create
22
23
  @tag = Gutentag::Tag.create(tag_params)
23
- render_errors_or_redirect @tag, admin_tags_path, Alchemy.t('New Tag Created')
24
+ render_errors_or_redirect @tag, admin_tags_path, Alchemy.t("New Tag Created")
24
25
  end
25
26
 
26
27
  def edit
@@ -31,7 +32,7 @@ module Alchemy
31
32
  if tag_params[:merge_to]
32
33
  @new_tag = Gutentag::Tag.find(tag_params[:merge_to])
33
34
  Tag.replace(@tag, @new_tag)
34
- operation_text = Alchemy.t('Replaced Tag') % {old_tag: @tag.name, new_tag: @new_tag.name}
35
+ operation_text = Alchemy.t("Replaced Tag") % {old_tag: @tag.name, new_tag: @new_tag.name}
35
36
  @tag.destroy
36
37
  else
37
38
  @tag.update(tag_params)
@@ -65,7 +66,8 @@ module Alchemy
65
66
 
66
67
  def tags_from_term(term)
67
68
  return [] if term.blank?
68
- Gutentag::Tag.where(['LOWER(name) LIKE ?', "#{term.downcase}%"])
69
+
70
+ Gutentag::Tag.where(["LOWER(name) LIKE ?", "#{term.downcase}%"])
69
71
  end
70
72
 
71
73
  def json_for_autocomplete(items, attribute)
@@ -25,16 +25,16 @@ module Alchemy
25
25
  [
26
26
  {
27
27
  contents: {
28
- essence: :ingredient_association
28
+ essence: :ingredient_association,
29
29
  },
30
30
  all_nested_elements: [
31
31
  {
32
32
  contents: {
33
- essence: :ingredient_association
34
- }
35
- }
36
- ]
37
- }
33
+ essence: :ingredient_association,
34
+ },
35
+ },
36
+ ],
37
+ },
38
38
  ]
39
39
  end
40
40
  end
@@ -11,11 +11,11 @@ module Alchemy
11
11
  private
12
12
 
13
13
  def render_not_authorized
14
- render json: {error: 'Not authorized'}, status: 403
14
+ render json: {error: "Not authorized"}, status: 403
15
15
  end
16
16
 
17
17
  def render_not_found
18
- render json: {error: 'Record not found'}, status: 404
18
+ render json: {error: "Record not found"}, status: 404
19
19
  end
20
20
  end
21
21
  end
@@ -18,7 +18,7 @@ module Alchemy
18
18
  end
19
19
  @contents = @contents.includes(*content_includes)
20
20
 
21
- render json: @contents, adapter: :json, root: 'contents'
21
+ render json: @contents, adapter: :json, root: "contents"
22
22
  end
23
23
 
24
24
  # Returns a json object for content
@@ -36,7 +36,7 @@ module Alchemy
36
36
  elsif params[:element_id] && params[:name]
37
37
  @content = Content.where(
38
38
  element_id: params[:element_id],
39
- name: params[:name]
39
+ name: params[:name],
40
40
  ).includes(*content_includes).first || raise(ActiveRecord::RecordNotFound)
41
41
  end
42
42
  authorize! :show, @content
@@ -48,8 +48,8 @@ module Alchemy
48
48
  def content_includes
49
49
  [
50
50
  {
51
- essence: :ingredient_association
52
- }
51
+ essence: :ingredient_association,
52
+ },
53
53
  ]
54
54
  end
55
55
  end
@@ -22,7 +22,7 @@ module Alchemy
22
22
  end
23
23
  @elements = @elements.includes(*element_includes)
24
24
 
25
- render json: @elements, adapter: :json, root: 'elements'
25
+ render json: @elements, adapter: :json, root: "elements"
26
26
  end
27
27
 
28
28
  # Returns a json object for element
@@ -41,18 +41,18 @@ module Alchemy
41
41
  nested_elements: [
42
42
  {
43
43
  contents: {
44
- essence: :ingredient_association
45
- }
44
+ essence: :ingredient_association,
45
+ },
46
46
  },
47
- :tags
48
- ]
47
+ :tags,
48
+ ],
49
49
  },
50
50
  {
51
51
  contents: {
52
- essence: :ingredient_association
53
- }
52
+ essence: :ingredient_association,
53
+ },
54
54
  },
55
- :tags
55
+ :tags,
56
56
  ]
57
57
  end
58
58
  end
@@ -2,9 +2,21 @@
2
2
 
3
3
  module Alchemy
4
4
  class Api::NodesController < Api::BaseController
5
- before_action :load_node
5
+ before_action :load_node, except: :index
6
6
  before_action :authorize_access, only: [:move, :toggle_folded]
7
7
 
8
+ def index
9
+ @nodes = Node.all
10
+ @nodes = @nodes.includes(:parent)
11
+ @nodes = @nodes.ransack(params[:filter]).result
12
+
13
+ if params[:page]
14
+ @nodes = @nodes.page(params[:page]).per(params[:per_page])
15
+ end
16
+
17
+ render json: @nodes, adapter: :json, root: "data", meta: meta_data, include: params[:include]
18
+ end
19
+
8
20
  def move
9
21
  target_parent_node = Node.find(params[:target_parent_id])
10
22
  @node.move_to_child_with_index(target_parent_node, params[:new_position])
@@ -25,5 +37,29 @@ module Alchemy
25
37
  def authorize_access
26
38
  authorize! :update, @node
27
39
  end
40
+
41
+ def meta_data
42
+ {
43
+ total_count: total_count_value,
44
+ per_page: per_page_value,
45
+ page: page_value,
46
+ }
47
+ end
48
+
49
+ def total_count_value
50
+ params[:page] ? @nodes.total_count : @nodes.size
51
+ end
52
+
53
+ def per_page_value
54
+ if params[:page]
55
+ (params[:per_page] || Kaminari.config.default_per_page).to_i
56
+ else
57
+ @nodes.size
58
+ end
59
+ end
60
+
61
+ def page_value
62
+ params[:page] ? params[:page].to_i : 1
63
+ end
28
64
  end
29
65
  end
@@ -13,25 +13,14 @@ module Alchemy
13
13
  else
14
14
  @pages = Page.accessible_by(current_ability, :index)
15
15
  end
16
- @pages = @pages.where.not(parent_id: nil)
17
16
  @pages = @pages.includes(*page_includes)
18
- if params[:page_layout].present?
19
- Alchemy::Deprecation.warn <<~WARN
20
- Passing page_layout parameter to Alchemy::Api::PagesController#index is deprecated.
21
- Please pass a Ransack search query instead:
22
- q: {
23
- page_layout_eq: '#{params[:page_layout]}'
24
- }
25
- WARN
26
- @pages = @pages.where(page_layout: params[:page_layout])
27
- end
28
17
  @pages = @pages.ransack(params[:q]).result
29
18
 
30
19
  if params[:page]
31
20
  @pages = @pages.page(params[:page]).per(params[:per_page])
32
21
  end
33
22
 
34
- render json: @pages, adapter: :json, root: 'pages', meta: meta_data
23
+ render json: @pages, adapter: :json, root: "pages", meta: meta_data
35
24
  end
36
25
 
37
26
  # Returns all pages as nested json object for tree views
@@ -71,9 +60,11 @@ module Alchemy
71
60
  end
72
61
 
73
62
  def load_page_by_urlname
63
+ return unless Language.current
64
+
74
65
  Language.current.pages.where(
75
66
  urlname: params[:urlname],
76
- language_code: params[:locale] || Language.current.code
67
+ language_code: params[:locale] || Language.current.code,
77
68
  ).includes(page_includes).first
78
69
  end
79
70
 
@@ -81,7 +72,7 @@ module Alchemy
81
72
  {
82
73
  total_count: total_count_value,
83
74
  per_page: per_page_value,
84
- page: page_value
75
+ page: page_value,
85
76
  }
86
77
  end
87
78
 
@@ -111,20 +102,20 @@ module Alchemy
111
102
  nested_elements: [
112
103
  {
113
104
  contents: {
114
- essence: :ingredient_association
115
- }
105
+ essence: :ingredient_association,
106
+ },
116
107
  },
117
- :tags
118
- ]
108
+ :tags,
109
+ ],
119
110
  },
120
111
  {
121
112
  contents: {
122
- essence: :ingredient_association
123
- }
113
+ essence: :ingredient_association,
114
+ },
124
115
  },
125
- :tags
126
- ]
127
- }
116
+ :tags,
117
+ ],
118
+ },
128
119
  ]
129
120
  end
130
121
  end
@@ -7,24 +7,24 @@ module Alchemy
7
7
 
8
8
  # sends file inline. i.e. for viewing pdfs/movies in browser
9
9
  def show
10
- response.headers['Content-Length'] = @attachment.file.size.to_s
10
+ response.headers["Content-Length"] = @attachment.file.size.to_s
11
11
  send_file(
12
12
  @attachment.file.path,
13
13
  {
14
14
  filename: @attachment.file_name,
15
15
  type: @attachment.file_mime_type,
16
- disposition: 'inline'
17
- }
16
+ disposition: "inline",
17
+ },
18
18
  )
19
19
  end
20
20
 
21
21
  # sends file as attachment. aka download
22
22
  def download
23
- response.headers['Content-Length'] = @attachment.file.size.to_s
23
+ response.headers["Content-Length"] = @attachment.file.size.to_s
24
24
  send_file(
25
25
  @attachment.file.path, {
26
26
  filename: @attachment.file_name,
27
- type: @attachment.file_mime_type
27
+ type: @attachment.file_mime_type,
28
28
  }
29
29
  )
30
30
  end
@@ -8,14 +8,13 @@ module Alchemy
8
8
  include Alchemy::AbilityHelper
9
9
  include Alchemy::ControllerActions
10
10
  include Alchemy::Modules
11
- include Alchemy::SSLProtection
12
11
 
13
12
  protect_from_forgery
14
13
 
15
14
  before_action :mailer_set_url_options
16
15
  before_action :set_locale
17
16
 
18
- helper 'alchemy/admin/form'
17
+ helper "alchemy/admin/form"
19
18
 
20
19
  rescue_from CanCan::AccessDenied do |exception|
21
20
  permission_denied(exception)
@@ -26,7 +25,9 @@ module Alchemy
26
25
  # Sets +I18n.locale+ to current Alchemy language.
27
26
  #
28
27
  def set_locale
29
- ::I18n.locale = Language.current.locale
28
+ return unless Language.current
29
+
30
+ ::I18n.locale = Language.current&.locale
30
31
  end
31
32
 
32
33
  def not_found_error!(msg = "Not found \"#{request.fullpath}\"")
@@ -60,11 +61,11 @@ module Alchemy
60
61
  end
61
62
 
62
63
  def handle_redirect_for_user
63
- flash[:warning] = Alchemy.t('You are not authorized')
64
+ flash[:warning] = Alchemy.t("You are not authorized")
64
65
  if can?(:index, :alchemy_admin_dashboard)
65
66
  redirect_or_render_notice
66
67
  else
67
- redirect_to('/')
68
+ redirect_to("/")
68
69
  end
69
70
  end
70
71
 
@@ -75,8 +76,8 @@ module Alchemy
75
76
  render plain: flash.discard(:warning), status: 403
76
77
  end
77
78
  format.html do
78
- render partial: 'alchemy/admin/partials/flash',
79
- locals: {message: flash[:warning], flash_type: 'warning'}
79
+ render partial: "alchemy/admin/partials/flash",
80
+ locals: { message: flash[:warning], flash_type: "warning" }
80
81
  end
81
82
  end
82
83
  else
@@ -85,7 +86,7 @@ module Alchemy
85
86
  end
86
87
 
87
88
  def handle_redirect_for_guest
88
- flash[:info] = Alchemy.t('Please log in')
89
+ flash[:info] = Alchemy.t("Please log in")
89
90
  if request.xhr?
90
91
  render :permission_denied
91
92
  else
@@ -98,7 +99,7 @@ module Alchemy
98
99
  def exception_logger(error)
99
100
  Rails.logger.error("\n#{error.class} #{error.message} in #{error.backtrace.first}")
100
101
  Rails.logger.error(error.backtrace[1..50].each { |line|
101
- line.gsub(/#{Rails.root.to_s}/, '')
102
+ line.gsub(/#{Rails.root}/, "")
102
103
  }.join("\n"))
103
104
  end
104
105
  end
@@ -34,32 +34,23 @@ module Alchemy
34
34
  #
35
35
  # Disabling the page caching is strongly recommended!
36
36
  #
37
- # The editor view for your element should have this layout:
38
- #
39
- # <%= element_editor_for(element) do |el| %>
40
- # <%= el.edit :mail_from %>
41
- # <%= el.edit :mail_to %>
42
- # <%= el.edit :subject %>
43
- # <%= el.edit :success_page %>
44
- # <% end %>
45
- #
46
37
  # Please have a look at the +alchemy/config/config.yml+ file for further Message settings.
47
38
  #
48
39
  class MessagesController < Alchemy::BaseController
49
40
  before_action :get_page, except: :create
50
41
 
51
- helper 'alchemy/pages'
42
+ helper "alchemy/pages"
52
43
 
53
44
  def index #:nodoc:
54
45
  redirect_to show_page_path(
55
46
  urlname: @page.urlname,
56
- locale: prefix_locale? ? @page.language_code : nil
47
+ locale: prefix_locale? ? @page.language_code : nil,
57
48
  )
58
49
  end
59
50
 
60
51
  def new #:nodoc:
61
52
  @message = Message.new
62
- render template: 'alchemy/pages/show'
53
+ render template: "alchemy/pages/show"
63
54
  end
64
55
 
65
56
  def create #:nodoc:
@@ -69,13 +60,14 @@ module Alchemy
69
60
  if @element.nil?
70
61
  raise ActiveRecord::RecordNotFound, "Contact form id not found. Please pass the :contact_form_id in a hidden field. Example: <%= f.hidden_field :contact_form_id, value: element.id %>"
71
62
  end
63
+
72
64
  @page = @element.page
73
65
  @root_page = @page.get_language_root
74
66
  if @message.valid?
75
67
  MessagesMailer.contact_form_mail(@message, mail_to, mail_from, subject).deliver
76
68
  redirect_to_success_page
77
69
  else
78
- render template: 'alchemy/pages/show'
70
+ render template: "alchemy/pages/show"
79
71
  end
80
72
  end
81
73
 
@@ -86,29 +78,29 @@ module Alchemy
86
78
  end
87
79
 
88
80
  def mail_to
89
- @element.ingredient(:mail_to) || mailer_config['mail_to']
81
+ @element.ingredient(:mail_to) || mailer_config["mail_to"]
90
82
  end
91
83
 
92
84
  def mail_from
93
- @element.ingredient(:mail_from) || mailer_config['mail_from']
85
+ @element.ingredient(:mail_from) || mailer_config["mail_from"]
94
86
  end
95
87
 
96
88
  def subject
97
- @element.ingredient(:subject) || mailer_config['subject']
89
+ @element.ingredient(:subject) || mailer_config["subject"]
98
90
  end
99
91
 
100
92
  def redirect_to_success_page
101
- flash[:notice] = Alchemy.t(:success, scope: 'contactform.messages')
93
+ flash[:notice] = Alchemy.t(:success, scope: "contactform.messages")
102
94
  if success_page
103
95
  urlname = success_page_urlname
104
- elsif mailer_config['forward_to_page'] && mailer_config['mail_success_page']
105
- urlname = Page.find_by(urlname: mailer_config['mail_success_page']).urlname
96
+ elsif mailer_config["forward_to_page"] && mailer_config["mail_success_page"]
97
+ urlname = Page.find_by(urlname: mailer_config["mail_success_page"]).urlname
106
98
  else
107
99
  urlname = Language.current_root_page.urlname
108
100
  end
109
101
  redirect_to show_page_path(
110
102
  urlname: urlname,
111
- locale: prefix_locale? ? Language.current.code : nil
103
+ locale: prefix_locale? ? Language.current.code : nil,
112
104
  )
113
105
  end
114
106
 
@@ -126,15 +118,16 @@ module Alchemy
126
118
  end
127
119
 
128
120
  def get_page
129
- @page = Language.current.pages.find_by(page_layout: mailer_config['page_layout_name'])
121
+ @page = Language.current.pages.find_by(page_layout: mailer_config["page_layout_name"])
130
122
  if @page.blank?
131
- raise "Page for page_layout #{mailer_config['page_layout_name']} not found"
123
+ raise "Page for page_layout #{mailer_config["page_layout_name"]} not found"
132
124
  end
125
+
133
126
  @root_page = @page.get_language_root
134
127
  end
135
128
 
136
129
  def message_params
137
- params.require(:message).permit(*mailer_config['fields'])
130
+ params.require(:message).permit(*mailer_config["fields"])
138
131
  end
139
132
  end
140
133
  end
@@ -3,10 +3,10 @@
3
3
  module Alchemy
4
4
  class PagesController < Alchemy::BaseController
5
5
  SHOW_PAGE_PARAMS_KEYS = [
6
- 'action',
7
- 'controller',
8
- 'urlname',
9
- 'locale'
6
+ "action",
7
+ "controller",
8
+ "urlname",
9
+ "locale",
10
10
  ]
11
11
 
12
12
  include OnPageLayout::CallbacksRunner
@@ -78,7 +78,7 @@ module Alchemy
78
78
  def sitemap
79
79
  @pages = Page.sitemap
80
80
  respond_to do |format|
81
- format.xml { render layout: 'alchemy/sitemap' }
81
+ format.xml { render layout: "alchemy/sitemap" }
82
82
  end
83
83
  end
84
84
 
@@ -95,7 +95,7 @@ module Alchemy
95
95
  #
96
96
  def load_index_page
97
97
  @page ||= Language.current_root_page
98
- render template: 'alchemy/welcome', layout: false if signup_required?
98
+ render template: "alchemy/welcome", layout: false if signup_required?
99
99
  end
100
100
 
101
101
  # == Loads page by urlname
@@ -108,9 +108,11 @@ module Alchemy
108
108
  # @return NilClass
109
109
  #
110
110
  def load_page
111
+ page_not_found! unless Language.current
112
+
111
113
  @page ||= Language.current.pages.contentpages.find_by(
112
114
  urlname: params[:urlname],
113
- language_code: params[:locale] || Language.current.code
115
+ language_code: params[:locale] || Language.current.code,
114
116
  )
115
117
  end
116
118
 
@@ -148,7 +150,7 @@ module Alchemy
148
150
  if @page.contains_feed?
149
151
  render action: :show, layout: false, handlers: [:builder]
150
152
  else
151
- render xml: {error: 'Not found'}, status: 404
153
+ render xml: { error: "Not found" }, status: 404
152
154
  end
153
155
  end
154
156
  end
@@ -191,9 +193,9 @@ module Alchemy
191
193
  #
192
194
  def render_fresh_page?
193
195
  must_not_cache? || stale?(etag: page_etag,
194
- last_modified: @page.published_at,
195
- public: !@page.restricted,
196
- template: 'pages/show')
196
+ last_modified: @page.published_at,
197
+ public: !@page.restricted,
198
+ template: "pages/show")
197
199
  end
198
200
 
199
201
  # don't cache pages if we have flash message to display or the page has caching disabled