alchemy_cms 6.1.5 → 7.0.0.pre.b

Sign up to get free protection for your applications and to get access to all the features.
Files changed (363) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/brakeman-analysis.yml +2 -2
  3. data/.github/workflows/ci.yml +7 -10
  4. data/.github/workflows/lint.yml +17 -0
  5. data/.gitignore +1 -6
  6. data/.hound.yml +2 -3
  7. data/.rubocop.yml +4 -350
  8. data/.standard.yml +3 -0
  9. data/CHANGELOG.md +49 -19
  10. data/Gemfile +4 -2
  11. data/README.md +7 -9
  12. data/Rakefile +12 -7
  13. data/alchemy_cms.gemspec +3 -3
  14. data/app/assets/javascripts/alchemy/admin.js +0 -1
  15. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +18 -32
  17. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -2
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -2
  19. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +33 -30
  20. data/app/assets/stylesheets/alchemy/elements.scss +16 -35
  21. data/app/assets/stylesheets/alchemy/forms.scss +0 -4
  22. data/app/assets/stylesheets/alchemy/node-select.scss +2 -2
  23. data/app/components/alchemy/ingredients/audio_view.rb +37 -0
  24. data/app/components/alchemy/ingredients/base_view.rb +38 -0
  25. data/app/components/alchemy/ingredients/boolean_view.rb +13 -0
  26. data/app/components/alchemy/ingredients/datetime_view.rb +22 -0
  27. data/app/components/alchemy/ingredients/file_view.rb +40 -0
  28. data/app/components/alchemy/ingredients/headline_view.rb +20 -0
  29. data/app/components/alchemy/ingredients/html_view.rb +9 -0
  30. data/app/components/alchemy/ingredients/link_view.rb +25 -0
  31. data/app/components/alchemy/ingredients/node_view.rb +11 -0
  32. data/app/components/alchemy/ingredients/page_view.rb +15 -0
  33. data/app/components/alchemy/ingredients/picture_view.rb +108 -0
  34. data/app/components/alchemy/ingredients/richtext_view.rb +22 -0
  35. data/app/components/alchemy/ingredients/select_view.rb +6 -0
  36. data/app/components/alchemy/ingredients/text_view.rb +41 -0
  37. data/app/components/alchemy/ingredients/video_view.rb +39 -0
  38. data/app/controllers/alchemy/admin/attachments_controller.rb +3 -4
  39. data/app/controllers/alchemy/admin/base_controller.rb +7 -7
  40. data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -2
  41. data/app/controllers/alchemy/admin/elements_controller.rb +33 -43
  42. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  43. data/app/controllers/alchemy/admin/nodes_controller.rb +2 -2
  44. data/app/controllers/alchemy/admin/pages_controller.rb +11 -11
  45. data/app/controllers/alchemy/admin/pictures_controller.rb +15 -15
  46. data/app/controllers/alchemy/admin/resources_controller.rb +28 -46
  47. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  48. data/app/controllers/alchemy/admin/tags_controller.rb +11 -11
  49. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  50. data/app/controllers/alchemy/api/elements_controller.rb +11 -13
  51. data/app/controllers/alchemy/api/ingredients_controller.rb +1 -1
  52. data/app/controllers/alchemy/api/nodes_controller.rb +1 -1
  53. data/app/controllers/alchemy/api/pages_controller.rb +14 -12
  54. data/app/controllers/alchemy/attachments_controller.rb +3 -3
  55. data/app/controllers/alchemy/base_controller.rb +1 -1
  56. data/app/controllers/alchemy/messages_controller.rb +18 -18
  57. data/app/controllers/alchemy/pages_controller.rb +10 -16
  58. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +1 -0
  59. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -7
  60. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +5 -5
  61. data/app/decorators/alchemy/element_editor.rb +13 -33
  62. data/app/decorators/alchemy/ingredient_editor.rb +6 -6
  63. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -1
  64. data/app/helpers/alchemy/admin/base_helper.rb +21 -22
  65. data/app/helpers/alchemy/admin/elements_helper.rb +1 -3
  66. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  67. data/app/helpers/alchemy/admin/navigation_helper.rb +7 -7
  68. data/app/helpers/alchemy/admin/pages_helper.rb +2 -2
  69. data/app/helpers/alchemy/admin/tags_helper.rb +3 -3
  70. data/app/helpers/alchemy/base_helper.rb +2 -2
  71. data/app/helpers/alchemy/elements_block_helper.rb +13 -48
  72. data/app/helpers/alchemy/elements_helper.rb +15 -23
  73. data/app/helpers/alchemy/pages_helper.rb +11 -15
  74. data/app/helpers/alchemy/url_helper.rb +1 -1
  75. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  76. data/app/models/alchemy/attachment.rb +12 -9
  77. data/app/models/alchemy/base_record.rb +3 -0
  78. data/app/models/alchemy/eager_loading.rb +6 -7
  79. data/app/models/alchemy/element/definitions.rb +1 -1
  80. data/app/models/alchemy/element/element_ingredients.rb +4 -11
  81. data/app/models/alchemy/element/presenters.rb +9 -25
  82. data/app/models/alchemy/element.rb +4 -19
  83. data/app/models/alchemy/elements_repository.rb +1 -1
  84. data/app/models/alchemy/image_cropper_settings.rb +2 -2
  85. data/app/models/alchemy/ingredient.rb +29 -16
  86. data/app/models/alchemy/ingredient_validator.rb +1 -1
  87. data/app/models/alchemy/ingredients/audio.rb +2 -0
  88. data/app/models/alchemy/ingredients/datetime.rb +3 -1
  89. data/app/models/alchemy/ingredients/file.rb +7 -0
  90. data/app/models/alchemy/ingredients/headline.rb +6 -0
  91. data/app/models/alchemy/ingredients/link.rb +2 -0
  92. data/app/models/alchemy/ingredients/node.rb +2 -0
  93. data/app/models/alchemy/ingredients/page.rb +2 -0
  94. data/app/models/alchemy/ingredients/picture.rb +29 -0
  95. data/app/models/alchemy/ingredients/richtext.rb +17 -8
  96. data/app/models/alchemy/ingredients/select.rb +1 -0
  97. data/app/models/alchemy/ingredients/text.rb +8 -0
  98. data/app/models/alchemy/ingredients/video.rb +2 -0
  99. data/app/models/alchemy/language/code.rb +1 -1
  100. data/app/models/alchemy/language.rb +4 -4
  101. data/app/models/alchemy/legacy_page_url.rb +1 -1
  102. data/app/models/alchemy/node.rb +11 -8
  103. data/app/models/alchemy/page/page_elements.rb +19 -40
  104. data/app/models/alchemy/page/page_layouts.rb +0 -14
  105. data/app/models/alchemy/page/page_naming.rb +4 -4
  106. data/app/models/alchemy/page/page_natures.rb +1 -11
  107. data/app/models/alchemy/page/page_scopes.rb +5 -5
  108. data/app/models/alchemy/page.rb +11 -19
  109. data/app/models/alchemy/picture/calculations.rb +2 -2
  110. data/app/models/alchemy/picture/transformations.rb +2 -32
  111. data/app/models/alchemy/picture/url.rb +5 -5
  112. data/app/models/alchemy/picture.rb +22 -20
  113. data/app/models/alchemy/picture_thumb/create.rb +7 -18
  114. data/app/models/alchemy/picture_thumb/file_store.rb +33 -0
  115. data/app/models/alchemy/picture_thumb.rb +11 -11
  116. data/app/models/alchemy/picture_variant.rb +2 -3
  117. data/app/models/alchemy/tag.rb +8 -0
  118. data/app/models/concerns/alchemy/picture_thumbnails.rb +8 -8
  119. data/app/serializers/alchemy/base_serializer.rb +1 -1
  120. data/app/serializers/alchemy/element_serializer.rb +1 -6
  121. data/app/serializers/alchemy/page_tree_serializer.rb +7 -7
  122. data/app/services/alchemy/delete_elements.rb +1 -7
  123. data/app/services/alchemy/duplicate_element.rb +2 -7
  124. data/app/services/alchemy/tag_validations.rb +1 -1
  125. data/app/views/alchemy/admin/elements/_element.html.erb +8 -22
  126. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  127. data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
  128. data/app/views/alchemy/admin/elements/order.js.erb +1 -1
  129. data/app/views/alchemy/admin/elements/update.js.erb +1 -2
  130. data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
  131. data/app/views/alchemy/admin/pages/_file_link.html.erb +2 -2
  132. data/app/views/alchemy/admin/pages/_internal_link.html.erb +2 -2
  133. data/app/views/alchemy/admin/pages/edit.html.erb +1 -4
  134. data/app/views/alchemy/admin/pages/update.js.erb +10 -4
  135. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -3
  136. data/app/views/alchemy/admin/pictures/_infos.html.erb +4 -6
  137. data/app/views/alchemy/ingredients/_audio_view.html.erb +1 -14
  138. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  139. data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -1
  140. data/app/views/alchemy/ingredients/_datetime_view.html.erb +3 -9
  141. data/app/views/alchemy/ingredients/_file_view.html.erb +3 -16
  142. data/app/views/alchemy/ingredients/_headline_editor.html.erb +1 -1
  143. data/app/views/alchemy/ingredients/_headline_view.html.erb +4 -10
  144. data/app/views/alchemy/ingredients/_html_editor.html.erb +1 -1
  145. data/app/views/alchemy/ingredients/_html_view.html.erb +1 -1
  146. data/app/views/alchemy/ingredients/_link_view.html.erb +4 -9
  147. data/app/views/alchemy/ingredients/_node_editor.html.erb +1 -1
  148. data/app/views/alchemy/ingredients/_node_view.html.erb +1 -1
  149. data/app/views/alchemy/ingredients/_page_view.html.erb +1 -4
  150. data/app/views/alchemy/ingredients/_picture_editor.html.erb +4 -4
  151. data/app/views/alchemy/ingredients/_picture_view.html.erb +4 -5
  152. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +11 -2
  153. data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -3
  154. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -2
  155. data/app/views/alchemy/ingredients/_select_view.html.erb +1 -1
  156. data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
  157. data/app/views/alchemy/ingredients/_text_view.html.erb +3 -19
  158. data/app/views/alchemy/ingredients/_video_view.html.erb +3 -18
  159. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +4 -3
  160. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -0
  161. data/app/views/alchemy/pages/_meta_data.html.erb +0 -1
  162. data/app/views/layouts/alchemy/admin.html.erb +10 -8
  163. data/bin/setup +37 -0
  164. data/bin/start +17 -0
  165. data/config/alchemy/config.yml +6 -6
  166. data/config/brakeman.ignore +56 -57
  167. data/config/initializers/assets.rb +1 -0
  168. data/config/initializers/dragonfly.rb +1 -0
  169. data/config/initializers/mime_types.rb +1 -0
  170. data/config/initializers/mini_profiler.rb +1 -0
  171. data/config/initializers/simple_form.rb +3 -2
  172. data/config/locales/alchemy.en.yml +98 -112
  173. data/config/routes.rb +22 -36
  174. data/config/spring.rb +1 -0
  175. data/db/migrate/20230121212637_alchemy_six_point_one.rb +248 -0
  176. data/db/migrate/20230505132743_add_indexes_to_alchemy_pictures.rb +6 -0
  177. data/lib/alchemy/admin/locale.rb +3 -3
  178. data/lib/alchemy/admin/preview_url.rb +2 -2
  179. data/lib/alchemy/auth_accessors.rb +1 -1
  180. data/lib/alchemy/cache_digests/template_tracker.rb +6 -7
  181. data/lib/alchemy/config.rb +3 -3
  182. data/lib/alchemy/controller_actions.rb +4 -4
  183. data/lib/alchemy/deprecation.rb +2 -1
  184. data/lib/alchemy/dragonfly/processors/thumbnail.rb +1 -1
  185. data/lib/alchemy/element_definition.rb +2 -2
  186. data/lib/alchemy/engine.rb +2 -1
  187. data/lib/alchemy/errors.rb +0 -11
  188. data/lib/alchemy/filetypes.rb +7 -7
  189. data/lib/alchemy/forms/builder.rb +4 -4
  190. data/lib/alchemy/hints.rb +10 -10
  191. data/lib/alchemy/i18n.rb +6 -4
  192. data/lib/alchemy/install/tasks.rb +2 -1
  193. data/lib/alchemy/name_conversions.rb +1 -1
  194. data/lib/alchemy/page_layout.rb +1 -1
  195. data/lib/alchemy/permissions.rb +5 -17
  196. data/lib/alchemy/resource.rb +10 -10
  197. data/lib/alchemy/resources_helper.rb +7 -7
  198. data/lib/alchemy/routing_constraints.rb +5 -5
  199. data/lib/alchemy/searchable_resource.rb +38 -0
  200. data/lib/alchemy/seeder.rb +4 -3
  201. data/lib/alchemy/shell.rb +2 -1
  202. data/lib/alchemy/taggable.rb +3 -2
  203. data/lib/alchemy/tasks/tidy.rb +1 -38
  204. data/lib/alchemy/test_support/capybara_helpers.rb +69 -0
  205. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  206. data/lib/alchemy/test_support/factories/element_factory.rb +2 -4
  207. data/lib/alchemy/test_support/factories/ingredient_factory.rb +1 -1
  208. data/lib/alchemy/test_support/factories/page_factory.rb +5 -3
  209. data/lib/alchemy/test_support/having_crop_action_examples.rb +9 -9
  210. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +33 -33
  211. data/lib/alchemy/test_support/integration_helpers.rb +4 -3
  212. data/lib/alchemy/test_support/shared_contexts.rb +2 -1
  213. data/lib/alchemy/test_support/shared_dom_ids_examples.rb +10 -10
  214. data/lib/alchemy/test_support/shared_ingredient_examples.rb +13 -7
  215. data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -0
  216. data/lib/alchemy/tinymce.rb +3 -43
  217. data/lib/alchemy/upgrader/seven_point_zero.rb +45 -0
  218. data/lib/alchemy/upgrader/tasks/.keep +0 -0
  219. data/lib/alchemy/upgrader.rb +9 -3
  220. data/lib/alchemy/version.rb +1 -1
  221. data/lib/alchemy.rb +0 -19
  222. data/lib/alchemy_cms.rb +2 -2
  223. data/lib/generators/alchemy/base.rb +3 -2
  224. data/lib/generators/alchemy/elements/elements_generator.rb +2 -2
  225. data/lib/generators/alchemy/elements/templates/view.html.erb +1 -10
  226. data/lib/generators/alchemy/elements/templates/view.html.haml +1 -9
  227. data/lib/generators/alchemy/elements/templates/view.html.slim +1 -9
  228. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +1 -0
  229. data/lib/generators/alchemy/install/files/alchemy.en.yml +7 -8
  230. data/lib/generators/alchemy/install/files/application.html.erb +1 -1
  231. data/lib/generators/alchemy/install/install_generator.rb +20 -23
  232. data/lib/generators/alchemy/install/templates/elements.yml.tt +12 -12
  233. data/lib/generators/alchemy/module/module_generator.rb +1 -0
  234. data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +1 -0
  235. data/lib/generators/alchemy/site_layouts/site_layouts_generator.rb +1 -0
  236. data/lib/generators/alchemy/views/views_generator.rb +2 -1
  237. data/lib/tasks/alchemy/thumbnails.rake +6 -25
  238. data/lib/tasks/alchemy/tidy.rake +2 -12
  239. data/lib/tasks/alchemy/upgrade.rake +13 -49
  240. data/package/admin.js +2 -0
  241. data/package/dist/admin.js +16 -0
  242. data/package/dist/admin.js.map +7 -0
  243. data/package/src/datepicker.js +1 -0
  244. data/package/src/tinymce.js +142 -0
  245. data/package.json +5 -3
  246. metadata +41 -135
  247. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +0 -93
  248. data/app/controllers/alchemy/admin/contents_controller.rb +0 -21
  249. data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -30
  250. data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -31
  251. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +0 -43
  252. data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -34
  253. data/app/controllers/alchemy/api/contents_controller.rb +0 -52
  254. data/app/decorators/alchemy/content_editor.rb +0 -119
  255. data/app/helpers/alchemy/admin/contents_helper.rb +0 -42
  256. data/app/helpers/alchemy/admin/essences_helper.rb +0 -31
  257. data/app/models/alchemy/content/factory.rb +0 -143
  258. data/app/models/alchemy/content.rb +0 -247
  259. data/app/models/alchemy/element/element_contents.rb +0 -200
  260. data/app/models/alchemy/element/element_essences.rb +0 -133
  261. data/app/models/alchemy/essence_audio.rb +0 -13
  262. data/app/models/alchemy/essence_boolean.rb +0 -20
  263. data/app/models/alchemy/essence_date.rb +0 -25
  264. data/app/models/alchemy/essence_file.rb +0 -49
  265. data/app/models/alchemy/essence_headline.rb +0 -41
  266. data/app/models/alchemy/essence_html.rb +0 -23
  267. data/app/models/alchemy/essence_link.rb +0 -21
  268. data/app/models/alchemy/essence_node.rb +0 -19
  269. data/app/models/alchemy/essence_page.rb +0 -17
  270. data/app/models/alchemy/essence_picture.rb +0 -67
  271. data/app/models/alchemy/essence_picture_view.rb +0 -90
  272. data/app/models/alchemy/essence_richtext.rb +0 -44
  273. data/app/models/alchemy/essence_select.rb +0 -19
  274. data/app/models/alchemy/essence_text.rb +0 -23
  275. data/app/models/alchemy/essence_video.rb +0 -13
  276. data/app/presenters/alchemy/picture_view.rb +0 -88
  277. data/app/serializers/alchemy/content_serializer.rb +0 -17
  278. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -10
  279. data/app/serializers/alchemy/essence_date_serializer.rb +0 -10
  280. data/app/serializers/alchemy/essence_file_serializer.rb +0 -13
  281. data/app/serializers/alchemy/essence_html_serializer.rb +0 -10
  282. data/app/serializers/alchemy/essence_link_serializer.rb +0 -13
  283. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -28
  284. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -11
  285. data/app/serializers/alchemy/essence_select_serializer.rb +0 -10
  286. data/app/serializers/alchemy/essence_text_serializer.rb +0 -22
  287. data/app/views/alchemy/admin/contents/create.js.erb +0 -21
  288. data/app/views/alchemy/admin/essence_audios/edit.html.erb +0 -7
  289. data/app/views/alchemy/admin/essence_files/edit.html.erb +0 -21
  290. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +0 -5
  291. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +0 -30
  292. data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +0 -3
  293. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -8
  294. data/app/views/alchemy/admin/essence_videos/edit.html.erb +0 -12
  295. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -13
  296. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -4
  297. data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -15
  298. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +0 -11
  299. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +0 -2
  300. data/app/views/alchemy/essences/_essence_date_editor.html.erb +0 -16
  301. data/app/views/alchemy/essences/_essence_date_view.html.erb +0 -10
  302. data/app/views/alchemy/essences/_essence_file_editor.html.erb +0 -54
  303. data/app/views/alchemy/essences/_essence_file_view.html.erb +0 -18
  304. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +0 -36
  305. data/app/views/alchemy/essences/_essence_headline_view.html.erb +0 -10
  306. data/app/views/alchemy/essences/_essence_html_editor.html.erb +0 -10
  307. data/app/views/alchemy/essences/_essence_html_view.html.erb +0 -2
  308. data/app/views/alchemy/essences/_essence_link_editor.html.erb +0 -30
  309. data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -10
  310. data/app/views/alchemy/essences/_essence_node_editor.html.erb +0 -27
  311. data/app/views/alchemy/essences/_essence_node_view.html.erb +0 -1
  312. data/app/views/alchemy/essences/_essence_page_editor.html.erb +0 -26
  313. data/app/views/alchemy/essences/_essence_page_view.html.erb +0 -5
  314. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +0 -59
  315. data/app/views/alchemy/essences/_essence_picture_view.html.erb +0 -6
  316. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -14
  317. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +0 -4
  318. data/app/views/alchemy/essences/_essence_select_editor.html.erb +0 -28
  319. data/app/views/alchemy/essences/_essence_select_view.html.erb +0 -2
  320. data/app/views/alchemy/essences/_essence_text_editor.html.erb +0 -29
  321. data/app/views/alchemy/essences/_essence_text_view.html.erb +0 -17
  322. data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -4
  323. data/app/views/alchemy/essences/_essence_video_view.html.erb +0 -19
  324. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +0 -59
  325. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +0 -20
  326. data/app/views/alchemy/pages/show.rss.builder +0 -21
  327. data/db/migrate/20200226213334_alchemy_four_point_four.rb +0 -313
  328. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +0 -11
  329. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +0 -28
  330. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +0 -8
  331. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +0 -27
  332. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +0 -6
  333. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +0 -24
  334. data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +0 -22
  335. data/db/migrate/20200907111332_remove_tri_state_booleans.rb +0 -33
  336. data/db/migrate/20201207131309_create_page_versions.rb +0 -19
  337. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +0 -76
  338. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +0 -10
  339. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +0 -7
  340. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +0 -12
  341. data/db/migrate/20210506135919_create_essence_audios.rb +0 -19
  342. data/db/migrate/20210506140258_create_essence_videos.rb +0 -23
  343. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +0 -22
  344. data/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb +0 -13
  345. data/db/migrate/20220622130905_add_playsinline_to_alchemy_essence_videos.rb +0 -9
  346. data/lib/alchemy/essence.rb +0 -250
  347. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -271
  348. data/lib/alchemy/test_support/factories/content_factory.rb +0 -20
  349. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +0 -7
  350. data/lib/alchemy/test_support/factories/essence_file_factory.rb +0 -7
  351. data/lib/alchemy/test_support/factories/essence_page_factory.rb +0 -7
  352. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +0 -11
  353. data/lib/alchemy/test_support/factories/essence_text_factory.rb +0 -7
  354. data/lib/alchemy/test_support/factories/essence_video_factory.rb +0 -7
  355. data/lib/alchemy/upgrader/five_point_zero.rb +0 -41
  356. data/lib/alchemy/upgrader/six_point_zero.rb +0 -21
  357. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +0 -33
  358. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +0 -34
  359. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +0 -29
  360. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +0 -74
  361. data/lib/generators/alchemy/essence/essence_generator.rb +0 -49
  362. data/lib/generators/alchemy/essence/templates/editor.html.erb +0 -17
  363. data/lib/generators/alchemy/essence/templates/view.html.erb +0 -2
