alchemy_cms 5.3.1 → 6.0.0.b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (295) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +6 -14
  3. data/.gitignore +1 -1
  4. data/.hound.yml +1 -1
  5. data/.rubocop.yml +46 -4
  6. data/CHANGELOG.md +80 -52
  7. data/Gemfile +4 -2
  8. data/README.md +5 -2
  9. data/Rakefile +0 -18
  10. data/alchemy_cms.gemspec +78 -65
  11. data/app/assets/javascripts/alchemy/admin.js +2 -2
  12. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -27
  13. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -1
  14. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +2 -7
  15. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -25
  16. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -1
  17. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -0
  18. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +3 -1
  20. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +1 -1
  21. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +40 -27
  22. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +24 -0
  23. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +119 -0
  24. data/app/assets/javascripts/alchemy/page_select.js +8 -13
  25. data/app/assets/javascripts/alchemy/templates/index.js +0 -1
  26. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  27. data/app/assets/javascripts/alchemy/templates/page.hbs +7 -17
  28. data/app/assets/stylesheets/alchemy/admin.scss +1 -1
  29. data/app/assets/stylesheets/alchemy/archive.scss +4 -4
  30. data/app/assets/stylesheets/alchemy/buttons.scss +0 -4
  31. data/app/assets/stylesheets/alchemy/elements.scss +73 -61
  32. data/app/assets/stylesheets/alchemy/images.scss +8 -0
  33. data/app/assets/stylesheets/alchemy/node-select.scss +4 -3
  34. data/app/assets/stylesheets/alchemy/page-select.scss +5 -29
  35. data/app/assets/stylesheets/alchemy/sitemap.scss +7 -9
  36. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
  37. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
  38. data/app/controllers/alchemy/admin/attachments_controller.rb +6 -2
  39. data/app/controllers/alchemy/admin/base_controller.rb +8 -16
  40. data/app/controllers/alchemy/admin/elements_controller.rb +58 -34
  41. data/app/controllers/alchemy/admin/essence_audios_controller.rb +30 -0
  42. data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -14
  43. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -79
  44. data/app/controllers/alchemy/admin/essence_videos_controller.rb +33 -0
  45. data/app/controllers/alchemy/admin/ingredients_controller.rb +30 -0
  46. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -1
  47. data/app/controllers/alchemy/admin/pages_controller.rb +19 -23
  48. data/app/controllers/alchemy/admin/pictures_controller.rb +35 -9
  49. data/app/controllers/alchemy/api/elements_controller.rb +10 -5
  50. data/app/controllers/alchemy/api/pages_controller.rb +3 -15
  51. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +13 -3
  52. data/app/controllers/concerns/alchemy/admin/crop_action.rb +26 -0
  53. data/app/decorators/alchemy/element_editor.rb +23 -1
  54. data/app/decorators/alchemy/ingredient_editor.rb +154 -0
  55. data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
  56. data/app/helpers/alchemy/admin/essences_helper.rb +1 -1
  57. data/app/helpers/alchemy/admin/ingredients_helper.rb +42 -0
  58. data/app/helpers/alchemy/elements_block_helper.rb +22 -7
  59. data/app/helpers/alchemy/elements_helper.rb +12 -5
  60. data/app/helpers/alchemy/pages_helper.rb +3 -11
  61. data/app/jobs/alchemy/base_job.rb +11 -0
  62. data/app/jobs/alchemy/publish_page_job.rb +11 -0
  63. data/app/models/alchemy/attachment.rb +1 -1
  64. data/app/models/alchemy/content/factory.rb +23 -27
  65. data/app/models/alchemy/content.rb +1 -6
  66. data/app/models/alchemy/element/definitions.rb +29 -27
  67. data/app/models/alchemy/element/element_contents.rb +131 -122
  68. data/app/models/alchemy/element/element_essences.rb +100 -98
  69. data/app/models/alchemy/element/element_ingredients.rb +176 -0
  70. data/app/models/alchemy/element/presenters.rb +89 -87
  71. data/app/models/alchemy/element.rb +40 -73
  72. data/app/models/alchemy/elements_repository.rb +126 -0
  73. data/app/models/alchemy/essence_audio.rb +12 -0
  74. data/app/models/alchemy/essence_headline.rb +40 -0
  75. data/app/models/alchemy/essence_picture.rb +4 -116
  76. data/app/models/alchemy/essence_richtext.rb +12 -0
  77. data/app/models/alchemy/essence_video.rb +12 -0
  78. data/app/models/alchemy/image_cropper_settings.rb +87 -0
  79. data/app/models/alchemy/ingredient.rb +219 -0
  80. data/app/models/alchemy/ingredient_validator.rb +97 -0
  81. data/app/models/alchemy/ingredients/audio.rb +29 -0
  82. data/app/models/alchemy/ingredients/boolean.rb +21 -0
  83. data/app/models/alchemy/ingredients/datetime.rb +20 -0
  84. data/app/models/alchemy/ingredients/file.rb +30 -0
  85. data/app/models/alchemy/ingredients/headline.rb +42 -0
  86. data/app/models/alchemy/ingredients/html.rb +19 -0
  87. data/app/models/alchemy/ingredients/link.rb +16 -0
  88. data/app/models/alchemy/ingredients/node.rb +23 -0
  89. data/app/models/alchemy/ingredients/page.rb +23 -0
  90. data/app/models/alchemy/ingredients/picture.rb +41 -0
  91. data/app/models/alchemy/ingredients/richtext.rb +57 -0
  92. data/app/models/alchemy/ingredients/select.rb +10 -0
  93. data/app/models/alchemy/ingredients/text.rb +17 -0
  94. data/app/models/alchemy/ingredients/video.rb +33 -0
  95. data/app/models/alchemy/language.rb +0 -11
  96. data/app/models/alchemy/node.rb +1 -1
  97. data/app/models/alchemy/page/fixed_attributes.rb +53 -51
  98. data/app/models/alchemy/page/page_elements.rb +186 -205
  99. data/app/models/alchemy/page/page_naming.rb +66 -64
  100. data/app/models/alchemy/page/page_natures.rb +139 -142
  101. data/app/models/alchemy/page/page_scopes.rb +113 -102
  102. data/app/models/alchemy/page/publisher.rb +50 -0
  103. data/app/models/alchemy/page/url_path.rb +1 -1
  104. data/app/models/alchemy/page.rb +69 -36
  105. data/app/models/alchemy/page_version.rb +58 -0
  106. data/app/models/alchemy/picture/calculations.rb +2 -8
  107. data/app/models/alchemy/picture/preprocessor.rb +2 -0
  108. data/app/models/alchemy/picture/transformations.rb +21 -93
  109. data/app/models/alchemy/picture.rb +4 -2
  110. data/app/models/concerns/alchemy/picture_thumbnails.rb +181 -0
  111. data/app/models/concerns/alchemy/touch_elements.rb +2 -2
  112. data/app/presenters/alchemy/picture_view.rb +88 -0
  113. data/app/serializers/alchemy/element_serializer.rb +5 -0
  114. data/app/serializers/alchemy/page_serializer.rb +1 -7
  115. data/app/serializers/alchemy/page_tree_serializer.rb +6 -5
  116. data/app/services/alchemy/delete_elements.rb +44 -0
  117. data/app/services/alchemy/duplicate_element.rb +56 -0
  118. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  119. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -3
  120. data/app/views/alchemy/admin/attachments/assign.js.erb +11 -0
  121. data/app/views/alchemy/admin/crop.html.erb +36 -0
  122. data/app/views/alchemy/admin/elements/_element.html.erb +14 -10
  123. data/app/views/alchemy/admin/elements/{_element_footer.html.erb → _footer.html.erb} +0 -0
  124. data/app/views/alchemy/admin/elements/{_new_element_form.html.erb → _form.html.erb} +1 -1
  125. data/app/views/alchemy/admin/elements/{_element_header.html.erb → _header.html.erb} +1 -1
  126. data/app/views/alchemy/admin/elements/{_element_toolbar.html.erb → _toolbar.html.erb} +5 -6
  127. data/app/views/alchemy/admin/elements/{trash.js.erb → destroy.js.erb} +1 -3
  128. data/app/views/alchemy/admin/elements/new.html.erb +3 -3
  129. data/app/views/alchemy/admin/elements/order.js.erb +0 -17
  130. data/app/views/alchemy/admin/elements/update.js.erb +3 -2
  131. data/app/views/alchemy/admin/essence_audios/edit.html.erb +7 -0
  132. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -1
  133. data/app/views/alchemy/admin/essence_videos/edit.html.erb +11 -0
  134. data/app/views/alchemy/admin/ingredients/_audio_fields.html.erb +4 -0
  135. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +18 -0
  136. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +25 -0
  137. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +8 -0
  138. data/app/views/alchemy/admin/ingredients/edit.html.erb +4 -0
  139. data/app/views/alchemy/admin/layoutpages/edit.html.erb +0 -5
  140. data/app/views/alchemy/admin/nodes/_node.html.erb +2 -2
  141. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +1 -1
  142. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  143. data/app/views/alchemy/admin/pages/_file_link.html.erb +1 -1
  144. data/app/views/alchemy/admin/pages/_form.html.erb +0 -25
  145. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  146. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +5 -16
  147. data/app/views/alchemy/admin/pages/_page.html.erb +133 -111
  148. data/app/views/alchemy/admin/pages/_sitemap.html.erb +16 -10
  149. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +5 -2
  150. data/app/views/alchemy/admin/pages/_toolbar.html.erb +12 -0
  151. data/app/views/alchemy/admin/pages/edit.html.erb +37 -25
  152. data/app/views/alchemy/admin/pages/fold.js.erb +2 -0
  153. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  154. data/app/views/alchemy/admin/pages/sort.html.erb +19 -0
  155. data/app/views/alchemy/admin/pages/update.js.erb +0 -7
  156. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -4
  157. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -19
  158. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +4 -8
  159. data/app/views/alchemy/admin/pictures/_infos.html.erb +0 -1
  160. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +4 -4
  161. data/app/views/alchemy/admin/pictures/assign.js.erb +10 -0
  162. data/app/views/alchemy/admin/resources/_form.html.erb +1 -0
  163. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +4 -0
  164. data/app/views/alchemy/essences/_essence_audio_view.html.erb +15 -0
  165. data/app/views/alchemy/essences/_essence_file_editor.html.erb +15 -6
  166. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +36 -0
  167. data/app/views/alchemy/essences/_essence_headline_view.html.erb +10 -0
  168. data/app/views/alchemy/essences/_essence_link_editor.html.erb +8 -4
  169. data/app/views/alchemy/essences/_essence_page_editor.html.erb +1 -1
  170. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +27 -12
  171. data/app/views/alchemy/essences/_essence_text_editor.html.erb +12 -4
  172. data/app/views/alchemy/essences/_essence_video_editor.html.erb +4 -0
  173. data/app/views/alchemy/essences/_essence_video_view.html.erb +18 -0
  174. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +21 -16
  175. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +2 -2
  176. data/app/views/alchemy/ingredients/_audio_editor.html.erb +5 -0
  177. data/app/views/alchemy/ingredients/_audio_view.html.erb +14 -0
  178. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +11 -0
  179. data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -0
  180. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +17 -0
  181. data/app/views/alchemy/ingredients/_datetime_view.html.erb +9 -0
  182. data/app/views/alchemy/ingredients/_file_editor.html.erb +50 -0
  183. data/app/views/alchemy/ingredients/_file_view.html.erb +17 -0
  184. data/app/views/alchemy/ingredients/_headline_editor.html.erb +30 -0
  185. data/app/views/alchemy/ingredients/_headline_view.html.erb +9 -0
  186. data/app/views/alchemy/ingredients/_html_editor.html.erb +8 -0
  187. data/app/views/alchemy/ingredients/_html_view.html.erb +1 -0
  188. data/app/views/alchemy/ingredients/_link_editor.html.erb +24 -0
  189. data/app/views/alchemy/ingredients/_link_view.html.erb +9 -0
  190. data/app/views/alchemy/ingredients/_node_editor.html.erb +25 -0
  191. data/app/views/alchemy/ingredients/_node_view.html.erb +1 -0
  192. data/app/views/alchemy/ingredients/_page_editor.html.erb +24 -0
  193. data/app/views/alchemy/ingredients/_page_view.html.erb +4 -0
  194. data/app/views/alchemy/ingredients/_picture_editor.html.erb +59 -0
  195. data/app/views/alchemy/ingredients/_picture_view.html.erb +5 -0
  196. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +12 -0
  197. data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -0
  198. data/app/views/alchemy/ingredients/_select_editor.html.erb +29 -0
  199. data/app/views/alchemy/ingredients/_select_view.html.erb +1 -0
  200. data/app/views/alchemy/ingredients/_text_editor.html.erb +19 -0
  201. data/app/views/alchemy/ingredients/_text_view.html.erb +16 -0
  202. data/app/views/alchemy/ingredients/_video_editor.html.erb +5 -0
  203. data/app/views/alchemy/ingredients/_video_view.html.erb +17 -0
  204. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +20 -0
  205. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +57 -0
  206. data/config/brakeman.ignore +66 -159
  207. data/config/initializers/dragonfly.rb +2 -0
  208. data/config/locales/alchemy.en.yml +26 -15
  209. data/config/routes.rb +19 -26
  210. data/db/migrate/20201207131309_create_page_versions.rb +19 -0
  211. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +76 -0
  212. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +10 -0
  213. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +7 -0
  214. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +12 -0
  215. data/db/migrate/20210506135919_create_essence_audios.rb +19 -0
  216. data/db/migrate/20210506140258_create_essence_videos.rb +23 -0
  217. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +22 -0
  218. data/lib/alchemy/admin/preview_url.rb +2 -0
  219. data/lib/alchemy/deprecation.rb +1 -1
  220. data/lib/alchemy/dragonfly/processors/auto_orient.rb +18 -0
  221. data/lib/alchemy/elements_finder.rb +14 -60
  222. data/lib/alchemy/engine.rb +1 -8
  223. data/lib/alchemy/essence.rb +1 -2
  224. data/lib/alchemy/hints.rb +8 -4
  225. data/lib/alchemy/page_layout.rb +0 -13
  226. data/lib/alchemy/permissions.rb +31 -29
  227. data/lib/alchemy/resource.rb +13 -3
  228. data/lib/alchemy/tasks/tidy.rb +29 -0
  229. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -1
  230. data/lib/alchemy/test_support/factories/element_factory.rb +8 -8
  231. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +7 -0
  232. data/lib/alchemy/test_support/factories/essence_video_factory.rb +7 -0
  233. data/lib/alchemy/test_support/factories/ingredient_factory.rb +25 -0
  234. data/lib/alchemy/test_support/factories/page_factory.rb +20 -1
  235. data/lib/alchemy/test_support/factories/page_version_factory.rb +23 -0
  236. data/lib/alchemy/test_support/having_crop_action_examples.rb +170 -0
  237. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +646 -0
  238. data/lib/alchemy/test_support/shared_ingredient_editor_examples.rb +21 -0
  239. data/lib/alchemy/test_support/shared_ingredient_examples.rb +57 -0
  240. data/lib/alchemy/test_support.rb +2 -11
  241. data/lib/alchemy/tinymce.rb +17 -0
  242. data/lib/alchemy/upgrader/five_point_zero.rb +0 -32
  243. data/lib/alchemy/upgrader/six_point_zero.rb +21 -0
  244. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +33 -0
  245. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +51 -0
  246. data/lib/alchemy/version.rb +1 -1
  247. data/lib/alchemy_cms.rb +0 -1
  248. data/lib/generators/alchemy/elements/elements_generator.rb +1 -0
  249. data/lib/generators/alchemy/elements/templates/view.html.erb +9 -0
  250. data/lib/generators/alchemy/elements/templates/view.html.haml +9 -0
  251. data/lib/generators/alchemy/elements/templates/view.html.slim +9 -0
  252. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +38 -0
  253. data/lib/generators/alchemy/ingredient/templates/editor.html.erb +14 -0
  254. data/lib/generators/alchemy/ingredient/templates/model.rb.tt +13 -0
  255. data/lib/generators/alchemy/ingredient/templates/view.html.erb +1 -0
  256. data/lib/generators/alchemy/install/install_generator.rb +1 -2
  257. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +1 -1
  258. data/lib/generators/alchemy/menus/templates/node.html.erb +1 -1
  259. data/lib/generators/alchemy/menus/templates/node.html.haml +1 -1
  260. data/lib/generators/alchemy/menus/templates/node.html.slim +1 -1
  261. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  262. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  263. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  264. data/lib/tasks/alchemy/tidy.rake +12 -0
  265. data/lib/tasks/alchemy/upgrade.rake +21 -15
  266. data/package/admin.js +8 -4
  267. data/package/src/file_editors.js +28 -0
  268. data/package/src/image_cropper.js +103 -0
  269. data/package/src/image_loader.js +58 -0
  270. data/package/src/node_tree.js +5 -5
  271. data/package/src/picture_editors.js +169 -0
  272. data/package/src/utils/__tests__/ajax.spec.js +20 -12
  273. data/package/src/utils/ajax.js +8 -3
  274. data/package.json +3 -2
  275. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +3 -18
  276. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +434 -0
  277. data/vendor/assets/stylesheets/jquery.Jcrop.min.scss +2 -28
  278. metadata +291 -53
  279. data/.rspec +0 -1
  280. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +0 -44
  281. data/app/assets/javascripts/alchemy/alchemy.trash_window.js.coffee +0 -30
  282. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +0 -3
  283. data/app/assets/stylesheets/alchemy/trash.scss +0 -8
  284. data/app/controllers/alchemy/admin/trash_controller.rb +0 -44
  285. data/app/views/alchemy/admin/essence_files/assign.js.erb +0 -3
  286. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -4
  287. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +0 -48
  288. data/app/views/alchemy/admin/trash/clear.js.erb +0 -4
  289. data/app/views/alchemy/admin/trash/index.html.erb +0 -31
  290. data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
  291. data/lib/alchemy/error_tracking.rb +0 -14
  292. data/lib/alchemy/test_support/factories.rb +0 -20
  293. data/package/src/page_publication_fields.js +0 -27
  294. data/package/src/page_sorter.js +0 -68
  295. data/package/src/sitemap.js +0 -152
