alchemy_cms 6.1.9 → 7.0.0.pre.a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +0 -3
  3. data/.gitignore +1 -6
  4. data/CHANGELOG.md +19 -39
  5. data/Gemfile +1 -1
  6. data/Rakefile +14 -9
  7. data/alchemy_cms.gemspec +2 -3
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +1 -1
  9. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +18 -32
  10. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -2
  11. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -2
  12. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +27 -29
  13. data/app/assets/stylesheets/alchemy/elements.scss +16 -35
  14. data/app/assets/stylesheets/alchemy/forms.scss +0 -4
  15. data/app/assets/stylesheets/alchemy/node-select.scss +2 -2
  16. data/app/controllers/alchemy/admin/attachments_controller.rb +0 -1
  17. data/app/controllers/alchemy/admin/elements_controller.rb +7 -32
  18. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  19. data/app/controllers/alchemy/admin/pictures_controller.rb +1 -1
  20. data/app/controllers/alchemy/admin/resources_controller.rb +1 -18
  21. data/app/controllers/alchemy/api/elements_controller.rb +0 -2
  22. data/app/controllers/alchemy/api/pages_controller.rb +8 -4
  23. data/app/controllers/alchemy/messages_controller.rb +9 -9
  24. data/app/controllers/alchemy/pages_controller.rb +23 -18
  25. data/app/decorators/alchemy/element_editor.rb +10 -30
  26. data/app/helpers/alchemy/admin/elements_helper.rb +0 -2
  27. data/app/helpers/alchemy/elements_block_helper.rb +5 -42
  28. data/app/helpers/alchemy/elements_helper.rb +3 -11
  29. data/app/helpers/alchemy/pages_helper.rb +0 -4
  30. data/app/models/alchemy/attachment.rb +6 -3
  31. data/app/models/alchemy/base_record.rb +2 -0
  32. data/app/models/alchemy/eager_loading.rb +0 -1
  33. data/app/models/alchemy/element/element_ingredients.rb +1 -8
  34. data/app/models/alchemy/element/presenters.rb +9 -25
  35. data/app/models/alchemy/element.rb +2 -18
  36. data/app/models/alchemy/ingredient.rb +17 -6
  37. data/app/models/alchemy/ingredients/audio.rb +2 -0
  38. data/app/models/alchemy/ingredients/datetime.rb +3 -1
  39. data/app/models/alchemy/ingredients/file.rb +7 -0
  40. data/app/models/alchemy/ingredients/headline.rb +6 -0
  41. data/app/models/alchemy/ingredients/link.rb +2 -0
  42. data/app/models/alchemy/ingredients/node.rb +2 -0
  43. data/app/models/alchemy/ingredients/page.rb +2 -0
  44. data/app/models/alchemy/ingredients/picture.rb +11 -0
  45. data/app/models/alchemy/ingredients/richtext.rb +6 -0
  46. data/app/models/alchemy/ingredients/select.rb +1 -0
  47. data/app/models/alchemy/ingredients/text.rb +8 -0
  48. data/app/models/alchemy/ingredients/video.rb +2 -0
  49. data/app/models/alchemy/node.rb +9 -6
  50. data/app/models/alchemy/page/page_elements.rb +5 -26
  51. data/app/models/alchemy/page/page_layouts.rb +0 -14
  52. data/app/models/alchemy/page/page_natures.rb +0 -10
  53. data/app/models/alchemy/page.rb +0 -8
  54. data/app/models/alchemy/picture/transformations.rb +0 -30
  55. data/app/models/alchemy/picture/url.rb +1 -1
  56. data/app/models/alchemy/picture.rb +14 -13
  57. data/app/models/alchemy/picture_thumb/create.rb +7 -18
  58. data/app/models/alchemy/picture_thumb/file_store.rb +33 -0
  59. data/app/models/alchemy/picture_thumb.rb +10 -10
  60. data/app/models/concerns/alchemy/picture_thumbnails.rb +2 -2
  61. data/app/serializers/alchemy/element_serializer.rb +1 -6
  62. data/app/services/alchemy/delete_elements.rb +1 -7
  63. data/app/services/alchemy/duplicate_element.rb +1 -6
  64. data/app/views/alchemy/admin/elements/_element.html.erb +5 -22
  65. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  66. data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
  67. data/app/views/alchemy/admin/elements/order.js.erb +1 -1
  68. data/app/views/alchemy/admin/elements/update.js.erb +1 -2
  69. data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
  70. data/app/views/alchemy/admin/pages/_file_link.html.erb +2 -2
  71. data/app/views/alchemy/admin/pages/_internal_link.html.erb +2 -2
  72. data/app/views/alchemy/admin/pages/_table.html.erb +0 -6
  73. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +3 -6
  74. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  75. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -3
  76. data/app/views/alchemy/admin/pictures/_infos.html.erb +4 -6
  77. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  78. data/app/views/alchemy/ingredients/_headline_editor.html.erb +1 -1
  79. data/app/views/alchemy/ingredients/_html_editor.html.erb +1 -1
  80. data/app/views/alchemy/ingredients/_node_editor.html.erb +1 -1
  81. data/app/views/alchemy/ingredients/_picture_editor.html.erb +4 -4
  82. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -2
  83. data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
  84. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +3 -3
  85. data/app/views/alchemy/pages/_meta_data.html.erb +0 -1
  86. data/app/views/layouts/alchemy/admin.html.erb +5 -1
  87. data/config/alchemy/config.yml +6 -6
  88. data/config/brakeman.ignore +56 -57
  89. data/config/locales/alchemy.en.yml +99 -113
  90. data/config/routes.rb +1 -16
  91. data/db/migrate/20230121212637_alchemy_six_point_one.rb +248 -0
  92. data/lib/alchemy/cache_digests/template_tracker.rb +6 -7
  93. data/lib/alchemy/config.rb +2 -2
  94. data/lib/alchemy/deprecation.rb +1 -1
  95. data/lib/alchemy/errors.rb +0 -11
  96. data/lib/alchemy/hints.rb +10 -10
  97. data/lib/alchemy/permissions.rb +4 -17
  98. data/lib/alchemy/routing_constraints.rb +3 -3
  99. data/lib/alchemy/searchable_resource.rb +38 -0
  100. data/lib/alchemy/seeder.rb +2 -8
  101. data/lib/alchemy/tasks/tidy.rb +0 -38
  102. data/lib/alchemy/test_support/capybara_helpers.rb +69 -0
  103. data/lib/alchemy/test_support/factories/element_factory.rb +0 -6
  104. data/lib/alchemy/test_support/factories/ingredient_factory.rb +1 -1
  105. data/lib/alchemy/test_support/factories/page_factory.rb +4 -2
  106. data/lib/alchemy/test_support/shared_dom_ids_examples.rb +1 -1
  107. data/lib/alchemy/test_support/shared_ingredient_examples.rb +1 -1
  108. data/lib/alchemy/tinymce.rb +1 -18
  109. data/lib/alchemy/upgrader/seven_point_zero.rb +45 -0
  110. data/lib/alchemy/upgrader/tasks/.keep +0 -0
  111. data/lib/alchemy/upgrader.rb +8 -3
  112. data/lib/alchemy/version.rb +1 -1
  113. data/lib/alchemy.rb +0 -19
  114. data/lib/alchemy_cms.rb +1 -2
  115. data/lib/generators/alchemy/elements/elements_generator.rb +0 -1
  116. data/lib/generators/alchemy/elements/templates/view.html.erb +1 -10
  117. data/lib/generators/alchemy/elements/templates/view.html.haml +1 -9
  118. data/lib/generators/alchemy/elements/templates/view.html.slim +1 -9
  119. data/lib/generators/alchemy/install/files/alchemy.en.yml +7 -8
  120. data/lib/generators/alchemy/install/files/application.html.erb +1 -1
  121. data/lib/generators/alchemy/install/install_generator.rb +18 -34
  122. data/lib/generators/alchemy/install/templates/elements.yml.tt +12 -12
  123. data/lib/non_stupid_digest_assets.rb +1 -1
  124. data/lib/tasks/alchemy/thumbnails.rake +2 -21
  125. data/lib/tasks/alchemy/tidy.rake +1 -12
  126. data/lib/tasks/alchemy/upgrade.rake +10 -47
  127. data/package/dist/admin.js +16 -0
  128. data/package/dist/admin.js.map +7 -0
  129. data/package.json +5 -3
  130. metadata +18 -147
  131. data/app/controllers/alchemy/admin/contents_controller.rb +0 -21
  132. data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -30
  133. data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -31
  134. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +0 -43
  135. data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -34
  136. data/app/controllers/alchemy/api/contents_controller.rb +0 -52
  137. data/app/decorators/alchemy/content_editor.rb +0 -119
  138. data/app/helpers/alchemy/admin/contents_helper.rb +0 -42
  139. data/app/helpers/alchemy/admin/essences_helper.rb +0 -31
  140. data/app/models/alchemy/content/factory.rb +0 -143
  141. data/app/models/alchemy/content.rb +0 -247
  142. data/app/models/alchemy/element/element_contents.rb +0 -200
  143. data/app/models/alchemy/element/element_essences.rb +0 -133
  144. data/app/models/alchemy/essence_audio.rb +0 -13
  145. data/app/models/alchemy/essence_boolean.rb +0 -20
  146. data/app/models/alchemy/essence_date.rb +0 -25
  147. data/app/models/alchemy/essence_file.rb +0 -49
  148. data/app/models/alchemy/essence_headline.rb +0 -41
  149. data/app/models/alchemy/essence_html.rb +0 -23
  150. data/app/models/alchemy/essence_link.rb +0 -21
  151. data/app/models/alchemy/essence_node.rb +0 -19
  152. data/app/models/alchemy/essence_page.rb +0 -17
  153. data/app/models/alchemy/essence_picture.rb +0 -67
  154. data/app/models/alchemy/essence_picture_view.rb +0 -90
  155. data/app/models/alchemy/essence_richtext.rb +0 -44
  156. data/app/models/alchemy/essence_select.rb +0 -19
  157. data/app/models/alchemy/essence_text.rb +0 -23
  158. data/app/models/alchemy/essence_video.rb +0 -13
  159. data/app/serializers/alchemy/content_serializer.rb +0 -17
  160. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -10
  161. data/app/serializers/alchemy/essence_date_serializer.rb +0 -10
  162. data/app/serializers/alchemy/essence_file_serializer.rb +0 -13
  163. data/app/serializers/alchemy/essence_html_serializer.rb +0 -10
  164. data/app/serializers/alchemy/essence_link_serializer.rb +0 -13
  165. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -28
  166. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -11
  167. data/app/serializers/alchemy/essence_select_serializer.rb +0 -10
  168. data/app/serializers/alchemy/essence_text_serializer.rb +0 -22
  169. data/app/views/alchemy/admin/contents/create.js.erb +0 -21
  170. data/app/views/alchemy/admin/essence_audios/edit.html.erb +0 -7
  171. data/app/views/alchemy/admin/essence_files/edit.html.erb +0 -21
  172. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +0 -5
  173. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +0 -30
  174. data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +0 -3
  175. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -8
  176. data/app/views/alchemy/admin/essence_videos/edit.html.erb +0 -12
  177. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -4
  178. data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -15
  179. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +0 -11
  180. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +0 -2
  181. data/app/views/alchemy/essences/_essence_date_editor.html.erb +0 -16
  182. data/app/views/alchemy/essences/_essence_date_view.html.erb +0 -10
  183. data/app/views/alchemy/essences/_essence_file_editor.html.erb +0 -54
  184. data/app/views/alchemy/essences/_essence_file_view.html.erb +0 -18
  185. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +0 -36
  186. data/app/views/alchemy/essences/_essence_headline_view.html.erb +0 -10
  187. data/app/views/alchemy/essences/_essence_html_editor.html.erb +0 -10
  188. data/app/views/alchemy/essences/_essence_html_view.html.erb +0 -2
  189. data/app/views/alchemy/essences/_essence_link_editor.html.erb +0 -30
  190. data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -10
  191. data/app/views/alchemy/essences/_essence_node_editor.html.erb +0 -27
  192. data/app/views/alchemy/essences/_essence_node_view.html.erb +0 -1
  193. data/app/views/alchemy/essences/_essence_page_editor.html.erb +0 -26
  194. data/app/views/alchemy/essences/_essence_page_view.html.erb +0 -5
  195. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +0 -59
  196. data/app/views/alchemy/essences/_essence_picture_view.html.erb +0 -6
  197. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -14
  198. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +0 -4
  199. data/app/views/alchemy/essences/_essence_select_editor.html.erb +0 -28
  200. data/app/views/alchemy/essences/_essence_select_view.html.erb +0 -2
  201. data/app/views/alchemy/essences/_essence_text_editor.html.erb +0 -29
  202. data/app/views/alchemy/essences/_essence_text_view.html.erb +0 -17
  203. data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -4
  204. data/app/views/alchemy/essences/_essence_video_view.html.erb +0 -19
  205. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +0 -59
  206. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +0 -20
  207. data/app/views/alchemy/pages/show.rss.builder +0 -21
  208. data/db/migrate/20200226213334_alchemy_four_point_four.rb +0 -313
  209. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +0 -11
  210. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +0 -28
  211. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +0 -8
  212. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +0 -27
  213. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +0 -6
  214. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +0 -24
  215. data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +0 -22
  216. data/db/migrate/20200907111332_remove_tri_state_booleans.rb +0 -33
  217. data/db/migrate/20201207131309_create_page_versions.rb +0 -19
  218. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +0 -76
  219. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +0 -10
  220. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +0 -7
  221. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +0 -12
  222. data/db/migrate/20210506135919_create_essence_audios.rb +0 -19
  223. data/db/migrate/20210506140258_create_essence_videos.rb +0 -23
  224. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +0 -22
  225. data/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb +0 -13
  226. data/db/migrate/20220622130905_add_playsinline_to_alchemy_essence_videos.rb +0 -9
  227. data/lib/alchemy/essence.rb +0 -250
  228. data/lib/alchemy/tasks/usage.rb +0 -34
  229. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -271
  230. data/lib/alchemy/test_support/factories/content_factory.rb +0 -20
  231. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +0 -7
  232. data/lib/alchemy/test_support/factories/essence_file_factory.rb +0 -7
  233. data/lib/alchemy/test_support/factories/essence_page_factory.rb +0 -7
  234. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +0 -11
  235. data/lib/alchemy/test_support/factories/essence_text_factory.rb +0 -7
  236. data/lib/alchemy/test_support/factories/essence_video_factory.rb +0 -7
  237. data/lib/alchemy/upgrader/five_point_zero.rb +0 -41
  238. data/lib/alchemy/upgrader/six_point_zero.rb +0 -21
  239. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +0 -33
  240. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +0 -34
  241. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +0 -29
  242. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +0 -73
  243. data/lib/generators/alchemy/essence/essence_generator.rb +0 -49
  244. data/lib/generators/alchemy/essence/templates/editor.html.erb +0 -17
  245. data/lib/generators/alchemy/essence/templates/view.html.erb +0 -2
  246. data/lib/generators/alchemy/install/files/babel.config.js +0 -64
  247. data/lib/tasks/alchemy/usage.rake +0 -44