data/Rakefile CHANGED
@@ -48,9 +48,10 @@ namespace :alchemy do
48
48
  bin/rake db:create && \
49
49
  bin/rake db:environment:set && \
50
50
  bin/rake db:migrate:reset && \
51
+ bin/rails javascript:install:esbuild && \
51
52
  bin/rails g alchemy:install --skip --skip-demo-files --auto-accept --skip-db-create && \
52
53
  yarn link @alchemy_cms/admin && \
53
- RAILS_ENV=test bin/webpack && \
54
+ bin/rails javascript:build && \
54
55
  cd -
55
56
  BASH
56
57
  ) || fail
@@ -63,13 +64,17 @@ namespace :alchemy do
63
64
  original_file = "./CHANGELOG.md"
64
65
  new_file = original_file + ".new"
65
66
  backup = original_file + ".old"
66
- changes = `git rev-list v#{ENV["PREVIOUS_VERSION"]}..HEAD | bundle exec github_fast_changelog AlchemyCMS/alchemy_cms`
67
- File.open(new_file, "w") do |fo|
68
- fo.puts changes
69
- File.foreach(original_file) do |li|
70
- fo.puts li
67
+ changes = `git rev-list v#{ENV["PREVIOUS_VERSION"]}..HEAD | bundle exec github_fast_changelog AlchemyCMS/alchemy_cms`.split("\n")
68
+ changelog = File.read(original_file)
69
+ File.open(new_file, "w") do |file|
70
+ changes.each do |change|
71
+ next if changelog.include?(change)
72
+ file.puts change
71
73
  end