@@ -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,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "dragonfly_svg"
3
3
  require "alchemy/dragonfly/processors/crop_resize"
4
+ require "alchemy/dragonfly/processors/auto_orient"
4
5
 
5
6
  # Logger
6
7
  Dragonfly.logger = Rails.logger
@@ -16,4 +17,5 @@ Dragonfly::ImageMagick::Processors::Encode::WHITELISTED_ARGS << "flatten"
16
17
 
17
18
  Rails.application.config.after_initialize do
18
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)
19
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,13 +289,14 @@ 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."
294
295
  "Size": "Size"
296
+ "Sort pages": "Reorder pages"
295
297
  "Successfully added content": "Successfully added %{content}"
296
298
  "Successfully deleted content": "Successfully deleted %{content}"
299
+ "Successfully deleted element": "Successfully deleted %{element}"
297
300
  "Tags": "Tags"
298
301
  "These pictures could not be deleted, because they were in use": "These pictures could not be deleted, because they were in use: %{names}"
299
302
  "This page is locked": "This page is currently locked by %{name}"
@@ -309,6 +312,7 @@ en:
309
312
  "Warning!": "Warning!"
310
313
  content_definition_missing: "Warning: Content is missing its definition. Please check the elements.yml"
311
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."
312
316
  element_definition_missing: "WARNING! Missing element definition. Please check your elements.yml file."