@@ -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
  }
@@ -78,7 +78,6 @@ module Alchemy
78
78
  @_search_filter_params ||= params.except(*COMMON_SEARCH_FILTER_EXCLUDES + [:attachment]).permit(
79
79
  *common_search_filter_includes + [
80
80
  :form_field_id,
81
- :content_id,
82
81
  ]
83
82
  )
84
83
  end
@@ -49,22 +49,21 @@ module Alchemy
49
49
  end
50
50
  end
51
51
 
52
- # Updates the element.
53
- #
54
- # And update all contents in the elements by calling update_contents.
52
+ # Updates the element and all ingredients in the element.
55
53
  #
56
54
  def update
57
55
  @page = @element.page
58
56
 
59
- if element_params.key?(:ingredients_attributes)
60
- update_element_with_ingredients
57
+ if @element.update(element_params)
58
+ @element_validated = true
61
59
  else
62
- update_element_with_contents
60
+ element_update_error
61
+ @error_messages = @element.ingredient_error_messages
63
62
  end
64
63
  end
65
64
 
66
65
  def destroy
67
- @richtext_ids = @element.richtext_contents_ids + @element.richtext_ingredients_ids
66
+ @richtext_ids = @element.richtext_ingredients_ids
68
67
  @element.destroy
69
68
  @notice = Alchemy.t("Successfully deleted element") % { element: @element.display_name }
