alchemy_cms 6.1.10 → 7.0.0.pre.a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +0 -3
- data/.gitignore +1 -6
- data/CHANGELOG.md +19 -44
- data/Gemfile +1 -1
- data/Rakefile +14 -9
- data/alchemy_cms.gemspec +2 -3
- data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +18 -32
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +27 -29
- data/app/assets/stylesheets/alchemy/elements.scss +16 -35
- data/app/assets/stylesheets/alchemy/forms.scss +0 -4
- data/app/assets/stylesheets/alchemy/node-select.scss +2 -2
- data/app/controllers/alchemy/admin/attachments_controller.rb +0 -1
- data/app/controllers/alchemy/admin/elements_controller.rb +7 -32
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/pictures_controller.rb +1 -1
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -18
- data/app/controllers/alchemy/api/elements_controller.rb +0 -2
- data/app/controllers/alchemy/api/pages_controller.rb +8 -4
- data/app/controllers/alchemy/messages_controller.rb +9 -9
- data/app/controllers/alchemy/pages_controller.rb +23 -18
- data/app/decorators/alchemy/element_editor.rb +10 -30
- data/app/helpers/alchemy/admin/elements_helper.rb +0 -2
- data/app/helpers/alchemy/elements_block_helper.rb +5 -42
- data/app/helpers/alchemy/elements_helper.rb +3 -11
- data/app/helpers/alchemy/pages_helper.rb +0 -4
- data/app/models/alchemy/attachment.rb +6 -3
- data/app/models/alchemy/base_record.rb +2 -0
- data/app/models/alchemy/eager_loading.rb +0 -1
- data/app/models/alchemy/element/element_ingredients.rb +1 -8
- data/app/models/alchemy/element/presenters.rb +9 -25
- data/app/models/alchemy/element.rb +2 -18
- data/app/models/alchemy/ingredient.rb +17 -6
- data/app/models/alchemy/ingredients/audio.rb +2 -0
- data/app/models/alchemy/ingredients/datetime.rb +3 -1
- data/app/models/alchemy/ingredients/file.rb +7 -0
- data/app/models/alchemy/ingredients/headline.rb +6 -0
- data/app/models/alchemy/ingredients/link.rb +2 -0
- data/app/models/alchemy/ingredients/node.rb +2 -0
- data/app/models/alchemy/ingredients/page.rb +2 -0
- data/app/models/alchemy/ingredients/picture.rb +11 -0
- data/app/models/alchemy/ingredients/richtext.rb +6 -0
- data/app/models/alchemy/ingredients/select.rb +1 -0
- data/app/models/alchemy/ingredients/text.rb +8 -0
- data/app/models/alchemy/ingredients/video.rb +2 -0
- data/app/models/alchemy/node.rb +9 -6
- data/app/models/alchemy/page/page_elements.rb +5 -26
- data/app/models/alchemy/page/page_layouts.rb +0 -14
- data/app/models/alchemy/page/page_natures.rb +0 -10
- data/app/models/alchemy/page.rb +0 -10
- data/app/models/alchemy/picture/transformations.rb +0 -30
- data/app/models/alchemy/picture/url.rb +1 -1
- data/app/models/alchemy/picture.rb +14 -13
- data/app/models/alchemy/picture_thumb/create.rb +7 -18
- data/app/models/alchemy/picture_thumb/file_store.rb +33 -0
- data/app/models/alchemy/picture_thumb.rb +10 -10
- data/app/models/concerns/alchemy/picture_thumbnails.rb +2 -6
- data/app/serializers/alchemy/element_serializer.rb +1 -6
- data/app/services/alchemy/delete_elements.rb +1 -7
- data/app/services/alchemy/duplicate_element.rb +1 -6
- data/app/views/alchemy/admin/elements/_element.html.erb +5 -22
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
- data/app/views/alchemy/admin/elements/order.js.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -2
- data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_file_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_table.html.erb +0 -6
- data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +3 -6
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -3
- data/app/views/alchemy/admin/pictures/_infos.html.erb +4 -6
- data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
- data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_headline_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_html_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_node_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_picture_editor.html.erb +4 -4
- data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -2
- data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +3 -3
- data/app/views/alchemy/pages/_meta_data.html.erb +0 -1
- data/app/views/layouts/alchemy/admin.html.erb +5 -1
- data/config/alchemy/config.yml +6 -6
- data/config/brakeman.ignore +56 -57
- data/config/locales/alchemy.en.yml +99 -113
- data/config/routes.rb +1 -16
- data/db/migrate/20230121212637_alchemy_six_point_one.rb +248 -0
- data/lib/alchemy/cache_digests/template_tracker.rb +6 -7
- data/lib/alchemy/config.rb +2 -2
- data/lib/alchemy/deprecation.rb +1 -1
- data/lib/alchemy/errors.rb +0 -11
- data/lib/alchemy/hints.rb +10 -10
- data/lib/alchemy/permissions.rb +4 -17
- data/lib/alchemy/routing_constraints.rb +3 -3
- data/lib/alchemy/searchable_resource.rb +38 -0
- data/lib/alchemy/seeder.rb +2 -8
- data/lib/alchemy/tasks/tidy.rb +0 -38
- data/lib/alchemy/test_support/capybara_helpers.rb +69 -0
- data/lib/alchemy/test_support/factories/element_factory.rb +0 -6
- data/lib/alchemy/test_support/factories/ingredient_factory.rb +1 -1
- data/lib/alchemy/test_support/factories/page_factory.rb +4 -2
- data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +0 -20
- data/lib/alchemy/test_support/shared_dom_ids_examples.rb +1 -1
- data/lib/alchemy/test_support/shared_ingredient_examples.rb +1 -1
- data/lib/alchemy/tinymce.rb +1 -18
- data/lib/alchemy/upgrader/seven_point_zero.rb +45 -0
- data/lib/alchemy/upgrader/tasks/.keep +0 -0
- data/lib/alchemy/upgrader.rb +8 -3
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy.rb +0 -19
- data/lib/alchemy_cms.rb +1 -2
- data/lib/generators/alchemy/elements/elements_generator.rb +0 -1
- data/lib/generators/alchemy/elements/templates/view.html.erb +1 -10
- data/lib/generators/alchemy/elements/templates/view.html.haml +1 -9
- data/lib/generators/alchemy/elements/templates/view.html.slim +1 -9
- data/lib/generators/alchemy/install/files/alchemy.en.yml +7 -8
- data/lib/generators/alchemy/install/files/application.html.erb +1 -1
- data/lib/generators/alchemy/install/install_generator.rb +18 -34
- data/lib/generators/alchemy/install/templates/elements.yml.tt +12 -12
- data/lib/non_stupid_digest_assets.rb +1 -1
- data/lib/tasks/alchemy/thumbnails.rake +2 -21
- data/lib/tasks/alchemy/tidy.rake +1 -12
- data/lib/tasks/alchemy/upgrade.rake +10 -47
- data/package/dist/admin.js +16 -0
- data/package/dist/admin.js.map +7 -0
- data/package.json +5 -3
- metadata +18 -147
- data/app/controllers/alchemy/admin/contents_controller.rb +0 -21
- data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -30
- data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -31
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +0 -43
- data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -34
- data/app/controllers/alchemy/api/contents_controller.rb +0 -52
- data/app/decorators/alchemy/content_editor.rb +0 -119
- data/app/helpers/alchemy/admin/contents_helper.rb +0 -42
- data/app/helpers/alchemy/admin/essences_helper.rb +0 -31
- data/app/models/alchemy/content/factory.rb +0 -143
- data/app/models/alchemy/content.rb +0 -247
- data/app/models/alchemy/element/element_contents.rb +0 -200
- data/app/models/alchemy/element/element_essences.rb +0 -133
- data/app/models/alchemy/essence_audio.rb +0 -13
- data/app/models/alchemy/essence_boolean.rb +0 -20
- data/app/models/alchemy/essence_date.rb +0 -25
- data/app/models/alchemy/essence_file.rb +0 -49
- data/app/models/alchemy/essence_headline.rb +0 -41
- data/app/models/alchemy/essence_html.rb +0 -23
- data/app/models/alchemy/essence_link.rb +0 -21
- data/app/models/alchemy/essence_node.rb +0 -19
- data/app/models/alchemy/essence_page.rb +0 -17
- data/app/models/alchemy/essence_picture.rb +0 -67
- data/app/models/alchemy/essence_picture_view.rb +0 -90
- data/app/models/alchemy/essence_richtext.rb +0 -44
- data/app/models/alchemy/essence_select.rb +0 -19
- data/app/models/alchemy/essence_text.rb +0 -23
- data/app/models/alchemy/essence_video.rb +0 -13
- data/app/serializers/alchemy/content_serializer.rb +0 -17
- data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_date_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_file_serializer.rb +0 -13
- data/app/serializers/alchemy/essence_html_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_link_serializer.rb +0 -13
- data/app/serializers/alchemy/essence_picture_serializer.rb +0 -28
- data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -11
- data/app/serializers/alchemy/essence_select_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_text_serializer.rb +0 -22
- data/app/views/alchemy/admin/contents/create.js.erb +0 -21
- data/app/views/alchemy/admin/essence_audios/edit.html.erb +0 -7
- data/app/views/alchemy/admin/essence_files/edit.html.erb +0 -21
- data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +0 -5
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +0 -30
- data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +0 -3
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -8
- data/app/views/alchemy/admin/essence_videos/edit.html.erb +0 -12
- data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -15
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +0 -11
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +0 -16
- data/app/views/alchemy/essences/_essence_date_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +0 -54
- data/app/views/alchemy/essences/_essence_file_view.html.erb +0 -18
- data/app/views/alchemy/essences/_essence_headline_editor.html.erb +0 -36
- data/app/views/alchemy/essences/_essence_headline_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_html_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +0 -30
- data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_node_editor.html.erb +0 -27
- data/app/views/alchemy/essences/_essence_node_view.html.erb +0 -1
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +0 -26
- data/app/views/alchemy/essences/_essence_page_view.html.erb +0 -5
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +0 -59
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +0 -6
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -14
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +0 -28
- data/app/views/alchemy/essences/_essence_select_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +0 -29
- data/app/views/alchemy/essences/_essence_text_view.html.erb +0 -17
- data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_video_view.html.erb +0 -19
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +0 -59
- data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +0 -20
- data/app/views/alchemy/pages/show.rss.builder +0 -21
- data/db/migrate/20200226213334_alchemy_four_point_four.rb +0 -313
- data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +0 -11
- data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +0 -28
- data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +0 -8
- data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +0 -27
- data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +0 -6
- data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +0 -24
- data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +0 -22
- data/db/migrate/20200907111332_remove_tri_state_booleans.rb +0 -33
- data/db/migrate/20201207131309_create_page_versions.rb +0 -19
- data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +0 -76
- data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +0 -10
- data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +0 -7
- data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +0 -12
- data/db/migrate/20210506135919_create_essence_audios.rb +0 -19
- data/db/migrate/20210506140258_create_essence_videos.rb +0 -23
- data/db/migrate/20210508091432_create_alchemy_ingredients.rb +0 -22
- data/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb +0 -13
- data/db/migrate/20220622130905_add_playsinline_to_alchemy_essence_videos.rb +0 -9
- data/lib/alchemy/essence.rb +0 -250
- data/lib/alchemy/tasks/usage.rb +0 -34
- data/lib/alchemy/test_support/essence_shared_examples.rb +0 -271
- data/lib/alchemy/test_support/factories/content_factory.rb +0 -20
- data/lib/alchemy/test_support/factories/essence_audio_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +0 -11
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_video_factory.rb +0 -7
- data/lib/alchemy/upgrader/five_point_zero.rb +0 -41
- data/lib/alchemy/upgrader/six_point_zero.rb +0 -21
- data/lib/alchemy/upgrader/tasks/add_page_versions.rb +0 -33
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +0 -34
- data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +0 -29
- data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +0 -73
- data/lib/generators/alchemy/essence/essence_generator.rb +0 -49
- data/lib/generators/alchemy/essence/templates/editor.html.erb +0 -17
- data/lib/generators/alchemy/essence/templates/view.html.erb +0 -2
- data/lib/generators/alchemy/install/files/babel.config.js +0 -64
- data/lib/tasks/alchemy/usage.rake +0 -44
|
@@ -275,11 +275,10 @@
|
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
-
.element-
|
|
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-
|
|
305
|
+
.element-body {
|
|
307
306
|
margin: 2 * $default-padding;
|
|
308
307
|
}
|
|
309
308
|
|
|
@@ -414,7 +413,7 @@
|
|
|
414
413
|
}
|
|
415
414
|
}
|
|
416
415
|
|
|
417
|
-
.
|
|
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
|
-
.
|
|
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
|
-
.
|
|
436
|
+
.ingredient-group-ingredients {
|
|
438
437
|
display: none;
|
|
439
438
|
}
|
|
440
439
|
|
|
441
440
|
&.expanded {
|
|
442
|
-
.
|
|
441
|
+
.ingredient-group-ingredients {
|
|
443
442
|
display: block;
|
|
444
443
|
}
|
|
445
444
|
|
|
446
|
-
.
|
|
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
|
-
.
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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-
|
|
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;
|
|
@@ -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::
|
|
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
|
-
.
|
|
40
|
+
.ingredient-editor.node {
|
|
41
41
|
.select2-container.alchemy_selectbox .select2-choice {
|
|
42
42
|
padding: 0.4em 0.75em;
|
|
43
43
|
}
|
|
@@ -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
|
|
60
|
-
|
|
57
|
+
if @element.update(element_params)
|
|
58
|
+
@element_validated = true
|
|
61
59
|
else
|
|
62
|
-
|
|
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.
|
|
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(:
|
|
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
|
|
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.
|
|
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 ||=
|
|
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
|
|
|
@@ -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(
|
|
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
|
-
|
|
112
|
+
ingredients: :related_object,
|
|
109
113
|
},
|
|
110
114
|
:tags,
|
|
111
115
|
],
|
|
112
116
|
},
|
|
113
117
|
{
|
|
114
|
-
|
|
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
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
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 ||=
|
|
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 ||=
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
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?(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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?(
|
|
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(
|
|
128
|
-
|
|
129
|
-
|
|
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!(
|