313
317
  element_deprecated: "WARNING! This element is deprecated and will be removed soon. Please do not use it anymore."
314
318
  page_definition_missing: "WARNING! Missing page layout definition. Please check your page_layouts.yml file."
@@ -320,7 +324,6 @@ en:
320
324
  element_dirty_close_window_notice: "You have unsaved elements. Do you really want to close the elements window?"
321
325
  "Your last login was on": "Your last login was on %{time}."
322
326
  "Your last updated pages": "Your last updated pages"
323
- "Your trash is empty": "Your trash is empty"
324
327
  above: "above"
325
328
  add: "Add"
326
329
  align_in_text: "Alignment in text"
@@ -328,7 +331,6 @@ en:
328
331
  all_pictures: "All pictures"
329
332
  apply: "apply"
330
333
  assign_file: "Assign a file"
331
- assign_file_from_archive: "assign a file from your archive"
332
334
  assign_image: "Assign an image"
333
335
  attached_to: "attached to"
334
336
  attachment_filename_notice: "* Please do not use any special characters for the filename."
@@ -336,17 +338,18 @@ en:
336
338
  big_thumbnails: "Big thumbnails"
337
339
  cancel: "cancel"
338
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."
339
342
  choose_file_to_link: "Please choose a file to link"
340
343
  "clear clipboard": "clear clipboard"