72
- fo.puts ""
74
+ File.foreach(original_file) do |line|
75
+ file.puts line
76
+ end
77
+ file.puts ""
73
78
  end
74
79
  File.rename(original_file, backup)
75
80
  File.rename(new_file, original_file)
data/alchemy_cms.gemspec CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
14
14
  gem.summary = "A powerful, userfriendly and flexible CMS for Rails"
15
15
  gem.description = "Alchemy is a powerful, userfriendly and flexible Rails CMS."
16
16
  gem.requirements << "ImageMagick (libmagick), v6.6 or greater."
17
- gem.required_ruby_version = ">= 2.5.0"
17
+ gem.required_ruby_version = ">= 3.0.0"
18
18
  gem.license = "BSD New"
19
19
  gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
20
20
  gem.require_paths = ["lib"]
@@ -45,14 +45,14 @@ Gem::Specification.new do |gem|
45
45
  gem.add_runtime_dependency "jquery-ui-rails", ["~> 6.0"]
46
46
  gem.add_runtime_dependency "kaminari", ["~> 1.1"]
47
47
  gem.add_runtime_dependency "originator", ["~> 3.1"]
48
- gem.add_runtime_dependency "ransack", [">= 1.8", "< 4.0"]
48
+ gem.add_runtime_dependency "ransack", [">= 1.8", "< 5.0"]
49
49
  gem.add_runtime_dependency "request_store", ["~> 1.2"]
