alchemy_cms 5.2.4 → 6.0.0.b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +6 -14
  3. data/.gitignore +0 -1
  4. data/.hound.yml +1 -1
  5. data/.rubocop.yml +46 -4
  6. data/CHANGELOG.md +80 -25
  7. data/Gemfile +4 -2
  8. data/README.md +5 -2
  9. data/alchemy_cms.gemspec +78 -65
  10. data/app/assets/javascripts/alchemy/admin.js +0 -2
  11. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -27
  12. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -1
  13. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -25
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -0
  17. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +1 -1
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +3 -1
  19. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +40 -27
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  22. data/app/assets/stylesheets/alchemy/admin.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/archive.scss +4 -4
  24. data/app/assets/stylesheets/alchemy/buttons.scss +0 -4
  25. data/app/assets/stylesheets/alchemy/elements.scss +73 -61
  26. data/app/assets/stylesheets/alchemy/images.scss +8 -0
  27. data/app/assets/stylesheets/alchemy/node-select.scss +4 -3
  28. data/app/assets/stylesheets/alchemy/page-select.scss +1 -0
  29. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +6 -6
  30. data/app/controllers/alchemy/admin/attachments_controller.rb +6 -2
  31. data/app/controllers/alchemy/admin/base_controller.rb +5 -7
  32. data/app/controllers/alchemy/admin/elements_controller.rb +58 -34
  33. data/app/controllers/alchemy/admin/essence_audios_controller.rb +30 -0
  34. data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -14
  35. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -79
  36. data/app/controllers/alchemy/admin/essence_videos_controller.rb +33 -0
  37. data/app/controllers/alchemy/admin/ingredients_controller.rb +30 -0
  38. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -1
  39. data/app/controllers/alchemy/admin/pages_controller.rb +6 -13
  40. data/app/controllers/alchemy/admin/pictures_controller.rb +35 -9
  41. data/app/controllers/alchemy/api/elements_controller.rb +10 -5
  42. data/app/controllers/alchemy/api/pages_controller.rb +2 -4
  43. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +13 -3
  44. data/app/controllers/concerns/alchemy/admin/crop_action.rb +26 -0
  45. data/app/decorators/alchemy/element_editor.rb +23 -1
  46. data/app/decorators/alchemy/ingredient_editor.rb +154 -0
  47. data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
  48. data/app/helpers/alchemy/admin/essences_helper.rb +1 -1
  49. data/app/helpers/alchemy/admin/ingredients_helper.rb +42 -0
  50. data/app/helpers/alchemy/elements_block_helper.rb +22 -7
  51. data/app/helpers/alchemy/elements_helper.rb +12 -5
  52. data/app/helpers/alchemy/pages_helper.rb +3 -11
  53. data/app/jobs/alchemy/base_job.rb +11 -0
  54. data/app/jobs/alchemy/publish_page_job.rb +11 -0
  55. data/app/models/alchemy/attachment.rb +1 -1
  56. data/app/models/alchemy/content/factory.rb +23 -27
  57. data/app/models/alchemy/content.rb +1 -6
  58. data/app/models/alchemy/element/definitions.rb +29 -27
  59. data/app/models/alchemy/element/element_contents.rb +131 -122
  60. data/app/models/alchemy/element/element_essences.rb +100 -98
  61. data/app/models/alchemy/element/element_ingredients.rb +176 -0
  62. data/app/models/alchemy/element/presenters.rb +89 -87
  63. data/app/models/alchemy/element.rb +40 -73
  64. data/app/models/alchemy/elements_repository.rb +126 -0
  65. data/app/models/alchemy/essence_audio.rb +12 -0
  66. data/app/models/alchemy/essence_headline.rb +40 -0
  67. data/app/models/alchemy/essence_picture.rb +4 -116
  68. data/app/models/alchemy/essence_richtext.rb +12 -0
  69. data/app/models/alchemy/essence_video.rb +12 -0
  70. data/app/models/alchemy/image_cropper_settings.rb +87 -0
  71. data/app/models/alchemy/ingredient.rb +219 -0
  72. data/app/models/alchemy/ingredient_validator.rb +97 -0
  73. data/app/models/alchemy/ingredients/audio.rb +29 -0
  74. data/app/models/alchemy/ingredients/boolean.rb +21 -0
  75. data/app/models/alchemy/ingredients/datetime.rb +20 -0
  76. data/app/models/alchemy/ingredients/file.rb +30 -0
  77. data/app/models/alchemy/ingredients/headline.rb +42 -0
  78. data/app/models/alchemy/ingredients/html.rb +19 -0
  79. data/app/models/alchemy/ingredients/link.rb +16 -0
  80. data/app/models/alchemy/ingredients/node.rb +23 -0
  81. data/app/models/alchemy/ingredients/page.rb +23 -0
  82. data/app/models/alchemy/ingredients/picture.rb +41 -0
  83. data/app/models/alchemy/ingredients/richtext.rb +57 -0
  84. data/app/models/alchemy/ingredients/select.rb +10 -0
  85. data/app/models/alchemy/ingredients/text.rb +17 -0
  86. data/app/models/alchemy/ingredients/video.rb +33 -0
  87. data/app/models/alchemy/language.rb +0 -11
  88. data/app/models/alchemy/node.rb +1 -1
  89. data/app/models/alchemy/page/fixed_attributes.rb +53 -51
  90. data/app/models/alchemy/page/page_elements.rb +186 -205
  91. data/app/models/alchemy/page/page_naming.rb +66 -64
  92. data/app/models/alchemy/page/page_natures.rb +139 -142
  93. data/app/models/alchemy/page/page_scopes.rb +113 -102
  94. data/app/models/alchemy/page/publisher.rb +50 -0
  95. data/app/models/alchemy/page/url_path.rb +1 -1
  96. data/app/models/alchemy/page.rb +67 -33
  97. data/app/models/alchemy/page_version.rb +58 -0
  98. data/app/models/alchemy/picture/calculations.rb +2 -8
  99. data/app/models/alchemy/picture/preprocessor.rb +2 -0
  100. data/app/models/alchemy/picture/transformations.rb +24 -96
  101. data/app/models/alchemy/picture.rb +4 -2
  102. data/app/models/concerns/alchemy/picture_thumbnails.rb +181 -0
  103. data/app/models/concerns/alchemy/touch_elements.rb +2 -2
  104. data/app/presenters/alchemy/picture_view.rb +88 -0
  105. data/app/serializers/alchemy/element_serializer.rb +5 -0
  106. data/app/serializers/alchemy/page_tree_serializer.rb +3 -2
  107. data/app/services/alchemy/delete_elements.rb +44 -0
  108. data/app/services/alchemy/duplicate_element.rb +56 -0
  109. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  110. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -3
  111. data/app/views/alchemy/admin/attachments/assign.js.erb +11 -0
  112. data/app/views/alchemy/admin/crop.html.erb +36 -0
  113. data/app/views/alchemy/admin/elements/_element.html.erb +14 -10
  114. data/app/views/alchemy/admin/elements/{_element_footer.html.erb → _footer.html.erb} +0 -0
  115. data/app/views/alchemy/admin/elements/{_new_element_form.html.erb → _form.html.erb} +1 -1
  116. data/app/views/alchemy/admin/elements/{_element_header.html.erb → _header.html.erb} +1 -1
  117. data/app/views/alchemy/admin/elements/{_element_toolbar.html.erb → _toolbar.html.erb} +5 -6
  118. data/app/views/alchemy/admin/elements/{trash.js.erb → destroy.js.erb} +1 -3
  119. data/app/views/alchemy/admin/elements/new.html.erb +3 -3
  120. data/app/views/alchemy/admin/elements/order.js.erb +0 -17
  121. data/app/views/alchemy/admin/elements/update.js.erb +3 -2
  122. data/app/views/alchemy/admin/essence_audios/edit.html.erb +7 -0
  123. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -1
  124. data/app/views/alchemy/admin/essence_videos/edit.html.erb +11 -0
  125. data/app/views/alchemy/admin/ingredients/_audio_fields.html.erb +4 -0
  126. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +18 -0
  127. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +25 -0
  128. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +8 -0
  129. data/app/views/alchemy/admin/ingredients/edit.html.erb +4 -0
  130. data/app/views/alchemy/admin/layoutpages/edit.html.erb +0 -5
  131. data/app/views/alchemy/admin/nodes/_node.html.erb +2 -2
  132. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +1 -1
  133. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  134. data/app/views/alchemy/admin/pages/_file_link.html.erb +1 -1
  135. data/app/views/alchemy/admin/pages/_form.html.erb +0 -6
  136. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  137. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +5 -2
  138. data/app/views/alchemy/admin/pages/edit.html.erb +36 -24
  139. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -4
  140. data/app/views/alchemy/admin/partials/_routes.html.erb +7 -11
  141. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +4 -8
  142. data/app/views/alchemy/admin/pictures/_infos.html.erb +0 -1
  143. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +4 -4
  144. data/app/views/alchemy/admin/pictures/assign.js.erb +10 -0
  145. data/app/views/alchemy/admin/resources/_form.html.erb +1 -0
  146. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +4 -0
  147. data/app/views/alchemy/essences/_essence_audio_view.html.erb +15 -0
  148. data/app/views/alchemy/essences/_essence_file_editor.html.erb +15 -6
  149. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +36 -0
  150. data/app/views/alchemy/essences/_essence_headline_view.html.erb +10 -0
  151. data/app/views/alchemy/essences/_essence_link_editor.html.erb +8 -4
  152. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +27 -12
  153. data/app/views/alchemy/essences/_essence_text_editor.html.erb +12 -4
  154. data/app/views/alchemy/essences/_essence_video_editor.html.erb +4 -0
  155. data/app/views/alchemy/essences/_essence_video_view.html.erb +18 -0
  156. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +21 -16
  157. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +2 -2
  158. data/app/views/alchemy/ingredients/_audio_editor.html.erb +5 -0
  159. data/app/views/alchemy/ingredients/_audio_view.html.erb +14 -0
  160. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +11 -0
  161. data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -0
  162. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +17 -0
  163. data/app/views/alchemy/ingredients/_datetime_view.html.erb +9 -0
  164. data/app/views/alchemy/ingredients/_file_editor.html.erb +50 -0
  165. data/app/views/alchemy/ingredients/_file_view.html.erb +17 -0
  166. data/app/views/alchemy/ingredients/_headline_editor.html.erb +30 -0
  167. data/app/views/alchemy/ingredients/_headline_view.html.erb +9 -0
  168. data/app/views/alchemy/ingredients/_html_editor.html.erb +8 -0
  169. data/app/views/alchemy/ingredients/_html_view.html.erb +1 -0
  170. data/app/views/alchemy/ingredients/_link_editor.html.erb +24 -0
  171. data/app/views/alchemy/ingredients/_link_view.html.erb +9 -0
  172. data/app/views/alchemy/ingredients/_node_editor.html.erb +25 -0
  173. data/app/views/alchemy/ingredients/_node_view.html.erb +1 -0
  174. data/app/views/alchemy/ingredients/_page_editor.html.erb +24 -0
  175. data/app/views/alchemy/ingredients/_page_view.html.erb +4 -0
  176. data/app/views/alchemy/ingredients/_picture_editor.html.erb +59 -0
  177. data/app/views/alchemy/ingredients/_picture_view.html.erb +5 -0
  178. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +12 -0
  179. data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -0
  180. data/app/views/alchemy/ingredients/_select_editor.html.erb +29 -0
  181. data/app/views/alchemy/ingredients/_select_view.html.erb +1 -0
  182. data/app/views/alchemy/ingredients/_text_editor.html.erb +19 -0
  183. data/app/views/alchemy/ingredients/_text_view.html.erb +16 -0
  184. data/app/views/alchemy/ingredients/_video_editor.html.erb +5 -0
  185. data/app/views/alchemy/ingredients/_video_view.html.erb +17 -0
  186. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +20 -0
  187. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +57 -0
  188. data/config/brakeman.ignore +66 -159
  189. data/config/initializers/dragonfly.rb +10 -0
  190. data/config/locales/alchemy.en.yml +23 -15
  191. data/config/routes.rb +17 -22
  192. data/db/migrate/20201207131309_create_page_versions.rb +19 -0
  193. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +76 -0
  194. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +10 -0
  195. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +7 -0
  196. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +12 -0
  197. data/db/migrate/20210506135919_create_essence_audios.rb +19 -0
  198. data/db/migrate/20210506140258_create_essence_videos.rb +23 -0
  199. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +22 -0
  200. data/lib/alchemy/admin/preview_url.rb +2 -0
  201. data/lib/alchemy/deprecation.rb +1 -1
  202. data/lib/alchemy/dragonfly/processors/auto_orient.rb +18 -0
  203. data/lib/alchemy/dragonfly/processors/crop_resize.rb +35 -0
  204. data/lib/alchemy/elements_finder.rb +14 -60
  205. data/lib/alchemy/engine.rb +1 -1
  206. data/lib/alchemy/essence.rb +1 -2
  207. data/lib/alchemy/hints.rb +8 -4
  208. data/lib/alchemy/page_layout.rb +0 -13
  209. data/lib/alchemy/permissions.rb +30 -29
  210. data/lib/alchemy/resource.rb +13 -3
  211. data/lib/alchemy/tasks/tidy.rb +29 -0
  212. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -1
  213. data/lib/alchemy/test_support/factories/element_factory.rb +8 -8
  214. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +7 -0
  215. data/lib/alchemy/test_support/factories/essence_video_factory.rb +7 -0
  216. data/lib/alchemy/test_support/factories/ingredient_factory.rb +25 -0
  217. data/lib/alchemy/test_support/factories/page_factory.rb +20 -1
  218. data/lib/alchemy/test_support/factories/page_version_factory.rb +23 -0
  219. data/lib/alchemy/test_support/having_crop_action_examples.rb +170 -0
  220. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +646 -0
  221. data/lib/alchemy/test_support/shared_ingredient_editor_examples.rb +21 -0
  222. data/lib/alchemy/test_support/shared_ingredient_examples.rb +57 -0
  223. data/lib/alchemy/test_support.rb +2 -11
  224. data/lib/alchemy/tinymce.rb +17 -0
  225. data/lib/alchemy/upgrader/five_point_zero.rb +0 -32
  226. data/lib/alchemy/upgrader/six_point_zero.rb +21 -0
  227. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +33 -0
  228. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +51 -0
  229. data/lib/alchemy/version.rb +1 -1
  230. data/lib/generators/alchemy/elements/elements_generator.rb +1 -0
  231. data/lib/generators/alchemy/elements/templates/view.html.erb +9 -0
  232. data/lib/generators/alchemy/elements/templates/view.html.haml +9 -0
  233. data/lib/generators/alchemy/elements/templates/view.html.slim +9 -0
  234. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +38 -0
  235. data/lib/generators/alchemy/ingredient/templates/editor.html.erb +14 -0
  236. data/lib/generators/alchemy/ingredient/templates/model.rb.tt +13 -0
  237. data/lib/generators/alchemy/ingredient/templates/view.html.erb +1 -0
  238. data/lib/generators/alchemy/install/install_generator.rb +1 -2
  239. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +1 -1
  240. data/lib/generators/alchemy/menus/templates/node.html.erb +1 -1
  241. data/lib/generators/alchemy/menus/templates/node.html.haml +1 -1
  242. data/lib/generators/alchemy/menus/templates/node.html.slim +1 -1
  243. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  244. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  245. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  246. data/lib/tasks/alchemy/tidy.rake +12 -0
  247. data/lib/tasks/alchemy/upgrade.rake +21 -15
  248. data/package/admin.js +9 -1
  249. data/package/src/file_editors.js +28 -0
  250. data/package/src/image_cropper.js +103 -0
  251. data/package/src/image_loader.js +58 -0
  252. data/package/src/node_tree.js +5 -5
  253. data/package/src/picture_editors.js +169 -0
  254. data/package/src/utils/__tests__/ajax.spec.js +20 -12
  255. data/package/src/utils/ajax.js +8 -3
  256. data/package.json +3 -2
  257. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +3 -18
  258. data/vendor/assets/stylesheets/jquery.Jcrop.min.scss +2 -28
  259. metadata +285 -56
  260. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +0 -44
  261. data/app/assets/javascripts/alchemy/alchemy.trash_window.js.coffee +0 -30
  262. data/app/assets/stylesheets/alchemy/trash.scss +0 -8
  263. data/app/controllers/alchemy/admin/trash_controller.rb +0 -44
  264. data/app/views/alchemy/admin/essence_files/assign.js.erb +0 -3
  265. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -4
  266. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +0 -48
  267. data/app/views/alchemy/admin/trash/clear.js.erb +0 -4
  268. data/app/views/alchemy/admin/trash/index.html.erb +0 -31
  269. data/lib/alchemy/test_support/factories.rb +0 -20