341
- "clear trash": "clear trash"
342
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!"
343
346
  confirm_to_delete_file: "Do you really want to delete this file from the server?"
344
347
  confirm_to_delete_image: "Do you really want to delete this image from server?"
345
348
  confirm_to_delete_image_from_server: "Do you really want to delete this image from the server?"
346
349
  confirm_to_delete_images_from_server: "Do you really want to delete these images from the server?"
347
350
  confirm_to_delete_menu: "Do you really want to delete this menu?"
348
351
  confirm_to_delete_node: "Do you really want to delete this menu node?"
349
- 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?"
350
353
  content_essence_not_found: "Content essence not found"
351
354
  content_not_found: "Field for content not present."
352
355
  content_validations_headline: "Please check marked fields below"
@@ -392,7 +395,8 @@ en:
392
395
  element_saved: "Saved element."
393
396
  enter_external_link: "Please enter the URL you want to link with"
394
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>"
395
- explain_publishing: "Publish the page and remove the cached version from the server."
398
+ explain_publishing: "Publish current page content"
399
+ explain_sitemap_dragndrop_sorting: "Tip: Drag the pages at the icon in order to sort them."
396
400
  explain_unlocking: "Leave page and unlock it for other users."
397
401
  external_link_notice_1: "Please enter the complete url with http:// or a similar protocol."