50
50
  gem.add_runtime_dependency "responders", [">= 2.0", "< 4.0"]
51
51
  gem.add_runtime_dependency "sassc-rails", ["~> 2.1"]
52
52
  gem.add_runtime_dependency "simple_form", [">= 4.0", "< 6"]
53
53
  gem.add_runtime_dependency "sprockets", [">= 3.0", "< 5"]
54
54
  gem.add_runtime_dependency "turbolinks", [">= 2.5"]
55
- gem.add_runtime_dependency "webpacker", [">= 4.0", "< 6"]
55
+ gem.add_runtime_dependency "view_component", ["~> 3.0"]
56
56
 
57
57
  gem.add_development_dependency "capybara", ["~> 3.0"]
58
58
  gem.add_development_dependency "capybara-screenshot", ["~> 1.0"]
@@ -38,7 +38,6 @@
38
38
  //= require alchemy/alchemy.uploader
39
39
  //= require alchemy/alchemy.preview_window
40
40
  //= require alchemy/alchemy.spinner
41
- //= require alchemy/alchemy.tinymce
42
41
  //= require alchemy/alchemy.tooltips
43
42
  //= require alchemy/page_select
44
43
  //= require alchemy/node_select
@@ -20,7 +20,7 @@ $.extend Alchemy,
20
20
  setElementClean: (element) ->