70
69
  end
@@ -103,14 +102,12 @@ module Alchemy
103
102
  def element_includes
104
103
  [
105
104
  {
106
- contents: :essence,
107
105
  ingredients: :related_object,
108
106
  },
109
107
  :tags,
110
108
  {
111
109
  all_nested_elements: [
112
110
  {
113
- contents: :essence,
114
111
  ingredients: :related_object,
115
112
  },
116
113
  :tags,
@@ -152,10 +149,6 @@ module Alchemy
152
149
  element
153
150
  end
154
151
 
155
- def contents_params
156
- params.fetch(:contents, {}).permit!
157
- end
158
-
159
152
  def element_params
160
153
  params.fetch(:element, {}).permit(:tag_list, ingredients_attributes: {})
161
154
  end
@@ -164,28 +157,10 @@ module Alchemy
164
157
  params.require(:element).permit(:name, :page_version_id, :parent_element_id)
165
158
  end
166
159
 
167
- def update_element_with_ingredients
168
- if @element.update(element_params)
169
- @element_validated = true
170
- else
171
- element_update_error
172
- @error_messages = @element.ingredient_error_messages
173
- end
174
- end
175
-
176
- def update_element_with_contents
177
- if @element.update_contents(contents_params)
178
- @element_validated = @element.update(element_params)
179
- else
180
- element_update_error
181
- @error_messages = @element.essence_error_messages
182
- end
183
- end
184
-
185
160
  def element_update_error
186
161
  @element_validated = false
187
162
  @notice = Alchemy.t("Validation failed")
188
- @error_message = "<h2>#{@notice}</h2><p>#{Alchemy.t(:content_validations_headline)}</p>".html_safe
163
+ @error_message = "<h2>#{@notice}</h2><p>#{Alchemy.t(:ingredient_validations_headline)}</p>".html_safe
189
164
  end
190
165
  end
191
166
  end
@@ -94,7 +94,7 @@ module Alchemy
94
94
  end
95
95
  end
96
96
 
97
- # Edit the content of the page and all its elements and contents.
97
+ # Edit the content of the page and all its elements and ingredients.
98
98
  #
99
99
  # Locks the page to current user to prevent other users from editing it meanwhile.
100
100
  #
@@ -32,7 +32,7 @@ module Alchemy
32
32
  @query = Picture.ransack(params[:q])
33
33
  @previous = filtered_pictures.where("name < ?", @picture.name).last
34
34
  @next = filtered_pictures.where("name > ?", @picture.name).first
35
- @assignments = @picture.essence_pictures.joins(content: { element: :page })
35
+ @assignments = @picture.picture_ingredients.joins(element: :page)
36
36
 
37
37
  render action: "show"
38
38
  end
@@ -103,7 +103,7 @@ module Alchemy
103
103
  def resource_filters
104
104
  return unless resource_has_filters
105
105
 
106
- @_resource_filters ||= deprecated_resource_filters || resource_model.alchemy_resource_filters
106
+ @_resource_filters ||= resource_model.alchemy_resource_filters
107
107
  end
108
108
 
109
109
  def resource_filters_for_select
@@ -114,23 +114,6 @@ module Alchemy
114
114
 
115
115
  protected
116
116
 
117
- def deprecated_resource_filters
118
- if resource_has_deprecated_filters
119
- Alchemy::Deprecation.warn(
120
- "#{resource_model}.alchemy_resource_filters is using a legacy data structure. " \
121
- "Please use an Array of Hashes instead. i.e. [{ name: 'foo', values: ['bar', 'baz'] }, ...] " \
122
- "where values are scopes. With Alchemy 6.1 only the new structure will be supported."
123
- )
124
-
125
- @_resource_filters ||= [
126
- {
127
- name: :misc,
128
- values: resource_model.alchemy_resource_filters,
129
- },
130
- ]
131
- end
132
- end
133
-
134
117
  def apply_filters(items)
135
118
  sanitize_filter_params!
136
119
 
@@ -47,14 +47,12 @@ module Alchemy
47
47
  {
48
48
  nested_elements: [
49
49
  {
50
- contents: :essence,
51
50
  ingredients: :related_object,
52
51
  },
53
52
  :tags,
54
53
  ],
55
54
  },
56
55
  {
57
- contents: :essence,
58
56
  ingredients: :related_object,
59
57
  },
60
58
  :tags,
@@ -8,7 +8,9 @@ module Alchemy
8
8
  # Returns all pages as json object
9
9
  #
10
10
  def index
11
+ language = Alchemy::Language.find_by(id: params[:language_id]) || Alchemy::Language.current
11
12
  @pages = Alchemy::Page.accessible_by(current_ability, :index)
13
+ @pages = @pages.where(language: language)
12
14
  @pages = @pages.includes(*page_includes)
13
15
  @pages = @pages.ransack(params[:q]).result
14
16
 
@@ -28,11 +30,13 @@ module Alchemy
28
30
  def nested
29
31
  @page = Page.find_by(id: params[:page_id]) || Language.current_root_page
30
32
 
31
- render json: PageTreeSerializer.new(@page,
33
+ render json: PageTreeSerializer.new(
34
+ @page,
32
35
  ability: current_ability,
33
36
  user: current_alchemy_user,
34
37
  elements: params[:elements],
35
- full: true)
38
+ full: true,
39
+ )
36
40
  end
37
41
 
38
42
  # Returns a json object for page
@@ -105,13 +109,13 @@ module Alchemy
105
109
  {
106
110
  nested_elements: [
107
111
  {
108
- contents: :essence,
112
+ ingredients: :related_object,
109
113
  },
110
114
  :tags,
111
115
  ],
112
116
  },
113
117
  {
114
- contents: :essence,
118
+ ingredients: :related_object,
115
119
  },
116
120
  :tags,
117
121
  ],
@@ -11,15 +11,15 @@ module Alchemy
11
11
  # Make an Element with this options inside your @elements.yml file:
12
12
  #
13
13
  # - name: contactform
14
- # contents:
15
- # - name: mail_to
16
- # type: EssenceText
17
- # - name: subject
18
- # type: EssenceText
19
- # - name: mail_from
20
- # type: EssenceText
21
- # - name: success_page
22
- # type: EssencePage
14
+ # ingredients:
15
+ # - role: mail_to
16
+ # type: Text
17
+ # - role: subject
18
+ # type: Text
19
+ # - role: mail_from
20
+ # type: Text
21
+ # - role: success_page
22
+ # type: Page
23
23
  #
24
24
  # The fields +mail_to+, +mail_from+, +subject+ and +success_page+ are recommended.
25
25
  # The +Alchemy::MessagesController+ uses them to send your mails. So your customer has full controll of these values inside his contactform element.
@@ -104,7 +104,13 @@ module Alchemy
104
104
  # If no index page and no admin users are present we show the "Welcome to Alchemy" page.
105
105
  #
106
106
  def load_index_page
107
- @page ||= Language.current_root_page
107
+ @page ||= Alchemy::Page
108
+ .contentpages
109
+ .language_roots
110
+ .where(language: Language.current)
111
+ .includes(page_includes)
112
+ .first
113
+
108
114
  render template: "alchemy/welcome", layout: false if signup_required?
109
115
  end
110
116
 
@@ -120,10 +126,11 @@ module Alchemy
120
126
  def load_page
121
127
  page_not_found! unless Language.current
122
128
 
123
- @page ||= Language.current.pages.contentpages.find_by(
124
- urlname: params[:urlname],
125
- language_code: params[:locale] || Language.current.code,
126
- )
129
+ @page ||= Alchemy::Page
130
+ .contentpages
131
+ .where(language: Language.current)
132
+ .includes(page_includes)
133
+ .find_by(urlname: params[:urlname])
127
134
  end
128
135
 
129
136
  def enforce_locale
@@ -168,7 +175,7 @@ module Alchemy
168
175
 
169
176
  # == Renders the page :show template
170
177
  #
171
- # Handles html and rss requests (for pages containing a feed)
178
+ # Handles html requests
172
179
  #
173
180
  # Omits the layout, if the request is a XHR request.
174
181
  #
@@ -177,14 +184,6 @@ module Alchemy
177
184
  format.html do
178
185
  render action: :show, layout: !request.xhr?
179
186
  end
180
-
181
- format.rss do
182
- if @page.contains_feed?
183
- render action: :show, layout: false, handlers: [:builder]
184
- else
185
- render xml: { error: "Not found" }, status: 404
186
- end
187
- end
188
187
  end
189
188
  end
190
189
 
@@ -220,10 +219,12 @@ module Alchemy
220
219
  # or the cache is stale, because it's been republished by the user.
221
220
  #
222
221
  def render_fresh_page?
223
- must_not_cache? || stale?(etag: page_etag,
224
- last_modified: @page.published_at,
225
- public: !@page.restricted,
226
- template: "pages/show")
222
+ must_not_cache? || stale?(
223
+ etag: page_etag,
224
+ last_modified: @page.published_at,
225
+ public: !@page.restricted,
226
+ template: "pages/show",
227
+ )
227
228
  end
228
229
 
229
230
  # don't cache pages if we have flash message to display or the page has caching disabled
@@ -234,5 +235,9 @@ module Alchemy
234
235
  def page_not_found!
235
236
  not_found_error!("Alchemy::Page not found \"#{request.fullpath}\"")
236
237
  end
238
+
239
+ def page_includes
240
+ Alchemy::EagerLoading.page_includes(version: :public_version)
241
+ end
237
242
  end
238
243
  end
@@ -8,17 +8,6 @@ module Alchemy
8
8
  "alchemy/admin/elements/element"
9
9
  end
10
10
 
11
- # Returns content editor instances for defined contents
12
- #
13
- # Creates contents on demand if the content is not yet present on the element
14
- #
15
- # @return Array<Alchemy::ContentEditor>
16
- def contents
17
- element.definition.fetch(:contents, []).map do |content|
18
- Alchemy::ContentEditor.new(find_or_create_content(content[:name]))
19
- end
20
- end
21
-
22
11
  # Returns ingredient editor instances for defined ingredients
23
12
  #
24
13
  # Creates ingredient on demand if the ingredient is not yet present on the element
@@ -36,7 +25,7 @@ module Alchemy
36
25
  element.definition.fetch(:ingredients, []).any?
37
26
  end
38
27
 
39
- # Returns the translated content/ingredient group for displaying in admin editor group headings
28
+ # Returns the translated ingredient group for displaying in admin editor group headings
40
29
  #
41
30
  # Translate it in your locale yml file:
42
31
  #
@@ -63,7 +52,7 @@ module Alchemy
63
52
  def css_classes
64
53
  [
65
54
  "element-editor",
66
- content_definitions.present? ? "with-contents" : "without-contents",
55
+ ingredient_definitions.present? ? "with-ingredients" : "without-ingredients",
67
56
  nestable_elements.any? ? "nestable" : "not-nestable",
68
57
  taggable? ? "taggable" : "not-taggable",
69
58
  folded ? "folded" : "expanded",
@@ -78,12 +67,13 @@ module Alchemy
78
67
  def editable?
79
68
  return false if folded?
80
69
 
81
- content_definitions.present? || ingredient_definitions.any? || taggable?
70
+ ingredient_definitions.any? || taggable?
82
71
  end
83
72
 
84
73
  # Fixes Rails partial renderer calling to_model on the object
85
74
  # which reveals the delegated element instead of this decorator.
86
- def respond_to?(method_name)
75
+ def respond_to?(*args, **kwargs)
76
+ method_name = args.first
87
77
  return false if method_name == :to_model
88
78
 
89
79
  super
@@ -124,26 +114,16 @@ module Alchemy
124
114
  when String
125
115
  definition["deprecated"]
126
116
  when TrueClass
127
- Alchemy.t(name,
128
- scope: :element_deprecation_notices,
129
- default: Alchemy.t(:element_deprecated))
117
+ Alchemy.t(
118
+ name,
119
+ scope: :element_deprecation_notices,
120
+ default: Alchemy.t(:element_deprecated),
121
+ )
130
122
  end
131
123
  end
132
124
 
133
125
  private
134
126
 
135
- def find_or_create_content(name)
136
- find_content(name) || create_content(name)
137
- end
138
-
139
- def find_content(name)
140
- element.contents.find { |content| content.name == name }
141
- end
142
-
143
- def create_content(name)
144
- Alchemy::Content.create(element: element, name: name)
145
- end
146
-
147
127
  def find_or_create_ingredient(definition)
148
128
  element.ingredients.detect { |i| i.role == definition[:role] } ||
149
129
  element.ingredients.create!(
@@ -4,8 +4,6 @@ module Alchemy
4
4
  module Admin
5
5
  module ElementsHelper
6
6
  include Alchemy::Admin::IngredientsHelper
7
- include Alchemy::Admin::ContentsHelper
8
- include Alchemy::Admin::EssencesHelper
9
7
 
10
8
  # Returns an elements array for select helper.
11
9
  #