398
402
  external_link_notice_2: "To refer a path from your website url, start with a /."
@@ -420,7 +424,7 @@ en:
420
424
  dashboard: "Dashboard"
421
425
  image_alt_tag: "Alt-tag"
422
426
  image_caption: "Caption"
423
- image_name: "Name"
427
+ image_name: "Name: %{name}"
424
428
  image_title: "Title-tag"
425
429
  internal_link_headline: "Search for a page to link to by entering its name into the Page select."
426
430
  internal_link_page_elements_explanation: "Additionally you can choose an anchor to an element from selected page."
@@ -489,7 +493,7 @@ en:
489
493
  or_replace_it_with_an_existing_tag: 'Or replace it with an existing tag'
490
494
  "Page created": "Page: '%{name}' created."
491
495
  page_infos: 'Page info'
492
- 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."
493
497
  page_properties: "Page properties"
494
498
  page_public: "published"
495
499
  page_published: "Published page"
@@ -536,6 +540,8 @@ en:
536
540
  '1024': '1024px (iPad - Landscape)'
537
541
  '1280': '1280px (Desktop)'
538
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
539
545
  recently_uploaded_only: 'Recently uploaded only'
540
546
  "regular method": "Regular method"
541
547
  remove: "Remove"
@@ -551,6 +557,7 @@ en:
551
557
  robot_follow: "robot may follow links."