21
21
  $element = $(element)
22
22
  $element.removeClass('dirty')
23
- $element.find('> .element-content .dirty').removeClass('dirty')
23
+ $element.find('> .element-body .dirty').removeClass('dirty')
24
24
  window.onbeforeunload = undefined
25
25
 
26
26
  isPageDirty: ->
@@ -15,7 +15,7 @@ Alchemy.ElementEditors =
15
15
  init: ->
16
16
  @element_area = $("#element_area")
17
17
  @bindEvents()
18
- @expandContentGroups()
18
+ @expandIngredientGroups()
19
19
  return
20
20
 
21
21
  # Binds click events on several DOM elements from element editors
@@ -29,27 +29,25 @@ Alchemy.ElementEditors =
29
29
  @onDoubleClickElement(e)
30
30
  @element_area.on "click", "[data-element-toggle]", (e) =>
31
31
  @onClickToggle(e)
32
- @element_area.on "click", '[data-create-missing-content]', (e) =>
33
- @onClickMissingContent(e)
34
32
  # Binds the custom FocusElementEditor event
35
33
  @element_area.on "FocusElementEditor.Alchemy", '.element-editor', (e) =>
36
34
  @onFocusElement(e)
37
35
  # Binds the custom SaveElement event
38
36
  @element_area.on "SaveElement.Alchemy", '.element-editor', (e, data) =>
39
37
  @onSaveElement(e, data)
40
- @element_area.on "click", '[data-toggle-content-group]', (e) =>
41
- @onToggleContentGroup(e)
38
+ @element_area.on "click", '[data-toggle-ingredient-group]', (e) =>
39
+ @onToggleIngredientGroup(e)
42
40
  # Listen to postMessage messages from the preview frame
43
41
  window.addEventListener 'message', (e) =>
44
42
  @onMessage(e.data)
45
43
  true
46
44
  return
47
45
 
48
- # Expands content groups that are stored in sessionStorage as expanded
49
- expandContentGroups: ->
50
- if $expanded_content_groups = sessionStorage.getItem('Alchemy.expanded_content_groups')
51
- for header_id in JSON.parse($expanded_content_groups) then do (header_id) =>
52
- $('#' + header_id).closest('.content-group').addClass('expanded');
46
+ # Expands ingredient groups that are stored in sessionStorage as expanded
47
+ expandIngredientGroups: ->
48
+ if $expanded_ingredient_groups = sessionStorage.getItem('Alchemy.expanded_ingredient_groups')
49
+ for header_id in JSON.parse($expanded_ingredient_groups) then do (header_id) =>
50
+ $('#' + header_id).closest('.ingredient-group').addClass('expanded');
53
51
 
54
52
  # Selects and scrolls to element with given id in the preview window.
55
53
  #
@@ -179,21 +177,21 @@ Alchemy.ElementEditors =
179
177
  Alchemy.Buttons.enable($element)
180
178
  true
181
179
 
182
- # Toggle visibility of the content fields in the group
183
- onToggleContentGroup: (event) ->
184
- $group_div = $(event.currentTarget).closest('.content-group');
180
+ # Toggle visibility of the ingredient fields in the group
181
+ onToggleIngredientGroup: (event) ->
182
+ $group_div = $(event.currentTarget).closest('.ingredient-group');
185
183
  $group_div.toggleClass('expanded');
186
184
 
187
- $expanded_content_groups = JSON.parse(sessionStorage.getItem('Alchemy.expanded_content_groups') || '[]');
188
- # Add or remove depending on whether this content group is expanded
185
+ $expanded_ingredient_groups = JSON.parse(sessionStorage.getItem('Alchemy.expanded_ingredient_groups') || '[]');
186
+ # Add or remove depending on whether this ingredient group is expanded
189
187
  if $group_div.hasClass('expanded')
190
- if $expanded_content_groups.indexOf(event.currentTarget.id) == -1
191
- $expanded_content_groups.push(event.currentTarget.id);
188
+ if $expanded_ingredient_groups.indexOf(event.currentTarget.id) == -1
189
+ $expanded_ingredient_groups.push(event.currentTarget.id);
192
190
  else
193
- $expanded_content_groups = $expanded_content_groups.filter (value) ->
191
+ $expanded_ingredient_groups = $expanded_ingredient_groups.filter (value) ->
194
192
  value != event.currentTarget.id
195
193
 
196
- sessionStorage.setItem('Alchemy.expanded_content_groups', JSON.stringify($expanded_content_groups))
194
+ sessionStorage.setItem('Alchemy.expanded_ingredient_groups', JSON.stringify($expanded_ingredient_groups))
197
195
  false
198
196
 
199
197
  # Event handlers
@@ -248,22 +246,10 @@ Alchemy.ElementEditors =
248
246
  e.stopPropagation()
249
247
  false
250
248
 