@@ -3,19 +3,19 @@
3
3
  {
4
4
  "warning_type": "Cross-Site Scripting",
5
5
  "warning_code": 2,
6
- "fingerprint": "0551e3f9180b85fca4b17fe3c7cbbac1611d2ef8d385f77e9445c562c471d688",
6
+ "fingerprint": "068b12d24047e2ece633115ba065ce46fc8c8a26827be7de2565ab721e1c2e82",
7
7
  "check_name": "CrossSiteScripting",
8
8
  "message": "Unescaped parameter value",
9
9
  "file": "app/views/alchemy/admin/elements/update.js.erb",
10
- "line": 18,
10
+ "line": 21,
11
11
  "link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
12
- "code": "j(Element.find(params[:id]).essence_error_messages.join(\"</li><li>\"))",
12
+ "code": "Element.find(params[:id]).ingredients_with_errors.map do\n \"[data-ingredient-id=\\\"#{ingredient.id}\\\"]\"\n end.join(\", \")",
13
13
  "render_path": [
14
14
  {
15
15
  "type": "controller",
16
16
  "class": "Alchemy::Admin::ElementsController",
17
17
  "method": "update",
18
- "line": 55,
18
+ "line": 61,
19
19
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
20
20
  "rendered": {
21
21
  "name": "alchemy/admin/elements/update",
@@ -38,7 +38,7 @@
38
38
  "check_name": "SendFile",
39
39
  "message": "Parameter value used in file name",
40
40
  "file": "app/controllers/alchemy/admin/attachments_controller.rb",
41
- "line": 65,
41
+ "line": 69,
42
42
  "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
43
43
  "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type)",
44
44
  "render_path": null,
@@ -71,130 +71,6 @@
71
71
  "confidence": "Medium",
72
72
  "note": "Because we actually can't know all attributes each inheriting controller supports, we permit all resource model params. It is adviced that all inheriting controllers implement this method and provide its own set of permitted attributes. As this all happens inside the password protected /admin namespace this can be considered a false positive."
73
73
  },
74
- {
75
- "warning_type": "Cross-Site Scripting",
76
- "warning_code": 2,
77
- "fingerprint": "293a6f5581ba3f0e7aa4f81b38d68baf21f1219c8f3bae3eca6b3e1776b734df",
78
- "check_name": "CrossSiteScripting",
79
- "message": "Unescaped parameter value",
80
- "file": "app/views/alchemy/admin/elements/order.js.erb",
81
- "line": 17,
82
- "link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
83
- "code": "Element.trashed.where(:id => params[:element_ids]).pluck(:id).collect do\n \"#element_area [data-element-id=\\\"#{id}\\\"]\"\n end.join(\", \")",
84
- "render_path": [
85
- {
86
- "type": "controller",
87
- "class": "Alchemy::Admin::ElementsController",
88
- "method": "order",
89
- "line": 78,
90
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
91
- "rendered": {
92
- "name": "alchemy/admin/elements/order",
93
- "file": "app/views/alchemy/admin/elements/order.js.erb"
94
- }
95
- }
96
- ],
97
- "location": {
98
- "type": "template",
99
- "template": "alchemy/admin/elements/order"
100
- },
101
- "user_input": "params[:element_ids]",
102
- "confidence": "Weak",
103
- "note": ""
104
- },
105
- {
106
- "warning_type": "Dynamic Render Path",
107
- "warning_code": 15,
108
- "fingerprint": "2eb67abb2b025c3446afa2f9b8d48c6b6a05379234a9228c9af4c25b7e672b00",
109
- "check_name": "Render",
110
- "message": "Render path contains parameter value",
111
- "file": "app/views/alchemy/admin/elements/index.html.erb",
112
- "line": 18,
113
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
114
- "code": "render(action => Page.find(params[:page_id]).all_elements.not_nested.unfixed.not_trashed.includes(*element_includes).map do\n Alchemy::ElementEditor.new(element)\n end, {})",
115
- "render_path": [
116
- {
117
- "type": "controller",
118
- "class": "Alchemy::Admin::ElementsController",
119
- "method": "index",
120
- "line": 13,
121
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
122
- "rendered": {
123
- "name": "alchemy/admin/elements/index",
124
- "file": "app/views/alchemy/admin/elements/index.html.erb"
125
- }
126
- }
127
- ],
128
- "location": {
129
- "type": "template",
130
- "template": "alchemy/admin/elements/index"
131
- },
132
- "user_input": "params[:page_id]",
133
- "confidence": "Weak",
134
- "note": ""
135
- },
136
- {
137
- "warning_type": "Dynamic Render Path",
138
- "warning_code": 15,
139
- "fingerprint": "2eb67abb2b025c3446afa2f9b8d48c6b6a05379234a9228c9af4c25b7e672b00",
140
- "check_name": "Render",
141
- "message": "Render path contains parameter value",
142
- "file": "app/views/alchemy/admin/elements/index.html.erb",
143
- "line": 31,
144
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
145
- "code": "render(action => Page.find(params[:page_id]).all_elements.not_nested.unfixed.not_trashed.includes(*element_includes).map do\n Alchemy::ElementEditor.new(element)\n end, {})",
146
- "render_path": [
147
- {
148
- "type": "controller",
149
- "class": "Alchemy::Admin::ElementsController",
150
- "method": "index",
151
- "line": 13,
152
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
153
- "rendered": {
154
- "name": "alchemy/admin/elements/index",
155
- "file": "app/views/alchemy/admin/elements/index.html.erb"
156
- }
157
- }
158
- ],
159
- "location": {
160
- "type": "template",
161
- "template": "alchemy/admin/elements/index"
162
- },
163
- "user_input": "params[:page_id]",
164
- "confidence": "Weak",
165
- "note": ""
166
- },
167
- {
168
- "warning_type": "Dynamic Render Path",
169
- "warning_code": 15,
170
- "fingerprint": "2fa9bf5c73b4e6e3c272f0b14635f96efbd763e9a2c5b785caefffe3589ac461",
171
- "check_name": "Render",
172
- "message": "Render path contains parameter value",
173
- "file": "app/views/alchemy/admin/essence_pictures/assign.js.erb",
174
- "line": 2,
175
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
176
- "code": "render(action => Alchemy::ContentEditor.new(Content.find(params[:content_id])), {})",
177
- "render_path": [
178
- {
179
- "type": "controller",
180
- "class": "Alchemy::Admin::EssencePicturesController",
181
- "method": "assign",
182
- "line": 49,
183
- "file": "app/controllers/alchemy/admin/essence_pictures_controller.rb",
184
- "rendered": {
185
- "name": "alchemy/admin/essence_pictures/assign",
186
- "file": "app/views/alchemy/admin/essence_pictures/assign.js.erb"
187
- }
188
- }
189
- ],
190
- "location": {
191
- "type": "template",
192
- "template": "alchemy/admin/essence_pictures/assign"
193
- },
194
- "user_input": "params[:content_id]",
195
- "confidence": "Weak",
196
- "note": ""
197
- },
198
74
  {
199
75
  "warning_type": "Dynamic Render Path",
200
76
  "warning_code": 15,
@@ -210,7 +86,7 @@
210
86
  "type": "controller",
211
87
  "class": "Alchemy::Admin::ElementsController",
212
88
  "method": "fold",
213
- "line": 95,
89
+ "line": 97,
214
90
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
215
91
  "rendered": {
216
92
  "name": "alchemy/admin/elements/fold",
@@ -233,7 +109,7 @@
233
109
  "check_name": "MassAssignment",
234
110
  "message": "Specify exact keys allowed for mass assignment instead of using `permit!` which allows any keys",
235
111
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
236
- "line": 146,
112
+ "line": 150,
237
113
  "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
238
114
  "code": "params.fetch(:contents, {}).permit!",
239
115
  "render_path": null,
@@ -297,57 +173,88 @@
297
173
  "note": ""
298
174
  },
299
175
  {
300
- "warning_type": "File Access",
301
- "warning_code": 16,
302
- "fingerprint": "a1197cfa89e3a66e6d10ee060cd87af97d5e978d6d93b5936eb987288f1c02e6",
303
- "check_name": "SendFile",
304
- "message": "Parameter value used in file name",
305
- "file": "app/controllers/alchemy/attachments_controller.rb",
306
- "line": 12,
307
- "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
308
- "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type, :disposition => \"inline\")",
309
- "render_path": null,
176
+ "warning_type": "Dynamic Render Path",
177
+ "warning_code": 15,
178
+ "fingerprint": "80b9b11d658cd393c549d568b3655c62566862f55b2fa16ed688de7c2e9343ac",
179
+ "check_name": "Render",
180
+ "message": "Render path contains parameter value",
181
+ "file": "app/views/alchemy/admin/elements/index.html.erb",
182
+ "line": 18,
183
+ "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
184
+ "code": "render(action => PageVersion.find(params[:page_version_id]).elements.order(:position).includes(*element_includes).not_nested.unfixed.map do\n Alchemy::ElementEditor.new(element)\n end, {})",
185
+ "render_path": [
186
+ {
187
+ "type": "controller",
188
+ "class": "Alchemy::Admin::ElementsController",
189
+ "method": "index",
190
+ "line": 15,
191
+ "file": "app/controllers/alchemy/admin/elements_controller.rb",
192
+ "rendered": {
193
+ "name": "alchemy/admin/elements/index",
194
+ "file": "app/views/alchemy/admin/elements/index.html.erb"
195
+ }
196
+ }
197
+ ],
310
198
  "location": {
311
- "type": "method",
312
- "class": "Alchemy::AttachmentsController",
313
- "method": "show"
199
+ "type": "template",
200
+ "template": "alchemy/admin/elements/index"
314
201
  },
315
- "user_input": "params[:id]",
202
+ "user_input": "params[:page_version_id]",
316
203
  "confidence": "Weak",
317
204
  "note": ""
318
205
  },
319
206
  {
320
207
  "warning_type": "Dynamic Render Path",
321
208
  "warning_code": 15,
322
- "fingerprint": "b9f63fd46d0ebd6684b649ab260f27df8a6422d44fed4769273d8e6a6a30397c",
209
+ "fingerprint": "80b9b11d658cd393c549d568b3655c62566862f55b2fa16ed688de7c2e9343ac",
323
210
  "check_name": "Render",
324
211
  "message": "Render path contains parameter value",
325
- "file": "app/views/alchemy/admin/essence_files/assign.js.erb",
326
- "line": 1,
212
+ "file": "app/views/alchemy/admin/elements/index.html.erb",
213
+ "line": 31,
327
214
  "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
328
- "code": "render(action => Alchemy::ContentEditor.new(Content.find_by(:id => params[:content_id])), {})",
215
+ "code": "render(action => PageVersion.find(params[:page_version_id]).elements.order(:position).includes(*element_includes).not_nested.unfixed.map do\n Alchemy::ElementEditor.new(element)\n end, {})",
329
216
  "render_path": [
330
217
  {
331
218
  "type": "controller",
332
- "class": "Alchemy::Admin::EssenceFilesController",
333
- "method": "assign",
334
- "line": 32,
335
- "file": "app/controllers/alchemy/admin/essence_files_controller.rb",
219
+ "class": "Alchemy::Admin::ElementsController",
220
+ "method": "index",
221
+ "line": 15,
222
+ "file": "app/controllers/alchemy/admin/elements_controller.rb",
336
223
  "rendered": {
337
- "name": "alchemy/admin/essence_files/assign",
338
- "file": "app/views/alchemy/admin/essence_files/assign.js.erb"
224
+ "name": "alchemy/admin/elements/index",
225
+ "file": "app/views/alchemy/admin/elements/index.html.erb"
339
226
  }
340
227
  }
341
228
  ],
342
229
  "location": {
343
230
  "type": "template",
344
- "template": "alchemy/admin/essence_files/assign"
231
+ "template": "alchemy/admin/elements/index"
345
232
  },
346
- "user_input": "params[:content_id]",
233
+ "user_input": "params[:page_version_id]",
234
+ "confidence": "Weak",
235
+ "note": ""
236
+ },
237
+ {
238
+ "warning_type": "File Access",
239
+ "warning_code": 16,
240
+ "fingerprint": "a1197cfa89e3a66e6d10ee060cd87af97d5e978d6d93b5936eb987288f1c02e6",
241
+ "check_name": "SendFile",
242
+ "message": "Parameter value used in file name",
243
+ "file": "app/controllers/alchemy/attachments_controller.rb",
244
+ "line": 12,
245
+ "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
246
+ "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type, :disposition => \"inline\")",
247
+ "render_path": null,
248
+ "location": {
249
+ "type": "method",
250
+ "class": "Alchemy::AttachmentsController",
251
+ "method": "show"
252
+ },
253
+ "user_input": "params[:id]",
347
254
  "confidence": "Weak",
348
255
  "note": ""
349
256
  }
350
257
  ],
351
- "updated": "2021-01-04 16:29:42 +0100",
352
- "brakeman_version": "4.10.1"
258
+ "updated": "2021-06-29 20:56:10 +0200",
259
+ "brakeman_version": "5.0.1"
353
260
  }
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "dragonfly_svg"
3
+ require "alchemy/dragonfly/processors/crop_resize"
4
+ require "alchemy/dragonfly/processors/auto_orient"
3
5
 
4
6
  # Logger
5
7
  Dragonfly.logger = Rails.logger
@@ -9,3 +11,11 @@ if defined?(ActiveRecord::Base)
9
11
  ActiveRecord::Base.extend Dragonfly::Model
10
12
  ActiveRecord::Base.extend Dragonfly::Model::Validations
11
13
  end
14
+
15
+ # Dragonfly 1.4.0 only allows `quality` as argument to `encode`
16
+ Dragonfly::ImageMagick::Processors::Encode::WHITELISTED_ARGS << "flatten"
17
+
18
+ Rails.application.config.after_initialize do
19
+ Dragonfly.app(:alchemy_pictures).add_processor(:crop_resize, Alchemy::Dragonfly::Processors::CropResize.new)
20
+ Dragonfly.app(:alchemy_pictures).add_processor(:auto_orient, Alchemy::Dragonfly::Processors::AutoOrient.new)
21
+ end
@@ -89,6 +89,11 @@ en:
89
89
  right: 'Right from text'
90
90
  no_float: 'Above the text'
91
91
 
92
+ ingredient_values:
93
+ boolean:
94
+ true: "True"
95
+ false: "False"
96
+
92
97
  # == Contactform translations
93
98
  contactform:
94
99
  labels:
@@ -194,7 +199,6 @@ en:
194
199
  'An error happened': 'An error happened'
195
200
  "Change password": "Change password"
196
201
  "Choose page": "Choose page"
197
- "Cleared trash": "Cleared trash"
198
202
  "Clear selection": "Clear selection"
199
203
  "Forgot your password?": "Forgot your password?"
200
204
  "Clipboard": "Clipboard"
@@ -204,15 +208,14 @@ en:
204
208
  "Currently locked pages": "Currently locked pages"
205
209
  "Default language has to be public": "Default language has to be public"
206
210
  "Delete image": "Delete image"
211
+ "Delete element": "Delete element"
207
212
  "Do you really want to clear the clipboard?": "Do you really want to clear the clipboard?"
208
- "Do you really want to clear the trash?": "Do you really want to clear the trash?"
209
213
  "Do you really want to delete this content?": "Do you really want to delete this content?"
210
214
  "Drag an element over to the element window to restore it": "Drag an element over to the element window to restore it"
211
215
  "Edit Picturemask": "Edit picturemask"
212
216
  "Edit image": "Edit image"
213
217
  "Edit multiple pictures": "Edit multiple pictures"
214
218
  "Elements": "Elements"
215
- "Element trashed": "Element trashed"
216
219
  "Error with the Flash® Uploader!": "Error with the Flash® Uploader!"
217
220
  "Excerpt": "Excerpt"
218
221
  "File successfully updated": "File successfully updated"
@@ -268,7 +271,6 @@ en:
268
271
  "Please log in": "Please log in."
269
272
  "Please seperate the tags with commata": "* Please seperate the tags with commas."
270
273
  "Properties": "Properties"
271
- "Publish page": "Publish page"
272
274
  "Read the License": "Read the License"
273
275
  "Redirects to": "Redirects to"
274
276
  "Reload Preview": "Reload Preview"
@@ -287,7 +289,6 @@ en:
287
289
  "Show clipboard": "Show clipboard"
288
290
  "Copied to clipboard": "Copied to clipboard"
289
291
  "Show picture infos": "Show picture infos"
290
- "Show trash": "Show trash"
291
292
  "Site successfully created": "Website successfully created."
292
293
  "Site successfully removed": "Website successfully removed."
293
294
  "Site successfully updated": "Website successfully updated."
@@ -295,6 +296,7 @@ en:
295
296
  "Sort pages": "Reorder pages"
296
297
  "Successfully added content": "Successfully added %{content}"
297
298
  "Successfully deleted content": "Successfully deleted %{content}"
299
+ "Successfully deleted element": "Successfully deleted %{element}"
298
300
  "Tags": "Tags"
299
301
  "These pictures could not be deleted, because they were in use": "These pictures could not be deleted, because they were in use: %{names}"
300
302
  "This page is locked": "This page is currently locked by %{name}"
@@ -310,6 +312,7 @@ en:
310
312
  "Warning!": "Warning!"
311
313
  content_definition_missing: "Warning: Content is missing its definition. Please check the elements.yml"
312
314
  content_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
315
+ ingredient_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
313
316
  element_definition_missing: "WARNING! Missing element definition. Please check your elements.yml file."
314
317
  element_deprecated: "WARNING! This element is deprecated and will be removed soon. Please do not use it anymore."
315
318
  page_definition_missing: "WARNING! Missing page layout definition. Please check your page_layouts.yml file."
@@ -321,7 +324,6 @@ en:
321
324
  element_dirty_close_window_notice: "You have unsaved elements. Do you really want to close the elements window?"
322
325
  "Your last login was on": "Your last login was on %{time}."
323
326
  "Your last updated pages": "Your last updated pages"
324
- "Your trash is empty": "Your trash is empty"
325
327
  above: "above"
326
328
  add: "Add"
327
329
  align_in_text: "Alignment in text"
@@ -329,7 +331,6 @@ en:
329
331
  all_pictures: "All pictures"
330
332
  apply: "apply"
331
333
  assign_file: "Assign a file"
332
- assign_file_from_archive: "assign a file from your archive"
333
334
  assign_image: "Assign an image"
334
335
  attached_to: "attached to"
335
336
  attachment_filename_notice: "* Please do not use any special characters for the filename."
@@ -337,17 +338,18 @@ en:
337
338
  big_thumbnails: "Big thumbnails"
338
339
  cancel: "cancel"
339
340
  cannot_delete_picture_notice: "Cannot delete Picture %{name}, because it's still in use."
341
+ cannot_visit_unpublic_page: "Publish page before visiting it."
340
342
  choose_file_to_link: "Please choose a file to link"
341
343
  "clear clipboard": "clear clipboard"
342
- "clear trash": "clear trash"
343
344
  click_to_show_all: "Click to show all again."
345
+ confirm_to_delete_element: "Do you really want to delete this element? It cannot be restored!"
344
346
  confirm_to_delete_file: "Do you really want to delete this file from the server?"
345
347
  confirm_to_delete_image: "Do you really want to delete this image from server?"
346
348
  confirm_to_delete_image_from_server: "Do you really want to delete this image from the server?"
347
349
  confirm_to_delete_images_from_server: "Do you really want to delete these images from the server?"
348
350
  confirm_to_delete_menu: "Do you really want to delete this menu?"
349
351
  confirm_to_delete_node: "Do you really want to delete this menu node?"
350
- confirm_to_delete_page: "Do you really want to delete this page? All its elements (even trashed ones) will get lost!"
352
+ confirm_to_delete_page: "Do you really want to delete this page?"
351
353
  content_essence_not_found: "Content essence not found"
352
354
  content_not_found: "Field for content not present."
353
355
  content_validations_headline: "Please check marked fields below"
@@ -393,7 +395,7 @@ en:
393
395
  element_saved: "Saved element."
394
396
  enter_external_link: "Please enter the URL you want to link with"
395
397
  explain_cropping: "<p>Move the frame and change its size with the mouse or arrow keys to adjust the image mask. Click on \"apply\" when you are satisfied with your selection.</p><p>If you want to return to the original centered image mask like it was defined in the layout, click \"reset\" and \"apply\" afterwards.</p>"
396
- explain_publishing: "Publish the page and remove the cached version from the server."
398
+ explain_publishing: "Publish current page content"
397
399
  explain_sitemap_dragndrop_sorting: "Tip: Drag the pages at the icon in order to sort them."
398
400
  explain_unlocking: "Leave page and unlock it for other users."
399
401
  external_link_notice_1: "Please enter the complete url with http:// or a similar protocol."
@@ -422,7 +424,7 @@ en:
422
424
  dashboard: "Dashboard"
423
425
  image_alt_tag: "Alt-tag"
424
426
  image_caption: "Caption"
425
- image_name: "Name"
427
+ image_name: "Name: %{name}"
426
428
  image_title: "Title-tag"
427
429
  internal_link_headline: "Search for a page to link to by entering its name into the Page select."
428
430
  internal_link_page_elements_explanation: "Additionally you can choose an anchor to an element from selected page."
@@ -491,7 +493,7 @@ en:
491
493
  or_replace_it_with_an_existing_tag: 'Or replace it with an existing tag'
492
494
  "Page created": "Page: '%{name}' created."
493
495
  page_infos: 'Page info'
494
- page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been moved into the trash."
496
+ page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been hided."
495
497
  page_properties: "Page properties"
496
498
  page_public: "published"
497
499
  page_published: "Published page"
@@ -538,6 +540,8 @@ en:
538
540
  '1024': '1024px (iPad - Landscape)'
539
541
  '1280': '1280px (Desktop)'
540
542
  preview_url: Preview
543
+ publish_page_language_not_public: Cannot publish page if language is not public
544
+ publish_page_not_allowed: You have not the permission to publish this page
541
545
  recently_uploaded_only: 'Recently uploaded only'
542
546
  "regular method": "Regular method"
543
547
  remove: "Remove"
@@ -568,7 +572,6 @@ en:
568
572
  subject: "Subject"
569
573
  successfully_added_element: "Successfully added new element."
570
574
  successfully_deleted_tag: "Successfully deleted tag"
571
- successfully_restored_element: "Element restored successfully."
572
575
  successfully_saved_element_position: "Element position updated successfully."
573
576
  successfully_updated_tag: "Successfully updated tag"
574
577
  swap_image: "Change image"
@@ -578,7 +581,6 @@ en:
578
581
  this_picture_is_used_on_these_pages: "This picture is used on following pages"
579
582
  title: "Title"
580
583
  to_alchemy: "To Alchemy"
581
- "trash element": "Put element into trash"
582
584
  unknown: "unknown"
583
585
  unlink: "Remove link from this image."
584
586
  unlock_page: "Leave page"
@@ -704,11 +706,18 @@ en:
704
706
  # Translations for Alchemy models
705
707
  activemodel:
706
708
  models:
709
+ alchemy/essence_headline:
710
+ one: Headline
711
+ other: Headline
707
712
  alchemy/message:
708
713
  one: Message
709
714
  other: Messages
710
715
  alchemy/admin/preview_url: Internal
711
716
  attributes:
717
+ alchemy/essence_headline:
718
+ body: Headline
719
+ level: Level
720
+ size: Size
712
721
  alchemy/message:
713
722
  salutation: 'Salutation'
714
723
  firstname: 'Firstname'
@@ -785,7 +794,6 @@ en:
785
794
  name: "Name"
786
795
  public: "visible"
787
796
  tag_list: Tags
788
- trashed: Trashed
789
797
  alchemy/essence_file:
790
798
  css_class: Style
791
799
  alchemy/essence_picture:
data/config/routes.rb CHANGED
@@ -6,7 +6,7 @@ Alchemy::Engine.routes.draw do
6
6
 
7
7
  get "/sitemap.xml" => "pages#sitemap", format: "xml"
8
8
 
9
- scope Alchemy.admin_path, {constraints: Alchemy.admin_constraints} do
9
+ scope Alchemy.admin_path, { constraints: Alchemy.admin_constraints } do
10
10
  get "/" => redirect("#{Alchemy.admin_path}/dashboard"), as: :admin
11
11
  get "/dashboard" => "admin/dashboard#index", as: :admin_dashboard
12
12
  get "/dashboard/info" => "admin/dashboard#info", as: :dashboard_info
@@ -15,7 +15,7 @@ Alchemy::Engine.routes.draw do
15
15
  get "/leave" => "admin/base#leave", as: :leave_admin
16
16
  end
17
17
 
18
- namespace :admin, {path: Alchemy.admin_path, constraints: Alchemy.admin_constraints} do
18
+ namespace :admin, { path: Alchemy.admin_path, constraints: Alchemy.admin_constraints } do
19
19
  resources :contents, only: [:create]
20
20
 
21
21
  resources :nodes
@@ -35,7 +35,6 @@ Alchemy::Engine.routes.draw do
35
35
  post :unlock
36
36
  post :publish
37
37
  post :fold
38
- post :visit
39
38
  get :configure
40
39
  get :preview
41
40
  get :info
@@ -50,7 +49,6 @@ Alchemy::Engine.routes.draw do
50
49
  member do
51
50
  patch :publish
52
51
  post :fold
53
- delete :trash
54
52
  end
55
53
  end
56
54
 
@@ -63,6 +61,8 @@ Alchemy::Engine.routes.draw do
63
61
  get :edit_multiple
64
62
  end
65
63
  member do
64
+ get :url
65
+ put :assign
66
66
  delete :remove
67
67
  end
68
68
  end
@@ -70,23 +70,25 @@ Alchemy::Engine.routes.draw do
70
70
  resources :attachments, except: [:new] do
71
71
  member do
72
72
  get :download
73
+ put :assign
73
74
  end
74
75
  end
75
76
 
76
- resources :essence_pictures, except: [:show, :new, :create] do
77
- collection do
78
- put :assign
79
- end
77
+ resources :essence_audios, only: [:edit, :update]
78
+
79
+ concern :croppable do
80
80
  member do
81
81
  get :crop
82
82
  end
83
83
  end
84
84
 
85
- resources :essence_files, only: [:edit, :update] do
86
- collection do
87
- put :assign
88
- end
89
- end
85
+ resources :essence_pictures, only: [:edit, :update], concerns: [:croppable]
86
+
87
+ resources :essence_files, only: [:edit, :update]
88
+
89
+ resources :essence_videos, only: [:edit, :update]
90
+
91
+ resources :ingredients, only: [:edit, :update], concerns: [:croppable]
90
92
 
91
93
  resources :legacy_page_urls
92
94
  resources :languages do
@@ -104,13 +106,6 @@ Alchemy::Engine.routes.draw do
104
106
  end
105
107
  end
106
108
 
107
- resource :trash, only: :index, controller: "trash" do
108
- collection do
109
- get :index
110
- delete :clear
111
- end
112
- end
113
-
114
109
  resources :tags do
115
110
  collection do
116
111
  get :autocomplete
@@ -131,7 +126,7 @@ Alchemy::Engine.routes.draw do
131
126
  resources :elements, only: :show
132
127
  resources :contents, only: :show
133
128
 
134
- namespace :api, defaults: {format: "json"} do
129
+ namespace :api, defaults: { format: "json" } do
135
130
  resources :contents, only: [:index, :show]
136
131
 
137
132
  resources :elements, only: [:index, :show] do
@@ -159,7 +154,7 @@ Alchemy::Engine.routes.draw do
159
154
  end
160
155
 
161
156
  get "/:locale" => "pages#index",
162
- constraints: {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
157
+ constraints: { locale: Alchemy::RoutingConstraints::LOCALE_REGEXP },
163
158
  as: :show_language_root
164
159
 
165
160
  # The page show action has to be last route
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreatePageVersions < ActiveRecord::Migration[5.2]
4
+ def change
5
+ create_table :alchemy_page_versions do |t|
6
+ t.references :page,
7
+ null: false,
8
+ index: true,
9
+ foreign_key: {
10
+ to_table: :alchemy_pages,
11
+ on_delete: :cascade,
12
+ }
13
+ t.datetime :public_on
14
+ t.datetime :public_until
15
+ t.index [:public_on, :public_until]
16
+ t.timestamps
17
+ end
18
+ end
19
+ end