552
558
  robot_index: "allow robot to index."
553
559
  save: "Save"
560
+ "save order": "Save order"
554
561
  saved_link: "Link saved."
555
562
  search: "search"
556
563
  search_engines: "Search engines"
@@ -565,7 +572,6 @@ en:
565
572
  subject: "Subject"
566
573
  successfully_added_element: "Successfully added new element."
567
574
  successfully_deleted_tag: "Successfully deleted tag"
568
- successfully_restored_element: "Element restored successfully."
569
575
  successfully_saved_element_position: "Element position updated successfully."
570
576
  successfully_updated_tag: "Successfully updated tag"
571
577
  swap_image: "Change image"
@@ -575,7 +581,6 @@ en:
575
581
  this_picture_is_used_on_these_pages: "This picture is used on following pages"
576
582
  title: "Title"
577
583
  to_alchemy: "To Alchemy"
578
- "trash element": "Put element into trash"
579
584
  unknown: "unknown"
580
585
  unlink: "Remove link from this image."
581
586
  unlock_page: "Leave page"
@@ -701,11 +706,18 @@ en:
701
706
  # Translations for Alchemy models
702
707
  activemodel:
703
708
  models:
709
+ alchemy/essence_headline:
710
+ one: Headline
711
+ other: Headline
704
712
  alchemy/message:
705
713
  one: Message
706
714
  other: Messages
707
715
  alchemy/admin/preview_url: Internal
708
716
  attributes:
717
+ alchemy/essence_headline:
718
+ body: Headline
719
+ level: Level
720
+ size: Size
709
721
  alchemy/message:
710
722
  salutation: 'Salutation'
711
723
  firstname: 'Firstname'
@@ -782,7 +794,6 @@ en:
782
794
  name: "Name"
783
795
  public: "visible"
784
796
  tag_list: Tags
785
- trashed: Trashed
786
797
  alchemy/essence_file:
787
798
  css_class: Style
788
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
@@ -28,13 +28,13 @@ Alchemy::Engine.routes.draw do
28
28
  post :copy_language_tree
29
29
  get :create_language
30
30
  get :link
31
+ get :sort
31
32
  get :tree
32
33
  end
33
34
  member do
34
35
  post :unlock
35
36
  post :publish
36
- patch :fold
37
- post :visit
37
+ post :fold
38
38
  get :configure
39
39
  get :preview
40
40
  get :info
@@ -49,7 +49,6 @@ Alchemy::Engine.routes.draw do
49
49
  member do
50
50
  patch :publish
51
51
  post :fold
52
- delete :trash
53
52
  end
54
53
  end
55
54
 
@@ -62,6 +61,8 @@ Alchemy::Engine.routes.draw do
62
61
  get :edit_multiple
63
62
  end
64
63
  member do
64
+ get :url
65
+ put :assign
65
66
  delete :remove
66
67
  end
67
68
  end
@@ -69,23 +70,25 @@ Alchemy::Engine.routes.draw do
69
70
  resources :attachments, except: [:new] do
70
71
  member do
71
72
  get :download
73
+ put :assign
72
74
  end
73
75
  end
74
76
 
75
- resources :essence_pictures, except: [:show, :new, :create] do
76
- collection do
77
- put :assign
78
- end
77
+ resources :essence_audios, only: [:edit, :update]
78
+
79
+ concern :croppable do
79
80
  member do
80
81
  get :crop
81
82
  end
82
83
  end
83
84
 
84
- resources :essence_files, only: [:edit, :update] do
85
- collection do
86
- put :assign
87
- end
88
- 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]
89
92
 
90
93
  resources :legacy_page_urls
91
94
  resources :languages do
@@ -103,13 +106,6 @@ Alchemy::Engine.routes.draw do
103
106
  end
104
107
  end
105
108
 
106
- resource :trash, only: :index, controller: "trash" do
107
- collection do
108
- get :index
109
- delete :clear
110
- end
111
- end
112
-
113
109
  resources :tags do
114
110
  collection do
115
111
  get :autocomplete
@@ -130,7 +126,7 @@ Alchemy::Engine.routes.draw do
130
126
  resources :elements, only: :show
131
127
  resources :contents, only: :show
132
128
 
133
- namespace :api, defaults: {format: "json"} do
129
+ namespace :api, defaults: { format: "json" } do
134
130
  resources :contents, only: [:index, :show]
135
131
 
136
132
  resources :elements, only: [:index, :show] do
@@ -144,9 +140,6 @@ Alchemy::Engine.routes.draw do
144
140
  collection do
145
141
  get :nested
146
142
  end
147
- member do
148
- patch :move
149
- end
150
143
  end
151
144
 
152
145
  get "/pages/*urlname(.:format)" => "pages#show", as: "page"
@@ -161,7 +154,7 @@ Alchemy::Engine.routes.draw do
161
154
  end
162
155
 
163
156
  get "/:locale" => "pages#index",
164
- constraints: {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
157
+ constraints: { locale: Alchemy::RoutingConstraints::LOCALE_REGEXP },
165
158
  as: :show_language_root
166
159
 
167
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