alchemy_cms 4.6.1 → 5.0.0
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 +33 -1
- data/.github/workflows/stale.yml +1 -1
- data/.gitignore +20 -2
- data/.hound.yml +2 -1
- data/.prettierrc +6 -0
- data/.rubocop.yml +30 -9
- data/CHANGELOG.md +102 -1
- data/Gemfile +24 -22
- data/README.md +32 -20
- data/Rakefile +11 -8
- data/alchemy_cms.gemspec +6 -5
- data/app/assets/javascripts/alchemy/admin.js +1 -5
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
- data/app/assets/javascripts/alchemy/node_select.js +39 -0
- data/app/assets/javascripts/alchemy/templates/index.js +1 -0
- data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
- data/app/assets/stylesheets/alchemy/admin.scss +3 -2
- data/app/assets/stylesheets/alchemy/base.scss +0 -1
- data/app/assets/stylesheets/alchemy/elements.scss +1 -1
- data/app/assets/stylesheets/alchemy/forms.scss +5 -0
- data/app/assets/stylesheets/alchemy/navigation.scss +1 -0
- data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
- data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
- data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
- data/app/assets/stylesheets/alchemy/tables.scss +1 -24
- data/app/assets/stylesheets/alchemy/tags.scss +2 -2
- data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
- data/app/controllers/alchemy/admin/base_controller.rb +13 -33
- data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
- data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
- data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
- data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
- data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
- data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
- data/app/controllers/alchemy/admin/pages_controller.rb +51 -63
- data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
- data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
- data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
- data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
- data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
- data/app/controllers/alchemy/api/base_controller.rb +2 -2
- data/app/controllers/alchemy/api/contents_controller.rb +4 -4
- data/app/controllers/alchemy/api/elements_controller.rb +8 -8
- data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
- data/app/controllers/alchemy/api/pages_controller.rb +14 -23
- data/app/controllers/alchemy/attachments_controller.rb +5 -5
- data/app/controllers/alchemy/base_controller.rb +10 -9
- data/app/controllers/alchemy/messages_controller.rb +16 -23
- data/app/controllers/alchemy/pages_controller.rb +13 -11
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
- data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
- data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
- data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
- data/app/decorators/alchemy/element_editor.rb +39 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
- data/app/helpers/alchemy/admin/base_helper.rb +38 -35
- data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
- data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
- data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
- data/app/helpers/alchemy/admin/form_helper.rb +1 -1
- data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
- data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
- data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
- data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
- data/app/helpers/alchemy/base_helper.rb +13 -8
- data/app/helpers/alchemy/elements_block_helper.rb +2 -31
- data/app/helpers/alchemy/elements_helper.rb +12 -58
- data/app/helpers/alchemy/pages_helper.rb +24 -174
- data/app/helpers/alchemy/url_helper.rb +4 -3
- data/app/mailers/alchemy/base_mailer.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +24 -19
- data/app/models/alchemy/base_record.rb +2 -5
- data/app/models/alchemy/content.rb +33 -38
- data/app/models/alchemy/content/factory.rb +24 -31
- data/app/models/alchemy/element.rb +45 -53
- data/app/models/alchemy/element/definitions.rb +4 -4
- data/app/models/alchemy/element/element_contents.rb +9 -6
- data/app/models/alchemy/element/element_essences.rb +4 -3
- data/app/models/alchemy/element/presenters.rb +3 -2
- data/app/models/alchemy/element_to_page.rb +1 -1
- data/app/models/alchemy/essence_boolean.rb +1 -3
- data/app/models/alchemy/essence_date.rb +2 -3
- data/app/models/alchemy/essence_file.rb +5 -5
- data/app/models/alchemy/essence_html.rb +1 -3
- data/app/models/alchemy/essence_link.rb +1 -3
- data/app/models/alchemy/essence_node.rb +18 -0
- data/app/models/alchemy/essence_page.rb +3 -16
- data/app/models/alchemy/essence_picture.rb +18 -17
- data/app/models/alchemy/essence_picture_view.rb +7 -6
- data/app/models/alchemy/essence_richtext.rb +1 -3
- data/app/models/alchemy/essence_select.rb +1 -3
- data/app/models/alchemy/essence_text.rb +0 -2
- data/app/models/alchemy/folded_page.rb +1 -0
- data/app/models/alchemy/language.rb +21 -35
- data/app/models/alchemy/language/code.rb +4 -4
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/message.rb +3 -3
- data/app/models/alchemy/node.rb +27 -4
- data/app/models/alchemy/page.rb +46 -127
- data/app/models/alchemy/page/fixed_attributes.rb +3 -2
- data/app/models/alchemy/page/page_elements.rb +35 -44
- data/app/models/alchemy/page/page_naming.rb +20 -70
- data/app/models/alchemy/page/page_natures.rb +7 -34
- data/app/models/alchemy/page/page_scopes.rb +23 -29
- data/app/models/alchemy/page/url_path.rb +0 -2
- data/app/models/alchemy/picture.rb +40 -30
- data/app/models/alchemy/picture/preprocessor.rb +26 -0
- data/app/models/alchemy/picture/transformations.rb +9 -7
- data/app/models/alchemy/picture/url.rb +9 -7
- data/app/models/alchemy/site.rb +6 -36
- data/app/models/alchemy/site/layout.rb +2 -2
- data/app/models/concerns/alchemy/touch_elements.rb +24 -0
- data/app/serializers/alchemy/content_serializer.rb +0 -3
- data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
- data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
- data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
- data/app/serializers/alchemy/node_serializer.rb +2 -0
- data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
- data/app/views/alchemy/admin/contents/create.js.erb +1 -3
- data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/index.html.erb +3 -3
- data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
- data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
- data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
- data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
- data/app/views/alchemy/admin/languages/index.html.erb +23 -4
- data/app/views/alchemy/admin/languages/new.html.erb +1 -0
- data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
- data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
- data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
- data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
- data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
- data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pages/info.html.erb +0 -9
- data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
- data/app/views/alchemy/admin/pictures/show.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
- data/app/views/alchemy/admin/resources/index.html.erb +21 -22
- data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
- data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
- data/app/views/alchemy/admin/sites/index.html.erb +21 -9
- data/app/views/alchemy/admin/sites/new.html.erb +1 -0
- data/app/views/alchemy/admin/tags/index.html.erb +2 -2
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
- data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
- data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
- data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
- data/app/views/alchemy/pages/show.rss.builder +3 -2
- data/app/views/layouts/alchemy/admin.html.erb +1 -0
- data/babel.config.js +12 -0
- data/bin/rails +5 -4
- data/config/alchemy/config.yml +23 -16
- data/config/brakeman.ignore +1 -1
- data/config/initializers/assets.rb +2 -1
- data/config/initializers/dragonfly.rb +2 -1
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +3 -2
- data/config/initializers/simple_form.rb +6 -6
- data/config/locales/alchemy.en.yml +23 -8
- data/config/routes.rb +25 -24
- data/config/spring.rb +3 -2
- data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
- data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
- data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
- data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
- data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
- data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
- data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
- data/lib/alchemy/admin/locale.rb +3 -1
- data/lib/alchemy/admin/preview_url.rb +85 -0
- data/lib/alchemy/auth_accessors.rb +8 -7
- data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
- data/lib/alchemy/config.rb +3 -5
- data/lib/alchemy/configuration_methods.rb +3 -1
- data/lib/alchemy/controller_actions.rb +6 -5
- data/lib/alchemy/deprecation.rb +2 -1
- data/lib/alchemy/elements_finder.rb +5 -5
- data/lib/alchemy/engine.rb +23 -8
- data/lib/alchemy/errors.rb +0 -7
- data/lib/alchemy/essence.rb +17 -16
- data/lib/alchemy/filetypes.rb +5 -5
- data/lib/alchemy/forms/builder.rb +4 -4
- data/lib/alchemy/hints.rb +1 -1
- data/lib/alchemy/i18n.rb +2 -1
- data/lib/alchemy/install/tasks.rb +41 -0
- data/lib/alchemy/modules.rb +12 -12
- data/lib/alchemy/name_conversions.rb +5 -5
- data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
- data/lib/alchemy/page_layout.rb +15 -12
- data/lib/alchemy/paths.rb +1 -1
- data/lib/alchemy/permissions.rb +7 -6
- data/lib/alchemy/resource.rb +25 -15
- data/lib/alchemy/resources_helper.rb +12 -18
- data/lib/alchemy/routing_constraints.rb +1 -1
- data/lib/alchemy/seeder.rb +42 -14
- data/lib/alchemy/shell.rb +13 -10
- data/lib/alchemy/taggable.rb +1 -0
- data/lib/alchemy/tasks/tidy.rb +4 -3
- data/lib/alchemy/test_support/config_stubbing.rb +1 -0
- data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
- data/lib/alchemy/test_support/factories.rb +1 -1
- data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
- data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
- data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
- data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
- data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
- data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
- data/lib/alchemy/test_support/integration_helpers.rb +1 -0
- data/lib/alchemy/test_support/shared_contexts.rb +5 -4
- data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
- data/lib/alchemy/tinymce.rb +15 -13
- data/lib/alchemy/upgrader.rb +8 -7
- data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
- data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +52 -50
- data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
- data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
- data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
- data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
- data/lib/generators/alchemy/install/install_generator.rb +169 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
- data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
- data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
- data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
- data/lib/tasks/alchemy/db.rake +3 -19
- data/lib/tasks/alchemy/install.rake +5 -48
- data/lib/tasks/alchemy/tidy.rake +9 -8
- data/lib/tasks/alchemy/upgrade.rake +18 -116
- data/package.json +45 -0
- data/package/admin.js +14 -0
- data/package/src/__tests__/i18n.spec.js +70 -0
- data/package/src/i18n.js +48 -0
- data/package/src/node_tree.js +72 -0
- data/package/src/translations.js +32 -0
- data/package/src/utils/__tests__/ajax.spec.js +124 -0
- data/package/src/utils/__tests__/events.spec.js +38 -0
- data/package/src/utils/ajax.js +48 -0
- data/package/src/utils/events.js +16 -0
- data/vendor/assets/fonts/fa-regular-400.eot +0 -0
- data/vendor/assets/fonts/fa-regular-400.svg +798 -358
- data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
- data/vendor/assets/fonts/fa-solid-900.eot +0 -0
- data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
- data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
- data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
- data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
- data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
- data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
- data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
- data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
- data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
- data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
- metadata +112 -88
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
- data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
- data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
- data/app/helpers/alchemy/essences_helper.rb +0 -119
- data/app/models/concerns/alchemy/content_touching.rb +0 -23
- data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
- data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
- data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
- data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
- data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
- data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
- data/app/views/alchemy/navigation/_link.html.erb +0 -19
- data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
- data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
- data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
- data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
- data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
- data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
- data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
- data/lib/alchemy/ssl_protection.rb +0 -34
- data/lib/alchemy/tasks/helpers.rb +0 -81
- data/lib/alchemy/test_support/controller_requests.rb +0 -93
- data/lib/alchemy/upgrader/four_point_four.rb +0 -52
- data/lib/alchemy/upgrader/four_point_one.rb +0 -42
- data/lib/alchemy/upgrader/four_point_six.rb +0 -50
- data/lib/alchemy/upgrader/four_point_two.rb +0 -85
- data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
- data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
- data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
- data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
- data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
- data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
- data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
- data/lib/tasks/alchemy/convert.rake +0 -97
- data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
- data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
- data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
data/lib/alchemy/upgrader.rb
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "alchemy/shell"
|
|
2
3
|
|
|
3
4
|
module Alchemy
|
|
4
5
|
class Upgrader
|
|
5
6
|
extend Alchemy::Shell
|
|
6
7
|
|
|
7
|
-
Dir["#{File.dirname(__FILE__)}/upgrader/*.rb"].each { |f| require f }
|
|
8
|
+
Dir["#{File.dirname(__FILE__)}/upgrader/*.rb"].sort.each { |f| require f }
|
|
8
9
|
|
|
9
10
|
class << self
|
|
10
11
|
def copy_new_config_file
|
|
11
12
|
desc "Copy configuration file."
|
|
12
|
-
config_file = Rails.root.join(
|
|
13
|
-
default_config = File.join(File.dirname(__FILE__),
|
|
13
|
+
config_file = Rails.root.join("config/alchemy/config.yml")
|
|
14
|
+
default_config = File.join(File.dirname(__FILE__), "../../config/alchemy/config.yml")
|
|
14
15
|
if !File.exist? config_file
|
|
15
16
|
log "No configuration file found. Creating it."
|
|
16
|
-
FileUtils.cp default_config, Rails.root.join(
|
|
17
|
+
FileUtils.cp default_config, Rails.root.join("config/alchemy/config.yml")
|
|
17
18
|
elsif FileUtils.identical? default_config, config_file
|
|
18
19
|
log "Configuration file already present.", :skip
|
|
19
20
|
else
|
|
20
21
|
log "Custom configuration file found."
|
|
21
|
-
FileUtils.cp default_config, Rails.root.join(
|
|
22
|
+
FileUtils.cp default_config, Rails.root.join("config/alchemy/config.yml.defaults")
|
|
22
23
|
log "Copied new default configuration file."
|
|
23
|
-
todo "Check the default configuration file (./config/alchemy/config.yml.defaults) for new configuration options and insert them into your config file.",
|
|
24
|
+
todo "Check the default configuration file (./config/alchemy/config.yml.defaults) for new configuration options and insert them into your config file.", "Configuration has changed"
|
|
24
25
|
end
|
|
25
26
|
end
|
|
26
27
|
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "tasks/harden_gutentag_migrations"
|
|
4
|
+
|
|
5
|
+
module Alchemy
|
|
6
|
+
class Upgrader::FivePointZero < Upgrader
|
|
7
|
+
class << self
|
|
8
|
+
def install_gutentag_migrations
|
|
9
|
+
desc "Install Gutentag migrations"
|
|
10
|
+
Rake::Task["gutentag:install:migrations"].invoke
|
|
11
|
+
Alchemy::Upgrader::Tasks::HardenGutentagMigrations.new.patch_migrations
|
|
12
|
+
Rake::Task["db:migrate"].invoke
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def remove_layout_roots
|
|
16
|
+
desc "Remove layout root pages"
|
|
17
|
+
layout_roots = Alchemy::Page.where(layoutpage: true).where("name LIKE 'Layoutroot for%'")
|
|
18
|
+
if layout_roots.size.positive?
|
|
19
|
+
log "Removing #{layout_roots.size} layout root pages."
|
|
20
|
+
layout_roots.delete_all
|
|
21
|
+
Alchemy::Page.where(layoutpage: true).update_all(parent_id: nil)
|
|
22
|
+
log "Done.", :success
|
|
23
|
+
else
|
|
24
|
+
log "No layout root pages found.", :skip
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def remove_root_page
|
|
29
|
+
desc "Remove root page"
|
|
30
|
+
root_page = Alchemy::Page.find_by(parent_id: nil, name: "Root")
|
|
31
|
+
if root_page
|
|
32
|
+
Alchemy::Page.where(parent_id: root_page.id).update_all(parent_id: nil)
|
|
33
|
+
root_page.delete
|
|
34
|
+
log "Done.", :success
|
|
35
|
+
else
|
|
36
|
+
log "Root page not found.", :skip
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "alchemy/upgrader"
|
|
4
4
|
|
|
5
5
|
module Alchemy::Upgrader::Tasks
|
|
6
6
|
class ElementViewsUpdater < Thor
|
|
@@ -11,14 +11,14 @@ module Alchemy::Upgrader::Tasks
|
|
|
11
11
|
puts "-- Removing '_view' suffix from element views"
|
|
12
12
|
|
|
13
13
|
Dir.glob("#{elements_view_folder}/*_view.*").each do |file|
|
|
14
|
-
FileUtils.mv(file, file.to_s.sub(/_view/,
|
|
14
|
+
FileUtils.mv(file, file.to_s.sub(/_view/, ""))
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def update_local_variable
|
|
19
19
|
puts "-- Updating element views local variable to element name"
|
|
20
20
|
|
|
21
|
-
Alchemy::Element.definitions.map { |e| e[
|
|
21
|
+
Alchemy::Element.definitions.map { |e| e["name"] }.each do |name|
|
|
22
22
|
view = Dir.glob("#{elements_view_folder}/_#{name}.*").last
|
|
23
23
|
gsub_file(view, /\b#{name}_view\b/, name)
|
|
24
24
|
end
|
|
@@ -28,7 +28,7 @@ module Alchemy::Upgrader::Tasks
|
|
|
28
28
|
private
|
|
29
29
|
|
|
30
30
|
def elements_view_folder
|
|
31
|
-
Rails.root.join(
|
|
31
|
+
Rails.root.join("app", "views", "alchemy", "elements")
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "thor"
|
|
4
|
+
|
|
5
|
+
module Alchemy::Upgrader::Tasks
|
|
6
|
+
class HardenGutentagMigrations < Thor
|
|
7
|
+
include Thor::Actions
|
|
8
|
+
|
|
9
|
+
no_tasks do
|
|
10
|
+
def patch_migrations
|
|
11
|
+
sentinel = /def up/
|
|
12
|
+
|
|
13
|
+
migration_file = Dir.glob("db/migrate/*_gutentag_tables.gutentag.rb").first
|
|
14
|
+
if migration_file
|
|
15
|
+
inject_into_file migration_file,
|
|
16
|
+
"\n # inserted by Alchemy CMS upgrader\n return if table_exists?(:gutentag_taggings)\n",
|
|
17
|
+
{ after: sentinel, verbose: true }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
migration_file = Dir.glob("db/migrate/*_gutentag_cache_counter.gutentag.rb").first
|
|
21
|
+
if migration_file
|
|
22
|
+
inject_into_file migration_file,
|
|
23
|
+
"\n # inserted by Alchemy CMS upgrader\n return if column_exists?(:gutentag_tags, :taggings_count)\n",
|
|
24
|
+
{ after: sentinel, verbose: true }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/alchemy/version.rb
CHANGED
data/lib/alchemy_cms.rb
CHANGED
|
@@ -1,61 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Instantiate the global Alchemy namespace
|
|
2
3
|
module Alchemy
|
|
3
|
-
|
|
4
|
+
YAML_WHITELIST_CLASSES = %w(Symbol Date Regexp)
|
|
4
5
|
end
|
|
5
6
|
|
|
6
7
|
# Require globally used external libraries
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
-
require
|
|
18
|
-
require
|
|
19
|
-
require
|
|
20
|
-
require
|
|
21
|
-
require
|
|
22
|
-
require
|
|
23
|
-
require
|
|
24
|
-
require
|
|
25
|
-
require
|
|
26
|
-
require
|
|
8
|
+
require "acts_as_list"
|
|
9
|
+
require "action_view/dependency_tracker"
|
|
10
|
+
require "active_model_serializers"
|
|
11
|
+
require "awesome_nested_set"
|
|
12
|
+
require "cancan"
|
|
13
|
+
require "dragonfly"
|
|
14
|
+
require "gutentag"
|
|
15
|
+
require "handlebars_assets"
|
|
16
|
+
require "jquery-rails"
|
|
17
|
+
require "jquery-ui-rails"
|
|
18
|
+
require "kaminari"
|
|
19
|
+
require "non-stupid-digest-assets"
|
|
20
|
+
require "ransack"
|
|
21
|
+
require "request_store"
|
|
22
|
+
require "responders"
|
|
23
|
+
require "sassc-rails"
|
|
24
|
+
require "simple_form"
|
|
25
|
+
require "select2-rails"
|
|
26
|
+
require "turbolinks"
|
|
27
|
+
require "userstamp"
|
|
28
|
+
require "webpacker"
|
|
27
29
|
|
|
28
30
|
# Require globally used Alchemy mixins
|
|
29
|
-
require_relative
|
|
30
|
-
require_relative
|
|
31
|
-
require_relative
|
|
32
|
-
require_relative
|
|
33
|
-
require_relative
|
|
34
|
-
require_relative
|
|
35
|
-
require_relative
|
|
36
|
-
require_relative
|
|
37
|
-
require_relative
|
|
38
|
-
require_relative
|
|
39
|
-
require_relative
|
|
40
|
-
require_relative
|
|
41
|
-
require_relative
|
|
42
|
-
require_relative
|
|
43
|
-
require_relative
|
|
44
|
-
require_relative
|
|
45
|
-
require_relative
|
|
46
|
-
require_relative
|
|
47
|
-
require_relative
|
|
48
|
-
require_relative
|
|
49
|
-
require_relative
|
|
50
|
-
require_relative
|
|
51
|
-
require_relative
|
|
52
|
-
require_relative
|
|
53
|
-
require_relative
|
|
54
|
-
require_relative
|
|
55
|
-
require_relative
|
|
31
|
+
require_relative "alchemy/ability_helper"
|
|
32
|
+
require_relative "alchemy/admin/locale"
|
|
33
|
+
require_relative "alchemy/admin/preview_url"
|
|
34
|
+
require_relative "alchemy/auth_accessors"
|
|
35
|
+
require_relative "alchemy/cache_digests/template_tracker"
|
|
36
|
+
require_relative "alchemy/config"
|
|
37
|
+
require_relative "alchemy/configuration_methods"
|
|
38
|
+
require_relative "alchemy/controller_actions"
|
|
39
|
+
require_relative "alchemy/deprecation"
|
|
40
|
+
require_relative "alchemy/elements_finder"
|
|
41
|
+
require_relative "alchemy/errors"
|
|
42
|
+
require_relative "alchemy/essence"
|
|
43
|
+
require_relative "alchemy/filetypes"
|
|
44
|
+
require_relative "alchemy/forms/builder"
|
|
45
|
+
require_relative "alchemy/hints"
|
|
46
|
+
require_relative "alchemy/i18n"
|
|
47
|
+
require_relative "alchemy/logger"
|
|
48
|
+
require_relative "alchemy/modules"
|
|
49
|
+
require_relative "alchemy/name_conversions"
|
|
50
|
+
require_relative "alchemy/on_page_layout"
|
|
51
|
+
require_relative "alchemy/on_page_layout/callbacks_runner"
|
|
52
|
+
require_relative "alchemy/page_layout"
|
|
53
|
+
require_relative "alchemy/paths"
|
|
54
|
+
require_relative "alchemy/permissions"
|
|
55
|
+
require_relative "alchemy/resource"
|
|
56
|
+
require_relative "alchemy/tinymce"
|
|
57
|
+
require_relative "alchemy/taggable"
|
|
56
58
|
|
|
57
59
|
# Require hacks
|
|
58
|
-
require_relative
|
|
60
|
+
require_relative "kaminari/scoped_pagination_url_helper"
|
|
59
61
|
|
|
60
62
|
# Finally require Alchemy itself
|
|
61
|
-
require_relative
|
|
63
|
+
require_relative "alchemy/engine"
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "rails"
|
|
2
3
|
|
|
3
4
|
module Alchemy
|
|
4
5
|
module Generators
|
|
5
6
|
class Base < ::Rails::Generators::Base
|
|
6
|
-
class_option :template_engine, type: :string, aliases:
|
|
7
|
+
class_option :template_engine, type: :string, aliases: "-e", desc: 'Template engine for the views. Available options are "erb", "haml", and "slim".'
|
|
7
8
|
|
|
8
9
|
private
|
|
9
10
|
|
|
10
11
|
def conditional_template(source, destination)
|
|
11
|
-
files = Dir.glob(destination.gsub(/\.([a-z]+)$/,
|
|
12
|
+
files = Dir.glob(destination.gsub(/\.([a-z]+)$/, "*"))
|
|
12
13
|
if files.any?
|
|
13
14
|
ext = File.extname(files.first)[1..-1]
|
|
14
15
|
|
|
@@ -28,7 +29,7 @@ module Alchemy
|
|
|
28
29
|
# Rails is clever enough to default this to whatever template
|
|
29
30
|
# engine is configured through its generator configuration,
|
|
30
31
|
# but we'll default it to erb anyway, just in case.
|
|
31
|
-
options[:template_engine] ||
|
|
32
|
+
options[:template_engine] || "erb"
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
def load_alchemy_yaml(name)
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative "../base"
|
|
2
3
|
|
|
3
4
|
module Alchemy
|
|
4
5
|
module Generators
|
|
5
6
|
class ElementsGenerator < Base
|
|
6
7
|
desc "This generator generates your elements view partials."
|
|
7
|
-
source_root File.expand_path(
|
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
|
8
9
|
|
|
9
10
|
def create_partials
|
|
10
|
-
@elements = load_alchemy_yaml(
|
|
11
|
+
@elements = load_alchemy_yaml("elements.yml")
|
|
11
12
|
return unless @elements
|
|
12
13
|
|
|
13
14
|
@elements.each do |element|
|
|
14
15
|
@element = element
|
|
15
16
|
@contents = element["contents"] || []
|
|
16
|
-
|
|
17
|
-
@element_name = element["name"].underscore
|
|
18
|
-
else
|
|
19
|
-
raise "Element name '#{element['name']}' has wrong format. Only lowercase and non whitespace characters allowed."
|
|
20
|
-
end
|
|
21
|
-
|
|
17
|
+
@element_name = element_name(element)
|
|
22
18
|
conditional_template "view.html.#{template_engine}", "#{elements_dir}/_#{@element_name}.html.#{template_engine}"
|
|
23
19
|
end
|
|
24
20
|
end
|
|
@@ -28,6 +24,14 @@ module Alchemy
|
|
|
28
24
|
def elements_dir
|
|
29
25
|
@_elements_dir ||= "app/views/alchemy/elements"
|
|
30
26
|
end
|
|
27
|
+
|
|
28
|
+
def element_name(element)
|
|
29
|
+
if element["name"] =~ Alchemy::Element::NAME_REGEXP
|
|
30
|
+
element["name"].underscore
|
|
31
|
+
else
|
|
32
|
+
raise "Element name '#{element["name"]}' has wrong format. Only lowercase and non whitespace characters allowed."
|
|
33
|
+
end
|
|
34
|
+
end
|
|
31
35
|
end
|
|
32
36
|
end
|
|
33
37
|
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "rails"
|
|
2
3
|
|
|
3
4
|
module Alchemy
|
|
4
5
|
module Generators
|
|
5
6
|
class EssenceGenerator < ::Rails::Generators::Base
|
|
6
7
|
desc "This generator generates an Alchemy essence for you."
|
|
7
8
|
argument :essence_name, banner: "YourEssenceName"
|
|
8
|
-
source_root File.expand_path(
|
|
9
|
+
source_root File.expand_path("templates", __dir__)
|
|
9
10
|
|
|
10
11
|
def init
|
|
11
12
|
@essence_name = essence_name.underscore
|
|
12
|
-
@essence_view_path =
|
|
13
|
+
@essence_view_path = "app/views/alchemy/essences"
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def create_model
|
|
@@ -19,20 +20,21 @@ module Alchemy
|
|
|
19
20
|
def act_as_essence
|
|
20
21
|
essence_class_file = "app/models/#{@essence_name}.rb"
|
|
21
22
|
essence_class = @essence_name.classify
|
|
22
|
-
inject_into_class essence_class_file, essence_class,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
CLASSMETHOD
|
|
23
|
+
inject_into_class essence_class_file, essence_class, <<~CLASSMETHOD
|
|
24
|
+
acts_as_essence(
|
|
25
|
+
# Your options:
|
|
26
|
+
#
|
|
27
|
+
# ingredient_column: [String or Symbol] - Specifies the column name you use for storing the content in the database. (Default :body)
|
|
28
|
+
# validate_column: [String or Symbol] - Which column should be validated. (Default: ingredient_column)
|
|
29
|
+
# preview_text_column: [String or Symbol] - Specifies the column for the preview_text method. (Default: ingredient_column)
|
|
30
|
+
# preview_text_method: [String or Symbol] - A method called on ingredient to get the preview text. (Default: ingredient_column)
|
|
31
|
+
)
|
|
32
|
+
CLASSMETHOD
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
def copy_templates
|
|
35
36
|
essence_name = @essence_name.classify.demodulize.underscore
|
|
37
|
+
@essence_editor_local = "#{essence_name}_editor"
|
|
36
38
|
template "view.html.erb", "#{@essence_view_path}/_#{essence_name}_view.html.erb"
|
|
37
39
|
template "editor.html.erb", "#{@essence_view_path}/_#{essence_name}_editor.html.erb"
|
|
38
40
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%%#
|
|
2
|
+
Available locals:
|
|
3
|
+
* <%= @essence_editor_local %> - A Alchemy::ContentEditor instance
|
|
4
|
+
|
|
5
|
+
Please consult Alchemy::Content.rb docs for further methods on the content object
|
|
6
|
+
%>
|
|
7
|
+
<%%= content_tag :div,
|
|
8
|
+
id: <%= @essence_editor_local %>.dom_id,
|
|
9
|
+
class: <%= @essence_editor_local %>.css_classes,
|
|
10
|
+
data: <%= @essence_editor_local %>.data_attributes do %>
|
|
11
|
+
<%%= content_label(<%= @essence_editor_local %>) %>
|
|
12
|
+
<%%= text_field_tag(
|
|
13
|
+
<%= @essence_editor_local %>.form_field_name,
|
|
14
|
+
<%= @essence_editor_local %>.ingredient,
|
|
15
|
+
id: <%= @essence_editor_local %>.form_field_id
|
|
16
|
+
) %>
|
|
17
|
+
<%% end %>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "@alchemy_cms/admin"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "rails/generators"
|
|
3
|
+
require "alchemy/install/tasks"
|
|
4
|
+
|
|
5
|
+
module Alchemy
|
|
6
|
+
module Generators
|
|
7
|
+
class InstallGenerator < ::Rails::Generators::Base
|
|
8
|
+
desc "Installs Alchemy into your App."
|
|
9
|
+
|
|
10
|
+
class_option :auto_accept,
|
|
11
|
+
type: :boolean,
|
|
12
|
+
default: false,
|
|
13
|
+
desc: "Automatically accept defaults."
|
|
14
|
+
|
|
15
|
+
class_option :skip_demo_files,
|
|
16
|
+
type: :boolean,
|
|
17
|
+
default: false,
|
|
18
|
+
desc: "Skip creation of demo element, page and application layout."
|
|
19
|
+
|
|
20
|
+
class_option :skip_webpacker_installer,
|
|
21
|
+
type: :boolean,
|
|
22
|
+
default: false,
|
|
23
|
+
desc: "Skip running the webpacker installer."
|
|
24
|
+
|
|
25
|
+
source_root File.expand_path("files", __dir__)
|
|
26
|
+
|
|
27
|
+
def setup
|
|
28
|
+
header
|
|
29
|
+
say "Welcome to AlchemyCMS!"
|
|
30
|
+
say "Let's begin with some questions.\n\n"
|
|
31
|
+
install_tasks.inject_routes(options[:auto_accept])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def copy_config
|
|
35
|
+
copy_file "#{gem_config_path}/config.yml", app_config_path.join("alchemy", "config.yml")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def copy_yml_files
|
|
39
|
+
%w(elements page_layouts menus).each do |file|
|
|
40
|
+
template "#{__dir__}/templates/#{file}.yml.tt", app_config_path.join("alchemy", "#{file}.yml")
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def install_assets
|
|
45
|
+
copy_file "all.js", app_vendor_assets_path.join("javascripts", "alchemy", "admin", "all.js")
|
|
46
|
+
copy_file "all.css", app_vendor_assets_path.join("stylesheets", "alchemy", "admin", "all.css")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def copy_demo_views
|
|
50
|
+
return if options[:skip_demo_files]
|
|
51
|
+
|
|
52
|
+
copy_file "application.html.erb", app_views_path.join("layouts", "application.html.erb")
|
|
53
|
+
copy_file "article.scss", app_assets_path.join("stylesheets", "alchemy", "elements", "article.scss")
|
|
54
|
+
|
|
55
|
+
stylesheet_require = " *= require_tree ./alchemy/elements\n"
|
|
56
|
+
if File.exist?(app_assets_path.join("stylesheets", "application.css"))
|
|
57
|
+
insert_into_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require,
|
|
58
|
+
before: " */"
|
|
59
|
+
else
|
|
60
|
+
create_file app_assets_path.join("stylesheets", "application.css"), "/*\n#{stylesheet_require} */\n"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
copy_file "_article.html.erb", app_views_path.join("alchemy", "elements", "_article.html.erb")
|
|
64
|
+
copy_file "_standard.html.erb", app_views_path.join("alchemy", "page_layouts", "_standard.html.erb")
|
|
65
|
+
copy_file "alchemy.en.yml", app_config_path.join("locales", "alchemy.en.yml")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def copy_dragonfly_config
|
|
69
|
+
template(
|
|
70
|
+
"#{__dir__}/templates/dragonfly.rb.tt",
|
|
71
|
+
app_config_path.join("initializers", "dragonfly.rb"),
|
|
72
|
+
skip: options[:auto_accept]
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def install_gutentag_migrations
|
|
77
|
+
rake "gutentag:install:migrations"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def run_webpacker_installer
|
|
81
|
+
unless options[:skip_webpacker_installer]
|
|
82
|
+
# Webpacker does not create a package.json, but we need one
|
|
83
|
+
unless File.exist? app_root.join("package.json")
|
|
84
|
+
in_root { run "echo '{}' > package.json" }
|
|
85
|
+
end
|
|
86
|
+
rake("webpacker:install", abort_on_failure: true)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def add_npm_package
|
|
91
|
+
run "yarn add @alchemy_cms/admin"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def copy_alchemy_entry_point
|
|
95
|
+
webpack_config = YAML.load_file(app_root.join("config", "webpacker.yml"))[Rails.env]
|
|
96
|
+
copy_file "alchemy_admin.js",
|
|
97
|
+
app_root.join(webpack_config["source_path"], webpack_config["source_entry_path"], "alchemy/admin.js")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def set_primary_language
|
|
101
|
+
header
|
|
102
|
+
install_tasks.set_primary_language(options[:auto_accept])
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def setup_database
|
|
106
|
+
rake("db:create", abort_on_failure: true)
|
|
107
|
+
# We can't invoke this rake task, because Rails will use wrong engine names otherwise
|
|
108
|
+
rake("railties:install:migrations", abort_on_failure: true)
|
|
109
|
+
rake("db:migrate", abort_on_failure: true)
|
|
110
|
+
install_tasks.inject_seeder
|
|
111
|
+
rake("db:seed", abort_on_failure: true)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def finalize
|
|
115
|
+
header
|
|
116
|
+
say "Alchemy successfully installed!"
|
|
117
|
+
say "Now start the server with:\n\n"
|
|
118
|
+
say " bin/rails server\n\n"
|
|
119
|
+
say "and point your browser to\n\n"
|
|
120
|
+
say " http://localhost:3000/admin\n\n"
|
|
121
|
+
say "and follow the onscreen instructions to finalize the installation.\n\n"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
private
|
|
125
|
+
|
|
126
|
+
def header
|
|
127
|
+
return if options[:auto_accept]
|
|
128
|
+
|
|
129
|
+
puts "─────────────────────"
|
|
130
|
+
puts "* Alchemy Installer *"
|
|
131
|
+
puts "─────────────────────"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def say(something)
|
|
135
|
+
return if options[:auto_accept]
|
|
136
|
+
|
|
137
|
+
puts " #{something}"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def gem_config_path
|
|
141
|
+
@_config_path ||= File.expand_path("../../../../config/alchemy", __dir__)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def app_config_path
|
|
145
|
+
@_app_config_path ||= app_root.join("config")
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def app_views_path
|
|
149
|
+
@_app_views_path ||= app_root.join("app", "views")
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def app_assets_path
|
|
153
|
+
@_app_assets_path ||= app_root.join("app", "assets")
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def app_vendor_assets_path
|
|
157
|
+
@_app_vendor_assets_path ||= app_root.join("vendor", "assets")
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def app_root
|
|
161
|
+
@_app_root ||= Rails.root
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def install_tasks
|
|
165
|
+
@_install_tasks ||= Alchemy::Install::Tasks.new
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|