251
- # Handles the missing content button click events.
252
- #
253
- # Ensures that the links query string is converted into post body and send
254
- # the request via a real ajax post to server, to allow long query strings.
255
- #
256
- onClickMissingContent: (e) ->
257
- link = e.target
258
- url = link.pathname
259
- querystring = link.search.replace(/\?/, '')
260
- $.post(url, querystring)
261
- false
262
-
263
249
  # private
264
250
 
265
251
  _shouldUpdateTitle: (element, event) ->
266
- editors = element.find('> .element-content .element-content-editors, > .element-content .element-ingredient-editors').children()
252
+ editors = element.find('> .element-body .element-ingredient-editors').children()
267
253
  if @_hasParents(element)
268
254
  editors.length != 0
269
255
  else if @_isParent(element) && @_isFirstChild $(event.target)
@@ -50,8 +50,8 @@ Alchemy.ElementsWindow =
50
50
  $.get @url, (data) =>
51
51
  @element_area.html data
52
52
  Alchemy.GUI.init(@element_area)
53
- Alchemy.fileEditors(@element_area.find(".essence_file, .essence_video, .essence_audio, .ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
54
- Alchemy.pictureEditors(@element_area.find(".essence_picture, .ingredient-editor.picture").selector)
53
+ Alchemy.fileEditors(@element_area.find(".ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
54
+ Alchemy.pictureEditors(@element_area.find(".ingredient-editor.picture").selector)
55
55
  if @callback
56
56
  @callback.call()
57
57
  .fail (xhr, status, error) =>
@@ -23,5 +23,5 @@ Alchemy.GUI =
23
23
  Alchemy.ElementDirtyObserver($el)
24
24
  Alchemy.GUI.init($el && $el.selector)
25
25
  Alchemy.ImageLoader($el[0])
26
- Alchemy.fileEditors($el.find(".essence_file, .essence_video, .essence_audio, .ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
27
- Alchemy.pictureEditors($el.find(".essence_picture, .ingredient-editor.picture").selector)
26
+ Alchemy.fileEditors($el.find(".ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
27
+ Alchemy.pictureEditors($el.find(".ingredient-editor.picture").selector)
@@ -1,5 +1,5 @@
1
1
  # Represents the link Dialog that appears, if a user clicks the link buttons
2
- # in TinyMCE or on an Essence that has links enabled (e.g. EssencePicture)
2
+ # in TinyMCE or on an Ingredient that has links enabled (e.g. Picture)
3
3
  #
4
4
  class window.Alchemy.LinkDialog extends Alchemy.Dialog
5
5
 
@@ -25,37 +25,29 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
25
25
  # attach events we handle
26
26
  @attachEvents()
27
27
  # Store some jQuery objects for further reference
28
- @$page_urlname = $('#page_urlname', @dialog_body)
28
+ @$internal_link = $('#internal_link', @dialog_body)
29
29
  @$element_anchor = $('#element_anchor', @dialog_body)
30
30
  @$anchor_link = $('#anchor_link', @dialog_body)
31
- @$external_url = $('#external_url', @dialog_body)
32
- @$public_filename = $('#public_filename', @dialog_body)
31
+ @$external_link = $('#external_link', @dialog_body)
32
+ @$file_link = $('#file_link', @dialog_body)
33
33
  @$overlay_tabs = $('#overlay_tabs', @dialog_body)
34
34
  @$page_container = $('#page_selector_container')
35
+ @initAnchorLinks()
35
36
  # if we edit an existing link
36
37
  if @link_object
37
38
  # we select the correct tab
38
39
  @selectTab()
39
40
  @initPageSelect()
40
- @initAnchorLinks()
41
+ return
41
42
 
42
43
  # Attaches click events to several buttons in the link dialog.
43
44
  attachEvents: ->
44
45
  # The ok buttons
45
46
  $('.create-link.button', @dialog_body).click (e) =>
46
47
  @link_type = $(e.target).data('link-type')
47
- switch @link_type
48
- # get stored url for link type
49
- when 'external'
50
- url = @$external_url.val()
51
- when 'file'
52
- url = @$public_filename.val()
53
- when 'anchor'
54
- url = @$anchor_link.val()
55
- else
56
- url = @$page_urlname.val()
57
- if @$element_anchor.val() != ''
58
- url += "##{@$element_anchor.val()}"
48
+ url = $("##{@link_type}_link").val()
49
+ if @link_type == 'internal' && @$element_anchor.val() != ''
50
+ url += "##{@$element_anchor.val()}"
59
51
  # Create the link
60
52
  @createLink
61
53
  url: url
@@ -67,12 +59,17 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
67
59
  initPageSelect: ->
68
60
  pageTemplate = HandlebarsTemplates.page
69
61
  element_anchor_placeholder = @$element_anchor.attr('placeholder')
70
- @$page_urlname.select2
62
+ if @link_object.dataset.languageId
63
+ api_url = "#{Alchemy.routes.api_pages_path}?language_id=#{@link_object.dataset.languageId}"
64
+ else
65
+ api_url = Alchemy.routes.api_pages_path
66
+
67
+ @$internal_link.select2
71
68
  placeholder: Alchemy.t('Search page')
72
69
  allowClear: true
73
70
  minimumInputLength: 3
74
71
  ajax:
75
- url: Alchemy.routes.api_pages_path
72
+ url: api_url
76
73
  datatype: 'json'
77
74
  quietMillis: 300
78
75
  data: (term, page) ->
@@ -142,7 +139,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
142
139
  @setLink(options.url, options.title, options.target)
143
140
  @close()
144
141
 
145
- # Sets the link either in TinyMCE or on an Essence.
142
+ # Sets the link either in TinyMCE or on an Ingredient.
146
143
  setLink: (url, title, target) ->
147
144
  Alchemy.setElementDirty(@$link_object.closest('.element-editor'))
148
145
  if @link_object.editor
@@ -162,7 +159,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
162
159
  editor.selection.collapse()
163
160
  true
164
161
 
165
- # Sets a link on an Essence (e.g. EssencePicture).
162
+ # Sets a link on an Ingredient (e.g. Picture).
166
163
  setLinkFields: (url, title, target) ->
167
164
  @link_value_field.value = url
168
165
  @link_value_field.dispatchEvent(new Event("change"))
@@ -176,10 +173,10 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
176
173
 
177
174
  # Selects the correct tab for link type and fills all fields.
178
175
  selectTab: ->
179
- # Creating an temporary anchor node if we are linking an EssencePicture or EssenceText.
176
+ # Creating an temporary anchor node if we are linking an Picture Ingredient.
180
177
  if (@link_object.nodeType)
181
178
  @$link = @createTempLink()
182
- # Restoring the bookmarked selection inside the TinyMCE of an EssenceRichtext.
179
+ # Restoring the bookmarked selection inside the TinyMCE of an Richtext.
183
180
  else if (@link_object.node.nodeName == 'A')
184
181
  @$link = $(@link_object.node)
185
182
  @link_object.selection.moveToBookmark(@link_object.bookmark)
@@ -192,27 +189,33 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
192
189
  if @$link.hasClass('external')
193
190
  # Handles an external link.
194
191
  tab = $('#overlay_tab_external_link')
195
- @$external_url.val(@$link.attr('href'))
192
+ @$external_link.val(@$link.attr('href'))
196
193
  else if @$link.hasClass('file')
197
194
  # Handles a file link.
198
195
  tab = $('#overlay_tab_file_link')
199
- @$public_filename.select2('val', @$link[0].pathname + @$link[0].search)
196
+ @$file_link.select2('val', @$link[0].pathname + @$link[0].search)
200
197
  else if @$link.attr('href').match(/^#/)
201
198
  # Handles an anchor link.
202
199
  tab = $('#overlay_tab_anchor_link')
203
200
  @$anchor_link.select2('val', @$link.attr('href'))
204
- else
201
+ else if @$link.hasClass('internal')
205
202
  # Handles an internal link.
206
203
  tab = $('#overlay_tab_internal_link')
207
204
  @initInternalLinkTab()
208
- # activate the tab jquery ui 1.10 style o.O
209
- @$overlay_tabs.tabs('option', 'active', $('#overlay_tabs > div').index(tab))
205
+ else
206
+ # Emit an event to allow extensions hook into the link overlay.
207
+ @$overlay_tabs.trigger 'SelectLinkTab.Alchemy',
208
+ link: @$link
209
+ if tab
210
+ # activate the tab jquery ui 1.10 style o.O
211
+ @$overlay_tabs.tabs('option', 'active', $('#overlay_tabs > div').index(tab))
212
+ return
210
213
 
211
214
  # Handles actions for internal link tab.
212
215
  initInternalLinkTab: ->
213
216
  url = @$link.attr('href').split('#')
214
217
  # update the url field
215
- @$page_urlname.val(url[0])
218
+ @$internal_link.val(url[0])
216
219
  # store the anchor
217
220
  @$element_anchor.val(url[1])
218
221
 
@@ -251,7 +254,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
251
254
 
252
255
  # Public class methods
253
256
 
254
- # Removes link from Essence.
257
+ # Removes link from Ingredient.
255
258
  @removeLink = (link, parent_selector) ->
256
259
  parent = document.querySelector(parent_selector)
257
260
  link_value_field = parent.querySelector("[data-link-value]")
@@ -275,11 +275,10 @@
275
275
  }
276
276
  }
277
277
 
278
- .element-content {
278
+ .element-body {
279
279
  margin: 4px 8px;
280
280
  }
281
281
 
282
- .content_editor,
283
282
  .ingredient-editor,
284
283
  .picture_thumbnail {
285
284
  width: 100%;
@@ -303,7 +302,7 @@
303
302
  }
304
303
  }
305
304
 
306
- .element-content {
305
+ .element-body {
307
306
  margin: 2 * $default-padding;
308
307
  }
309
308
 
@@ -414,7 +413,7 @@
414
413
  }
415
414
  }
416
415
 
417
- .content-group {
416
+ .ingredient-group {
418
417
  width: 100%;
419
418
  padding: $default-padding 0;
420
419
  position: relative;
@@ -425,7 +424,7 @@
425
424
  padding-bottom: 0;
426
425
  }
427
426
 
428
- .content-group-header {
427
+ .ingredient-group-header {
429
428
  display: flex;
430
429
  align-items: center;
431
430
  justify-content: space-between;
@@ -434,22 +433,21 @@
434
433
  padding: $default-padding 1px;
435
434
  }
436
435
 
437
- .content-group-contents {
436
+ .ingredient-group-ingredients {
438
437
  display: none;
439
438
  }
440
439
 
441
440
  &.expanded {
442
- .content-group-contents {
441
+ .ingredient-group-ingredients {
443
442
  display: block;
444
443
  }
445
444
 
446
- .content-group-expand {
445
+ .ingredient-group-expand {
447
446
  @extend .fa-angle-up;
448
447
  }
449
448
  }
450
449
  }
451
450
 
452
- .element-content-editors,
453
451
  .element-ingredient-editors {
454
452
  display: flex;
455
453
  flex-wrap: wrap;
@@ -467,7 +465,7 @@
467
465
  min-height: 100px;
468
466
  }
469
467
 
470
- .linkable_essence_tools {
468
+ .ingredient_link_buttons {
471
469
  display: flex;
472
470
  position: absolute;
473
471
  bottom: 2 * $default-margin;
@@ -495,7 +493,7 @@
495
493
  background-color: $form-field-disabled-bg-color;
496
494
  }
497
495
 
498
- &.linked.link-essence {
496
+ &.linked.link-ingredient {
499
497
  @include linked-button(
500
498
  $border-radius: 0,
501
499
  $line-height: 30px,
@@ -507,7 +505,7 @@
507
505
  }
508
506
  }
509
507
 
510
- &.linked.unlink-essence {
508
+ &.linked.unlink-ingredient {
511
509
  @include linked-button(
512
510
  $border-radius: 0 $default-border-radius $default-border-radius 0,
513
511
  $line-height: 30px,
@@ -519,7 +517,7 @@
519
517
  }
520
518
  }
521
519
 
522
- &.unlink-essence {
520
+ &.unlink-ingredient {
523
521
  border-left-width: 0;
524
522
  @extend .right-rounded-border;
525
523
  }
@@ -561,7 +559,6 @@
561
559
  }
562
560
  }
563
561
 
564
- .essence_picture,
565
562
  .ingredient-editor.picture {
566
563
  position: relative;
567
564
 
@@ -586,7 +583,7 @@
586
583
  }
587
584
  }
588
585
 
589
- .essence_picture_css_class {
586
+ .picture_ingredient_css_class {
590
587
  position: absolute;
591
588
  z-index: 1;
592
589
  bottom: 24px;
@@ -639,9 +636,6 @@
639
636
  }
640
637
  }
641
638
 
642
- .content_editor.essence_audio,
643
- .content_editor.essence_file,
644
- .content_editor.essence_video,
645
639
  .ingredient-editor.audio,
646
640
  .ingredient-editor.file,
647
641
  .ingredient-editor.video {
@@ -681,8 +675,7 @@
681
675
  }
682
676
  }
683
677
 
684
- .file_tools,
685
- .essence_file_tools {
678
+ .file_tools {
686
679
  display: flex;
687
680
  align-items: center;
688
681
  margin-left: auto;
@@ -717,7 +710,6 @@ select.long {
717
710
  padding: 0;
718
711
  }
719
712
 
720
- .content_editor,
721
713
  .ingredient-editor {
722
714
  width: 100%;
723
715
  padding: $default-padding 0;
@@ -828,7 +820,6 @@ select.long {
828
820
  }
829
821
  }
830
822
 
831
- &.essence_select,
832
823
  &.select {
833
824
  label {
834
825
  margin-bottom: 2 * $default-margin;
@@ -843,8 +834,7 @@ select.long {
843
834
  }
844
835
  }
845
836
 
846
- select.ingredient-editor-select,
847
- select.essence_editor_select {
837
+ select.ingredient-editor-select {
848
838
  border-radius: $default-border-radius;
849
839
  background: white;
850
840
  border: 1px solid $button-border-color;
@@ -871,13 +861,11 @@ select.long {
871
861
  }
872
862
  }
873
863
 
874
- &.essence_picture,
875
864
  &.picture {
876
865
  width: 50%;
877
866
  padding-left: 1px; // Compensate the box shadow
878
867
  padding-right: $default-padding;
879
868
 
880
- + .essence_picture,
881
869
  + .picture {
882
870
  padding-left: $default-padding;
883
871
  padding-right: 1px; // Compensate the box shadow
@@ -885,10 +873,6 @@ select.long {
885
873
  }
886
874
  }
887
875
 
888
- .content_rtf_text_area {
889
- display: none;
890
- }
891
-
892
876
  div.pictures_for_element {
893
877
  overflow: auto;
894
878
  margin-top: 4px;
@@ -898,7 +882,7 @@ textarea.has_tinymce {
898
882
  visibility: hidden;
899
883
  }
900
884
 
901
- .essence_html textarea {
885
+ .ingredient-editor.html textarea {
902
886
  font-family: $mono-font-family;
903
887
  resize: vertical;
904
888
  font-size: $form-field-font-size;
@@ -928,8 +912,6 @@ textarea.has_tinymce {
928
912
  }
929
913
  }
930
914
 
931
- .content_editor .hint-with-icon,
932
- .content_editor .with-hint,
933
915
  .ingredient-editor .hint-with-icon,
934
916
  .ingredient-editor .with-hint,
935
917
  .element-handle .hint-with-icon {
@@ -946,7 +928,7 @@ textarea.has_tinymce {
946
928
  }
947
929
 
948
930
  .is-fixed {
949
- &.with-contents {
931
+ &.with-ingredients {
950
932
  > .element-footer {
951
933
  border-top: 0;
952
934
  border-bottom: 1px solid $medium-gray;
@@ -992,7 +974,6 @@ textarea.has_tinymce {
992
974
  }
993
975
 
994
976
  .ingredient-date--label,
995
- .essence_date--label,
996
977
  .edit-ingredient-anchor-link {
997
978
  position: absolute;
998
979
  right: 2 * $default-padding;
@@ -249,10 +249,6 @@ form {
249
249
  }
250
250
  }
251
251
 
252
- textarea#essence_picture_caption {
253
- height: 61px;
254
- }
255
-
256
252
  // styles for link overlay selects
257
253
  .window_form {
258
254
  td.checkbox {
@@ -35,9 +35,9 @@
35
35
  }
36
36
 
37
37
  // The container of the rendered node is slightly larger than other a line of
38
- // text, as it would be for the Alchemy::EssencePage. Reducing the padding here from 0.6em
38
+ // text, as it would be for the Alchemy::Ingredients::Page. Reducing the padding here from 0.6em
39
39
  // to 0.4em centers the content nicely.
40
- .essence_node {
40
+ .ingredient-editor.node {
41
41
  .select2-container.alchemy_selectbox .select2-choice {
42
42
  padding: 0.4em 0.75em;
43
43
  }
@@ -0,0 +1,37 @@
1
+ module Alchemy
2
+ module Ingredients
3
+ class AudioView < BaseView
4
+ def call
5
+ content_tag(:audio, **html_options) do
6
+ tag(:source, src: src, type: type)
7
+ end
8
+ end
9
+
10
+ def render?
11
+ !!ingredient.attachment
12
+ end
13
+
14
+ private
15
+
16
+ def src
17
+ alchemy.show_attachment_path(
18
+ ingredient.attachment,
19
+ format: ingredient.attachment.suffix
20
+ )
21
+ end
22
+
23
+ def type
24
+ ingredient.attachment.file_mime_type
25
+ end
26
+
27
+ def html_options
28
+ {
29
+ controls: ingredient.controls,
30
+ autoplay: ingredient.autoplay,
31
+ loop: ingredient.loop,
32
+ muted: ingredient.muted
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ module Alchemy
2
+ module Ingredients
3
+ class BaseView < ViewComponent::Base
4
+ attr_reader :ingredient, :html_options
5
+
6
+ delegate :alchemy, to: :helpers
7
+ delegate :settings, :value, to: :ingredient
8
+
9
+ # @param ingredient [Alchemy::Ingredient]
10
+ # @param html_options [Hash] Options that will be passed to the wrapper tag.
11
+ def initialize(ingredient, html_options: {})
12
+ raise ArgumentError, "Ingredient missing!" if ingredient.nil?
13
+
14
+ @ingredient = ingredient
15
+ @html_options = html_options
16
+ end
17
+
18
+ def call
19
+ value
20
+ end
21
+
22
+ def render?
23
+ value.present?
24
+ end
25
+
26
+ private
27
+
28
+ # Fetches value from ingredient settings and allows to merge a value on top of it
29
+ #
30
+ # @param key [Symbol] - The settings key you want to fetch the value from
31
+ # @param value [Object] - A optional value that can override the setting.
32
+ # Normally passed as into the ingredient view.
33
+ def settings_value(key, value: nil, default: nil)
34
+ value.nil? ? settings.fetch(key, default) : value
35
+ end
36
+ end
37
+ end
38
+ end